2014-09-22 121 views
0

我正在運行Mavericks的Intel HD 4000圖形處理Macbook Pro上的幾何着色器。我注意到來自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()按預期工作。