Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 关于VAOs和glVertexAttribPointer使用的澄清_Opengl - Fatal编程技术网

Opengl 关于VAOs和glVertexAttribPointer使用的澄清

Opengl 关于VAOs和glVertexAttribPointer使用的澄清,opengl,Opengl,我想我知道如何使用顶点数组对象(VAO),数据是如何存储的,OpenGL中的指针是如何工作的,但有几件事我很模糊。我希望有人能证实我的理解并纠正任何错误 我设法找到了这篇文章,这是我获得大部分信息的地方,但仍然有点不确定顶点缓冲区对象(VBO)需要绑定到数组缓冲区绑定点多长时间,以及何时需要绑定和反弹VAO。我也从未使用过旧的OpenGL,所以第二个链接中的很多引用对我来说毫无意义。这就是我目前对事物的理解: 第一步是将数据放入VBO中: glGenBuffers glBindBuffer(GL

我想我知道如何使用顶点数组对象(VAO),数据是如何存储的,OpenGL中的指针是如何工作的,但有几件事我很模糊。我希望有人能证实我的理解并纠正任何错误

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

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

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将覆盖当前设置。要绘制第二个模型,您需要:

  • 绘制第一个模型,然后设置属性指针,或
  • 通过在进行调用之前绑定属性调用,然后在每次绘制调用之前重新绑定相应的VAO,将属性调用存储在VAO中
  • 我知道第二个选项更可取,第一个选项有点像是将所有内容绑定到默认VAO,并随时更改属性指针

    这或多或少是正确的吗

    *编辑:


    根据德哈斯的评论,在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
    处获取属性数据。将属性设置为3
    GL_FLOAT
    s和6字节的跨距将意味着连续顶点的属性数据将重叠(甚至在两个浮点之间),这不是人们通常想要的。