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

时间:2015-03-23 19:38:11

标签: c++ opengl

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

从顶部:

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

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

现在,想象一下,我想要绘制100万个方格,当然有人会落后于其他方格。什么会更快,为所有人做最后提到的过程,或者我可以做一些数学并丢弃我不需要绘制的那些。例如:

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

编辑:

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

2 个答案:

答案 0 :(得分:0)

您想要做的是遮挡剔除。简单的算法在CPU上效率非常低,只有在前景中有大对象和后台有小对象时才能使用它们。

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

答案 1 :(得分:0)

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

无论你做的最简单的测试是检查盒子是否相对于你正在寻找的方向直接位于相机后面/垂直方向,以及它是否离相机足够远(边界半径)而不相交

现代图形驱动程序会自动优化它在某种程度上所做的/不能绘制的内容,因此你可以依靠它来帮助一点。