lwjgl中的多个顶点缓冲区对象(VBO)

时间:2012-01-08 07:13:28

标签: opengl vbo lwjgl

我能够让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.

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

2 个答案:

答案 0 :(得分:2)

  

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

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

无论如何:您可以根据需要使用尽可能多的VBO。 glGenBuffers 为您提供了一个ID,允许您识别这些缓冲区并使用 glBindBuffer 来定位它们。

答案 1 :(得分:1)

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

为了使用多个VBO,您必须将函数glGenBuffers指定的ID保留为对Mesh的引用。

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

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

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

如果你想使用苹果,你可以绑定苹果的ID(简单来说就是你说的GPU,从存储苹果的内存中获取几何数据.... :)),如果你想要梨你指出那个和oso。

我希望它有所帮助。