几何着色器opengl 3.2 GLSL 150中损坏的基元

时间:2013-07-20 08:44:42

标签: opengl glsl geometry-shader

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

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

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

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

任何想法?

1 个答案:

答案 0 :(得分:3)

这是几何着色器驱动程序错误。我花了很长时间才发现:在Mac OSX 10.8上使用AMD Radeon HD HD6750M也是如此。 切换到内部Intel HD Graphics 3000(使用gfxCardStatus)解决了这个问题,但当然要慢得多,并且不支持多显示器。 最后我升级到了Mac OSX 10.9 Developer Preview 4,这个bug似乎已经不复存在了。