VBO的大小


一个VBO应该多大?

你可以创建一个很小的VBO,但最佳方案是把很多对象放到一个VBO里面,这样的话可以减少调用gl函数的数量,比如glBindBuffer、glVertexPointer等。

你也可以创建一个很大的VBO,但要注意不要超过显存的大小,否则显卡驱动会分配空间失败,返回GL_OUT_OF_MEMORY错误。

1MB到4MB的VBO大小是Nvidia显卡的最佳大小区间。这种大小可以让驱动更方便的进行存储管理,其它显卡也基本适用,比如ATI/AMD、Intel、SiS。

格式化VBO里的数据


尽量少的去做顶点状态的切换

当要渲染很多不同的网格数据时,尝试将具有相同顶点属性的网格放置到同一个VBO里面。也就是说,尽量少的去调用glVertexAttribPointer(或glVertexAttribFormat)函数。

顶点(vertex)、法向(normals)、纹理坐标(texcoords)


是否应该为顶点的每种属性都创建一个VBO?这样会有性能损失吗?

如果你要显示的对象都是静态的,那么把它们合并到一个或几个VBO里,越少性能越好。

如果顶点有动态属性,那么把需要不断改变的属性放到另外单独的VBO里会更合适,方便更新。

比如,如果你要模拟水流,每个顶点的位置几乎时刻在发生变换,但是顶点的颜色却保持不变。

//Binding the vertex
glBindBuffer(GL_ARRAY_BUFFER, vertexVBOID);
glVertexPointer(3, GL_FLOAT, sizeof(float)*3, NULL); //Vertex start position address //Bind normal and texcoord
glBindBuffer(GL_ARRAY_BUFFER, otherVBOID);
glNormalPointer(GL_FLOAT, sizeof(float)*6, NULL); //Normal start position address
glTexCoordPointer(2, GL_FLOAT, sizeof(float)*6, sizeof(float*3); //Texcoord start position address

  

http://www.opengl.org/wiki/Vertex_Specification_Best_Practices

05-11 13:56