opengl如何画出一个球_OpenGL-Controlling and Monitoring the Pipeline

全球图形学领域教育的领先者、自研引擎的倡导者、底层技术研究领域的技术公开者,东汉书院在致力于使得更多人群具备内核级竞争力的道路上,将带给小伙伴们更多的公开技术教学和视频,感谢一路以来有你的支持。我们正在用实际行动来帮助小伙伴们构建一套成体系的图形学知识架构,你在我们这里获得的不止于那些毫无意义的代码,我们这里更多的是代码背后的故事,以及精准、透彻的理解。我们不会扔给人们一本书或者给个思路让人们去自学,我们是亲自来设计出好的资源,让人们明白到底背后还有哪些细节。

这里插播一个引擎大赛的消息,感兴趣的同学可以看一眼,这也是东汉书院的立项使命:

疯狂的程序员:自研引擎大赛​zhuanlan.zhihu.com
d14111cb2ae040155c33282faf0e87b0.png

大赛官方主页

东汉书院-自己动手写游戏引擎​edu.battlefire.cn

参赛作品列表

疯狂的程序员:参赛作品1-NaturalEngine​zhuanlan.zhihu.com
14607c5d531b5d018231d6b9a724056c.png
疯狂的程序员:参赛作品2-Colble离线室内渲染器和Juziimo实时外观渲染器​zhuanlan.zhihu.com
04774a644111a18f2e0a7f7540a53492.png

Chapter 12. Controlling and Monitoring the Pipeline

What You’ll Learn in This Chapter

  • How to ask OpenGL about the progress of your commands down the graphics pipeline.
  • How to measure the time taken for your commands to execute.
  • How to synchronize your application with OpenGL and how to synchronize multiple OpenGL contexts with each other.

你将会在本章学到啥

  • 如何询问OpenGL你的指令在图形管线中的执行进度
  • 如何计算出你的指令花费了多少时间
  • 如何处理OpenGL与你的程序的同步问题以及如何同步多个OpenGL的渲染上下文

This chapter is about the OpenGL pipeline and how it executes your commands. As your application makes OpenGL function calls, work is placed in the OpenGL pipeline and makes its way down it one stage at a time. This takes time, and you can measure that span. This allows you to tune your application’s complexity to match the performance of the graphics system and to measure and control latency, which is important for real-time applications. In this chapter, you’ll also learn how to synchronize your application’s execution to that of OpenGL commands you’ve issued and even how to synchronize multiple OpenGL contexts with each other.

本章是介绍OpenGL的管线的以及它如何执行你的指令。当你的程序调用OpenGL的API的时候,这些指令都会在OpenGL的管线里得到执行并且每次执行一个阶段。这个操作是耗费时间的,你可以计算出花费了多少时间。 这可以让你去测试你程序的复杂度然后去很好适配你的图形系统的性能,并且掌握并处理好延迟,这对于实时应用程序来说是非常重要的。在本章中,你将同样会学到如何去同步你程序发送给OpenGL的那些指令甚至能学到 如何去同步多个OpenGL的渲染上下文。

Queries

Queries are a mechanism to ask OpenGL what’s happening in the graphics pipeline. There’s plenty of information that OpenGL can tell you; you just need to know what to ask—and how to ask the question.

Queries是一种查询OpenGL图形管线里正在发生什么的一种机制。你可以查询到很多东西,你需要做的就是知道可以查询什么以及如何去查询。

Remember your early days in school? The teacher wanted you to raise your hand before asking a question. This was almost like reserving your place in line for asking the question—the teacher didn’t know yet what your question was going to be, but she knew that you had something to ask. OpenGL is similar. Before we can ask a question, we have to reserve a spot so that OpenGL knows the question is coming. Questions in OpenGL are represented by query objects, and much like any other object in OpenGL, query objects must be reserved, or generated. To do this, call glGenQueries(), passing it the number of queries you want to reserve and the address of a variable (or array) where you would like the names of the query objects to be placed:

