如何解决Direct3D12 - 哪个 RootSignature 优先?
我是 MSFT 和 DirectX 的新手,所以请放轻松。
如果 hlsl 着色器使用 [RootSignature(SignatureName)]
属性,它会被代码中使用 ID3D12RootSignature
定义的根签名覆盖吗?
例如在示例代码中,我将其放在着色器包含的 .hlsli 文件中:
"RootFlags(ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT)," \
"CBV(b0,visibility = SHADER_VISIBILITY_VERTEX),visibility = SHADER_VISIBILITY_PIXEL)," \
"DescriptorTable(SRV(t0,numDescriptors = 6)," \
"DescriptorTable(SRV(t64," \
"RootConstants(b1,num32BitConstants = 2," \
"StaticSampler(s0,maxAnisotropy = 8," \
"StaticSampler(s1,visibility = SHADER_VISIBILITY_PIXEL," \
"addressU = TEXTURE_ADDRESS_CLAMP," \
"addressV = TEXTURE_ADDRESS_CLAMP," \
"addressW = TEXTURE_ADDRESS_CLAMP," \
"comparisonFunc = COMPARISON_GREATER_EQUAL," \
"filter = FILTER_MIN_MAG_LINEAR_MIP_POINT)"
在着色器中:
[RootSignature(ModelViewer_RootSig)]
VSOutput main(VSInput vsInput)
{
VSOutput vsOutput;
vsOutput.position = mul(modelToProjection,float4(vsInput.position,1.0));
vsOutput.worldPos = vsInput.position;
vsOutput.texCoord = vsInput.texcoord0;
vsOutput.viewDir = vsInput.position - ViewerPos;
<etc>
这会覆盖还是被使用以下内容创建的根签名覆盖:
ASSERT_SUCCEEDED( g_Device->CreateRootSignature(1,pOutBlob->GetBufferPointer(),pOutBlob->GetBufferSize(),MY_IID_PPV_ARGS(&m_Signature)) );
解决方法
在 PC 上,如果您同时拥有“代码提供的”根签名和“着色器提供的”根签名,则代码优先。通常,您应该使用一种或另一种,而不是两者都使用。
对于 GitHub 上的 DirectX Tool Kit for DX12,我使用这两种方法都违反了我刚才所说的内容,但这是有充分理由的。一般来说,“代码风格”的根签名对于“新手”来说似乎更容易理解,因此我在工具包中使用它,因为它主要用于学习项目、示例等。我也支持 Xbox 开发,其中强烈建议始终使用基于着色器的根签名。
这是因为在 Xbox 上,着色器是“完全预编译的”,根签名中的任何差异都会在运行时触发“重新编译”。如果我的代码和着色器签名不同步,运行时的 Xbox 版本会生成调试输出,因此我很容易维护。对于大多数人来说,情况并非如此。它还提供了一堆代码和着色器符号中相同根 sig 的示例,这对 deved 来说是一件好事,但对于大多数项目来说可能不值得。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。