Opengl 关于VAOs和glVertexAttribPointer使用的澄清
我想我知道如何使用顶点数组对象(VAO),数据是如何存储的,OpenGL中的指针是如何工作的,但有几件事我很模糊。我希望有人能证实我的理解并纠正任何错误 我设法找到了这篇文章,这是我获得大部分信息的地方,但仍然有点不确定顶点缓冲区对象(VBO)需要绑定到数组缓冲区绑定点多长时间,以及何时需要绑定和反弹VAO。我也从未使用过旧的OpenGL,所以第二个链接中的很多引用对我来说毫无意义。这就是我目前对事物的理解: 第一步是将数据放入VBO中:Opengl 关于VAOs和glVertexAttribPointer使用的澄清,opengl,Opengl,我想我知道如何使用顶点数组对象(VAO),数据是如何存储的,OpenGL中的指针是如何工作的,但有几件事我很模糊。我希望有人能证实我的理解并纠正任何错误 我设法找到了这篇文章,这是我获得大部分信息的地方,但仍然有点不确定顶点缓冲区对象(VBO)需要绑定到数组缓冲区绑定点多长时间,以及何时需要绑定和反弹VAO。我也从未使用过旧的OpenGL,所以第二个链接中的很多引用对我来说毫无意义。这就是我目前对事物的理解: 第一步是将数据放入VBO中: glGenBuffers glBindBuffer(GL
glGenBuffers
glBindBuffer(GL_ARRAY_BUFFER, ...)
glBufferData(GL_ARRAY_BUFFER, 100, pointer-to-data, ...)
这会将100字节的数据发送到VBO,VBO从指针指向的地址处的数据开始绑定。然后,要指定渲染时需要将哪些数据发送到着色器中的哪些输入,我们使用:
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, GL_FLOAT, ..., 6, (void*)5)
这从VBO中数据开始的5个字节开始,取3个浮点数作为顶点值,然后步进6个字节以获得下一个数据*。我认为如果您有一个VAO绑定,那么VAO将存储有关如何访问要发送到属性0的数据的信息,并且数据存储在图形内存中的某个位置
据我所知,一旦调用了GLVertexAttributePointer,您就可以绑定一个新的VBO,并为其他属性(属性1、2等)启用和设置顶点属性指针
(这是我最不确定的部分)
但是,如果要渲染第二个模型,则为属性1调用glVertexAttributePointer将覆盖当前设置。要绘制第二个模型,您需要:
根据德哈斯的评论,在glvertexattributepointer(,size,type,stride,)中,如果stride=0,则第i个元素将位于(type)的位置
offset+i*size*sizeof(type)
,但如果stride是其他元素,则第i个元素位于offset+i*stride
?这听起来都是正确的。有关VBO绑定如何与其他调用相关的更多详细信息,请参见此处我的答案:。有关我编写的相关答案的更无耻的推广:,。它是“glEnableVertexAttribArray”,但不是“glEnableAttrib”。:)这或多或少是正确的,除了取决于您的OpenGL配置文件,“默认VAO”的概念可能存在,也可能不存在。在没有GL\u ARB\u兼容性的opengl3.1中,或者在3.2+核心配置文件中,没有默认的VAO;如果将0绑定到GL\u VERTEX\u ARRAY\u BINDING
,则大多数顶点数组命令,如glvertexattributepointer(…)
或甚至glDrawArrays(…)
将在这些上下文中生成一个GL\u INVALID\u操作
错误,因为我不确定问题中的描述是否正确:“这从VBO中数据开始的5个字节开始,取3个浮点值作为顶点值,然后步进6个字节以到达下一个数据段。”这3个浮点值之后不会跳过6个字节。对于i
-th顶点,将在offset+i*stride
处获取属性数据。将属性设置为3GL_FLOAT
s和6字节的跨距将意味着连续顶点的属性数据将重叠(甚至在两个浮点之间),这不是人们通常想要的。