想象一下,我有我的相机,在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个四边形的方框,所以只画它们可能会更快,而不是花时间决定是否应该画它们。
不管怎样,你能做的最简单的测试就是检查盒子是否在相机的正后方/垂直于你所看的方向,以及它是否离相机足够远(边界半径),不会与相机相交。
现代图形驱动程序会在一定程度上自动优化它所画/不画的内容,所以你可以依靠它来提供一些帮助。