1

これは、SlimDX を使用した定数バッファの設定に関連しています。

非常にシンプルで、次のようなシェーダーがあります。

cbuffer ConstantBuffer : register(b0)
{
    float4 color;
}

float4 VShader(float4 position : POSITION) : SV_POSITION
{
    return position;
}

float4 PShader(float4 position : SV_POSITION) : SV_Target
{
    return color;
}

定数バッファーを介して渡された色を、描画されるすべてのピクセルに適用するだけで、非常に簡単です。

私のコードでは、定数バッファーを次のように定義しています。

[StructLayout(LayoutKind.Explicit)]
        struct ConstantBuffer
        {
            [FieldOffset(0)]
            public Color4 Color;
        }

そして、私のレンダーループでそれをここに設定します。

ConstantBuffer cb = new ConstantBuffer();
cb.Color = new Color4(Color.White);
using (DataStream data = new DataStream(Marshal.SizeOf(typeof(ConstantBuffer)), true, true))           
{
    data.Write(cb);
    data.Position = 0;
    D3D.Buffer buffer = new D3D.Buffer(device,data, new BufferDescription
    {
        Usage = ResourceUsage.Default,
        SizeInBytes = Marshal.SizeOf(typeof(ConstantBuffer)),
        BindFlags = BindFlags.ConstantBuffer
    });
    context.UpdateSubresource(new DataBox(0, 0, data), buffer, 0);
}

context は device.ImmediateContext で、 device は Direct3D デバイスです。ただし、実行すると、白を通過したにもかかわらず、ピクセルが黒として描画されるため、明らかに値が設定されていません。

誰にもアイデアはありますか?

4

1 に答える 1

1

D3D.Buffer オブジェクトを一度作成し、必要に応じて更新する必要があります (初期データをコンストラクター引数として指定するため、常に白いオブジェクトを使用する場合は、UpdateSubresource を呼び出す必要はまったくありません)。 、context.PixelShader.SetConstantBuffer(buffer, 0)ドローコールを発行する前にパイプライン ( ) にバインドします。

于 2011-02-16T14:01:36.337 に答える