回想起在学校里的那些日子会想到啥?老师们会希望你在提问之前先举手。你这么做就非常类似于在一个队列里面占据一个问问题的位置,这时候老师还不知道你想问什么,但是他们知道你有东西要问。OpenGL是类似的。 在你问问题之前,你必须让我们知道你想要问问题。OpenGL里面使用query object来表现问题的,就跟OpenGL里面的其他object一样,query object必须实现申明然后生成。我们可以调用glGenQueries,传入你希望 预留多少个query object以及传入一个地址,告诉OpenGL你希望那些query object名字被写进哪里:

void glGenQueries(GLsizei n,GLuint *ids);

The function reserves some query objects for you and gives you their names so that you can refer to them later. You can generate as many query objects you need in one go:

这个函数预留了一些query object并且给出了他们的名字,你可以在后面的代码中使用这些名字来引用这些query object。你可以一次性生成很多个query object:

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

In this example, the first call to glGenQueries() generates a single query object and returns its name in the variable one_query. The second call to glGenQueries() generates ten query objects and returns ten names in the array ten_queries. In total, 11 query objects have been created, and OpenGL has reserved 11 unique names to represent them. It is very unlikely, but still possible, that OpenGL will not be able to create a query for you; in this case it returns 0 as the name of the query. A well-written application always checks that glGenQueries() returns a non-zero value for the name of each requested query object. If there is a failure, OpenGL keeps track of the reason, and you can find that out by calling glGetError().

在本例子中,第一个对glGenQueries的调用中生成了一个query object并且把它的名字写入了one_query这个变量里面。第二次对glGenQueries的调用生成了10个query object并且把10个名字写入了ten_queries 变量里面。你总共生成了11个query object,OpenGL为你预留了11个独一无二的名字来表示这些query object。当name里面的值是0的时候,就表示OpenGL不能给你创建query object。一个良好的编程习惯就是 在调用了glGenQueries之后,去检查一下返回值是不是非0。如果这个操作失败了,OpenGL会保留一份错误原因,你可以通过glGetError()来获取到为什么失败了。

Each query object reserves a small but measurable amount of resources from OpenGL. These resources must be returned to OpenGL because, if they are not, OpenGL may run out of space for queries and fail to generate more for the application later. To return the resources to OpenGL, call glDeleteQueries():

每一个query object会从OpenGL里面占有一份小的,但是可以度量的资源。这些资源必须最后回收给OpenGL,因为如果它们没有被回收的话,那么OpenGL可能会没有内存了并且无法为应用程序创建更多的queries。 我们可以调用glDeleteQueries来把query object的资源回收给OpenGL。

void glDeleteQueries(GLsizei n,const GLuint *ids);

This works similarly to glGenQueries()—it takes the number of query objects to delete and the address of a variable or array holding their names:

这个跟glGenQueries类似,它会接受两个参数,第一个是你想回收多少query object,第二个参数就是具体的这些你想回收的query object的存放位置。

glDeleteQueries(10, ten_queries);
glDeleteQueries(1, &one_query);

After the queries are deleted, they are essentially gone for good. The names of the queries can’t be used again unless they are given back to you by another call to glGenQueries().

当你的queries被删除了之后,他们基本上都是没问题的,这些名字是不会被重用的,直到你下次调用glGenQueries的时候再次获得它们。

我们核心关注和讨论的领域是引擎的底层技术以及商业化方面的信息,可能并不适合初级入门的同学。另外官方维护两个公众号,第一个公众号是关于我们企业自身产品的信息与动态的公众号,如果对我们自身信息与动态感兴趣的同学,可以关注图形之心

除此之外,我们为了更频繁的发布一些咨询与文章,我们维护的第二个公众号是“内核观察”,内核观察提供的主要是一些与我们无关的咨询与文章。

