2013-05-10 24 views
1

我正在處理一個非常簡單的程序,它將一個點數組傳遞給可編程管道以繪製一個立方體。我試圖設置它,所以我可以改變每一幀的幾何圖形(基於某些外部輸入),因此,對於照明,我需要在改變後重新計算面部法線。我正在做幾何着色器作爲練習。當它不應該改變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); 
} 

我試圖計算法線(但我有pul因爲調試的原因導出了這段代碼),並且當我運行該程序時正常值出現了。 所以我把片段顏色設置爲任何正常值。 (看看它是否確實是正常的。) 因此,無論出於何種原因,「正常」的價值無論在何種原因下都是在紅色,綠色,白色和黑色之間翻轉。 如果我只是在片段着色器中指定一個顏色矢量,那麼該立方體在任何地方都會呈現該顏色。

爲什麼正常值的變化呢?

想法?

回答

4

normal的值是undefined

你有每個調用EmitVertex之前寫幾何着色器輸出的所有。 GS不像立即模式渲染那樣工作。

+1

謝謝你的回答。它解決了我的問題。在我所有關於幾何着色器的閱讀中,我從來沒有看到任何告訴過我的東西。儘管這是我自己的無能。謝謝。 – APalmer 2013-05-10 13:55:45