OpenGL超级第12章学习笔记:管线监控

news2024/9/30 5:22:45
前言
本篇在讲什么

OpenGL蓝宝书第十二章学习笔记之管线监控
本篇适合什么

适合初学OpenGL的小白
本篇需要什么

C++语法有简单认知
OpenGL有简单认知
最好是有OpenGL超级宝典蓝宝书
依赖Visual Studio编辑器

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


目录

  • ♠ 本章的学习要点
  • ♠ 查询
    • ♥ 生成查询对象
    • ♥ 删除查询对象
    • ♥ 遮挡查询
      • ♣ 检索查询结果
      • ♣ 使用查询结果
      • ♣ OpenGL决策
      • ♣ 高级遮挡查询
    • ♥ 定时查询
    • ♥ 变换反馈查询
      • ♣ 索引查询
    • ♥ 管线状态查询
  • ♠ OpenGL同步
    • ♥ 清空管线
    • ♥ 同步与栅栏
  • ♠ 推送
  • ♠ 结语


♠ 本章的学习要点

  • 如何询问OpenGL命令在图形管线中的执行进程
  • 如何测量命令执行时间
  • 如何同步应用程序与OpenGL以及如何同步多重OpenGL语境

♠ 查询

查询是一种询问OpenGL图形管线正在发生什么的机制


♥ 生成查询对象

GLuint one_query;
GLuint ten_queries[10];
glGenQueries(1, &one_query);
glGenQueries(10, ten_queries);

函数glGenQueries生成查询对象,向其传递要保存的查询数量以及要放置查询对象名称的变量(或数组)地址

上述代码,第一次调用glGenQueries()生成一个查询对象,并在变量one_query中返回其名称

第二次调用 glGenQueries()生成十个查询对象


♥ 删除查询对象

及时删除生成的查询对象,以防OpenGL耗尽查询空间,删除调用下面函数

void glDeleteQueries(GLsizei n,const GLuint *ids);
glDeleteQueries(10,ten_queries);
glDeleteQueries(1&one_query);

上述代码删除了之前生成的查询对象


♥ 遮挡查询

调用下面接口OpenGL开始计数,可以设置需要询问的问题

glBeginQuery(GL_SAMPLES_PASSED, one_query);

参数GL_SAMPLES_PASSED代表询问的问题“有多少样本通过深度测试?”

参数one_query代表先前保留的查询对象的名称

调用下面接口OpenGL停止计数,可以设置需要询问的问题

glEndQuery(GL_SAMPLES_PASSED);

♣ 检索查询结果

我们已经统计好需要查询的内容并且保存在了生成的查询对象内,等待去检索

glGetQueryobjectuiv(the_query, GL_QUERY_RESULT,&result);

接口glGetQueryobjectuiv检索我们需要的结果

参数the_query是用于统计样本的查询对象的名称

参数result是希望OpenGL将结果写入的变量

OpenGL的检索有可能延迟,下面接口可以知道是否延迟

glGetQueryobjectuiv(the_query,GLQUERY_RESULT_AVAILABLE,Gresult);

♣ 使用查询结果

可以使用保真度低的限位框判断是否要渲染对象,下面是使用glGetQueryobjectuiv()从查询对象中检索结果的简单示例

glBeginQuery(GL_SAMPIES_PASSED,the_query);
RenderSimplifiedObject(object);
glEndQuery(GLSAMPLES_PASSED);
glGetQueryObjectuiv(the query,GL_QUERY_RESULT,sthe_result);
if (the_result != 0)
    RenderRealobject(object);

RenderSimplifiedObject是一种渲染低保真版本对象的函数

RenderRealObject渲染对象的所有细节

只有在低保真版本没有被完全遮挡的情况下,才回去渲染全部细节


♣ OpenGL决策

条件性渲染允许打包一序列的OpenGL绘图命令并与一个查询对象一起发送给OpenGL

  • 标记序列开始
glBeginConditionalRender(the_query,GL_QUERY_WAIT);
  • 标记序列结束
glEndConditionalRender();

如果查询对象的结果为0,则忽略那些glBeginConditionalRender()glEndConditionalRender()之间调用的任何绘图命令


♣ 高级遮挡查询

两个遮挡查询目标即GL_ANY_SAMPLES_PASSEDGL_ANY_SAMPLES_PASSED_CONSERVATIVE目标,它们也叫作布尔型遮挡查询,通过二者查询通过深度测试的精确样本数量

  • GL_ANY_SAMPLES_PASSED

无样本通过深度测试和模板测试时结果为0,在有样本通过深度测试时结果为1

  • GL_ANY_SAMPLES_PASSED_CONSERVATIVE

它会在样本可能通过深度测试和模板测试时立即计数


♥ 定时查询

定时查询通过传递GL_TIME_ELAPSED查询类型作为glBeginQuery()和glEndQuery()的target参数实现

glBeginQuery(GL_TIME_ELAPSED,queries[0]);

