1

在 Directx 11 中使用着色器反射,您可以通过调用获取有关各个变量的信息

myVar = myCbuffer->GetVariableByName/Index  

但是如果变量是一个结构对象,如何获取有关各个结构成员的信息?
请注意,我不是在谈论效果框架,而是纯粹的 hlsl 和反射 API。

4

3 回答 3

0

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

例子:

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 );
            }
        }
    }
}
于 2013-07-25T21:23:16.183 回答
0

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

myCbuffer->GetVariableByName->GetMemberByName("foo")
于 2013-07-24T17:25:16.883 回答
0

你可以使用

ID3D11ShaderReflectionType::GetMemberTypeName 

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

于 2015-02-07T10:52:39.953 回答