只言片语,无法描绘出整套图形学领域的方方面面,只有成体系的知识结构,才能够充分理解和掌握一门科学,这是艺术。我们已经为你准备好各式各样的内容了,东汉书院,等你来玩。

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

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

相关文章

【WebRTC---入门篇】(二十)WebRTC核心之SDP详解

SDK规范 会话层 媒体层 SDP规范相关参考 WebRTC中的SDP

junit5和junit4_JUnit 5 –条件

junit5和junit4最近,我们了解了JUnit的新扩展模型以及它如何使我们能够将自定义行为注入测试引擎。 我向你保证要看情况。 现在就开始吧! 条件允许我们在应该执行或不应该执行测试时定义灵活的标准。 它们的正式名称是“ 条件测试执行” 。 总览 本系列…

python opencv输出mp4_10分钟学会使用YOLO及Opencv实现目标检测

点击边框调出视频工具条 计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别、行人检测等,国内的旷视科技、商汤科技等公司在该领域占据行业领先地位。相对于图像分类任务而言,目标检测会更加复杂一…

捍卫者usb管理控制系统_捍卫Java

捍卫者usb管理控制系统因此,我们不时发布了一本电子书,名为“十大Java性能问题” 。 毫无例外,一些人回答了一些“问题是您正在使用Java”。 显然,Java一直在受到批评,人们已经预测了它的消亡已有一段时间了。 当然&a…

html怎么上传qq空间,qq空间怎么上传照片

当我们想要把照片上传到qq空间里,应该怎么办呢?下面就让学习啦小编告诉你空间上传照片的方法,希望对大家有所帮助。空间上传照片的方法打开QQ主界面,在主界面头像的右则有个小星星,那就是进入空间的快捷方式,点一下小…

android gridview控件使用详解_Android开发实现自定义日历、日期选择控件

点击上方蓝字关注 ??来源: wenzhihao123https://www.jianshu.com/p/a2f102c728ce前言最近项目需要日历效果,考虑用第三方的反而不太适合设计需求,修改复杂,与其这样不入自己重新写一个干净的控件。虽不是什么牛逼控件&#xff0…

HTML设置字体颜色1008无标题,如何在HTML中设置字体颜色,你知道这几种方式吗?...

color设置字体颜色在color设置字体颜色之前,我们首先了解color在css中有几种取值方式,一共有4种方式,若有不全还请在评论区告知谢谢,4种方式如下:十六进制、十进制、 英文单词、十六进制的缩写。现在让我们进入字体颜色…

gram矩阵_Skip-gram

Skip-gram标签(空格分隔):NLP一. skip-gram和cbow的对比 skip-gram与cbow相比,好处在于对于不常用的词,skip-gram的效果要更好;举个简单的例子,一个句子w1w2w3w4,window_size1;对于cbow&#xf…

C++ 11 深度学习(十五)多线程

线程创建 方式一:调用函数 #include<thread>void CreateThread() {int a100;cout<<"This is Thread: "<<a<<endl; }int main() {thread Threadone(CreateThread);//join是一种阻塞的方式&#xff0c;需要子线程处理完毕之后&#xff0c;…

计算机的好处和坏处的英语作文,电脑的利弊英语作文

电脑的利弊英语作文在学习、工作或生活中&#xff0c;大家都写过作文吧&#xff0c;通过作文可以把我们那些零零散散的思想&#xff0c;聚集在一块。那么你有了解过作文吗&#xff1f;下面是小编为大家整理的电脑的利弊英语作文&#xff0c;希望能够帮助到大家。Computer is in…

servlet容器_SpringBoot是否内置了Servlet容器?

SpringBoot是否内置了Servlet容器&#xff1f;SpringBoot内置了Servlet容器&#xff0c;这样项目的发布、部署就不需要额外的Servlet容器&#xff0c;直接启动jar包即可。SpringBoot官方文档上有一个小章节内置servlet容器支持用于说明内置Servlet的相关问题。在SpringBoot源码…

