我想我了解如何使用顶点数组对象(VAO)以及数据的存储方式以及OpenGL中的指针如何工作,但有一些事情我会模糊不清。我希望有人可以证实我的理解并纠正任何错误。
我设法找到this和this文章,这是我获取大部分信息的地方,但仍然有点不确定顶点缓冲区对象(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将覆盖当前设置。为了绘制第二个模型,您需要:
我理解第二个选项更可取,第一个选项有点像将所有内容绑定到默认VAO并一直更改属性指针。
这或多或少是正确的吗?
*编辑:
来自derhass的评论,在glVertexAttribPointer(,size,type,stride)中,如果stride = 0,那么第i个元素将位于offset + i * size * sizeof(type)
位置,但如果stride是其他任何内容,那么第i个元素在offset + i * stride
?