【问题标题】:How it is possible to get rid of spurious artifacts of Shadow Mapping?如何摆脱阴影映射的虚假伪影?
【发布时间】:2015-05-31 15:11:50
【问题描述】:

通过阴影映射创建阴影时的虚假伪影。

我不明白为什么要绘制许多阴影,以及它们的来源? 例如:example

【问题讨论】:

  • 你有多少个光源?
  • 在场景 1 光源上
  • 任何超反射表面?
  • 不,反射不会影响阴影。该程序由 webglacademy.com course № 28 的示例制作
  • 对不起,我只是在抛出想法,因为没有其他人是; idk opengl。

标签: javascript webgl shader shadow


【解决方案1】:

看起来您的阴影贴图只覆盖了场景的一小部分,并且正在平铺(重复)以覆盖其余部分。将阴影贴图的环绕模式更改为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);

【讨论】:

  • webgl 不支持。 GL_CLAMP_TO_BORDER 不支持
  • @АнатолийГрабаров ctx.CLAMP_TO_EDGE
【解决方案2】:

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

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

【讨论】:

  • 在我的例子中,bias=0.0022
  • 这不是shadow acne,这个问题是重复的深度图与错误仅覆盖场景子区域的阴影投影矩阵相结合
【解决方案3】:

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

【讨论】: