2016-06-10 7 views
2

동적 큐브 맵 렌더링 작업을하고 있습니다. 특히, 큐브 맵을 렌더링하려면 DirectX SDK 샘플 "CubeMapGS"의 셰이더를 사용하고 있습니다. 여기에서 알 수 있듯이 쉐이더는 정확합니다 :셰이더 연결 오류/불일치

SamplerState ss; 
Texture2D tex; 

cbuffer Constants 
{ 
    float4x4 worldMat; 
    float4x4 viewMats[6]; 
    float4x4 projMat; 
}; 

struct VS_CUBEMAP_IN 
{ 
    float4 Pos : POSITION; 
    float3 Normal : NORMAL; 
    float2 Tex : TEXCOORD0; 
}; 

struct GS_CUBEMAP_IN 
{ 
    float4 Pos : SV_POSITION; // World position 
    float2 Tex : TEXCOORD0; // Texture coord 
}; 


struct PS_CUBEMAP_IN 
{ 
    float4 Pos : SV_POSITION; // Projection coord 
    float2 Tex : TEXCOORD0; // Texture coord 
    uint RTIndex : SV_RenderTargetArrayIndex; 
}; 


GS_CUBEMAP_IN VShader(VS_CUBEMAP_IN input) 
{ 
    GS_CUBEMAP_IN output = (GS_CUBEMAP_IN) 0.0f; 

    // Compute world position 
    output.Pos = mul(input.Pos, worldMat); 

    // Propagate tex coord 
    output.Tex = input.Tex; 

    return output; 
} 

[maxvertexcount(18)] 
void GShader(triangle GS_CUBEMAP_IN input[3], inout TriangleStream<PS_CUBEMAP_IN> CubeMapStream) 
{ 
    for (int f = 0; f < 6; ++f) 
    { 
     // Compute screen coordinates 
     PS_CUBEMAP_IN output; 
     output.RTIndex = f; 
     for (int v = 0; v < 3; v++) 
     { 
      output.Pos = mul(input[v].Pos, viewMats[f]); 
      output.Pos = mul(output.Pos, projMat); 
      output.Tex = input[v].Tex; 
      CubeMapStream.Append(output); 
     } 
     CubeMapStream.RestartStrip(); 
    } 
} 


float4 PShader(PS_CUBEMAP_IN input) : SV_Target { 
    return tex.Sample(ss, input.Tex); 
} 

그러나 작동하지 않습니다. 하지만 난 정말이 인식 할 수없는,

D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Vertex Shader - Geometry Shader linkage error: Signatures between stages are incompatible. Semantic 'SV_POSITION' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX] 
D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Vertex Shader - Geometry Shader linkage error: Signatures between stages are incompatible. Semantic 'TEXCOORD' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX] 
D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Geometry Shader - Pixel Shader linkage error: Signatures between stages are incompatible. Semantic 'TEXCOORD' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX] 
D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Geometry Shader - Pixel Shader linkage error: Signatures between stages are incompatible. Semantic 'SV_POSITION' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX] 

오류 메시지가 입력 인수 및 다른 쉐이더 기능의 출력 값 사이의 불일치 상태를 나타낼 것으로 보인다 : 사실, 나는 다음 다이렉트 오류 메시지가 나타납니다 불일치.

이 오류와 관련된 아이디어 나 설명이 있으십니까? 그 텍사스의 지오메트리 셰이더의 출력 레지스터 0 동안 얻을 수 있기 때문에 당신은 당신의 픽셀 쉐이더에서 순위를 읽지 않는

답변

0

, 그것은 당신이 읽을 출력을 넣어, 그런 식으로 문제를 해결할 수 있습니다 1.

등록했다 구조체 또한

struct PS_CUBEMAP_IN 
{ 
    float2 Tex : TEXCOORD0; // Texture coord 
    uint RTIndex : SV_RenderTargetArrayIndex; 
    float4 Pos : SV_POSITION; // Projection coord 
}; 

의 끝에 다음 단계로, 픽셀 쉐이더 전에 마지막 단계에서가 아니라 특별한 SV_POSITION를 사용하여 조심, 그것은 NVIDIA와 AMD의 동일하지 동작합니다. 그냥 POSDONTMESSWITHME이라고하고 버텍스 쉐이더가 출력해야하기 때문에 GS_CUBEMAP_IN 끝에 가짜를 넣고 0으로 설정하십시오.

지오메트리 셰이더는 좋지 않습니다. 기하학적 확장은 꽤 느리고 응용 프로그램 종류에 따라 가치가 없습니다. 삼각형을 제거하는 것이 좋습니다. 슬프게도 확장 기능을 사용하지 않고 rt 및 viewport 인덱스를 출력하는 유일한 단계입니다.