0

SharpDX(DX11)を使用して、画面上に単一の三角形を描画しようとしています。何らかの理由で、三角形は 2 フレームごとにのみ描画されるようです。デバイスの初期化コードは次のようになります。

public void Init()
    {
        renderForm = new RenderForm(Engine.GameTitle);
        renderForm.ClientSize = new Size(Engine.Settings.Screen.Width, Engine.Settings.Screen.Height);
        renderForm.MaximizeBox = false;

        var desc = new SwapChainDescription()
        {
          BufferCount = 2,
          ModeDescription = new ModeDescription(renderForm.ClientSize.Width, renderForm.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm),
          IsWindowed = true,
          OutputHandle = renderForm.Handle,
          SampleDescription = new SampleDescription(1, 0),
          SwapEffect = SwapEffect.Sequential,
          Usage = Usage.RenderTargetOutput
        };  

        Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, desc, out device, out swapChain);
        deviceContext = device.ImmediateContext;  

        var factory = swapChain.GetParent<Factory>();
        factory.MakeWindowAssociation(renderForm.Handle, WindowAssociationFlags.IgnoreAll); 

        backBuffer = Texture2D.FromSwapChain<Texture2D>(swapChain, 0);
        renderView = new RenderTargetView(device, backBuffer);

        backBuffer.Dispose();

        deviceContext.OutputMerger.SetTargets(renderView);

        deviceContext.Rasterizer.SetViewports(new Viewport(0, 0, renderForm.ClientSize.Width, renderForm.ClientSize.Height, 0.0f, 1.0f));

        ProjectionMatrix = Matrix.PerspectiveFovLH(
            (float)(Math.PI / 4),
            (float)(renderForm.ClientSize.Width / renderForm.ClientSize.Height),
            nearPlane,
            farPlane);

        WorldMatrix = Matrix.Identity;

        renderForm.Location = new Point(Screen.PrimaryScreen.Bounds.Width / 2 - Engine.Settings.Screen.Width / 2, Screen.PrimaryScreen.Bounds.Height / 2 - Engine.Settings.Screen.Height / 2);
    }

三角形をレンダリングするコードは次のようになります。

public void Render()
{
    DeviceContext context = D3DRenderer.Instance.GetDevice().ImmediateContext;

    context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(VertexBuffer, Utilities.SizeOf<Vertex>(), 0));
    context.InputAssembler.SetIndexBuffer(IndexBuffer, Format.R32_UInt, 0);
    context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
}

public void RenderShader(int indexCount)
{
    device.ImmediateContext.DrawIndexed(indexCount, 0, 0);
}

一方、Render() は RenderShader() の前に呼び出されます。Direct3D 警告を除いて、どの関数からもエラー メッセージは返されません。

D3D11: 警告: ID3D11DeviceContext::DrawIndexed: 頂点シェーダー ユニットのスロット 0 にある定数バッファーのサイズが小さすぎます (提供された 64 バイト、少なくとも 192 バイトが予想されます)。

私の MatrixBuffer 構造は次のようになります。

[StructLayout(LayoutKind.Sequential)]
internal struct MatrixBuffer
{
    public Matrix world;
    public Matrix view;
    public Matrix projection;
}

バックバッファを正しくスワップしないことによる問題ではないことを確認するために、別の色のフレームごとにバックバッファをクリアしています。これはうまくいっています。

なぜこれが現在機能していないのか、私はかなり困惑しています。誰かがこれに対する答えを知っていることを願っています。

4

1 に答える 1

1

ご列席の皆様、今日はレッスンを学びましょう. チュートリアル コードをコピー アンド ペーストしないでください。これまで。問題はシェーダー レンダリング コードにあることがわかりました。私が宣言をコピーしたチュートリアル (そしてここには投稿しませんでした。そうでなければ、皆さんにはかなり明白だったかもしれません) では、次のように宣言されたワールド/ビュー/プロジェクション マトリックスがありました。

public Matrix WorldMatrix { get; private set; }

それから私はこれをやろうとしました:

D3DRenderer.Instance.WorldMatrix.Transpose();

今のところ明らかな理由でうまくいきません。興味深いことに、それは 1 フレームおきに機能するように見えました。それがなぜなのか、私にはわかりません。しかし、マトリックス定義をプライベート セットからセットに変更した後、すべてが正常に機能するようになりました。

于 2013-03-09T21:42:52.653 に答える