gl_VertexID在任何有用的几何着色器中始终为零

时间:2016-10-26 21:51:34

标签: opengl glsl geometry-shader

我正在使用索引渲染和几何着色器。如果我将gl_VertexID传递给几何着色器,只要我不发射任何顶点,它就可以正常工作;如果我发出一个或多个顶点,gl_VertexID(以任何名称传递)为零。为什么呢?

使用下面的着色器,几何着色器会将正确的索引放入我的反馈缓冲区,当且仅当我注释掉两个EmitVertex调用时。我错过了什么?

(我可以解决这个问题,但它让我感到害怕!)

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 个答案:

答案 0 :(得分:0)

所以这看起来像是一个nVidia实现的东西。如果我在GeForce GTX580上运行这些着色器,行为如上所述。使用AMD FirePro V5900,它的行为与我期望的一样,无论我是否发出顶点,反馈缓冲区中的值都是正确的。