我有一个简单的几何着色器,我用它来计算每个面的法线。
顶点着色器
#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 );
即使从未使用此计算的输出,问题也会返回。
我猜这与我将信息从几何着色器传递到每个顶点的片段着色器的方式有关。
有任何想法吗 ??