如何访问Fragment Shader GLSL中的顶点索引

时间:2014-09-14 14:10:40

标签: opengl glsl fragment-shader indices

我正在使用OpenGL绘制索引GL_LINES。我需要访问片段着色器中两个顶点的索引。因此,我需要知道我的线所包含的两个指数。我读到了内置变量gl_VertexID,它在这里不应该有用。因为我已经将索引存储在某个缓冲区中,所以我也试图将它们作为属性传递。 因此,我的代码如下所示:

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,(void*)0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER,indexBuffer);
glVertexAttribPointer(1,2,GL_UNSIGNED_INT,GL_FALSE,0,(void*)0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexBuffer);

使用这似乎是错误的方法,对吧? 此外,我使用索引通过图像加载存储原子写入一些信息。不幸的是,通过glGetTexImage获取此图像只会产生零。 因此,我的索引传递或我的图像写入/提取似乎都是错误的。

我很高兴在这里提供任何帮助。

1 个答案:

答案 0 :(得分:3)

对于顶点着色器中具有整数类型的属性,您需要使用glVertexAttribIPointer()(请注意其他)而不是glVertexAttribPointer()

由于每个顶点只有一个索引,第二个参数(大小)应为1.然后调用如下:

glVertexAttribIPointer(1, 1, GL_UNSIGNED_INT, 0, (void*)0);

您正在做的事情似乎有点不寻常,但我无法想到将索引数组用作顶点属性的原因是非法的。

我相信gl_VertexID只是draw命令产生的顶点的顺序id,它与顶点索引不同。