DirectX12中获取HLSL顶点着色器参数float3类型的问题
解决DirectX 12中获取HLSL顶点着色器参数完整数据类型的问题
你遇到的问题核心是只读取了ID3D12ShaderReflection::GetInputParameterDesc返回的D3D12_SIGNATURE_PARAMETER_DESC结构体中的ComponentType字段,忽略了关键的Mask字段——前者仅表示单个分量的基础类型(比如float32),后者才标识参数实际使用的分量数量,二者结合才能还原出float3这类完整类型。
具体实现逻辑如下:
- 通过
GetInputParameterDesc获取输入参数的描述结构体 - 先通过
ComponentType判断基础数据类型(比如D3D_REGISTER_COMPONENT_FLOAT32对应float类型的分量) - 再通过
Mask的值判断分量数量:- Mask=1(二进制0b0001):单分量,对应
float - Mask=3(二进制0b0011):双分量,对应
float2 - Mask=7(二进制0b0111):三分量,对应
float3 - Mask=15(二进制0b1111):四分量,对应
float4 - 其他Mask值表示仅使用部分分量的情况(比如Mask=5即0b0101,对应仅使用x和z分量的float)
- Mask=1(二进制0b0001):单分量,对应
对应代码示例:
HRESULT hr; ID3D12ShaderReflection* pShaderReflection = nullptr; // 假设已成功获取pShaderReflection实例 for (UINT inputIndex = 0; ; inputIndex++) { D3D12_SIGNATURE_PARAMETER_DESC paramDesc; hr = pShaderReflection->GetInputParameterDesc(inputIndex, ¶mDesc); if (FAILED(hr)) break; // 遍历完所有输入参数 // 判断基础分量类型 if (paramDesc.ComponentType == D3D_REGISTER_COMPONENT_FLOAT32) { std::string typeName; switch (paramDesc.Mask) { case 1: typeName = "float"; break; case 3: typeName = "float2"; break; case 7: typeName = "float3"; break; case 15: typeName = "float4"; break; default: typeName = "partial float"; // 部分分量的情况 } // 输出参数名和对应类型 printf("Input parameter %s: %s\n", paramDesc.SemanticName, typeName.c_str()); } }
针对你提供的HLSL代码里的float3 pos : Position和float3 color : Color,它们对应的Mask值都是7,ComponentType为D3D_REGISTER_COMPONENT_FLOAT32,因此可以正确识别为float3类型。
内容的提问来源于stack exchange,提问作者Flapitys
相关产品推荐
相关产品推荐

