我遇到了法线贴图和指向远离光线的表面的问题。这些表面根本不应该被照亮,因为它们没有面对光线。但是,如果碎片的法线恰好弯曲得足够大,这些表面上的相当多的碎片可能会被点亮。由此造成的伪影清晰可见,例如在一个盒子上,它的一侧直接背离光线:该侧的几乎所有碎片都是黑色的(正如他们应该的那样),但仍然可以看到几个白色碎片(抱歉,截图不是当前可用,但如果您在知道我在说什么之前已经完成了法线映射)。
我找到了一种在前向渲染器中解决此问题的简单方法:只需将光强度乘以 (4*lightDirection.Z)。推理是你应该将光强度乘以光向量和表面法线向量的(钳位)点积(如果面指向外,点积将为负,光强度将被钳位为 0),因为我们正在计算切线空间,此法线始终为 (0,0,1),因此点积就是 lightDirection.z。乘数 4 只是为了确保光强度不会下降(如果脸没有指向另一边)。
现在我尝试为延迟渲染器实现相同的功能,但很快注意到这种简单的方法将不起作用,因为我正在世界空间中进行计算。要进行此计算,我需要该片段的真实法线和该片段所在表面的法线。当然,我可以将这些信息存储到纹理中,但为了完成这个技巧,还要多花 3 个浮点数(或者如果我要打包它们,则需要 2 个)似乎相当昂贵。
有什么解决方法吗?
谢谢你。