1

我用我的 blendshape 代码中的数据锁定并填充 Direct3d9 中的每一帧的顶点缓冲区。我的着色使用两个步骤,所以我用一个着色器渲染一次,然后用我的另一个着色器绘制一个加法混合。

出于我以外的原因,我的顶点缓冲区中的数据(显然)在这两个绘图调用之间略有不同,因为我有闪烁的 z-fighting,其中第二遍有时会在第一遍渲染“后面”。

这一切都在一个线程中完成,并且缓冲区在渲染调用之前很长时间被解锁。此外,不会对任何着色器指令进行任何更改,因此两次调用中的数据应该完全相同。如果 blendshape 碰巧没有改变,则不会发生 z-fighting。

现在我在我的着色器中“推动”一点深度,但这是一个非常不雅的解决方案。

为什么这些数据会被改变?为什么 DirectX 会在我解锁缓冲区后更改缓冲区中的数据?我可以强迫它不改变它吗?

4

2 回答 2

1

第一个。你确定数据真的被 D3D 改变了,还是这只是假设?我确定 D3D 不会更改您的数据

第二。正如您所说,您有两个不同的着色器来绘制几何图形。他们可能有不同的转换操作。或者由于优化,着色器中的转换可能会有所不同,这就是为什么转换后的顶点可能略有不同(但足以用于 z 战斗)。我建议在一个着色器/技术中使用两个通道。或者,如果您仍想使用两个着色器,则最好使用共享代码进行转换和其他相同的操作。

于 2012-11-05T16:19:00.197 回答
0

我可以确定 D3D 运行时不会更改您通过顶点缓冲区传入的任何数据,我在渲染两层地形时做了和您一样的事情,没有 Z-fighting。但是确实有一些渲染状态会在将三角形光栅化为像素时改变它,它们是 D3D9 中的 D3DRS_DEPTHBIAS 和 D3DRS_SLOPESCALEDEPTHBIAS,或者 D3D10_RASTERIZER_DESC 结构中的相等值。如果这些渲染状态发生了变化,您应该检查它们。

您还需要确保在着色器中使用位置进行计算的所有变换矩阵或其他常数精确相等,否则将出现 z-fighting。

我建议你使用一些图形调试工具来检查它。如果您使用的是 NVIDIA 卡,则可以使用 PIX、PerfHUD 或 Nsight。

对不起,我的英语很差,一定很难理解。但我希望这可以帮助你,谢谢。

于 2012-11-15T03:55:26.440 回答