遮挡查询

遮挡查询步骤
1.为每个遮挡查询对象生成一个ID。glGenQueries(GLsizei n, GLuint * ids);
glIsQueries(id);
2.glBeginQuery() ,开始遮挡查询。

3.渲染几何体,完成遮挡查询测试。
4.glEndQuery();
完成查询。

5.获取本次通过深度测试的样本数量。

**

GLuint Query;
glGenQueries(1, &Query);
/*
glBeginQuery(target, id);
gl_samples_passed
gl_any_samples_passed
gl_any_samples_passed_conservative
*/
glBeginQuery(GL_SAMPLES_PASSED, Query);
glDrawArrays(GL_TRIANGLES,0,3);
glEndQuery(GL_SAMPLES_PASSED);

int methord = 0;
if(methord == 0)
{
    int count = 1000;
    while(!queryReady && count --)
    {
                glGetQueryObjectiv(Query,GL_QUERY_RESULT_AVAILABLE,&queryReady );
    }
    if(queryReady)
    {
      glGetQueryObjectiv(Query, GL_QUERY_RESULT,&samples);
    }else
    {
      samples = 1;
    }
    if(samples>0)
    {
      glDrawArrays(GL_TRIANGLES_FAN, 0, Numvertices);
    }
}else
{
 /*
遮挡查询的问题是,需要暂时停止所有几何体和片元的处理,先计算深度缓存中受影响的样本数目,然后将返回值返还给应用程序。通过条件渲染的方式来判断遮挡查询是否得到了有效的片元结果,然后继续后面的渲染命令。  
 */
glBeginConditionalRender(Query, GL_QUERY_WAIT);
/*
GL_QUERY_WAIT / NO_WAIT /BY_REGION_WAIT /BY_REGION_NOWAIT
*/
glDrawArrys(GL_TRIANGLE_FAN, 0, numvertices);
glEndConditionalRender(); 
}
glDeleteQueries(1,Query);

为了提高性能,需要尽可能禁止所有的渲染模式,以免造成渲染时间的增加。

补充资料:
During conditional rendering, all vertex array commands, as well as glClear and glClearBuffer have no effect if the (GL_SAMPLES_PASSED) result of the query object id is zero, or if the (GL_ANY_SAMPLES_PASSED) result is GL_FALSE.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值