2013-12-15 5 views
0

제 질문은 모든 테셀레이션 컨트롤 쉐이더 호출은 OPENGL이 각 쉐이더를 여러 번 호출해야하는 이유와 동일한 결과를 만들어냅니다. 예 : My Tesellation Control Shader는 베 지어 표면의 제어점을 계산합니다. Vertex Shaders에서 더 일찍 합쳐진 세 개의 정점 배열을 사용합니다. Tesellation 제어 쉐이더가 gl_invocatinoID에 대한 저장, 같은 입력을 세 번 호출되도록테셀레이션 제어 쉐이더가 여러 번 호출되는 이유는 무엇입니까?

// attributes of the input CPs 
in vec3 WorldPos_CS_in[]; 

내 패치 크기는 3, 그리고 그들 모두는 같은 다음과 같은 컨트롤 포인트 생성 :

struct OutputPatch                    
{                         
vec3 WorldPos_B030;                   
vec3 WorldPos_B021;                   
vec3 WorldPos_B012;                   
vec3 WorldPos_B003;                   
vec3 WorldPos_B102;                   
vec3 WorldPos_B201;                   
vec3 WorldPos_B300;                   
vec3 WorldPos_B210;                   
vec3 WorldPos_B120;                   
vec3 WorldPos_B111;                   
vec3 Normal[3];                    
vec2 TexCoord[3];                    
};                        

// attributes of the output CPs                 
out patch OutputPatch oPatch; 

과 또한 도움이 tesellation에이 패치를 분할 OpenGL은 동일한 정보 좌표 : 모든 테스의 제어 쉐이더가 같은 일을 할 것이 분명하다

// Calculate the tessellation levels  
gl_TessLevelOuter[0] = gTessellationLevel; 
gl_TessLevelOuter[1] = gTessellationLevel; 
gl_TessLevelOuter[2] = gTessellationLevel; 
gl_TessLevelInner[0] = gTessellationLevel; 

. 자원을 낭비합니까? 테셀레이션 컨트롤 셰이더를 각 패치마다 한 번 호출해야하는 이유는 무엇입니까?

답변

1

컨트롤 쉐이더 호출은 분명히 똑같은 결과를 생성하지 않습니다. 왜냐하면 컨트롤 포인트 출력이 분명히 다르기 때문입니다. 그러나 그것은 현학적입니다.

여러분의 프로그램과 지금까지 모든 예제에서 컨트롤 쉐이더는 모든 컨트롤 포인트에 대해 똑같은 일을하고 테셀레이션 레벨은 변경되지 않습니다.

그러나 셰이더가 각 컨트롤 포인트, 텍스처 일반 또는 새로운 속성을 생성한다고 가정 해보십시오. 그런 다음 셰이더는 각각 다른 결과를 생성합니다. 필요한 경우 추가 유연성을 갖는 것이 좋습니다.

현대 GPU는 최대한 병렬로 처리하려고합니다. 구형 지오메트리 셰이더는 하나의 호출로 여러 개의 출력을 생성합니다. 현대 GPU에서 각각 하나의 출력을 생성하는 여러 번의 호출을하는 것이 더 효율적입니다.