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のソースコードを今調べています。