【问题标题】:Multible vertex buffer objects (VBO) in lwjgllwjgl中的多个顶点缓冲区对象(VBO)
【发布时间】:2012-01-08 07:13:28
【问题描述】:

我能够让 VBO 为单个网格工作。 首先我设置了opengl:

//....
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);

对于每个网格,我生成缓冲区(每个网格对此函数调用两次):

vertBuffer = GL15.glGenBuffers( BufferUtils.createIntBuffer(1)); 
//same idea for faceBuffer

我将网格数据放入 FloatBuffers 和 IntBuffers。 然后我必须将这些发送到opengl:

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vertBuffer)
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, myVertPositions,GL15.GL_STATIC_DRAW);
//same idea for faces.

注意:以上所有步骤只执行一次。

终于有渲染了:

//...
int stride = 0; //0 = compact arrays.
int offset = 0; //Each mesh would need a different offset?

GL11.glVertexPointer(3, GL11.GL_FLOAT, stride, offset);
GL12.glDrawRangeElements(GL11.GL_TRIANGLES, 0, numVerts, 
        numFaces*3, GL11.GL_UNSIGNED_INT, offset);
//Using the "buffer versions" of these functions throws  
//"Cannot use Buffers when Array Buffer Object is enabled"
//Whether or not glEnableClientState is called.

我添加的任何新网格都会覆盖旧网格。将我所有的网格放入同一个缓冲区听起来效率不高。 否则我怎样才能让多个网格共存?

【问题讨论】:

    标签: opengl vbo lwjgl


    【解决方案1】:

    将我所有的网格放入同一个缓冲区听起来效率不高。

    实际上是:切换 VBO 比设置一些偏移量更昂贵。特别是对于很多小的(就顶点数而言)对象,建议将它们放入一个 VBO 中。

    无论如何:您可以使用任意数量的 VBO。 glGenBuffers 为您提供一个 ID,它允许您识别这些缓冲区并使用 glBindBuffer 定位它们。

    【讨论】:

    • 但是如果我把我的整个世界都放到VBO里面,远远超过GL_MAX_ELEMENTS_VERTICES = 33000,会不会有问题?
    • @KevinKostlan:这只是一个建议,仅适用于传递给 glDrawElements 的元素索引数组的大小。而且你不必一次画出整个东西。您还可以在 VBO 中使用非零偏移并使用多个绘图调用。
    【解决方案2】:

    这是一个非常简单的问题。

    为了使用多个 VBO,您必须保留函数 glGenBuffers 分配的 ID 作为对 Mesh 的引用。

    然后,当你想绘制特定的网格时,你需要像这样绑定它(我的引擎代码的摘录):

    glBindBuffer(GL_ARRAY_BUFFER, Object_To_Draw->PATRIA_Model->MODEL_VBO_ID);

    这就像你有 3 个网格,苹果、梨和橙色,每个都有自己的 ID。

    如果你想使用苹果,你绑定苹果的ID(简单来说你对GPU说,从存储苹果的内存中获取几何数据...... :)),如果你想要梨你点那个等等。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多