如何执行异步屏幕外查询?

时间:2014-01-13 18:12:30

标签: c++ opengl asynchronous

我想渲染几个(可能是数千个)场景,以便对绘制的内容执行查询。我遇到的问题是对glGetQueryObjectiv()的调用很昂贵,所以我想在等待查询结果可用时提前渲染几个场景的方法。

我已经阅读了一些关于帧缓冲对象和像素缓冲区对象的内容,但主要是在使用glReadPixels()保存到文件的上下文中,我无法找到使用这些对象中的任何一个的示例在异步查询中。执行glGetQueryObjectiv()的设置与this example中的glReadPixels()设置有何不同(例如,我应该使用FBO还是PBO)?

注意: 这不适用于图形应用程序。我感兴趣的只是GL_SAMPLES_PASSED查询的结果(即绘制了多少像素?)。

具体应用是估计当其他表面投射阴影时太阳光照射到表面的程度。如果您有兴趣,可以阅读here

1 个答案:

答案 0 :(得分:2)

帧缓冲对象(像素)缓冲区对象都不是(异步)查询中使用的正确对象类; GL有一个完全独立的对象类Query Objects。您可以将某些查询的结果提供给缓冲区对象,但这与他们的关系有关。

基本上,异步查询的想法是将查询放入图形管道中,并在尝试读取之前花一些时间。这使GPU有时间在查询的开头和结尾之间实际完成所有命令。替代方案是同步查询,这意味着您的调用线程停止执行任何有用的操作, 等待 ,以便GPU完成查询所需的所有操作。

实现不强制同步的查询的最简单方法是按照通常的方式启动和完成查询,而不是立即读取结果,在应用程序的主循环中定期检查{{1}的状态为您的查询对象。当它为您提供GL_QUERY_RESULT_AVAILABLE时,这意味着您可以在不中断渲染管道的情况下从查询对象中读取结果。如果您确实尝试从查询对象处于此状态之前获取结果,那么您将强制执行同步查询。