为什么没有glVertexAttribPointer用于索引缓冲区对象?

时间:2014-07-23 21:28:10

标签: opengl 3d vbo opengl-3

我在这里清除一些关于专家的opengl的混淆。感谢您的帮助!

private int vbo;
private int ibo;

vbo = glGenBuffers();
ibo = glGenBuffers();

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, Util.createFlippedBuffer(indices), GL_STATIC_DRAW);


glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

glBindBuffer(GL_ARRAY_BUFFER, vbo);

glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);
glVertexAttribPointer(1, 2, GL_FLOAT, false, Vertex.SIZE * 4, 12);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);


glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

顶点着色器代码看起来像

#version 330

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texCoord;

out vec2 texCoord0;

uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(position, 1.0);
    texCoord0 = texCoord;
}

所以,这是我的理解。 glVertexAttribPointer的目的是定义顶点缓冲区对象中的数据格式。因此,在vbo中,它存储数据如下

buffer.put(vertices[i].getPos().getX());
buffer.put(vertices[i].getPos().getY());
buffer.put(vertices[i].getPos().getZ());
buffer.put(vertices[i].getTexCoord().getX());
buffer.put(vertices[i].getTexCoord().getY());
buffer.put(vertices[i].getNormal().getX());
buffer.put(vertices[i].getNormal().getY());
buffer.put(vertices[i].getNormal().getZ());

因此,我们有两个glVertexAttribPointer行,因为我们在顶点着色器中定义了两个变量。所以基本上我们正在定义这两个变量指向的内容。所以,第一个glVertexAttribPointer定义了第一个变量" position"是一个顶点,有三个坐标,每个坐标都是浮点数。第二个glVertexAttribPointer定义了第二个变量" texCoord"是一对纹理坐标,每个都是浮动的。

现在令我困惑的是,我们正在使用glVertexAttribPointer来理解存储在vbo中的数据到opengl。现在,为什么我们也不使用另一个glVertexAttribPointer或类似的代码来理解ibo中的数据。为什么这个缓冲区对象一个人留下?

我感谢任何帮助。非常感谢!

1 个答案:

答案 0 :(得分:2)

原因是,在绘制调用中只能激活一个索引缓冲区。索引缓冲区的格式在draw调用中指定(参见glDrawElements,第3个参数)。

您还可以将对glVertexAttribPointer的调用视为vbo与着色器中变量的绑定。由于index-Buffer永远不会附加到制服上,因此您不必调用glVertexAttribPointer。