首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能用一个VBO使用多个目标吗?

你能用一个VBO使用多个目标吗?
EN

Stack Overflow用户
提问于 2012-01-01 03:18:48
回答 1查看 5.1K关注 0票数 6

样本代码:

代码语言:javascript
复制
1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

因此,我们生成一个通用的VBO句柄,然后使用"GL_ARRAY_BUFFER“绑定它。绑定似乎有两个目的:

我们必须绑定缓冲区,然后才能通过glBufferData

  • We将数据复制到GPU必须绑定缓冲区,然后才能通过glVertexAttribPointer

向其添加属性

我认为这是你唯一需要绑定VBO的2次。我的问题是,在第2行和第3行中,有目标(GL_ARRAY_BUFFER、GL_ELEMENT_ARRAY_BUFFER、GL_PIXEL_PACK_BUFFER或GL_PIXEL_UNPACK_BUFFER)不同的场景吗?或者我们希望将它重新绑定到第4行之前的另一个目标上?

我们能否将多个缓冲区目标绑定到单个VBO?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-01 03:32:55

不将目标绑定到缓冲区对象。目标是可以绑定到OpenGL上下文中的位置(比如缓冲区对象)。因此,您可以将缓冲区对象绑定到目标,而不是相反。

buffer object (没有VBO这样的东西。)只是一个未格式化的、由OpenGL驱动程序拥有的线性内存数组。通过将缓冲区绑定到GL_ARRAY_BUFFER并调用gl*Pointer函数之一,可以将其用作顶点数组数据的源。这些函数仅适用于当前绑定到GL_ARRAY_BUFFER的缓冲区。通过将索引数据绑定到GL_ELEMENT_ARRAY_BUFFER并调用glDrawElements函数之一,可以将它们用作索引数据的源。

用于修改缓冲区对象内容(glBufferDataglMapBufferglBufferSubData等)的函数都专门为它们的操作设置了一个目标。因此,glBufferData(GL_ARRAY_BUFFER, ...)对当前绑定到GL_ARRAY_BUFFER的任何缓冲区都做了相应的工作。

因此,有两种影响缓冲区对象的函数:修改其内容的函数和在操作中使用它们的函数。后者是特定于源的;glVertexAttribPointer总是使用当前绑定到GL_ARRAY_BUFFER的缓冲区。你不能让它使用不同的目标。类似地,glReadPixels总是使用绑定到GL_PIXEL_PACK_BUFFER的缓冲区。以此类推。如果函数使用缓冲区对象填充,但不接受目标作为参数,那么它的文档将告诉您它从哪个目标寻找缓冲区。

注意:顶点数组有点奇怪。顶点属性与缓冲区对象之间的关联是通过调用glVertexAttribPointer来实现的。此函数所做的是使用当前绑定到GL_ARRAY_BUFFER的缓冲区对象为该属性设置适当的数据。所谓“当前绑定”,是指调用此函数时的绑定。因此,在调用此函数之后,您可以立即调用glBindBuffer(GL_ARRAY_BUFFER, 0),它将不会改变在您进行呈现时发生的事情。它会渲染得很好。

通过这种方式,您可以对不同的属性使用不同的缓冲区对象。信息将被保留,直到您用针对该特定属性的另一个glVertexAttribPointer调用来更改它。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8691663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档