我的游戏从VBO中绘制了一系列立方体,每次只需转换为立方体的位置:
...
SetCameraMatrix();
SetFrustum();
//start vbo rendering
glEnableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 1);
glVertexPointer(3, GL_FLOAT, 0, 0);
glColor3f(1,0.5,0);
for(int i = 0; i < collids.size(); ++i)
{
glColor3f(collids[i]->Color.x,collids[i]->Color.y,collids[i]->Color.z);
collids[i]->render();
}
//end vbo rendering
glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays
glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
...
render()就是这样:
void CBox::render()
{
glPushMatrix();
glTranslatef(center.x,center.y,center.z);
glDrawArrays(GL_QUADS, 0, 24);
glPopMatrix();
}
有没有办法优化这个?既然我总是画同样的东西,我该怎么做才能减少cpu密集度呢?感谢
答案 0 :(得分:0)
有许多可能的优化。我认为我应该采用的方法是避免每次推/弹矩阵,这可能非常耗时。既然你只翻译, 您可以跟踪上次翻译,并按相对金额进行调整。在伪代码中:
glPushMatrix()
Point3D offset(0,0,0)
for box in collids:
glTranslatef(box.x + offset.x, box.y + offset.y, box.z + offset.z)
draw_cube()
offset -= (box + offset)
glPopMatrix()
一个警告:虽然OpenGL内部仅使用32位浮点数(在大多数实现中),但最好使用双精度浮点来存储偏移量,以减少舍入误差的累积。
(编辑以修复偏移的计算。)
答案 1 :(得分:0)
您可以在一个VBO中烘焙所有立方体并仅绘制这个立方体(但几何体必须完全是静态的)
您可以使用实例化
但是如此小的几何形状,你可以做的更多。
答案 2 :(得分:0)
如果你有很多立方体,你的大问题就是绘制调用的次数。图形卡以惊人的速度在三角形中流动,瓶颈通常是驾驶员进行通信。一般来说,你拨打的电话越少,就越快。
考虑到这一点,即使您的几何图形是动态的,将所有内容放入一个数组中也会好得多。更新已移动的任何多维数据集的几何(如有必要,请更新所有多维数据集)并一次性全部发送。使用VBO更新几何体可能有点麻烦,我还没有尝试过,但即使您只使用旧时尚顶点数组,它也应该比您当前的设置更快。