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