2013-02-16 1 views
2

필자는 매우 간단한 통과 스 캐도 쉐이더 셰이더를 작성했습니다. 내 입력 프리미티브는 포인트이고 출력 프리미티브는 또한 포인트입니다. 또한 버텍스 쉐이더에서 기하학 셰이더를 통해 프래그먼트 쉐이더로 색상과 법선을 전달하고자합니다. 셰이더는 컴파일되고 완벽하게 연결되지만 최종 색상은 매우 이상합니다. 이 포워딩에 문제가 있다고 생각합니다. 누구든지 문제를 지적 할 수 있습니까? 여기 내 쉐이더는 다음과 같습니다일반 및 색상이있는 간단한 통과 형상 쉐이더

버텍스 쉐이더 :

#version 330 compatibility 

struct vData 
{ 
    vec3 normal; 
    vec4 color; 
}; 

out vData vertex; 

void main() 
{ 
    vertex.normal = gl_NormalMatrix * gl_Normal; 
    vertex.color = gl_Color; 
    gl_Position = ftransform(); 
} 

지오메트리 쉐이더 :

#version 330 

layout (points) in; 
layout (points) out; 
layout (max_vertices = 1) out; 

struct vData 
{ 
    vec3 normal; 
    vec4 color; 
}; 

in vData vertices[]; 
out vData frag; 


void main() 
{ 
    int i; 
    for(i = 0;i < gl_in.length();i++) 
    { 
     frag.normal = vertices[i].normal; 
     frag.color = vertices[i].color; 
     gl_Position = gl_in[i].gl_Position; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 

조각 쉐이더 :

#version 330 

struct vData 
{ 
    vec3 normal; 
    vec4 color; 
}; 

in vData frag; 

void main() 
{ 
    gl_FragColor = frag.color; 
} 
+2

셰이더 단계 사이에 구조체를 전달하는 것을 중지합니다. 예, 표준에 따라 기술적으로 허용됩니다. 그러나 아무도 그것을 사용하지 않으므로 IHV는 잘 테스트하지 않습니다. 입력 및 출력 그룹화가 필요한 경우 [인터페이스 블록 사용] (http://www.opengl.org/wiki/Interface_Block_%28GLSL%29). –

+0

답변 해 주셔서 감사합니다. 나는 그것을 따라야한다! fData의 –

답변

12

내가이 알아 냈! 인/아웃 변수의 이름은 같아야합니다. 즉, geometry shader의 vertices[]vertex[]이어야합니다. 그게 다야!

버텍스 쉐이더 :

#version 330 compatibility 

out vData 
{ 
    vec3 normal; 
    vec4 color; 
}vertex; 

void main() 
{ 
    vertex.normal = normalize(gl_NormalMatrix * gl_Normal); 
    vertex.color = gl_Color; 
    gl_Position = ftransform(); 
} 

지오메트리 쉐이더 :

#version 330 

layout (points) in; 
layout (points) out; 
layout (max_vertices = 1) out; 

in vData 
{ 
    vec3 normal; 
    vec4 color; 
}vertices[]; 

out fData 
{ 
    vec3 normal; 
    vec4 color; 
}frag;  

void main() 
{ 
    int i; 
    for(i = 0;i < gl_in.length();i++)// gl_in.length() = 1 though! 
    { 
     frag.normal = vertices[i].normal; 
     frag.color = vertices[i].color; 
     gl_Position = gl_in[i].gl_Position; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 

조각 쉐이더 :

다음과 같이

내 정제 및 코드 간다

#version 330 compatibility 

in fData 
{ 
    vec3 normal; 
    vec4 color; 
}; 

void main() 
{ 
    gl_FragColor = frag.color; 
} 

해피 코딩!

+1

{ vec3 normal; vec4 color; } frag; –