在为聚光灯实现阴影之后,当我的聚光灯离物体太远时,偏差计算似乎会使阴影消失。
我一直在尝试解决这个问题两天,我使用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的差异,它随着距光的距离而减小)。
一切都在发挥作用,透视就完成了它的工作。
但偏差计算并未考虑从片段到光的距离,如果我的对象和我的光线对齐,normal
和lightDir
不会改变,因此<强烈的>偏见不会改变:我最近的立方体上没有阴影,因为偏见不再适合。
我搜索了许多网站和书籍(所有游戏编程宝石),但我找不到有用的公式。
这里我向您展示两种情况:
这里有两对屏幕截图,从照相机的角度看颜色结果,从光照角度看阴影图。
有人有一个公式或想法来帮助我吗? 我误解了什么吗?
感谢阅读。
答案 0 :(得分:2)
你偏向后投射空间的差异。 后投影空间是非线性的,因为深度缓冲是对数的。因此,您不能仅仅通过“世界单位”中的这种偏差来抵消这种差异。 如果要使其工作,则必须使用此法线偏移重建采样位置。 或者使用倒置投影在世界空间中转换你的depthes。
希望它可以帮到你!