I’m trying to get a fairly straightforward geometry shader to work in OS X (10.8.3), but I’ve run into a very strange problem that is causing artifacts on screen. This same program works just fine using a Windows computer with an Nvidia graphics card. Here is a video of the problem, where you can see random triangles appearing and disappearing.
web.cs.miami.edu/home/jstoecker/video/geometry_shader_osx.mp4
I have narrowed down the problem to transferring vertex attributes between the geometry and fragment shader. It doesn’t matter if I use built-in attributes (gl_Vertex, gl_Normal) or generic vertex attributes.
// VERTEX SHADER----------------------------------------------------------------
#version 120
uniform mat4 modelView;
uniform mat4 projection;
varying vec3 vert_normal_eye;
void main()
{
vert_normal_eye = (modelView * vec4(gl_Normal, 0.0)).xyz;
gl_Position = projection * modelView * gl_Vertex;
}
// GEOMETRY SHADER ------------------------------------------------------------
#version 120
#extension GL_EXT_gpu_shader4 : enable
#extension GL_EXT_geometry_shader4 : enable
varying in vec3 vert_normal_eye[3];
varying out vec3 normal_eye;
void main()
{
for (int i = 0; i < 3; i++) {
gl_Position = gl_PositionIn[i];
normal_eye = vert_normal_eye[i];
EmitVertex();
}
}
// FRAGMENT SHADER ------------------------------------------------------------
#version 120
const vec3 light = vec3(0.0, 0.0, -1.0);
varying vec3 normal_eye;
void main()
{
vec3 n = normalize(normal_eye);
float diffuse = max(max(dot(n, light), dot(-n, light)), 0.35);
gl_FragColor = vec4(diffuse, diffuse, diffuse, 0.2);
}
If I use gl_FragColor = vec4(1.0, 1.0, 1.0, 0.2) in the fragment shader and remove all lines containing normal_eye the problem goes away. Note that I don’t really need a geometry shader for this example, but it’s only to illustrate the problem in the smallest example I can provide.