延迟着色,法线贴图和指向远离光线的自阴影表面

时间:2010-12-27 09:11:39

标签: 3d rendering lighting

我遇到了法线贴图和表面远离光线的问题。这些表面根本不应该点亮,因为它们不面向光线。但是,如果碎片的法线恰好足够弯曲,则可能会从这些表面发出相当多的碎片。由此引起的伪像清晰可见,例如在一个侧面指向一个直接远离光线的盒子上:几乎所有那边的碎片都是黑色的(正如它们应该的那样)但仍然可以看到几个白色碎片(对不起,截图目前不可用,但如果你做得正常你应该知道我在说什么之前的映射。

我找到了一种在前向渲染器中修复此问题的简单方法:只需将光强度乘以(4 * lightDirection.Z)即可。推理是你应该将光强度乘以光线矢量和(em)面的法向量的(夹紧)点积(如果面朝外,点积为负,光强度将被钳制为0),因为我们在切线空间中进行计算,所以这个法线总是(0,0,1),因此点积只是lightDirection.z。乘法器4只是为了确保光强度不会下降(如果面部没有指向远处)。

现在我尝试为延迟渲染器实现相同的功能,但很快注意到这个简单的方法不起作用,因为我在世界空间中进行计算。为了进行这种计算,我需要该片段的实际法线和该片段所在表面的法线。当然我可以将这些信息存储到纹理中,但是花费3个以上的浮点数(如果我要打包它们则需要2个)只是为了做这个技巧似乎非常昂贵。

有没有解决方法?

谢谢。

1 个答案:

答案 0 :(得分:2)

在延迟着色中,您将法线存储在视图空间中,因此我认为您只需要将光线方向从世界空间转换为视图空间,然后您就可以进行相同的计算。