如何摆脱阴影贴图的虚假伪影?

How it is possible to get rid of spurious artifacts of Shadow Mapping?

在通过阴影贴图创建阴影的情况下存在虚假伪像。

我不明白为什么要画很多阴影,它们是从哪里来的? 示例:example

我想你的意思是阴影粉刺。当你渲染一个发光的表面时,你计算表面点到光的距离,并将它与从阴影贴图读取的距离进行比较。现在理想情况下,如果表面被照亮,这些应该相等,但由于浮点精度错误,可能会出现轻微的不准确,导致本不应该有阴影的地方出现阴影。

解决方案是应用一个偏移量,因此在您从阴影贴图读取的距离上添加一个小数字,例如 0.001。实际偏移量应该取决于世界的规模。

您的阴影贴图似乎只覆盖了场景的一小部分,正在平铺(重复)以覆盖其余部分。将阴影贴图的环绕模式更改为 GL_CLAMP_TO_BORDER:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);

并将边框颜色设置为 1.0f0.0f,具体取决于您是希望阴影贴图之外的东西点亮还是不点亮:

GLfloat borderColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);

确保阴影相机的远平面足够高!