DirectX 12 资源绑定
DirectX 12 Resource binding
如何将资源绑定到 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())));
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- DirectX 12 资源绑定
- Direct2D --- 为什么画笔资源绑定到各个 Direct2D 呈现目标
- 如何将共享资源对象的生存期绑定到其用户生存期的联合中?
- 使用 boost::bind 创建绑定自动释放"heap"资源的函数对象
- c++ std::互斥锁是如何绑定到资源的?