0

我将 SlimDX 用于 Direct3D 10 应用程序。在应用程序中,我将 2 个加载到更多网格,图像加载为纹理并使用 fx 代码进行着色器。代码是根据 SlimDX 的示例“SimpleModel10”修改的

我将绘制调用、着色器设置代码移动到管理 1 个网格、着色器(效果)和绘制调用的类中。然后我初始化这个类的2个副本,然后依次调用draw函数。

输出,无论我如何更改网格的 Z 位置,稍后绘制的将始终保持在顶部。后来,当我使用 PIX 调试绘图调用时,我发现第二个网格没有深度,而第一个网格有深度。我试过 3 个网格,第 2 个和第 3 个网格也没有深度。有趣的是,所有这些都是从同一个类中实例化的,使用相同的绘图调用。

什么可能导致这样的问题?

以下是该类的绘制函数中的部分代码,我省略了其余部分,因为它涉及到几个类。我保留了样本的现有 OnRenderBegin() 和 OnRenderEnd():

        PanelEffect.GetVariableByName("world").AsMatrix().SetMatrix(world);

        lock (this)
        {
            device.InputAssembler.SetInputLayout(layout);
            device.InputAssembler.SetPrimitiveTopology(PrimitiveTopology.TriangleList);
            device.InputAssembler.SetIndexBuffer(indices, Format.R32_UInt, 0);
            device.InputAssembler.SetVertexBuffers(0, binding);

            PanelEffect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply();
            device.DrawIndexed(indexCount, 0, 0);

            device.InputAssembler.SetIndexBuffer(null, Format.Unknown, 0);
            device.InputAssembler.SetVertexBuffers(0, nullBinding);
        }

编辑:经过大量调试和代码隔离,我发现罪魁祸首Font.Draw()在我的DrawString()函数中

    internal void DrawString(string text)
    {
        sprite.Begin(SpriteFlags.None);
        string[] texts = text.Split(new string[] {"\r\n"}, StringSplitOptions.None);
        int y = PanelY;
        foreach (string t in texts)
        {
            font.Draw(sprite, t, new System.Drawing.Rectangle(PanelX, y, PanelSize.Width, PanelSize.Height), FontDrawFlags.SingleLine, new Color4(Color.Red));
            y += font.Description.Height;
        }
        sprite.End();
    }

注释掉 Font.Draw 解决问题。也许它会自动设置一些导致下一次网格绘制丢弃深度的状态。现在查看 SlimDX 的源代码。

4

1 回答 1

1

在 PIX 中经过多次调试,这就是结论。

调用Font.Draw()将自动将 DepthEnable 设置为false并将 DepthFunction 设置为D3D10_COMPARISON_NEVER,这是在比较 PIX 在调用前后的 OutputMerger 上的详细信息之后Font.Draw

解决方案

            Context10_1.Device.OutputMerger.DepthStencilState = depthStencilState;

把它放在下一个网格绘制调用解决问题之前。

以前我只DepthStencilStateOnRenderBegin()

于 2011-02-26T14:34:36.063 回答