gpt4 book ai didi

opengl - 您可以使用单个 VBO 使用多个目标吗?

转载 作者:行者123 更新时间:2023-12-04 13:53:41 30 4
gpt4 key购买 nike

示例代码:

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”绑定(bind)它。绑定(bind)它似乎有两个目的:
  • 我们必须先绑定(bind)缓冲区,然后才能通过 glBufferData 将数据复制到 GPU。
  • 我们必须先绑定(bind)缓冲区,然后才能通过 glVertexAttribPointer 向它添加属性。

  • 而且我认为这是您需要绑定(bind) VBO 的唯一 2 次。我的问题是,是否存在目标(GL_ARRAY_BUFFER、GL_ELEMENT_ARRAY_BUFFER、GL_PIXEL_PACK_BUFFER 或 GL_PIXEL_UNPACK_BUFFER)在第 2 行和第 3 行不同的情况?或者我们想在第 4 行之前将它重新绑定(bind)到不同的目标?

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

    最佳答案

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

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

    用于修改缓冲区对象内容的函数(glBufferDataglMapBufferglBufferSubData 等)都专门为其操作指定了一个目标。所以glBufferData(GL_ARRAY_BUFFER, ...)对当前绑定(bind)到 GL_ARRAY_BUFFER 的任何缓冲区进行处理.

    所以有两种影响缓冲区对象的函数:修改其内容的函数,以及在操作中使用它们的函数。后者是特定于来源的; glVertexAttribPointer总是使用当前绑定(bind)到 GL_ARRAY_BUFFER 的缓冲区.你不能让它使用不同的目标。同样,glReadPixels总是使用绑定(bind)到 GL_PIXEL_PACK_BUFFER 的缓冲区.等等。如果一个函数处理缓冲区对象但没有将目标作为参数,那么它的文档会告诉你它从哪个目标中寻找它的缓冲区。

    注:顶点数组有点奇怪。通过调用 glVertexAttribPointer 来建立顶点属性和缓冲区对象之间的关联。 .该函数所做的是使用当前绑定(bind)到 GL_ARRAY_BUFFER 的缓冲区对象为该属性设置适当的数据。 “当前绑定(bind)”是指在调用此函数时绑定(bind)。所以在调用这个函数后,可以立即调用glBindBuffer(GL_ARRAY_BUFFER, 0) ,并且它不会改变你去渲染时发生的事情。它会渲染得很好。

    这样,您可以为不同的属性使用不同的缓冲区对象。该信息将被保留,直到您用另一个 glVertexAttribPointer 更改它为止调用该特定属性。

    关于opengl - 您可以使用单个 VBO 使用多个目标吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8691663/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com