在Directx 11中使用着色器反射,可以通过调用来获取有关各个变量的信息
myVar = myCbuffer->GetVariableByName/Index
但是,如果变量是一个结构对象,如何获取有关单个结构成员的信息
请注意,我谈论的不是特效框架,而是纯hlsl和反射API。
变量的成员编号存储在其类型描述中。使用它来使用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 );
}
}
}
}
使用GetMemberByName
("如果效果变量是结构,则使用此方法按名称查找成员。")。如果结构具有成员"foo",则。。。
myCbuffer->GetVariableByName->GetMemberByName("foo")
您可以使用
ID3D11ShaderReflectionType::GetMemberTypeName
此函数将返回CBuffer中结构的字段成员名称。我在开发HLSL反思程序时遇到了同样的问题。这个函数我已经试过了,并得到了正确的结果。