调用glGetQueryobjectuiv()获得查询对象的结果时,结果值为OpenGL执行 glBeginQuery()和glEndQuery()调用所经过的时间


♥ 变换反馈查询

基元生成数量和实际写入变换反馈缓存的基元数量均可作为查询

OpenGL是通过启动适当类型的GL_PRIMITIVES_GENERATEDGL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN查询生成基元

  • 开始两种查询
glBeginQuery(GL_PRIMITIVES_GENERATED,one_query);

glBeginQuery(GL_TRANSFORM_FEEDBACK PRIMITIVESWRITTENone_query);

OpeGL使用以下数持续记录查询结束前前端生成的基元教实际写入变换反馈缓存的基元数量

glEndQuery(GL_PRIMITIVES_GENERATED)

glEndQuery(GL_TRANSFORM FEEDBACK_PRIMITIVESWRITTEN);

♣ 索引查询

为了在不同流上开始和结束查询,可以调用glBeginQueryIndexed()gIEndQueryIndexed()


♥ 管线状态查询

如果OpenGL驱动器支持GL_ARB_pipeline_statistics_query扩展功能,则可提供以下查询类型

类型功能
GL_VERTICES_SUBMITTED_ARB发送给OpenGL的顶点数量
GL_PRIMITIVES_SUBMITTED_ARB发送给OpenGL的基元数量
GL_VERTEX_SHADER_INVOCATIONS_ARB通过你发送的顶点生成的顶点着色器调用次数
GL_TESS_CONTROL_SHADER_PATCHES_ARB发送给曲面细分控制着色器的面片数量
GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB曲面细分单元生成的评估着色器调用次数
GL_GEOMETRY_SHADER_INVOCATIONS几何着色器执行的次数
GL_GEOMETRY_SHADER_PRIMITIVES_EMITTEDARB几何着色器所生成的基元总数量
GL_FRAGMENT_SHADER_INVOCATIONS_ARB调用片段着色器的次数
GL_COMPUTE_SHADER_INVOCATIONS_ARB调用计算着色器的次数
GL_CLIPPING_INPUT_PRIMITIVES_ARB发送给裁剪工具输入的基元数量
GL_CLIPPING_OUTPUT_PRIMITIVES_ARB裁剪工具生成的基元数量

♠ OpenGL同步

需要确定发送给OpenGL的命令是否已经完成以及这些命令的结果是否已经准备就绪


♥ 清空管线

  • 强制它开始处理命令
glFlush();

确保目前已发布的任何命令最终会被执行,无法提供已发布命令的任何执行状态信息

  • 完成目前已发布的命令
glFinish();

确保执行,并且OpenGL管线处于空闲,但是降低性能,不建议使用


♥ 同步与栅栏

  • 创建栅栏同步
GLsync glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)
  • 查询同步状态
GLsync glGetSynciv(sync, GL_SYNC_STATUS, sizeof(GLint), NULL, &result);
  • 等待同步对象发出信号
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, timeout)

glWaitSync(sync, 0, GL_TIMEOUT_IGNORED)
  • 删除同步对象
glDeleteSync(sync):

♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++编译过程

How the C Compiler works? 文章目录 How the C Compiler works?compilingExamples总结欢迎关注公众号【三戒纪元】 通过编程,是的text程序编程可执行文件,基本上主要有2个操作发生: compiling 编译linking 链接 compiling C 编辑器要做的…

VXLAN:数据中心网络的未来

概要 随着云计算和虚拟化技术的快速发展,数据中心网络正面临着越来越大的挑战。传统的网络架构在适应大规模数据中心的需求方面存在一些限制,如扩展性、隔离性和灵活性等方面。为了克服这些限制,并为数据中心网络提供更好的性能和可扩展性&am…

【好书精读】网络是怎样连接的 之 连接服务器

(该图由AI制作 学习AI绘图 联系我) 目录 1 连接是什么意思 1.1 连接实际上是通信双方交换控制信息 2 负责保存控制信息的头部 2.1 客户端与服务器之间交换的控制信息 连接操作的实际过程 1 连接是什么意思 创建套接字之后 , 应用程序 …

Selenium教程__使用execute_script执行JavaScript(11)

selenium的包含的方法已能完全满足UI自动化,但是有些时候又不得不用到执行JS的情况,比如在一个富文本框中输入1W个字,使用send_keys方法将经历漫长的输入过程,如果换成使用JS的innerHTML方法就能够很快的完成输入。 selenium执行…

Shell 函数实现Go语言多版本管理轻量级方案

现有的工具方案 https://github.com/moovweb/gvmhttps://github.com/voidint/g 我的方案 优点: 原生:基于 go 语言本身支持多版本的能力实现,可以下载任何官方发布的版本简单:shell 函数实现,直接集成到 bashrc 或…

软件测试技能,JMeter压力测试教程,HTTP Cookie管理器(四)

