第一次网格后缺少深度信息

时间:2011-02-25 16:17:08

标签: directx direct3d slimdx depth-buffer direct3d10

我正在将SlimDX用于Direct3D 10应用程序。在应用程序中,我已经加载了2个更多网格,图像作为纹理加载并使用fx代码进行着色。该代码是从SlimDX的示例“SimpleModel10”

中修改的

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

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

可能导致此类问题的原因是什么?

以下是该类的draw函数中代码的一部分,我省略了其余部分,因为它涉及几个类很长。我保留了样本的现有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解决问题。也许它会自动设置一些状态,导致下一个Mesh绘制丢弃深度。现在查看SlimDX的源代码。

1 个答案:

答案 0 :(得分:1)

经过PIX的大量调试后,这就是结论。

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

解决方案

            Context10_1.Device.OutputMerger.DepthStencilState = depthStencilState;

在下一个Mesh绘制调用之前放置它来修复问题。

以前我只在DepthStencilState

中设置OnRenderBegin()