2014-09-22 7 views
0

MacBook Pro의 기하학 쉐이더를 사용하여 Intel HD 4000 그래픽에서 Maverick을 실행하고 있습니다. EndPrimitive() 전화에서 이상한 행동을 감지합니다. 여기 내 지오메트리 쉐이더는 다음과 같습니다GLSL EndPrimitive()가 삼각형 스트립을 끊습니다.

#version 150 core 

layout(points) in; 
layout(triangle_strip, max_vertices = 512) out; 

void main() { 
    vec4 start_pos = gl_in[0].gl_Position + vec4(-0.5, -0.5, 0.0, 0.0); 
    vec4 bottom_vertex = start_pos; 

    for (int i = 0; i < 17; ++i) { 
     bottom_vertex = start_pos + vec4(float(i) * float(1.0/16.0), 0.0, 0.0, 0.0); 
     gl_Position = bottom_vertex; 
     EmitVertex(); 

     gl_Position = bottom_vertex + vec4(0.0, 1.0/16.0, 0.0, 0.0); 
     EmitVertex(); 
    } 
    //EndPrimitive(); 
} 

이 프로그램은 glfw를 사용하고는 OpenGL 3.2의 핵심 컨텍스트를 요청합니다. [0, 0]에 하나의 정점 만 그립니다. 목표는 궁극적으로 내 기하학 셰이더 출력에 여러 개의 삼각형 스트립으로 구성된 정사각형 격자를 출력하는 것입니다. 셰이더는있는 그대로 그리드의 단일 행을 출력합니다. 다음은 결과입니다 : 내가 프리미티브 현재 삼각형 스트립을 종료하고 다음 행을위한 새로운 하나를 시작하려는 시점에서

apparently correct output

. 그러나 단순히 결과까지 나사 위의 쉐이더에서 EndPrimitive() 전화의 주석 :

broken output

내가 뭔가에 대한 EndPrimitive()를 오해하고 있는가? 내 이해는 현재 삼각형 스트립을 끝내고 새로운 삼각형 스트립을 시작해야한다는 것입니다. 루프 이후에 아무 것도하지 않기 때문에 쉐이더의 결과는 EndPrimitive()과 같거나 같아야합니다.

또한 지금 다른 구현에서 테스트 할 수 없습니다. 내 것이 버그 일 수 있습니까? 이 문제를 정확히 파악할 수있는 방법이 있습니까?

답변

1

실수가 내 호스트 코드에서 발견되었습니다. 마지막 매개 변수로 잘못된 값으로 glDrawArrays()을 호출했습니다. 배열 버퍼에 포함 된 것보다 더 많은 점을 그리는 호출을 발행 할 때 이것은 아마도 정의되지 않은 동작입니다. 이 문제를 해결하면 EndPrimitive()이 예상대로 작동합니다.