计算聚光灯阴影贴图的偏差

时间:2016-06-17 09:09:20

标签: opengl glsl shadow

在为聚光灯实现阴影之后,当我的聚光灯离物体太远时,偏差计算似乎会使阴影消失。

我一直在尝试解决这个问题两天,我使用Renderdoc来调试我的渲染器,以便着色器内的所有数据都是正确的。

我的案例:

我使用32位深度缓冲区 我有两个立方体,一个在另一个之后(并且看到它的邻居的阴影更大),以及朝向立方体看的光,它们沿着z轴对齐。

我使用教程中的以下公式来计算偏差:

float bias = max(max_bias * (1.0 - dot(normal, lightDir)), min_bias);

我执行以下比较:

return (fragment_depth - shadow_texture_depth - bias > 0.0) ? 0.0 : 1.0;

然而,我的聚光灯远离物体越远,最近的立方体的深度值越接近最远的立方体的深度(10-3的差异,它随着距光的距离而减小)。 一切都在发挥作用,透视就完成了它的工作。 但偏差计算并未考虑从片段到光的距离,如果我的对象和我的光线对齐,normallightDir不会改变,因此<强烈的>偏见不会改变:我最近的立方体上没有阴影,因为偏见不再适合

我搜索了许多网站和书籍(所有游戏编程宝石),但我找不到有用的公式。

这里我向您展示两种情况:

这里有两对屏幕截图,从照相机的角度看颜色结果,从光照角度看阴影图。

灯光位置(0,0,0),一切正常 enter image description here enter image description here

灯光位置(0,0,1.5),不起作用 enter image description here enter image description here

有人有一个公式或想法来帮助我吗? 我误解了什么吗?

感谢阅读。

1 个答案:

答案 0 :(得分:2)

你偏向后投射空间的差异。 后投影空间是非线性的,因为深度缓冲是对数的。因此,您不能仅仅通过“世界单位”中的这种偏差来抵消这种差异。 如果要使其工作,则必须使用此法线偏移重建采样位置。 或者使用倒置投影在世界空间中转换你的depthes。

希望它可以帮到你!