You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

对应代码示例:

HRESULT hr;
ID3D12ShaderReflection* pShaderReflection = nullptr;
// 假设已成功获取pShaderReflection实例

for (UINT inputIndex = 0; ; inputIndex++)
{
    D3D12_SIGNATURE_PARAMETER_DESC paramDesc;
    hr = pShaderReflection->GetInputParameterDesc(inputIndex, &paramDesc);
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:57:13