繁体   English   中英

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();
}

编辑:

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

您要执行的操作称为遮挡剔除。 简单的算法在CPU上效率很低,仅当前景中有大对象而背景中有小对象时才应使用它们。

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

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

不管您执行的最简单的测试是什么,都要检查盒子是否相对于您所看的方向直接位于相机后面/垂直于相机,以及是否与相机相距足够的距离(边界半径)以不与相机相交。

现代的图形驱动程序会在某种程度上自动优化它所做的/不做的事情,因此您可以依靠它来有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM