繁体   English   中英

优化此OpenGL渲染算法

[英]Optimizing this OpenGL rendering algorithm

我的游戏从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的使用强度? 谢谢

有许多可能的优化。 我认为我会立即采用的一种方法是避免每次都推/弹出矩阵,这可能非常耗时。 由于您只是翻译,因此您可以跟踪上一次翻译,并且只需相对移动即可。 用伪代码:

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位浮点数(在大多数实现中),但最好使用双精度浮点数存储偏移量,以减少舍入误差的累积。

(编辑以修正偏移量的计算。)

您可以在单个VBO中烘烤所有多维数据集,并且仅绘制一个(但是几何图形必须确实是完全静态的)

您可以使用实例化

但是只有这么小的几何形状,您无能为力。

如果您有很多立方体,则最大的问题将是绘制调用的数量。 图形卡以惊人的速度穿过三角形,瓶颈通常是驱动程序进行通信的驱动程序。 通常,您拨打的电话越少,通话速度就会越快。

考虑到这一点,即使您的几何图形是动态的,也最好将所有内容都放入一个数组中。 更新所有已移动的多维数据集的几何图形(如有必要,将其全部更新),然后一次性将其全部发送出去。 使用VBO更新几何可能涉及一些工作,但我实际上并未尝试过,但是即使您只是使用旧的时尚顶点数组,它也应该比当前设置快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM