Я столкнулся с проблемой нормального отображения и поверхностей, направленных в сторону от света. Эти поверхности не должны быть освещены вообще, так как они не обращены к свету. Однако, возможно, что довольно много фрагментов с этих поверхностей будут освещены, если нормали фрагментов окажутся достаточно изогнутыми. Артефакты, вызванные этим, хорошо видны, например, на коробке, одна сторона которой направлена прямо от света: почти все фрагменты этой стороны черные (как и должно быть), но все же видны пара белых фрагментов (извините, снимок экрана в настоящее время недоступен, но если вы сделали все как обычно прежде чем вы поймете, о чем я говорю).
Я нашел простой способ исправить это в прямом рендерере: просто умножить интенсивность света на (4 * lightDirection.Z). Причина заключается в том, что вы должны умножить интенсивность света на (зажатое) точечное произведение вектора света и * * * * * нормального вектора поверхности (если лицо направлено в сторону, точечное произведение будет отрицательным, а интенсивность света будет ограничена 0), и поскольку мы выполняем вычисления в касательном пространстве, эта нормаль всегда равна (0,0,1), и, таким образом, точечным произведением является просто lightDirection.z. Множитель 4 предназначен только для того, чтобы интенсивность света не уменьшалась (если лицо не направлено в сторону).
Теперь я попытался реализовать ту же функциональность для отложенного рендеринга, но вскоре заметил, что этот простой подход не будет работать, поскольку я делаю вычисления в мировом пространстве. Чтобы сделать этот расчет, мне понадобится как реальная нормаль этого фрагмента, так и нормаль поверхности, на которой расположен этот фрагмент. Конечно, я мог бы сохранить эту информацию в текстуре, но потратить еще 3 поплавка (или 2, если бы я их упаковал), просто чтобы сделать этот трюк, кажется довольно дорогим.
Есть ли обходные пути?
Спасибо.