2013-07-20 50 views
1

我有一個簡單的幾何着色器,我用它來計算每個面法線。已損壞的幾何着色器基元opengl 3.2 GLSL 150

VertexShader

#version 150 

in vec3 in_Position; 

uniform mat4 modelMat; 
uniform vec3 scale; 


void main(void) 
{ 
    // scale the verts 
    vec3 scaledPosition = vec3(in_Position.x * scale.x, 
           in_Position.y * scale.y, 
           in_Position.z * scale.z); 

    gl_Position = modelMat * vec4(scaledPosition, 1.0f); 
} 

幾何着色器

#version 150 core 

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

uniform mat4 ProjectionMat; 
uniform mat4 ViewMat; 

out vec3 ex_Normal; 

void main() 
{ 
    // calculate the normal 

    vec3 d1 = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz; 
    vec3 d2 = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz; 
    vec3 normal = normalize(cross(d1,d2)); 
    for(int i = 0; i < gl_in.length(); i++) 
    { 
     gl_Position = ProjectionMat * ViewMat * gl_in[i].gl_Position; 
     ex_Normal = normal; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 

片段着色器

#version 150 

in vec3 ex_Normal; 

out vec4 v_FragColour; 

uniform vec3 colour; 
uniform vec3 lightDir; 


void main(void) 
{ 
    vec3 diffuse = vec3(0.2, 0.2, 0.2); 
    vec3 lightColor = vec3(1.0, 1.0, 1.0); 
    const vec3 AMBIENT = vec3(0.1, 0.1, 0.1); 


    // normalize the fragment normal and camera direction 
    vec3 diffuseC = clamp(diffuse * (dot(lightDir,ex_Normal) + 1.0f)/2.0f , 0.0, 1.0) ; 
    v_FragColour = vec4(clamp(colour.rgb * (diffuseC + AMBIENT), 0.0, 1.0), 1.0f); 

} 

所有出現通過罰款,而大部分的幾何輸出的是完全如我所料,但是我得到這些隨機原語彈出和伸出我的網格,他們有時甚至從一個網格到另一個網格,即來自不同的平局調用。

我認爲它必須與從幾何着色器輸出三角形條有關,但是我使用EndPrimitve()強制每次從幾何着色器中取出單個圖元;如果任何人有任何想法或線索爲什麼這可能是,或者我能以什麼方式去調試,請讓我知道。

使用glDrawElements()完成繪製;

編輯進展:

因此,一些進展已經取得了進展。 當我不使用從幾何着色器輸出正常的數據在片段着色器的問題消失了,我的片段着色器現在看起來像:

void main(void) 
{ 
    vec3 diffuse = vec3(0.2, 0.2, 0.2); 
    vec3 lightColor = vec3(1.0, 1.0, 1.0); 
    const vec3 AMBIENT = vec3(0.1, 0.1, 0.1); 


    // normalize the fragment normal and camera direction 
    //vec3 diffuseC = clamp(diffuse * (dot(lightDir,ex_Normal) + 1.0f)/2.0f , 0.0, 1.0) ; 
    //v_FragColour = vec4(clamp(colour.rgb * (diffuseC + AMBIENT), 0.0, 1.0), 1.0f); 
    v_FragColour = vec4(0.0f,0.5f,1.0f,0.5f); 

} 

但是如果我取消註釋行:

//vec3 diffuseC = clamp(diffuse * (dot(lightDir,ex_Normal) + 1.0f)/2.0f , 0.0, 1.0); 

即使未使用此計算的輸出,該問題仍會返回。

我猜這與我將信息從幾何着色器傳遞給每個頂點的片段着色器的方式有關。

任何想法?

+0

我懷疑你錯誤地獲得了統一的位置,並且當lightDir從不被引用引用到被引用時,它會改變鏈接GLSL程序中另一個統一位置的統一位置。如果您在沒有實際查詢其位置的情況下對另一套制服的位置做出任何假設,或者在鏈接幾何着色器之前做了這些假設,那麼這可能是責任。 –

回答

3

這是一個幾何着色驅動程序錯誤。我花了相當長的一段時間才發現:我在Mac OSX 10.8上使用了AMD Radeon HD HD6750M。 切換到內部英特爾HD Graphics 3000(使用gfxCardStatus)解決了這個問題,但當然要慢得多,不支持多顯示器。 最後我升級到Mac OSX 10.9開發者預覽版4,這個bug似乎已經消失了。

+0

乾杯,我在linux上再次玩過這款遊戲,在那裏似乎很好。我在其他地方看到過一篇關於osx驅動程序的帖子。我還沒有檢查是否已經在新的特立獨行的驅動程序中解決了這個問題,但如果是這樣的話,我認爲我們可以稱之爲一個錯誤。 –