2014-01-12 6 views
0

어떻게 (가능하다면) 리다이렉션에서 셰이더의 변수/구조체 멤버의 이름을 얻을 수 있습니까?셰이더 리플렉션 : 변수 이름?

저는 원시 hlsl 쉐이더 (아무 효과 프레임 워크/아니오 D3DX, 그냥 원시 directX)에 대해 얘기하고 있습니다.

나는 SharpDX를 사용하고 난 쉐이더 서명에서 필요한 대부분의 정보를 얻는 방법을 발견하고 있습니다

new SharpDX.D3DCompiler.ShaderReflection(MyShaderByteCode); 

내가 필요로하는 대부분의 정보를 얻을 수 있지만, 나는 sementic 이름을 검색 할 수있는 반면 (TEXCOORD, POSITION 등) 요소의 실제 이름을 검색 할 수 없습니다 ("이름"속성 없음).

나는이 잘못된 방향으로 가고 있습니까? 이것은 심지어 가능합니까?

struct Vertex 
{ 
    float4 Position : POSITION; 
    float2 UVPosition : TEXCOORD; 
}; 

struct Pixel 
{ 
    float4 Position : SV_POSITION; 
    float2 UVPosition : TEXCOORD; 
}; 

float4x4 worldViewProj; 

Texture2D<float4> diffuse : register(t0); 
Texture2D<float4> height : register(t1); 
Texture2D<float4> lightmap : register(t2); 
SamplerState pictureSampler; 

Pixel PerVertex(Vertex input) 
{ 
    Pixel output = (Pixel) 0; 
    input.Position.z += height.SampleLevel(pictureSampler, input.UVPosition, 0).r/2; 
    output.Position = mul(input.Position, worldViewProj); 
    output.UVPosition = input.UVPosition; 
    return output; 
} 

float4 PerPixel(Pixel input) : SV_Target 
{ 
    return diffuse.Sample(pictureSampler, input.UVPosition) * lightmap.Sample(pictureSampler, input.UVPosition); 
} 

는 내가 뭘 검색 할 수있는 것은 내가 검색하려는 것은 "위치"와 "UVPosition"당신은 저점 일정한 버퍼를 반복 할 필요가

답변

1

이다 "위치"와 "TEXCOORD"입니다. Constant Buffer는 사용되지 않으며 바이트 코드에서 제거됩니다. 반복 모든 변수 불구하고

첨부 코드 :

SharpDX.D3DCompiler.ShaderReflection sr = new SharpDX.D3DCompiler.ShaderReflection(mybytecode); 
     for (int i = 0; i < sr.Description.ConstantBuffers; i++) 
     { 
      SharpDX.D3DCompiler.ConstantBuffer cb = sr.GetConstantBuffer(i); 
      for (int j = 0; j < cb.Description.VariableCount; j++) 
      { 
       SharpDX.D3DCompiler.ShaderReflectionVariable variable = cb.GetVariable(j); 
       Console.WriteLine(variable.Description.Name); 
      } 
     } 
+0

죄송합니다. 좀 더 구체적이어야합니다. 이것은 상수 버퍼에서만 작동하지만, 검색하려는 것은 입력/출력으로 전달되는 구조의 변수 이름입니다. 새 SharpDX.D3DCompiler.ShaderReflection (pixelShaderByteCode) .GetVariable (변수 이름 목록)이 아닌 이름으로 변수를 검색하는 방법을 발견했습니다. 내 질문을 내가 원하는 것의 예제로 업데이트한다. –

+0

괜찮다. 너는 운이 좋지 않다. 나는 이것을 할 수있는 방법이 없다고 생각한다. (쉐이더 단계 사이의 계약은 의미 론적으로 행해진 다. 변수 이름이므로 컴파일러가 해당 데이터를 제거 할 가능성이 있습니다). 드롭은 말했다, 파일을 구문 분석하는 유일한 해결책이 될 가능성이 높습니다. – catflier

+0

그것이 얻는 것만 큼 좋은 것 같아요. 여전히 유용합니다. :) –

1

나는 그렇게 생각하지 않습니다이 가능합니다.

struct Vertex 
{ 
    float4 Position : POSITION0; 
    float2 UVPosition : TEXCOORD0; 
}; 

을 고유 SemanticName을 읽어 CPU 측에서 당신의 입력을 식별하는 데이를 사용하고 D3D11_SIGNATURE_PARAMETER_DESCSemanticIndex 분야 :

당신이 선택적으로 수행 할 수있는 명시 적 (의미 이름에 추가) 의미 인덱스를 할당하는 것입니다 .

원본 HLSL 파일을 직접 구문 분석하여 자신의 반사 엔진을 롤아웃하는 방법도 있습니다.

희망이 있습니다.

+0

저는 친숙한 이름에 관심이 있습니다 (엔진 사용자에게 공개하고 싶습니다). 그러나 나는 HLSL 구문 분석과 함께 갈 것이라고 생각한다. –