1
votes

I am using indexed rendering and a geometry shader. If I pass gl_VertexID to the geometry shader, it works fine as long as I do not emit any vertices; if I emit one or more vertices, gl_VertexID (passed as any name) is zero. Why?

Using the shaders below, the geometry shader will put the correct indices into my feedback buffer, if and only if I comment out both EmitVertex calls. What am I missing?

(I can work around it, but it is bugging the hell out of me!)

VERTEX SHADER

#version 440

in vec4 position;

out VSOUT{
  vec4 gl_Position;
  int index;
} vsout;

uniform mat4 gl_ModelViewMatrix;

void main(){
    gl_Position = gl_ModelViewMatrix * position;
    vsout.index = gl_VertexID;
    vsout.gl_Position = gl_Position;
}

GEOMETRY SHADER

#version 440
#extension GL_ARB_shader_storage_buffer_object : enable

layout (lines) in;
layout (line_strip) out;

in VSOUT{
   vec4 gl_Position;
  int index;
} vdata[];

layout (std430, binding=0) buffer FeedbackBuffer{
    vec2 fb[];
};

void main(){
  int i = vdata[0].index;
  int j = vdata[1].index;

  fb[gl_PrimitiveIDIn][0] = vdata[0].index;
  fb[gl_PrimitiveIDIn][1] = vdata[1].index;

  gl_Position = gl_in[0].gl_Position;
  EmitVertex();
  gl_Position = gl_in[1].gl_Position;
  EmitVertex();
}

FRAGMENT SHADER

#version 430

out vec4 outputColor;

void main(){
    outputColor = vec4(.5,.5,.5,.5);
}
1

1 Answers

0
votes

So this looks like an nVidia implementation thing. If I run these shaders on a GeForce GTX580, behaviour is as described above. Using an AMD FirePro V5900, it behaves as I'd expect, with the correct values in the feedback buffer whether or not I emit vertices.