遮挡查询步骤
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.