2013-07-11 1 views
0

이 GLSL 쉐이더 잘 컴파일,하지만 난 때) (glUseProgram 그것을 활성화하기 위해; OpenGL 내게 잘못된 값 오류를 준다 :이 Invalide 값은 GLSL 버전 EmitVertex을 사용하는 경우 150

@vert 
#version 150 
uniform mat4 projectionmodelview_matrix_; 
in vec3 global_position_; 

void main(void) { 
    gl_Position = projectionmodelview_matrix_ * vec4(global_position_, 1.0); 
    EmitVertex(); 

    gl_Position = projectionmodelview_matrix_ * vec4(global_position_, 1.0); 
    EmitVertex(); 

    gl_Position = projectionmodelview_matrix_ * vec4(global_position_, 1.0); 
    EmitVertex(); 
    EndPrimitive(); 
} 

@frag 
#version 150 
out vec4 out_color_; 
void main(void) { 
    out_color_ = vec4(1.0, 0.0, 0.0, 1.0); 
} 

그러나 정점을 방출하는 부품을 제거하면 작동합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2

쉬운 대답, 버텍스 쉐이더는 EmitVertexEndPrimitive을 사용할 수 없습니다. 버텍스 쉐이더는 파이프 라인을 통과 한 각 버텍스에 대해 한 번 호출되어 그 단일 버텍스에 대한 다양한 값을 출력합니다. 버텍스 나 프리미티브를 만들거나 버릴 수는 없다. (심지어 프리미티브에 대한 합리적인 개념조차 가지고 있지 않다.) 필요한 것은 geometry shader입니다 (코드가별로 의미가 없지만 각 모서리마다 동일한 꼭지점을 가진 삼각형을 배치하므로 전혀 래스터 화되지 않습니다).

가 그래서 버텍스 쉐이더는 일반 불법 주어진, 실제로 문 의 진리를 의심을 "이 GLSL 쉐이더 잘 컴파일"하고 GL_INVALID_VALUE 오류가 합리적인 것으로 보인다. 비록 GL_INVALID_VALUE이 실제로 GL에 의해 생성되지 않은 프로그램을 위해 던져 질지라도 (그러나 그것은 성공적으로 컴파일되고 링크되지 않은 프로그램을 삭제하는 몇몇 래퍼 프레임 워크로 인한 것일 수도 있습니다.

+0

아하, 지오메트리 셰이더는 버텍스 쉐이더와 다르다? 나는 항상 geometry shader가 vertex를 복사 할 수있는 버텍스 쉐이더이기도하지만 –

+2

@ViktorSehr 아니요, [geometry shader] (http://www.opengl.org/wiki/Geometry_Shader)는 * after the vertex 셰이더는 각 프리미티브에 대해 한 번 호출되며 (이 프리미티브가 버텍스 셰이더를 통과 한 후) 기본 프리미티브에서 새로운 프리미티브를 생성 할 수 있습니다. –

+0

어떻게 이런 식으로 놓칠 수 있니? :) –