1

我有一个简单的几何着色器,我用它来计算每个面的法线。

顶点着色器

#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 );

即使从未使用此计算的输出,问题也会返回。

我猜这与我将信息从几何着色器传递到每个顶点的片段着色器的方式有关。

有任何想法吗 ??

4

1 回答 1

3

这是一个几何着色器驱动程序错误。我花了很长时间才发现这一点:我在 Mac OSX 10.8 和 AMD Radeon HD HD6750M 上也有同样的情况。切换到内部 Intel HD Graphics 3000(使用 gfxCardStatus)可以解决问题,但速度当然要慢得多,并且不支持多显示器。最后我升级到了 Mac OSX 10.9 Developer Preview 4,这个 bug 似乎永远消失了。

于 2013-10-01T15:35:12.123 回答