1

D3D12 でリソースをさまざまなシェーダー ステージにバインドするにはどうすればよいですか?

1 つの頂点シェーダーと 1 つのピクセルシェーダーの 2 つのシェーダーを作成しました。

頂点シェーダーは次のとおりです。

//VertexShader.vs

float4 main(float3 posL : POSITION, uniform float4x4 gWVP) : SV_POSITION
{
    return mul(float4(posL, 1.0f), gWVP);
}

ピクセルシェーダーは次のとおりです。

//PixelShader.ps

float4 main(float4 PosH : SV_POSITION, uniform float4 Color) : SV_Target
{
    return Color;
}

関数を使用してこれら 2 つのシェーダーをコンパイルし、D3DCompileそれを反映してD3DReflect、シェーダーの説明で BoundResorces メンバーを調べると、両方とも $Params という定数バッファーがあり、それぞれ均一変数が含まれています。問題は、これらのバッファーの両方がスロット 0 にバインドされていることです。リソースをバインドするときは、リソースをリソース スロットにバインドできる ID3D12RootSignature インターフェイスを使用する必要があります。頂点シェーダーの $Params バッファーを頂点シェーダーのみにバインドし、ピクセル シェーダーの $Params バッファーをピクセル シェーダーのみにバインドするにはどうすればよいですか?

前もって感謝します、

フィリネーター

4

1 に答える 1

1

DX12 では、ここでのパフォーマンスの高いソリューションは、アプリケーションのニーズを満たすルート署名を作成し、理想的にはそれを HLSLでも宣言することです。ルート シグネチャを頻繁に変更したくないので、シェーダーの大部分で機能するものを作成する必要があります。

DX12 は、補助輪、魔法、またはシェーダーのパッチを適用しない Direct3D であるため、すべて明示的に自分で行う必要があることに注意してください。使いやすさは、Direct3D 12 の目標ではありません。Direct3D 12 が提供する追加の制御にアプリケーションと開発者のリソースが値しない限り、Direct3D 11 を使い続ける十分な理由があります。大きな力には大きな責任が伴います。

次のようなもので、あなたが望むものを達成できると信じています:

CD3DX12_DESCRIPTOR_RANGE descRange[1];
descRange[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 0);
CD3DX12_ROOT_PARAMETER rootParameters[2];
rootParameters[0].InitAsDescriptorTable(
    1, &descRange[0], D3D12_SHADER_VISIBILITY_VERTEX); // b0
rootParameters[1].InitAsDescriptorTable(
    1, &descRange[0], D3D12_SHADER_VISIBILITY_PIXEL); // b0

// Create the root signature.
CD3DX12_ROOT_SIGNATURE_DESC rootSignatureDesc(_countof(rootParameters),
     rootParameters, 0, nullptr,
     D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT);

ComPtr<ID3DBlob> signature;
ComPtr<ID3DBlob> error;
DX::ThrowIfFailed(D3D12SerializeRootSignature(&rootSignatureDesc,
     D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error));
DX::ThrowIfFailed(
    device->CreateRootSignature(0, signature->GetBufferPointer(),
        signature->GetBufferSize(),
        IID_PPV_ARGS(m_rootSignature.ReleaseAndGetAddressOf())));
于 2016-05-26T05:33:23.737 に答える