目录
一、遮挡查询1.1 开始和结束遮挡查询1.2 创建和删除id1.3 检索查询对象的结果1.4 遮挡查询的步骤1.5 例子1.6 扩展阅读一、遮挡查询
在一个场景中,如果有有些物体被其他物体遮住了不可见。那么我们就不需要绘制它。在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率。遮挡查询就是允许我们判断一组图形在进行了深度测试之后是否可见。
遮挡查询可用于查询对象来跟踪通过深度测试的任何片段或者样本。
这种方法可用于不同的技术,例如镜头炫光特效的可见性测试以及避免在包围体被遮挡的不可见对象上进行几何形状处理的优化。
1.1 开始和结束遮挡查询
遮挡查询可以分别在GL_ANY_SAMPLES_PASSED
或GL_ANY_SAMPLES_PASSED_CONSERVATIVE
目标上用glBeginQuery
和glEndQuery
开始和结束。
void glBeginQuery (GLenum target, GLuint id);void glEndQuery (GLenum target);
参数说明:
target
指定查询对象的目标类型。有效值是:GL_ANY_SAMPLES_PASSED
GL_ANY_SAMPLES_PASSED_CONSERVATIVE
GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN
id
指定查询对象的名称(仅glBeginQuery
) 使用GL_ANY_SAMPLES_PASSED
目标将返回表示是否有样本通过深度测试的精度布尔状态。使用GL_ANY_SAMPLES_PASSED_CONSERVATIVE
目标将提供更好的性能,但是答案的精确度较低。使用GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN
,有些实现将在没有样本通过深度测试时返回GL_TRUE
。
1.2 创建和删除id
id
用glGenQueries
创建,用glDeleteQueries
删除
void glGenQueries (GLsizei n, GLuint *ids);
参数说明:
n
指定生成的查询名称对象的数量ids
指定一个数组,以存储查询名称对象的列表
void glDeleteQueries (GLsizei n, const GLuint *ids);
参数说明:
n
指定要删除的查询名称对象的数量ids
指定一个需要删除的查询名称对象的数组
1.3 检索查询对象的结果
在用glBeginQuery
和glEndQuery
指定查询对象边界之后,可以使用glGetQueryObjectuiv
检索查询对象的结果。
void glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
参数说明:
id
指定查询对象名称pname
指定需要检索的查询对象参数,可以为GL_QUERY_RESULT
或GL_QUERY_RESULT_AVAILABLE
params
指定存储返回参数值的对应类型的数组
为了获得更好的性能,你应该等待几帧再执行
glGetQueryObjectuiv
调用,以等待GPU中的结果可用。
1.4 遮挡查询的步骤
遮挡查询的步骤:
首先为这些物体生成查询对象ID 调用glGenQueries
调用glBeginQuery
开始遮挡查询渲染包围体调用glEndQuery
结束遮挡查询调用glGetQueryObject[u]iv
,根据ID提取遮挡查询的结果,并根据结果进行相应的操作glDeleteQueries
删除ID,回收资源
1.5 例子
下面的例子说明如何设置一个遮挡查询对象和查询结果:
glBeginQuery( GL_ANY_SAMPLES_PASSED, queryObject );// draw primitives here// ...glEndQuery( GL_ANY_SAMPLES_PASSED );// ...// after several frames have elapsed, query the number of// samples that passed the depth test glGetQueryObjectuiv( queryObject, GL_QUERY_RESULT );