怎样才能摆脱阴影贴图的虚假伪影?

时间:2015-05-31 15:11:50

标签: javascript webgl shader shadow

通过阴影贴图创建阴影时出现虚假伪影。hahaha

我无法理解为什么要绘制许多阴影,以及它们来自何处? 例如:example

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

确保阴影摄像机的飞机足够高!