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