Я пытаюсь понять, как масштабировать цвет с помощью освещения, используя модель фонга. Например, если I = KaAx, где ka - коэффициент окружающей среды, а Ax - интенсивность внешнего освещения, где x может быть rb или g, я хочу применить это к поверхности с цветом текстуры (1,0,1), например . Я попытался умножить отдельные значения rgb на I, (r * Ka * Ar.r, r * Kb * Ag, r * Kg * Ab) освещенность, но, увы, это может полностью изменить цвет, чего я не хочу.
как осветить объект, модель фонга
Ответы (1)
Хорошо, я вижу несколько вещей:
- не следует перемножать окружающее и рассеянное освещение, вместо этого используйте сложение
- вы не используете какой-либо вектор нормали или направление / положение света (по крайней мере, я не могу его нигде найти)
- также вы должны использовать параметр glColor (если вы его вообще не используете)
Попробуйте это для каждого цвета (.r, .g, .b) и направленного света, например Солнца:
pixel_color.r=clamp_to_1 // clamp to <0.0,1.1>
(
texture_color.r*glColor.r // pixel color without lighting
*( // apply lighting
diffuse.r*((glNormal.xyz*NormalMatrix).light_dir.xyz) // diffuse * dot product of light source direction and normal vectors. If you need also consider distance just multiply by next term...
+ambient.r // ambient light is additive !!!
)
);
PS.
- NormalMatrix - это ModelView с исходной точкой [0.0,0.0,0.0] (без сдвига позиции)
- Если вы хотите также добавить отражательную способность, не забудьте вычислить отраженную нормаль ... она отличается (если скайбокс не бесконечен по размеру), как используется для рассеянного света. Также очень помогает cubemap со скайбоксом enviroment.
person
Spektre
schedule
14.01.2014