【发布时间】:2013-07-20 08:44:41
【问题描述】:
我有一个简单的几何着色器,用于计算每个面的法线。
顶点着色器
#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 程序中另一个制服的制服位置。如果您对另一个制服的位置做出任何假设,而没有实际查询其位置,或者在链接几何着色器之前进行,那么这可能是罪魁祸首。
标签: opengl glsl geometry-shader