关于使用VAO和glVertexAttribPointer的说明

时间:2014-12-22 05:52:01

标签: opengl

我想我了解如何使用顶点数组对象(VAO)以及数据的存储方式以及OpenGL中的指针如何工作,但有一些事情我会模糊不清。我希望有人可以证实我的理解并纠正任何错误。

我设法找到thisthis文章,这是我获取大部分信息的地方,但仍然有点不确定顶点缓冲区对象(VBO)需要绑定多长时间数组缓冲区绑定点以及何时需要绑定和反弹VAO。我也从未使用旧的OpenGL,所以第二个链接中的很多引用对我来说没什么意义。这就是我现在理解的方式:

第一步是将数据放在VBO中:

glGenBuffers
glBindBuffer(GL_ARRAY_BUFFER, ...)
glBufferData(GL_ARRAY_BUFFER, 100, pointer-to-data, ...)

这将100字节的数据发送到VBO中,该指针以指针指向的地址处的数据开始绑定。然后指定在渲染发生时需要将哪些数据发送到着色器中的哪些输入,我们使用:

glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, GL_FLOAT, ..., 6, (void*)5)

这从VBO中数据开始的5个字节开始,取3个浮点作为顶点值,然后步骤6个字节到达下一个数据*。如果您有VAO绑定,我接受它,然后VAO存储有关如何访问要发送到属性0的数据的信息,并且数据存储在图形存储器中的某处。

据我所知,一旦调用了glVertexAttribPointer,你就可以绑定一个新的VBO并为其他属性启用和设置顶点属性指针,属性1,2等。

(这是我最不确定的部分) 但是,如果要渲染第二个模型,则为属性1调用glVertexAttribPointer将覆盖当前设置。为了绘制第二个模型,您需要:

  1. 绘制第一个模型,然后设置属性指针OR
  2. 通过在进行调用之前绑定属性调用,将属性调用存储在VAO中,然后在每次绘制调用之前重新绑定相应的VAO。
  3. 我理解第二个选项更可取,第一个选项有点像将所有内容绑定到默认VAO并一直更改属性指针。

    这或多或少是正确的吗?

    *编辑:

    来自derhass的评论,在glVertexAttribPointer(,size,type,stride)中,如果stride = 0,那么第i个元素将位于offset + i * size * sizeof(type)位置,但如果stride是其他任何内容,那么第i个元素在offset + i * stride

0 个答案:

没有答案