OpenGL超级第12章学习笔记:管线监控 | 您所在的位置:网站首页 › opengl蓝宝书是什么 › OpenGL超级第12章学习笔记:管线监控 |
前言
本篇在讲什么
OpenGL蓝宝书第十二章学习笔记之管线监控
本篇适合什么
适合初学OpenGL的小白
本篇需要什么
对C++语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器
本篇的特色
具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容
![]() 查询是一种询问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_PASSED和GL_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_GENERATED或GL_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 ♠ 结语若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。 👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈 |
CopyRight 2018-2019 实验室设备网 版权所有 |