2016-05-25 184 views
1

如何將資源綁定到D3D12中的不同着色器階段?DirectX 12資源綁定

我寫了兩個着色器,一個vertexshader和一個pixelshader:

這裏是頂點着色器:

//VertexShader.vs 

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

這裏是Pixelshader:

//PixelShader.ps 

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

如果我編譯這兩個着色器與D3DCompile功能並反映它與D3DReflect並檢查着色器描述中的BoundResorces成員,他們都有名爲$ Params的常量緩衝區分別包含統一變量。問題是這兩個緩衝區都綁定到了0號插槽。綁定資源時,我必須使用ID3D12RootSignature接口,它可以將資源綁定到資源插槽。如何將頂點着色器的$ Params緩衝區僅綁定到像素着色器的頂點着色器和Pixel着色器的$ Params緩衝區?

由於提前,

Philinator

回答

1

隨着DX12,這裏的高性能解決方案是創建一個滿足您的應用需求根簽名,最好declare it in your 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())));