2013-07-24 1 views

답변

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); 
      } 
     } 
    } 
} 
+0

좋아,하지만 이것은 내가 필요로하는 회원의 이름이나 크기에 대한 정보를주지 않을 것이다. – Kloda

+0

GetMemberTypeName()은 멤버의 이름을 반환합니다. 크기는 멤버 유형 설명에서 파생 될 수 있습니다. 가장 간단한 방법은 오프셋 (Offset) 필드를 사용하는 것입니다. –

+0

알겠습니다. 유형 이름이 반환 된 줄 알았는데. 오프셋 필드에 대한 좋은 아이디어. – Kloda

0

GetMemberByName ("효과 변수가 구조체 인 경우이 메서드를 사용하여 이름을 기준으로 멤버를 찾습니다.")를 사용하십시오. 구조체에 "foo"멤버가있는 경우 ...

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

리플렉션 API에서 어떤 이유로 GetMemberByName 함수를 사용할 수없는 것 같습니다. (나는 내가 말하고자하는 바를 명확히하기 위해 나의 질문을 편집했다.) – Kloda

0

당신은

ID3D11ShaderReflectionType::GetMemberTypeName 

이 기능의 의지가 CBuffer에서 구조체의 필드 멤버 이름을 반환 사용할 수 있습니다. HLSL 리플렉션 프로그램을 개발할 때 같은 질문을합니다. 이 기능은 나 혼자 시도되어 올바른 결과를 얻습니다.