优化此OpenGL渲染算法

时间:2010-09-10 17:04:54

标签: c++ opengl

我的游戏从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密集度呢?感谢

3 个答案:

答案 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更新几何体可能有点麻烦,我还没有尝试过,但即使您只使用旧时尚顶点数组,它也应该比您当前的设置更快。