OpenGL,我什么时候应该画,什么时候不应该画



想象一下,我有我的相机,在3D openGL上下文中有两个正方形(使用透视),如下所示:

从顶部开始:

               /
             /    
           /      Square 1  
Camera -> +          V  Square 2
                    |     V
                    |     |
                    |

所以,我要做的是使用glBegin()glEnd()绘制,并让Z缓冲区完成它的工作。到目前为止还不错。

现在,想象一下,我想画100万个这样的正方形,当然有人会落后于其他人。更快的是,完成最后提到的所有过程,或者我可以做一些数学运算,放弃那些我不需要画的。示例:

if (should_I_Draw_It)
{
    glBegin();
    /*Draw*/
    glEnd();
}

编辑:

这是一个动态场景,可以创建、销毁、移动和/或修改对象。

您想要做的叫做遮挡剔除。简单的算法在CPU上效率很低,只有当前景中有大对象而背景中有小对象时才应该使用它们。

Nvidia在GPU Gems第29章中描述了一种有效的遮挡剔除方法。您可以尝试这样做来提高渲染的效率

对于如此多的动态对象,遮挡剔除几乎总是比绘制所有对象慢。在动态场景中,你最好的选择可能是只进行非常简单的视图frutrum剔除。问题是,由于你只画每个有6个四边形的方框,所以只画它们可能会更快,而不是花时间决定是否应该画它们。

不管怎样,你能做的最简单的测试就是检查盒子是否在相机的正后方/垂直于你所看的方向,以及它是否离相机足够远(边界半径),不会与相机相交。

现代图形驱动程序会在一定程度上自动优化它所画/不画的内容,所以你可以依靠它来提供一些帮助。

最新更新