我正在使用索引渲染和几何着色器。如果我将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);
}
答案 0 :(得分:0)
所以这看起来像是一个nVidia实现的东西。如果我在GeForce GTX580上运行这些着色器,行为如上所述。使用AMD FirePro V5900,它的行为与我期望的一样,无论我是否发出顶点,反馈缓冲区中的值都是正确的。