DirectX 12 资源绑定

DirectX 12 Resource binding

本文关键字:绑定 资源 DirectX      更新时间:2023-10-16

如何将资源绑定到 D3D12 中的不同着色器阶段?

我写了两个着色器,一个顶点着色器和一个像素着色器:

下面是顶点着色器:

//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缓冲区仅绑定到顶点着色器,将像素着色器的$Params缓冲区仅绑定到像素着色器?

提前感谢,

菲林托

对于 DX12,此处的性能解决方案是创建满足应用程序需求的根签名,理想情况下也在 HLSL 中声明它。您不想经常更改根签名,因此您肯定希望制作一个适用于大量着色器的签名。

请记住,DX12 是 Direct3D,没有训练轮、魔法或着色器修补,因此您只需自己明确完成所有操作即可。易用性不是 Direct3D 12 的目标。有很多充分的理由坚持使用 Direct3D 11,除非你的应用程序和开发人员资源值得 Direct3D 12 为你提供的额外控制。权力越大,责任越大

我相信你可以通过这样的东西实现你想要的:

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())));