您的位置:首页 > 其它

遮挡查询

2017-12-04 10:07 295 查看
遮挡查询步骤

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: