原创 我的OpenGL学习进阶之旅介绍一下OpenGL ES的 遮挡查询
Posted 字节卷动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原创 我的OpenGL学习进阶之旅介绍一下OpenGL ES的 遮挡查询相关的知识,希望对你有一定的参考价值。
一、遮挡查询
在一个场景中,如果有有些物体被其他物体遮住了不可见。那么我们就不需要绘制它。 在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率。 遮挡查询就是允许我们判断一组图形在进行了深度测试之后是否可见。
遮挡查询可用于查询对象来跟踪通过深度测试的任何片段或者样本。
这种方法可用于不同的技术,例如镜头炫光特效的可见性测试以及避免在包围体被遮挡的不可见对象上进行几何形状处理的优化。
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 );
1.6 扩展阅读
以上是关于原创 我的OpenGL学习进阶之旅介绍一下OpenGL ES的 遮挡查询的主要内容,如果未能解决你的问题,请参考以下文章
我的OpenGL学习进阶之旅学习OpenGL ES 3.0 的实战 Awsome Demo (中)
我的OpenGL学习进阶之旅学习OpenGL ES 3.0 的实战 Awsome Demo (中)
我的OpenGL学习进阶之旅介绍一下OpenGL ES的 光栅化 : 剔除多边形偏移
我的OpenGL学习进阶之旅介绍一下OpenGL ES的 光栅化 : 剔除多边形偏移