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 ->渲染框A
测试框B ->渲染框B
测试框C ->渲染框C
我不确定我是否正确理解了您,但这不是首先呈现所有框(而不是写入深度缓冲区)然后使用查询结果检查每个对象的幼稚实现的缺点之一吗?但是您建议立即使用单个框的查询结果是一种更幼稚的方法,因为这会使管道停滞不前。如果您进一步阅读本章(假设您参考了第29章),它们提供了一种简单的技术来克服两种朴素方法的缺点(即,只是正常呈现所有内容并使用前一帧的查询结果)。
我认为(链接GPU gems文章会很好……)您对扩展中描述的一些异步查询感到困惑:
http://developer.download.nvidia.com/opengl/specs/GL_NV_conditional_render.txt如果我没记错的话,还有其他扩展可以在不阻塞的情况下检查结果的可用性。
正如Christian Rau指出的那样,只做"查询,等待结果,根据结果做事情"可能会停滞不前,可能不会因此而获得任何收益,这取决于"做事情"中有多少工作。事实上,执行查询,等待它往返只是为了保存一个draw调用,很可能根本没有帮助。