0

Direct3D10アプリにSlimDXを使用しています。アプリでは、2つ以上のメッシュをロードし、画像をテクスチャとしてロードし、シェーダーにfxコードを使用しました。コードはSlimDXのサンプル「SimpleModel10」から変更されました

ドローコール、シェーダーセットアップコードを、1メッシュ、シェーダー(エフェクト)、ドローコールを管理するクラスに移動します。次に、このクラスの2つのコピーを初期化してから、draw関数を次々に呼び出します。

メッシュのZ位置をどのように変更しても、後で描画される出力は常に一番上に残ります。後で、PIXを使用して描画呼び出しをデバッグすると、最初のメッシュには奥行きがありますが、2番目のメッシュには奥行きがないことがわかりました。私は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ます。これは、呼び出しの前後のOutputMergerでPIXの詳細を比較した後です。Font.Draw

解決

            Context10_1.Device.OutputMerger.DepthStencilState = depthStencilState;

次のメッシュ描画呼び出しが問題を修正する前にそれを置いてください。

以前DepthStencilStateは、OnRenderBegin()

于 2011-02-26T14:34:36.063 に答える