OPENGL ARB_occlusion_query遮挡剔除

时间:2011-04-19 12:56:15

标签: opengl culling occlusion occlusion-culling

for (int i = 0; i < Number_Of_queries; i++)
{
    glBeginQueryARB(GL_SAMPLES_PASSED_ARB, queries[i]);

    Box[i]

    glEndQueryARB(GL_SAMPLES_PASSED_ARB);
}

我很好奇GPU GEMS 1中建议的用于遮挡剔除的方法,其中执行了一定数量的查询。使用所描述的方法,您无法相互测试各个盒子,所以您应该执行以下操作吗?

测试盒A - &gt;渲染方框A

测试盒B - &gt;渲染方框B

测试盒C - &gt;渲染方框C

依旧......

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解正确,但这不是首先渲染所有框(并且不写入深度缓冲区)然后使用查询结果检查每个对象的天真实现的缺点之一?但是你建议立即使用单个框的查询结果是一个更天真的方法,因为这会拖延管道。如果您进一步阅读本章(假设您参考第29章),它们提供了一种简单的技术来克服两种天真方法的缺点(即,只是正常渲染所有内容并使用前一帧的查询结果)。

答案 1 :(得分:0)

我认为(链接GPU宝石文章会很好......)你对某些异步查询感到困惑,如下所示:

http://developer.download.nvidia.com/opengl/specs/GL_NV_conditional_render.txt

如果我没记错的话还有其他扩展来检查结果的可用性而不会阻塞。

正如Christian Rau指出的那样只是查询,等待结果,根据结果做出事情&#34;可能因为这个原因而失速并且可能没有任何收获,这取决于做了多少工作&#34;做东西&#34;。事实上,进行查询,等待它往返只是为了保存一个绘制调用,这很可能根本没有帮助。