Отложенное затенение, нормальное отображение и самозатенение поверхностей, направленных в сторону от света - PullRequest
1 голос
/ 27 декабря 2010

Я столкнулся с проблемой нормального отображения и поверхностей, направленных в сторону от света. Эти поверхности не должны быть освещены вообще, так как они не обращены к свету. Однако, возможно, что довольно много фрагментов с этих поверхностей будут освещены, если нормали фрагментов окажутся достаточно изогнутыми. Артефакты, вызванные этим, хорошо видны, например, на коробке, одна сторона которой направлена ​​прямо от света: почти все фрагменты этой стороны черные (как и должно быть), но все же видны пара белых фрагментов (извините, снимок экрана в настоящее время недоступен, но если вы сделали все как обычно прежде чем вы поймете, о чем я говорю).

Я нашел простой способ исправить это в прямом рендерере: просто умножить интенсивность света на (4 * lightDirection.Z). Причина заключается в том, что вы должны умножить интенсивность света на (зажатое) точечное произведение вектора света и * * * * * нормального вектора поверхности (если лицо направлено в сторону, точечное произведение будет отрицательным, а интенсивность света будет ограничена 0), и поскольку мы выполняем вычисления в касательном пространстве, эта нормаль всегда равна (0,0,1), и, таким образом, точечным произведением является просто lightDirection.z. Множитель 4 предназначен только для того, чтобы интенсивность света не уменьшалась (если лицо не направлено в сторону).

Теперь я попытался реализовать ту же функциональность для отложенного рендеринга, но вскоре заметил, что этот простой подход не будет работать, поскольку я делаю вычисления в мировом пространстве. Чтобы сделать этот расчет, мне понадобится как реальная нормаль этого фрагмента, так и нормаль поверхности, на которой расположен этот фрагмент. Конечно, я мог бы сохранить эту информацию в текстуре, но потратить еще 3 поплавка (или 2, если бы я их упаковал), просто чтобы сделать этот трюк, кажется довольно дорогим.

Есть ли обходные пути?

Спасибо.

1 Ответ

2 голосов
/ 14 января 2011

При отложенном затенении вы сохраняете нормальное в пространстве обзора, поэтому я думаю, что вам просто нужно сначала преобразовать направление света из мирового пространства для просмотра пространства, затем вы можете сделать то же самое вычисление.

...