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 在某种程度上无法绘制的内容,因此您可以依靠它来提供一些帮助。
假设我有我的相机,以及 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 在某种程度上无法绘制的内容,因此您可以依靠它来提供一些帮助。