如何解决OPENGL ARB_occlusion_query遮挡剔除
|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宝石文章本来很好...),您对诸如此类扩展中所述的某种异步查询感到困惑:
http://developer.download.nvidia.com/opengl/specs/GL_NV_conditional_render.txt
如果我没记错的话,还有其他扩展可以检查结果的可用性,而不会阻塞。
正如克里斯蒂安·劳(Christian Rau)指出的那样,仅执行“查询,等待结果,基于结果进行操作”可能会停顿,因此可能不会有任何收益,具体取决于“执行任务”中的工作量。实际上,进行查询,等待往返以保存一个绘图调用几乎完全没有帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。