Правильный расчет освещения

Я реализую освещение в 3D-движке и обнаружил недостаток в способе расчета освещения. В комбинированном шейдере я получаю диффузный цвет и расчеты освещения.

return diffuseColor * (diffuseLight + ambient);

Насколько я могу судить, это стандартный способ ведения дел. А вот, например, что если цвет 0,1,0, а свет 1,0,0. (Игнорируйте окружающий мир в этом примере) Результатом будет 0,0,0. Но в реальной жизни, если я возьму чистый зеленый лист бумаги и направлю на него окрашенный красный свет, он должен стать желтым. Или хотя бы не черный.

Как другие игры решают эту проблему?


person Programmdude    schedule 25.05.2012    source источник
comment
Я мог бы поклясться, что это сработало именно так, как я описал. Должно быть, я слишком долго работал с компьютерами, думая о цветах в аддитивных терминах. По крайней мере, я был не единственным, кто так думал, посоветовался с моим другом, прежде чем спросить здесь.   -  person Programmdude    schedule 25.05.2012


Ответы (2)


Зеленая бумага поглощает красный свет и кажется черной, а не желтой. Сложение означает, что вы освещаете белую бумагу красным и зеленым светом. Затем бумага становится желтой.

http://www.physics.wisc.edu/museum/Exhibits-2/Light_Optics/ColorObj/Color_index.html

person Julio    schedule 25.05.2012

Должно быть (для каждого компонента RGB)

return (diffuseColor * diffuseLight) + ambient;

Компонент окружающей среды постоянен и добавляется после выполнения всех других расчетов освещения и не зависит от направления света или направления взгляда.

Как говорит Хулио, чисто зеленая бумага будет выглядеть черной под чисто красным светом.

Когда что-то выглядит зеленым, это происходит потому, что оно поглощает все остальные цвета спектра, а то, что осталось (например, зеленый), отражается. Если посветить на него красным светом, зеленый не отразится.

person Alnitak    schedule 25.05.2012
comment
На самом деле окружающий свет следует характеризовать по-разному, поскольку он не зависит от направления света или направления взгляда. - person Julio; 25.05.2012
comment
Рассеянный свет @Julio также не зависит от направления взгляда - приведенная выше формула верна, если diffuseLight уже умножено на косинус угла между нормалью к поверхности и направлением света. - person Alnitak; 26.05.2012