【问题标题】:Why no glVertexAttribPointer for index buffer object?为什么索引缓冲区对象没有 glVertexAttribPointer?
【发布时间】:2014-07-23 21:28:10
【问题描述】:

我来这里是为了消除专家对 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 定义了第一个变量“位置”是一个顶点,具有三个坐标,每个坐标都是浮点数。第二个 glVertexAttribPointer 将第二个变量“texCoord”定义为一对纹理坐标,每个坐标都是浮点数。

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

感谢您的帮助。非常感谢!

【问题讨论】:

    标签: opengl 3d vbo opengl-3


    【解决方案1】:

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

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

    【讨论】:

    • VBO 绑定与uniform 变量无关。你的意思是attribute/in变量?
    • 对不起!是的,我的意思是属性/in。我在回答中更正了它
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多