首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lwjgl中的多顶点缓冲区对象(VBO)

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

Stack Overflow用户
提问于 2012-01-08 15:13:28
回答 2查看 1.4K关注 0票数 0

我能够让VBO在单个网格上工作。首先,我设置opengl:

代码语言:javascript
复制
//....
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);

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

代码语言:javascript
复制
vertBuffer = GL15.glGenBuffers( BufferUtils.createIntBuffer(1)); 
//same idea for faceBuffer

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

代码语言:javascript
复制
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vertBuffer)
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, myVertPositions,GL15.GL_STATIC_DRAW);
//same idea for faces.

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

最后是渲染:

代码语言:javascript
复制
//...
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.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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说,从存储苹果的内存中获取几何数据……:)),如果你想要这个梨,你就指向那个,然后依次类推。

我希望它能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2012-01-08 22:54:39

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8775995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档