Я реализую механизм отложенного освещения в своем графическом движке OpenGL, следуя этому учебник. Работает нормально, у меня с этим проблем нет.
Когда дело доходит до точечных источников света, он говорит, что нужно визуализировать сферы вокруг источников света, чтобы пропустить через шейдер освещения только те пиксели, на которые может повлиять свет. Есть некоторые проблемы с этим методом, касающиеся забоя и положения камеры, подробно описанные здесь. Чтобы решить их, в учебнике используется трафаретный тест.
Я сомневаюсь в эффективности этого метода, что приводит меня к моему первому вопросу:
Не лучше ли было бы нарисовать круг, изображающий световую сферу?
Сфера всегда выглядит на экране как круг, независимо от того, с какой точки вы на нее смотрите. Задача состоит в том, чтобы определить позицию на экране и масштаб круга. Этот метод будет иметь 3 преимущества:
- Нет проблем с cullface
- Нет проблемы с положением камеры в световой сфере
- Гораздо эффективнее (количество вершин сильно уменьшено + нет трафаретного теста)
Есть ли у этого метода недостатки?
Мой второй вопрос касается реализации упомянутого метода. Положение центра кругов можно было легко вычислить, как всегда:
vec4 screenpos = modelViewProjectionMatrix * vec4(pos, 1.0);
vec2 centerpoint = vec2(screenpos / screenpos.w);
Но теперь как рассчитать масштаб полученного круга? Он должен зависеть от расстояния (от камеры до источника света) и как-то от вида в перспективе.