Vulkan

GPU遮挡查询入门介绍

 GPU遮挡查询的方法是渲染一个物体时,向GPU发出遮挡查询命令,再渲染物体且不写颜色缓存和深度缓存,然后等待查询结果返回,如果查询结果为渲染的像素数量大于0则表示该物体应该被渲染,否则不被渲染。

GPU遮挡查询的简单方法:

1.glGenQueriesARB: 创建查询

2.glBeginQueryARB: 发送查询命令

3.glGetQueryivARB: 查看查询命令是否返回

4.glGetQueryObjectuivARB: 查看查询结果

5.glEndQueryARB:  结束查询

 

  上面是最简单的GPU查询方法,不难发现,我们为了查询遮挡,需要额外多一次对物体的渲染,并且我们需要循环等待GPU的查询结果返回,这是相当的浪费GPU和CPU的。所以就有改进的查询方法,改进方法的思想是,为遮挡查询而绘制的物体最好是简单的包围盒子这样可以节省渲染时间,遮挡查询指针可以保存到一个队列里面,不再等待查询结果返回,而是在接下来的帧里取查询结果,当前物体是否渲染,由上帧的查询结果实现。

GPU遮挡查询的改进方法:

1.glGenQueriesARB: 创建查询,并保存到队列

2.glGetQueryivARB:查看查询命令是否返回

3.如果查询返回,则根据查询结果渲染物体,否则根据上帧物体是否被遮挡而决定是否渲染物体

4.glBeginQueryARB: 如果当前物体的查询结果返回则再次发送查询命令

5.遮挡查询渲染

6.glEndQueryARB:   结束当帧查询

7.转到2继续下个物体,知道所以物体遍历结束。

 

  从上面的改进后的查询方法可以看出,这样牺牲了真实性,由于,查询的延后处理,可能导致我在这一帧本该看到的物体,没出现在屏幕上,也有可能,我本看不到的物体却不在屏幕上。然而经测试单机游戏当FPS在25帧以上,基本感觉不到太大的瑕疵。所以这种方法还是有意义的。

  当然还有很多先进的方法可以解决上面的问题,比如有一种方法叫做Coherent Hierarchical Culling,使用KD树等结构来管理场景,这种方法可以很好的解决上面的问题,这个方法在GPU Gems2中有介绍

posted on 2012-04-14 21:42  Vulkan  阅读(400)  评论(0编辑  收藏  举报

导航