【问题标题】:corrupted primitives out of geometry shader opengl 3.2 GLSL 150几何着色器opengl 3.2 GLSL 150损坏的图元
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 干杯,我在 linux 上再次玩过这个,它看起来很好。我在其他地方看到了类似的帖子,关于 osx 驱动程序。我还没有检查这是否已在新的小牛驱动程序中修复,但如果是这样,那么我认为我们可以称之为错误。
猜你喜欢
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多