计算机专业开学要带电脑吗,大学上课要带电脑吗

大学刚开学&#xff0c;上课的时候学生们要不要带电脑呢&#xff0c;想必这个问题一直对还没进入大学的准大学生来说很困扰&#xff0c;下面是小编整理的详细内容&#xff0c;一起来看看吧&#xff01;大学上课要带电脑吗大学上课能否带电脑需要看老师的要求。大学课程书本知识…

突然讨厌做前端,讨厌代码_不要讨厌HATEOAS

突然讨厌做前端,讨厌代码或我如何学会不再担心和爱HATEOAS REST已成为实现Web服务的事实上的解决方案&#xff0c;至少已成为一种流行的解决方案。 这是可以理解的&#xff0c;因为REST在使用HTTP规范时提供了一定程度的自我文档。 它经久耐用&#xff0c;可扩展&#xff0c;并…

【WebRTC---进阶篇】(三)各流媒体服务器的比较

多人音视频架构 Mesh方案 多对多大多进行P2P,在国内P2P直连穿越会出现很大问题。 MCU方案 客户端连接后,对应每个终端都有一个模块进项上传。再将音视频进行拆分解码。进行混屏,压缩编码分别推动给每个终端。 SFU方案 sfu不进行编解码,只是进行转发。只对订阅的终端进行…

汇编 cmp_汇编复习

第一章计算机组成五部分&#xff1a;&#xff08;运算器、控制器&#xff09;、存储器、输入/输出设备↑↑ CPU ↑↑ ↑内存↑三条总线&#xff1a;控制总线、地址总线、数据总线不同进制及BCD码的转换特殊ascll ‘0’~‘9’—— 30H ~ 39H‘A’~‘F’—— 41H ~ 46H回车 —— …

junit5和junit4_JUnit 5 –设置

junit5和junit42015年11月&#xff0c; JUnit Lambda团队展示了他们的原型 。 此后&#xff0c;该项目更名为JUnit 5&#xff0c;并于2016年2月发布了Alpha版本。我们将在一系列简短文章中进行探讨&#xff1a; 建立 基本 建筑 条件 注射 … 本节讨论JUnit 5的设置&…

markdown 生成目录_github上如何为markdown文件生成目录

写在前面熟悉markdown都知道可以使用[TOC]自动生成markdown文件的标题目录&#xff0c;比如在typora&#xff0c;vscode(需要插件)等本地编辑器中&#xff0c;或者在CSDN等网页编辑器中&#xff0c;但是github却不支持[TOC]标签&#xff0c;至于为什么不支持感兴趣的可以深入搜…

【WebRTC---进阶篇】(五)mediasoup的信令系统

mediasoup demo分析 app 客户端部分 broadcasters 推拉流部分 server 服务端部分 config.js 相当于一个配置文件&#xff0c;获取一些基本配置信息。获取的信息来交给server.js。 server.js 先从config.js获取信息&#xff0c;然后启动HTTPS webSocket服务等&#xff0c;…

axure html尺寸,axure怎么确定尺寸

回答&#xff1a;您好如做的是室内设计的话&#xff0c;那么来说可能会些参数提供给您的(例如长宽高)如果没有参数的话&#xff0c;只要把比例做好就可以了。只要比例做好了&#xff0c;东西看起来就自然像。至于教程的话&#xff0c;一般录制教程前都会有做好准备的&#xff0…

exe打包工具哪个最好_为你的 Python 程序写个启动工具箱

到目前为止&#xff0c;公众号已经介绍了不少图形界面的软件&#xff0c;比如猜数游戏、PDF阅读器、贪吃蛇游戏、天气查询软件、PDF 阅读器等。为了方便他人使用&#xff0c;我们常把图形界面打包成 exe 文件。但是如果我们只是为了自己使用方便的话&#xff0c;我们有必要把程…