您可以在一个 VBO 中使用多个目标吗?

问题描述 投票:0回答:2

示例代码:

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”绑定它。绑定它似乎有两个目的:

  1. 我们必须先绑定缓冲区,然后才能通过
    glBufferData
  2. 将数据复制到 GPU
  3. 我们必须先绑定缓冲区,然后才能通过
    glVertexAttribPointer
  4. 添加属性

我认为这是您唯一需要绑定 VBO 的 2 次。我的问题是,是否有任何情况下第 2 行和第 3 行的目标(GL_ARRAY_BUFFER、GL_ELEMENT_ARRAY_BUFFER、GL_PIXEL_PACK_BUFFER 或 GL_PIXEL_UNPACK_BUFFER)会有所不同?或者我们想在第 4 行之前将其重新绑定到不同的目标?

我们可以将多个缓冲区目标绑定到单个 VBO 吗?

opengl vbo buffer-objects
2个回答
11
投票

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

buffer object

(没有 VBO 这样的东西。只有缓冲区对象)只是 OpenGL 驱动程序拥有的未格式化的线性内存数组。您可以通过将缓冲区绑定到 GL_ARRAY_BUFFER 并调用

gl*Pointer
函数之一,将其用作顶点数组数据的源。这些函数
适用于当前绑定到GL_ARRAY_BUFFER的缓冲区。您可以将它们绑定到
GL_ELEMENT_ARRAY_BUFFER
并调用
glDrawElements
函数之一,将它们用作索引数据的源。

用于修改缓冲区对象内容的函数(

glBufferData

glMapBuffer
glBufferSubData
等)都专门采用一个目标来进行操作。因此
glBufferData(GL_ARRAY_BUFFER, ...)
对当前绑定到
GL_ARRAY_BUFFER
的任何缓冲区执行其操作。

因此,有两种影响缓冲区对象的函数:修改其内容的函数,以及在操作中

使用

它们的函数。后者特定于来源; glVertexAttribPointer

always
使用当前绑定到 GL_ARRAY_BUFFER 的缓冲区。你不能让它使用不同的目标。同样,
glReadPixels
始终使用绑定到
GL_PIXEL_PACK_BUFFER
的缓冲区。等等。如果一个函数使用缓冲区对象进行填充,但不将目标作为参数,那么它的文档将告诉您它从哪个目标查找缓冲区。

注意:

顶点数组有点奇怪。顶点属性和缓冲区对象之间的关联是通过调用 glVertexAttribPointer 建立的。该函数的作用是使用当前绑定到 GL_ARRAY_BUFFER 的缓冲区对象为该属性设置适当的数据。我所说的“当前绑定”是指在调用该函数时绑定

。因此,在调用此函数后,您可以立即调用 
glBindBuffer(GL_ARRAY_BUFFER, 0),它不会改变渲染时发生的情况。它会渲染得很好。
这样就可以针对不同的属性使用不同的缓冲对象。该信息将被保留,直到您通过另一个 
glVertexAttribPointer 调用该特定属性来更改它。

是的,但是...


0
投票
Khronos 组

© www.soinside.com 2019 - 2024. All rights reserved.