5
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

等等...

4

2 回答 2

2

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

于 2011-08-14T16:38:32.633 回答
0

我认为(链接 GPU gems 文章会很好......)您对一些异步查询感到困惑,如扩展中所述:

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

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

正如 Christian Rau 指出的那样,仅仅“查询、等待结果、根据结果做事”可能会停滞不前,因此可能没有任何收益,这取决于“做事”中的工作量。事实上,进行查询,等待它往返只是为了保存一个绘图调用很可能根本没有帮助。

于 2012-02-04T05:31:49.743 回答