【问题标题】:Z-fighting Direct3D9, only with dynamic bufferZ-fighting Direct3D9,只有动态缓冲
【发布时间】:2012-10-20 02:52:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: direct3d vertex-buffer depth-testing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        相关资源
        最近更新 更多