为什么在调用glDrawArrays之前不需要绑定顶点缓冲区对象?

准备

我有点困惑为什么它仍然呈现。我认为您需要绑定一个顶点缓冲区对象,以便glDrawArrays知道要使用哪个顶点缓冲区。

这是我的初始化代码。

// Create and bind vertex array to store vertex attribute states.

glGenVertexArraysOES(NUM_VERTEX_ARRAYS, &m_vertexArray);
glBindVertexArrayOES(m_vertexArray);

// Create and bind vertex buffer to store vertex data.

glGenBuffers(NUM_VERTEX_BUFFERS, &m_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 36, &m_vertices[0], GL_STATIC_DRAW);

glEnableVertexAttribArray(VertexAttribPosition);
glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(VertexAttribNormal);
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindVertexArrayOES(0);

这是我的渲染代码。我很困惑为什么将0绑定到GL_ARRAY_BUFFER时glDrawArrays仍然可以工作。

glBindVertexArrayOES(m_vertexArray);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glDrawArrays(GL_TRIANGLES, 0, 36);

glBindVertexArrayOES(0);
数据狼

我认为您需要绑定一个顶点缓冲区对象,以便glDrawArrays知道要使用哪个顶点缓冲区。

glDraw…调用时,它将使用对gl…Pointer(或等效)调用的最新调用寻址的数据,并由激活glEnableVertexAttribArray当你做

glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);

glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

(活动的)顶点属性和缓冲区对象之间形成了关联。换句话说:glBindBuffer仅与glBuffer… gl…Pointer通话相关。因此,您可以在调用gl…Pointer函数后安全地绑定其他缓冲区对象实际上,以下内容也可以工作:

glBindBuffer(GL_ARRAY_BUFFER, m_vertexPositionBuffer);    
glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));

glBindBuffer(GL_ARRAY_BUFFER, m_vertexNormalBuffer);    
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));

即,每个顶点属性数组使用不同的缓冲区对象。

更新资料

顶点数组对象通过使其能够绑定对象本身中的bind→pointer / offset关联成为可能,从而为此添加了一层糖衣。因此,切换到新的(一组)缓冲区对象将减少工作量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在调用glDrawArrays之前不需要绑定顶点缓冲区对象?

来自分类Dev

为什么struct缓冲区不需要初始化

来自分类Dev

为什么从颜色缓冲区而不是位置缓冲区获取顶点位置?

来自分类Dev

OpenGL复制顶点缓冲区对象

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

OpenGL绘制顶点缓冲区对象

来自分类Dev

为什么在LZW压缩中压缩缓冲区需要大于输入缓冲区?

来自分类Dev

将多个缓冲区对象与单个顶点数组对象绑定不起作用

来自分类Dev

为什么调用不需要类的进口的方法?

来自分类Dev

glDrawArrays()自动绘制一个不需要的对象

来自分类Dev

为什么可变对象不需要双指针?

来自分类Dev

为什么 Vue 组件对象不需要值?

来自分类Dev

更改顶点缓冲区对象中的顶点颜色

来自分类Dev

顶点缓冲区绑定索引和统一缓冲区绑定点?

来自分类Dev

为什么XNA Write / ReadObject <Model>()不保留顶点/索引缓冲区数据?

来自分类Dev

顶点缓冲区在较早的顶点之前渲染较新的顶点

来自分类Dev

为什么 gl.drawElements 需要重新绑定而 gl.drawArrays 不需要?

来自分类Dev

合并顶点缓冲区

来自分类Dev

为什么putchar不需要标题?

来自分类Dev

使用顶点缓冲区对象的最低OpenGL ES版本

来自分类Dev

JOGL中具有顶点缓冲区对象的问题

来自分类Dev

动态打包OpenGL顶点缓冲区对象的数据

来自分类Dev

在设置绑定接口之前,系统本地管理NIC环形缓冲区大小的方法是什么?

来自分类Dev

Postgres:为什么某些函数调用需要()而其他函数不需要?

来自分类Dev

为什么Wordpress在使用功能之前不需要包含任何内容

来自分类Dev

为什么Wordpress在使用功能之前不需要包含任何内容

来自分类Dev

为什么BackgroundWorker在委托上调用BeginInvoke时不需要调用EndInvoke?

来自分类Dev

为什么对象不需要时Java中的数组需要具有预定义的长度?

Related 相关文章

  1. 1

    为什么在调用glDrawArrays之前不需要绑定顶点缓冲区对象?

  2. 2

    为什么struct缓冲区不需要初始化

  3. 3

    为什么从颜色缓冲区而不是位置缓冲区获取顶点位置?

  4. 4

    OpenGL复制顶点缓冲区对象

  5. 5

    何时清除顶点缓冲区对象

  6. 6

    何时清除顶点缓冲区对象

  7. 7

    OpenGL绘制顶点缓冲区对象

  8. 8

    为什么在LZW压缩中压缩缓冲区需要大于输入缓冲区?

  9. 9

    将多个缓冲区对象与单个顶点数组对象绑定不起作用

  10. 10

    为什么调用不需要类的进口的方法?

  11. 11

    glDrawArrays()自动绘制一个不需要的对象

  12. 12

    为什么可变对象不需要双指针?

  13. 13

    为什么 Vue 组件对象不需要值?

  14. 14

    更改顶点缓冲区对象中的顶点颜色

  15. 15

    顶点缓冲区绑定索引和统一缓冲区绑定点?

  16. 16

    为什么XNA Write / ReadObject <Model>()不保留顶点/索引缓冲区数据?

  17. 17

    顶点缓冲区在较早的顶点之前渲染较新的顶点

  18. 18

    为什么 gl.drawElements 需要重新绑定而 gl.drawArrays 不需要?

  19. 19

    合并顶点缓冲区

  20. 20

    为什么putchar不需要标题?

  21. 21

    使用顶点缓冲区对象的最低OpenGL ES版本

  22. 22

    JOGL中具有顶点缓冲区对象的问题

  23. 23

    动态打包OpenGL顶点缓冲区对象的数据

  24. 24

    在设置绑定接口之前,系统本地管理NIC环形缓冲区大小的方法是什么?

  25. 25

    Postgres:为什么某些函数调用需要()而其他函数不需要?

  26. 26

    为什么Wordpress在使用功能之前不需要包含任何内容

  27. 27

    为什么Wordpress在使用功能之前不需要包含任何内容

  28. 28

    为什么BackgroundWorker在委托上调用BeginInvoke时不需要调用EndInvoke?

  29. 29

    为什么对象不需要时Java中的数组需要具有预定义的长度?

热门标签

归档