如何将深度测试应用于漫射照明?

How to apply depth test to diffuse lighting?

我一直在尝试 vulkan,并尝试了一些基本的漫反射照明,它只考虑了表面法线。在模型面向光线的一侧,一切看起来都很好-

尽管在模型的另一侧,模型的一部分被阴影遮住了,就像被照亮了一样,尽管它不应该是-

我知道发生这种情况是因为我只考虑表面法线,而着色器不关心顶点的位置,只要它的法线朝向光源即可,但我该如何修复它?我觉得我需要一种方法来进行深度测试,以确定模型的一部分是否应该被点亮。如果是这样的话,我将如何去做呢?否则我该怎么办?

听起来您想实现阴影。

标准方法是shadow mapping。您从光点渲染场景并仅保留深度缓冲区。然后将该深度缓冲区作为纹理传递给片段着色器,并根据点在世界中的位置对其进行采样,并将采样的深度与到光源的距离进行比较。

但是,此技术有多种注意事项。最常见的是阴影痤疮,其中量化错误导致片段自阴影,从而导致斑点照明,您可以通过向深度添加一个小的偏移量来解决这个问题。下一个是平移,您之前添加的偏移量会导致薄壁与地板相交处的光线渗入,您可以通过不让墙壁足够薄来让偏移量穿过它们来解决这个问题。