3d 延迟着色、法线贴图和远离灯光的自阴影曲面

3d 延迟着色、法线贴图和远离灯光的自阴影曲面,3d,rendering,lighting,3d,Rendering,Lighting,我遇到了法线贴图和指向远离灯光的曲面的问题。这些表面根本不应该被照亮,因为它们不面对光线。但是,如果碎片的法线恰好足够弯曲,这些曲面上的相当多碎片可能会被照亮。由此产生的伪影清晰可见,例如,在一个盒子上,盒子的一侧直接指向远离光线的方向:几乎该侧的所有碎片都是黑色的(正如他们所认为的那样),但仍然可以看到一些白色碎片(抱歉,屏幕截图目前不可用,但如果您在知道我在说什么之前已经完成了法线映射) 我在正向渲染器中找到了一种简单的方法来解决这个问题:只需将光强度乘以(4*lightDirection.

我遇到了法线贴图和指向远离灯光的曲面的问题。这些表面根本不应该被照亮,因为它们不面对光线。但是,如果碎片的法线恰好足够弯曲,这些曲面上的相当多碎片可能会被照亮。由此产生的伪影清晰可见,例如,在一个盒子上,盒子的一侧直接指向远离光线的方向:几乎该侧的所有碎片都是黑色的(正如他们所认为的那样),但仍然可以看到一些白色碎片(抱歉,屏幕截图目前不可用,但如果您在知道我在说什么之前已经完成了法线映射)

我在正向渲染器中找到了一种简单的方法来解决这个问题:只需将光强度乘以(4*lightDirection.Z)。推理是,您应该将光强度乘以光向量和曲面法向量的(钳制)点积(如果面指向别处,点积将为负值,光强度将钳制为0),因为我们在切线空间中进行计算,所以法线总是(0,0,1),因此点积就是光的方向。z。乘法器4就是为了确保光强度不会下降(如果面没有指向别处)

现在,我尝试对延迟渲染器实现相同的功能,但很快注意到,由于我在世界空间中进行计算,这种简单的方法将不起作用。要进行此计算,我需要该片段的真实法线和该片段所在曲面的法线。当然,我可以将此信息存储到exture,但是仅仅为了完成这个技巧而花费3个以上的浮动(或者如果我要打包的话,花费2个浮动)似乎相当昂贵

有什么解决办法吗


谢谢。

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

啊,为什么我没有想到将其存储在视图空间中。谢谢!