在为聚光灯实现阴影后,当我的聚光灯离物体太远时,偏差计算似乎会使阴影消失。
两天来我一直在尝试解决这个问题,我使用 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
不会改变,因此偏差也没有改变:我最远的立方体上不再有阴影,因为偏差不再适合。
我搜索了很多网站和书籍(都是游戏编程精华),但没有找到有用的公式。
这里我给大家展示两个案例:
这里有两张截图,分别是相机视角的颜色结果和光线视角的阴影贴图。
有没有人有公式或想法来帮助我? 我是不是误会了什么?
感谢阅读。
最佳答案
您偏向后投影空间中的差异。 后投影空间是非线性的,因为深度缓冲区是对数的。所以你不能仅仅用“世界单位”中的这种偏差来抵消这种差异。 如果你想让它工作,你必须用这个正常的偏移量重建你的采样位置。 或者使用倒投影转换您在世界空间中的深度。
希望对您有所帮助!
关于opengl - 聚光灯阴影贴图的计算偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37877510/