原创 我的OpenGL学习进阶之旅介绍一下OpenGL ES的 遮挡查询

Posted 字节卷动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原创 我的OpenGL学习进阶之旅介绍一下OpenGL ES的 遮挡查询相关的知识,希望对你有一定的参考价值。

一、遮挡查询

在一个场景中,如果有有些物体被其他物体遮住了不可见。那么我们就不需要绘制它。 在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率。 遮挡查询就是允许我们判断一组图形在进行了深度测试之后是否可见。

遮挡查询可用于查询对象来跟踪通过深度测试的任何片段或者样本。

这种方法可用于不同的技术,例如镜头炫光特效的可见性测试以及避免在包围体被遮挡的不可见对象上进行几何形状处理的优化。

1.1 开始和结束遮挡查询

遮挡查询可以分别在GL_ANY_SAMPLES_PASSEDGL_ANY_SAMPLES_PASSED_CONSERVATIVE目标上用glBeginQueryglEndQuery开始和结束。

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
  1. 使用GL_ANY_SAMPLES_PASSED目标将返回表示是否有样本通过深度测试的精度布尔状态。
  2. 使用GL_ANY_SAMPLES_PASSED_CONSERVATIVE目标将提供更好的性能,但是答案的精确度较低。
  3. 使用GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN,有些实现将在没有样本通过深度测试时返回GL_TRUE

1.2 创建和删除id

idglGenQueries 创建,用glDeleteQueries 删除

void glGenQueries (GLsizei n, GLuint *ids);

参数说明:

  • n
    指定生成的查询名称对象的数量
  • ids
    指定一个数组,以存储查询名称对象的列表
void glDeleteQueries (GLsizei n, const GLuint *ids);

参数说明:

  • n
    指定要删除的查询名称对象的数量
  • ids
    指定一个需要删除的查询名称对象的数组

1.3 检索查询对象的结果

在用glBeginQueryglEndQuery 指定查询对象边界之后,可以使用glGetQueryObjectuiv检索查询对象的结果。

void glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);

参数说明:

  • id
    指定查询对象名称
  • pname
    指定需要检索的查询对象参数,可以为 GL_QUERY_RESULTGL_QUERY_RESULT_AVAILABLE
  • params
    指定存储返回参数值的对应类型的数组

为了获得更好的性能,你应该等待几帧再执行glGetQueryObjectuiv 调用,以等待GPU中的结果可用。

1.4 遮挡查询的步骤

遮挡查询的步骤:

  1. 首先为这些物体生成查询对象ID 调用glGenQueries
  2. 调用glBeginQuery开始遮挡查询
  3. 渲染包围体
  4. 调用glEndQuery 结束遮挡查询
  5. 调用glGetQueryObject[u]iv,根据ID提取遮挡查询的结果,并根据结果进行相应的操作
  6. 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的 光栅化 : 剔除多边形偏移

我的OpenGL学习进阶之旅介绍 顶点数组对象VAO并实战一下

我的OpenGL学习进阶之旅介绍一下 映射缓冲区对象和复制缓冲区对象