CadenXc

C++ · Game Engines · Real-Time Rendering

0%

相机移动时模型出现黑影

之前遇到一个问题:移动相机时,模型的一部分,比如外壳,有时会变黑,有时又恢复原来的颜色。换个角度,黑影可能消失,也可能还在。

用 RenderDoc 对比两帧

我分别抓了正常和异常的两帧,找到同一个模型部件对应的 draw call,再对比它们绑定的纹理,发现两次绑定的贴图不一样。

接着,我请 AI 帮忙通过 RenderDoc 分析,找到了 AO 这个排查方向。在 RenderDoc 中修改 shader,去掉 AO 对颜色的影响后,黑影消失了,不过模型比正常时偏亮。

这让我把注意力放到了 AO 贴图和材质上。

尝试两种解决方法

出问题的模型使用了需要 AO 贴图的材质,但没有提供 AO 贴图。我试了两种方法:

  • 换成不需要 AO 贴图的材质。
  • 保留原来的材质,补上缺失的 AO 贴图。

两种方法在当时的测试中都有效。前一种不再使用 AO 贴图,后一种则给材质补上了需要的输入。

最后我选了第二种,让美术补上缺失的 AO 贴图。这样可以保留原来的材质,也能减少对引擎的修改。

还有没弄清楚的地方

旧文里,我把原因写成了“采样到了之前残留的纹理”。但现在回看,仅凭两次绑定的贴图不同,以及去掉 AO 后黑影消失,还不能确认这一点。

这次确认的是:补上 AO 贴图,或者换成不需要它的材质,都能解决当时的黑影问题。至于为什么相机移动会影响结果、纹理绑定为什么会变化,还需要继续追踪才能说清楚。