在实现了聚光灯阴影后,当我的聚光灯离物体太远时,计算偏差会使阴影消失。
我已经尝试解决这个问题两天了,我使用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,0,0),一切正常


光的位置(0,0,1.5),不工作


有谁有公式或想法来帮助我吗?我有误解什么吗?
感谢您的阅读。
发布于 2016-08-16 16:31:52
偏置后投影空间中的差异。后投影空间是非线性的,因为深度缓冲器是对数。所以,你不能仅仅用“世界单位”中的偏见来抵消这种差异。如果你想让它工作,你必须用这个正常的偏移量重建你的取样位置。或者用倒置投影来改变你在世界空间中的深度。
希望它能帮到你!
https://stackoverflow.com/questions/37877510
复制相似问题