我能够让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.我添加的任何新网格都会覆盖旧网格。把我所有的网格放在同一个缓冲区听起来效率不高。我怎么才能让多个网格共存呢?
发布于 2012-01-08 16:35:27
这是一个非常简单的问题。
为了使用多个glGenBuffers,必须保留由函数VBO指定的ID作为对网格的引用。
然后,当你想要绘制特定的网格时,你需要像这样绑定它(我的引擎代码的摘录):
glBindBuffer(GL_ARRAY_BUFFER,Object_To_Draw->PATRIA_Model->MODEL_VBO_ID);
这就像你有3个网格,苹果,梨和橙子,每个都有自己的ID。
如果你想使用苹果,你需要绑定苹果的ID (简单地说,你对GPU说,从存储苹果的内存中获取几何数据……:)),如果你想要这个梨,你就指向那个,然后依次类推。
我希望它能帮上忙。
发布于 2012-01-08 22:54:39
把我所有的网格放在同一个缓冲区听起来效率不高。
实际上是:切换VBO比设置一些偏移量更昂贵。特别是对于许多小的(就顶点数量而言)对象,建议将它们放入一个VBO中。
无论如何:您可以使用任意数量的VBO。glGenBuffers为您提供了一个ID,它允许您识别这些缓冲区并使用glBindBuffer来确定它们的目标。
https://stackoverflow.com/questions/8775995
复制相似问题