Z-fighting Direct3D9,仅带动态缓冲

时间:2012-10-20 02:52:27

标签: direct3d vertex-buffer depth-testing

我使用我的Blendshape代码中的数据锁定并填充Direct3d9中每一帧的顶点缓冲区。我的阴影使用两个步骤,因此我使用一个着色器渲染一次,然后使用其他着色器绘制添加剂混合。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

第一。你确定D3D确实改变了数据,或者这只是假设吗?我确信D3D不会改变你的数据

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

答案 1 :(得分:0)

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

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

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

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