2013-05-10 1 views
1

큐브를 그리기 위해 프로그램 가능한 pipline에 점 배열을 전달하는 매우 간단한 프로그램으로 작업하고 있습니다. 필자는 모든 프레임 (일부 외부 입력을 기반으로)을 기하 도형으로 변경할 수 있도록 조명을 설정하기 위해 조명을 변경하기 위해 얼굴 법선을 변경 한 후에 다시 계산해야합니다. 나는 기하학 쉐이더에서 운동으로 그것을하고 있습니다.GLSL 지오 메트릭 값을 변경할 때

정점을 : 다음과 같이

내 쉐이더

#version 330 core 

layout(location = 0) in vec3 vertexPosition_modelspace; 

uniform mat4 MVP; 

void main(){  
    gl_Position = MVP * vec4(vertexPosition_modelspace,1); 
} 

기하학 :

#version 330 

precision highp float; 

layout (triangles) in; 
layout (triangle_strip) out; 
layout (max_vertices = 3) out; 

out vec3 normal; 

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

    EndPrimitive(); 

    normal = vec3(0,0,1); 
} 

조각 :

#version 330 

in vec3 normal; 
out vec4 color; 

void main() 
{ 
    color = vec4(normal,1); 
} 

내가 법선을 계산하기 위해 노력했다 (그러나 나는 맥박이있다. 디버깅 이유로 코드를 이끌어 냈습니다.) 그리고 정상 값은 내가 프로그램을 실행할 때 놀랐습니다. 그래서 조각 색상을 정상적인 값으로 설정합니다. (실제로 정상인지 확인하기 위해) 이유가 무엇이든 '정상적인'값은 빨간색, 녹색, 흰색 및 검은 색 사이를 뒤집어서 말할 수있는 이유가 없습니다. 조각 쉐이더에서 단순히 색 벡터를 지정하면 큐브는 모든 색으로 그 색으로 잘 렌더링됩니다.

왜 보통 값이 변경됩니까?

생각하십니까?

답변

4

normal의 값은 이고 정의되지 않음은입니다.

당신은 EmitVertex 호출하기 전에 지오메트리 셰이더 출력의 모든에 작성해야합니다. GS는 직접 모드 렌더링과 같이 작동하지 않습니다.

+1

답장을 보내 주셔서 감사합니다. 내 문제가 해결 됐어. 기하학 쉐이더에 대한 제 독서에서 저에게 그렇게 말한 것을 본 적이 없습니다. 그것은 내 자신의 무능력 이었지만. 감사. – APalmer