Nea*_*uis 5 c++ opengl asynchronous
为了对绘制的内容执行查询,我想渲染几个(可能是数千个)场景.我glGetQueryObjectiv()
遇到的问题是调用是昂贵的,所以我想找到一种方法来提前渲染几个场景,同时我等待查询的结果可用.
我已经阅读了一些关于帧缓冲对象和像素缓冲对象的内容,但主要是在使用保存到文件的上下文中glReadPixels()
,我无法找到在异步查询中使用这些对象中的任何一个的示例.是否有任何理由说明执行的设置与此示例中的glGetQueryObjectiv()
不同(例如,我应该使用FBO还是PBO)?glReadPixels()
注意: 这不适用于图形应用程序.我感兴趣的只是GL_SAMPLES_PASSED查询的结果(即绘制了多少像素?).
具体应用是估计当其他表面投射阴影时阳光照射到表面的程度.如果您有兴趣,可以在这里阅读.
帧缓冲区对象和(像素)缓冲区对象都不是在(异步)查询中使用的正确对象类;GL 有一个完全独立的对象类,称为查询对象。您可以将某些查询的结果输入到缓冲区对象中,但这只是它们之间的关系。
基本上,异步查询的想法是,将查询放入图形管道中,并在尝试读回它之前等待一些时间。这使得 GPU 有时间首先实际完成查询开始和结束之间的所有命令。另一种方法是同步查询,这意味着您的调用线程停止执行任何有用的操作,并等待GPU 完成完成查询所需的所有操作。
实现不强制同步的查询的最简单方法是像通常那样开始和完成查询,但不是立即读取结果,而是在应用程序的主循环中定期检查GL_QUERY_RESULT_AVAILABLE
查询对象的状态。当这给您时GL_TRUE
,这意味着您可以从查询对象读取结果,而无需中断渲染管道。如果您确实尝试在查询对象处于此状态之前从查询对象获取结果,则将强制执行同步查询。
归档时间: |
|
查看次数: |
283 次 |
最近记录: |