我有一個簡單的幾何着色器,我用它來計算每個面法線。已損壞的幾何着色器基元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);
即使未使用此計算的輸出,該問題仍會返回。
我猜這與我將信息從幾何着色器傳遞給每個頂點的片段着色器的方式有關。
任何想法?
我懷疑你錯誤地獲得了統一的位置,並且當lightDir從不被引用引用到被引用時,它會改變鏈接GLSL程序中另一個統一位置的統一位置。如果您在沒有實際查詢其位置的情況下對另一套制服的位置做出任何假設,或者在鏈接幾何着色器之前做了這些假設,那麼這可能是責任。 –