2016-05-25 134 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())));