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

OpenGL, when should I draw and when should I not

假设我有我的相机,以及 3D openGL 上下文中的两个正方形(使用透视图),如下所示:

自上而下:

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

所以,我要做的是同时使用 glBegin()glEnd() 进行绘制,然后让 Z 缓冲区完成它的工作。到目前为止一切顺利。

现在,假设我想绘制 100 万个方块,当然有人会落后于其他人。什么会更快,对所有人进行最后提到的过程,或者我可以做一些数学运算并丢弃我不需要绘制的那些。示例:

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

编辑:

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

你想做的事情叫做遮挡剔除。简单的算法在 CPU 上效率很低,只有在前景中有大物体而背景中有小物体时才应使用它们。

Nvidia 在 GPU Gems Chapter 29 中描述了一种有效的遮挡剔除方法。你可以试试这个来提高你的渲染效率

这么多动态对象的遮挡剔除几乎总是比绘制所有内容都慢。在动态场景中你最好的选择可能是只做非常简单的视图 frutrum 剔除。问题在于,由于您只绘制每个框有 6 个四边形的框,因此只绘制它们而不是花时间决定是否应该绘制它们可能仍然更快。

不管你能做的最简单的测试是检查盒子是否直接 behind/perpendicular 相对于你正在看的方向的相机,以及它是否离相机足够远(边界半径)不相交。

现代图形驱动程序会自动优化它 does/does 在某种程度上无法绘制的内容,因此您可以依靠它来提供一些帮助。