我能够让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.
我添加的任何新网格都会覆盖旧网格。将我的所有网格放入同一个缓冲区听起来效率不高。 我怎样才能让多个网格共存?
答案 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。
我希望它有所帮助。