各位程序员,您好,我发现了改进阴影映射的另一个障碍。问题是我正在做一些阴影贴图,但找不到任何合适的深度偏差。前段时间在我的 XNA 项目中,当我第一次做它时,我可以在地形上很好地设置它,并且可以很快找到合适的偏差,因为如果没有设置偏差,就会出现这样的粉刺: 我一直在调整偏差,直到阴影看起来不错,据我所知,这就是它背后的基本思想。这就是我想要的结果。现在转到 DirectX 11,稍后设置一个小场景,并完成一些 PCF 阴影映射。然后,在没有设置偏差的情况下,没有这样的粉刺,但是阴影断开了,例如这样(对于丑陋的纹理,对不起): 地面上应该有粉刺,盒子的阴影连接到盒子的边缘,但它是断开的。当降低偏差(负值)时,间隙开始减小,但很快整个阴影贴图在达到最佳间隙距离之前变暗。
我使用与 XNA 上相同的着色器代码(仅通过 pcf 过滤扩展),所以我假设它更多地与 api 有关。检查 xna 代码,我什至看不到渲染到纹理格式是什么,因为它们是隐藏的(我猜)。
如果有人以前遇到过这个问题,请帮助我以零偏差实现阴影粉刺。
更新:这张图片显示了一个平坦的四边形上的不均匀阴影(痤疮应该均匀地分布在整个四边形上,就像它在 XNA 中的地形上一样):
UPDATE2:我尝试在深度渲染过程中切换剔除模式以剔除正面,这样阴影可以调整得更好一些,因为如果修改偏差,没有渲染的地板会变暗,但阴影仍然很不均匀。单个网格的阴影可以调整为看起来不错,但其他网格的阴影会变得混乱。 不知何故,我认为深度缓冲区分布非常不均匀,因为靠近远平面的物体会得到更好的结果。我认为,即使我的剪裁距离也不差。阴影投影设置为 1-2000 深度分布(在我的场景中,1 米大约是 200 个单位),但不知何故,精度差得很远。我尝试过 R32_FLOAT 和 D24_S8_UNORM 的深度纹理格式。