目录 前言 一、场景案例 二、HTTP Cookie管理器 三、302 重定向 前言 Web网站的请求大部分都有cookies,jmeter的HTTP Cookie管理器可以很好的管理cookies 我用的 jmeter5.1 版本,直接加一个HTTP Cookie管理器放到请求的最前面,就可以自…

用docker搭建selenium grid分布式环境实践

目录 前言: selenium jar包直接启动节点 用docker命令直接启动 docker-compose 启动 Hub和node在一台机器上 Hub和node不在一台机器上 遗留问题 总结 前言: Selenium是一个流行的自动化测试工具,支持多种编程语言和多种浏览器。Sele…

【微服务架构演进】一文读懂单片到微服务架构的模式和最佳实践

在本文中,我们将学习如何使用设计模式、原则和最佳实践来设计微服务架构。我们将使用正确的架构设计模式和技术。 在本文结束时,您将了解如何在微服务分布式架构上设计系统以实现高可用性、高可扩展性、低延迟和对网络故障的弹性,从而处理数百…

学习Spring之声明式事务

什么是事务? 一个业务有一组操作,要么都成功,要么都失败 事务的四大特性:ACID A 原子性:一组操作,要么都成功,要么都失败 C 一致性 :事务的前后要保证事务的一致性 I 隔离性 &…

QLabel的使用

QLabel介绍 QLabel 是 Qt 框架中的一个控件类,用于显示文本或图像。它可以在窗口或其他容器中显示静态文本,并且可以根据需要设置格式、对齐方式和尺寸。 主要作用如下: 显示文本内容:QLabel 可以显示文字内容,可以…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

Spring Boot 中使用 @EventListener 注解监听事件

Spring Boot 中使用 EventListener 注解监听事件 Spring Boot 是一个流行的 Java Web 框架,它提供了丰富的功能和工具来简化开发人员的工作。其中一个非常有用的功能是事件监听器。在 Spring Boot 中,我们可以使用 EventListener 注解来监听事件&#x…

一天时间完成Python入坑(开发环境搭建、excel解析、exe打包三步走)

0.为什么要入坑Python 早就知道Python好,Python妙,Python用起来呱呱叫。工作上一直没有什么用得上Python的必要性,就一直没有接触,本次终于来了机会:【图新地球桌面端要对外开放Python API】,开放图新地球的…

【mars3d】Cesium实现雷达放射波

Cesium实现雷达放射波 1、雷达放射波 先看效果图 说明&#xff1a;使用的是mars3d框架&#xff0c;原生的Cesium实现方式可以绕道~ 实现方式&#xff1a; <template><div id"mars3dContainer"></div> </template><script setup> i…

Fiddler抓包基础使用

目录 一、设置抓谷歌浏览器https数据包 1、选中以下选项即可 2、若是选中后还是未抓到HTTPS数据包&#xff0c;则可进行以下操作 二、设置抓取Firefox浏览器HTTPS数据包 1、Firefox的代理需设置系统代理&#xff0c;设置→高级→网络设置&#xff0c;设置为系统代理&#…

【深度学习】5-3 与学习相关的技巧 - Batch Normalization

如果为了使各层拥有适当的广度&#xff0c;“强制性”地调整激活值的分布会怎样呢&#xff1f;实际上&#xff0c;Batch Normalization 方法就是基于这个想法而产生的 为什么Batch Norm这么惹人注目呢?因为Batch Norm有以下优点&#xff1a; 可以使学习快速进行(可以增大学习…

广工赢清华,炸裂!

去年2022年广工对阵清华&#xff0c;我在知乎写了文章 清华赢球靠的是广东第一高中生邹阳和2022届CBA状元王岚嵚。 比分焦灼的第四节关键时刻&#xff0c;邹阳在左角底线持球高高举起篮球&#xff0c;那个球的弧度非常高&#xff0c;皮球以稳稳的抛物线弧度掉入篮筐。 之后&…

Python基础(21)——Python函数实战、递归、lambda、高阶函数

Python基础&#xff08;21&#xff09;——Python函数实战、递归、lambda、高阶函数 文章目录 Python基础&#xff08;21&#xff09;——Python函数实战、递归、lambda、高阶函数目标一. 应用&#xff1a;学员管理系统1.1 系统简介1.2 步骤分析1.3 需求实现1.3.1 显示功能界面…

Streamlit基础教程

streamlit是什么 streamlit是一个开源的python库&#xff0c;它能够快速的帮助我们创建定制化的web应用&#xff0c;而且还非常便于和他人分享&#xff0c;特别是在机器学习和数据科学领域。整个过程不需要你了解任何前端的知识&#xff0c;包括html、css、javascript等&#x…

Vue3 计算属性和侦听器实战(computed、watch)——简易点餐页面

文章目录 &#x1f4cb;前言&#x1f3af;项目介绍&#x1f3af;项目创建&#x1f3af;代码分析&#x1f3af;完整代码&#xff08;含 CSS 代码&#xff09;&#x1f4dd;最后 &#x1f4cb;前言 这篇文章记录一下 Vue3 计算属性和侦听器 &#xff08;computed、watch&#xf…