如何摆脱阴影贴图的虚假伪影?
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.0f
或 0.0f
,具体取决于您是希望阴影贴图之外的东西点亮还是不点亮:
GLfloat borderColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
确保阴影相机的远平面足够高!
在通过阴影贴图创建阴影的情况下存在虚假伪像。
我不明白为什么要画很多阴影,它们是从哪里来的? 示例: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.0f
或 0.0f
,具体取决于您是希望阴影贴图之外的东西点亮还是不点亮:
GLfloat borderColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
确保阴影相机的远平面足够高!