Reflection 如何反映有关hlsl结构成员的信息?

Reflection 如何反映有关hlsl结构成员的信息?,reflection,shader,hlsl,directx-11,Reflection,Shader,Hlsl,Directx 11,在Directx 11中使用着色器反射,可以通过调用 myVar = myCbuffer->GetVariableByName/Index 但是如果变量是一个struct对象,如何获取关于单个struct成员的信息呢? 注意,我说的不是效果框架,而是纯hlsl和反射API。使用如果效果变量是结构,请使用此方法按名称查找成员。。如果结构有一个成员foo,那么 myCbuffer->GetVariableByName->GetMemberByName("foo") 变量的成

在Directx 11中使用着色器反射,可以通过调用

myVar = myCbuffer->GetVariableByName/Index  
但是如果变量是一个struct对象,如何获取关于单个struct成员的信息呢? 注意,我说的不是效果框架,而是纯hlsl和反射API。

使用如果效果变量是结构,请使用此方法按名称查找成员。。如果结构有一个成员foo,那么

myCbuffer->GetVariableByName->GetMemberByName("foo")

变量的成员编号存储在其类型描述中。使用它来迭代它的成员

例如:

ID3D11ShaderReflectionConstantBuffer* cb = reflector->GetConstantBufferByIndex( cbIndex );
if ( cb )
{
    D3D11_SHADER_BUFFER_DESC cbDesc;
    cb->GetDesc( &cbDesc );
    if ( cbDesc.Type == D3D11_CT_CBUFFER )
    {
        for ( unsigned i = 0; i < cbDesc.Variables; ++i )
        {
            ID3D11ShaderReflectionVariable* var = cb->GetVariableByIndex( i );

            D3D11_SHADER_VARIABLE_DESC varDesc;
            var->GetDesc( &varDesc );

            ID3D11ShaderReflectionType* type = var->GetType();
            D3D11_SHADER_TYPE_DESC typeDesc;
            type->GetDesc( &typeDesc );

            for ( unsigned j = 0; j < typeDesc.Members; ++j )
            {
                ID3D11ShaderReflectionType* memberType = type->GetMemberTypeByIndex( j );
                D3D11_SHADER_TYPE_DESC memberTypeDesc;
                memberType->GetDesc( &memberTypeDesc );
            }
        }
    }
}
你可以用

ID3D11ShaderReflectionType::GetMemberTypeName 
此函数将返回CBuffer中struct的字段成员名称。
我在开发HLSL反射程序时遇到了同样的问题。我自己尝试过这个函数,得到了正确的结果。

由于某些原因,反射API中似乎没有GetMemberByName函数。我编辑了我的问题,以澄清这正是我所说的。好的,但这不会提供我需要的有关成员名称或大小的信息。GetMemberTypeName返回成员的名称。大小可以从成员类型描述派生。最简单的方法是使用偏移量字段。我认为它返回了类型名称。关于偏移量字段的好主意。