Как стать автором
Обновить

Комментарии 15

А можете посоветовать хороший учебник по шейдерам? А то сейчас шейдеры сложнее OpenGL самого стали…
Странно что цвета не смешиваются.
почему свет от дверей ни и окон(?) ни как не влияет на желтый хотя бы на границе смешения?
Общее освещение только разбавляет цвета.
Но самое большое разочарование — на последних кадрах желтый кубик под синим освещением остался желтым, а зеленый — зеленым. Это не правильно.

Мне кажется смешиваются.
Вот так эта сцена выглядит, отрендериная blender'ом


Все источники

Только последний

Получается немного светлее, у него объемы больше при расчетах

Ну и да, там нет окон — это дырки(отверстия) просто.

Никак не пойму, почему нельзя обойтись двумя отрисовками всех объектов: 1) глубина, нормали 2) цвет. Ну а затем ренедерим шары источников света в буфер цвета, используя буферы из 1. В итоге есть готовая текстура — ее мы показываем полноэкранным квадом.

Phong reflection model


Обратите внимание на формулу.
Как вы предлагаете это считать, если будите рендерить шары в буфер цвета? Ну точнее, каким образом нужно рендерить эти шары?

Так же с помощью буфера трафарета. Шейдер источника света будет брать пиксель из буфера цвета и добавлять к нему свой цвет. Или типо нельзя одновременно рендерить и читать из текстуры?

Давайте предположим что можно. И пусть, у нас пока есть только диффузная компонента.
Тогда в результате, если записывать сразу в буфер цвета, будет следующее:


<цвет_пикселя> = <изначальный_цвет> + <цвет_источника_1> + ... + <цвет_источника_n>

А должно быть так:


<цвет_пикселя> = <изначальный_цвет> * (<цвет_источника_1> + ... + <цвет_источника_n>)

Эту проблему можно решить если записывать результат в отдельную текстуру. Тогда шейдер источника света будет брать цвет из буфера, умножать его на свой цвет и добавлять в результирующий буфер, получается то что нужно.


<цвет_пикселя> = <изначальный_цвет> * <цвет_источника_1> + ... + <изначальный_цвет> * <цвет_источника_n>

Проблема в том, что у нас есть еще и зеркальная компонента, для которой нам нужно делать тоже самое, а потом сложить с диффузной компонентой. Тогда нам потребуется еще раз отрисовать все объекты и сохранить в текстуру степень зеркальности. И… как результат мы приходим к общему случаю отложеного освещения, в котором эти тектуры — нормали, альбедо и степень зеркальности создается за один проход.

Все равно непонятно почему должно быть так:
<цвет_пикселя> = <изначальный_цвет> * (<цвет_источника_1> +… + <цвет_источника_n>)


В википедии как раз указана сумма:
<цвет_пикселя> = <фоновой (ambient)> + (<рассеянной (diffuse) источник 1> + <блики (specular) источник 1> + ... + <рассеянной (diffuse) источник n> + <блики (specular) источник n>) 


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

Нет, посмотрите внимательно, там указано вот так


<цвет_пикселя> = <фоновой (ambient)> * Ka + (<рассеянной (diffuse) источник 1> * Kd + <блики (specular) источник 1> * Ka + ... + <рассеянной (diffuse) источник n> * Kd + <блики (specular) источник n> * Ka)

где Ka, Kd, Ks — это свойства метериала отражать соответствующий свет — т.е. то что у вас в цветовом буфере.

А нельзя вместо геометрии для сферы (особенно если источников много) использовать спрайт сферы с глубиной? Точность будет меньше, но разницу вряд-ли будет заметно.
Подозреваю, что это будет медленнее. Основной затык в производительности здесь — доступ к данным. Данных для рендера сферы в виде геометрии (вершины) нужно сильно меньше, чем для сферы в виде спрайта (пиксели). Можно, конечно использовать спрайт низкого разрешения, но тогда границы будут ступенчатыми.
Об этом я не подумал. Но по факту высокого разрешения, скорее всего, и не понадобится. Границы будут размытые + само освещение плавное. Хотя надо проверять.

Еще был вопрос в комментариях (я его отклонил, случайно), "почему такие засветы на потолке?"
Это потому что нет тененй пока.


вот так будет с тенями
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации