粉丝4823获赞2.5万

你知道我们玩游戏的时候啊,游戏游戏呢,可能会选择注入 d x 十一, d x 十二、 volcan 等等的选项,你知道这是什么东西吗?嗯,他们就是这个图形的 api, 从软件层面影响着这个游戏的画质和它的真数,某些支持 api 升级的游戏呢,性能可以获得显著的提升。本期视频就给大家做一个简单的科普啊, 那在非常久远的过去呢,所有的程序都是针对于硬件来进行直接开发的,比如说我专门给恩卡呢做了一款游戏,但这呢可是一对一的高级定制啊,如果想让 a 卡也能玩这款游戏, 就需要再针对 a 卡的进行重新的开发,但是呢,恩卡 a 卡的驱动和意见设计是完全不一样的,重新开发呢,需要投入的财力和时间成本是相当巨大的,而且对于程序员来说要求也非常高。这个时候呢,游戏和显卡之间呢,就需要一个统一的中间层啊,一个翻译关,在不同的软硬件之间来进行沟通协调。 于是呢, api 就出现了,通过调位这些接口呢,可以极大程度的简化软件开发的这个编程的一个操作,也能让软件呢轻松的适配到各种意念上。那图形 api 呢,是 api 的子分类啊,它是图形的应用程序的一个专用的编程接口。 进行游戏的时候呢,游戏会告诉图形 api 啊,需要显示什么画面,然后呢,他会在游戏引擎不同的显卡和显卡驱动之间来进行沟通,最后呢,把图像给他显示出来。我们在游戏中常见的 dx 十一, dx 十二、 open g 啊和 welcome 都属于图形 api。 呃, dx 十一呢,是个微软旗下 draxx 的一员啊,全社交的 drax 三 d 十一, 顾名思义呢,就是负责三 d 图形,只能在 vno 四和叉 boxs 上,微软的自家在平台上使用。目前呢,大多数的游戏大厂都会采用地差十一来去制作游戏,但是效率它是不如地差十二和 volcana。 oppongy 呢,则是隶属于菲林音乐组织科纳斯,它是跨平台的,像 vows, micros, 零点 unix, 安卓和 ls 呢,都可以使用。所以呢,手游行业是非常吃香的。相比之下呢,我们主要的兼容性会更好一些,但是地差十级的功能性要更强一些,会更先进一些。 d x 十二和 volca 呢,则是属于这个啊, d x 十一和 open g 的升级版,那他允许游戏呢,开发者自由的去访问底层的语言,这就给了游戏很大的这个优化空间,可以呢,榨干硬件的梅子性能,给游戏呢带来很直观的一个性能提升, 所以呢,被称为底层的 api。 很多游戏呢,已经支持 apa 的升级了,例如说古典暗影啊,可以切换地下十二幻影大标个二彩虹六号和原始人可以切换挖坑灯的啊,那真数人都会有着不同程度的提升。那怎么样 api 的作用呢?真的了解了吗?赶紧收藏打开游戏试一试吧!

哈喽,大家好,这里是 jesus, 改完我的世界,今天深入讲解我的是关于 open g l 启动不了的问题,是视频上的这种,如果就是这个问题,那你就找对路了,不管是网易的 java 还是 p c l 等的 java 都能搞好。 这个是启动不了的示范,不想看的跳转至四十八秒, 可见这个 drafa 启动步了。当我用了这个工具后的 drafa 这次就启动成功了。教程开始 解压完成后,打开点第三个文件,找到自己。只要把 g x c 路径到并的位置,先按任意键继续,再把路径复制在命令提示服上。 复制完成后按回车,然后填上你的 java 名称。这里我有 java g x c 和 yava g x c 就任选一个填上去,按回车之后的第一个选项。如果你电脑是六四 bit 就填 y, 三十二 bit 就填 in, 然后填 y, 后面都填 in, 知道它关闭就行了。

同学们好,欢迎观看乌喷鸡儿编程指南,我们今天给大家来讲乌喷鸡儿的版本, 每个同学都会在自己的网上去下载一个欧芬杰尔的开发包,那么这个开发包到底是一个什么版本?有很多同学在课堂上会问我,那么今天我就通过一个代码的形式来给大家看一下我们自己到底从网上下载的欧芬杰尔是一个什么版本。 我们比较容易的可以是知道自己系统当中欧文加版本就是调用该词追音这个函数, 这个函数大家可以注意看一下,他的返回值是一个抗色的掐芯,说明这是一个返回的是一个自助串, 那么他有一个参数叫做 g r v 信,这个就是我们版本,所以说我们可以获取到这个自助串之后, 然后把他的变量就是 word 顺这个变亮,直接用纯音的 f 把它输出就可以了,所以这个方法呢是比较简单的,那么我们来看一下该顺应这个函数, 这个函数是返回一个表示版本的字不算,字不算的格式为差点差点差表示的其实是三个整数,我们用小数点将它隔开,每一个数表示欧文加的主版本号,第二个数表示欧文加的次版本号, 第三个数呢表示的是厂商发行的代号,比如啊,我们在运行时候得到的是二点零点一,这表示就是我的欧喷加版本是二点零,主版本号为零,二,次版本号为零。那大家现在就会有疑问,那么主版本 号和次版本号到底有什么区别呢?其实啊,主版本和次版本就是在于主版本号规定了函数在次版本号当中也有规定,只不过是对主版本号在次版本当中就去做了个补充。函数的补充, 他是仿唱发行的第一个发行版本,通过 s、 c、 k、 f 这个函数,我们可以把这个自助算分成三个整数,以便详细的进行判断, 所以我们看下这里这段代码,我把代码解释一下,大家应该就明白了,很很好理解。 定那个印堂 mary 水,这是三个整形,这个其实就是三个字段,我们刚才那个差点差点差当中的三个字段好了,然后呢,我通过 gr dsgen, 然后有个 gr v 讯获取到当前版本的那个字, 然后用定义的一个抗色的恰型温顺这个这个变量去获取。然后呢,我们 skm, skf 是一个格式化的定义,表示的是什么呢?表示的是把第一个变量当中的 内容按照第二个形式里面去输出,然后呢我们由 第三个、第四个和第五个变亮去接收。比如说举一个例子,纯银的 fopongra 版本,这个呢就是 wowing, 然后这个就是 manwowhent, 然后这个就是萨 word 型,所以大家看到我的 wording 就是我的 oppo girl 版本, mary girling 就是我的主版本,三部 vrourry 就是我的次版本, red ex, virline 就是我的发型的版本号。好,大家看到这样子理解的话,我们就很难 就比较好理解了,我的没有纹身,呃,三不纹身和瑞丽丝纹身,一个是表示主版本、次版本以及发行版本号。 好,那么其实盖子出现这个函数还可以获取到其他的一些字,不错,比如说豌豆,我们可以获取到 opengra 的提供厂商,如果是 rendond 可以返回 opengra 渲染设备通常就是我们当前设备当中显卡的名字, 还有个叫 excam, 这个呢是返回所支持的扩展,每两个扩展之间我们可以用空格来隔开, 详细的我们去见一下下面的欧喷加尔扩展迅速。那什么是欧喷加尔扩展呢?我这个地方稍微讲快点,因为是纯理论啊,欧喷加尔的版本其实更新 速度并不是很快,如果某种技术变得流行起来,但是欧根基亚标准当中又没有相关的规定对这种技术去提供支持,我们就只能通过扩展来实现了。 说白了就是我们家的主版本是对相对于我们的程序来说是一个官方标准。而我们的扩展呢,其实就是一个所谓的爱好者开发的一种情况,爱好者 专门去针对欧根进而开发,他们自己去封装了一些函数,这个其实就叫扩展。 所以厂商在发现欧奔继而的时候,除了去遵照欧分继而标准提供标准所规定的各种功能之外,往往还会提供一些额外的功能,这就是扩展了。扩展的存在,使得各种新的技术可以迅速的被 用的欧喷加热当中,比如多重管理,他在欧喷加一点三当中才被加到标准,但是在一点三版本之前都是通过扩展来实现的,也就说呀,最开始是先有 先有技术,这个就是扩展,也就非官方认证的,然后呢才会有标准, 最先后赠予先有技术扩展再有标准。所以说 即使这样,即使你的欧文甲不更新,那么只要增加新的扩展,也可以去提供新的功能。这就说明啊, 其实欧喷加版本较低,也不一定不支持一些高版本欧喷加才提供的功能是让某些欧喷加一点五的实现, 也可能提供了最新的二点一版本所规定的大部分功能。当然,扩展也有缺点,那就是程序在运行的时候,必须去检查每个扩展功能是否被支持,这样就会导致程序代码会变得比较复杂。 那么扩展名字怎么来命名呢?对了,每个欧文加尔扩载其实都会向欧盟加网站去注册,只有确定之后才能成为扩展。注册后的扩展有编号和名字,编号仅仅是一个序号,名字则是与扩展所提供的功能相关的,这就相当于是一个文案号, 一个编号是个文案号,那编号所对应的扩展才是真正功能实现,对吧?好 名字呢,我们用下划线分为三个部分。举个例子,一个扩展名字可能为 grn v 哈尔 pro, 意义就是第一部分为扩散的目标,比如 gr 可能就是一个 oppo 扩展,那如果是 wgr 呢?这就是真的一个 windows 的 opengra 扩展。那如果是 grs 呢,则表示这是 linax 的 xondow 系统的 oppo girl 扩载。 第二部分呢,是提供了厂哎扩展的厂商,比如 nv, 就表示 nv 那个尼维达的公司所提供的扩展,现在还有 a t i a b m s t i s i 九月 c 那个归途公司 apple 还有 miss。 剩下的部分呢,就表示扩展所提供的内容了,比如哈佛路表示了半斤度, 但是呢,每个复联数的精度只有半精度复联数的一半,因此呢,你只需要两个字节就可以保证了。这种扩展功能可以节省 内存空间比节省从内存到显卡的数据传输量,代价其实就是,呃,精确度有所下降。 好,下面就是 exd 扩展和 arb 扩展这两个扩展。其实啊,就是在最初的时候,我们每个厂商都会提供自己的扩展,这样导致的结构呢,其实就是及时提供相同的功能, 不同的厂商去提供不同的扩展。这样在编写程序的时候,使用一种功能,就需要依次去检查每个可能支持这种功能的扩展非常繁琐,于是我们就出现了 est 扩展和 arb 扩展。 exc 扩展其实是由多个厂商共同协商之后形成了扩展,在他的扩展名字当中,提供扩展的厂商这懒就不再是具体的厂商名,而是 exc 三个字母。比如说 giast bgra, 这个呢,就是一个 excam 扩展, bgra 是因为我们 vinos 平台下的那个 bmp 文件他都是,他都是采用的是 bgr 形式。而大家知道,我们在 a arb 扩展不仅需要多个厂商共同协商形成,还需要经过欧喷家体系委员会的认证。在扩展中提供厂商扩展的厂商,一来就不再是具体的厂商名字了, 而是 arb 三个字母。比如说 granb、 emag 就是 arb 的扩载,通常一种功能,如果有多个厂商去提出,则可以成为 ast 扩载,在以后时间里, 如果经过了 arb 的确认,则他可以成为 arb 过的,那再往后,如果欧根加维护者认为这种功能需要加入的标准当中呢,则他不再是过载,而成为标准的一个部分了。例如 pang pramex, 其实就是先有 gx extprond, 再有 arb pome max, 所以大家可以看到,哎, arb 相当于是比 xt 哎比赛呢要更加的严格和标准化一些, 最高的澳门价一点四版本,那么这种功能呢,都会为标准规定提供一个崭新的功能,而不再会是一个扩展了。 所以在小欧奔家所提供的功能上,我们应该按照标准功能 arb est 其他扩展这样的悠闲顺序, 其实就是所谓的从苛刻,从标准,然后再到这个非标准化这样一个顺序。例如有 arb 扩展知识的功能上,我们就不可以使用 usb 扩展了,对吧? 好啊,在程序当中如何去判断欧根基亚是否致使某一扩展,我们可以用这个就行了。 grgs 追 比赛选会返回当前欧文家所支持所有扩展名字,中间用空格把它分开,这就是我们判断是否支持某个扩展的一个依据。好比如说下面这三排吧, 大家可以下状,把这两个代码在你的代码啊,把这个代码可以敲一下,他就是判断欧文 gr 是否致使某个指定的扩展,所以包含一个投 印窟窿的正点 h, 因为这辆用了一个正,一个字不串,该死。俊好,上面在了吗?我们就判断了欧分加是否支持 指定的扩展,可以看到,那我们在判断上完全就是需要靠字符串去处理了。循环检测,找到第一个空字符,然后比较空格之前字符大是否和指定字符名字一致,就是所谓的字符酸匹配在这里好, 然后编写程序调用扩展的功能,这个呢大家可以略看一下,我在这里就不多介绍了,大家注意一点就行了。就是,呃, arb 扩展都是以 arb 来结尾的, 所以比如说想加 lv 八分 arb, 这说明就是个 arb 了,过的好,大家把这个记住起来。然后呢, 还有个就是一个小巧的工具,就是 gr e 这个东西。 gr e 是什么东西呢?其实啊,就是一个开源码的一个项目, 可以从网上搜载,呃,搜索并下载代码有两部分组成,一个是 gr 一点 c, 一个是 gr 一点 h。 把这个网络文件我们都放到自己的原代码去变音运行的时候呢, 加一就可以自动的去判断所有的扩展是否被支持,如果支持,那么加一就会自动去读许对应的函数供我们调用。我们自己在去编写代码的时候呢,首先需要包含加一点一曲,然后才包含 gr 加一点一曲, 注意顺序,千万不能调换,然后我们就可以方便使用各种扩展功能了,哎,所以大家可以看到这个就是我写代码的顺序,当然因为是网上下载的一个非官方的,所以这里大家看到我要用双引号了,对吧, 注意顺序。另外 gr e 这个也可以帮助我们去判断奥芬家是否知识某扩展,因此有了 gre 前面那个判断是否知识的函数就不太有必要了。好,这个大家注意 好。然后呢,注意使用 gr 一的时候的冲突问题,一定要记住,因为他是个开元库的投文件 出现的原因是因为 gr gr exd 点投关键虽然可以使用高版本的欧喷加函数,但是使用的形式呢,不太方便, 所以我们欧喷加酷则会让一些比较高版本的欧文加函数和其他的欧奔加尔函数在使用上同样方便。所以我们需要注意的是,在这个图文键和加加点 h 是冲突的,所以 在包含之前不应该去包含 grgrdh, 而是这样子,所以再这样就错了。 好,记住了朋友们。好了,那么关于我们的欧分加当中的一个扩展,我就给大家介绍这里内容呢, 嗯,比较繁琐。当然如果对于只是学习欧喷加一个比较肤浅的内容来说,同学们把这点内容掌握住应该就足够了。 另外大家还是下去之后,需要去通过刚才我的代码自己去演示一下,然后看一下你自己的欧分加版本是什么,多看多写,然后多想,才能在写代码这条路上越走越宽。好了,我们今天的视频就给大家分享,这里我们下个视频再见。


好,那么接下来是举证与项链的乘法啊,那么非常的简单,项链可以理解为一个什么呀?啊,银行乘以一列的举证吧,对吧? 啊,银行称一列的矩阵。所以说你看啊,我们左边的 a 矩阵是一个三乘三的矩阵,那么右边的话,这样一个啊,小项链呢,可以理解为是一个三乘一的矩阵。那么他俩最终的结果呢?就是一个什么呀?是一个三乘一的矩阵吧, ok, 那么也就是一个项链好,它相乘的规则也非常的简单啊。那么矩阵的每一行啊,第一第零行元素与咱们的呃项量相乘啊,且相对应,相乘且相加。那最终放到这个结果的第零行里面。 然后矩阵的第一行与咱们的这个项链对应元素相乘起相加把放到了第一行里面, ok, 那么矩阵的最后一行就是 第二行乘,以当前项链的对应元素相乘且相加,放到了第三行里面啊,放到第三行里面, ok, 这应该叫第二行啊,咱们从零开始。好吧。 那么接下来我们看一下举证的转制哈。假设啊, avm 陈举证巴拉巴拉这些东西。那么说白了,举证的转制什么呀?行变列列变行呗。我们看一下这个例子就知道了啊,十二三十四四十五六十啊,这是第一行, 然后六十六零零。这第二行然后变成什么样了呢?变成了第一行,变第一列是吧?十二三十四四十五变成了第一列,那么第二行变成了啊,第二列就是仅此而已啊,这就是剧真的转制哈。那么关于其定义的话,咱们写在这里了啊,大家可以自己看 好。那么矩阵转至的性质是这样的, a 和 b 相乘得到的结果矩阵进行转至,那么等于 b 的转至,然后再乘以 a 的转至。 然后呢?单位镇的转至还是一个单位镇啊,不发生什么变化, ok? 那么最后我们介绍一下矩阵的逆矩阵哈。定义设 a 为 n 阶方阵,那么若存在另外一个 n 阶方阵 b, 使得 a 和 b 相乘,等于 b 和 a 相乘。最终的结果呢?都是单位阵的话,那么 b 就是 a 的逆矩阵。 当然同理啊, a 也是 b 的逆举阵是吧?所以说 a 的逆举阵,记住 a 的上面有个小负一哈, a 的逆举阵等于 b。 ok? 那么我们首先看一下很关键的几个点啊。首先 a 和 b 必须是啊,方阵啊,必须方阵。那若存在另外一个 n 阶矩阵 b, 也就是说可能会不存在,对吧? 所以说呢,啊,这个所谓的 a, 这个按揭方阵啊,他可能会有自己的逆矩阵,也可能会没有。 ok, 那么我们看一下逆矩阵的运算法则。 a 乘以 a 的 e 的, a 的逆乘以 a 等于单位镇,然后 a 和 b 相乘。那么如果它的结果呢?是有逆矩阵的话啊,那么 a 和 b 相乘,结果局阵的逆矩阵等于 b 的逆矩阵,乘以 a 的逆矩阵, 然后 a 的转智的逆举阵等于 a 的逆举阵的转置啊。好,这就是举阵的这个逆举阵的预算性质啊。我们后面呢,关于逆举阵 等等的这一系列的性质,还有咱们所说的举证惩罚啊,咱们都会展开给大家做更加深入的剖析。并且呢结合几何的性质啊,做出很多的一些推断。 ok, 那么咱们这节课先到这里。

q t 交互,那我们现在有一个窗口可以绘制图形,但是呢,并没有和我们 q t 窗口联动起来,我们以前都预留了两个,这个在 q t 里面叫 action, 我们可以理解就为按钮了。那这两个按钮如何去互动呢?我们首先想,这是我们自定义的一个类,对吧?里面可以绘制 open 主要的一些东西。那它必须要有函数吧,比如说我有这样的一个 function, 而且这个 function 呢,我们最好给它设成 public 的, 有公共的。那这样我就可以通过 man window 里面的 action 的 slot 进行对它进行调用。那比如说我点一下这个的时候,我就来调用你,因为你是 public, 我就可以调用你啊,怎么调用呢?我不是有 u i 吗?可以导到 u i 吗?那我找到 u i 以后,我就可以找到。呃,我们这个对象的名称叫什么来的? open open g l wechat g e t, 对吧?找到你以后,因为你是 public 的,所以我就可以调用你这个函数了。那是不是每一个图形我都需要设置一个函数呢?也没有必要。那比如说我们这个叫 draw shape, 那多 sharp trip 里面呢?我们可以加入媒体量嘛? 通过媒体量去区别,对吧?媒体量,比如说我们叫做 rect, 那这个媒体量就代表画个矩形,如果我下次叫 circle 呢?如果媒体量给的是 circle, 那我画的就是这个圆形,那用这种方式可能是比较好的。 好,大概知道该怎么做了,那就好办了啊。下面呢,这两段话其实是以前 ppt 里面那种,所以直接我就搬过来了啊,发现以前还写错了一个字,现在改回来了,那我们如果要在别的地方去触发,我没有讲绘字,我讲的是触发绘字, 那么应该怎么做啊?那因为我们在 pand gel 里面绘制的时候,一切他都帮你弄好了,那首先他会给你 make a current, 就内置有个这个,就他会调出当前的绘制状态。我们都 open, 就大的绘制大的这个状态机,你必须有个当前的状态,那么我这个 make current, 这个 current 的就当前状态的意思啊,在这之之内进行编, 进行绘制,绘制完了以后呢,其实他还有一个程序叫 downcurrent, 那待会我们自己写程序的时候,如果你并不是在像这些程序里面 去调用的时候,那么我们就要自己加上他,但把代码,把这些 open 区域的这些相关的代码,对吧?都都写在这个中间,然后你在外部的时候要生效你的这些触发你相应 这个状态的改变,那么你还要进行一个 update。 那所以呢,我们一般来说可以写个 make current, 然后呢写个 down current, 中间写相应的 open 句额的代码,那 update 写在哪里呢?你可以写在 down current 下面,也可以写在它上面啊,好像 感觉不到什么差别啊,总之他写在最后都可以啊,无所谓,因为他只是触发嘛。啊,要求我这个状态要更新,也就是说有相当一个 repent 这样的一个一个请求而已。 那还有一点,那我我这里写的叫什么叫做触发重新绘制?我为什么不直接在这里面进行绘制呢?啊?因为按照它的顺序来说,最终它还是会调用 pen geo, 而 pen geo 里面它会通过底色,我们以前 不受受过一个底色吗?他会清空你前面的绘字啊,如果我自己写一个,比如说写一个 joe 这样的函数,呃, joe, 比如 joe rack 啊,画一个这样的矩形,上面这个矩形,那你绘出来了,你有可能会被他给清空掉,对吧?所以我们不这样做。 好,那剩下一部分内容呢?就是我们上节课发现我们并没有做回收,因为上节课呢,我们是用了多个,然后呢?这是一个数组,对吧?我们一下是,那我们就可以通过这个代码 delete 这种代码,我们就可以回收我们的内存,包括我们这个 share 的 program, 也需要进行 这个对象的一个回收。好,知道这些以后,我们就可以开始来写程序了啊,我们看我们基于哪个程序来写 open, 这是我们上一节课写的例子,但我们不管他,那我们还是继续这个 ebo 程序来写。好了,那我们就需要进入下一张 shift up chap 零二,在这里面,那我们就是第二章的第一个例子,那我们这个例子叫什么呢? 嗯,我们的课程看看,看一下。那么叫 u i 好了啊,我们这个就叫 q t u i q t u i。 好,那我们这是第二章的第一个例子,我们叫 q t u i。 好,我们编译一下,先配置他的环境,然后我要给他一个编译 跑起来变异,没有问题啊,那我们跑起来看一下,这是我们以前的效果,做完 e b 呃,一 evo 以后的效果,那我们这两个按键呢?没有任何作用。那首先我们上节课的时候发现好像还有一些问题,我们代码对吧?没有虚构函数,没有虚构函数呢?我们这个问题好解决,我们只需要在这里面 给他做一个就可以了呗。啊? a f b。 好, 那我们这样就有了一个 sql 函数。在 sql 函数里面,那这个代 码是很很容易好理解的啊。就区域啊,迪丽特,你先把它敲出来。 buffer, 什么是 buffer? 我们的 vbo, 我们现在只有一个 buffer, 就是一个 vbo buffer, 对吧?那一个我们相当于是要回收一个,而这里面要的是你看他这要的是一个指针啊,所以我们给个地址, 这样就好了。还有 g l delete, delete airy 啊,怎么没有出来啊? delete, 我们直接在上面找,应该是能找到的。 vertic dairy 啊。啊? v a o 也是一个 v a o。 那还有我们的 program delete, 首先你把 delete 拿出来就好办了。 delete program, 那我们只有一个 shared program, say the program, say the program, say the program。 你看他报错了,但是他没有图,慢点, too many arguments 太多了啊,他不是要地址啊,他就是直接把他数字放过来就可以,只要你用了焗油。一个好的习惯呢,应该是要 make current, 但是我们这个好像我觉得可以不用啊,但是我看大家都用 一个 downcurrent 把它夹在中间啊,因为我们调出当前的状态,然后呢啊,退出当前状态, 因为这里面仅仅是为了回收,而且到了城市的最后有没有必要那我不知道,但是我看大家都加了,应该是有道理的,那么我们也加好了, 好不纠结。这里也没有深入研究,我们抛下看一下,应该是对我们程序没有任何影响, 那后面我们都可以把它封装成对象啊,直接通过对象本身的结构也可以。好, 那现在我们前面也讲了,我们肯定是要有,我们要有一个函数,而且是 public 的,别人才能调用你,那我们就这里就写一个,比如说就叫做 draw ship 啊,那是如果我们每一种 ship 都有一个就很麻烦,所以我们最好有个类型 啊,没要个媒体量就叫 ship。 那我们先是来一个 num, 用个首字母大写,然后呢 rect, 然后呢 c 口啊,写几个意思一下就好了。还有一个 triangle 啊,三角形拼错了也没关系啊,示意一下。好,有了这样的一个类型,我们用这个类型来决定画什么,那我们就叫做 ship。 我们这里面呢,还需要有一个 public 的成员哦, private 的成员,嗯,因为我们需要有一个量来保存,我们刀器要要画什么有一个变量,那这个就是 m ship 啊,为什么需要它?我们可以。呃,在这里面啊,在看我们 ppt 这句话,我们这里面只是只是触发重新绘制,并不是在 我们需要写的函数里绘制啊,我们把单码写出来就知道了,那么我们是在这里面是被触发的啊,我们先把这个,这是因为上节课的一些原因, 我们进行了一个特殊的排版,那现在我们给它排回来就好了。那这里面啊,我们用的是没有用 e b o, 其实啊,没有用 v e o 还是 e b o 啊? e b o, 没有用 e b o, 我们是直接他拿了这个拿了点, 那不管他啊,我们都保留这个,还是用一下好了。那这里面就不要,这个就不要了,对吧?不要清空它,那这里面呢,应该是用个 no 或者用个零,对吧?我们再直接再跑一下看看。 好,那么我们现在就调回了一个普通的状态。好,那么我们现在就要增加添加代码了哦,我们给他加个条件,对吧? switch case, 那绘制我们都放在这里面绘制,别的地方呢?只是进对你进行一个触发 啊,那么如果我们的 m ship, 它是等于我们的 rector 的时候啊,那么我们才进行这个绘制。 嗯,这样看代码好像是没有什么问题,对吧?但是呢,我们的接口呢? dy 的接口呢?没有写啊,那在这里 我们 diy 的接口,哎,写错了,这是生成到哪了?怎么生成到这里了啊?我们重新来把它拷过去应该也可以啊。那在这里 我们只要做一件事情, m ship 等于 ship。 好,那我们再看我们这个 ppt 里面,我们在外面吧,它不在 pad 就有里面,它在外面要触发重新绘制,所以呢,要再加一个 update, 我们这里面并没有调用任何 open 需要的代码,所以 makecurrent 和 downcurrent 呢,我们应该是不需要的啊。 update 或者呢,你也可以试一下 repent, 应该也是可以的。嗯,是不是拼错了? up update 应该没错。好,现在我们接口已经有了,这个接口有了,我们还得调用它。调用?怎么调用呢?那 q t 里面调用特别简单啊,我们 jorac 在这里面 go to slot。 呃,这个, 那我们就是 u i 点 open 这个位置的点 draw shape 啊,然后我们这里面,呃,就需要用到我们的 lay, 然后呢才能找到我们的 这个量,哎, rect 好才能有这个媒体量。嗯,应该可以了,我们试一下。那 现在是没有用,对吧?因为我们刚刚编映好,那我们再试一下。嗯,我们通过我们的 action 调用了它开放出来这个接口,这个接口呢是 public 的,那我们通过这个媒体量决定会什么图案。好,已经有了啊,这个清空呢, 我们用酶取量的方式,并且我们给了个 nun, 就是为了这样会比较方便。那这样呢?点 draw shape, 那我们以 i c by 多分区这个写个 nun 是吧?好,那我们再试一下。 那这里面我们还需要再增加一个新的按钮。好,清空会,清空,清空会。好, 那这两个按钮就已经有了,那我们再增加一个这个按钮呢?我们就可以叫做,呃,线框模式,线框模式,线框渲染吧。渲染这个叫 act a wire frame 啊,你要看一些国外的这种类似的图形的产品呢,它一般都有这个模式,叫 wire frame。 wire frame 就是线框啊,就 wire 嘛,就线啊, frame 框。好, 那我们也把它拖上去,然后这里面呢,我们给它来一个 checkable, 就是它会,它会摁下去,并且你既然能摁下去,我希望你摁下去的时候这个效果会不一样。啊,那我们看啊,现在如果我们什么都不做呢,看到这个效果就不好看, 好看啊,这个看没什么效果,对吧?按下去弹起来,那这里面我准备了一个样式,只是改变一个底色而已啊,这个应该是比较简单的。 那关于样式呢?在 q t u 跟,不是在 open g r。 呃,不是 open g r 啦,在 q t 五点九 c 加加开发指南里面那个视频里面有详细的介绍,或者你看看那本书也是一样的。 好,我们把第小段给他贴过去,就是当他被 check 的时候,对吧?在 check 状态下,这是子状态, check 子状态这种空间,只要被 check 的时候的底色就变成这样,应该写的很清楚了。 那么我们直接在最上层拉下来啊,这里面 style 里面给它加上这样的一个 style 就好了。 ok, 那你这样再跑起来呢,就会效果就会好很多了 啊。那关键的并不是这个,对吧?关键的是还是我们要写代码啊,这个你看这个效果就跟刚才比起来就好看多了,对吧?但是没有效,没有用。现在啊, 就跟上面一样,我们还是需要有一个你开放给我个接口才可以,但我们这个接口还并不存在。那么我们这里也是一样,我们就需要有一个 word, 嗯,这个呢,叫做 set wire frame render 吧,或者或者就这个就看它的 web frame 就好了。那有一个不果词,呃,叫做这个叫什么?叫什么呢?叫 y 吗?叫 mod 吧。 有一个 boss 就可以叫 mode, 好像还不大好,或者就叫 well free, 就这样好,那么我们总之是要开放这个接口, 那我们就根据判断了,如果这个 while freeing 是等于 true 的啊,嗯,那么我们就应该是 g l polygon polygo mode, 那有这样的一个函数,那既然要用这个函数呢,我们上面肯定也要是 make current 啊,那 polygon 这个什么呢?是 g l front front and back g l light。 嗯,好,接下来这个我们前面其实是讲过的, 这样呢,我们就可以绘出我们这种 wireframe 的这个线框的模式 else 呢?我们具有 polygon mode, 具有 front and back, 这个呢?是具有 for 吧,它的 film。 这个啊,就用填充是吧?呃,这个呢? down current 啊,改变了状态, 嗯,应该说我们这个就有了,对吧?然后我们这边在 men window 调用,这边呢,就可以调用你了,也是一样。 g i open witchet 点啊,不做了,这个就是 wire。 why a free? 没有吗? set while free 啊?对, set while free。 那我要给你个不稳值,这个不稳值就看我有没有 check 就好了呗。 the act 点 is check is checked, 对吧?那我们试一下,如果这个反了,我们再加个加个感叹号取个否啊?应该是没有反吧,试一下 好,画个矩形改变。咦,没有效果啊,没有 update 对吧?我们看一下啊。对,我们没有 update 它, 你改变了人家的状态,你没有 update, 它就没有生效啊,它没有重绘。那我们再试一下, 画一个矩形,线框模式取消啊,清空好,直接是线框模式。嗯,这部分呢,我们就相当于是互动就做完了。 那以后呢,有其他类似的互动需求也可以用这样的方法去做。总之我要在窗口里面啊,在我们的这个组件里面开放这个接口, 然后我们通过我们 ui 这种互动去调用你这个接口就好了。




那现在我们就可以通过我们的编码来实现三 d 效果了。首先我们看我们的需求啊,我们需求其实就是要有这三个矩阵在我们的顶点多期里面做这个事情,对吧?所以我们先把它考下来,我们总之需要通过 uniform 传三个四乘四的矩阵过来。 那我们还是基于我们以前的啊,把这个例子考到外面去啊,不对,没考到。 嗯,这样也不好啊,我们还得给他裁一下,我们新建一个,先 新建一个 chapter 五。 好,这个呢,我们也改成第五章的第一个例子。那我们就叫三 d 好了,因为以前我们毕竟都是二 d 的啊,虽然是三 d 啊,但看上去像二 d 啊,把它的配置删掉 啊,配置出了一个新的工程。那我们先跑起来看一下啊,我们上一上一节课是不是有代码需要修改呢? 那我记得里面是增加了一些处理啊,比如说这个地方就没有必要了,对吧?我们是让他眼睛往另一个方向看,那这个地方呢?直接用啊,用他就好了,这不重要,那重要的是。 呃,啊,这是我们现在的效果,是吧?我们画了两个,那我们把它改一下,先改成我们希望的样子啊,我们看我们的代码,顺便也算做一个复习。 我们在这里面画的地方是有两个,那我们删掉一个了,那把下面这个删掉,画一个就好了, 并且位移的话呢,我们也不需要去进行位移了, 那这样我们应该看到中间的,并且这个大小我们是不是可以给他。嗯,放的稍微大一点啊? 先展示,这样也可以。 ok, 然后他一直在那转 啊,先断的吧,先没事。那,那我们现在就先把我们的三个三个东西给它放进去,也就是这三个矩阵, 这是我们的点点多器啊,我们增加了三个 uniform 的变量,而且都是 mate 四的,然后呢?按顺序来,谁先成啊? 呃,按照我们顺序先是 model, 对吧? model 乘以泥,这个就不需要了啊,这个我们就可以删掉了。 model 乘以泥,然后是 view 乘以泥, view 成完了呢,是进行我们的投影了,那有这三步,我们应该说这一部分我们 就算做完了,对吧?在我们的顶点做的器里面,我们才修改完了,然后我们就要回到我们代码,首先我们要把 这个只改一下啊,我们有一个登媒 checks, 那个已经不需要了。现在 我们是不是都放在了画的地方呢?在 pant 这里面,我们找一下, 这里面有一个 matrix, 那画之前一定会设?对啊,设了一个灯, matrix, 那这个呢?我们就啊用这三个词啊,我们需要这三个字啊,我们先把它主要是要这三个变亮的名称,那我们写在这上面, 那我们第一个就算是 model 好了, model, 那这个也改成 model。 嗯, 呃,这个变量呢,我们就用 q matrix, 四乘四啊,四乘四。好, 那我们就有了四个单位矩阵,三个单位矩阵分别表示 model, view 和 project projection。 那首先我们的他变了, 那我们其他的几个也要给他传进去,那现在都是单位举证啊,单位举证 view 的,把单位举证传过去, projection 的也给它传过去。那我们现在跑起来应该啊,应该是可以用的吧,没有变化嘛。啊? projection 矩阵是单位矩阵,所以对你没有影响。 嗯,这个词我们就啊没有了旋转,那这就变成 model 了这个字。呃。旋转的时候我们希望往后旋转一点点,所以就不是这个,我们用 x, 呃, x x 轴往后躺,它是逆时针,逆时针是正,所以我们这个地方 他们我们先不用,我们先给一个固定的角度,比如说就负四十五度,那应该往后躺,但我们可以看到大小的变化, 越远离我们远的地方应该是比较小的啊。但是现在呢?因为我们现在没有透视投影,所以你虽然设置他往后倒应该是看不到任何效果,对吧?其实我们现在看不到任何效果, 好像跟你没有设置这个角度是一样的。那这个问题我们就需要通过增加增加他来,那好我们给他来一个 set 或者是说 perspective 啊,那 perspect 第一个的 angle 我们四十五度,那比例呢?我们 height 应该是歪 去除以 height 啊,然后看它的类型是什么返回类型, 它的返回类型呢?是 inter, 所以我们需要给它,要不就成零了,对吧?然后给它转成 float。 好,除了这个颜 以外我们还需要一个 neo 用零点一这个呢用一百就是两个两个距离。好,有了这个以后 我们再试一下。那我们按道理就应该有这个效果了啊。 view, 嗯,我们 view 现在在零的位置好像看不到东西了,对吧?那么 呃看看什么原因呢?是不是因为我们的 view 没有设置?那 view 我们也是需要位移一下的啊? view 我们只需要移动就好了。零点零,零点零 负三啊,为什么负三?我们待会再看啊,我们是希望把它,因为我们在你正 三的位置,所以相对而言所有的物体都要往负三的位置去,就像我在你的前面,你就在我的后面一样, 这个我们值,我们待会再看,因为我这三个值应该是已经已经传下去了, 我们再看,好就看见了,对吧?而且更远了,有没有发现他离我他变得更小了,他为什么变更小呢?因为我镜头离你更远了,本来你在零这个平面上,其实现在呢,你在三这个这个平面上,对于我摄像机来说 好,我们这个就显得太小了,对吧?那我们就给他改一改,都改成九好了, 然后这样我们可以显得大一点。 好,我们再来看一下,那我们先先把这个效果先跑起来,然后我们再来整理一下这个代码啊,有没有发现就是比较明显了吧?啊?我们按下下,下下下,是吧?这个就调整他们的两个的之间的比, 这个比较远端,那我们画一下这个远端的地方 用红色,明显这个比较短,对不对?那这里呢就比较长,那这个比较短 啊,这个远端的是因为它的 w 值就比较比较大,所以除完以后呢,它这个值就会比较小,好,已经达到我们效果了,对吧?那么我们现在只是 一个二维的,那不合理啊,这,这还是一个平面,已经有三维的效果了,他往后倒了啊,有了空间的这种感觉,但是我们箱子嘛,那个顶点要多呀,我们记得我们前面是有这个顶点的,把我们把这个顶点都烤下来,我们换一下顶点啊,我们要这么多顶点,这是三十六个点, 那我们就把它替换掉。哦,我们这些点 你也可以写成三十六乘五,不是三十六,对吧?必,必然是三十六乘五,然后你不写,他自动会帮你算 好。有了这些点以后,那我们画的时候呢,应该是就不能用它了,对吧?我们就不用你了,那我们就用 g l, 就 aries, 那我们的模型 也是 g l tri triangles, 然后从零画,呃,三十六,从零取三十六个点去进行画,那我们这样应该能画出一个箱子。 那还有个问题,他应该是设置一次就可以了,你每次都在这里设置,其实不合理的啊,那这个又是为什么呢? 就很明显啊,这个点乱了,是吧?这个门扩一点点去调,那这个地方我们最后调,因为我们的点现在布长是五,对吧?然后我们这里设置呢,现在布长还是八,所以这个地方要改,要改成五, 就只有五个 float 嘛,他们就每一组数据其实五个 float 现在,而且已经,嗯?怎么点到这来了? 而且这个已经没有了,对吧?已经没有这个颜色值了,那所以这个值也要改,这个地方很容易漏掉,所以一一定要记住这个地方很容易漏掉啊,这个要改成一, 然后大家的步长都是一样的,都是五,都是五,然后一,我是我的属性是零,打开是零,我自己有三个,我自己有两个值, 我的纹理坐标是两个字,那我的位移是三,因为前面的三个字啊,是我位移,那我是第一个字,我前面什么都没有,我就是零, 那这样应该是比较合理的,那么看看我们的顶点多期里面有没有相应的调整,那也需要这个,这个就没有了,对吧?那这个就没有了。那我这个就是一,那我这个是一,那这个也就没有了。 嗯, alt color 的话我似乎也就不需要了。那我这里面的也有 alt color 吧,那这个我也不需要了。好,我们这样跑起来看一下,是不是就有一个立体的箱子出来了, 应该是可以的啊?啊,确实是有个箱子出来了,对吧? 但是还是有问题,你看它里面并没有遮挡住,是吧?那我们一步一步来,那我们先改变一下我们这个代码,我觉得这这个地方我很不舒服,那他怎么应该他不应该在这里啊?你说摄像机每一针的位置可能会变化,对吧?这个我们后面会会讲啊,我们现在这个相机位置设的太简单了, 那包括为什么是负三,我们现在没有讲清楚,我们待会要解释一下。你说他的位移啊,物体的位移,这也 说的清楚,但是你不至于每一针调去设它的 projection 吧?这个地方不合理。那所以呢,我们应该是我们觉得在在这里设置一下比较好啊,我们把 projection 的东西这个矩阵相关的,我们都设在别的地方, 那他的投影矩阵是这样算的,对吧?那相当于我去问你,你给我就好了。都是叫问函数吗?啊?你这个类,这个对象他有这个函数,他可以啊,有这个对象,他有这个函数,你只要把参数填好,他就会给你这样的个矩阵啊,就去覆盖了我现在的这个矩阵。 嗯,现在看上去应该是可以啊,那这样的话我不需要每一次每一帧都去算它了。那如果我们待会再启动一个 timer 去要绘制的时候,那现在 效果是一样的,对吧?至少我们优化了一下我们程序,但是你为什么感觉没有盖子一样呢?按道理是吧,这不应该不应该是这样的啊,那我们怎么去解决这个问题? 这是一个透明度的问题啊。啊?不是透明度的问题啊,这个是因为我们没有深度测试所以没有,就这里啊,没有跟我们遮挡到 加两行代码就可以啊,其实很简单。那我们待会呢再看右手坐标器,要解释一下我们为什么设成负三啊?不是三,在 open g o 里面它会有一个缓冲区,它会为每个顶点有一个深度值,也就是一个 z 的值啊,你就离我的屏幕到底有多远,就有点像那个 w 那个值,对吧? 你越远那你就越容易被前面的给覆盖,当有冲突的时候那我就取前面那个,对吧。啊?但是你要开启这个功能就好了,开启就是 g o n m。 那这两条是不是很像很像?我们前面用过的其实就是一样的代码就是我们的。 呃 clear 这个缓冲嘛,就是我们背景颜色不是通过设置一个颜色生成的吗?那我们再复习一下,我们以前讲过 go 有两个他的,就我们 go 函数有两种,第一种是设置状态,第二个是使用这种状态,对吧?我们把这两个 考下来直接找到,好像就在我们虽然现在有很多代码,但是如果我们了解原理的话,现在代码其实还是蛮清晰的,并没有必要对他进行重构啊,就在这个地方啊,那我其实覆盖你就好了。那我又打开了一个缓冲 区,那 clear 的时候,我用到了你上面这个颜色,就是这个颜色。我同样我用到了,用到了你的功能啊,就清空嘛,就把你这个清空。你这不是每一个点都会有纸在里面,然后每次我都把你这个点给清空掉, 那我们现在再看,那这个箱子就应该是我们真正 想要的箱子了。好,我们通过点上上上,就点下下下好了。啊,好,看到吧,这就是我们想要的一个箱子了,那我们还可以让他转起来, 因为我们这个 timer 以前我们都已经做好了它,实际上呢,你只需要把时间考虑进去就好。那这个是时间,这个里面呢,要一些,用的是毫秒,那么我们给它 rotate 啊,旋转,那 旋转就不要四十五度了,我们给它直接一个四十五度。不好,那我们给它一个 time, 直接通过 time 来旋转。但你这样只能围着一个轴旋转,其实你 这个就是一条一个方向吗?对吧?你围到这个轴旋转,任何的一个项链,不管你几围的,其实都是一条直线,你围着这条直线去旋转,你现在围着 x 轴旋转,那么我可以给你几个字啊,比如说我这个也可以啊,无所谓啊,你大于一也是可以的,比如说我这个零点零点五, 总之这是一条直线,你就以他为走进一旋转,那这个效果可能会更更符合我们的期望一点,更有三维的这种效果。 好,你看他的旋转是不是有点有点这个意思了啊? ok, 总之已经达到我们的预期了。那我们看先解释一下我们这个右手对标系,关于右手对标系上面这一段你都不用看,其实就描述了这个坐标,这个 z 是朝我们的,而摄像我们的正正直, 然后呢,你应该停格下来,然后按照这个顺序去做一遍,你就可以知道为什么叫右手嘴巴细了。那这里面要搞清楚啊,因为我们呃像底料 dx, 它用的是左手嘴巴细。但是要注意的是呢,因为我们是实际操作的时候都是以摄像机为准,那所以什么东西都是反的。 那你看他的这句话,在标准化设备中, open 九 s g 也是左手多拍戏,那投影的时候,投影举证的时候啊,转换了这个右手多拍戏,那是不是因为跟摄像 机有关?那我刚才说的我也不知道啊,我猜的。那总之设备里面是左扫描机,那我们平常用的时候呢?是啊,右手左边写,那记住这句话就好了。 那我们的摄像机我是把它放在想放在三这个位置啊,一 z 二三三这个位置,对吧?我们摄像机放在这里,那我摄像机放在这里,但我们说了我们是以它为零零的,那是不是 z 这是 z 正的,那这个点对于摄像机来说,他是不是就是负三了?在这轴上应该是吧,那这边是正,这边是负嘛?那所以我们这个点就设成了负, 这个设成了负三,也就把场景的所有东西,我希望是往后往后推,那我最终我这个不是作用于 这个点的吗?是吧?总之你上完了以后还是一个一个位置值吗?那我是希望你往后退三三,因为我,我是零,我在你的山,你就在我的富山啊。 好,那我们再看下一个我们要做的例子,那这部分呢,应该就就没什么了,那我们看,我们如果需要多个立方体呢?好, 我们写个破循环,多用几次它就不可以了吗?那值,我们这里面用了一个 q rect, 在这个 rec 容器里面呢,我们装了三个啊,装了十个, 十个位置值。位置值,我们用的是 q vact, 三 d 其实就是三个词啊,就是一个 rect, 然后我们把这个也放在某个位 就好了。放在这里,好,那我就可以便利你了,对吧?我们的 for 循环,那我们在画的地方,这个地方我们就可以改一改啊,我们就可以写个 for e 去 for each, 我们自动去获取它的类型就好了。啊,那我这是一个 vector, 我去便利你, 那便利你最终的目的还是进行绘字,对吧?我们就肯定是要绘字的,那这两个字啊,主要是 model 的字, 我这个字我反正我就算一遍,我们先先不拿进来,把它拿进来,拿进来之前我需要算,要计算,那我们把它两个算的过程,以我这里的顺序不重要,对吧?我们 们顺序真正执行的顺序在顶点桌器里面已经定义好了。我,我只要传给你就可以了。传的顺序计算的外面的 cpu 这边的顺序是不重要的,所以我们就可以任意的写啊, 那我需要移动它,那移动到哪呢?哎,这个是就是我们要的值了, itunes, 对吧?我这个 itune 就是一个坐标啊,我移动到这个坐标去。好,那我们再来试一下, 应该是可以啊。啊?每一个都在旋转,嗯, matrix 啊,我们这个名称变了, 看看有没有什么问题。 um 每一个都在旋转,但是为什么整个空间也在旋转呢?确实已经多出了很多个,对吧?但是中间这个在中间,那旋转的时候我们看一下是不是我们写错顺序了?没有错啊,先旋转再位移。 嗯,这里呢,我们放了一个很常见的问题,因为每一次我们这个 model 都在变化,在累加,对吧?我进来的时候我是一个单位举证,然后算完以后他会接着算。所以呢,每一个 破循环我都应该去给你设置一下。那 identity 啊, proceed to identity, okay, 那这样每一次进来的时候我这个 model 都是一个单位矩阵, 呃,犯了一个很容易犯的问题啊。 ok, 那现在就好了,那我们这有十个矩阵在这里瞎转悠,对吧?然后我们可以通过去改变他的这个覆盖颜色的这个融合的比例。