GAMES 图形学系列笔记(一)

01.游戏引擎导论 | GAMES104-现代游戏引擎:从入门到实践 - P1 - GAMES-Webinar - BV1oU4y1R7Km

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hello,大家好,欢迎大家来到games104,现代游戏引擎的理论与实践,很开心啊,今天我们可以开始这门课程,这门课我们已经筹备了非常久了,这一直以来是我们的一个夙愿。

我们特别希望能写一个系统性的课程,能够教大家如何去构建游戏引擎,一步一步的去创造出这样一个神奇的世界,因为游戏引擎它是集结了现代计算机科学,所有的最前沿的技术,他很像是皇冠上的钻石。

而这个技术它最终支持的是什么呢,我认为是未来构建黑客帝国,那么这门课的话呢,其实是一个非常系统性的课程,我们将用20多几个课时的时间,带着大家一步一步的去领略,这个用人类计算机科学构建出来的。

这样的一个奇迹,那么首先的话呢介绍一下我自己,那个实际上我的背景非常有意思,我本科是就读于浙江大学,我是在CDCG实验室,那个是很老牌的中国图形学的这个圣地吧,然后呢我研究生的时候去了清华。

在清华的同时,我去了微软亚洲研究院,在那个时代是一个非常热血的时代,就是是我们一群中国的科研的小伙子们去,在那个老师的带领下,去挑战西瓜,去挑战全球最前沿的这样的一个图形技术研究,我到现在还记得。

那个时候我们被关在那个小黑屋里面,然后跟我们讲说,你们是中国科研的国家队,你们并不比STANFORDMIT的学生笨,那你们去一起去冲击那个顶级会议的论文,所以其实那个时代给我们铸就了一种一种信念。

就是说如果我们努力,如果我们去真的去啊用功的话,我们也可以做出世界顶级的东西,那么其实在那之后的话呢,我本来认为我的职业路径一直是走这个,就是啊学术,但是那个时候发生了一件事情。

就是2004年虚幻三的引擎面试,当时整个行业都被震撼到了,因为那个时代真正让大家见识到了,什么叫次世代,然后那样的一个精彩的光影细节,我我身边的朋友知道问我说,哎王希。

你能不能够就是也做一个一样的东西出来,那这里面有什么技术,你们会不会不会做,当时我看完之后,我觉得哎这些技术好像我们都会做呀对吧,因为你做完research,你会认为所有的系统它无非就是算法。

每个算法我们都知道怎么去做啊,但是的话我会那时候在想,这是为什么我们做不出这样的一个,大型的系统和平台,所以当时也怀疑这个问题吧,我那个时候就决定说啊,不再去做research而去干嘛。

去针对到工业区去看,所以那时候就决定离开那个研究院,跑到那个美国去参加那个bta studio,那到bug studio的时候呢,实际上对我来讲是一个非常interesting journey。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在BG的话呢,实际上我用了大概5年时间,参与了两啊四款游戏吧,黑O3hero o d s t halo reach,以及这个destiny就是命运这四款游戏的研发,特别是在班级的最后3年。

因为那个时候我们在做下一代的游戏引擎,大家知道最早黑龙用的是自己的in house引擎,但是等我们决定启动做命运的时候,我们会发现就是这个行业发生了巨大的变化,游戏引擎。

我们要跑在一个完全不一样的计算机的,软硬件架构上面,因为那个时候我们会面临多核的时代,还有一点就是过去我们做的是单机游戏,那未来我们要做的是什么呢,是可以在线上,无数的玩家可以互联的这样一个游戏。

那么它的体系结构需要发生这样的一次革命,我在美国整整啊呆了5年吧,那个时候我毕业的时候,我觉得哎我我可能是这个又学了一个PSD,其实刚去的时候,这个转变是非常非常大的。

就是也是我今天开学这门课的一个很大的原因,就是说我们的同学,可以在学校里学到很多的算法,计算机科学的基础知识,但是我们有了这样一些算法,我们可以发顶级的paper,和我们作为一个高水平的系统。

这之间的差距到底是什么呢,其实我刚去美国的时候,我就想想回答这个问题,跟大家分享一个小故事,就是那个时候我在微软研究院的研究院的时候,我还自以为自己编程还可以,但是呢等我到了那个班级的时候。

我的前半年几乎是没有办法往那个引擎里面去,check任何一行代码,为什么你必须要理解那几百万行的那个系统,它是按什么逻辑,什么架构做出来的,所以今天那个halo3的纪录片中,中间还有一个我的镜头。

就是他们早上六点钟跑去在拍摄,那个就是早晨大家上班的样子,结果等他们摄影摄制组到了,我们的工作室的时候,发现有一个人没有走,然后我就趴在桌上睡着了,他问我为什么没有走。

我说我的feature还没有check in,所以在黑龙三的时候,那时候我记得我做的是那个可交互的水体嘛,其实那个系统的话啊,还是非常非常有意思的一个系统,所以我在讲就是其实用整整两年的时间吧。

就是我自己亲身经历的,就是如何从一个ARGUAGEAGORION算法feature,到一个真的系统的变变化,所以10年前也就是2011年,那个时候我决定从美国回来,就是啊创立了不明团队,为什么呢。

我觉得中国有很多很聪明的人,但是呢我们没有人愿意聚集起来,去做一个比较复杂的一个系统,真的把这些聪明,这些系统这些东西集合成一个system,因为算法和系统是有本质区别的,就是算法是这样的。

就是说我有个很酷的idea,我花几个月把它实现了,然后呢我就能发表一篇paper,这个周期是很短的,大概六个月左右,但是呢如果你作为一个系统的话,首先你要接受非常良好的,这个就是系统工程的训练。

知道一个大型软件系统架构的,而且另外一个就是你需要知道你的特定系统,怎么下,当我们真的开始去架的时候,很多时候可能是一年时间,你什么都看不见,所以啊我们这一次的话,就是说今天的话也非常开心。

有这样一个机会,就是通过games104这个平台的话呢,也是把我们的毕生所学系统性的整理出来,也是希望有更多的,就是同学们会对这样的东西会感兴趣,那么今天的课程我们讲的是什么呢。

是现代游戏引擎的那个理论与实践,其实游戏引擎它是为什么服务的,首先是为游戏服务的,对不对,那说起游戏的话,每个同学都应该是非常的熟悉,我们今天这个时代,我相信未来的时代一定是一个gamer的时代。

就是说啊哈我我相信游戏会改变世界,那么这是一个让我热血了,整整20年的一个行业,那这里面的话呢我们讲了一段视频,其实我们的编导组织玩这个视频的时候,我有一个小小的抱怨,就是为什么就只有情绪,没有老头环。

难道你们觉得老头环画面不够好吗,所以说其实我每每看到这个视频,我都会很激动,但是老头还没有做进去,我的机动会稍微少那么一点点,那么其实游戏它最奇妙的一个地方是什么呢,就是每个人都很熟悉。

就像你身边的手机一样,每个人都会用手机,但是有多少人能意识到,就是说其实在一个小小的手机里面,集成了全世界最前沿的半导体技术,最前沿的材料技术,最前沿的计算机技术,对不对,其实游戏你看到的每一个画面。

每一个细节,他都是在计算机里面用零一去模拟出来了,大家想象一下,如果我给你一个体育场,几万人,每个人手上举个牌子,可以打出不同的颜色,然后我说OK,我给你们每个人写一套算法,然后听我的指令。

这个时候你在那个体育场上看到的是一个,能跟你互动的画面,而且越来越真实,这件事情大家如果仔细想想,它其实是非常amazing的,这就是为什么今天我们去说啊,一个游戏做的好,做的不好,有这样的细节。

那样的细节我们会讲起来非常的轻松,但是真正的能做出一款游戏,它非常的难,它几乎集成了computer science,就是计算机科学里面几乎所有的知识门类,它本身的复杂度就是一个操作系统。

所以我们我们我认为就是说游戏,实际上作为虚拟现实,是作为现代计算机科学的一个,非常核心的一个应用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而且这个应用的话它的技术含量也是最高的,那么游戏引擎的话呢,就是我们讲的这个皇冠上的钻石,因为它是躲在下面看不见的东西,其实中国的话我相信有将近几亿的游戏用户,对不对,那么会做游戏开发的人。

我觉得应该有几百万,很多人学会哎呦,我我会用unity,我会用ARREAL,会用一个游戏引擎,但是呢会用游戏引擎是你学会了开车,但是今天我们再问一个问题是,中国有多少人会造车,而造车的话。

你就需要知道怎么去造发动机,发动机的底层工作原理是什么,它需要什么样的一些技术,是有什么样的问题,什么样的这个材料,所以你会发现越到核心的东西,即使不止在中国,在全球真正做这件事情的人就会越来越少。

所以呢game engine,它是实际上是我们这个行业的皇冠上的珍珠,而且呢它的技术壁垒也是最高的,而且这个它是一个就是技术和这个设计,的一个结合体,所以的话呢。

这也是我们games104课程的一个设立的,一个核心的目的,那么哇为什么我们要学习游戏引擎,这个问题其实非常有意思,刚才我看到同志们弹幕里很多人在外面说,哎我是不是要学很多其他的课程。

我才能够去上这门游戏引擎课对吧,然后呢还有同学说哎我如果不会C加加这个课,我是不是上得了,这个其实是我们当时在设计这个课程的时候,我们很重点的在想的一个问题,就是说呃我简单来讲一下,我们立个flag。

就是我们尽可能在整个课程中讲人话,也就是说并不一定需要,你有非常非常多的计算机的编程开发的技术,但是呢你学完这门课程的时候,你会对这样的一个现代的一个大型软件系统,架构有一个基本的一个理解。

为什么这件事情很重要呢,这就是我特别想跟大家分享,为什么我们我很愿意去做这门课,跟大家分享一下游戏引擎的底层架构知识。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为我们相信下一个时代,将会是用游戏引擎技术构造的,一个虚拟现实的一个时代,就大家今天看到的很多东西,其实它背后底层用的技术都是游戏引擎技术,比如说大家非常这个现在越来越火的,叫虚拟人技术对吧。

这是我们那个虚幻引擎的meta human,也就是在过去的这个10年到20年,在游戏中我们对人的皮肤的3S材质,我们对毛发的simulation。

对这个人物的这个procedure的agent做的越来越好,像这个鹿鸣大家是不是觉得很好看对吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么大家想象一下,未来以后,我们打开我们的支付宝,打开我们的银行终端,你跟你交互的,他都是个虚拟人对吧,他可以去啊观察,你会给你交互,让你觉得这样你的一个小助手,那这样的一个技术它背后就是游戏引擎。

而且未来的虚拟人,会越来越多的进入到我们的生活,所以这里面的话,当我们做越来越多的虚拟人的时候,我们有没有想过我们背后用的是什么引擎,那么引擎这件事情到底重不重要,那么另外一个很大的领域是什么呢。

大家可能想象不到,就是影视行业,这是那个HOLYWOOD,用那个就是游戏引擎,在一个巨大的LET平台上形成了一个虚景,然后这样演员可以对着它进行拍摄,所以今天我们在就是很多广告,或者是电影里看到的场景。

它其实是用游戏引擎基础渲染出来的,这和传统大家理解的那个offline,就是这个离线的渲染农场的方法,已经又不一样了,这样的话我们的导播,我们的导演可以在现场调整光照,调整布景,那么第三个的话呢。

就是说军事模拟其实大家知不知道,就是我们每世界各国,各国都在用游戏引擎技术在训练他自己的军队,因为只有游戏引擎能够提供,这么真实的这样的一个场景,大家想象一下,我玩的很多这个战争游戏。

是不是它就是一个战争模拟器,就是无论你是这个步兵还是开车,这个坦克车还是开着飞机,其实他都需要最前沿的引擎技术,帮助大家去,这个就是身临其境地演练你的战术,去检测你的战法。

其实这件事情的重要度现在已经是越来越高了,因为现代化的战争是越来越复杂,是系统对系统的对抗,那么另外一个很大的领域的话,就是数字卵生这个概念,我相信同志们可能最近听说过一些非常啊,hot的概念。

比如说工业4。0啊,工业数字数字化呀,那么这个背后有一个很热门的概念,叫做数字孪生,包括最近大家一直在讲的元宇宙,那么其实数字卵生的话呢,我们可以认为就是说,它会把现实世界的很多东西。

把它虚拟化的表达在计算机世界里面,这样能帮助我们更好的去理解,更好的去管理,更好地去构建未来的世界,那这里面我举个简单的例子吧,比如说我们现在最热的这个无人驾驶,其实所有的无人驾驶车99。9%的。

它的驾驶旅程其实是跑在那个游戏引擎里面,因为我们不可能把车子在路上开10亿公里,所以这个时候我们就要用游戏引擎,模拟各种各样的下雨啊,各种各样的路面的情况啊,包括行人各种异常的情况。

那么另外一个的话呢就是下一代的,比如说车载系统,其实它的人机交互界面背后用的全是游戏引擎,这样我们才能看到那么漂亮的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

立体的这样的一个界面,所以这就是游戏引擎一个巨大的价值,那其实这个一切呢,这也是为什么我们开始这门课的,一个很大的原因,就是我认为就是在未来的10年到20年,每个人都多多少少需要知道一些。

这个虚拟世界是如何构建的,而且这个虚拟世界最重要的一个foundation就是game engine,那么我们开始这门课的话呢,这一趴我们就先讲一下这个游戏引擎的历史,就是一切都是从最原始的时代开始。

其实我们这个行业game行业其实非常视频,游戏行业非常的短,大概只有50多年的历史吧,那最早的时候其实这个行业最早的时候的话呢,我们的机器很简陋,这个机器我不知道有没有同学玩过叫红白机。

那上面有很多我们童年的快乐了,比如说魂斗罗啊,比如说这个这个马里奥对吧,大家都觉得特别特别的经典,但是在那个时代的话呢,实际上没有游戏引擎的概念,游戏都非常的简单。

然后那个时候最开发游戏最核心的能力是什么,是我如何把一个复杂的这个元素,把它放入到一个非常小的,比如说40KB的这样的存储空间里面去,那么这个时候大家如果去看那个就是啊,任天堂的有些报告,他会告诉你说。

那个时候为了节约资源,我一个云彩,我把它变个原神,比如说把白色的云彩,这张贴图变个颜色放到地上,它就变成一个草丛对吧,作为一只小乌龟,我把它正面反面来回播放,已经看起来了,小乌龟在地上走,其实那个时候。

其实做游戏是一个非常有趣的事情,我记得以前啊我在美国工作的时候,有一个微软的这个副总裁跑过来给我们做报告,他告诉我这么一个事儿,他说他说啊,我在我加入微软之前,我一年做了四款游戏。

所以在那个时代当时我们就听傻了,因为我们是几百人对吧,做3年才能做一款3A游戏,在那个时代,他一个人20多岁就能做这个四款游戏,那为什么呢,因为那个时代的游戏非常的简单。

那个时代其实我一直认为是游戏的黄金年代,就是大家有很多很多的创意野蛮生长,就有点像那个寒武纪生命大爆发一样的,就是那个生命会变得各种多种多样的姿态,但到后来你会发现现代生物它越来越集中,越来越。

比如说轴对称啊对吧,一定有两只眼睛,两个腿啊不对,这里面讲一些生物学的概念了,那就随着这个系统的演进,我们会发现它有一些变化,那第一个提出游戏引擎的人是谁呢,那我觉得这里面我一定要去这个提这个john。

ta对吧,就我们我们传说中的叫卡神,他绝对是啊,我们这个行业里面,我认为是这个教父级的人物吧,直到今天,他还在这个为FACEBOOK的那个奥特莱斯在努力,我其实最近刚刚听了他的一个报告。

就讲那个VR的这个这个这个虚拟现实的东西,我我还非常非常的就是崇拜和敬佩他,就是说他还是那么谦卑,而且那么多务实在讲一些具体的东西,但其实他是个非常睿智的人,就是说在那个时代,他是最早做了一款游戏。

叫wolf step,就是重返德军总部,如果小伙伴们关心游戏的话,知道最近好像有一款重置的3D版再次上线,那么这也是这个非常经典的一款,就是可以说是开创了FPS这个时代,就像我们在做游戏的时候。

我经常跟我们团队在讲,就是说大家千万不要被现成的东西给束缚住,因为有的时候比如说今天我们要游戏从业者,我们会说哎呀,这个我要做一款什么什么类型的游戏,但是其实啊任何一种现在我们看见的游戏类型。

都是被一款产品给创造出来给定义出来的,所以说未来世界,我觉得会有很多新的引擎会出来啊,新的游戏类型会出来,而在那个时代的话,世界上没有一个物种叫做游戏引擎,但是john kmart他看见了一个东西。

他说诶当我在写各种各样的游戏的时候,中间有很多的代码是可以重用的,那么这些宠物的东西我能不能抽出来呢,我要不要把它定义成叫做一个game engine的东西,所以呢这个老哥就说干就干。

然后他做了第二款游戏,那也是经典中的战斗机吧,就doom,doom的话,诶我忘了中文叫什么名字了,反正到现在doom还是一个非常棒的一款,这个这个射击游戏,那么doom的话在做doom的时候。

他把doom里面的核心代码变成了一个游戏引擎,然后这个引擎呢他授权给了另外一家公司,另外一家公司做了一款游戏,叫做shadow caster,就是这个阴暗影魔施法者,这个游戏我居然在商业上成功了。

所以如果说我们今天在学习游戏引擎的话,我们会认为ta的这个doom的引擎抽出来,应该是全球的第一款的游戏引擎,而且很幸运的是,第一款引擎商在商业上就已经成功了,不过今天我们这个课程叫什么呢。

叫现代游戏引擎,那么从早期的游戏引擎啊,大家只是意识到说诶我只是一些代码的共用,但是真正的现代游戏引擎的概念的话,我认为还是从quick时代开始,但是这个quick实际上也是卡马克大神的。

卡神的这个作品,那么我相信很多小伙伴,那个可能是听说过他的如雷贯耳,但可能没有没有没有玩过,在那个时代,quick的话是最经典的射击,而且呢是对战游戏,那个如果讲一个就是很有年年代感的东西。

就是quick一个很著名的叫做火箭跳,就是你可以拿这个RPG对着地上去轰,然后呢反作用力会让你跳的更高,那个时代给我们创造了无数的快乐,而且它是第一款系统性的研究过,就是联网对战下。

这个网络怎么去同步的,这样的一个一个一个游戏,而quick的引擎的话也是那个时代真正的经典,那为什么会出现这样的一个质的飞跃呢,这里面不得不讲一个划时代的东西,出来了什么东西呢,就是显卡,显卡。

今天的话同志们,如果你们喜欢打游戏,如果想做游戏开发,每个同学每天脑子里心心念念的是哎,我的那块3080什么时候能到对吧,现在肯定是买不到了,那么其实在最早的时代,其实游戏计算机是没有显卡的。

直到很后面大家才意识到说,图形运算和这个逻辑运算是不一样的,图形运算是大量的向量运算,而且有大量并行化的运算,所以说如果我拿CPU去做图形的话,很麻烦,所以第一第一代的显卡五度显卡出来了。

而quick呢就抓住那个时代,所以他做了第一代的这样的一个3D的游戏,当时他的画面,他的沉浸感,实际上是震撼了那个时代所有的玩家,到今天啊是很多人在讲那个FPS游戏的时候,都会讲一个东西叫做什么呢。

叫做晕3D,我不知道我们的这个同志们,有多少人是晕3D的,我知道有很多那个玩家是晕3D的,就是打着打着就会to了,那如果你想了解什么叫晕3D的话,我强烈推荐quick,基本上是包你这个当场就可以吐出来。

那么但是的话呢,确实他创造了一个前所未有的这样的一个体验,所以这里面的话呢我们会跟同学们讲一个概念,就是游戏引擎为什么会越来越发达,而游戏引擎会越来越重要,其实这里面讲一个核心的一个关联度啊。

叫做硬件的发展,其实在那个时候我我们在思考,就是说啊,我们这个技术平平台的driver到底是什么,我一直认为是硬件的发展,我们以PLAYSTATION为例的话。

第一代的PLAYSTATION它的算力值有多少呢,只有0。06个GBS,那么一直到P2P3P四到我们现在的PS5,那PS5的效率是多少呢,十个ta flos,那所以就意味着。

就是说算力整整提升了20万倍,那么当你有了20万倍算力的时候,这意味着什么,同志们很多很多的这个就是游戏从业者,包括我们很多玩家会说哇,太棒了,我可以做一个很棒很棒的东西出来,对不对。

但实际上这个从软件工程上来讲的话,这是一场巨大巨大的挑战,因为随着你的计算机算力会越来越丰富,越来越强大之后,你的系统就会越来越复杂,那个就是你所表达的这个效果,你说你涵盖的这个就是模块就会越来越多。

这就像那个操作系统,最早期的时候操作系统谁都能做,对不对,会很多人都能做,但是为什么到现在,操作系统只有极少数的这个公司才有能力做,为什么呢,是上亿万行的代码,那同样的就是像游戏引擎也是这样。

早期的游戏引擎其实是非常非常简单的,但是到现代游戏引擎的时候,动辄就是几百万行到上千万行代码,而且呢里面的算法非常的复杂,其实游戏引擎的算法密度是非常非常高的,而所以呢经过这将近30年的发展吧。

从九几年开始,今天我们可以看到一个非常丰富的,游戏引擎的生态,大家非常熟悉的这个虚幻引擎,unity引擎,还有前些年其实非常厉害的,就CRYTEK引擎,这些年稍微有一点有一点点,那个就是说掉队吧。

然后呢,其实这是我们非常熟悉的一个商业级引擎嘛,但实际上全球的游戏大厂,比如说像育碧啊,像那个那个ea啊,像那个就是这个啊,包括威慑啊,都有自己的游戏引擎,比如说大名鼎鼎的寒霜引擎,对不对。

如果大家如果你是一个FPS游戏的玩家,你一定知道战地这款游戏,他那种开阔的战场的感觉,那这就是寒霜的这个巨大的,这个这个能力的表现,那么那个ENVIL就是说铁毡吧。

铁毡引擎是那个我们大一必做这个刺客信条的,虽然说EB的游戏我总觉得有点塑料,但是不不妨碍他的引擎确实做的非常的好,那么刺客信条里面,我这里面就是大家很著名的一个案例,就是说巴黎圣母院对吧,以前是非常棒。

大家都可以访问,当一场大火发生之后,我们只能够在这个就是刺客信条里面,去感受和体验一下巴黎圣母院的那个盛况,所以呢包括像那个威慑的这个这个source引擎,那么同时也包括一些就是免费的引擎,大家知道的。

比如像ta呀,像这个就是说armory啊,像这个的高ta,但是呢这些商业这些免费引擎呢,目前我看了一下,主要是以轻量级的休闲游戏为主,比较偏2D的啊,偏这种简单的游戏,真正到这种复杂性来讲的话。

和这些大厂的商业引擎和商引擎相比的话,还是有些差距的,那么同时的话呢,就大家去理解这个引擎的生态的话,其实不仅仅是引擎中,引擎中间内部的东西,实际上是随着游戏行业的发展,我们会发现有些东西它非常的复杂。

比如说物理运算对吧,早期的游戏引擎里面都会自己写物理的,比如说结算器怎么去做物理碰撞的检测,但是后来大家发现这个问题越来越复杂,就会出现专门的就是做物理的这个模块,我们叫做MITA表,叫中间件,中间件。

这里面包括比如做物理的ta和physics对吧,还有专门做声音,其实在游戏里面的声音效果是非常非常重要的,比如说你们去玩一个恐怖游戏,走进那个房间,你听到那个声场脚步的回声,对不对,当你去打仗的时候。

一个炮炮炮弹在你旁边爆炸,你听到耳鸣感,这些是有专门的声音的引擎,比如说像wise啊,像f mod,那么还有包括像那个做这个自然的植被的,做光照的强大,名鼎鼎的speed tree,那他是做什么呢。

做这种很漫山遍野的树木,大家知道就是有一款游戏叫指环王,指环王的话,当时他的那个场景哦是阿凡达,我记得好像是阿凡阿凡达,他做那个茂茂那个茂密松松的外星星球,其实用的是speed ta的这个技术。

那么mito while的话呢,这里面多说一句,就说mito well公司总是会不停的爆发出来,但是呢一般生命周期都不是很长,我们经常开个玩笑,在业界里也会说,就是中间件公司最好的归宿。

是被某个游戏大厂或者游戏引擎大厂,也说过了对吧,所以的话呢就是,但是其实它在整个游戏引擎生态里面,扮演了一个非常重要的一个模块,所以啊,OK我前面简单的把游戏的这个历史介绍了一下,同志们有没有什么问题。

啊哈哈,同志们说要收购,你们是想把虚幻引擎收购了吗,啊行那我们就接下来了,进入到我们这个啊课程中生哦,过程P啊,你讲的是那个就是那个PCG对过,我后面会在课程中谈到,就是那个就是啊就是内容生成的。

这个就是或者叫场景生成的这样的一些中间件,其实这项目中间件其实蛮多的好,那接下来的话呢,就是我们进入到我们课程的正文了,就是首先的话介绍一下什么叫游戏引擎,那么这里面的话呢就是传统的异能吧。

就是我们一般讲什么定义一个词,最首先寻找的是VKPEDIA,维基百科告诉我们什么叫游戏引擎,这是我从微机开始摆开上扒下来的一句话,就是什么游戏引擎是一个软件的这个框架对吧,专门设计为游戏开发做的。

这样一系列的软件的工具的合集,这句话的我听完之后,我的感觉就是基本上等于什么都没有讲,对不对,就是这就循环论证了,那么当然了,后面也有些好心人就说哎呀,游戏引擎包括什么什么场景管理啊,什么什么。

讲了一大堆的这个这个更具体的细节,其实我觉得这两个定义都不是特别的准确,因为一个是太概括了,就像是说什么是人哦,两只脚吃饭能走路的叫人,那肯定不是人对吧,还有一个就是讲哦这个人有眼睛,有鼻子耳朵。

这些都不是人的本身,那么什么是游戏引擎呢,我觉得我给了一个意义,就是说,首先它是一个构建黑客帝国举的技术底层框架,Take foundation of the matrix,那么黑客帝国大家知不知道。

就是啊,这是一个20年前一个非常经典的一部电影啊,今天刚刚那个新的星座上市了嘛,那黑科技国内面,它构建了一个非常伟大的一个想法,就是我们是不是生活在一个虚拟的世界,今天我们虽然能够感知到彼此。

我们觉得好像我们生活在一个真实世界里面,但是what if,我们是缸中之脑对吧,我们是通过一系列的传感器和一个计算机模拟,模拟出来一个一切的实在,而其实游戏引擎在过去的30年,我们在做的一切的事情。

都是说在模拟一个虚拟世界,也就是未来,当我们戴上了VR的眼镜,当我们戴上了插上了耳塞,当我们身体穿上了触感的皮肤,我们可能无法区分我们是生活在一个虚拟世界,还是一个真实世界。

而游戏引擎它所有的软件和体系的架构,都在为这件事情在服务,那么第二个呢引擎游戏引擎的定义,我认为是就是是一个生产力的工具,就是它是什么生产力的工具呢,创意或者是人类的想象力。

也就是说通过这样的一个一套工具体系,我们可以把我们想象的那个世界,在这个一个虚拟的空间里面构建出来,我们可以构建一个高达几英里高的,一个一个巨大的一个建筑物对吧。

我们可以创造一个从来没有存在过的外星星球,那这是过去我们对这种东西想象是停留在哪呢,停留在我们的书本上,我们写一个故事,或者停留在我们的画面上,我们的画一幅画,或者我们拍一部电影。

但是游戏引擎提供了这样的一个工具,让大家把这个世界真的能够,身临其境的创造出来,就是摆在我们面前,那么最后一个呢,这是我个人的一个观点,我认为它是一个复杂性的艺术,因为当你有这么强大的需求和能力的时候。

这个系统绝对不简单,它是非常复杂,所以说几乎不存在一个完美的,紧致的一个引擎架构,实际上它是一系列妥协,一系列决策的一个结果,所以我认为是一个复杂性系统的一个艺术,所以呃我我其实有一本书啊。

我其实特别喜欢叫啊,The complex complexity of system,就是系统复杂之美,其实当我们在越来越深的去理解,游戏引擎的时候,我们发现,我们去面对的就是一个超级的复杂性系统。

那为什么就是为什么讲我们在构建这个世界呢,其实我一直就是,我10年前我才去讲游戏引擎的时候,我特别喜欢用一张图,就这张图展现的是一个吸满血的蚊子,当我们用这个就是显微摄像机拍下来的时候。

我们可以看到这么的美,他那个身体的那个材质无数的细节对,所以其实大家想象一下,就是今天我们看到游戏,我们说我们的次世代,我们的画面无比的真实,但是你跟大自然相比,我觉得我们还差的特别的远。

就是这里面跟大家剧透一下,为什么我这么热爱这个这个之前这个视野,我记得10年前,当时我看完那个阿凡达这部电影的时候,我特别的激动,我跟我的小伙伴讲,我说10年之内我不会失业。

为什么我们要10年甚至更久的时间,真的通过游戏展示在大家面前,让大家真的在这个世界里面可以交互,但今年育碧刚刚做了一个这个阿凡达的游戏啊,实话说我个人觉得哎呀还是没有达到我的期望,没关系。

我们这个游戏引擎和游戏行业的同学继续努力,那么其实在真实世界,在上帝所做的这个游戏引擎里面,他对细节的展示,是让我们人类觉得自己太渺小了,这个太粗糙了,根本没有办法表现这样的一个细节。

那么那么这个东西讲起来非常的简单,但其实在这个虚拟的世界里面,我们实际上一切的东西都是用简单的,0101的逻辑去表达的,大家知道现在计算机吗,其实现在的计算机,它的最基础的理论模型是什么呢。

我们叫做图灵机,这个地方的话有点高能啊,我简单预警一下,就是图灵机的逻辑是什么,就是说我们大脑所有复杂的运算,所有复杂的决策,图灵老先生在几十八十年前,90年前,他用数学就会告诉你说。

你可以通过一个可以打孔的纸袋,我有个有个头可以读和写,然后呢按照一定的机械规则去这样去运运,运动的时候,我就能够完成这样的一个计算,这简直是一个非常了不起的事情,他他当时说是。

只要有一个无限长的时代就可以了,当然了,那个那么现在计算机是越做越复杂,你们看来越来越花哨,但它的本质就是读写计算,读写计算,那么用这样一个简单的零一变化,零一变化,我们要构建这样的一个世界。

其实是非常挑战的,我给你举个例子,就是这是两个人在联网了,去做一个简单的动作输出那个游戏,那大家首先看到的肯定是A,我们要把这个人渲染出来对吧,我们让这个人能动起来对吧,我们需要有一个渲染器统。

我们要有动画系统,这个是我们看得见的,但其实看不见的,有很多的系统,比如说我们要第一个,他的这个就是物理碰撞系统,一旦被打中了,我得知道你打的中我吧,对不对,第二个就是说我需要有它的整个控制系统。

因为我的一切输出能够进得去,还有什么呢,还有更复杂的网络怎么同步,因为这两个人在两个不同的计算机上,当A同学按下了键盘的一个键的时候,他在自己的世界里做了一个操作,在另外一个世界里的B同学。

是不是也要看到同样的操作,如果他那时候做了个闪避操作,他两个到底算是闪避成功了还是没有成功的,那么这所有的complexity,都躲在一个用一句话就能描述的,这样的一个游戏行为下面。

所以这是这个系统的复杂度,那么其实呢就是说,这里面我要跟大家科普一个概念,这也是上我们这个课程的同学,我特别希望大家能够建立的一个概念,就是这个课程的话,就是上班之后。

当有人告诉你说哎我会做很多的rendering,很多的渲染,所以我就能做游戏引擎了,那上完我们这个games104的课程,同学就说这事情绝对没有那么简单,这个是游戏引擎非常经典的一本书。

叫game engine architecture,他画了一个游戏引擎的结构图,然后我自己是学图形学的科班出身的嘛,但是我我很卑微的发现,就是原来我们的大图形学,只在整个游戏引擎中占那么小的一个部分。

所以啊所以我是大概差不多花了,这个就是本科研究生都在研究图形学,但是那时候觉得自己做学习还可以,但是没想到当我做游戏引擎的时候,又整整花了15年,学习他所有的相关的一个知识体系,所以的话以后有人问你说。

我做绘制是不是就能做游戏引擎了,那么需要我们games104课程的同学,就可以很自豪的回答NO,你还要学另外90%的知识,那就是游戏引擎,它最大的一个挑战是什么呢。

我们刚才讲的是说哎我们是构建一个黑客帝国,构建一个虚拟的世界对吧,但是我们真实的世界假设全是虚拟的,我一我经常在想,上帝老人家特别厉害,为什么他有无限的算力,他没有带宽的延迟对吧,它有无限的存储。

所以呢它可以采用暴力算法,就是大家如果对物理学了解的话,就是量子力学最基础的,这个理论是非常非常简单的,对不对,就只有四个基本力,现在好像只有三个了,那么再往下推,如果弦论靠谱的话,一切都是震荡的弦。

然后通过这些弦的震荡,我们居然能形成这么丰富多彩的世界,和他的意识世界,对不对,所以上帝很牛逼,他有他的效率算法,但是很可悲的是,在现代计算机里面,我们的算力是被严格的限制住的,大家想想看。

就是在那个计算机的CPU主频一直在涨,对不对,但是你有没有发现,这几年主频涨的速度是变慢了,我们几乎已经hit到了摩尔定理的这个上限,然后呢我们的硬盘,我们的内存也是有限的对吧,就那么那么多G怎么办。

还有一点就是有一个很可怕的东西叫做带宽,同学们在网上那个下载电影啊,看视频都会知道带宽是很头疼的对吧,我每秒钟能传输的东西都是有限的,还有什么呢,还有一个叫延迟,就是说我今天在AD的地方发生的事情。

我要传到B地方,我这个时间是有延迟的,需要传输的,那么有这么多的约束条件,但是呢我们要在计算机里面模拟一个,很像真实世界的东西,大家想想看这个东西是不是很难搞,这其实就是游戏游戏引擎的复杂度。

而且呢更让我们觉得痛苦的东西是什么呢,这也是游戏引擎的一个核心设计的边界条件,就是real time实施,这个是大家学习游戏引擎,特别要记住的一个关键性的概念,就是说啊无论我有多么fancy的。

多么厉害的算法,我能做出多么好的效果,如果你不能够在1/30秒,也就是33ms之内,把这个计算结果给提交出去的话,那你这个算法就是无效的,而且这个实际上也不可能给你那么大的算力。

比如说我们在做游戏引擎的时候,我们的整个预算只有33ms,但是呢每一个系统,比如说我去做个非常漂亮的这个医疗模拟啊,我做一个非常棒的一个水体的效果啊对吧,或者说我作为一个非常酷的这个物理爆炸。

我可能只给你一毫秒到2ms,而且同志们现在玩现代游戏的时候,我们会对什么东西要求越来越高,叫做帧率,对不对,现在打做一个男啊,玩一个动作游戏,如果你低于60帧,我就觉得哇这个画面没有办法接受了。

60战意味着什么,天哪我的计算只有15ms是吧,fitting到一个这么短的一个时间片里面,这其实就是现代游戏引擎设计的核心难点,所以roll ta将会是引擎的一个核心关键点,那么另外一个是什么呢。

就是也是我们讲的引擎的第二点,其实引擎它不仅仅是一系列的算法,其实引擎呢它是一个生产力的工具,其实从最早期的quick时代开始,大家就意识到了,说诶游戏引擎的用户不是成不仅仅是程序员。

它真正最大的用户是什么呢,是设计师和我们的艺术家,那么好,艺术家需要有一整套工具在里面,去构建他的世界,对不对,他会去构建那个就是啊我要摆放,我要把关卡的规则放好,对不对,我要放各种各样的敌人NPC。

那么其实在早期的时候,工具链是很简单很简单的,比如在quick时代,大家看到的就是这一个编辑器就可以了,但是呢大家打开一个现代游戏引擎的话,我们是一个庞大的工具体系,比如说而且非常有意思的是说。

每一个工具,它的使用者都是学习不同专业技能的人,比如说我们的动画师,我们会用一个就比如说角色编辑器,我们在里面编辑角色所有的动画,所有的行为,那么甚至我还给他做上物理的模拟,布料的模拟。

那我们这个关卡的设计师,他会在设计这个关卡里面,所有的山川河流要看上去非常好看,对不对,但是呢唉我们的这个designer,就是他要去给他们设计各种各样的规则,让这个规则的话呢变得真的好玩。

包括的话我们还要给他们一个工具,让他们设计这个游戏里面各种各样的AI的行为,AI to的行为,也就是说一个引擎,它如果只是一段一一大堆的代码,只是一个SDK的话,实际上它是没有办法用的。

它实际上必须要提供一个非常强大的工具体系,这也是我们上完games104课程课程,同志们要建立的一个非常强的概念,就是做引擎首先要学会的是做工具,而且工具的用户不是程序员。

而是我们的艺术家和我们的设计师,那么当然了,其实程序员也是引擎的一个非常重要的用户,为什么呢,因为当我们在设计这样的一个技术底层的时候,我们不可能知道所有的游戏类型,比如说我要做一个场狂闯关动作游戏。

我要做一个开放世界的冒险游戏,我要做一个剧情的mm RPG,那其实每一款游戏里的玩法,变化都是多种多样的,这样的话呢,我不可能把所有的玩法都做进到游戏,引擎里面去,所以就要求让我们的这个程序,这个长。

这个游戏的程序员能够快速的去诶,开发出它的特定的玩法,所以一个引擎在上面进行二次开发的,能力的强弱,也是一个引擎最重要的一个评判标准之一,那么还有一点的话呢,这个也是在这门课里面。

我们要给同志们讲的东西,就是引擎,它是一个我们讲它是生产力工具嘛,它一个很重要的一个属性,我们叫做协作的,可协作的生产力工具,这个听上去有点抽象啊,那我接下来讲人话,就是相当于。

比如说我一个人可以把整个世界构建出来,对不对,我一会儿换棵树一块做个规则,一会儿让这个小人动起来,听上去都很简单对吧,但是如果我把这件事情拆成三个人,三个不同人做,每个人只做自己的一小块。

那他们在之前是不是要有一个协作呢,那大家如果看一个现代游戏的这个啊,这个studio就是一个工作室的话,他动辄就是上百人,而且这上百人的话呢大概有20~30个大的,这个就是这个分工。

每个人的技能都不一样的,会写写程序的人非常的少,然后呢也不是所有的艺术家绘图中的,有的人很会画贴图,有的人很会建模,有的人很会做动画诶,有的人很会去搭这个环境啊,有的人呢很适合去调这个。

这个这个就是做做这个气氛,做过场动画,那好了呀,那这样的人在一起,我们怎么去协作呢,这个时候引擎的工具链非常的重要,然后刚才看到同志们有人在讲,这个叫工具人,你说的没错,我们就是工具人。

所以我们一直认为就是引擎,对游戏开发团队的姿态是什么样子的,我记得有一幅很著名的话,就是我们是这样的,是哦我们的设计师美术师大的,然后呢我们把他们服务好,而且做引擎有个很大的那个心理建设。

就是说啊虽然做引擎很挑战很难,但是呢我们一定要把自己放的特别低,因为我们的目标是,服务好这些优秀的艺术家和设计师,所以工具是生产力,工具是引擎最第二个非常重要的标签,那么最后一个呢其实就是引擎的复杂度。

其实引擎是一个非常复杂的东西,我讲一个,这里面只讲一个点吧,就是说呃当我们把整个这套体系设计好,这些工具设计好之后,是不是就完事了,其实不是的,其实他在这个随着时间的推移。

我们要不断地去对它进行完善升级,更好的算法,更好地展现,对不对,更好的一些feature,比如说我会把光照做的越来越漂亮,我会把这东西做的越来越细腻,然后呢可以做更逼真的物理模拟等等。

但是你这些底层技术一直在升级的时候,过去大家做的那些资产,做的那些游戏逻辑,必须都要全部能跑得起来,不能够说你一声滴答就不能跑了,所以我们行业里面有一句话叫做,你要在一架飞起来。

在飞机上把它的零部件逐渐换掉,甚至把整个引擎都换掉,它这个飞机是不能掉下来的,那这里面的话,其实在引擎基础最开始架构的时候,就会做这样的一个设计,那么所以的话呢就是如果同学们。

当然我就是将来有机会去参与到,真正的引擎研发的时候,我觉得我们一定要做好这样的觉悟,就是我们面对的是一个超复杂的系统,我每次都特别喜欢用这张图,因为这真的代表,当你面对上千万行的游戏引擎代码的时候。

你的内心的真实的感受,但是呢我们这群人最厉害的地方,就在于能理解这个flow,所以呢当然我今天讲的就是我们课程,很多的小伙伴,大家可能不会从事引擎开发,你们可能会从事游戏游戏开发。

甚至是你不会做游戏开发,你只是用游戏引擎的理念和概念,去做一些这个其他方面的应用,但是呢我觉得通过这门课程大家学到的方法论,学到的这个体系结构,实际上会对你做很多的,面,对很多复杂系统。

复杂问题都会有帮助好的,那接下来就到了大家最关心的问题了,就是我怎么去学游戏引擎,刚才听我这样一讲的话,我怀疑很多同学可能会吓到,会说哇天呐怎么这么难,我真的能学吗,我连C语言都不会,我能做游戏引擎吗。

那这里面的话呢就是啊,这是我们在那个,就是其实在我们行业里有个大牛,他在GITHUB上发了一个一个长途,就讲说你要成为一个游戏程序员,你要去这个学了多少的书,当时我把那个长途看了一遍。

然后说哎呀我的天呐,好像好多书我也没看对吧,其实如果说今天大家真的想去做专,业的游戏引擎开发,确实你会涵盖到computer science,几乎所有的专业领域。

那对大家已经点出了我们这个大理论的名字了,那么但是的话呢,这个这个现在第一个是时间有限,第二个我们只有20节课的课时,所以我们的挑战就会非常大,就说诶那我们怎么样子用这么短的课时。

能够把大家带入到这个世界里面的话呢,我所以我们定了一个课程的策略,我们称之为叫做啊只沿着主干道行径,也就是说,如果我们认为游戏引擎是那个远处的珠峰峰顶,你看到的是个云遮雾绕的一个山峰。

但是呢你可以往左走,往右走,往前走,还有所有东西都跟你有关,但是我们只找一条路径,沿着那条主干道,我们一路走上去,其他的东西我们都会点到,但是我们不会去展开,为什么呢,因为其实这门课程。

我认为最核心的目的是,帮助大家建立一个就是知识的体系结构,这就相当于是说我们上完了大学,上完大学并不意味着我们会成为专家,但是呢你上完大学之后,当你未来在你的真实的场景中,遇到任何挑战的时候。

你知道去图书馆翻哪一本书,然后我去啃它就好了,所以我们认为,在学习这种大型的系统工程的时候,体系结构就是fm work非常的重要,而且这门课的话呢,最核心的目标就是帮助我们的同学建立。

现代游戏引擎的知识体系框架,而且每一个体系的话呢,大家先不用急着钻的太深,因为未来我们有大把的时间去往里面去钻,包括像我们这次开的这个games104课程吧,也就是为什么我们当时订成1to呢。

就是我们希望这个课程的话,把大家的基础框架搭好,就让大家不要过早的陷入到,一个个具体的技术点,一个具体的一个特别牛逼的一个点上,而是说哦,我知道这个问题是在哪个体系框架里面。

然后呢我知道在哪能找到它的最前沿的资料,我知道这个行业现在发展的几个点在哪里,然后如果我希望要做更好的话,我可以去专攻这个点,所以这个也是大学教育之精神嘛,就是说他不会教你如何做事。

但是教你去正确做事的方法论,所以啊我们的104课程的话,也会秉承这个精神原则,就是以轻技巧,所以这也是为什么我们说那个不会去过度要求,同志们要变成那个就是说编程大牛,我一定要和C加加。

其实我们有一个小小的野心,是说我们希望比如说我们的美术同学,我们的设计师同学,也能听懂这一门游戏引擎的课程好,那接下来的话呢我跟大家就快速的介绍一下,我们接下来20节课的课程内容。

这也是今年上半年我最重要的工作,就是要把这么复杂的一个体系结构给讲清楚,其实游戏引擎它的研发呀,从某种意义上很像我们呃,大学学的这个有一门课程叫数据结构,他在一开始的时候呢,它其实并不是你本科学。

只是大家在工程实践中逐渐总结出来了,很多方法,很多这个很多的实践,当我们做了足够多的实践的时候,我们会发现我们需要一套体系化的方法,把它这个知识给这个固固化下来,然后呢你会发现在很多类似的问题上。

这些方法这些模式都可以重用,所以的话呢我们在这个课程设计中的话呢,我们也尝试了把这个虚拟世界构建的,这个低基础的结构梳理了一遍,然后呢每一块我们着重讲的是它的方法,所以我们的课程的第一节课呢。

就是会介绍一些游戏引擎的最基础的构建,在这里面的话呢,我们会把大家就是说哎游戏引擎,当你面对一个这么复杂的问题,你你按什么方法去理解它,去设计它,比如说怎么去理解MVVM的这个设计模式,对吧。

这个听上去有点抽象,我们不讲不讲那么复杂,我们讲人话就是哎游戏引擎到底分几层,比如说第一层,为什么我要把整个操作各个硬件平台,操作系统全部要虚拟化掉,第二层,为什么我们要抽象出很多公用的东西对吧。

那么这些东西的话呢,就是我们一层层跟大家讲,那这个听上去,现在大家会觉得诶这个这个课程到底讲什么,我这里面给大家讲一个take away啊,就是如果大家听完了,这个我们的104课程的第一节课的话。

就真正实战的第一节课的话,当你打开比如说像虚幻像游戏体,或者像任何一个游戏引擎的代码,你就知道说诶我该从哪开始看起,这里面我先剧透一下,如果你打开任何一个引擎的代码,你首先看的是什么呢。

一个函数叫做update,也就是说它每隔1/30秒,他会去调的一个ta函数,你从那个入口看进去,你就能够顺藤摸瓜抓到他引擎所有的细节,那这节课我们讲完之后,就把这个小窍门教给大家,让大家知道说哦。

原来这一团乱麻,我从哪个地方可以去下手去解它,那么第二节课呢我们讲rendering,rendering的话呢,games101闫令琪的话,教的那个图形学那个课讲的非常的好。

然后呢他就是闫令琪是我的师弟了,然后那个他这个算法讲的特别棒,那我就跟力气再说,我说哎这个课程我们讲什么,其实这两门课程的话呢,首先我的目标是大家去听这个,你们游戏引擎的渲染的话。

可以不需要有图形学的基础知识,没关系,我们讲的是一些基础的算法,但是的话呢呃我们讲的是他的体系结构,就是说当我知道了这个世界有材质,有光照对吧,有这个网格,有动画,有这个这个大气构成的时候。

我怎么把这些东西拼到一起,大家还记得我刚才讲的一件事情,就是在我们的游戏引擎的这个,或者叫虚拟现实的这个世界里面的话,所有的事情都必须是real time。

我怎么把这么多东西fitting in到30ms里面去,那我该怎么用什么一种pilot去组织这些元素,所以大家就会听到著名的,比如说differ rendering对吧。

Forward rendering,对不对,包括我们会跟大家讲,就是说frendering forward rendering,他在这个就是现代游戏的架构中,它的各自的优劣势优劣势。

其实如果大家听完这堂课的时候,大家就会知道一些很有趣的一些点,举个例子,比如说一个小小的玻璃板,透明物体,就会给我们整个渲染管线带来巨大的困难对吧,大家可以可能都想象不到。

说我这个地方如果有好多好多的玻璃,这个渲染器会非常的挑战,那么包括大家看到很多很前沿的,比如说诶这个卡通化的渲染啊,包括自己可以定制的渲染管线啊,就是那种比如说SRP这样的东西。

当我们学完这门课程的时候呢,我希望同学们说的哦,我懂了,其实这只是各种图形学算法的组合,那我根据我不同的应用场景,比如说我需要做一个仿真模拟的,我追求的是这个数据量特别特别大。

我要我要画一个很大很大的场景,还是说我想就想表达一个一个一个角色,一个虚拟人,我要把他表现得特别漂亮,或者说我要把这个世界表达的非常的二次元,那么我该在哪儿找到这些部件,按照什么逻辑把它们拼到一起。

那这就是游戏引擎课里面所讲的渲染,所以说我们不会讲太深的算法,但是我们会讲这么多算法,它是按照什么结构拼到一起去的啊,美术生说我也怕玻璃和透明物体对的,所以说我们用笔画世界。

透明物体就很难用计算机画世界,透明物体非常非常更是更难对吧,那么好,那我们的第三个part呢,就是我们的课程的第三个环节是讲动画了,动画的话呢,其实啊其实也是一个非常大家很熟悉的概念。

就是我们的角色只要动起来了,我们需要动画对吧,动画有很多的理论,很多的实践,那在我们的这个游戏引擎课里面,动画这个section的话,教大家是什么东西呢,就是当我们用这个max maya。

做出了很多很精彩的动画素材的时候,我怎么样把它变成一个可以玩起来的东西,举个例子啊,比如说当我做了很多人走路的动画,当这个人跑起来之后,走路的动画和跑起来是怎么过渡的呢。

然后呢我我这个时候再走到一半要变跑的时候,突然有人打了我一下,我从左边打了我一下,我这个人该怎么去变化,而且这些东西的话,就是说我可以把一个一个动画做出来,但他用什么方式在现代游。

游戏的引擎里面把它组织起来,而且它最神奇的地方是什么呢,就是我们要提出一种组织结构,就是animation tree blto try,让设计师能够参与进来,当然这个东西讲起来非常的简单。

我会讲一些更有趣的概念,比如说当我把这些动画做出来之后,我还要用手抓住空中的那个苹果,比如说敌敌敌人的一把剑,这个砍过来对吧,我要表演百分之百空手接白刃,我怎么能保证我这个空手接白刃。

在游戏里面一定算的是准的,那这个就是游戏的动画系统,它的核心的设计理念,所以他不会去讲动画的基本的这个啊,skeleton啊,就是骨骼呀,rigging啊,或者skinny这些东西。

当然他会讲的是非常这个就是gimme gimc,就是说强调交互,强调变成一个玩法的这样的一个变化的一个系,一个体系,而且在这里面已经开始,大家能接触到一些,就是如何把这些技术变成一个。

让设计师能够理解的工具,让他们构建那个精彩的这个游戏世界,那么第四趴呢就是我们讲的这个物理,那物理其实是一个非常有意思的概念,大家如果玩过这个一些现代游戏,或者现代游戏引擎的话。

比如说你看见地上有个方块,你就想一脚去踢它,那个方块呢它就会它就会动,它就会跑起来,但是学完这一节的话,同志们就会意识到哇,哦这件事情并不是天然的,因为前面那三趴,他只是把东西展现在你的面前了。

但是如果你真的让这个世界真正的互动起来,其实这些所有的东西有另外一层的表达,我们叫做物理表达,也就是说它是跟现在这个表达是个孪生世界,那么在这个物质表达里面,我们要用最简单的钢体对吧。

box那个capsule,这个sphere这种求援助胶囊去表达这个世界,而且呢我们要用钢体力学模拟它各种运动,但这个听上去是不是很酷,那想象一下,如果我们再复杂一点,假设这个世界是软的,可以压得变形的。

那我们是不是需要一些,这个就是弹性力学的东西,然后呢我们这时候有水有烟,有头发对吧,流体模拟式又来了,然后这一切都有了,对不对,但是想象一下,我能不能把这些东西变成一个一个系统,比如说我造一辆车。

这个车轮子在转,它在雪地上,在泥地上,它的运转都会不一样,那其实这些东西在我们认为现实生活中,很自然的事情,但是在游戏的这个引擎里面的话,physics是一个非常重要的一个底层框架。

但是呢我们不会讲的那么深,但是我们会把整个这个结构告诉大家,这样大家以后看见一个游戏的时候,比如说你看见一座墙,你想用一枪打他,那个墙打不倒,你千万不要觉得有意外,你会说哦这个墙只是做了个碰撞体。

但是他没有做破坏,所以这个墙你是炸不烂的,你就不会去怪策划,怪那个设计师没有去做对,那是因为很可能技术上可能做不了这件事情,所以这是我们物理的这一趴,然后呢,接下来的话呢也是游戏引擎架构。

最核心的一个东西,叫做游戏性的架构,因为有前面的渲染呢,这个物理呀,动画呀对吧,那我们其实是可以构建一个世界,这个世界你拿脚踹他一下,你会觉得这已经有点真实了,对不对,但是这是个游戏嘛,这不是游戏。

它只是一个世界的simulator模拟器对吧,那只是把这些东西放在这儿,你能和它交互,它本身并不是一个好玩的东西,而真正好玩的东西是什么呢,哎规则就这个世界,你你你把一个一个子弹打出去。

可以把敌人的五点血打倒,敌人如果受伤了,可以呼叫他的小伙伴来支援他,对不对,这一切的规则是怎么样子用告诉计算机的呢,而且大家知道这里面的规则,这个并不是由程序员写出来的,是由我们的设计师设计出来了。

那我们怎么样能让设计师来表达这个世界呢,所以这里面就会教他一大家一个最基本的,比如说事件系统啊,如何用脚本系统啊,包括如何用图形化的方法去表达,这个世界的规则,其实大家到学到这一趴的时候。

大家就会明白一件事情,就是说所有的现代游戏本质上是个规则体系,那么这一节课的话呢,我想给大家的take away是什么呢,就是大家会突然有一天意识到说,无论我学的是任何一种语言。

还是说我只是在这个一个一个一个graph上,连一些图用图去做一个逻辑,实际上我都在去编程,所以就像我,我个人是特别喜欢那个to new jobs的一个观点,他认为所有的现代人都要学会一点编程。

但是编程并不意味着就是对着电脑敲大敲代码,当你用一些这种原件去构建一个逻辑的时候,那就是编程,其实我有时候心跳的感觉,就是我们实际上是在做一个什么呢,电路板设计软件,就是我给你一堆二极管三极管。

然后你把这些二极管三极管电容串在一起,就能造出一个非常棒的,现在的电子设备,其实game play系统就是啊给你设计了一堆二极管,三极管电容,然后呢,我们可以设计师脑子中想的是一台收音机对吧,一个电视。

一个这个这个这个电灯开关,智能开关,但是用这些元件如何能组装起来,这也是游戏引擎特别特别的一个地方,那么讲完这些的话,我觉得基本上同志们就可以做一个,自己想做的游戏了,那这个时候我们会给大家补充一些。

就是颜值比较高的系统,比如说我们特别喜欢的特效系统,那其实大家想象一下,就是我突然要冒个烟,冒个火对吧,那么其实特效系统的话,它的设计的有意思的地方,就在于它不能用程序写死。

他也要提供一整套的框架和结构,让艺术家可以创造各种各样的可能性,我们经常讲一个电影拍的不好,就五毛钱的特效,其实游戏里面如果特效做的不好的话,也是五毛钱的特效,那么还有一个像一些杂项系统。

还有一个就是寻路系统,那么我们在游戏里看到很多的智能体的吧,AI这些东西,那他真的是他是怎么知道认路的,他怎么知道往左拐往右拐,那么如何他对这个世界的认知,我们人对世界的认知,通过我们的眼睛。

我们去扫描,我们去看这个世界,但是在计算在那个游戏的世界里面的话,它是没有办法扫描这个世界的,我怎么样告诉AI哪有强,哪有路,哪有障碍,那这地方就有一个寻路系统的一个体系,怎么介绍。

那最后一个的话呢是大家可能会注意不到,但是其实每天你打游戏都会感觉到的,就是相机系统或者说传说中的3C系统,比如说大家如果喜欢玩那个射击游戏的话,你会发现就是那个枪杆,那个镜头感是非常非常重要的。

所以这些系统和前面的系统配合在一起的话,大家基本上就可以做一个,比较有意思的小游戏了,而到这一盘的话,我们开始介绍一些,就是跟游戏工业化比较连接的比较紧的东西,第一个就是它的工具链。

因为我们刚才一直在讲,就是说啊造游戏本质上我们是什么,刚才同学给我了一个打了个弹幕,叫工具人,对我们就是工具人,我们就是帮助大家构建虚拟世界的工具人,那么所谓游戏引擎的研发者的话。

最核心的需要构建一个就是工具体系,那么工具体系的话呢,因为一个一个的工具会非常的多,比如说大家非常熟悉的场景编辑器啊对吧,我们构建我们的世界,比如说动画编辑器啊,角色编辑器啊,但是呢在我们这个课程里面。

我们不会去介绍这些编辑器怎么用,因为这是教大家如何做游戏的课程教的东西,而我们104课程讲的是游戏引擎,所以呢我们去讲如何去构建一个,可以给别人用的起来的一个游戏开发工具体系。

那这里面最重要的概念就是反射体系,这个就比较抽象了,这个这个这个它会比较高能,然后的话呢会告诉大家,就是说如何你做了一整套工具,你后面会不停的升级它的数据格式,但是呢过去的数据,未来的数据你都能兼容。

这样的话使得你做100个工具,1000工具,这些工具之间彼此还能to,所以这一趴的话,如果大家担心需要C加加的基础,这个这个编程的能力啊,在这一趴可能是需要担心下。

但是呢我尽可能用最简单的语言去讲这套体系,那么接下来的话呢我们要讲一个就是这个啊,Online gaming,也就是网络这网络这一块,其实这一块的话实际上在现代游戏引擎中,我们认为是会越来越重要。

包括就是那个你可以看到就是那些商业引擎,在过去这一趴做的时尚是比较弱的,但是呢现在我们会发现,我们越来越需要联系到彼此,那么在游戏的这个世界里面,为什么网络这一趴这么重要,但又这么难做呢,我给大家举。

刚才我举了个例子,就是说我们做游戏本质上就是做上帝做的事,我们在对这个世界进行模拟,对不对,但上帝他对世界的模拟它有个优势,它只要模拟一份,就是我们所有人是在一个容器里面进行模拟的,对吧。

我们在一个宇宙里面,但是真实的网络游戏是什么概念呢,就是我们实际上,比如说我在我的机器上登录一个游戏,实际上我在我本地跑了个宇宙,然后呢另外一个跟我的小伙伴们,那是联网的,对不对。

他在他的本地也跑了一个小宇宙,实际上是两个不同的宇宙,那我们要做的事情是什么呢,就是当我在这个宇宙里面挥了一下手,我得把我挥了这个手的信号发到另外一个,他的那个宇宙里面,他的宇宙里面有一个我的克隆。

然后呢他把也一样把手举起来,然后他看见我举手了,他也对我举个手,那好再信号的传回来,就相当于说无数个平行宇宙,我们通过信息的沟通,让每个宇宙里发生的事情都尽可能的是一致的。

大家想象一下这件事情是不是很复杂,那么这个东西的话呢,其实就现在大家在玩游戏的时候,你觉得哎我放了个大招对吧,我就要打中你,大家觉得这件事情哇很酷,你打不中,我觉得这个游戏很很很很很很傻很笨。

但实际上如果大家懂了这个游戏,引擎的底层原理的时候,就会意识到这件事情其实很复杂,在这里面我们会把它的复杂性,一些最简单的一些基础的方法告诉大家,比如说著名的这个异步的这个同步算法,和真同步的算法对吧。

但是呢实际上这里面我们不会讲的,特别的具体的算法,但是让大家建立这样的概念,因为就是说光光光光这个服务器这一块的话,实际上它的深度是非常深的,因为我们这里面啊就是可以这么说吧。

就是如果说游戏引擎基础课程,这么厚的一本书的话,讲服务器到我们可以再写一本这么厚的书,应该没有什么太大的问题,所以的话呢也就是说我们上完这节课之后,同学们再去玩一个游戏,如果你的放了个大招。

你觉得你打中了对面,但是对面没有,其实没有打中的时候,你至少不会那么生气,你说哦,我懂了,这是一个说明是网络延迟,网络同步出了问题,这个算法写的不够好,等我以后学会写代码的时候,我自己来再写一遍。

好的那讲完这些,其实讲完这些啊,我觉得基本上一个骨干的一个架构,基本上就讲完了,所以呢在这个课程的最后三三节课呢,我就讲一些大家喜闻乐见的东西,因为我当时答应我们的games,就是说我们会给同学们介绍。

一些比较前沿的概念,那还是老规矩,就是说虽然这些是非常前沿的一些概念,但是我们尽可能讲人话,就是说让大家能听懂哦,这个技术原来是这样的,比如说我们的第一个前沿课。

会给大家去讲这个motion matching对吧,就是说在计算机里面我们如何能用search的话,用那个search的算法加上一点deep learning的算法。

我能够让这个角色看上去非常的活灵活现,它能够适应各种各样的场景,而且很多的动画它是自动通过通过searching,通过matching能够合成,那么还有一个呢,就是刚才有同学在弹幕里问我了。

就是那个PCG的东西,对的,其实现代游戏一个很大的挑战,就是我们要构建一个越来越大的世界,大家都知道,现在我们很喜欢流行什么做开放世界,对不对,好了呀,我我作为一个几百平方公里。

省上千平方公里这样的一个世界的话,那上面的每一棵树,每一个石头,每一个草都要我们的艺术家种上去,那大家是不是把艺术家给累死了,那我们能不能够把这些植被的规则对吧,写写成一套算法。

能够自动的把这个地方生成,那这件事情的话呢,其实是一个游戏里面,一个非常热门的一个前沿研究领域,那么最好的技术我们可以直接把一个城市,比如说一个中世纪的巴黎城,我们用一个算法的生成起来。

这个我想到这的话,大家可能可以想到一些很有趣的游戏了对吧,那么前沿技术的话,第二排的话呢就比较硬核了,就是我们会给大家介绍一些最前沿的,这个游戏引擎的架构理论,比如说面向数据的编程。

还有就是说那个多线程的任务系统,这一段是比较硬核,但是如果大家有志于做游戏开发,我我会很鼓励大家去听这一趴,为什么呢,因为我刚才讲了就是游戏的引擎,它最挑战的事情是所有的事情必须是实时的。

那么我们如何把所有的那么复杂的运算,对这个世界那么多的模拟,在30ms内全部做完呢,那我们有一个帮手是什么呢,叫多核,也就是以前在一个和尚跑的东西,我们可以在八九个和尚是那个十几个和尚。

甚至几十个和尚同时跑起来,那这样的话,其实你的底层架构就会发生很大的变化,所以的话呢我们的数据可能会要以数据为中心,组织我们的逻辑,然后呢我们要一个叫job system,翻译成翻译成人话就是任务系统。

就是我们把我们的复杂的模拟,拆成一个个的小任务,然后呢有一个有一个调度者天天拿到任务说哦,我觉得你很行,我把你分过去,你完成之后我再把你收回来,这样的话我能够把很多核的算力全部用起来,那这个技术的话呢。

在有现代游戏引擎的话,是一个非常关键的一个一个一个技术,那么最后一趴呢也是大家非常喜闻乐见的,因为我们在行业的业界的标杆,比如说虚幻引擎,大家都觉得虚幻舞特别棒。

那虚幻五最重要的两个feature是什么呢,一个就是全局光照对吧,那就是著名的lumen技术,还有呢就是说它无限的几何细节,对不对,就是上一个像素级的这种面片,我们的NANA的技术。

那么就是games104课程的精神是什么,就是这个把一切的高深的技术全部给他平民化,所以我们也争取用两节课的时间,就是啊用一节课的时间,把这个神秘的面纱给大家揭开来,如果大家这样,至少能够帮助大家。

如果大家有兴学习研究这些基础的时候,至少知道从哪下手,知道它的要点在哪里,所以呢哈哈对,我看到有同学打弹幕说这个太难了,是的,其实呢就是当你面对那个几千万行代码的时候,你肯定是觉得很难。

但是如果你知道从哪个入口下手,像庖丁解牛一样的,就是你从那个地方下刀子的地方下下刀子的话,其实呢它的难度是可控的,我相信我们的同志们都非常的聪明和优秀,OK所以说以上就是我们的课程的,这个就是主体了。

那最后呢跟大家去讲一下,我们课程的整个这个流程吧,首先的话呢就是呃非常感谢我们的课程,那个呃那个团队就是大家是花了很多的时间,我们觉得这个课程的话呢信息量比较大,包括我们很多的课件。

同学们可能在这一个多小时的课程中,不一定能够完全能消化的掉,所以我们就做了一个课程官网,在看网上的话呢,我们会把这个我们的课件上传上去,包括可能是我们的视频也会上去吧,我不确定啊,然后呢。

我们会把我们的那个,就是大家如果有什么问题的话,也可以在我们的BBS上进行q and a,包括我们做了一个微信公号,同志们的话呢可以扫描这个微信公号,然后加入到我们这个那个微信公众号群里面。

大家有什么问题可以在里面去讨论,那么另外一个的话呢,就是说大家会问我说诶,那我们这个课程需要什么参考书对吧,刚才也提到了,就是那100多本,这个就是这个书肯定是看不完的,我个人呢是推荐这个游戏引擎架构。

现在已经出到了第四版,就是好像第四版我没看到他的英文啊,中文版我看到的只有英文版,但如果大家不是那么新的话看,比如说第三版的中文版,我觉得应该也可以,因为这本书的话,那为什么我会推荐呢。

就是当时我在去架构我们的引擎的时候,其实最早我参考的书籍也是这本书,因为那个时候,其实我已经做了将近67年的引擎了,但是当我去全面系统地去思考引擎架构的时候,我觉得我还是需要一本工具书,整个看下来。

所以的话呢同学们结合顺这个课程,然后呢沿着这个课件,沿着这本书的章节往下读的话,我个人觉得是一个比较好的一个配合,那么总比没有参考书要好一点对吧,然后那个接下来的话呢也给大家讲一下。

就是我们的课程组做了一个准备工作,就是我们做了一个小引擎,这个是我们花了蛮多时间的,因为我本来想把我们的引擎开源,但后来代码实在太大了,五六百万行那个,然后呢我们说那这样吧,我们重新做了一个小引擎。

这个引擎非常非常的小,但是呢大家看到那个编辑器嘛,它也是里面有基本的游戏的编辑功能,还有它的动画系统,我们还自己做了一套小小的物理引擎,在里面就可以做简单的物理碰撞和模拟。

包括游戏那个状态机的规则的定义,那为什么我们会做这样的一个小引擎呢,就是说我们希望同学们在一边听课的时候,一边可以,这个就是说在这个小引擎上去改一些代码,然后呢实现你各种想要的功能。

因为游戏引擎它是个系统科学,所以的话呢我首先得给大家一个系统的平台,在这个小小的引擎里面,麻雀虽小,五脏俱全,而且为了这个简化整个环境的话,我们就全部用C语言去写了,这样的好处。

就是让大家不用在多个语言里面去切换,那么这个引擎的话呢,我们很快就会上传到GITHUB上,同志们可以去下载这个引擎,然后去改,这就牵扯到我们扣这个课程的这个这个,接下来是这个高能的部分。

就是到底有没有作业,那这个课程的话呢,我们原则上是不布置作业的,但是呢我们每节课讲完之后,我们会就是给大家出一些小小的命题,大家可以在这个小引擎上,我们尽量控制它的复杂度。

大概是一两百行代码左右就能够实现,实现之后呢,大家可以把它提交到我们的这个官网和BBS而来,然后呢,我们的助教的大大们会帮大家,把这东西给大家一些回复,如果大家写的这个地方需要帮助的话,我们也提供帮助。

但是呢这件事情不是一定要做的,就是说因为我讲的这门课程,是所有人的一个游戏引擎的通识课,所以的话呢如果你只是想了解这些基础概念啊,想知道这个东西是怎么结构的话,其实听听课程就可以了。

并不需要去真的去编程,但是如果大家有志于将来以后做游戏开发,将来也有也想去做这个,甚至是更难的游戏引擎开发的话,那这个小引擎的联系的话,我觉得会对你有很多的帮助,那这个地方也是花了我们很多的心血。

那么所以的话呢大家可以通过这个网址去提交,这个你你自己的这个这个课程,所以的话呢我们的课程到最后呢也不会有作业,但是这个小引擎呢我们现在有一个小小的野心,就是说啊想顺着我们这20个,20节的这个课程。

大家一次做下来之后,能做一个非常小的联网对战游戏,注意啊,我们想做的这个联网对战游戏,现在我们有点在立flag,因为其实教大家做一个引擎里面一些东西呢,打来打去难度不是特别大。

但是呢如果让这个这个这个游戏模式,还能够联网对战的话,其实是有点挑战的,那么这一点这个挑战的话呢,现在是我们课程组自己给自己背上了,那我也希望同志们跟我们一起吧,我们看看我们能不能够104课程。

创造一个经典,就是一节课程上完之后,我们能做一个网络游戏出来,这最后的话呢我要感谢一下,就是其实这个课程有很多的那个,我们的那个就是同志们一直在帮我们,就是我们有一个共创官官的这样的一个招募。

所以呢来自于学校,来自于这个行业里面,很多小伙伴都非常的热情地加入到,我们的共上班,对我们的课程就是提供了很多的意见和帮助,包括我们后面的课程的设计的话,可能会越来越多的邀请我们的共同话。

跟我们一起参与,那另外一个的话呢,还有我们的课程团队,大家看到了这个将近只有二三十个人,确实是我们花了很多时间再去思考和整理,因为这门课程从来没有存在过,我们都没有现成的课件。

所以我们是就是去年年底接到这个任务的时候,我们现场的去做编排,做设计,说这个课该怎么一个个的讲,所以的话呢这也是一个非常有意思的一个挑战,也是一个一个一个经历,所以这就是我今天的第一讲的课程吧。

就是说啊希望大家喜欢这个挑战,喜欢这个历程,因为我觉得就是说构建虚拟世界的话,是一个充满乐趣的东西,就很多人在问我说,为什么你这么热爱,就是作为引擎引擎这件事情,我说这个感觉真的像上帝一样。

就是你去定义这个世界的最基础的规则,然后按下一个按钮,然后当那个计算机在疯跑的时候,这个世界真的出现在你的面前了,这种这种快乐,这种创造的快乐,是没有办法拥有语言可以形容的,所以对。

所以说那个这个也是我希望所有上games,104课程的同学的话,都能够跟我一样去享受这个历程,因为未来的世界一定是一个就是充满想象,充满直觉的这样的一个世界,所以我们相信下一代的就是人机交互的界面。

一定是个3D的,这个身临其境的这样的一个体验,而游戏引擎的话,那将会是这个时代的最重要的一个基础软件,所以的话就是,这也是我们整个啊团队最大的一个愿景,所以希望那个同志们跟我们一起,开始这段伟大的经历。

好的谢谢大家,今天就是我课程的全部,那那个大家有什么问题可以问我吗,嗯啊有个同学问我说,可视化编程是不是未来,比如蓝图啊,这一点的话呢,我我的个人观点是yes,因为很简单。

就是说在游戏引擎的早期时代的时候的,实际上是以我们的技术为主,我们很会写代码对吧,但是你会发现,这个世界上最pressure的最珍贵的是什么呢,是这个创意是想象力,他并不一定要需要你受过良好的编程训练。

比如说一个七八岁的小孩,他所想象的世界就会非常的精彩,那我们做引擎的人就要有这个觉悟,就是我们给大家提供一个工具,你就可以很简单,很直觉地构建出你脑中想象的那个世界,所以我个人认为,可视化编程的话。

将会是一个非常非常重要的一个,基础的编程语言,或者基础的这个人机交互界面,帮助我们的这些创业者构建这个世界,同志们还有什么问题,哇这个问题啊,有同学问我说原神联机是不是元宇宙,首先是这样的。

就是我知道这两年元宇宙的概念特别的火,但是呃我个人觉得元宇宙到底是什么,现在没有人给能给出一个很好的一个定义,那么就是说我们想象的,大家能想到最像元宇宙的世界,是可能是电影头号玩家的那个世界,对不对。

那我们是做游戏引擎的,而且是在很前沿的方面去探索,那我个人认为就是说,事实上我们离远宇宙还很遥远,因为有很多底层的软件的,硬件的挑战还没有解决,简单来讲就是我们做一个世界。

我们把几千人上万人放到一个世界里面,他们可以互动,可以同时玩耍,就这么一件事情,无论从绘制到网络同步到状态同步,到它的游戏规则,都有非常大的挑战,所以这也是现代引擎还在突破的东西。

那么真的把人类社会搬上了这样的一个,虚拟世界的话,这个挑战其实比大家想象的要大很多,这也是我希望未来10年到20年,我们和我们课程的小伙伴一起去探索,一起去努力的东西。

啊有同学问我说游戏引擎和一些工程用的引擎,比如说to u web基尔的,至于ban的这样的1ban的ban,给大家科普一下,b i m beam就是那个建筑信息那个管理,那么实际上是这样的。

就是像这些引擎呢,它下面跟游戏引擎很多底层概念是通的,但是呢这些专业的工工程引擎呢,实际上他会专门为各自的领域做很多的模块,比如说啊比如说beam引擎,建筑信息,他会要读那个很多建筑图纸。

建建筑图形文件的格式,比如RAVETO的这样的一个格式对吧,那像web gl的话呢,它为了保证在各个端上能跑起来的话,实际上他做了很多的功能的裁剪,所以它从底层的架构逻辑上,是有很多共同的东西。

包括这些引擎呢实际上到后来都会面都会遇到,就是让别人能编辑,让别人再次创作的这个挑战,其实这和游戏引擎的挑战是一模一样的,所以说我觉得如果大家想去做这种工程相关的,引擎的研发的话。

其实学游戏引擎这门课对你的帮助会非常大,因为它很多的工程理念是非常接近的,而且游戏引擎呢在这一点上去,突破的是比较远的,因为这是一个被充分竞争的一个一个市场,所以的话呢很多最前沿的一些理论和概念。

都在这里面进行了一些尝试,所以我我觉得是有很多的借鉴的东西在一起,啊那个有同学问我们说,这个视频在哪可以看到回放,对那个现在我们暂时先把它下载到B站上,我们的games的公众号上面,那后面的话呢。

我们会在更多的渠道把这个视频发出来给大家,哇这么多问题,啊啊啊这个这个显然是专家,我现在被问到一个问题了,就说同学问,我说ECS和那个DDOP是什么关系,那这个是非常专业的。

这个我们在那一趴呢会就是高级课,那一趴会跟大家去讲,就是其实这两个关系度还是蛮高的,就是啊e cs是一个现代游戏引擎里面的对象,组织的这个模型。

它的全称叫这个就是entity component和这个system,这个就是叫什么,翻译成中文叫什么,来了,脑子转不过来了,叫啊那个实体这个组件系统对吧,那他这个这样的一个组织形式。

实际上就是为了更高性能的去跑,但是呢,你为了更高性能的去模拟这个世界的话呢,你需要把这些数据按照to p,就是面向数据的方法去组织起来,这样的话,我的计算机才能够快速的批处理,这些所有的构建。

所以这两个东西关系是很大的,所以我们争取在那节课的时候,也跟大家介绍一些基础的e e cs的概念,对好的,今天那个时间也比较多,我看同志们问的问题好,越来越热烈了。

那这样的就是说同志们还有更多的问题的话,可以到我们的群里面和微信里面去提问,然后的话呢我们的团队会尽可能给大家解答,今天是我们的第一节课,所以的话呢很很多东西,我们准备的可能不够充分。

大家也对我们多多的体谅,然后我们争取在未来的三个月,和我们的小伙伴们一起去成长。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一起去提高好。

01.计算成像导论 | GAMES204-计算成像 - P1 - GAMES-Webinar - BV11N4y1g7Z8

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

呃首先欢迎同学们来到games204计算成像啊,Competition imagine,是一个近年来非常热的一个课题,然后随着一个时间的发展,特别是计算能力的发展,光学跟算法联合设计。

逐渐成为了一个非常热门的一个方向啊,今天格局给大家嗯,开始介绍一个什么是计算成像,然后开设了一个计算成像的课程,其实本质上来说,像计算成像在国内还是国际上,是有两个比较大的圈层。

一个是在图形学一个圈层做计算成像,还有一个是在光学的一个圈子去做计算成像呃,两个不同不一样的圈子,在方法上会有很大的一个不同,当然是随着近年来呃,计算跟光学慢慢不断的交叉融合。

现在两个光学跟图形学两个圈子的一个成像,慢慢的开始交融,大家会有更多的机会去见一些更新的,一些好玩的计算成像的一些内容啊,今天是个很特殊的日子啊,其实这么多年风风风雨雨呃,国家字幕过来是非常不容易的。

所以说这里希望同学们好好学习,努力把自身价值的实现,跟祖国的命运结合在一起啊,早日的投入祖国的现代化建设之中好了,现在我们开始讲解我们的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一课计算成像,首先自我介绍一下,我是在香港中文大学深圳校区,然后是在一个数据科学学院啊,同时也是点云技术的创始人,我们起了个名字叫pop spread technology。

大家可以很明显的看到这是一个点扩散函数,为什么叫点云呢,因为叫点cos可能太难听了啊,我是本科在华中科技大学读工学,然后后来又在沙特的cost,阿卜杜拉国王科技大学读计算机啊,这是一些我的信息啊。

包括我的一些主页,还有邮件,大家有什么问题啊,包括交流啊,学习啊,科研啊,都可以通过邮件就来找到我啊,research主要fox在断料端的相机设计啊,Deficial optics。

就是包括可微的一些呃衍射跟折射的一些透镜,还有一些优化呀,还有一些VR这些领域,当然最近呢又偏向一些做一些competitional image的,专用的processor。

就是把一些很比较难搞的一些优,优化的求解器嗯,就是大家一些小伙伴们一起,致力于去把这整个通用的求解器,专门针对计算成像,各种算法去做一个硬件的加速,这样的话所有的老师啊。

同学们都可以在这个硬件的一个平台上,去做自己各种想要的事情,啊另一位老师是彭一帆老师啊,彭一帆老师是目前在香港大学,刚加入香港大学做assistant professor,然后他是在斯坦福。

在golden weston教授那做一个做了一个博后啊,之前是在UBC,然后本科跟浙大,本科跟研究生时代浙江大学,然后他跟我是同一个导师,是我师兄啊,这是他的一个网页,就是还有一个邮件。

大家有特别是相关HOLOGRAPHY的一些问题,他在这方面是一个很大的一个专家啊,在research方向,它主要是集中在一些啊光光学的一些设计啊,图形学啊,vision还有AR。

还有microscopy image啊,一些低层次的la vision,还有一个人机交互的这么一个系统,然后整个cross staff我们有,现在目前有四位助教同学。

包括来自apple跟CMU的一个柴子立同学,还有来自cos的杨欣哲同学呃,来自清华的讲普华科学,还有来自中科大的沈鹏飞同学啊,这四位助教同学都非常优秀啊,大家有什么问题也可以跟他们进行交流啊。

课程注册是可以在这个games204的一个网站上,这是一个新成立的网站,可能会有bug,大家要耐心一点去注册它,后面我们会把一些呃像作业呀,就是交作业,收作业都通过这个啊课程网站来完成。

这是类似一个blackboard一个网站啊,整个课程资源可以在下面这个网址去搜索,包括一些呃,像参考了一些slides,还有一些视频都可以通过这个地方找到入口,嗯先自我介绍一下啊,这整个研究生涯哈。

其实在学术上有两个比较让我觉得满意的,一两个成果吧,第一个就是可微的衍射模型,这个是18年5月份提出来的,这可能是世界第一个,但是我不是很确定,因为当年有好几个就是类似的一个东西,同时发出来。

然后另外一个就是可微的复杂透镜模型,就是真正的实现了物理模型,跟后面的一些算法的一个登录端的优化,这个应该是世界第一个,没问题,在工业上的一个achievements,就包括跟点云的一个合作啊。

首先是做了一个高速的一个高精度,低延时的RGBD相机,然后大家可以先做一个产品先试一试试试水,可以做到120HZ,120帧率的,120帧的帧率,毫米级的一个precision,可以做一个实时的三维重建。

同时我们也做了一个超低功耗,超低延时的一个全变型异构的ISP的IP核,今天我们的课程会从四个方向来介绍,计算成像的一个全貌,首先给大家介绍一下整个成像的历史和今天,还有包括什么是计算成像,包括它的定义。

还有应用,然后给大家一个计算方法的一个overview,最后我们去讲整个课程的一个ROADMAP啊,这个road map并没有完全定下来,但是可以给大家做一个大致的一个指导。

大家可以看到具体我们每个章节学什么,整个计算成像的思路是什么,因为计算成像本身,现在并不是一个非常成熟的学科,它有非常多的一些方法啊,都还在一个比较前期的一个阶段,就是但是通过这样一个梳理。

大家对整体有一个大致的印象,就可以后面做研究啊,还是去找工作呀,都可以有一个比较清晰的一个思路,嗯首先给大家介绍一下整个成像的历史,今天啊,就最早就是大家对整个pino camera。

就是小孔成像有一个非常早的研究啊,最早有一个是墨子,在公元前4000年到公元前390年,因为那个时候墨子我们的伟大祖先,还有一个伟大的一个莫派的创始人,墨子,就已经发现了这个小孔成像的这么一个原理。

当时在墨经里面就有记载,井道再无有端这个道哈是通假字,是倒着的道,就是倒立的道,就是我们的整个景就是有了一个倒立在午有端,这个五可不是中午哈,这个五是中间的意思,就是我们光线穿过了一个中心这么一个意思。

景光之人兮若射,下者之人也,高,高者之人也,下就是我们整个景变成一个倒立的一个型号,是一个非常早的一个小孔成像的一个案例,然后又是一个亚里士多德啊,亚里士多德在公元前大概300年左右啊。

通常我们小时候看物理书啊,什么,有时候就经常会收到这个,亚里士多德曾经说过啊,通常是举反例哈,但是本身其实亚里士多德还是非常厉害的啊,那个时候他也他又是政治学家,又是物理学家,又是各种各样的学家。

那个时候他也发现了一个小孔成像的一个,这么一个现象,还有一个就是解码,是1544年有一个小孔成像的一个记载,啊,到了后来就真正的有了一个,可以记载的一个图像,就是最早哈这个叫1826年。

还可以看到右边这张图啊,最早的一个就是存在的一个拍照了一个图哈,就其实可能还有更早的,只是大家没有发现,然后这个是通过了八小时的曝光,还有一个就是developer来实现了最后这么一张图。

其实当时啊其实受限于技术的一个问题,当时就是大家把那个底片上涂满了那个溴化银,溴化银就是在光的一个作用下,就会产生一个它的一个性质的一个改变,这样的话就可以把图像的明暗记录下来,在那个时候。

大家也起了一个非常有意思的名字啊,叫hello graph,Hello,就是太阳的意思,然后把整个拍照的过程叫sun writing,这个是非常类似于现在一个光刻机的一个绰号。

就是大家就是把一个光刻胶抹在一个微博上,然后通过光学去曝光,去刻在一个pattern上,也叫writing,其实最早的时候,整个曝光成像就已经叫writing了,在那个年代1830年代啊。

这这个整个成像过程是非常新奇的,因为以前大家没有见过啊,顶多就是油画,大家画一画做了几个小时,这是一个非常新颖的一个体验,也是一个非常就是有影响力的一个媒介。

那个时候就是有非常多人去描述这么一个photography,这么一个事情啊,有人说哈,Capture memory a very very experience,In reform,就在一个方框里面。

我们记录了大家人对着一个物体本身的印象,还有起的非常有诗情画意哈,像painting with the light,就是我们又光画了这幅图像,做一个光的艺术。

还有这个HENRYMARTI就说了一个executed,Not the truth,我拍下来就是谁知道是真是假是吧,到了后来随着一个技术的发展哈,到了就是19世纪末到20世纪初的时候啊。

这人们对一个成像的一个photography,拍照的这么一个印象就改变了,这个时候像可以大家可以看到一些新技术,特别是右边这个图像,Marriage。

You use the high speed photography,就是人们真正的就拍了一个视频,就admit image screens,就通过拍了一系列的一个图像的一个序列,然后把它播放出来。

就形成了一个视频,这就是实现了一个非常大的突破,实际上本身就多了一个维度嘛,是把一个二维的一个黑白图,再加了一个时间轴,二维变三维了,其实整个成像的过程,特别是计算成像的发展也是有这么一个趋势。

就是不断的维度不断的增加,比如说大家现在最早最早哈就是一个黑白图,后来又加了个时间轴或者加了个彩,现在也可以记录好了,过分可以记录相位是吧,后面还会有光场,光场记录光线角度的信息啊。

这个就课程就非常有意思,大家慢慢慢慢的,就把整个光全部的一个形态去捕捉下来,可能未来的一个相机就不再是一个RGB的一个,点阵序列,或者是一个经过编码的一个视频,可能每一个像素点都是一个tensor。

我记录了非常多的一个东西,就变得非常有意思啊,这个时候同学们可以看到,人们对一个photography的印象,就从一个bucket word,就变成了一个人们就是怎么描述它呢。

就是一个need tainer,就是一个小的一个东西啊,可以装很多东西,比如说装像像用在activation,Music compilation,各种各样的一些信息都可以存在这么一个呃。

一个小的一个相机里,这时候人们还停留在相机,这个时候还停留在一个record world wac,就是记录大家看到了什么,或者是嗯拍到了什么,还是在一个像个小方框框一个显示里面。

但是成像真的是只是这些吗,大家可以看一下一些,更新的一些成像的过程,其实整个的相机啊是每天每时每天每刻,无时无刻不在我们的生活之中,包括我们像最常见的哈,特别是近几年我们这个马路上的这个摄像头啊。

这个拍照就吃了罚单是不少啊,这是一个非常典型的一个时代信息的一个应用,还有一些像像手机拍照啊,嗯像单反相机啊,这录像机哎对,刚才这有个同学博鳌士敖博士同学嗯,写了一个相机和录影机的区别哈。

这个其实大家买摄像机的时候,买相机的时候,相机跟录音机的区别最大,就是在后端存储的一个地方,就是录音机通常是可以支持绕data的,一个快速存储,就可以我把这些饶图拿到整个SQUENCE群啊。

这个输出量是非常巨大的,拿到这个图之后,我们再拿到一些后面的艺术家手里去,把这个图去修好,然后超越了今天的一些成像的概念之后,后面的成像会是一个什么样的过程呢,这个时候就给大家一个讲一下。

是the photography beyond the film like,首先啊就是大家生活在一个空间之中,是一个多维的,它有非常多的维度啊,首先它有我们的场景是3D的。

让我们的场景之间有各种各样的光源分布,每个光源都有自己的形状,都有自己的位置,就有自己的光谱跟强度分布,本身呢像用图形学的一个角度来说,我们的一些身体上的一些材料啊,包括衣服啊,皮肤啊。

都可以用一个B2DF,或者是用更高级的一些模型,比如说BSSDF来描述经过多次反射,本身物体也有形状,也有自己的位置要运动,从你的观测点,你的观测,特别是你相机的位置,大家学过games,101。

可以知道我们整个相机ISP成像一个up vector,还有一个呃另一个vector一起去描述,这个时候就有它的位置,有它的运动,还有一些投影的一些问题,这么多维度的信息是我们真实的生活。

这个物理空间的一个信息啊,然后我们计算成像的任务是什么呢,就是通过光学这么多维度的信息,经过一个光学系统,然后去调制或者结合的传感器一起去调制,最后在我的传感器上拿到了这么一个。

不知道是什么样的一个调制过的信息,经过处理啊,后面的一些算法来处理,然后再结合着图像的synthesize啊,重建啊,渲染啊,就可以用现在一个multi dimension display。

比如说像现在的VR眼镜或者是VR眼镜里面,我们再用一个光场显示,我再结合一些更多的一些信息,同时也可以用于理解,最后大家的目的就是真实的复恢复,物理世界中这么多维度的一个信息。

这是一个非常有意思的一个事情啊,讲了那么多呢,就是给大家定义一下什么是这个photography,然后什么是一个COMPETITIONALIMAZING,就什么是计算成像,其实本质上来说哈。

像除了传统的一些胶片啊,或者最早的什么都不处理的一些数码相机,后面的一些所有的和计算相关的事情,都可以叫计算成像,但是大家通常又不这么叫,就是为什么呢。

来给大家定义一下什么是competitional imaging,就computer amazing啊,或者是PPT photography,通常是一个有光学编码或者光学调制,或者光直接光学直接成像。

把这些信息从一个真实的世界,然后去捕获出来,然后通过计算或者算法来做一个decoding,就是简单来说哈,就是光学调制,算法解调就是这么一个过程,然后我们的目标呢就是拿掉你最后想要的信息。

比如说你想拿到一个二维图,那就让它的点扩散函数最小,比如说你想拿到广场,我们就可以放一个list,就是MICROYARRAY,或者是搞一个相机阵列,就每个不一样的一个应用场景。

都可以有配套的光学配套的算法,然后去拿到你想要的东西,但是本质上就是光学代码算法解条,与之相对应的呢,就是这个不得不提一嘴,就是一个competitional display,就是计算了一个呃。

就是这叫这叫显示哈,这是怎么翻译,也不是很清楚,它是跟计算成像是一个相反的过程,我们是用一个计算去编码,然后再用光学去解调这一个逆过程,这样的话就可以把更多的信息给大家展示出来,就最典型的一个例子。

就是裸眼3D或者是光场显示这么一个过程,computational imagine跟display本身哈,嗯你可以理解为一个图形学的一个分支,它是图形学的一个分支,但也不完全是我们可以看到右边这张图啊。

整个计算成像跟计算显示跟图形学相关,跟计算机视觉相关,跟光学有相关,因为光学是我们捕捉信息的一个必要手段,同时呢我们在方法上又有一些优化,还有求解逆问题的一个过程。

然后呢跟本身的传统image也是相关的,跟各种各样的一个人的perception,或者是物理学的prior,物理学的约束,物理先验知识都是一个相关的,总结了一下来说就是新的光学,新的传感器。

新的illumination,新的照明方法,还有新的计算方法,这是一个非常新的一个集合哈,这个有同学说这是一个大杂烩,但其实本质上也不是,这整个其实计算证件的目的非常清晰。

就是为了拿到我最想要的一个信息,然后我在这个前提下,我去优化光学系统,优化我的传感器,优化我的照明,优化我的算法,对最开始有同学问到呃。

这个computer image跟computer photography,到底有一个什么样的区别哈,其实本质上大家都可以混着用,它没有一个strict区别。

但是一些像academic community,还有一些像工业界通常有倾向,大家这个倾向,比如像computer image就是联合了光学一起优化,对着我,我要设定一个成像的目标。

光学跟算法联合一起优化,但是computer的photography呢,大家通常理解为traditional optics,就是我们传统的相机,我为了拿到更锐更清晰,更漂亮的,是更大进光量的一个图像。

当然很大程度上,就是大家认为日常生活中,接触了太多的一个真爱,一个词,就特别是大家手机厂家就是把这个计算摄影啊,可能是符槽轨做到一个非常高的一个维度啊,包括有非常多的经典的一些东西。

就是像HDR plus,google的HDR plus啊,还有一些像light16,大家后面会讲到这些东西,但本质上这个photography跟amazing没有太大的区别。

大家可以简单的就是理解为scientific,跟玩一玩就CONTROPHOTOGRAPHY,这么一个就是这么记一下也没没什么问题,你讲到计算成像了,你不得不说的一个事就是什么是光啊。

光本身在这里通常表现了一个是一个光线,但是计算成像呢又不能只局限在一个,一个光线的一个直线传播的一个过程,首先我们的光里面大概是涵盖的范围啊,计算成像涵盖的范围。

就是在这个wave optics跟那个job optics,这两个大圈圈里面,我们用到很多的性质,光学很多的性质,包括光学的一个波长,光学的一个偏振,还有光学的方向。

嗯这个我们会介绍一些像呃一些wave optics,特别是像d o e metal surface的一些优化方法,是特别是在后面的课程里面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

说了这么多,就是计算成像有什么应用呢,其实大家最直观,第一个想到的可能就是手机拍照,就是左边是一个google pixel的一个相机啊,它有很多的镜片,然后搞了一个非常大的一个sensor。

就是如果大家买到了比较特别是最近呀,就这两年买了一个新的一个手机,这个发展趋势是什么样的呢,就是传感器的底越来越大,就像素越来越大,然后整个呢光学系统越来越复杂,就越来越厚啊。

这是都是为了一个更好的一个像制,因为这个底大一级压死人啊,这是大家在搞摄影的里面,一个非常常见的一句话哈,就是我同样的一个像素大小,两微米的边长,一边的边长,进光量就差了四倍。

像你单反相机里面通常是六微米的一个像素,六微米跟一微米差不多,就差了一个36倍的进光量,所以对你的信噪比影响是非常一个大了,尤其是在夜间拍照的时候,说有喜欢摄影的同学就发现这个夜间拍照。

这个手机已经这么强了,怎么还是不如单反拍的清楚,就是底大一级压死人,但这个还跟光圈的设计啊,包括一些其他相差的校正是非常相关的嗯,特别是现在手机镜头啊,已经用了非常多的一个非球面的技术啊。

甚至现在有的厂家已经我知道了,已经用上了个WLO,就是我在用做那个就wafer上,就是我们像做半导体那一套工艺,去来做这个镜头啊,对整个element啊其实是特别是生产最新啊,是有一个很大的一个提升的。

当然它也有自己的局限性,这个设计的时候就比较困难了,特别是压膜,特别是像手机里面透镜啊,通常也不是全部好,大部分都是一个塑料的一个特性,就是pm i或者一些光学的一些嗯,就是有机材料。

它生产的是先做了一个模具,然后我去压模压膜,就要考虑热胀冷缩,其实整个生产工艺是非常复杂的,所以大家这么便宜,买到一个非常好画质的一个成像的手机,其实整个产业界在做了一个巨大的一个努力。

这个google pixel啊,其实在整个手机成像里面,有一个非常高的一个地位啊,就是他算是非常早的做一个计算成像的,这么一个东西啊,达不到光学波动波动光学的级别啊,这有个lab cg同学问了一下。

这个现在手机成像里面达不到光学成像的级别,是大部分都达不到,但是长焦是可以达到一个接近衍射极限的,一个问题的,像手机成像里面通常有什么事呢,就是大家最常见的一个就是夜景。

所以大家夜里想拍清楚这个事怎么办,还有一个就是HDR,就是高动态范围成像,大家想要看到一个更大的一个范围的,一个亮暗的一个程度,所以说这个时候,google那时候是一个叫MARLV的一个老师。

stef Mark lee老师是大名鼎鼎啊,是我们整个计算成像领域的鼻祖之一,就在这个方面做了一些非常大的一些贡献,像一些传统的,这是一个google19年SIGGRAPHASIA的一个论文。

它是move photography in low light,然后传统的一些像HDR plus呀,在暗夜里面拍的一些情况是非常非常呃,也不是非常差啊,其实因为本身已经做了多帧融合。

本身的噪声是已经降下来了,METALLIES应该暂时没有,还有一个是就是他们在暗夜的一个情况,会有一个什么问题呢,就是它的白平衡啊会比较差,就是在比较暗的一个光照下,就是我的色彩会很容易出现问题。

就是因为这个时候,本身这种器件的噪声是已经非常大了,那这个时候捕捉的图像,特别是前面有个滤光片就变得变得更爱了,其实这个时候就非常受一些本体电流啊,比如环境光啊,然后去影响我最后的色彩颜色。

这个东西本身也是挺复杂的一个东西,它并不是我们光学的里面说了一个波长啊,光波长,那那叫频谱啊,这个本身啊就是这个颜色,它是一个跟人心理相关的一个反应啊,不过人眼的一个响应,大家学过更直。

101应该知道就是人眼对光的一个反应,叫LMS这么一个三个响应的曲子啊,所以很多色彩都是根据最主要是CR1,1931,根据十几个英国人的一个看到一个眼睛,得到一个色彩标准,然后到后来又到了70年代。

又有一个新增补的一个CRE的一个标准,那本质上都是跟人相关的一个这么一个色彩,但为了这个追求暗夜的一些成像,很多传感器厂家,手机厂家都会想一些非常就是各种各样,很有意思的一些方法,包括像多摄融合。

比如一个黑白的看一个彩的相结合,增加它的细节亮度,确定支持它的噪声啊,还有一些像google,像google plus这个团队好。

是不是GOOGPIO这个团队他们做了一个auto white balance,就是用了一个深度学习的方法做了一个小网络,然后去做一个就是暗夜下的一个色彩的校正,那为了提高进光量。

还有很多五花八门的对传感器的修改,包括像呃RYYC,因为我们通常理解的月光片啊都是RGB,现在有很多RYYC的就是黄通道嘛,黄的本来就是绿的,然后加上这个红的,这样我这个进光量不是更大了吗。

但是这个时候就是它的色彩会有偏,就我们最后产生了色彩下载的时候,特别是显示的时候,我们是跟我们的基色有关系的,就是叫primary light,我这个是怎么做color matching。

跟我们这个就是sensor的一个filter啊,都有非常大的一个关系,那也有很多其他5号版本的方法,比如说像呃那个RGBW留一个通道哦,不用不看绿的了,直接全部就是黑白的,整个光全都进来。

还有像一些提高一些特殊的器件,比如说现在的QIS或者SPA器件,就单光子水光光光电二极管阵列,这些期间灵敏度会比较高,但是有什么问题呢,就是像素比较大,就是放在手机里面是暂时是比较困难的。

当然我相信这些厂家在不久的未来,可以做到这么一个缩小,就QS跟自拍的像素的这么一个问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

像第二个应用就是非常典型的,就是利用我这个偏振信息啊,就是跟传统的一个传感器有什么区别呢,这个传感器前面放了一个四个方向不一样的,一个像白滤光片的一个POLARIZER。

就是每个像素2×2的一个像素区间,有四个方向的一个偏振片,那也可以跟彩色结合嘛,那就是最后一个44个大blog,这个偏振成像就比较有意思了,比如说像微小的划痕检测啊。

比如像我们传统的相机拍出来上面那张图哈,就是基本上很小的一些划痕是很难看到的,这个时候在特别是在生产手机壳呀,就是手机玻璃啊,或者是一些比较光滑的表面的一些工件的时候,一些零件的时候。

这个微小划痕检测是非常重要的一个环节啊,有传统的一些摄像头,就算加了算法增强,因为信号本身的差异太小了,这个时候是对整体的,是一个比较困难的一个事情,但是偏振成像就可以检测到一个偏振信息。

从而就是我可以非常清晰地看到,我们这个划痕的一个问题,还有一些举个例子啊,就是比如说像我们自动驾驶啊,或者是就特别是那个现在可能最高兴的就是,就是做那个马路边上那个监控。

比如说以前像汽车的反光玻璃是非常严重的,就可以通过一定的计算,很容易的把这个反光式去掉,这个时候我就可以很清楚地拍到,车内是谁在开车,就是我吃罚单,就是我开罚单的时候。

就可以很清晰的拍到到底这个是谁的责任啊,所以也会有很可以用到像车内驾驶员的监控啊,特别是大家国内人很多人都戴眼镜,有反光的时候,你很难看到眼睛的状态,这个时候偏振成像就会有,一个非常大的一个作用。

啊最早的计算成像,在整个计算成像概念出来之前哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实就已经有一个非常经典的一个,计算成像的一个东西了,这个叫competition tomography,就是大家拍的ct,这个T呢他用的一个原理叫RANDOTRL,就我扫一圈,我这个像这么一个光线啊。

我这么扫一圈,扫一圈之后,然后通过一个random transform,我可以把这个一个截面的一个成像恢复出来,然后我再整个把这个人体啊扫那么一遍,就是把这三维结构呈现出来,现在这个CT啊,啊。

这个是应该可能是现在当今世界上最先进的,一个640乘的一个CD,就叫nunit image,就是国内一个联影医疗,他们可以做到一个非常快的一个就是ct的扫描,然后T本身扫描之后。

大家图形学的一些知识又可以用上,我怎么去realize我这个3D的data去给医生,或者是给后面的就是神经网络,而且更好判断啊,这个病灶还有一个就是非常有意思的一个PPT,就是新的一个CD啊,叫pad。

它是一个正电子发射断层成像,首先它是一个什么原理呢,就是往身体里面打核素,是啊,大家不用担心哈,这个核素对人体健康影响非常小啊,这个核素会在人的病灶处,特别是像肿瘤啊这些地方快速的汇集。

然后通过一个正电子的发射,然后我探测器用的是一个SPA p d啊,或者是一个光电倍增管,这个检测到非常快速的一个伽马射线,这个时候就可以快速的定位一个小的病灶,pad ct就可以定义非常早期的一个。

就是检测到非常早期的一个癌症,然后这位就是我们谢庆国老师,就是以前我读本科的时候,我们隔壁学院的一个老师,他在pad里面就是做了非常大的一个贡献,特别是数字派的PPT,他刚才同学们也有提到广场哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实广场本身广场的捕获啊,最早广场这个概念是什么呢,就是我记录我光线在空间的一个点,还有光线的一个角度,这是最早的一个广场定义,当然本身哈这个广场到底有几个维度,一直是一个谜啊。

西电的邵晓鹏老师就是专门写过一个专栏,就描述过广场这样一个现象哈,就是他到底有多少个维度,到今天还是一个谜,就是公说公有理,婆说婆有理,就是每个家对广场的定义都不大一样,但是最早呢就是一根光通过一个点。

然后有有方向的一个点,这个最早的这个概念是1836年,由我们的伟大的电磁学家法拉第提出来的,这是非常早的一个东西,然后到了后来特别是199几年的时候,有Mark away,别给他们判断。

HARAHA去首先提交了一个光场成像跟光场渲染,这么一个东西,后来才会有大家的一个光场成像,光场成像本身有几种方法,像相机阵列这个方向,就是国内在清华就做的非常好,就是用一个很多的相机阵列。

去来做一个光场成像,还有一个就是像micro ray,在我的焦平面上,就是我相机的一个焦平面,后,焦面上放一个micro liner ring,加上每个MICROLENS就相当于一个小相机,这个相机。

然后后面就会记录各种各样角度进来了,一个光线啊,还有一些像万花筒的办法,其实这个光场成像在早期也会上有非常多,五花八门的一些方法,非常有意思,虽然说现在已经淘汰了,大家回过来看。

其实都是非常有创意的一些东西啊,啊光场成像呢就有光场显示,这就右边这个是斯坦福的高中维斯塔斯老师,做了一个光圈显示就可以,这个原理是什么,有两层或三层就LCD,而且我去调制光线的角度去把它显示出来。

这样的话就可以展示,那么一个给大家展示出来的,就是一个真3D的一个成像,但这个时候特别想提一嘴哈,就现在很多就VR眼镜就戴着非常不舒服啊,就是为什么不舒服呢,就是就带着时间长会非常累,有几个原因哈。

首先是现在延迟大,这个咱不讲在显显示上面有什么原因呢,就首先这人眼睛啊,就是人的眼球的对焦,跟这个双目立体这个深度啊,就是你晶状体的对焦位置,跟你两个眼睛就是拐这个弯,这个对焦位置是一致的。

这是neural link,就是神经link在一起的,如果这个地方不匹配的话,你的大脑就会接收到错误的信号,就会显示的不舒服,其实光场光场显示啊,在这个VR眼镜里面是一个。

我感觉为当然现在显示质量是太差了,这后面如果解说这个解,解决这个显示质量的问题啊,可以很大程度上解决VR显示不输出一个问题,当然这也有很多其他的方法,比如说像那个就用音圈马达直接调焦啊。

或者是像hello graphy啊,每个方法都有各自自己的一些优缺点,都非常有意思,当然就刚才最开始同学提到了一个black hole image。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我去怎么拍一个远距离的一个黑洞,但这个是当时是一个比较巨大的一个工程,他用了全世界很多地方的一个射电望远镜去拍,各个在全世界各个位置,就相当于一个差不多像地球这么大的一个口径,它的衍射极限就是非常大了。

人类拍多远,拍多大细节,很大程度的都决定了我这个透镜能做到多大,这个时候就相当于我们的口径就像地球一样大,然后这里面成像技术比较复杂,它的数据量非常大,都是通过硬盘寄送的,然后还有一个很大的问题啊。

就是拍照的时候,我要因为这个黑洞这个里面的一些电磁波啊,经过非常远的一个传播啊,这是一个非常就到了很远的地方,实际上是一个平面的,它的相位我们来进入它的一个精准的记录,他的一个相位。

这会对时钟的要求就非常高,就我如何实现这么多观测点的,一个高精度的时钟同步,当时就用了一个原子钟这么一个技术,然后还要考虑一些像相对论的一些,引力的影响啊,来去校正这个时钟。

最后才能拍到一个这么模糊的一个,一个黑洞的一个图像,这是一个非常伟大的一个进步啊,当然现在呃如果大家感兴趣的话,其实可以关注一下引力透镜,这个像恒星边缘啊,就是我们的光线会受到引力的一个作用。

产生一些弯曲啊,弯折大家如果有兴趣,可以做一些这方面的研究,比如我把太阳当成一个大的透镜,把太阳周边造成一个大的透镜,我就相当于把一个透镜的中间给扣掉,然后用周围的那些光线的边顶。

去呈现一个更远距离的一个高清晰的一个分辨,大家有兴趣的话,可以做一些这方面的研究,其实现在还很少有人做这些,嗯还有一些比较有意思的就applications。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

像nonsite image,就是我拍到一个墙后面拍不到的一个东西,这是通过一个什么原理呢,就是光够快,我一个快速的激光打到一个墙面上,然后反射到一个球面波,然后就往外传播。

传播到我一个墙后面的一个物体,然后这个物体再通过这个一个平板啊,然后映射到我最后拍到了一个图像成像里面,就可以呈现我这个墙后面的这么一个场景,这叫not lismeting,这个地方就对比如说像反恐啊。

像武警啊,武警救人啊,救火啊,警察啊,这些地方就是比较有用,当然最后能不能实现,这个也要看技术手段呃,还有像大家可以,可能这个计算成像是一个敢想敢干的事情,首先你得敢想,你怎敢实现,我们潘建伟院士。

中科大的潘建伟院士,跟徐飞虎老师,就做了一个45km外的一个三维成像,这是一个非常就是大的一个数字啊,45km的三维成像,首先所以说这个计算成像有意思的地方,就是敢想敢干,就你敢想,你就能敢实现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大家现在可能是市场非常关注的,一个是一个VR的一个捕捉,就是很多现在VR360全景的一些VR成像,大部分都停留在一个2D的一个VR全景,就全景有非常多的办法,比如多个摄像头,或者像以前手机。

大家转那么一圈儿去拍一个全景啊,那这个FACEBOOK自己去做了一个,这是19年C8FAA的片头文,后来又跟red camera做成一个产品,就可以做到,我实时的用那么十几个red camera。

去呈现一个带有3D场景,我可以你可以看到可观测的角度的一个,就VR场景重现,然后画质也是非常清晰,这个是但是这个东西非常贵,一台可能要100多万,这个我估计后面如果能国产化,就会做到一个比较低的价格。

可以驱动整个VR和元宇宙的一个发展,在提到计算成像啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不得不说这个light16啊,其实早先大家在新闻上都看到了,就是我用这么一个相机,后面密密麻麻的那种小摄像头,长焦短焦啊,黑白的,然后再加上彩的各种各样的大小尺寸,把它这个图像拼接在一起就可以。

就是oin om out就远了,近了就是各种光线明暗了都可以看清楚啊,当然这个产品有个失败的地方,就是它的这个功耗啊,实在是非常大,然后计算速度也非常慢,然后后来呢就是最近啊。

就是清华的戴琼海院士跟方露老师,就做了一个UNCONTRACY的gpixel video graphy,就是通过这么一个摆放的一个相机阵列,然后有各种各样不一样的焦段啊,然后去拍摄。

记录我周围的这么一个2D跟3D的一个,高清的一个场景,这是一个非常巨大的一个工程啊,还有一些比如像计算光谱成像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就光谱成像,特别是在国内,他们在光谱成像就做了一个非常大的一个贡献,大家可以关注一下各位老师的一些工作啊,还有一些像传送的image,就是我以前做过一个一个小玩具,还可以拍摄到一个20皮秒的一个分辨率。

到非常高的一个速度,像以前西北大学,美国的西北大学啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

做了一个smart r hor嗯,这个说是跟计算程序相关的,但是又不是很相关,这个东西是什么呢,就是一个可这个可以做间谍,用好这个地方,它可以非常长时间的待机,这个信号是我有红外信号之后。

然后去触发这个相机去开始记录拍摄啊,这叫smart r r sensor,其实整个红外的应用非常多啊,包括像E红外夜视啊,包括像红外遥感啊,去探测石油啊,去看农作物啊,或者是看就非常多的军事目标。

或者是看一些啊不一样的温度啊,电场监控啊,燃烧的监控啊,这非常多的应用,但红外本身因为这个本身传感器啊,就是硅基啊,还有一些三五族化合物的,就是硅基,顶多就是能感受到110NM的那个范围啊。

在场的范围就要用三五度差化合物了,比如像褶机的呀,或者是用一些深化音甲,这个时候噪声就比较大了,那红外的处理其实是比较困难的,就是它噪声会比较大,所以说这个红外其实在国内,有非常多的老师去做红外啊。

包括像嗯北里的金玟岐老师去做那个红爱了HDR,解放军夜视啊,这不能说啊,还有一些像extended depth of field imazing啊,这个是做一个大景深的一个成像啊。

包括可以跟索尼一个标准去对比啊,就可以再做到远了近了,在一个很大的一个噪声范围内,然后就可以实现一个非常清晰的成像,这个地方可以用到什么地方呢,比如说像扫码成像,就是大家比如拍手机二维码的时候。

有时候离得近了,离得远了,拍不拍不清楚了,对不对,这个时候在物流分拣里面,也会有非常多的一个大学生的一个问题,就是我要想扫上这个码,就只能摆到一个特定的一个范围内,做了这么几个景深延展了。

就可以远离近的太清晰,你这个随便一扫就可以扫上了,这时候在物流里面扫码呀,或者是体系识别啊,当然这个在摄影里面就特别是最近的一些呃,像摄影就是大家拍电影啊,拍电视的也会有一些对大景深的需求。

那么景深本身这个东西啊有好有坏,大家有想要虚焦,有时候也想都要清洗,这个就是具体看需求,哈哈小变大,那那那是。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有一些像一些水下的一些三维成像啊,这个叫marine imaging technology,这家公司做的,大家可以看到是一个很巨大的一个三个,还是四个相机摆那么一个小阵列,然后拿到水下。

其实水下的一些二维跟三维的成像,是比较困难的,首先说被动成像啊,就水下的被动成像本身就是因为也看不远嘛,因为光在水下也看不太远,你到了几10米深,上百米深下面就已经全黑了。

这个时候你成像它的一个距离啊非常有限的,他主动的一些成像呢,比如我打出一个激光,因为水下本身对红外的一些吸收,就是长波段的吸收非常厉害嘛,可能在480NM左右就有一个窗口,就是需求最短的。

大家可以在水下成像的时候,三维成像就可以,通常用一些比较短的一些波长的激光照明,特别是像蓝光啊,或者是532532比较便宜,这个时候在水下成像又会有什么问题呢,那主动成像。

大家知道水分子啊会有一个背向散射的问题啊,我们往前打一个这么一个光,它就会很多往你反方向的去散射,这个时候对你的一个探测器,就会有一个非常大的干扰,就是说水下这个成像就是非常困难,而且特别是本身啊。

因为水里面环境比较恶劣啊,就是特别是海水大概有风有浪,就大家去喜欢去浮潜的同学,就会看到很多地方就是水都是非常浑浊的,能见度可能2米呀,这就看不见底下到底是啥了,就是对摄像头。

对相机来说也是一个非常巨大的一个挑战,啊右边这个是以前做了一个工作,就是光学的一个optical,就是最优的一个采样函数,就可以让我传感器拿到一个最优的一个,采样过程,可以看。

可以看到经过调整跟不经过调制,做这么一个超方面的一个效果,就是对一个采样的一个问题,是潜艇用的不是这技术啊,美国的潜艇应该暂时没有用上这个技术,说实话还是在比较早期的阶段,都是拍完之后。

然后回来再慢慢算,潜艇上肯定不会用这么一个不稳定的一个技术,现在很多像美国的潜艇,应该用的还是以声纳为主,光电探测其实是非常少的,当然水下也可以试一下长波,但是长波分辨率就比较低。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有一些像太赫兹成像啊,是这个非常近邻啊,非常有意思的一个东西啊,太赫兹是啥呢,钛合兹是一个超远红外,介于超远红外跟电磁波之间这么一个东西,这时候就它有一个非常宽的一个普段啊。

这个超远红外这里面就性质就非常多了,钛合子本身它既有光学的性质,又有电磁波的性质,然后本身上它的透镜通常就是塑料的哈,就现在也有比较多的应用啊,比如说像大家安检,就是检查你身上有没有一些金属啊。

或者是呀,这个整体伤害基本又基本上没有,钛合资,在安防里面已经有了非常多的一些应用啊,不是微波啊,它比微波炉更接近光那么一点,它是就是大几百个G赫兹,到一个接近电磁波这么一个波段。

当然本身哈太赫兹也有非常嗯不一样的,光源跟成像设施就是不一样的,因为它一整个带宽实在太大了,就不一样的,有不一样的一些设备,这个作品呢就是我们就庄松林院士啊,朱一鸣老师去做了一个这么一个研究。

这庄院士呢本身是国第一,算是第一代国内的就光学成像的一代人,那个时候呃,庄院士那个时候是非常困难的,国内光学设计,但那时候都靠手算,大家知道手算这个光学成像了,这个设计是非常非常困难的。

后来这个张松林老师就自学编程,那时候条件非常差,当时都是那种很老旧那种286啊,或者是386那种老旧的电脑,那个时候就边学编程,那时候编程语言也非常困难,不像现在有高级语言。

实现了中国第一套的一个工业设计的,这么一套软件,那个时候对国内是有一个非常非常巨大的贡献,这是一个从0~1的贡献,所以说我们要不断记住,我们这些前辈的一些贡献,然后去努力向前辈们学习啊。

右边这一个是用在一个optical cn,就光去计算,因为光本身计算这个神经网络啊,就是做福利变换呀,或者做一些卷积啊,其实是非常容易非常快的,现在这个现在的技术可以做到,11TP的一个范例啊。

直接用optical cn,除此之外,其实还是有非常多的其他的应用的,但是今天我们时间问题,就先讲一些计算方法的一些问题,本身呢我们先考虑一下整个forward的一个problem,就是正向的一个课程。

就是大家以前学过的101,里面讲的一些渲染的课程,然后从我的observation,但是本身啊像caption imaging跟ration,就是解决一个inverse problem。

它是一个逆的问题啊,我们要恢复的一些是一个物理空间中,我observation,我物理空间中的一些property,如果要恢复光学的一些相位啊,或者恢复的光场,像正向的一个过程通常是描述如何呃。

就给你一个physical objects跟一个参数,就是在一个观测到了一个结果中,它是一个从model到observation的一个过程,特别是像我们像很多大家同学们喜欢搞,那simulation。

Simulation,水的一些波动啊,或者电磁或者磁流体的一些改变啊,或者这两年就对衣服的这个仿真啊是非常火的,嗯特别是用在图形学中或者是image operations,像逆问题呢。

其实通常描述的是一个从observation到一个mod,的一个过程,这个linear inverse problem,就是大家最常用到的一个地方,就是。

我们发现整个正常的课程可以用一个linear operations,特别像matrix tensor来描述的一个过程,这样我们解密问题的过程,就可以用一些线性代数啊,或者一些优化的方法去来。

很容易的去做到,所以大家就非常喜欢linear inverse problem,但也有很多物理学的约束,大家最后解起来会变得比较困难,但这个都是可以解决的,说到整个就先验知识啊。

先验知识分为一些generic跟specific,的两个方向,就是更通用的一些呢就是比较wicked prior,但最常用的就是大家图像,特别是二维或者三维的图像,或者更高维的一些tensor。

整个信号的分布啊,包括它信号的分布,还有信号它的梯度的一些分布都是比较稀疏的,是一个比较常用的一个物理学的一些,就是先验知识,然后稍微更就是具体一点就叫一个generic basis。

我们可以用一些小波变换呀,或分裂变换的一些G,就是我们不再有直接表示规定的,你可以间接的表示这些东西,这样的话就是它的一个物理的约束会变得更强,但是呢同时又可以就是我explore它的一些性质。

到了再具体一点,我可以我们可以先用一些learn base,包括像conclusional space coding,像像那个学一个dictionary,我学一个小神经网络,就当一个prior。

那更具体的就是一个特别具体的一个东西,比如像一个场景,像iphone tower,我就要恢复一个iphone cover,这个我都知道我把这个踩了信号,按这个方向去恢复就好了,就是就从弱到强。

有不一样的一个程度的一个物理学的先验知识,那通常大家有时候也叫这个东西叫约束,有了物理性的约束,我再把我的观测的东西,向我根据我物理学的约束,去向我最终的目标去靠拢,就给大家展示一下。

现在当下的一些比较常见的一些问题,的一些先验知识,首先就是我们忽略掉就是物理的性质,跟就是我们的先验知识,就可以考虑到我们一般的图像处理,比如说要做一个直方图均衡化,和一个简单的一个media tua。

或者一个CASSISMOOTH,或者是那么拉普拉斯算子去做一个商品,这个时候我们同样忽略忽略物理的过程,然后去考虑一个更强的一个约束,就是更强的一些性知识,就通常就是一个学习的一个power。

就是通常是大家最近关注的比较多的,就是深度神经网络呀,包括可以用到single shot learning啊,或者是去denoting啊,transer learning啊,或者用一些干啊。

或者端到端的一些学习啊,或者是fundamental models,这些,用这些我们通过数据获得到的一些,就是线性支持啊,同时再往上一层哈,我们要考虑一些物理的一些知识了。

就比如说我结合一些物理跟我要的一些prior,比如比较弱的一些像classic Steal,就完全只是用物理去算,也没有啥prior,然后到了现在,比如说用deep Steal,就是用深度学习。

然后用两个图像来实现一个三维的一个结算,像微信里面也有非常多的应用,特别是我想说一下这个classical optics,就是以前计算摄影中用了非常多的东西,叫p sf engineering。

这个也是没有啥prior,就是大家就是explore,它是物理学的性质,像渲染呀,microscopy啊,Inverse optics,或者是if infantry,这是叫answer感受成像。

这个时候就是我去探索它的物理性质,通过这些物理性质来获取我更想要的信息,现在的一个趋势呢,就是同时结合我的物理一些特性,然后再结合一些我们学到了先验知识,比如像deep optics。

或者是我以前做的那个defensible retraction optics,就可以真正的实现光学跟算法的一些联合优化,这个我们给计算成像的一些问题,做了一些分类啊,我们可以从首先从空间时间啊角度啊。

光谱还有偏振这些性质来做一个横向的分类,然后在coding with information,就是我对照明进行调整,对光学进行调制,对传感器进行调制啊,做了这么一张表,大家感兴趣的话可以仔细研究一下。

就是通过不一样的性质,跟不一样的一些coding的方式去哎,就是分了一些计算课程的问题,但大家也可以用这张表的一些知识去,就是想到一些更一些先进的idea,去做一些有意思的research topic。

就很多的一些逆过程啊,就可以很容易地总结出来这么一个公式啊,就是大家很多问题,都可以通过这么一个公式的形式,无论你是用学习啊,深度学习的方法也好,也是用传统优化的方法也好,还是用基础的算法也好。

那你求解一个逆问题的过程啊,大部分场景都可以用这么一个公式来描述,首先说这个B啊,就是一个我们最后在传感器上拿到了一个东西,那A呢就是我成像过程中,比如说我加一个光学进行调制。

X呢就是你物理空间中的信号,你经过光学调制,再加上物理空间的信号,最后拿到的应该跟你的一个measurement,应该是近似的,这是一个前面的一个语data term。

后面呢就可以加一些前面大家讲到的一些image,prior或regular rior,就是我们先验知识,我可以让我的gradient是spars,这个时候,比如说前面这个A是一个是一个模糊。

这么一个过程,然后我模糊加上我要一个清晰的一个信号,这A是模糊的过程,B是模糊的,观测加一个规定系数这么一个约束,我就可以截到一个比较清晰的一个图像,即使我的观测是模糊的。

我也可以拿到一个比较清晰的图像,后面我会教大家去怎么解这么一个问题啊,就是解它是有比较多的方法,下面来讲一下整个cross的一个ROADMAP,就是我们这个课程是怎么设计的,对诶这个同学有个同学说。

某科学,这个同学说和制造的基本公式是结构是一样的,这个给大家说一下,计算成像本身它就是一个噪声受限的一个课程,他很多的最后拿到的结果,很大程度上都决定造成了多少,你可以理解为计算成像就是一个噪声受限。

跟我的带宽受限,的这么一个两个受限的一个过程,所以说有时候大家做计算成像的时候,要尤其考虑噪声的一个问题啊,为什么要学计算成像呢,呃首先计算成像有一个非常巨大的一个,市场空间。

每年以22%的一个速度在增长,然后包括现在有290亿美金的一个,只是在山地成像,就有290亿美金的市场,还有更大的一些各种各样的探测,因为它是一个建立,你就是你物理世界跟你的虚拟世界。

或者是素质世界的一个桥梁,因为大家知道80%多的信息啊,人都是通过视觉来捕获的,但整个计算成像也是一个捕获信息的一个窗口,它将是整个信息捕获的一个,变革性的一个突破口。

但是他也我们学它也有一个很大的想象空间,因为它有非常多的课程可以带大家去探索啊,当然它本身是一个非常迷人,非常有意思的这么一个课题,呃首先我们刚开始要讲的就是给大家讲一下。

就是human vision system,Human vision system,包括人眼的一些性质啊,啊对焦的对焦的人眼对焦的一些问题啊,包括演的市场啊,演的accuracy。

因为这个是跟我的display相关的,还包括人眼的动态范围嗯,像人影的一些相差,比如说像这个像近视眼啊,或者是散光啊,这个相差是怎么来的,然后还有一些人眼的一些对比度的问题,包括像你锥状细胞跟感状细胞。

所以不一样的宫墙跟不一样的色彩,响应都是不一样的,嗯但是色彩这个问题啊,我会专门抽一节课给大家讲啊,色彩这个东西还是比较复杂的,会给大家cover掉一些呃,Spectrum。

还有power distribution,就包括光谱光强的,这个大家可能学学过了,但是这个还是有必要大家复习一下,包括呃颜色的生物学基础,这尤其是跟人眼相关的。

包括像人眼睛的一个photo center response,不过人眼的concel response叫ms响应的曲线,这个时候又跟大家相机的设计比较相关。

像color filter array这个response啊,还有一个MATERISM,就是用不一样的颜色,不一样的一些光光的一个分布啊,可以产生一样的颜色,这个时候就得显示就比较重要了。

大家现在看着屏幕啊,所有的屏幕不一样的牌子不一样的,就primarily beyond theater,其实大家看到的色彩都是不一样的,如何把这个统一起来,这个是要在颜色这一章给大家讲到的。

包括像display reproducing color,如何从我的color filter位匹配到了一个颜色空间,然后这个颜色是怎么在我们的显示,跟我的后面的背光。

跟我们的一个LCD的一个color future去对应起来,然后再到人眼呈现一个跟人眼比较,当然也不是非常真实啊,就比较真实的这么一个色彩,这叫color reproduction。

这里面就涉及一些呃一些线性代数啊,或者是machine function的一些问题,也会给大家讲一些class space或如何,大家是如何把这个颜色是统一的,因为这个颜色啊涉及人的心理学跟生物呃。

这个事儿就比较麻烦,嗯然后第二后面就会给大家讲一些camera的问题,包括camera lens啊,比如说摄影的小技巧,整个sensor的一个捕捉的一个过程,还有大家感兴趣的话。

可以讲一些大家returing of realance,就是我用图形学去做reaction,去如何复现一个真实拍摄的一个效果,尤其是在sensor这张会给大家介绍一些像素啊,Califa arra。

Exposure,Soo dynamic range,尤其是noise,noise这个东西会单独拿出来给大家说一下,因为这个地方非常重要,然后给大家讲两个大工具包。

第一个工具包就是image tokit,然后第二个工具包就是计算的TK,这两个工具包会给大家就是分别介绍啊,包括像开始介绍一些光学的一些问题,包括光学的基础性质啊,成像的机理,光线是如何弯折的,呃。

还有一些比较像大家同学关心的,一些比较高阶的一些就是透镜啊,就是大家可能在生产生活中都会用到的,像doe metall,还有一些自由曲面或者非曲面的一些透镜,然后给大家讲一些相差,包括相差。

包括SEO operation,就是大家基础的像呃求差会差,相反厂区机电子会差会差这些东西,然后讲一些相差的一些微方的分析,就拨弦分析,就包括点扩散函数啊,就model穿梭的方式这一块。

我的光从我的镜头到我的传感器,我会拿到一个就是通常啊就是基本的一个成像,就是一个RGB的每一个东西,如何把这个RGB你转化成一个,最后大家可以看得到的这么一个,比较好看的一个图嗯。

我会专门抽一节课给大家讲一下,Image processing,开盘就是一个基础的一个图像处理的一个过程,包括像我在白夜读卖一些处理,包括像我dead pixel correction。

这个dead pixel啊,就是还有Deft pixel,Hot pixel,还有一个就是这是啥意思呢,that pixel就是我加工过程中坏了的就完全不亮,hot pixel也是坏了的,就是完全晾着。

还有一个中间的一个就是完全是一个值的,就是三种这个pixel怎么去校正,还有就是黑电瓶的校正,还有像剧造啊,这因为这个剧造加到这个绕狱里面,因为本身啊经过一些链路的一个处理。

噪声会分布会比较变化会比较大,这个时候处理比较困难,然后就专门给大家讲一下绕欲的渠道,还有像3A就是大家常见的一些自动白平衡,自动曝光,还有自动对焦。

还有length shading correction,叫叫见运,这个叫为什么叫见运呢,就是中间亮边上按这个叫见运,还有一些像去反走样啊,像去马赛克啊,就边缘增强啊,就是false color。

什么意志啊,就是如何教大家如何调brand control,教大家如何去调伽马,还有做tomappt mapping,就是把一个特别大的一个动态范围的东西,压缩到你的显示一个。

比如你一个八位的一个显示器,怎么样,在你这个八位的显示器上,就显示一个比较大的一个动态上面的一个东西,这个时候就需要一个比较好的一个COMBPPT,讲完了,这个ISP呢会讲一些比较高级的一些。

图像处理的过程,就不像HDR成像,HDR成像这个事儿哈,就是我专门写过一个综述啊,他大概我总结大概有六种方法,就包括从增加警的容量,但是井容量大了嘞,这个这就是它整个过程会响应,会变得比较非线性。

这个对后面处理比较困难,第二个就是食欲调制,就比如多报多次曝光,如何一个短报一个长报,然后大家把这个fusion在一起,这个课程我可以涉及到这个HDR fusion这个问题,那还有空余曝光。

比如说像现在其实产业这时域曝光控制,曝光都有应用,像STG的,像hr就是大家一行长长长曝光一行短,曝光不是像棋盘格一样,这块儿是长的,旁边那块是短的,在一块长的这块短,这个把这个结合起来。

就是实现一个比较大的一个动态范围,那还有一些其他的方法,像一些特殊的成像器件呀,或者像我用一个DV去曝光啊,这这个HER这个课程啊非常大,它这个非常的就是很有意思的,文化版本的一些方法。

呃这个除了这个还有一些,因为VR现在成像会比较火热嘛,所以大家给专门开一个就是3603百六十度,这个全景成像那个小专题,小课程包括有哪些方法呢,就包括大家图像的一些拼接,还有一些呃就折返式图片系统。

因为除了大家买一个相机阵列,或者一个相机扫一圈去拍一个全景图像,还有个漫画,就是光学有个折返透镜,就做了一个那种那个抛物线式的这么一个透镜,然后这边放一个sensor啊。

搞这么一圈一圈的图像都可以经过这个反射,然后再加上一个折射透镜,最后呈现到我这个传感器上,这个也是非常有意思的一个课题哈,还image fusion,包括像wait average里面非常基础的。

包括像拉布拉shing gossian premium gradient with fusion,这个image fusion,很多地方就是用到金字塔的一个fusion,为什么要用金字塔呢。

这个跟图形学了一个miss,map的方法是比较类似的啊,这个本质上来说,这个跟大家学生的网络了,学那个就是深度神经网络里面,那个UZI也非常相似,为什么要当3P呢,就一层一层到三分点。

其实是在提取不同尺度下的一个品质特征,就相当于在不同频率下,我对这个东西进行采样或者提取,这个时候对呃边缘和拼接边缘啊,或者是一些小的过程就会有一个比较好的效果,嗯还有一个EMOJDK。

就是MINATION,就是我怎么样科学的照明,我怎么样照多长,给多大的光强,就是我打光怎么处理,我这个颜色波长,还有偏振,这个照明怎么处理,或者甚至是食欲的想怎么处理,我就可以给用脉冲光。

也可以给一个相位调制的图像,这个同学问了loving purple,这个图像配准会有设计,因为我讲就是3。0图像拼接,这个一定是要涉及图像拼接的这么一个问题,这是image to kids。

然后除了imagine two kids,第二个大的一个部分就是计算部分,就我们如何去实现对光学前面的一个系统,进行一个校正,就是我的一个mathematical的一个。

COMPETITIONAL的一个TOK,这是总结了一个如何包括我们信号处理啊,包括信号里面的采样啊,或者是信号的一些就digital signal processing,Econvolution。

线性系统,物理学基础的基于物理学约束的方法,就包括AD m m half correct disability,诶,继续学习的一些方法,就是现在大家主流的一些learning的一些方法,Noise。

我会专门出一家给大家讲一下啊,这个这个,noise它有非常多的一些源头啊,我们要分析一下这个噪声是怎么来的,才能更好的了解一个这个噪声的这么一个问题,包括像我热噪声散粒噪声,散粒噪声。

你无论你相机怎么样,我这个搜索CTING的个课程就是光子来的过程,它是一个你可以假设它是一个随机的一个过程,他这个来这个过程它就是一个普通的一个课程,它就是一个shot noise。

它叫flick north,叫F1F分之一噪声分之一噪声,这就是因为大家公平的一个就是特别是试电啊,50hz,60HZ在闪啊,这个问题怎么解决,其实有的一些传感器厂家已经解决这个问题。

就是我让我传感器成像那个周期啊,这大概是你这个试电的两倍三倍,这个时候就flickering这个地方就可以解决掉,还有一些像supply voltage的noise,Read out noise。

就是reset noise,Fix pack noise,有这么多一个噪声来源,我们要分析它,然后去去除它,包括像一些传统的一些tutor啊,高深tutor media future嗯。

比较通用的一些方法,像look not local me和bm CD block magic method,这个BMCD是目前来说比较通用的,最好的一种方法。

但后面会有一些learning base method,但我感觉整体就是没有BMCD普适性那么好,对这个大家没必要刚开始就懂,就是这个给大家推荐一下这个书哈,嗯关于这个输出问题。

因为这个本身计算成像还不是特别成体系,就没有像以前大家图形学以后,有虎叔可以看这个,大家跟着就是slides一点点学就好了,这个encoding包括有special encoding。

就可能可以对这个PPT进行一个coding,也可以对sensor进行一个coding,over color光谱呃,超分辨啊,HDR来自广场啊。

也可以对innovation进行ECODING这个这个including啊,这个就是比较有意思,会给大家讲一个比较长的一个时间哈,那除了空域调制,还有食欲调制,食欲调制就是大家经常用到非常多的一些。

就是叫time of fighter,是不是叫time is solved image model,就包括像呃lock in sensor base的sweet image,就是大家常说的IOS。

就包括一下微软的key ne,跟包括跟我们做的那款相机都是基于IOS,那这个问题就会比较多啊,除了这个还有像direct time of flight,就是就现在大家常说的一个speed。

就发出一个脉冲光,我直接记我们脉冲跟最后接受了一个时间差,来算我整个3D的一个场景啊,还有一些其他的应用,包括像nancflowrison lifetime,就是latin flight。

Polarize,还有polarized tm flight,就是相当于刚才的一个那个加一个加一个,就是他们fly sensor,前面加一个polarization的一个filter。

这个地方大家可以就是特别有意思啊,就可以比较提高一下他的信噪比,但本质上都是基于一个i top跟t top,或者是有其他的一些,像blur的一些springs的encoding。

这个都有非常多的一些方法,那最后会给大家分享一下,一些比较前沿的课题啊,包括像light to the image,就光场成像,还有光谱成像,光谱啊,这个成像其实这是比较困难哈。

这个以前啊大家通常有一个光栅,最早就是用一个棱镜,要把这个棱镜把这个一根光去分开,然后发到成像传感器上看一看,后来工艺进步了,大家可以做那种光栅,包括透射式光栅,还有那种闪耀光栅。

去把这个光谱去比较均匀的分开,然后去捕捉它,但光谱有什么问题呢,就有些通道啊是非常暗的,这个噪声就会比较大,这个时候处理也比较困难,但spectrum免疫体本身因为通道比较多哈。

大家可能关注CPR多的时候就发现诶,这个图像从三个通道输出到32个通道,但实际生活运用多,特别是像卫星啊,就是摇杆啊,那里有几百个上千个通道,这么大一个数据量如何存储,然后暗通道如何处理。

这个sal image是一个比较复杂庞大的一个课题,嗯polymatic image这个地方也是比较新,因为这个传感器最近出来,刚出来没几年,它是在怎么实现的呢,就是我在我普通的传感器前面加了一成。

像metal surface的一个东西,这个地方就是可以实现就像白滤光片一样,那个这么一个pattern在上面,我估摸着哈,这个他们实现可能是用一个灰度曝光,或者是一层一层刻的一个画层。

因为本身像光刻机啊,有一种叫stepper成像一个投影仪一样的地方,我不一样的mask,我可以往上面投,这个生产过程中,其实他无论在对齐啊,或者是精度啊都会非常非常的高。

最后可以给大家分享一下defensible and PPT camera image,题材就是如何把我的光学系统做成可以微分的,大家可以用数据的方法去驱动整个光线的设计,在设计光学的时候。

配套的算法也跟着一起出来了,就可以实现大家对特定的场景,进行一个比较好的一个成像,也可以在光学跟算法之间做到一个成本,或者是你想要的一个东西的一个平衡。

然后还有一些lot of interesting topics,今天主要给大家讲了一些image的历史和,今天还有一些就was compimage,还有一些它的应用啊,包括整个计算成像的方法啊。

最后给大家介绍一下整个课程的一个ROADMAP,感谢同学们,今天我们就到这里了,谢谢大家。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大家很多同学问了很多问题啊,这个我来先解答一下,作业是作业应该会这个我在第二节课会列出来,这个作业大概是5~7个coding的作业嗯,要求是要求就是课程本身那个要求呃。

综述综述方向就是啊如果你要看前沿的总数,就可以看一下我写的一个计算成像前沿进展,如果大家想要看的比较细的话,我推荐就是南理工,左超老师写了一个计算光学成像,过去,今天。

未来就是写了个180多页的一个巨著啊,这个大家可以看一看,有非常多的细节的东西,可以看一下,四方向捋网实现诶,这个很有意思啊,啊那个11T的算力就是实力,这个就大家算,就是无论是AI推理。

就是有个单位叫t flops,就是你就是单位时间,你这个INT8或者F16或者int32,就算了多少次,这么个意思,画了多少章节哈,这个章节我没数过诶,不好意思呃,空顶作业暂时不需要GPU。

就是为了大家统一比较容易写吧,就是这个大家统一都用Python好了,我会给大家约束用了哪几个库,然后给大家一个比较详细的一些指导,大家教大家,怎么实现这个遥感和计算成像的关系。

这个SUNSTREAM同学问的嗯,摇杆其实你说是属于计算成像啊,他也不属于,你说他有一个比较交叉的一个范围啊,就遥感呢其实也有非常多的一个普段,包括像红外啊,可见光啊,还有一些像甚至是电磁波的一些探测。

这个有一部分交叉,但是也不是完全交叉,这个遥感我推荐大家去看一下,武大有个叫宫雅健院士,大家可以关注一下,宫雅健院士的一个遥感的工作,这是我们遥感领域的一个非常大的一个大咖,touch还不会。

这个touch其实不会也还好,你可以最后会给给大家做一个选择题吧,大家可以选就优化的,也可以选那个不可能全都做了,你在这么短的一个课程内,让每个方向都做好也不大。

可能就是给大家会有几个topic可以选择,这个你可以去选优化方向,就是Python直接写优化就好了啊,左超老师那个不是书名啊,这个它是一个综述,叫计算成像,过去今天未来,就180一页一个大综述。

这个相当于一本书,啊扩大暂时不用,因为这个以教方法为主,不是以大家练,大家coding为主,呃讲到硬件,这个会涉及硬件的这个本身计算光学成像网,这个光学其实是一个嗯,当然也不会涉及太深,讲太深太深的话。

其实对大家也and blend deconvolation,呃,这个本来是特级射程是没有的,如果大家想的话,嗯这个可以给大家搞一搞,这个作业做完有什么奖励,那这个以前大家上这个课的时候有什么奖励啊。

这个我还不是很清楚啊,硬件就是普通的电脑就好了,就是大家无论是windows还是LINUX或者Mac,直接大家干脆包一个康纳的包,然后用Python,然后下一个库我会给大家写一个vim。

vim文件去让它,大家直接装个电脑就好了,光学方向的知识,我建议大家补充一下这个嗯,我想看哪本书呀,这个,这个如果有精力的话,推荐大家看一下张艺谋老师的应用光学,如果实在是当那个没必要完全吃透啊。

那个太复杂了,呃可以看一下嗯,这个我后面直接补充到课程网站上啊,这个几何光学和波动光学都要涉及,因为会涉及到DOE,但这个也不是特别复杂,可以给大家嗯去我会课程上会给大家cover掉。

就是我课程上都cover掉的东西,就是大家不需要单独去太深刻的去看啊,计算成像的物理模型,能知道深度学习训练吗,呃现在是可以把物理模型做成可以微分的哈,就可以用深度学习的方法去训练,这是可以的。

但是指导学习训练,这是啥意思,非旁轴光学设计,没有这个没有,啊裸眼3D啊,有同学这个裸眼3D的内容,其实可以提及一些哈,我现在跟大家说一下,裸眼3D有有非常多的一些玩法哈,这个有像像前面加个柱状体啊。

他前面加那个一个小口,一排排小孔,这个还有一些像光场显示,其实大概也就这么几种,其实可以专门做个素颜slides给大家分享一下,这个龙眼3D的一个都行,但是它实现是比较困难的哈。

它有非常多的一些视野的限制啊,包括计算的一些限制,计算全息,这个暂时就不cover了,因为这个内容已经够多了,但一般老师可以给大家看一些专题课,因为一般老师对,整个计算全息是比我更专业一些。

可以让伊万老师给大家看一些真题课,正向推理速度有多快啊,这个你要看你的图像大小,那你用了多少倍,其实你做了CSRT加速,或者是用专用的像INT8加个动态规规划,是会做的非常快的。

嗯这个林李林同学问了一个无透镜成像,这个会的,因为无透镜成像是一个嗯挺关键的,一个阶段性的课程,会给大家讲,红外会涉及一些,但是不会涉及太多,因为红外本身课题会比较敏感,大家如果想要学红外的话。

我会给大家推荐一下老师,可以去跟他们学,这个神经网络处理哈,这个我还真有做过比较深的一个研究哈,这个推理它有一个你无论速度有多快啊,比如说你4K8K啊,你最后处理比如你可以做到120帧。

但有一个问题就是非常难解决,就是他这个延时问题,因为我们神经网络也会有非常非常的feature map,我这个feature map在我的处就是GPU或者CPU,在他们跟我们后面。

这么一个这么一个DDR里面,相互交互的过程中,这个交互因为DDR本身还有一个瓶颈啊,它的颜色会比较大,是这个神经网络推理是可以有非常多的快的,但是就是这个延时会比较大,有用rust,rust啥意思。

啊存在计算这个是有的,这个我们确实在做这一块的内容,当然也不是完全的存储计算,这是一个比较异构的计算,就是很多地方就避免跟内存的一些交互,VR商用暂时没有用到,因为现在的VR其实还停留在一个。

比较基础的一个阶段,因为现在的一些VR成像就是很多,就是没有做到一个比较完善,因为所以说这个整个VR的市场,还有一个非常巨大的一个空间,它是需要计算成像的,比如说像刚才那给大家讲一个全景成像。

就是要呃这个VR啊,这个闪电同学问到经常能用到游戏里嘛,其实这个这个rendering是可以用到游戏里的,比如说我要rendering一个比较复杂的透镜,产生更真实的相机,哪个效果是可以的。

你也可以模仿整个motion,不料一个过程,因为现在游戏啊其实做到帧率非常高,大家为什么要用这么高,你感觉有时候60帧还有点感觉的卡,这是就是因为它本身是motion blur,这个地方没有做的特别好。

其实大家可以,现在motion blu慢慢慢慢已经加到游戏引擎里面,就电影为什么24帧大家不觉得卡,就是因为有模拟这个motion blu,其实大家可以在模拟里面,其实写一个逆向的一个计算成像。

也是非常有意思的,NERF研究会有帮助吗,这个会有一定的帮助,因为很多基础知识在这里面是有介绍到的,呃光神经网络,其实现在吧这还不是特别成熟那个主要,而且公路系统会比较复杂。

那你光学加工出来之后就已经定,那就是不能像普通神经网络或者改来改去,就是很很容易几轮的时候遇到哪些人工痕迹,这个要看你不乐程度,不乐清的话,其实你加油物理,其实prior其实可以做到非常挺好的。

那你有时候就比较嗯特别大一个坑种啊,或者特别复杂的一个坑种的时候,就是比较容易有帮助的一些水纹啊,或者是一些ARTIFEX,嗯这个你要做计算成像相关的课题,你要调参的话是挺有用的。

这个因为你有物理学的约束啊,你没这个约束,就说你那个餐调不出来的,这个,而且对你设计的loss function,也是挺有挺有挺有帮助的,嗯这个今天已经超时了哈,这个同学,那今天这课程就这样结束了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

02.引擎架构分层 | GAMES104-现代游戏引擎:从入门到实践 - P1:0 - GAMES-Webinar - BV12Z4y1B7th

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

hello嗨,大家好,欢迎回到那个games104,现代游戏引擎的理论与实践,我是王鑫,那个今天的话呢我们开始我们的第二讲,就是游戏引擎的分层架构,那在上一讲的话呢,我们跟同学们讲一下。

那个做研究现代游戏引擎的重要性,那么今天的这一讲也就是我们的第二讲,将会是真正的进入到这个游戏引擎的海洋里面,我们去理解它的这个内核,真正知道它下面有什么东西,其实呢。

同学们开始学习这个游戏引擎知识的时候,我觉得大家大家的第一个困惑是什么,我觉得是一种恐惧感,其实当我第一次从这个学术界,走到那个工业界的时候,我看到那那么大那么大的一个代码,其实我是很慌的。

那么多代码我从哪个文件开始看起来了对吧,然后我很慌,那我去找本书看,当我们找到游戏引擎架构那么厚的一本书,1000多页,打开一个第一个section叫做introduction。

然后你看到的是那么丰富的一个系统,其实你会非常的就是无从下手,这其实是我们所有开始学习游戏引擎的,同学们的一个很天然的感觉,所以的话呢我们对一个事情的认知呢,一般都讲由浅入深,所以我觉得先不要着急。

我们先用一个最简单的方法,就是我们浮光掠影一样的去感受一下,一个游戏引擎大概有哪些层次,所以呢我们做一个非常快速的这样的一个,一个旅行,那首先的话呢就是这里面我们举一行,我们在学一个知识啊。

我们先假设要一个人物,比如说我们小时候学英文,我们会说诶我们有一个同学叫小明,小李对吧,那我们假设我们有一个很好学的同学叫小明,他现在要开始学游戏引擎了,那么它下载一个现代游戏引擎。

它首先看到的东西是什么呢,可能不是源代码是什么呢,是各种各样的编辑器,对不对,你我们可以在那边编辑我们的关卡,我们可以做角色,做动画,看上去眼花缭乱,而且这边机器本身功能也是非常的复杂和丰富。

好像感觉这些东西我拖拖拽拽,边边,好像真的能做出一个我想要的一个游戏世界,所以这其实是大家对游戏引擎的,最直观的第一印象,所以呢这个时候也就接触了引擎的最上面,那一层,我们叫做什么词呢,叫工具层。

那么小明是比较好学的,那工具层之后他就会问哎,那这些东西怎么可以动起来,其实这时候他就想了,如果我要做一款游戏的话,那我这个首先我得能把这东西绘制出来了,那么游戏绘制的过程。

本质上是把一个虚拟虚拟的三维世界,把它一帧一帧的转化成一啊,一帧一帧的二维图像,从这个三维转换成二维,这个绘制过程是不是我们需要有渲染对吧,然后在这里面的话,所有东西它不是静止的。

所以呢我们可能还需要这个一些动画,让它动起来,然后这里面的这个世界我们要让它能够碰撞,因为我们要有一个物理的世界,对不对,那我们一个一个一个小石头在地上,我一脚能把他踢飞。

那我们是不是需要有一些对于它的物理的表达,物理的计算,那么当然了,我们做的不是一个简单的世界放在那,而实际上这个世界是可以玩的,那这里面我们有很多NPC啊,很多那个敌人啊,还有各种各样的游戏规则。

那我们是不是要有脚本啊,AI啊,包括状态机这些东西能定义这游戏里面的行为,那么还有呢就是作为一个现代商业游戏的话,你肯定需要有这个就是跟用用人机界面的交互,这个东西其实很容易被大家忽略。

但其实非常的重要,比如说啊我们打游戏最在乎的是什么,我我打一个boss,boss的血条还剩多少,那这个血条是什么,它实际上根三维绘制没有关系的,它实际上是个二维的一个一个一个gadget,是一个小东西。

然后他会一直在变一直在变,那么所以说其实这里面我会发现,我需要大量的跟游戏相关的这些功能,这些这些基础服务我们呢叫做功能层,那么功能层它核心做的事情其实非常的简单,就是我们能够让这个世界可以被看得见。

可以动得起来,而且呢还可以玩得起来,那其实基本上小明学到这儿,他已经应该有感觉了,觉得嗯,我大概已经知道这个游戏引擎该怎么去做了,但是呢这个时候如果他再往深处想一层的话,小明就会发现另外一个问题诶。

我我的游戏不能够通过很多很多一行代码,一个引擎就能跑起来,对不对,我是有大量的数据,大量的文件,这些数据和文件其实来自于,比如说有的是来自于PHOTOSHOP,我的一个画图软件,我有的是来自于3D。

max和MAYA这些3D建模软件对吧,当然我还有比如说声音的编辑,编辑文件这么多的图形,那个几何包括声音,甚至是视频,还有其他各种各样的复杂的数据,这些数据在游戏引擎里面是哪一个层,来处理它呢。

这个时候我们的in resources层就呼之欲出了,那个时候小明就会发现哦,这些成百上其实应该差不多是上万到上10万的,这些数据文件是在我们的游戏引擎里面,有个专门的词叫做resource层。

资源层负责加载管理这些资源,所以呢这个引擎的在功能层下面,其实就是我们的资源层,资源层,你可以理解成,就是给我们的功能层提供各种各样的弹药,让他去处理,让它去生成对吧,如果我不能够把这个角色的模型。

它的这个就是动画漏进来,那在游戏引擎里面我拿画什么东西呢,这就像一个画家一样的,就是说你没有给他,这个就像一个拍摄的电影导演,如果你没有一个场景,那电影导演他再大的本事他也拍不出来。

所以呢resource层是在功能层之下,那到这是不是就OK了呢,其实到这基础上,我觉得作为一个游戏引擎的开发者,你基本上可以工作了,但是呢我们的小明是一个非常敏而好学的,他观察到一个非常有意思的现象。

就是我在上面写了动画系统也好,我写的物理系统也好,写的绘制也好,包括各种各样的系统,它会频繁地调用一些很底层的代码,这里面底层代码其实看上去都非常简单,比如说最基础的容器的创建,最基础的内存的分配对吧。

还有比如说哎我要开一个县城,我的县城要管理,那这些东西的话,其实好像既没有出现它的功能层,也没有出现他的资源层,其实呢这个时候小明很好学的,小明这时候就遇到了引擎的另外更核心层,我们叫做核心层。

而核心层你可以理解的是什么呢,就像一个工具箱,就像一把特别像个瑞士军刀,你要内存管理好,我给你个内存管理的一套工具,你要这个各种容器分配,我给你中期分配的一套工具,你要做大量的数学运算。

比如说这个线性代数坐标变换诶,我这边数学模块也给你提供的很好,所以说其实我们上面的这些游戏,相关的逻辑管理,全部是架在这个call这个底座上面,所以CORE呢是引擎非常核心的一层,基本上到了这一层之后。

大家觉得嗯,我应该已经知道一个游戏引擎该怎么写了对吧,大家想想看数学最底层的内存分配管理,数学我都知道了,再网上的话,这个资源文件怎么下载,我大概也知道了,再网上呢我做各种各样的动画呀。

那个就是绘绘制啊,这些功能我也都知道,然后呢我再做上一些编辑器,好像我就能做一个游戏引擎,做一个游戏引擎加游戏了,但这个时候呢,其实是有一个特别容易被大家忽略的一层,是什么呢,我们叫做平台层。

其实啊就是说你做了所有的这个游戏引擎,包括游戏机所生产出来的游戏产品,它最终是要发布给用户的,但用户的设备千千万万,对不对,你可能用的是台PC,他可能用的是台Mac对吧,还有的人可能用的是一台手机。

那么包括很多可能是XBOXPLAYSTATION,而且用户的区别还在于它的输出不一样,有的时候是用键盘鼠标对不对,但有的人是用的是手柄,那么更丧心病狂的,还有人那个各种各样很奇怪的。

比如说像V的那个这个,那个就是有那个那个就是说体体感操作,比如像connect这种体感操作,那么我前天看了老头环,我看到有一个家伙开着那个驾驶方向盘,然后那个过了那个那个那个那个。

就是那个大黄金树的守卫怪,当时我整个人都震撼了,而且他戴了个头盔,所以说明什么,就是无论你来自于什么样的一个输出设备,到我的游戏世界里面,都要翻译成一个统一的语言,那包括就是说其实这种平台的差异。

不仅仅是在于硬件设备上的,还包括什么呢,还包括你的这个软件的发布平台,举个例子,我们著名的这个steam对吧,就是我们的威慑的steam,是我们大家最喜闻乐见的,这个这个这个游戏获取平台。

但是呢还有跟他竞争的是什么,e e p s EPIC game store对吧,那么EJS的话呢,它你如果把你的游戏要发布发布给EJS,发布给steam的话,你可能的接口收费模型就会完全不一样,当然了。

还有我最喜欢的XXGP也是非常好的平台,所以说其实在这一层的话,引擎还有一层就是处理各种各样的平台,那所以从这从下到上就是调查一行的,就是首先我有一层平台层,然后呢我上面构建了我的所有的功能。

处理的内核,就是我们的核心层,然后再网上呢我们构建了我们的资源层对吧,我们的各种文件可以加载,有了这个平台的东西,我也处理好了,这些所有的数学工具我都有了,然后呢我自愿也进来了。

这个时候我就开始可以做各种各样,游戏相关的事情,而这些游戏相关的事情的话呢,我还可以提供一个编辑环境,让别人可以编辑起来了,所以我上面还有一层工具层,所以这就是现代有引擎啊。

最最简单的一层架构就是五层架构,那么当然了,这个就是说这是极其简单的,实际上的话呢,如果我们还可以分得再细,但是呢因为不同的就是流派,大家的分法是不一样的,所以我会推荐同学们就是用这种简单的方法。

记住就可以了,那当然了,这里面还不要忘记了,就在第一集的时候,我们讲过说,其实现代游戏引擎是非常的丰富,基本上每一件事情都有别人会专门做得特别好,比如说专门做物理的。

像havoc physics就做的非常的好对吧,那这个时候在我们这些第三方的代码,它也要集成到我们的游戏引擎的生态里面,那这里面包括像这些声音啊,像这个speed tree啊,做简化。

那个就是做这个面片简化的这些工具,比如像simple top,那么第三方代码的话呢,其实在引擎里面是一个非常特别的存在,它有些代码是通过SDK的形式呢,直接集成到我们的引擎里面去。

就是说引擎里面编译的时候,我就要把第三方代码进行编译进去,但是呢还有一些第三方库呢,它实际上是变成一个独立的工具,它和引擎之间的数据交换,只是通过文件格式进行交换,我举个例子吧。

比如说像simple count simply,can t的话呢,这个就是他是给你一个非常复杂的几何,比如说几10万个面片,那现在游戏是不是跑不动,但是我们想看的特别细,怎么办,诶它可以把你面片做简化。

那么simply这个工具的话呢,我们就是在外面会有一套,你就可以就是说让艺术家用,把面片一层层的简化,但是呢我们在引擎中其实还可以集成一套,比如说引擎中有一些特别复杂的东西,我可以实时的做一些简化。

当然这个讲起来就比较深了,所以其实大家基本记住这个就是5+1的,这个层次的话,就涵盖了我们现代游戏引擎的话,几乎所有的代码和体系,那基本上讲到这儿的话,我觉得我们小伙伴。

我们的同学们应该都非常非常的聪明,大家就会产生一个强大的自信,说啊我明白了,我知道现在的游戏引擎是怎么加了,那我是不是就可以开始去做游戏引擎呢,实际上没有那么简单,那就是说我觉得我们的主人公。

比如说小明,这时候他也会非常的兴奋,他说诶,我觉得我知道我怎么去这个,开始写游戏引擎的代码了,但是呢这件事情啊,可能比大家想象的要复杂一点,所以接下来这也是今天啊我们这一节课的重点。

就是真正给大家讲清楚,现代游戏引擎的五层架构到底是什么,你们具体是怎么做的,那么我们认为呢,就是说学一个东西最好的方式是什么,最好的方式肯定是练习它,所以呢我们就给我们的小明出了一个难题。

说哎你既然觉得你懂了游戏引擎怎么做,那我们就做个小小的挑战吧对吧,这个现在大家很流行互联网上挑战,我说OK你现在做一个可以动起来的角色,在游戏中对吧,一个animate character。

然后呢你从下往上把这些代码写到游戏里面去,那小明就在想诶,这件事情好像啊我既然知道了引擎的五层架构,我将要去想我每一个功能模块,我到底怎么去写它,这其实也是一个非常有意思的脑力劳动,同学们可以先停一下。

想想刚才我讲的那个五层架构对吧,这个平台层核心层,然后那个就是这个资源层,功能层和工具层,那如果小明想做一个啊可以动起来的角色,在游戏引擎中的话,那它的代码分别该怎么去做呢,大家去想一想。

那其实这件事情的话呢,啊比大家想象的稍微复杂一点点,而且我在这一讲中的话,给大家点到这每一层,也顺便会讲一下每一层的要点是什么,但是同学们在接下来的过程中,可能会有一点点高能。

因为里面会有一些前沿的基础的东西,但是呢我尽可能用大家朴实的语言,给大家讲清楚,另外一个就是有些同学同学听不懂也不用着急,因为很多东西我们在后面会详细展开来讲,今天这节课呢。

关键的是帮同学们建立这样的一个,我们一直讲的叫框架,那么我们就随着这个小明的这个挑战,就是做一个动起来的角色,这个挑战开始,真正的钻入引擎的深水区的一场journey,一场旅行。

那首先的话呢他遇到的第一个挑战是什么呢,就是说我好不容易求我的会做美术的好朋友,帮我做了这个角色,我的好朋友很棒,他会用3D max做了一个很可爱的小角色对吧,还做了他的很多的贴图,对不对。

还做了很多的动画,但是这些这些词,这些东西叫什么,叫resource,叫资源,它每一个数据的格式都是不一样的,对不对,有有的是点max文件,有的是MAYA文件,有的是PSD文件。

那么这些数据其实肯定不可能在引擎中一一的,打开了,大家想想看,我们如果我们今天写个小软件的话,大家会说哦行,我要下载一个声音,我要去问你的声音是什么格式啊,你是mp3对吧,你还是WMV。

但是在游戏引擎那么复杂的环境里面的话,我们不可能去读这么多复杂的数据格式,还有一点就是说其实比如像PSD啊,像max maya的这些数据格式,它是为了它的自己工具,就是做的非常的复杂。

你们有大量无效的信息,如果这些数据直接在游戏引擎中下载的话,事实上效率会非常低,所以呢我们会做一步转换,就是我们叫做干嘛呢,我们会把这些数据全部转换成引擎的高效数据,这个这个转换一旦发生之后。

我们就把它叫做什么,叫做asset,asset的翻译成中文叫什么呢,叫资产,那么就是从resource到资产,它一个很大的不同是什么呢,我给大家举个简单的例子,比如说啊如果是一张贴图。

无论你是JPG还是这个PNG还是这种格式,那么它里面有很多的压缩算法,而且它的数据格式存储的话,其实如果在GPU中的绘制起来,效率是很低的,但是呢我们在这个这一步处理,在这一步的时候。

我们会把所有的贴图,不管你是什么格式,我们把它转成那个DPS这个格式,那么DDS这个格式呢它是按照16个BT,把这个数字呢,把这个贴图一小块一小的元素全部还不好,那这个格式可以直接扔到显卡中。

成为它的那个纹理,就是我们在游戏中看到所网上漂亮的花彩,漂亮的颜色都是用这种格式,直接灌到我们的显存中的,所以说其实这一步帮我们做了很多的工作,那包括就是在max里面。

你们编辑一个就是这个漂亮的mesh,如果你们会发现max问题也特别特别大,但是呢一旦我们把它导成仅引擎的acid,你会发现把很多编辑的数据全部扔掉了,这个这个这种感觉是什么呢。

就像是比如说我写我想写一篇文章,我用word去写,那word是不是存下载的文件,你们看会比较大,但是呢如果我只取文章里的内容,我把它变成TXT的时候,你们就发现那个TXT文章非常的小。

这个importing做的这个工作就是这个工作,所以呢我们的小明同学,第一步他就要把这些数据进行这种引擎化,我们变成我们的资产,那么这些资产呢大家关注关注他,第二个问题是什么呢。

就我们有比如说我们要表达这样的一个小角色,这些资产实际上呢他们是关联在一起的,其实大家也没意识到,就比如说我要表表现这个小角色,比如说这个小可爱的小机器人,那么首先这个小机器人是由这些网格。

就是它的它的形体,它上面的贴图还有一大堆的动画资源,但是在引擎代码中没有一行代码,说这些资源彼此之间是什么关系的,所以这个时候我们要定义另外一个资产。

这个资产呢啊有个说法叫composed i acid,什么意思,就是说它更大家可以理解成是一个相当于一个,呃关关系的这样的一个一个一个脚本,这个脚本,比如说我们这里面我简单的用XML做了个案例。

就是说它定义了一个资产,叫做啊robot的这个asset,他说诶我的match是什么,我的纹理是什么,然后呢我该用什么什么动画,当引擎读取了这一段XML的时候,诶他就知道了哦,我要下载以下这些资源。

所以这个本身它也是资产之一,在这里面的话呢,要跟大家讲个概念,就是在游戏引擎中啊,就是特别的现代游戏中,其实最核心的功能是什么呢,就是数据之间的关联,或者我们叫做reference。

就是说大家如果打开任何一个现在游戏,你们打开你们的那个游戏目录的话,如果是没有加包,加那个加包压包好的话,是有很多很多文件,当然现在游戏发布的时候,一般都会把它package成几个大的package。

但实际上那里面有大概几10万甚至,上百万个文件,而这些文件之间呢就是有的是贴图,有的是生意,有的是有的是那个动作,它都会像一个无数的网关联在一起,那这里面的话,大家会遇到一个非常有意思的概念。

叫做good,叫GUID叫唯一识别号,就是在现代游戏引擎中,我们希望给每个资产设置一个唯一识别号,这个这个东西有个最简单的比方是什么呢,就相当于是说比如说我这个小机器人对吧,我我的我的贴图。

我的mesh这些资产,我现在是通过他的路径找到他,对不对,但是这就像一个人一样的,比如说你有几个朋友,如果你记得都是他的住址的话,那你的朋友搬家了怎么办对吧,在在在现实生活中也会这样的问题,那怎么办呢。

很简单,每个人有一张身份证号,所以说你的朋友小美小小红可能会搬到上海,搬到北京没有关系,但是呢他只要这个身份证号在你永远可以找到,说哦我有两个朋友,一个叫小美的小明,我一查哦。

他们两个可能一个搬到北京了,一个搬到上海了,所以呢这个故意的全称叫做全球,全局的唯一编号,实际上是我们的游戏资产的,每一个的身份识别号,那么当我们把这个游戏的这些文件,原始的散乱的文件变成资产。

进入到我们的资源系统的时候,支持小小明就会发现一个问题了,就是说诶我在引擎中,我不能把这个文件放在这,对不对,我们实际上的话呢,需要一个就是实时的资产管理器,这个资产管理器其实非常简单。

就像我们读了这么多文件,在我的引擎中就会管理,其实如同刚才我讲的那个reference关系一样的,其实这些资产在我的这个rtasset manager里面的话呢,是事实上RUNTIME就表示实时。

就是游戏跑起来也是一个一个文件放在那儿,当然这个去头去尾了就支持内容,但是呢他们会互相指向对方,这个时候呢,我们在游戏引擎设计中,会经常有一个叫很重要的系统,叫做handle系统。

那么憨豆系统简单解释就是一个,就像你的有有那个有mao box一样的,就是说你可以搬来搬去,我也不知道你在不在,但是呢我就会始终有你的邮箱的这个钥匙,我知道你是105华邮箱,这样的话邮箱的主人有没有。

邮箱的主人还在不在,其实我可以只要问这个邮箱就知道了,这个地方讲起来比较深,我们以后会讲,但是简单来讲的话,其实这个资源层啊在我们的游戏中,最核心的是管理所有的,我们做的这些资产的生命中期。

所以资源城市游戏引擎,非常核心的一个一个一个层次,那么这里面为什么生命周期管理费这么重要呢,其实大家可能没有意识到,就是现代游戏,比如说我一路闯关杀将对吧,我在关卡A到关卡B到关卡C。

但是我每次这个关卡的时候,大家也没意识到,其实很多的资产是要无效了,我们要下载很多新的资产,那么这个时候其实啊,当这些资产在不断的根据我的,这个就是当前玩家玩的进度,在不断的下载和卸载。

这你们的这个关系是非常非常复杂的,所以刚才我讲了那个故意的系统,讲了这个handle系统都在解决这个问题,那么大家如果有一定的编程基础的话,特别大家如果学过C12话,学过java。

知道有个概念叫做DC对吧,就是垃圾回收,但是大家知道就是现代游戏里面,一般来讲GC做不好,就会让整个系统的效率变得非常的低,大家如果去观察现代游戏引擎的架构的话,特别是很多游戏产品。

你会发现他突然就会变得很慢了,那很多时候就是GC没有做好,就是说我一个关卡打完了,我要下去,然后呢另外管家起来了,但是呢大量呢就那上万上10万的资源,一下子要回收,如果你没有写好的话。

那一帧当场机器就卡在那了,那么实际上这里面的话有很多很很难的策略,另外一个呢我们叫做延迟加载,延迟下载指的是什么,就是说我希望人走到哪这些资源在下载,因为我的内存很小对吧,我的硬盘很大。

那这个时候就是我希望根据我玩到哪儿,在不断的去加载,大家如果玩那个就是有用虚幻引擎做的,这个这个游戏的时候经常有个细节,我不知道,现在最新版美眉修掉,就是经常一个角色出现在你的面前。

诶他一开始看到那个贴图很模糊,突然哒哒哒一点点变得更清晰,其实那个东西就是延迟下载所导致的,所以呢其实resource层,是游戏非常核心的一个管理层,它管理好整个游戏引擎跑起来了。

生态的它这个资源池的分配,它是管理好我们每个资产,在实时的这个生命中期,所以你如果我们今天要做一个游戏的话,我会建议大家先去看一下资源怎么去分配,所以说其实我当时10年前,我们在做引擎的时候。

其实我的第一个半年并没有像大家想的说,我们写了很多的这个graphics feature,写了这样这个很漂亮的那个rendering啊,那个SHADER实际上我们首先定义的就是数据,定义的是数据格式。

schema这些东西,然后呢定义这些数据在引擎中它应该怎么呈现,在编辑器中,应该怎么呈,现,在文件中怎么呈现,所以这是其实引擎开发者真正的核心好,那我们有了这些资源进入了游戏的时候。

这时候我觉得我们的这个小啊,小明同志就可以开始做他的游戏,游戏的真正的玩法了对吧,那我们那个挑战还记得吗,就是说我们要做一个会动的角色,那怎么让角色动起来呢,就像我在上一讲给大家讲过。

就是说啊这也是我们立的flag,就是说我们希望这一节课上完之后,同学们看到一个引擎,知道从哪下手,这一趴就是真正的游戏引擎的功能,那这里面要讲个很很有趣的概念,叫做tick,其实我蛮喜欢TIK这个词的。

就是其实我一直找不到一个很好的一个,中文翻译,这个tick tick,tick好像是敲一下还是怎么样,我不知道,但是非常像那个一个永动机啊,就是它的它的每隔一个固定间隔,就会把这个世界再往前推一小格。

我自己是个狂热的民间物理科学爱好者,所以我认为上帝也是在替我们的,上帝的TK是多少呢,是一个普朗克时间,大家如果有时间去那个研究一下,就是普朗克对吧,普朗克时间有那个普朗克那个长度,对不对,普朗克能量。

还有一个普朗克时间,非常非常小的一个时间片段,就是我们认为任何一个物理过程,可能不能小于普朗克时间,那在游戏中的话呢,其实我们的每一个tick,就是我们构建的这个世界里面的普朗克时间。

那么这个tick呢就是当一个tick来之后,我们的系统就会依次的把所有该做的事情做啊,比如说我先去看看输出输出,我读一下,我动一下我的相机,动一下我的这个这个人物和角色对吧,我播一下动画。

然后呢我还可以就是绘制一帧的画面,我还可以做一些,刚才我讲的那个memory g c当然很抽象了对吧,那我整个逻辑的往前走一遍,其实在游戏的世界里面,是如何让这个世界动起来了。

这其实就是利用现代计算机非常高的计算速度,然后呢我们在每隔1/30秒,把整个世界的逻辑和绘制全部跑了一遍,这就是tick的魔力,T i c k,那这里面的话呢我就要隆重介绍两大神兽了。

就是大家看现代游戏引擎啊,我会非常推荐大家去找到这个tick函数,但是这个名字不一定叫tick,那么一般在main函数里面,我们看到一个tick tick里面的话呢,就会出现两大神兽。

一个叫TECHNOLOGIC,一个叫TRENDER,就是就像我昨天那个上上周的第一集讲的,就是说游戏引擎不只是渲染,或者说渲染只是其中的一个不是很大的一部分。

也就是说其实你看他一般会先take a logic,再take a render,他这个关系是什么呢,就像我要继续回到我的这个这个民间物理,科学家的这个这个思维方式啊。

就上帝如果把我们整个世界是虚拟出来的,那它首先呢把整个世界的物理规则,全部计算一遍,好整个世界的物理规则算完了那一帧,比如说我现在就是这个姿态对吧,那这个姿态呢其实你无论绘制它不会是它。

它这个姿态已经存在了,如果这个时候我有惯性,那我的在下个题考来了时候,我是不是要再往前走一步,那这个也是它是自动符合物理学规律的,但这个时候如果有个观察者,比如说小明出现了,他有两双眼睛。

他会选择一个视角,他会去观察这个世界的姿态,所以呢这个时候我们就以小明的眼睛,生成一个二维的画面,这就是他所看见的东西,所以这个过程叫什么呢,这叫渲染,所以说我们是对这个世界的模拟为先。

就take logic,把这个世界模拟出来为先,然后呢再去去渲染它,所以说这就是现在游戏的两大神兽,就大家去看游戏,基本上就是一个是逻辑,一个是渲染,那么逻辑呢一般做什么呢。

就是哎呀我把这个这个输入输出读一遍,我把整个世界的物理算一遍,把这个camera动一动吧,角色动运动,把碰撞检测检测对吧,就是比如说张三有没有打中李四,这件事情是逻辑的事儿还是渲染的事呢。

我如果上完我们104课程的同学就知道了哦,那是逻辑的事,因为大家知道就是无论你看见没看见,张三是打动了李四,而且扣了李四的五点血,这就是逻辑,其实以后我们讲到网络的时候,这个过程会更复杂。

但是呢这个逻辑和绘制一定要严格的气氛,就是说一个没有受过系统训练的游戏引擎,开发者的话,很容易把两边的代码写的混合在一起,但是呢如果大家把这个表现绘制和逻辑,分开来的话,基本上你的代码无论怎么写。

他都不会重合在一起,那么渲染的话呢就更专业了,就比如说我们会做各种裁剪呐,我们会做这个就是光照啊,会做这个相机的shadow啊,这些因素,那这个呢我就跟我讲过,就会在我们的后面几节课程给大家介绍。

在今天的博士为重点展开,所以其实大家可以看到,就是说啊这个就是一个案例,比如说在这里面的话,我们每个30秒tick,你可以看到就是啊在他的左边,我们一直在做个裁剪,大家可以看到就是很多。

你那个看不见的东西就会被裁掉,你只看到你看得见的东西,然后呢在右边的话你可以看到,其实人物的动作树叶,它都是一帧一帧一帧的在变化,所以motion grass,整个动画的基础理论就是人是靠视觉残留。

感知一个连续的世界了,而这一点的话,在现代游戏中会充分的去利用起来了,那么其实呢我今天只是讲了一个就是功能层,最简单的东西就是从logic radio,但今天因为不是会展开,但是我想跟大家讲一个概念。

就是说其实功能层是非常非常庞大的,这里面我继续引用我们的上古神书,就是游戏引擎架构成,本书中关于功能性这一块,你会发现这一块内容是最多的,就是真的是无所不有,什么都有,而且呢就是说公认层。

其实我有的时候在很多引擎的架构中,我们会发现,它会经常会和具体的游戏关联在一起,什么意思,就是你无法区分,举个例子吧,比如说相机控制,你觉得是游戏引擎提供的功能呢,还是说你只要提供基础的相机的这个。

这个绘制能力,然后呢相机的控制我交给我的游戏,某一个特定的游戏,比如说我做一个第三人称射击游戏,我希望这个相机特别有内容,就是手持那个摄像机的摇晃感对吧,那这个时候我的这个相机的摇晃啊。

这个镜头的模糊啊,拉远拉伸啊,它其实是跟那个游戏是有密切的关系的,那这个模块是不是作为一个游戏的代码,而不是作为一个游戏引擎的代码,所以呢其实很多时候哪些功能属于游戏,哪些功能属于引擎。

基本上就会在功能层这边打架,但功能层呢有些模块是很清晰的,属于这个我们的游戏引擎的,比如说绘制对吧,我们的rendering,我们的pipeline,对不对,我们的整个这个就是资产的管理。

这些一定是属于我们引擎的东西,所以功能层呢,在未来也会作为我们的一个介绍的一个重点,那么刚才讲的就是上古的两大神兽嘛,其实这一点的话呢,我也在这课程,希望同学们也会注意到一件事情。

就是说其实现代计算机的架构啊,已经逐渐在十几年前逐渐的从单核走向了多核,其实呢未来的这个多核时代,也会是游戏引擎架构一个很核心的方向,这里面的话呢,就是大家知道最早的这个游戏引擎是单线程的。

就是一个线程跑到死,然后后来有多核了,那最简单的做法是什么呢,就是我们把任务,比如说刚才讲了一个叫tik logic对吧,一个叫tik render,那最简单做法。

我把logic和render分到两个线程里面去,然后当然我还有额外的线程,比如说做下载,这个呢是一个比较基础的多线程的一个算法,那么其实在现在的这个商业引擎的话呢,比如说像尤里安瑞尔。

他们会再往前走一步,比如说他们会把一些特别容易并进化的计算,比如像物理呀,像一些其他的animation呢,它会把它单独的fork出来,分散到很多很多的引擎上,这就是我我们称之为叫这个就是图片中间的。

就是现在很多主流引擎都是这样做的一个架构,那么第三个的话呢,就是我们认为是未来的这种引擎的架构,就是说我们能不能把所有的任务,变成一个原子的,我们叫做job,然后呢你有四个和你有八个和你有16个。

16盒没关系,我就一直认认认认认把你每个核吃得满满的,这个就是大家从这个图上来看的话,是不是就觉得哎,好像第三种方案看上去更漂亮一点,确实是这样,就是同学们不用懂啊,就是这个我们的引擎。

到底是按照这个哪一种架构,其实有个很简单的做法,就是你打开一个游戏,然后呢,你打开你windows的那个CPU的那个profiling的那个工具,他每个CPU不是代表了一个小窗口吗。

你去看那个小窗口是不是都吃的满满的,还是说有的被吃的很满,有的吃不掉,如果出现了就有的吃的很满,有的吃不掉的话,那他的多线程大概率是没有采取,就是我们高级的这个job系统去做的,但是这件事情的话呢。

可能比大家想象的要复杂得多,为什么呢,因为其实当大家真的去写这个游戏功能层的,这样的一个工作的时候,你会发现他很多计算中间是有一个依赖关系的,我们的学术叫做学术术语叫做dependency。

举个简单的例子吧,比如说我现在做一个拿刀,拿手一挥,我手上假设想打出个特效,那我首先是要这个动画系统要算完,知道我的手在这个位置,然后这个时候我才能把我这个位置,传导给我的粒子系统对吧。

然后把这一个个的小的光的粒子发出来,那他这俩就是粒子系统的计算,和这个动画系统的计算,就这一对于这个角色来讲的话,他必须要有个先后关系,而这一套就是说非常高效率的,多核并行架构的话。

它真正的难就难在这个dependency的管理上面,能够让他不会出乱子,但这个呢是一个很高级的课程,但是我觉得学我们games104课程的同学的话,我希望大家建立一个概念。

就是说未来的引擎架构一定是个多核架构的,所以说大家前天如果开始进行底层架构的时候,我会非常强烈的推荐大家,就是从多核开始去设计和思考整个底层代码,所以呢我觉得其实我们的引擎之旅啊,基本上到了这一趴之后。

我觉得我们的小明已经非常非常厉害了,就是他已经知道了,就是说把自己动画的系统,这个角色挂到我们的主的TIK上面,他知道我在去做这个动作的时候,我就tick到。

我在这tick logic里面加一个叫tick animation,这样的话,我每次从资源里面把我的那个一个个动画,真读进来了,这样的话我又把它把它骨骼驱动起来了,那这个人就可以动起来。

然后我在那个render里面每一帧去绘制那个同学,那个那个角色就绘制出来了对吧,其实呢小明肯定不止于此,因为我们的同学是什么,我们是要做这个这个游戏引擎的,这个时候我们就会接触到真正的核核心层。

那核心层呢最容易引起大家关注的,就是他的数学库,其实呃在这个游戏的引擎里面啊,其实数学用的并不是特别的高深,当然有些特殊的场合,我们数学用的是非常高的,比如说像物理,物理用的数学是非常深的。

但是呢最简单的如果是绘制,包括游戏逻辑的话,我个人认为大学的线性代数基本够用了,就是你基本上知道矩阵向量这些概念对吧,那么那个闫令琪老师的104课程上讲的也,101课程讲的也很清楚。

就是这个比如说我怎么去旋旋转一个坐标呀,我怎么对一个物体进行二维的三维的放放缩呀,基本上我我个人认为就是一个周末吧,你再关把你关在那个刺绣教室好好学一下啊,做几套演算题,基本上就能算得清楚。

我们游戏引擎所需要的这个数学的库,那么也就是说它这里面的话呢,这些基础的数学概念其实并不是特别的复杂,那为什么在这个就是游戏引擎里面,这些数据库我们会单独写的,这里面就会牵扯到我们游戏的一个。

很独特的需求,就是我的第一集讲到的就是游戏引擎的一切,都是为效率服务的,它是一个real time这样的一个application,就是说所有的用户的输入和它的反馈,必须是al time。

那么其实我们所有的数学股是非常sensitive,对,就是非常敏敏感于它的效率,这里面就又搬出我们的那个上古的那个神人,就是john ka,就joker有个很著名的案例,就是在那个quick3的代码中。

他发现就是说算那一个数值的这个这个导数,平方根是特别慢,什么叫导数平方根,就是一除以根号X对吧,大家想想开个根号再做个除法,其实这如果转换成我们计算机指令的话,是无数条LU指令,而且是浮点型的。

确实效率会非常慢,然后呢我们的KMARK就写了这样的一段代码,这段代码我不知道我们在座的同学,有多少人能读懂啊,我实话实说,我也没有完全读懂,但是呢你可以发现这里面还有一个magic number。

他自己都会说,哎呀,不好意思,这是个hack对吧,那其实它不是个hack,它是什么呢,它是首先求了个近似解,然后后面用牛顿迭代法快速的去逼近那个数值,因为在游戏引擎中啊。

我们很多时候不追求你算的数值绝对正确,大致正确就可以了,而这个算法就康Mark的这个实现的效率,会远高于你直接调用系统的max库的那个s qr t,那个square root,在这做个除法。

这个这两个效率相差会非常非常多,那么当然卡马克那个时代的话是很古老的,但是在现代游戏啊,在现在计算机中的话,有个东西我是非常推荐同学们去注意的,就是这个SIMDSMDSMD什么概念呢。

就是大家刚才讲到的,就是在游戏的引擎中啊,很多时候我们就是一个矩阵和向量的加减乘除,什么叫矩阵,什么向量不就是4×4对吧,16个数,然后向量是四个数对吧,四个数加四个数,那我可不可以一条指令。

把四个数加四个数全部做完呢,诶我们想到了这个CPU的设计厂商,他们也想到了,所以呢他们就提出了这个semi的这个概念,这个概念就相当于说你一个LRU,把四个运算全部做掉。

而这个呢其实也是我们在引擎的数据库中,广泛使用的这样一个技术,所以比如说你们在读一行代码的时候,看那个注释叫SSE的时候,你就知道那一段代码实际上是做向量运算的,它的它直接扩CPU的这个这个并行化的。

这个向量运算能力,它的性能是要比这个直接掉浮点数了,快好几倍的,所以这个其实我们引擎的数学库,对效率的要求其实是非常的高,那么当然了,核心层不止于数学了,其实核心层呢是为我们上层的所有的逻辑。

提供了基础服务,这里面有个很重要的问题,就是数据结构,其实首先的话想做引擎的话,如果真的想做引擎开发,你一定要理解数据结构,数据结构是什么呢,其实比大家想象的要简单。

比如说我需要一个array存储一串数据对吧,我需要一个链表,一个练一个,一个练一个,一个练一个,那么我们需要做一个二叉树的结构,去查找一些东西,这些都是一些非常基础的概念。

而且呢包括在C加加语言的标准中,就是STR中是有标准的,这个就是这个容器的,这个这个东西叫容器的实现,那为什么在引擎的核心层,我们要全部重新做一遍呢,因为大家如果仔细研究。

你会发现就是C加加提供的标准容器啊,当你进行高频的诶,我增加增加数据,我要删数据,我在增加增加数据,删数据的时候,它会在内存中产生大量大量的空洞,而且呢它的内存的使用是不受你控制的,给大家讲个小的细节。

就是vector,比如说一个一个数组,在那个C加标准视频中,你如果比如说我一开始分配了100个元素,假设我现在出现了100一个元素,它会怎么办呢,至少我记得上一版的时间。

是直接很粗暴地把它的空间放大一倍,就是说它的空间是以这个就是这个倍数,网上去涨了,所以到最后你的一个游戏跑起来,你的内存的消耗是多少,你完全不知道,而且这些内存会分散的非常的开。

那你这个游戏就会变得非常的慢,所以呢在核心层,我们需要做一套我们自己的数据结构,让它没有几乎没有内存碎片,而且访问效率要非常的高,所以呢其实这里面的话也是核心层,最最重要的一个功能就是内存管理。

其实我的第一集跟大家讲过,就是一个游戏引擎啊,它的开发实际上非常接近于一个操作系统,也就是说,其实内存管理是操作系统最重要的一个,一个工具,比如他通过堆栈来管理操作系统啊,管理那个我们的内存资源。

但是在游戏引擎中的话,我们预先申请了一大块内存,这块内存将会有我们自己管理,为什么呢,我们在追求最高的效率,这里面就讲一个科普一个概念,就是说其实现代计算机啊,大家会看到两个我们可以看得见两个指标。

比如说我的CPU跑的有多快对吧,我的内存配的很大,大家很多时候呢去买计算机的时候,我们会买那种ACPU,主频非常非常快,内存也很大,但你们我不知道同学们有没有注意过,这两块芯片,同一个厂家主屏是一样快。

但是有一块芯片啊,有一块CPU就卖的比另外一块贵贵很多很多,如果大家有注意到这个现象的话呢,其实他的很多时候它的差别是在于它的cash,就是紧贴着CPU的一个一个缓存,那个缓存的话非常非常的贵。

但是那个缓存越大的话,他那个CPU从下面取数据的效率就越高,然后呢这个时候我在跑游戏,我再去这个跑分的时候,效率就会高很多,所以同学们以后啊买这个CPU的时候,不要只买主频高,你们还看它缓存有多大。

所以内存不是越大越好,CPU不是越快越好,缓存其实很多时候是核心的卡点,那么其实在这里面的话呢,就是在核心层,我们在做内存管理的时候,其实会用一个铺,就是一个很大的一块。

我们先把所有的那个这个内存资源全部关起来,然后呢我们自己管各种各样的数据,比如说向量呀,树啊,这个历史的这种,这这些这些这些数据资源的分配,但这里面讲起来就比较抽象了,其实这个东西的理解也比较简单。

就是我觉得我们上古大神就是图灵,其实其实现代计算机啊到最后它还是个图灵机,图灵机的结构比大家想想,大家想想想,其实非常的简单,就是说它就是一个穿孔纸带,然后呢里面有代码时代进来拉来拉去。

上面的话就是读写读写就可以跑出所有的逻辑,那你想想看,我这个图形机如果效率高,我该怎么去处理,该该怎么去管理数据呢,其实它的规则就三条非常简单,第一就是我尽可能的把数据放到一起。

这样我这个纸袋依次访问的时候,是不是速度快一点,第二呢我去访问他的时候,数据尽可能沿着那个纸袋的顺序来,就是1234567,不要是179356对吧,那这样的话它的效率就低了,第三个呢就是我的数据。

如果是诶我要申请,我要去写它,或者说我要去抹掉它,不要一个一个的把它抹掉,而是说一次一批的抹掉,其实讲这个游戏引擎的底层内存管理啊,包括像C加加的最新的,比如C加17啊,21啊。

有很多很高端的这种属性课程,那个那个功能啊,很多同学学的感觉感觉是云里雾里对吧,但实际上它的底层逻辑至少以我的经验总结,就这三条,就是把数据放在一起访问,数据的时候尽可能顺序的访问。

然后最后一个呢就是说你去读写的时候,尽可能一起去读写,所以的话上过我们games104的课程,同学们的话,如果有同学给你们讲那些高端的这个,内存管理的知识的话,基本上游戏引擎里面所摸索出的这三条。

基本上够你去混到这个初级架构师吧,应该问题不是很大,这里面我们小小的这个这个这个凡尔赛一把,所以说其实这也是做游戏引擎,我我们个人非常喜欢的东西,我也特别推荐同学们都学一点引擎的知识。

因为你读完这些东西之后,你就可以像当你面对一个巨型软件系统的时候,你不慌,你知道他怎么从底座一层层的构起来,而扩的这一层的话呢,实际上是操作系统,操作系统底层和类似的东西,所以我们的这个好学的小明。

如果他把括这层东西学完的话,我觉得他已经非常强了,其实CORE在整个游戏的这个引擎层的话呢,是一个核心层,那么它的代码呢一般要求质量非常高,而且呢轻易的不要去动它,所以一般来讲你们看到一个游戏工作。

一个游戏游戏引擎公司吧,可能是几十个上百个开发人员,但是能写CORE的程序员不会很多,都是这种很资深的同学去写的代码,他要保证它的绝对的安全性,绝对的效率,所以呢我们一些最核心的东西会放在这一层。

那个就是维护起来好,那小明学到这儿,我觉得这样的同学们讲了,我看到弹幕了,有人说小明这时候应该没头发,我觉得差不多写到括这层应该就没有头发了,那么就是其实小明这个时候把这个游戏都已经。

从上到下全部写完之后,他就会遇到他的另外一个问题是什么呢,就是说哎我要找我的小伙伴去得瑟一下,我们一般传统那个故事里面都会讲,小明旁边一定有个叫小美对吧,那这个时候他会发现我把这游戏做好之后。

小美我想在小美面前得瑟一下,我发现小美用的是一个Mac好了吗,我用windows开发的一个游戏在Mac上怎么跑起来,你们会发现不同的平台,它连文件路径的格式都不一样,一个是正斜杠,一个是反斜杠对吧。

一个是C冒号什么什么,一个是volume冒号什么什么,这就很晕啊,但其实我不可能在我引擎的代码,从头到尾都这个重写一遍,对不对,所以呢这个时候平台层就会变得非常的重要。

平台成本质上就是说你在上面写核心代码,你在上面写功能,可以无视这些平台的区别,而直接sorry,而直接去写它核心的逻辑,那么这个时候的话,其实平台词我们叫做平台无关系,就是把所有平台的那个差异度。

全部把它给掩盖掉,这一层,其实也是现代游戏引擎非常核心的一个东西,为什么呢,我我刚才讲的这个文件路径,其实还是个比较简单的,真正让大家头疼的是什么呢,我给大家举个例子,就是当我想做一款游戏的时候。

当我们是在PC上,我们面对的可能是DX对吧,DX有DX11,Dx12,那么当我做到那个Mac的机器上的时候,我遇到的是什么,是metal对吧,当我遇到那个安卓的机器上,我看到的是什么呢。

可能是open g r e s,我们看到的是win,这个时候上面写那些图形学feature的人对吧,我们去写那些那个那个SHADER的人是不是很崩溃,所以其实在现代游戏引擎中呢。

有一个非常重要的一层叫做RHI,就是render hardware interface,就是它重新定义层graphics API,然后呢把这些各个硬件的这个SDK的区别,把它封装起来。

大家可以看到这是一小段这个那RH的代码,但发现其实我的天哪,这些函数你就全部重新定义了一遍对吧,而且全部是那种虚函数,虚函数是个比较高能的概念,其实如果学会C加的同学都知道,就是他要等着你去实现。

就是说你要把它编译成这个MICHAEL的,编译成这个PC的,编译成这个移动端的,你自己实现一遍,但是呢上面写那些效果的同学,其实呢就不用管了,但这一层其实比大家想象的要难写很多了。

这个我只有我们好学的小明,我怀疑这时候小明的头发应该已经掉光了,为什么呢,因为就是我举个简单的例子吧,比如说DX11到DX12都是微软的全家桶对吧,但是如果做过引擎开发的同学。

就知道它的设计理念是完全完全不一样的,那么如果你把DX11的代码深编译成,就是DX12的代码的话,你的游戏的不是跑的越来越快了,反而会突然一下子跑得非常的慢,因为你必须要利用DX12很多的特性。

去做很多底层的优化,但是呢在上面写那些游戏功能层的同学,一般是不知道这下面是怎么做的,这个时候我们做底层的同学就头发就全掉光了,因为这个确实是非常非常的难,所以平台层是一个很容易被大家忽略的一层。

但其实呢这也是一个引擎的水平的高下的,一个很重要的一个分水岭,那么其实这种这种差别的话呢,不止在这个我们看得见的graphics啊,我再给大家讲一个更丧心病狂的,就是大家想象过没有不同的平台。

他连CPU的架构都不一样,这里面的话我给大家举一个,就是那个大家特别喜欢的PLAYSTATION的例子,这是第三代PlayStation PS three,那么在p S3里面,在我们传统的习惯的CPU。

它这里面叫PPU之外,有几个小的协助CPU,叫SPUSB的速度是很快的,但是呢它的访问的内存,它是直接可以写到显存里面,这个讲起来比较抽象了,简单来讲就是说我们在做各种绘制的时候,有很多数据预处理准备。

包括一些独立的AI逻辑运算,索尼爸爸说,诶你可以把这些运算放到我的协处理器上啊,好了,索尼爸爸是一辈好一片好心,对不对,但是当我们在做游戏引擎架构的同学,头发就瞬间掉光了,为什么呢,因为我的天呐。

我在上面写AI写逻辑的人,写这个就是比如说这种资源准备的人,我是需要知道我这个算法,是具体跑在哪个和上面吗,大家想象一下好,我如果这样按照PS3我去写了,那我假设编译一个XBOX版本怎么办。

然后我再编一个PC版本,怎么Mac版本怎么办,我的核可能是,比如像现在我们的很多很多arm的芯片,有大小核的概念对吧,那我哪一个算法后呢,哪个核才合理呢,其实这也是我们在游戏引擎的平台层。

非常非常痛苦的一件事情,所以同学们千万不要小瞧这个平台层,平台层做的好坏,其实对你引擎的效率影响是非常非常大的,所以小明如果今天如果想在小明面前展示出,她做的最牛逼的那个动画角色的话。

他首先得解决平台呢,不过我觉得在目前来讲的话,我们这个要求下,小明呢大概把文件路径搞对,我认为他这个游戏就能跑得起来了,因为毕竟很简单,但是你要做一个非常非常复杂的游戏,比如说像全战这样的游戏。

比如说像那个就是使命召唤这样的作品的话,你可能这个这个层的话,是要非常用心地去设计过的,那基本上讲到这儿的话,其实游戏引擎的RUA的部分基本上就讲完了,这也是我们讲游戏引擎,它我们可以理解有两大块。

一块是实时的,但是呢还有一大块就是我们刚才讲了工具层,工具层我们为什么放到最后讲了,因为它我们经常讲它不是软弹的,但是工具层其实对引擎到底意味着什么呢,我们再回到我们小明这个例子,小明想做一款游戏。

但是他一上来这个角色啊,动画美术资源都是找他的小伙伴去要的,这个时候假如说哎我这个功能已经做好了,我想请这个小张来帮我去做他自己想做的角色,对吧,更酷一点,这个时候他发现啊,他需要设计一整套的工具。

让小张给他的这个世界里添东西,所以呢工具层的话呢,实际上就是啊允许别人与level editor,就是以地图编辑器为中心,形成的一系列的编辑器,比如说我们经常很熟悉的蓝图逻辑的编辑器,对吧。

还有材质编辑器,让他去调这个角色的各种细节的材质,那为什么在游戏引擎明白吗,单独做个材质编辑器呢,实际上是这样的,就是说因为一个东西我在比如说3D max里面,玛雅,你看到的效果。

和我在游戏引擎中看起来效果是不一样的,所以呢游戏引擎的材质编辑器,它会保证就是你在这里面预览看到的效果,和你在真实游戏中看到的是一模一样,这个对我们的艺术家是非常非常重要的,所以工具这一层啊。

在我看来就是是真正的生产力的工具,你的创造力实际上,就是靠工具这一层去释放出来了,但是工具这一行的开发呢就是很灵活,就是说引擎一般来讲我们都是用C加去写的,因为他要追求最高的效率嘛。

因为他是RA实时的去保那工具这层的哈,其实它的开发方式非常灵活,比如说如果你喜欢C加加,你可以用qt啊去做它的整个界面,它是以效率优先的,而是以开发效率优先的,不是以运行效率为优先。

那么如果你可以选择c#,用强大的WPF做它各种各样的控件,对不对,你甚至可以用那个H5,去全部用web端做一个工具,其实也没有问题,所以的话呢工具这一层,每一每一个引擎它的选择都会不太一样。

但是呢最核心的一点是不能变的,就是说我们的工具层,实际上是允许别人去创造游戏的内容,而工具层的话也是引擎,可以说是最核心的一个一个体系,这里面给大家讲个概念,就是虽然在五层的分化中,工具层只占了一小层。

对不对,但实际上工具层的代码量,很多时候是比引擎还要大的,它的维护起来了,门槛复杂度也会更高,那么其实呢我们除了自己啊,开发了各种各样的编辑器之外,还有呢很多我们叫做DCC。

DCC这个名字听着很高大上啊,叫digital content creation,翻译成人话就是别人开发的这个资产生产工具,比如说大名鼎鼎的3D max,MAYAPHOTOSHOP对吧,F mode。

还有还有大名鼎鼎的胡迪尼,就是大家看到很多大片,那个效果都是胡迪尼做的,那这些工具生成了大量的数字资产,和我们自己的编辑器生成生成的这种数字资产,通过我们的一条管线全部变成我们游戏统一的。

就是我在前面介绍的叫什么asset,那这个管弦叫什么呢,叫做asset conditioning pipeline,这个名字听着很高大上,其实简单来讲就是各种各样的导出器和导入器。

就是比如说在3D max里面,在MAYA里面,我把这个市场导出去,对不对,然后呢再把它导成我们自己的id,然后呢这些东西进入到我们的游戏引擎里面去,所以这个就是我们自己开发的编辑器。

再加上我们这个资产的导入器和导出器,共同构成了我们的工具层,工具层有个很神奇的特性啊,就是说我们可能自己开发了,就是十几种不同的编辑器,然后呢我们还用了七八种别人的编辑器,这几十种工具之后。

它会互相形成一个链,在这个链中间的话,这些数据都必须要彼此通畅,彼此要能够说话,这件事情其实比大家想象的特别的要难很多,因为数据之间的知识实现互导的话,他必须要有一个统一的数据格式。

所以现在的话呢很多的那个厂商也在提,这个就是说一些通用的数据格式,比如说著名的那个啊FBX对吧,这是十几年前大家在推的东西,那现在这次现在大家都在说USD,对不对,这是那个就是应该是PIKA。

还是迪士尼在做的这个数据交换格式,但这些东西呢for电影,for这些东西都可以,但是呢在游戏中的话呢,一般来讲游戏引擎会自己定义一套自己的格式,所以这一套工具层的话呢,是构成了一个完整的游戏的生态体系。

所以大家看一看,就小明同志为了做一个一个简简单单,也可以动起来的角色,如果他真的是一个隐形程序员的话,他要做这么多东西,所以呢这就是引擎的一个全貌,这也是一个非常快速的进入到引擎的一个tour。

那就是为什么引擎要分层呢,其实用一些学术的话去讲吧,就是第一个它是decoupling,这个复杂度就是我我在我的第一集跟大家讲过,就有现代游戏引擎,我觉得是一个复杂度的一个艺术。

就是他因为我们在模拟整个matrix嘛,那么我们对这个世界的模拟,它的复杂度是非常高的,所以呢我们通过一层一层每一层控制变量法,就是每一层只关注自己的事情,而不用再关注过多的东西。

那么越往下的这个层次的话呢,提供基础服务,那么其实这个analogy像什么呢,特别像我们的真实世界,举个例子啊,同学们生活在一个大城市里面,我想问你个问题,你你你大家有没有想过。

为什么我现在每天电灯打开就有电对吧,我写一个地址,我的东西就能寄到别人,其实一个现代城市,它也是一个ecosystem生态体系,它也是分层的,比如说最基础的我们叫做facility。

就是说基础的水电排污,这些都是城市的最基础的设施,是很多老百姓根本看不到的,这像不像我们的这个拉风和扩这层,干的事情对吧,然后再网上诶,我们有城市的物流资源调度对吧,每天我们吃进去的东西。

我们这个扔出去的垃圾,这些资源在调度,而且我我的城市垃圾场不会爆掉,是不是我们有个资源系统,对不对,好,再网上,我们在这个城市里面,我们要生活,我们要经商,我们要做更多的业务,我们要创造财富,这是什么。

这是我们的功能层function层,大家仔细想想是不是也是一层层,其实这是一个现代啊,现代系统科学的一个很重要的概念,叫in capsule,叫封装,其实这个世界如果只是没有封装。

只是把所有的概念散乱在这儿的话,是不可被理解,也是不可被管理的,举个例子吧,这个世界一切都是由原子构成的,但是当我把足够多的原子合到一起,它形成一个东西叫篮球,这个篮球你可以玩了。

你不用关心篮球有多少个原子构成,你知道他是个篮球对吧,那一群人拿着篮球去在一起打的话,我们看到的是一场篮球比赛,篮球比赛又是个封装,所以其实一个复杂系统,它就是一层一层一层一层的分分封装起来的。

所以这也是为什么我说游戏引擎课,这个是很有意思,就是说大家通过这样的一个思考的话,就能理解一个复杂问题,我怎么解决,但这里面还有一个很有意思的东西,是说其实在这个架构中呢,我们有一个基础语。

有两个基础原则,第一个原则是什么呢,就是说越往底层的东西越不要去动它,比如说我们的platform这一层,我们的核心这一层和这和这一层,基本上代码拆开之后几年是不要改的,因为他那个一改上面就很麻烦对吧。

但是上面的代码像功能层的话,代码改来改去,工具层的话几乎每天都在变,我今天想到了,我要做个什么玩法,我需要一个什么工具,明天就去做了,但是的话呢就是说,所以说其实呢当我们的需求不断来的时候。

我不需要从上到下去动它,所有的系统,我只需要动它外面的上上层的系统,越网上越灵活,越往下越稳定,这其实也是分层结构的一个很大的好处,在这里面讲了一个更重要的一个概念是什么呢,就是说其实啊。

当我们未来在做任何一个需求的时候,其实同学们首先要去想的是,我做的这件事情应该属于哪一层,而不是急急忙忙的我把这个算法写出来,这个其实在我们在看到,就是很多人就很想做一游戏引擎嘛。

经常会框框把很多功能对在哪,就说哎你看我这个效果做的特别特别好,但是真正做过这种系统性训练的同学,就会知道说,我首先要去想我这个功能到底属于资源层呢,对吧,比如说我们作为一个大类型。

我到底是在资源层写什么代码,我在核心层写什么代码,我在功能层写什么代码,这个要一层层分得特别清楚,再讲个小trick,就是说功能层之间的调用的话,各个层次现在调用的话。

我们一般只允许上面的层次调下面层次的功能,但不尽量应该是绝对不允许,就下面反向掉上面一层的功能,这就是分层的一个就是核心的体系结构,其实大家去研究现代引擎的话,如果做得好的话,一定是分层的。

每一层都要很清晰,所以这就是我们这一节课的一个最核心的内容,就是给大家讲清楚我们的这个游戏,一层的分层的基础价格,我不知道,讲到这,同学们,是不是已经对游戏已经有个基础的概念了对吧,是不是像小明一样。

觉得我们已经可以完整的开始,交付一个有意思的功能了,那么的话呢,这里面就到我们课程非常有意思的1part了,就是说我们的明年整,对我们想了大概一个多星期,我们终于决定给我们的引擎取一个名字。

对我看到同学们有在弹幕里说,唉我已经开始害怕了,同学们不要怕,因为这节课呢,我是把整个引擎整体的介绍了一下,但实际上在未来的实际讲里面,我会一点点的去讲,而且我们的project实际上是蛮简单的。

所以呢我们做了一个非常非常简单的引擎,叫pilot,那为什么叫pilot呢,就是说呃我们叫做领航员,也就是说当大家面对这样一个一个洪荒怪兽,游戏引擎的时候,我们这个小引擎就作为大家的一个领航员。

帮助大家真的能够看见一个引擎,怎么一点点的构建起来,所以我们的课程组真的很努力啊,他们先写了第一版,就是C和C加加的,那么代码量控制的很好,只有1万1万5100行代码,那么其中的话呢。

RUNTIME那个部分大概是1万3000行,然后呢,那我们还做了一个2000多行的一个编辑器,那么我们的引擎代码的话呢是严格的,按照就是我们的课程讲的分层,就是说诶在run on的话。

我们会从这个平台层这个核心层功能层对吧,然后呢一层层的网上分,然后呢我们还有一个编辑器,独立在外面给大家看到,那么就是说这个小引擎虽然很小,但是同学们那个我们课程组还真的很生气,居然还支持了LINUX。

还支持了Mac,那我们现在正在编译它的m one版本,所以呢,预计我们这个周五会把这个引擎整个上传的GITHUB,让同学们去下载,那么现在的我们的第一版引擎开放的什么功能,大家看到没,有。

一个小小的编辑器,你可以在这可以直接进行拖拽拉编辑,然后呢我们还做了一个对,还可以去编辑这些东西啊,然后现在呢我们第一步先要把物理开放出来,我们先让你做一个小小的胶囊。

我只把它锁定到那个那个Z的一个高度,所以呢它的碰撞没有看见,你看见它可以自由地穿透所有的场景,那我们下一节课的时候,我们讲到物理的时候,会把这部分给大家开开出来,然后呢这个时候你就可以在家走来走去。

走来走去,然后这个小小的引擎里面还做了所有的反射,所以当你点击你们所有的元素的时候,它的面,那个他的那个所有的属性都是可以编辑的,而且这个引擎呢还是可以就是一键play,就是说你这边编辑器编辑完成一点。

就可以直接play,虽然麻雀虽小,五脏俱全,那么其实在接下来的这个就是啊,我们的课程中的话呢,我们会逐步的就是放出这个隐形的功能,那这里面的话呢我们会放出我们的,就在这个周五的话呢,我们会放出编辑器呀。

放出最简单的这个camera control啊,再放出那个绘制,它有全套的绘制,还有呢4月系统,还有呢我们的一键play的系统,那么在后面的课程中的话呢,我们会逐步放出,比如说动画系统。

就你看大家可以看到角色可以动了对吧,还可以放出那个物理碰撞,还有我们立的那个flag,就争取这个课程学完之后,同学们可以自己做一个网络对战游戏,这里面我特别想highlight1件事情啊。

就是我们的项目组同学们写这个小引擎写嗨了,就是他们居然把全套的ECS给做进去了,就做了一套小小的ECS,这个e cs的概念比较比较,那个就是啊比较高端了,就是我们课程后面会讲,就是就现代游戏引擎。

那个就是对象和组件构建的方式,好像还能支持多线程,所以我觉得我们小伙伴们是做这件事情,做的特别来劲,所以的话呢争取到那一趴的时候,我跟大家去讲,所以啊这个所有的这个SCODE。

我们在这个周五会上传到GITHUB上,然后呢就是希望小伙伴们就是顺着我们的课程,就是一点点的去摸这些代码,因为这个代码其实非常简单,就是大家去找TECHLOGIC对吧。

tick render基本上就能看懂他所有逻辑,所以你不用再对应的,基本网上代码的引擎去看了,其实这个小引擎虽然很小,但是它的结构搭得非常的工整,所以大家呢就能够很清晰地看到整个体系结构。

这也是我们104课程的一个精神,就是说我们要把一个非常复杂的东西,把它庖丁解牛讲成一个非常清晰的结构,因为我相信我的我们的同学们,将来以后会在游戏,游戏引擎,游戏产业以及游戏引擎所衍生的产业的。

各个方面都会去做各种各样的事情,那你有了这个框架之后,你很容易的就知道说我要在哪个维度去发力,对吧,所以希望同学们不要被吓跑,不要被这个困,不要被这个复杂度给这个吓破了胆。

而相反跟我一起进入这个非常有意思的journey,好的,这就是今天的话呢我的课程的主要内容,一个小时的课程,同学们是不是听了我的信息量特别大,大家可以忘记我刚才讲的所有的东西,那么这个课程的话。

大家只要记住三件事就可以了,第一个呢就是引擎是分层架构的,大家还记住引擎热达几层,五层,最下面一层平台,我要把平台变得无关,然后呢上面是一些核心的内存管理呀,数学公式啊对吧。

容器容器分配啊这些的一个工具层,那么这就是那个核心层,再网上呢是资源,就是我要把我大量的各种各样的资源,进入了我的游戏,我去管理,我要下载我的关卡,我的玩法,我的逻辑好,最上面一层是真正的游戏玩法。

相关的就是功能层,然后呢这些东西全部有了之后,我在上面还多了一个编辑器,你可以自由的编辑这些属性,123455层,一个由现代游戏引擎,就就是游戏引擎就已经出来了,然后另外一个的话呢。

就是说这个这个架构中的话呢,就大家只要记一个概念,就是说越底层的代码越稳定,质量也要求越高,越上面的代码呢设计的越开放越灵活,能够适应不同的游戏产品,不同玩法的需求,这就是游戏引擎架构的核心逻辑。

那最后一个的话呢,就是说这个游戏引擎的世界里面,它的核心是靠一个这个tick函数,tick tick tick把这个世界驱动起来,所以记住这三点,你就知道了,现代游戏引擎的核心架构。

这也是我这节课的全部内容,好的谢谢大家,同学们有没有什么问题,问题,好有同学在问GITHUB上看还是零食,对我们现在还没有上传,大家稍安勿躁,我们还在那个,因为我们其实现在开发的功能呢比这个多。

但是呢我们打算这个放出来是一步一步的放,就是说跟着我们课程放,我们担心一下子代码放的太多的话,同学们看了之后很难一下子看明白,所以呢我们就是先只放最基础的这些功能,所以这个代码我们先清出来的话。

大概周五能放出来,好windows可以支持的,没有问题的,VC也可以去支持,对,啊同学们还有什么问题,啊其实每个引擎它的命名都会有,就是有同学在问我说分层的结构在UE4中啊。

比如说在unit之后是不是一样的,其实每个引擎都会有自己的大致的差别,包括像特别像那个功能层吧,在很多引擎里面又会分成好多层,但是呢它的大致的基础,比如说像platform平台无关,这一层。

基本上每个引擎都要都要做的,像核心层,基本上所有的引擎都要都要做的,然后呢resource这一层基本上也会有,但是在function那一层的话差别会比较大,所以的话呢就是大家就是抓这个大的,这条龙的话。

一般问题不会很大,而且呢所有的游戏引擎,它都是从这个就是tick tick开始,它可能叫update,可能叫tick,但是核心就是到了固定时间,他就tick1行,包括所有网络啊。

网联网对战逻辑也是这样的一个逻辑,所以啊应该来讲叫大同小异,啊有同学问我说,为什么标准的STR库做不到这么高效,哎这个是一个让我头疼了很多年的一个问题,就是说呃我从我开始学C语言编程的时候。

我就很喜欢用STR库对吧,STD那个vector,s t d array用的很舒服,但是呢实话实说,我也不知道为什么当年那帮大神,那个代码写的时候,就没有关注这个内存的,这个这个这个这个是使用效率。

但也有可能是因为我们在游戏引擎中,我们对这个性能的这个敏感度非常高,其实我们经常讲的就是,你同样喜欢三写写一件代码,如果你对内存管理没做好的话,其实你的效率可以下降一个数量级,就可以卖十倍的。

这个不是开玩笑的,这个其实是我到时候到那一趴,我跟大家详细的去讲,所以呢其实大概在十几年前吧,就是游戏行业就是有个大神,就是那个我们的ea团队,他们就寒霜引擎那个团队,他们做了一个自己的叫ESTR。

他们去做了一个就是更高效的,更紧致的内存管理,然后呢我们很高兴的看到,就是在最新的C加17吧里面,就把这一套STL库就放进去了,然后呢,让我们也能够享受想在标准的STR库里面。

享受到这种内存高效的这样的一些这个容器,同同学的问题是什么哦,还有同学问好像是VR游戏的开发是吗,呃其实呢是这样的,就是我觉得VR游戏现在还在一个,就是同学有同学在问我说。

VR游戏的开发和普通游戏的开发有什么区别,首先的话呢我个人认为啊,就是VR游戏还在它发展的早期,这不是坏事,这是好事,就是10年后20年后VR游戏会发展成什么样子,我们真的不知道。

也许它的未来是不可期的,未来也许VR是最主流的形式,但在今天的话呢,VR游戏它受制于硬件的那个算力,就是因为VR游戏,现在主流硬件都是在它的GOGO上面去运算,它的算力非常有限。

所以VR游戏呢它在它的这个场景设计啊,复杂度上面,对性能上要求会更高,所以这一点的话呢是在VR游戏,我们一般会讲强调就是强交互,强体验,而不去拼那个视觉的细节,因为他不可能做到有一个3080。

3090显卡对吧,这个这个就是一天120瓦的,这个这个机器在里面跑的内容非常3A的视效,但是呢就是这件事情,我觉得未来如果通过一些更好的无线传输啊,这些机制能够解决。

因为现在的问题就是无限常输的latency太大,所以呢我们的计算放在PC上传过去很麻烦,然后呢有线传输的人带着又很难受,所以现在VR的主流方案计算都是在架构上面,所以这个是目前就是大家所遇到的困难。

但我相信随着硬件的升级的话,这个问题会解决掉,而且我个人认为VR未来跑的游戏,它应该是超3A级的,因为你想两只眼睛,我要看到8K的画面,而且是110秒钟,120帧的刷新。

而且那是真正的一种沉浸式沉浸式的体验,所以我认为V2如果这个硬件问题解决的时候,解决掉之后,我们应该看到那种超3A的声明,其境的这样的游戏体验,啊有同学说上节课没作业,怎么现在又有作业了。

我们再次声明啊,这个作业不是强迫的,大家把pilot的引擎下载下来之后呢,再只是你去玩,你去编,你去看,不需要去写太多的作业,而且呢我们大家如果想写的话,在哪写,我们也尽可能给大家标准出来。

所以说这个取决于就是,如果大家以后想做这个游戏,以及游戏已经开发的时候,这个作业我们倒是建议大家去做一做,啊小引擎什么,这个问题,啊有同学问我说,小引擎是不是从平台上开始搭建的,呃实际上不是的。

小引擎首先是要从这个啊call啊,从功能啊开始搭建,但是呢搭到后来,我们肯定其实他是这样的一个现代引擎开发的,它不是这样一层层开发者,就是可能是三四个同学,有的同学负责写平台,有的同学负责写功能。

有的同学负责写和,然后呢这些代码大家合到一起一上来,把规范定义好,所以它也是一个小的mini project,好的同学们还有什么问题吗,啊现在小引擎的话,我们这次发布的版本的话,还是hard code。

在C加加里面,因为我们还没有把脚本系统开放出来,因为那套系统的话,它比如脚本系统黑C加加,怎么怎么去交换数据啊,怎么去接口,其实很复杂的,我们打算我们看后面是,如果我们讲到这一趴的时候。

可能把这一趴开放出来,所以我们目前的规划是,小引擎是一点点的往上加,因为如果一上来给大家一个代码量很大,很复杂的东西的话,我觉得很多同学没有基础嘛,可能很难一下子就get到点,所以这次小引擎拿到的时候。

我会推荐大家就是编译一下能够跑通,然后呢找到那个tick那个函数,看到一个叫tick render,一个tick logic,然后所有事情就了然于心了,好的那今天因为那个已经差不多了。

那我今天的那个课先讲到这,谢谢同学们,那我们争取下周我们开始我们的第三讲好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

02.色彩和人的视觉系统(I) | GAMES204-计算成像 - P1 - GAMES-Webinar - BV1ff4y1d7kq

8點了,同學們歡迎來到Games204計算成像的課堂。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

今天發生了很多事情,包括像日本前首相安倍晉三遇刺,然後國務戰場上也發生了一些變化,但是這個都不影響我們同學們學習的熱情,今天的這個課程算是給我們做整個計算成像做一個鋪墊。

因為色彩跟人眼的視覺系統是非常重要的一套系統,在這個地方我們想給大家先分享一下,整個色彩是怎麼形成的,色彩形成的肌理跟color matching。

這個可能會跟之前前面的課程會有一些像圖形學的課程會有一些重複,但是這個是給大家重新梳理了一遍,就是開始告訴大家什麼樣是色彩,大家以前看到莫榮富經常打播別人的時候,就會經常聽到青山常在綠水長流。

咱們後會有期,這個青山綠水這種自然界的顏色都是怎麼產生的呢?而且因為彩色攝像與顏色是密不可分的,所以說對整個顏色的研究和成像是一個非常重要的問題,顏色可以對大自然來說是一個非常重要的組成部分。

但是它又不同於我們自然界的光譜,今天來給大家分享一下顏色。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上一節課就是沒有很注意到我們的課程實際上是一個小時,所以說之前的課程都是按一個半小時準備的,這次把每一節課拆成兩部分,來給大家去更詳細的講解一下這些知識,今天首先是給大家介紹一下什麼是顏色。

然後告訴大家一個顏色裡面非常重要的一個概念叫,Spectral Power Distribution,這個有一些同學可能學過,但是有一些同學可能沒有接觸過這方面的知識,然後其實非常重要的一點就是人眼。

Biological Basis of Color,就是人這個色彩跟人有什麼關係,它是怎麼樣被人感知的,我們人眼的感光細胞就是retina,就是攝望膜是如何跟光譜進行響應,然後最後產生顏色的感覺。

最後給大家說一下人眼的就是追撞細胞,是怎麼樣對這個色彩形成一個什麼樣的分佈曲線,響應曲線,這個很類似的就是像一個我們圖像傳感器中的,一個color filter array。

就是RGGB或是RYYC這種濾光片,這個人眼的濾光片又跟人眼的一個retina,跟這個濾光片又有什麼樣的關係,人眼有一個非常重要的性質叫meta rhythm,大家有同學可能學過這個叫同色異譜。

這個同色異譜是怎麼產生的,它又有什麼作用,今天這一課就給大家揭露整個顏色的感知,還有最後告訴大家一個人的color perception,就是人的對顏色彩的感知,包括我們的色調,Q,飽和度。

saturation,還有brightness,這個叫明度,本來這一節課是拆成了兩節課,其實這一節課先給大家透露一下下節課的內容,包括我們採集到圖像傳感器,採集到這麼一段積分過後的一個。

spectral biodescription之後,我們在我們的傳感器,在我們的一個顯示器上,是如何展示這麼一種顏色呢,因為我們的primary light,也就是基色是不同的,我們如何做這種匹配。

如何去計算,在下節課的地方會講到這些問題,包括一些基於線性代數的一些方法,還有一些suit geometry interpolation,下節課的重點就是講color space。

我們為什麼要講color space呢,因為我們各種顏色都需要有一個統一的方法去表示它,在不一樣的顯示器材,不一樣的一些成像器材,或者是顏色的一種標準化的表示。

都需要color space的知識來做一個基礎,最後告訴大家,Bi-Filter就是我們的綠光片,包括像我們的RGB綠光片,或現在還有一些多光譜的綠光片,它是怎麼樣產生一個什麼樣的曲線。

我們應該怎麼樣處理它,首先看到這張圖,大家會有一個比較熟悉的感覺。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

這是一張就是大家如果是拍攝影,或者是拍一些其他照片,大家會有一個color check board,這個color check board是幹什麼用的呢,它就是每一個色塊裡面都有一個標準的顏色值。

這個顏色值在我的camera去拍它的時候,它會有一樣的RGB三個值的響應,當這個值的響應去跟這個標準的顏色值去匹配,就可以得到一個顏色的轉換矩陣,這個有同學問會講HDR嗎,這個會講HDR。

我們在Image Signal Processing這個Pipeline之後,會講到HDR的知識,包括像現在的HDR Fusion,或者是還有一個Tone Mapping的知識。

這兩塊來展示HDR的一個顯示,這邊當然回到這麼一個color這個問題,color這個東西到底是怎麼產生的呢,其實這個並不是大家所自然界所說的光譜,它是一個人感知的心理的過程,光源被觀察的物體和觀察者。

是形成顏色的感覺的三個不可或缺的一種要素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再給大家舉一個例子,大家如果去過摩洛哥,就可以看到這個藍色小鎮,有一個非常漂亮的藍色的屋子的樣子,雖然說這個面積會比較小,大家剛開始看的時候還是比較漂亮的這種色彩,這種色彩是怎麼產生的呢。

下面就給大家揭秘這個色彩的一些產生,除了這個這是一張哈勃望遠鏡拍到的一張外星空的一些星雲,人眼是如何區分這些顏色,然後又是如何感知這些顏色,這個跟我們平時的顯示器,包括我們的打印機。

這個又有什麼樣的聯繫,先給大家鋪墊的一些問題來告訴大家,這是像左邊這個是一個標準的一個燈箱,他就是剛才講到我們的一個光源,觀察物體還有觀察者,這三個是產生顏色的一個要素。

左邊這個是一個標準的一個光源的一個燈箱,它會產生一個比較均勻的照明,然後整個光源又是一個標準的,比如說像第五零第六五的一個光源,在這種情況下去觀察這麼一張圖,就會得到一個它在這種狀態下。

一個比較標準的一個表現,就可以跟最後我們要比如說大規模部署的像雜誌,或者是一些海報都會有這種校色過程,然後大家也可以觀察到像我們的,在我們的屏幕上面,跟我們在打印出來的這麼一張圖。

它的色彩我們可以感受到在屏幕上面,它的色彩會更加艷麗,這個是又是為什麼,但是當我們打印到我們的紙上了之後,它的色彩就會顯得那麼灰濛濛的,下面來給大家講解一下什麼是顏色。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先看到這張圖叫,Probe-Russell Diagram,這個橫坐標是一個它的一個溫度,就是在不同的一個溫度下表示的,這個是在開示溫度下表示的,從最右邊的2000K到左邊的35000K。

我們的縱坐標就是它的一個Luminance,就是它的一個,它這個是以一個太陽為標準單位,大家可以看到在下面這個是,中間這個地方,這個地方是一個標準單位,就是一個太陽的亮度。

當我的溫度就接近2000K的時候,就是溫度比較低的時候,也就是大家把那個,拿一個鐵把它燒到非常高的溫度,就產生一個紅色,就大概2000K,就是1000多度這麼一個溫度,它會產生出一個比較偏紅的那種顏色。

就是人眼觀察到是偏紅的顏色,當它溫度不斷升高,升到太陽這個溫度的時候,就會得到一個大概是6500K,這麼一個色溫,然後再不斷地升高我的溫度,當我達到11000或者是2000到3500。

它的這個發出的本身這個溫度,在這個溫度下物體發出的波長不斷變短,而人觀察到的顏色就不斷偏藍,就從低溫到高溫,就是由紅到變藍,它是隨著波長變化而變化的,但是顏色又不同於波長,這個時候我們就可以觀察到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

為什麼當這個爐子燒紅的時候,就會顯得變紅呢,這是一個黑體輻射的原因,就是當有一定的溫度之後,我們所有的物體實際上都是在發光的,我們包括即使你在一個全黑的夜晚,你看到的物體它基本上都是在發光的。

只是這個光它的一個波段,跟我們人眼觀察到的波段不是很一樣,比如說人體的溫度差不多是36。5度,在一個全黑的環境下,人會釋放出紅外線,這個波長大概是9微米到11微米,這個可以通過一些儀器感測到。

但是人眼是觀察不到,感知不到這個能量和顏色的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

現在給大家說一下,到底什麼是顏色呢,就是剛才講到光源被觀察物體和觀察者,是形成顏色感覺的三要素,顏色是光作用於觀察者的視覺系統,然後產生一系列的複雜的生理活動,跟心理活動的綜合效果。

也就是說每個人看到的顏色都是不一樣的,它跟這個人的眼睛的精妝,就是那個視網膜,還有人的一些認知都會有區別,就是顏色跟嗅覺味覺其實是一樣的,是在一些外界作用的一些刺激下。

然後在觀察者的一些大腦中的一些認知,怎麼定義這個顏色呢,就是光作用於人眼引起空間屬性以外的視覺特性,也就是說我們的眼對光線的刺激,會產生一些生物電流,這些生物電流會傳遞到大腦。

大腦然後對這些生物電流進行加工處理,包括形成了顏色感覺的在內的一些視覺。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在自然界我們可以觀察到的一些電磁波的波段是非常大的,從一些comic streak rate到γ射線,再到x射線到紫外,再到我們的可見光,我們的可見光是一個比較短的這麼一段波段,然後就會到了一個紅外。

還有微波,在遠紅外跟微波之間,又會存在一個非常神奇的波段叫太赫茲,太赫茲其實它既具有光的性質,又具有電磁波的性質,又有一個非常寬的一個波段,這個就會產生一些非常奇特的光源性質。

太赫茲成像目前在我們的一些生活生產應用中已經得到了應用,比如說像我們像安潔,太赫茲就可以對人體沒有損傷到這些安潔,但是像x射線就會產生一些比較不好的輻射效應,然後再長了之後就是微波雷達。

雷達波然後再到一些廣播的長波的,甚至是水下的長波的波段,人眼本身大概可以看到的一個範圍,大概在380納米到780納米之間的電磁波,但是本身顏色和波長的關係並不是完全固定的。

光譜上其實有三個點是在人眼的觀察下顏色不變的,包括572納米就是一個比較偏黃的一種顏色,還有503納米還有547納米,這三種顏色就是在亮度變化的時候,就是你觀察的顏色是固定的,但是其他的顏色。

比如說像這個660納米的紅光,投射到視網膜的時候,當我們把這個光強的值降低到以前的1/2的時候,想要產生相同的顏色的感覺,就必須減少波長的差不多有30個納米,才能保持原來的色調,其實這個我們可以理解。

越短的一些波,它會有一些更強的能量在裡面,所以說這個時候,當然這個也不是特別好解釋,這是一個比較複雜的過程,但是就有這麼三個點,它的亮度變化之後,人對顏色的感覺是不變的,除了剛才所說的紅色以外。

比如說像我們綠色光,比如說525納米的綠色光,在相同的條件下,就是我要降到我的亮度值,能量值的1/2的時候,我想要觀察到相同的顏色,我需要增加波長20幾納米,才能感受到一個相同的顏色。

這種顏色隨著光強度變化而變化的現象,叫做貝楚德普克爾效應,如果一片可見光頻譜,可以轉化成RGB數值嗎,這個我們可以給一段響應,比如說我們對RGB的響應,然後把這個可見光的頻譜,在這個響應範圍裡面做積分。

就可以拿到我這個RGB的值,但是我這個RGB的響應曲線,要先定義好,最後其實就是顏色自己,與色彩感覺,並不是一個簡單的因果關係,它是一個非常複雜的生理跟心理的過程,所以說大家現在,所有的手機大廠。

大家為什麼要調教,我最後拍照的一個效果,其實這個調教的人並不是技術人員,而是有一些心理學家,去調教顏色這個問題,從而讓人感覺到一個更有愉悅的感覺,下面給大家講解一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Spectral Power Distribution,就是我的這個怎麼翻譯呢,通常它是縮寫為SPD,它的意思是什麼呢,就是我的這個能量,在一個單位的一個面積上,然後單位波長,我們可以看到M(λ)=φ。

就是Luminous,也就是Radiance Extents,在一個單位波長,還有單位面積上的這麼一個值,它的一個單位就是,Units per nanometer,也就是瓦每納米。

但是有些時候大家也會把這個事情,叫做Unitless,我們忽略它的單位,其實這個並不是很重要的單位,我們通常就是我們要展示的這個,Spectral Power Distribution的時候。

通常我們會想要用一些,皈依化的這麼一種表示方法,我們會選取一個最高的點,然後去把它皈依化,這樣來顯示出來,讓大家容易看一些,我們不同的,其實整個要感知到視覺,光源是一個非常重要的一環。

就是光源被觀察者物體,觀察者我們剛才講到,整個色彩感知的三要素,光源產生了一些不一樣的光譜跟能量,這個時候打到物體上,然後再被人眼感知到,但是不同的一個光源,有不一樣的頻譜分佈。

比如像這個日光Daylight,它就會有一個比較均勻的,一種光譜的分佈,還有像Incandescent這種Light,這個就是白石燈,紅外跟紅色光會比較多,有一種就是以前大家小時候用的那種燈棍。

這叫螢光燈,螢光燈算是什麼原理呢,我是產生一些紫外光,紫外光然後去激發這個螢光,表面我的這個燈棍表面塗一些螢光粉,我用紫外光激發這個螢光,然後去產生一個可以照明的一些可見光,這種就會因為整個螢光的光譜。

就是分佈會比較集中,有幾種散發一些比較集中的能量,這個時候它的照明效率是比較高的,還有像下面的Hologram,還有像冷光源的LED,還有暖光源的LED,這個就是材料跟摻雜的不同。

就導致整個LED光譜的不同,冷光源大家買LED燈泡的時候,比如說到一個超商去買燈泡,可以看到3500K、4500K、5500K,有的還有暖光源就6000、7000K的,越暖的光就會越偏紅。

越冷的光就越偏藍,但這個暖光其實對人眼的傷害會小一點,但是冷光會顯得比較白、比較亮,我們光源發出的光譜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

來舉個例子,上面這個是200W的一個日光燈,我們可以看到它的整個譜帶是比較均勻的,當我們用一個棱鏡或者是光纖,把這個光譜去打開,我們可以看到它整個光譜是比較連續的光譜。

這個Pixel就可以理解為不同的顏色光譜,這個是用一個EV的光纖或者是Preserve,去把這個顏色散開,大家可以理解為橫軸,就是一個光譜的分佈,不同的波長,但是我們可以看到像這種CFL這種光。

就是它在各個波段,像汞啊或者是其他的一些元素,這個時候就會產生它自己對應的一些光的譜段,這個時候就是它的能量效率比較集中的,除了剛才講到的一個發射譜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

還有一些吸收譜,我們很多的一些物體,它本身是自己不可能發出我們人眼看到的可見光的,這個時候就需要光源照射到物體,然後這個物體反射到人的眼睛裡面,這個時候就會有一個概念叫吸收譜。

這個吸收譜也是一個隨著光頻率變化的一個函數,大家可以看到就是左邊這張圖,它就是一個右邊這張圖的一個平均的吸收譜,也就是說我們這個藍色跟紅色吸收的會比較多,但是這個綠色就基本上不怎麼吸收。

最後大部分反射光就是綠色,人眼觀察到的就是那麼一種綠色,這個吸收譜在我們打印的過程中是比較重要的,因為我們觀察到的就是被反射過來的光,我們要打印的材料就是一種吸收譜的一種。

說到吸收譜就不得不說一個Spectral Reflectance,大家經常做到像多光譜成像的時候,我們拍攝到一個多光譜成像有非常多的譜段,就是不同於RGB三個通道,我多光譜的相機或是高光譜的相機。

可能會有幾十個或是幾百個上千個通道,這個時候就大家直接拍到自然界裡面一個物體的時候,我們拍到的是它一個光譜的一個響應,但是考慮到光源,就大家會在整個我拍攝的視野裡,比如放一個白色的小參考的一張小塊。

然後這個地方是監測到我背景照明光的一個光譜,我的這個捕獲到的光譜響應,在處於這麼一個光源的響應,就可以拿到Spectral Reflectance,也就是光譜的一個反射,包括像可見光的近紅外的。

還有中紅外的都會有一些應用,比如舉個例子像這種石油的勘測,它的整個光譜比如在中紅外,近紅外的地方,它的一個reflectance就比較大,但是在一些像可見光的波段,它的反射就會比較小。

再舉個例子比如說水,水在一個可見光的波段就會有一定的反射率,但是到了紅外的一些波段,基本上就是吸收的非常嚴重,也就是說為什麼我們看到的一個水,會是一種偏藍的顏色,就是大概是在480納米左右。

水的一個透過率是最高的,所以說最後大家看到的一個水,就是把其他顏色都濾掉了,然後最後觀察到一個藍色,這也就是很多水下成像需要用主動照明的時候,通常會選擇480或者是532。

藍綠色的吸收不多的顏色來做照明,然後我們這個SPD。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是Spectral Pilot Distribution,是怎麼觀測它呢,通常大概最早,然後同學們都是用一個Preserve,就是一個棱鏡來觀測到這個,我們可以看到右邊,一個白光打到一個棱鏡上。

就是因為不一樣的波長,對一個相同的材料來說,不一樣的波長它的折射率會有變化,折射率會有變化就是,我最後我入射的,我們可以由Snes Law來確定,就是不同相同的一個光,不一樣的折射率。

最後它的入射角相同的時候,折射角是有變化的,這個時候就會有把顏色就會散開,經過兩次的這麼一種折射,顏色就會散得比較開了,然後我們通常是用一個光源,然後前面放一個窄帶的這麼一個狹縫。

然後再通過狹縫就是一個移速線光,到了這個棱鏡上,棱鏡再通過兩次的色散,最後再通過一個橫著的狹縫,然後大家就可以測到這麼一個,不一樣位置的這麼一個光譜,然後現在就是技術會變得比較好了。

大家會有一些閃耀光栓,有光栓大概有透射式光栓,有反射式光栓,閃耀光栓就是其中一種反射式光栓,我的光源達到我這個透鏡,然後有這種反射式光栓,光栓就可以比較好的,比較均勻的把這個光譜散開。

大家可以看到下面這張圖,就是整個光譜散開的一個過程,本身這個光源分配它是一個線性的過程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

這個slide是從NG,本身我們可以看到,比如說這個藍色的一個球,經過一個spectral meter的時候,我們發現它的一個不線響應,就是這麼一個分布,然後一個黃色的呢,它的波長會長一些。

然後把這兩個同時通過,用這個spectral part,那個radio meter去測它的時候,最後發現它的結果,實際上就是一個簡單的線性疊加,當我們考慮整個發光的光譜和反射的光譜,是如何作用的。

我們把這個光的一個頻率,記為μ,然後光源發出來的一個spt,我們可以記為fμ,然後本身我們的一個物體表面,的一個反射的一個spt,可以記為gμ,就是反射譜可以記為gμ,那最後它的一個結果。

就是一個簡單的相乘,這個時候大家,比如說尤其是這種多光譜測量,或者高光譜測量的時候,有一個白色的參考光,就白色的一個參考的小白塊,我拍到它,就可以測到我整個光源的。

這麼一個spectral part distribution,然後我在用我的相機,就多光譜相機,去拍攝這麼一個圖像的時候,就可以把這麼,然後結合之前測量到的一個光源的光譜,就可以把我的反射譜拿到。

但是這個顏色本身是比較複雜的,如何複現這個顏色,也是一個非常困難的這麼一個問題,因為不一樣的人眼觀測者,顯示設備物體,都會產生不一樣的一種顏色的感覺,如何精準地去複現這種顏色,尤其是對顯示領域。

是一個非常有挑戰性的東西,下面就給大家先分享一下,人眼的視覺到底是怎麼形成的,我們的生物的一個視覺是怎麼形成的,首先說一下這個人眼的一個,是怎麼一個形狀,就是人本身像相機一樣,人有一個瞳孔,就是啪啪。

但是在相機裡面這個就是孔蘭,然後我們有一個透鏡,也就是晶狀體,再後面是玻璃質,這個就是一般的介質,然後再往後,就是我們有一些攝網膜,攝網膜上面有不一樣的細胞,有追撞細胞,就是像一個比較長條的一個錐子。

這個是對一些暗視覺比較敏感,還有一些像那個,感狀細胞對暗視覺比較敏感,還有一些像追撞細胞,我們有三種追撞細胞,分別是RGB三種顏色,感狀細胞的分佈,是遠遠多於追撞細胞的,然後我們整個眼球。

這個地方有種叫,Fovea Central也就是黃斑,黃斑也就是人眼睛,就盯在哪裡看,那個中心的地方就是黃斑,黃斑它裡面的一個視覺,就是感光的神經細胞,是最密集的,也就是說人中心視野的,你盯在哪看。

你那個地方的一個分辨率,就是視覺是最好的,大家可以盯著屏幕看一下,你視野中心,你注意力集中的地方,那個地方是完全清晰的,實際上你邊緣的一個,就是看到的東西,是比較模糊的,也就是說為什麼人眼的像素。

說高也很高,說不高也不高,但是為什麼人眼能看那麼清晰呢,就是有一個,這麼一種注意力機制,就是我的中心黃斑,我的一個視覺是非常好的,但是我一些邊緣的視場,就會變得比較差,除了這個呢。

還有一些像optic disk,它是一個盲點,就是我視神經傳導的一些地方,這個地方是盲區,大家如果有興趣的話,可以找找你自己的盲區,在什麼地方,因為人眼是一個單透鏡的系統,這個單透鏡就難以避免了。

就很難去做到一個,就是比較大的一個視場,就是我視角比較大的時候,我這個邊緣的一個相智,是很難保證的,人眼本身就是大自然的,巧奪天工的一個精巧設計,就我設計的這麼一個人眼鏡,就是中心視野是最清晰。

邊緣是模糊一點,但是人眼又是怎麼樣,感知到這個色彩呢,首先說一下這個,photosensor的response,就是我們輸入的當然就是一些光,就有一些。

spectral power distribution的一些波長,然後我們最後本身的,我們的接收的傳感器,也就是我們的視網膜細胞,就會產生一個響應,就相當於在我這個響應下面,做一個積分拿到一個數值。

然後通過視神經,就是進行光電轉化,拿到一個生物電的一個信號,本身光譜的一個響應的方程,它是對一個,本身是對波長敏感的,不是渲染方程,而是光譜響應的一個方程,更大的一個,比如說我們響應更強。

就是對一種波長其實就是更敏感,那最後我,比如說有一個響應函數,f lambda,然後還有一個輸入的光譜的密度,我在一個R通道,就是紅色的一個通道,得到一個這麼一個積分,就拿到了這麼一個數值。

也是大家剛才那個同學,問到一個RGB是怎麼產生的,然後總結一下,大概有六個步驟,光源發出具有一定功率密度的光線,光線接觸在物體表面的時候,一部分被吸收,一部分被反射,反射過來的光,這種進入人眼。

這個反射過來的光,有一定的一個SPD,就是功率密度譜,通過一個晶狀體的一些折射,然後聚焦到我們的攝網膜上,然後經過感光細胞感受,感受到生物電,經過積分,就拿到在不同的一個追撞細胞進行積分。

就可以拿到我們不一樣的一個顏色的值,這個就會轉化成神經信號,給大腦感知到,然後經過心理跟生理的過程,就可以看到顏色,這個說到視覺,就不得不提到人的兩種細胞,一個就是肉子,也就是感狀細胞。

然後還有一個就是Cones,就是追撞細胞,感狀,這個感狀細胞,就是在人眼中是分佈是比較多的,大概有120萬個感狀細胞,也就是1。2億像素,也就是以前大家經常會看到新聞,就是人眼應該有過億像素。

這個它的響應峰值在什麼地方呢,就是人的感狀細胞,這個是沒有顏色的,大概在500納米的時候,它的響應是一個峰值,這就是Aesthetic Vision,就是暗視覺,然後本身的追撞細胞,是一個對量視覺。

Fotopic Vision,量視覺響應的一個主要細胞,它的一個分佈也就是,大概600萬到700萬的,這麼一個追撞細胞在人眼裡面,也就是說人眼能感知到色彩的一個像素,大概就只有六七百萬像素。

這些追撞細胞,它的一個響應,中心在555納米,這是它的峰值,不同的這種追撞細胞,就會產生不一樣的一個,Spectral光譜的一個響應,這個時候就會產生這種顏色,剛才說到我們可以看到。

這整個我們不一樣的一個細胞的分佈,我們看到人視野中心的時候,在黃斑的地方,我的這個感狀細胞的分佈,是非常密集的,稍微增大一點視場,這個追撞細胞是非常密集的,稍微增加一點視場,追撞細胞的數量下降。

感狀細胞變得更密集,到了最邊緣的視場的時候,這個基本上它就是感狀細胞的傾向,我們可以看到,這整個不一樣的細胞的分佈,大家如果注意觀察到,左邊這張圖可以看到,人的細胞的分佈。

跟本身規則排列的RTGB的Pixel,是不一樣的,人眼這個細胞排列,是有一個自由化的過程的,如果大家同學們學過噪聲的分佈,就可以知道有什麼粉紅噪聲,有白噪聲,然後這個人眼的這種分佈,就叫藍噪聲。

這個藍噪聲這種分佈,對我的信號的採樣,大家學圖形學,應該會對藍噪聲比較熟悉,藍噪聲的這種分佈,可以拿到一個比較優質的,這麼一種採樣的過程,我在我相同的像素下,可以拿到一個更優的,這麼一種採樣的結果。

也就是說我更好的一種圖像,這個給大家說一下,這個,人的一個攝氏細胞,大概就在幾微米一個量級,大概跟大家的一個ASPC畫幅的,這麼一個相機的一個像素大小差不多,它的反光能力就跟面積相關,說到人追撞細胞。

是如何感覺到顏色的呢,其實追撞細胞有三種,就是分別是Short Medium Long,就三種,然後每一種都會有一種,不一樣的這種光波響應,大家可以看到中心這張圖,這個就是不同追撞細胞。

產生的一個顏色的響應,這個你看到藍色,綠色跟紅色,這麼一種響應的過程,其實這種結構,就是追撞細胞的結構,通過我們觀察到,它大概就是像一個樹一樣的這種結構,這是一種可以說是,比較高階的超表面的技術吧。

就是三維的超表面的技術,可以對一些光譜進行濾波或者是反射,然後能通過我們這麼一個濾光器的東西,這麼一種結構的濾光片,就會達到感光神經,然後其他的光就被盤出去了,然後通過有三種這種追撞細胞,它的常暖不一。

這種結構 歸納結構不是很一樣,就可以產生這種三種顏色的響應。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通常人們就是喜歡把這些東西去規劃,我表示的時候把它規劃就可以了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然後Stanford的Mark Lowey老師,就畫了右邊這麼一張圖,就是它是把整個響應,做成一個三維的這麼一種分布,就相當於做了一個查找表式的一張圖,然後這個包括它的一個強度。

這整個信息全都包含在這麼一個,LMS這個響應曲線裡,所以說我們空間中,所有可能的一些響應,都是在這裡面的一個,就是整個三維曲線中的一個,直的一個線性疊加,通過這麼一張圖我們就可以產生,在這個正空間裡面。

基本上所有的顏色,說到人的一個視覺系統,其實由多種波長混合而成的光,其實擁有非常多的自由度,因為我們最後能觀測到的一種響應,就是我功率密度譜,根據我的人眼的LMS曲線,去積分的過程。

也就是說這是一個光譜積分的過程,光譜積分就是把我多維度的,這麼一個功率密度譜,然後在攝網膜上積分成三個通道,也就是積分為一個,就是LMS就是RGB,大概這麼一種三維的信號,然後這種功率密度譜的積分。

實際上是丟失維度的,也就是它是一個從高維度,到低維度的一個映射,這種映射其實我們反過來看,就是我有一個積分過來的值,我們是不是可以反向的去找到,非常多的一種組合呢,這種就導致了一種現象,叫同色異譜。

叫meta-rhythm,這個大家在圖形學裡面應該學過,就是擁有不同的功率密度譜,或者是不同光譜的兩束光,我們看起來其實經過人眼的一個,響應曲線積分之後,就可以看到一個相同的顏色,因為從高維到低維。

它的映射必然會出現一個,多對一的一個現象,就是不一樣的光譜積分過去之後,拿到一樣的值,但是我們看到一種顏色的時候,我們就沒有辦法反向的,來確定一個入色光的光譜,這個時候說是一個好事,也是一個好事。

因為這個為什麼呢,這個就會對顯示裡面就變得簡單,大家可以用混色的原理,不一樣的光譜,去把這個色彩以比較低的成本,去展示出來,下面就給大家分享一下,這個meta-rhythm,就是同色異譜。

同色異譜叫meta-rhythm,怎麼定義呢,就是兩個不一樣的光譜,在這個lms取線積分之後,可能會有不一樣的光譜,來得到同一個響應,也就是說兩個光,然後最後我的視覺的感受是一樣的。

這個原理對一個顏色的一個複現,是非常重要的,大家剛才講到,我們想要得到一個比較低成本,一個漂亮的顯示器,這個同色異譜就起到了,一個非常重要的作用,我們去研究它如何科學的混色。

然後一個接近於自然顏色的色彩,所以說現在大部分顯示器,都是通過3D色,通過控制這個基色的強度,來進行混色,然後拿到一個比較好的,這麼一種展示的效果,我們今天用到了大部分的顯示器,顯示設備包括像打印機。

都是要感謝這個同色異譜的原理,要感謝人眼,其實這種很精巧的一個設計結構,這個本身這個同色異譜,是一個非常重要的現象,這是我們展示了,四種不一樣的光譜,但是最後會產生同樣的顏色的感覺,比如當這第一幅積分。

第二個就是三個單色光去混色,然後產生同樣的感覺,然後不一樣的光譜,最後積分結果是一樣的,這個時候就會有非常重大的應用了,最早的一些color matching,就是顏色匹配這些實驗,是怎麼做的呢。

可以看到我們有一個觀察者,選一個正常的人,就是沒有色盲的一些人,色盲是咋回事呢,說到色盲,可以提一下,比如說我們有三種追撞細胞,他們大概可能是有一種追撞細胞失能了,這個最後就會導致色盲的一種現象。

當然也有可能是一些心理的過程,這個就比較複雜了,我們如何去觀察這麼一個color matching,就是我有一個測試的公園,右面有三種顏色,我通過不斷的混色,然後讓觀察者去觀察,直到這兩個顏色。

我調不一樣的光源的光域,直到這兩個顏色區分不開為止,就可以拿到RGB三個值的value,來混色出我測試光的這麼一個顏色,比如說像左邊這麼一個測試光,我用一個三種顏色來去混它。

這個時候我們這個藍色給多一點,這個綠色給第二多,右邊這個就是P1給多一點,然後藍色給少一點,然後繼續調整,我們可以看到,再繼續調整,增加一些綠光量,右邊這個把這個綠減掉,最後經過不斷的混合。

我們可以看到左右兩邊都同時拿到了,兩種相同的顏色,我們可以拿到RGB三個混色的值,有一個奇怪的現象,大家可以看到右邊有一個negative的值,它的綠色光是負的,這個負的是咋回事呢。

超出了我這個三個顏色的色域,後面下一節課我會講到色域的過程,超出這個範圍之後,整個的色域就沒有辦法去表達了,需要一些複製去表達它,所以在我們選顯示器,選基色的時候,選色域的時候就非常重要。

當我們的顯示器,顯示一些超出我們色域的東西的時候,這個顏色就會產生難以匹配到,就沒有辦法匹配到正常人顏感受的顏色,這時候顏色就會發偏,CIE是怎麼測試的,它是用三種單色光來去測。

這麼一個color matching的experiment,這個是CIE的一個RGB的primary light,就是基色的一個標準,就是不一樣的人眼的一個響應,大家可以看到這個藍綠紅。

紅色的地方就會有一些負的值,就是我們沒有辦法對這個超出色域的東西進行表示,這就是剛才大家可以觀察到的,為什麼會有這麼一個負的值,但是我們要注意。

這張圖它是一個color matching的curvature,不是響應的curvature,或者是一個primary spectral,這張圖只是反映這三個顏色混合的值的分布,然後有一個非常重要的事。

color matching的experiment是線性的,剛才做混色實驗的時候,也講到它是一個線性疊加的過程,非常簡單,直接疊加就可以拿到最後的結果,這個顏色又是如何被感知到的呢。

這有三個不得不提的東西,就是Hue, Saturation, Brightness,顏色可以大概分為彩色和非彩色的兩種標準,彩色就是大家常見的赤橙黃綠青藍紫,非彩色比如說黑白灰大概就是這種。

但是如何表達人對顏色的感知呢,就是通過Hue, Saturation, Brightness,也就是大家說的色調,飽和度,還有明度,明度不是亮度,色調是什麼呢,色調是我們人的眼睛對物體呈現出顏色的感覺。

這個色調的數目其實是非常多的,Hue大概有個一千多萬種,人眼大概可以分辨出來三百到四百種色調,當然這是專業的顏色藝術家可以分辨出來的,正常人沒有經過訓練是難以分辨的,飽和度是什麼呢。

飽和度叫Saturation,這個就是刻畫我這個顏色的純潔程度,表示這個顏色純不純,這個光純不純,所以說白色的飽和度非常低,整個我拿到的圖像,它的頻譜分佈越均勻,也就是頻譜越寬,它的飽和度越低。

反過來光的譜帶越窄,顏色的飽和度就越高,第三個就是說明度,明度其實它不是亮度,明度是人的一個主觀的感覺,但是它這個跟亮度,其實人們通常表示的時候,就通常用亮度的一個輻射功率單位去表示它。

但實際上它並不是亮度,它主要就是一個感覺,色度飽和度明度這三個屬性,就會給人最後的一個視覺感覺,當然也會出現剛才大家所說的一個,同色異譜的現象,如何描述這麼一個現在的色度學呢,通常大家用格拉斯曼定律。

還有格拉斯曼有四條基本定律,第一條定律就是說,兩個顏色表現的不同,就是因為什麼呢,也就是說這句話的意思就是,人眼就只能對明度色調跟亮度,就明度這三個變化來感知顏色,然後第二條定律說的是什麼呢。

就是兩組成分在混合混色的過程中,透過一種顏色的光譜連續性的變化,整體混合出來的顏色,變化也是連續的,第三個定律是什麼呢,第三個定律就是顏色外貌相同的光,不管他們的光譜組成是不是一樣。

在顏色混合中它具有相同的效果,這個我們就可以說出,但凡在視覺上我們看到的顏色是相同的,它都是等效的,剛才大家說的一個方向,Metarism也是這麼一個東西,凡是視覺上感受相同的顏色,它就可以相互去替代。

最後一條,也就是說當我們混色的時候,它的顏色叫亮度相加定律,這是一個線性的過程,也是一個叫Albeniz law,今天就給大家分享了整個顏色,什麼是顏色,然後顏色的光譜響應,人眼是如何感受到顏色的。

通過人眼這個顏色的性質,因為它是一個從高維到低維的映射,就會產生同色異譜的效應,同色異譜的效應可以拿來混色,去做一個顯示的作用,最後給大家分享了一個,整個顏色是如何感知的,包括人眼的Hue。

Saturation, 還有Brightness,下節課會給大家繼續講一些,比較深刻的顏色認識,包括我們的顯示器是如何複現這些顏色,包括我的顏色會如何通過,先行再述的方法去重現這些顏色。

也可以給大家提一些,Pseudo-geometric interpolation的一些知識,最後給大家分享一下Color Space,還有最後我的圖像傳感器,它的光譜的響應,是怎麼樣搞到這個視波器上的。

謝謝大家,大家有什麼問題可以詢問,請不吝點贊,轉發,打賞支持明鏡與點點欄目,因為這個色彩本身是比較神奇的一個東西,這個大家最好理解深刻一點,因為整個顏色會有一個專門的學問叫色度學。

它是一個比較龐雜的系統,下一個課程會比較涉及一些數學知識,這個時候就是我這個不一樣的光譜,最後我們去匹配它去把這個顏色複現出來,這個時候就會有一點問題,感光的過程可以給大家講一下,顏色的書。

我記得以前學過一個應用光學,我不記得裡面有沒有講這個事,作業現在還沒有,因為第一個作業是我要講過整個圖像的處理過程,才會佈置第一次作業,有作業,大概我們這個課會有五到六個作業,Projects。

給大家分享一下這個人眼感知顏色的一個過程,大概就是六個一個過程,外UV通電的讀到亮度跟色彩其實是比較分開的,色度學只涉及可見普遍,基本上就是完全根據人的眼睛的一個小應來說的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

這個沒必要了解太透,這兩節課覆蓋到的一個顏色的知識已經足夠大家用了,這個人眼的感知過程是怎麼回事呢?大家可以看到左邊這個slide,首先我們的光源會發出一個有一定功率密度譜,就是SPD的光線。

這個光線作為照明,然後打到物體上,物體表面會有一部分被吸收,然後另一部分被反射,被反射的東西最後進入人眼,反射的東西也會有一個SPD的功率密度譜,這個經過聚焦到人的視網膜細胞上。

這個視網膜細胞會反射光的功率密度譜,有三個LMS三個響應曲線,這三個響應曲線分別對這個功率密度譜進行積分,就會拿到一個三個值,三個值就是人眼的一個顏色的響應,這三個值會產生不一樣的生物電的信號。

這些生物電的信號就被視神經傳到大腦中樞,最後就可以經過一些心理過程,就會使人看到一些有顏色的圖像,這個作業最後是會在註冊的那個,註冊那個類似Blackboard的網站上面,有個課程的一個網站上。

大家可以從官網進到課程裡面,註冊之後就可以找到作業,最後答案也會在那個作業系統裡面去發放,關於這個Moses這個同學說的YUV通道的獨立性,這個跟還不是很一樣,色度值採用的增強方法。

這個這塊好像還真沒有研究過,這個之前研究過很多像HSV的這麼一個,HSL跟HSV,這個HSL跟HSB就剛才講的,Q, Saturation, Blackness是一樣的,這個HSV呢。

這個V是Value,又不是一回事,這個Value就是它的強度,這個強度跟這個明度是比較近似的,但是實際上它又不是一回事,這是一個比較簡單的解釋,這個Value是一個比較簡單的解釋。

它是一個比較簡單的解釋,它是一個比較簡單的解釋,它是一個比較簡單的解釋,它是一個比較簡單的解釋,它是一個比較簡單的解釋,它是一個比較簡單的解釋,它是一個比較簡單的解釋,它是一個比較簡單的解釋。

它是一個比較簡單的解釋,它是一個比較簡單的解釋,它是一個比較簡單的解釋,Camera跟Eye的原理還不是特別一樣,這個Camera本身就大概比較類似,基本上都是一個鏡頭加一個傳感器。

但是Camera基本上都是比較規則的排列,人眼的整個像素的排列,還有一個注意力的機制,包括不一樣的像素密度的分佈,是不太一樣的,所以說現在其實這個手機的多色融合,比如說一個黑白的,然後去融合一個彩色的。

去對彩色的存在增強,這個就跟人眼有點類似了,這個同學問的是什麼意思,知道一個主要是彩樣的,一個主要是彩樣的,一個是調色的,穿白色衣服顯泡,這個可能得問一下美術老師,這個還不一樣,這個HSB基本上。

它只是對人眼的這麼一種響應,HSV它是一個色彩空間,就是它的概念不太一樣,也不是說調色用的,它是一個色彩空間,就是它的概念不太一樣,(音樂播放),(音樂播放),這個又超時了,不好意思同學們。

今天的課程就到這裡,感謝同學們的觀看,歡迎大家繼續關注Games。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

謝謝大家。

03.如何构建游戏世界 | GAMES104-现代游戏引擎:从入门到实践 - P1:0 - GAMES-Webinar - BV1YY4y1p74P

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

哈喽诶大家好,那个我是王茜茜,欢迎同学们回到games104课程,现代游戏引擎的理论与实践,那么今天这节课呢,我们要讲是如何构建这个游戏世界,因为在上一节课,我们的小明学会了就是游戏引擎的基础结构。

我们知道现在游戏引擎基本上分为五层村,最核心的硬件平台层,到上面的这个核心层,在上面的这个我们的资源层,然后呢接下来是很丰富的,这个就是我们的功能层,再往上呢就是大家每天看到的工具层。

各种各样的编辑器对吧,非常的庞大,当然还有我们很多第三方的这个内裤,在支持我们,但是有了这些知识,我们只是知道这个大厦长得是什么样子,但是我们并不知道说这个大厦里面的建筑,这些砖石。

这些水电是怎么在一起work的,所以今天这节课呢,将会是一节含金量非常高的课,就是告诉大家说,唉我们怎么去构建一个真正的游戏世界,那么这个如何构建一个游戏世界呢,其实我们就要明白说。

这个世界到底有哪些东西构成的,那么这些东西呢他们是怎么去被描述,然后呢他们彼此之间又是怎么被组织,怎么被这个就是调动起来,所以这件事情的话呢就是我们游戏引擎的核心,而且这节课的核心就是。

教大家如何去构建这样的一个游戏引擎,那我们继续回到一个实战的例子吧,比如说我们那个聪明好学又非常自信的小明,他学上一节课,假设他学会了如何在一个游戏引擎里面,做一个动画系统。

并不意味着他知道如何做个游戏,那我怎么知道如何做一个游戏呢,我们就举个例子吧,比如说小明玩了战地2042,觉得这个游戏很好玩,但又很拉胯太多的bug了,他就决定说,那我就索性自己再做一个游戏引擎。

能做一个比2042更好的游戏出来,那么假设他设定了这个目标的话,他首先要去想象一下诶,这个游戏世界应该有些什么东西,那首先的话呢,我们需要对这个游戏事件进行拆解,那首先我们想到的东西是什么呢。

是一大堆的这种可交互的动态物,比如说地上跑的坦克,天上飞的无人机对吧,还有端着枪冲着这个NPC的小兵,当然了,还有火炮,还有导弹,看上去非常的酷,这些东西呢它都可以动来动去,可以根据你的行为。

甚至你可以直接上去操作这种东西呢,在我们的现代游戏里面,一般叫做动态物,叫dnan game object,那么这一类东西也是大家最容易关注到的东西,那么第二类东西是什么呢,就是默默的静态物。

比如说高高的瞭望塔,比如说飞机的机棚,比如说房子,我们在游戏中看到很多东西对吧,放在那边,但是呢它虽然不可以交互,但是它整个构成了我们这个游戏的各种各样的,关键性的game类的元素。

那么除了这些动态物和静态物之外的话,那我们还有什么呢,其实是大家最不容易注意到,但是却是无处不在的,比如说地形系统就是无处不在的大地,那么地形系统呢它就会无限的绵延下去,那么它又是我们现在所有的这些。

就是这个动态物啊,静态物的支撑的这个托盘,那么在游戏引擎中的话呢,地形系统一般是一个单独的系统,我们在后面讲其他系统会讲到,那么还有大家注意不到的是什么呢,就是我们的天空,其实很多时候大家好。

没有注意到我天蓝蓝的天是什么,但其实大家想象一下,就是我如果真实的在一个游戏世界里面,我要保,我要表现日夜的变化,我要表现阴天晴天下雨,大家看到那个天上那个变幻莫测的那些云,其实这样的一个动效和视效。

本身并不是特别的简单,就是我们专门有一个说法叫TOD,就是time of the day,就是日夜变换这样一个系统,但今天呢不作为我们这个课程重点的展开,还有一块很大的这个物体对象是什么呢。

就是我们的这个比如像植被对植被很有意思,你说它是动静态系统吧,确实它是固定在一个地,一个地方不太能动,但是呢风吹了它,炸弹炸了它,它又有交互对吧,但它本身又有一定的变化,而且植被的特点是什么呢。

它的量特别特别大,其实这些东西也会是构成我们的叫environment,环境的元素,那么小明分解到这儿,我们有了动态物,我们有了静态物,我们有了环境,基本上我们就可以画出我们所有能看见的,这个世界了。

对不对,但是这个作为游戏来讲够不够呢,其实还不够,因为游戏本身是要玩的嘛,那在游戏中呢其实还存在着大量其他的物体,比如说我们有一个叫trigger box,就是一个一个一个一个检测体。

检测体做什么东西呢,它你是看不见的,但是当你走进去的时候,他就知道了,举个例子,比如说我到了一个多七点,我走过去的时候,诶,我的积分就可以一直在涨,一直在涨对吧,包括我们去玩那个游戏的时候。

我们最讨厌的东西是什么,比如说空气墙,那些空气墙的话,那也是一个物体,对不对,我相信大家玩战地的时候最讨厌的东西是什么,就是我开一架飞机飞得正嗨呢,突然告诉我说你已经飞出了war zone。

然后五秒钟之后就把你击落对吧,但是这个东西我是怎么知道的呢,可能又放了一些你看不见的东西,甚至包括整个这个游戏玩法的规则,它其实也可以抽象成一个物体,所以呢就是在现代的游戏中的话呢。

我们会发现就是说无论你是静态的,动态的还是啊,当然大题和填空是独立的,但是像游戏规则啊,像检测题啊,我们都会把它统一的抽象成一个叫game object,游戏对象,那么这个game object的话呢。

在行业里大家会经常把它就是缩写成叫GO,注意啊,这里的GO和我们那个go那个语言,不是一个东西,包括围棋的英文go也不是这么练,我们一般都叫GO,就stands for game object。

就是在现代游戏引擎中呢,我们一般会把所有的这些东西全部的统一,抽象程叫做game object,这就是这个一个方法论,就是小明这样一想哦,我明白了,我要构建这个游戏世界。

那我就是要管理好这一系列的这个game object,就可以了,好那我们就知道了game object,那有了game object,我们怎么去做一个游戏呢,那首先我们就举个例子,比如说小明想。

那我先做个最酷的吧,比如说一个可以自动巡逻的无人机,对不对,那么它在战场上会飞来飞去,会帮我监控整个战场的环境,这个听上去非常的酷,那这个无人机怎么去做它,那我们去分析无人机的行为,那无人机你会发现。

当你去描述一个无人机的时候,你一般会得到两类的东西,第一类的东西叫什么呢,就是它的比如说它的外形对吧,它的外面的几何用三角形表达的外形,他的各种动画,还有他空间的位置,还有它的血量,还有它的那个油量。

它的电池量是多少,这个东西叫什么呢,我们统一的叫做属性property,那么另外一个东西是什么呢,这个无人机它是不是可以飞来飞去对吧,它可以move,可以移动,同时呢它还可以可以就是说去巡逻。

它沿着某个固定路线,或者有一定的AI算法控制台可以去巡逻,它可以追踪一些人,那这个本身呢是一些API的行为,你会发现就是说啊,当我们在游戏世界里描述所有的物体的时候,它你可以把它归类成两类。

一类叫做property,一类叫做behavior,就是属性和行为,你基本上就可以描述几乎所有的物体,那么在游戏引擎设计中的话呢,我们也是按这个进行分类,那么假设我们会去这个写最简单的,同学们的语言。

无论大家是学java呀,还是学这个啊,C语言还是c#,whatever就是只要是现代语言面向对象的,你会很自然的就会说诶,那我们定义一个类,比如说我们定义一个类叫无人机john。

那你看到我们会把所有的它的属性,定义成它的这个property对吧,各种变量,比如说你的位置我定义成一个三维的向量,Vector3,然后呢你的血量我定义成一个标量,就是比如说零到啊,100这个值。

你的油量我可以定义到0~1的油量对吧,那我会有两个我的内屏函数,就是我我的函数定义我的行为,比如说我是不是可以木啊,我是不是可以这个巡逻啊,那么这样的东西是不是一个很完美的一个,类的定义。

就是我把我的数据和我数据,所有的方法都放在一起了,其实呢这个东西虽然看上去很土啊,但是最早期的游戏还真的就是这么架构的,非常的简单,非常的直觉,那么你有了这样的一个描述之后啊。

实际上我们呢就可以基于它做更多的变化,比如说小明说诶我觉得不过瘾,我要做一个叫查打一体的无人机,我不仅可以巡逻,我还可以看到目标,我可以攻击,那这个时候他就会非常简单了,就说那好。

那我再给这个无人机增加一个行为,比如说叫做这个attack攻击对吧,那么的话呢那这个时候我既然攻击的话,我的子弹是不是不是无限的,所以呢我还再加一个它的属性叫做这个armor,它的弹药量是多少。

那你看只要再添加两行,我好像一个更多的行为就构建出来啦,同学们如果会写代码的话,特别是大家对有一定的语言基础,这种时候肯定就跟小明一样,很快意识到,那这样我就用对象的派生和继承的关系。

我定义一个类叫做无人机这个类,然后呢我再派生一个类叫做查打一体无人机,就是那个COMBRHI,然后这个时候诶我多加一个变量,多加一个行为,这个无人机它就有有了这个攻击和察,打一体的能力,其实这个最早期。

这就是一个标准的一个,面向对象的一个思维方式,这个方式呢其实非常的直觉,和我们对世界的认知,其实最早期的引擎的时候,我们真的就是按这样一个面向对象的逻辑,去构建这个世界。

但是呢这个方法它虽然非常的简单易懂,但是它有一个缺陷,就是随着我们的游戏世界啊越做越复杂,我们就会发现哎,这些东西它并没有那么清晰的父子关系,我们经常看到很多混血儿对吧,就像我们知道。

比如说我们看到一辆坦克,那么我们看到一辆船,但是呢如果我把坦克和船合到一起,我们会得到什么东西叫水陆两栖坦克,而坦克本身呢是派生似于车辆,船呢本身是比如说一艘一艘巡逻艇是派狮子船。

那你这个水陆两栖坦克到底他的爷爷是坦克,是车辆呢还是船呢,这个是一个非常经典的,这个就是面向对象的一个问题,这个呢不仅在我们的游戏引擎的架构上,其实在就现代编程语言中,我们也会发现这样的问题。

那这个问题的话怎么解,其实那个有一个很经典的解法,也是现在引擎最常用的方法叫做组件化,就是我们把对象拆分成他的行为,拆分成无数的组件,就像这辆玩具的这个挖土机一样的,你看起来是个挖土机。

但是我把他的那个铲子换成各种各样的部件,比如说可以把它变成一个小推推那个压路机,也可以把它变成一个小的推土机,也可以变成一个小的举重机对吧,这就是一个组件,可以把同一个模基础,变成各种各样的模块的东西。

那么我相信大家的话呢,在现代游戏中最喜欢玩的东西是什么,叫做啊自定义,对不对,比如说我们玩一个现代射击游戏,我们会把枪各种组件模块定义来定义去,我加上一个那个三倍狙,我就是一个就是一个就是一个狙击枪了。

对不对,三倍镜我就是个狙击枪对吧,我加上个消音器,就是我一个微冲了,所以呢其实现代的武器,包括游戏设计里面,我们也有大量的这种组件化的思想,而这个思想呢其实在十几年前甚至更早一点。

在现代游戏引擎设计中的话呢,我们会用这个思想来重新描述和定义这个世界,那在这里面的话呢,就是回到刚才,我们那个小明的无人机的案例的话,我们重新理解这个无人机的行为,我们会发现嗯它在空间上的位移。

Transform,我们是不是给他一个组件,就表示它在空间的各个位置占用关系,然后它的外形我给他做一个组件叫model,这样的话我能够把它的外形表达出来,然后呢我还有一个组件叫motto。

motto是什么呢,就告诉我说这个无人机的各种运动属性,比如说它的最快爬升速度啊,它的加速度啊对吧,这些它的这个整个的移动的惯性啊,那还有一个组件是说叫health,告诉我说这个无人机还有多少血。

包括他的API行为,它的物理行为,它的动画行为都变成一个一个一个的小组件,然后呢当我把这小组件模块拼到一起的时候,诶我就有一个我自己的无人机出来啦,其实如果动手能力很强的小伙伴。

你们现在买现在的很多玩具啊,你会发现它都不是包装好的,都是提供了各种选项,你自己可以去选配,对不对,这是在真实的物理世界,但其实呢在游戏世界里面,我们很早就按这个逻辑去构建。

游戏的整个一个基础的物体逻辑,那这个时候啊大家好,会写代码的小伙伴就明白了,就是这个时候就非常简单,我们呢如果假设用C语言为例的话,大家只要定义一个叫component base,一个鸡肋。

他同意好这个每一个组件的基础行为接口,这里面大家注意到一个细节没有,我们有个函数叫tick,待会我会讲,为什么每个组件都要拍摄一个tick这个函数,然后呢我们的各位移呀模型啊,他的这个动画这些类。

全部派生自这个component pace,那这样的话我们就可以在一个机构里面,管理一组各种各样的component的小组件,在一起就可以协同工作了,那这样的话如果按照这个思想的话。

那小明的这个挑战就会变得非常的简单,对不对,那我的这个transform,我的model,我的animation,Model physics,这些东西无论是你是只能飞飞的这个侦察飞机。

还是这个我能攻击的超大一体机都是一样的,但是呢因为我可以攻击了,所以我的API可能要换一个模块对吧,ATTACKBOAI的模块,那么呢我本身呢还加一个战斗系统,就是能够帮助我瞄准啊,索敌呀。

那这两个组件一换诶,我一架无人机就变成了另外一架无人机,所以非常的简单,对不对,很直觉符合大家的想法,其实这就是现在游戏引擎架构的一个核心理念,就是我们要尽可能符合大家的直觉,为什么呢。

因为现代游戏引擎啊,它的整个基础结构,第一个要让我们的开发者好维护好理解,同时呢,我们要交给大量的艺术家和设计师去使用,我们要把这个世界的组织啊,各种交互符合他对天然和直觉的理解。

因为我在第一节课就跟大家讲究,隐形游戏引擎的架构本质是什么呢,它不是一个就是我们技术啊,炫耀我们技术多厉害的一种技术炫耀体,它是什么呢,它是一个生产力工具,就是大家很方便很容易去理解。

才是我们这个引擎设计的一个底层的需求,而这件事情的话呢,其实是呃我们引擎的行业的一个,基本的一个方法,就是大家如果有玩过,比如像unity area这些商业引擎,你会发现这里面的话呢。

他们都会去提供这个叫component的概念,如果大家打开应用例题,点开任何一个物体,你会发现下面出现一小串,一小串的它的各个组件,而且这个组件你可以增加,可以自己去定义,甚至可以给它写脚本。

那么在ARMA里面其实也是类似的东西,那么在这里面有个细节啊,就是大家看到就是在如果大家看他们的代码,特别是像aria,你可以看到源代码,你会发现诶他所有的东西就派生自一个you object。

那这个呢我这里要跟大家同学们讲一下,就是这个u object呢它不是我们讲的GO,它更像是那个就是我们像高级语言,或者是那个里面讲的,比如像c#里面的object,就是他要确定任何对象的生命周期的管理。

比如说你创建啊那个内存释放啊,就是我们讲的GC啊,需要的一个一个句柄,就是我上次讲过那个handle,那么包括unity里面那个object也是这个概念,所以这跟我们的机油不一样,举个例子。

比如说像在aria里面的话,更像我们机构的概念,可能是actor拍摄的这些这一系列的东西,那么其实在现代引擎里面的话呢,component组件的这个这个就是说呃,他的这个能力是非常综合的,举个例子。

比如说我们在游戏里看到各种各样的光源,比如说无论是点光源啊,还是面光源啊,还是这个方向光啊,在ARMA里面它也会被定义成一个组件对吧,在unity里面的话,各种行为。

我们比如说我们的动画这个物体模型都是组件,所以我们用组件作为积木,去构建出了整个这个现代游戏引擎的,这个技术结构,基本上听到这一趴的话,很多小伙伴我觉得如果开发能力比较强的话,已经收已经痒痒了。

很想去写这样的代码,其实我在一开始学这些系数的时候,我也是这样的,就是我听了听了我就很想去写,自己去实践它,那么所以呢课程讲的这一趴的话呢,我觉得同学们只需要记住两件事就可以了。

第一个呢就是说在游戏世界里面,我们把几乎所有的东西全部抽象成了,一个叫做game object机油这样一个东西,然后每个机油我们用各种各样周功能的组件,把它组合起来。

所以component又是GO的原子,那这两件事情基本明白了,你就明白了现代游戏的组合的一个基础逻辑,好,那有了这个东西之后,我们就小明就很自信了,他觉得我就可以,我可以去构建这样的一个游戏世界了。

但是你真的想构建一个这样可以打起来可以,这个就是说真正可以玩耍的东西,好像还少了点什么,大家觉得少了什么呢,这个世界是静止的对吧,我怎么能让这个世界真的动起来,这个世界因为这我我的坦克要能开得起来。

我的飞机要能飞得起来,那这里面的话呢其实也不是特别的难,为什么,我记得在上节课里面我讲过,就是如果听完我们第二节课,就知道,在游戏引擎里面最核心的一个函数叫做tick,就是我们每隔1/30秒。

让这个世界往前走一步,就如同我们的真实世界里面,一个普朗克时间一样,那个上帝,如果我们是生活在一个simulation里面的话,我我我会认为每个普朗克时间,就是上帝给我们设置的tick。

那么在我们的游戏引擎里面有一个tick,那这个tick,怎么像我们的游戏世界里的这些对象传导呢,其实非常的简单,就是我把一个每一个机,你的每一个component依次去TK1遍,比如说我的一个坦克对吧。

或者一架飞机,那我首先TK一下我的MOTO,直到我现在往前走了111小步,如果我现在知道我的速度是10米,每秒1/30秒0。03,那我知道我现在要往前移动30cm,这个时候我的动画告诉我说。

诶我要去卷一下我的履带对吧,那这个时候我的那个那个那个主跑好像转一下,这个时候呢我的战斗系统能告诉我要开一下火,所以在在这30分钟一秒里面的话,我把我的这个坦克的机油里面。

每个component一次就哒哒哒TK一下,那如果我们把整个游戏世界里面,所有的物体都tick1遍,我们的这个世界是不是就动起来了,所以tick其实非常简单,所以刚才我们在讲这个component的。

鸡肋的定义的时候,就大家如果自己动手,无论你写的是java c#还是CC加加,那你在写component积累的时候,一定要加一个tick函数对吧,但是真实的这个游戏引擎比这更复杂。

那你们还有什么pretty postc,我们以后带着同学们在深度的理解,但现在呢大家只要只需要知道,我们有个tick函数就可以了,我们去TIK它,但是呢这个非常符合我们的直觉,对不对,非常的直觉。

但是在现在游戏引擎中呢,我们一般不是按照每个对象进行替开的,我们会把一个个系统进行TK,比如说我们先把这个MOTO系统全部替开一遍,所有的物体往前走的,往后走的,往上飞的全部印下来。

接下来呢我们会替你的control control是什么呢,就是你的物理碰撞检测的东西对吧,还包括我还检测一些位移的阻挡这些东西,然后呢我在动画做你的动画,我在做你的东西,这东西听上去好像有点反直觉。

就好像是说诶我一个人,你为什么一会儿让所有人先动你的头,让所有人在动你的手,所有人在动你的脚,不是每个人把自己的头,手脚自己动掉就可以了对吧,感觉有点反直觉,那为什么会这样呢。

其实有一个最简单的一个类比是什么呢,就是大家想象一下,我们假设做汉堡包,那么我们假设一个汉堡店有五个工人,大家最直觉的做法是什么,OK那每个人对吧,你先去烤面包,然后烤牛肉,然后呢洗蔬菜。

然后呢放上你的butter,然后放在一起哇,一个香甜可口的汉堡就做出来了,但这样的生产效率高不高,显然是不高的对吧,大家知道我们现在这个工业最核心的概念,叫什么,叫pipeline,叫流水线。

那最高效的做法是什么呢,就是有人专门去烤面包,有人专门去烤牛肉,有人专门去洗菜对吧,大家配合好,然后呢到了十天啪一起合成一个汉堡,这样的效率是最高的,而这个这个原因呢在计算机上面的话呢。

还有一个很大的一个好处是什么呢,就是我们所有的component的数据,我们都会把它尽可能地集中在一起,这样我一次处理的时候,整个就是一次批处理,大家还记得我的上节课跟大家讲的,那个图灵机的那个故事吗。

就是那个无限长的那个纸袋,我说过,就是在图灵机上效率最高的处理方式是什么,我们要把同样的数据尽可能放到一起,然后呢我们一次一次一次把它处理完对吧,然后呢无论读写都在一起做,而这样的架构呢。

它的读写和处理效率是最高的,那但是呢这个就是其实我们在我们的高级课程,会讲到那个ECS啊,这个TOTS这样的架构的时候,我们会深入讲,那这节课呢我只是简单的点到,就是让同学们知道就是这样的一个架构。

接下来一个tick系统的话呢,就是你直觉得project的tick和反直觉的,每个component的类型的tick,其实在游戏引擎架构中都是有的,但是现代游戏引擎的为了追求效率,逐渐逐渐的会转向。

就是按照那个每个system,或者是每一个每一种component的进行tick,所以我想这个东西应该也不是很难,同学们如果真的不理解,就记住一句话,就是我要造个流水线,这样流水线的话我可以批处理。

所以我的效率高,就这样就可以了,非常的简单好,所以那我有了这样的一个东西的话,那小明其实不是可以,构建了一个动起来的世界了,我的坦克也能开了,我的飞机也能飞了,但是这个世界呢还缺了点什么什么呢。

这个世界是没有交互的,也就是说我坦克自顾自的表演,我飞机自顾自的表演,但是坦克和飞机和人之间没有任何关系,我现在举个具体的例子,什么叫gay gay,比如说我现在跳上了这辆坦克。

然后呢我朝敌远处的敌人开了一炮,那好我要把远处的敌人击倒,这个是我的目标,但是诶好像每个GO之间都是自己的tick,我是开一炮,我怎么样的,让那个机油知道自己被我打伤了或者干掉了呢。

这里面其实就需要基欧之间,彼此是要能够告知彼此,那这件事情的话呢,其实最简单的想法是这样的,就是来我们坦克开了一炮,这个时候这里面讲一个小小的细节啊,就是说当我一个机油开炮这个行为发生的时候。

我这个component可以再去SPA,就可以再生成一个新的机油,那个机油什么叫炮弹,哎,我们有一个炮弹叫GO那个炮弹,那个机油出来啦,炮弹那个机油呢它就自己有一个输出的,对不对。

他就每每个TIK就往前跑跑跑跑跑跑,他突然在某一个TIK的时候,他发现自己上一个T的位置和即将要跑的位置,这条线好好像和比如说地面有一个交点,什么意思,说明哎呀我要炸了对吧,炮台说我要炸了。

这个时候炮弹说不行啊,我我我光炸弹没有用啊,我得我得炸死旁边的这个,这是我的敌人,对不对,好他就开始就寻找了,说哎我旁边有一个人,我旁边有一个有一个直升飞机,我旁边有个坦克,还有一块石头。

那我这样我在我要爆炸的这个逻辑里写道说,我查询一下我周边的这些对象,如果他是人,我掉的人,我要我要见你的血,如果是飞机,我要见你的血,如果是坦克,我要减你血,如果是石头,石头表示说我完全没有影响对吧。

但是如果是这样去写的话呢,这个逻辑呢我们叫做hot cold,其实这个东西大家不要笑,最早期的游戏引擎有的时候真的是这么写的,就是大家好多同学会写hot cold,这样就写。

但是随着这个游戏世界变得越来越复杂的时候,大家会发现这个hot code它其实是不work的对吧,那怎么办,那这里面我们就有一个更优雅的解决方法,我们这也是现代游戏引擎最重要的一个机制。

叫做event机制或者叫事件机制,我们不要那么粗暴的,就直接敲人家的门对吧,跟人家说,你被我打了一下,这样太粗暴了,而且我还需要知道我所有的邻居家,我要认识所有的人,这很麻烦,那我怎么办呢。

我给大家写写邮件,你们每个人呢在家门口都放个邮箱,我不需要认识你,我只需要知道方圆,比如说20米之内所有的邻居,我给你们每一家寄一个邮箱,现在我这封邮件肯定不好了,叫我们英文叫做blackmail对吧。

就是告诉你不好意思,我打了你,扣了你100点血好,我把这个游戏邮件放在这儿,这样你明天早上起来的时候,也就是下个tick的时候,你突然一看,哎呀,原来我这个这个这个被人家扣了100点血。

如果我这个是一个health component的话,假设我这个GO是一个小兵的话,我查查自己说嗯我身上只有70点血,你居然扣了我100点血,那好吧,我只能死给你看了,那这个小明就只能倒在地上死掉了。

所以其实你看本来是一个非常复杂的,这个一个框,就一个问题,通过一个简单的事件机制就会变得非常的清晰,而且明确这个呢在系统架构中我们叫做解耦合,就相当于把各个机构机构之间的通讯,本来我们需要知道。

所有可能其他的那个跟object对象类型影响,包括每个机油里面的component的类型,这个太复杂了,我们统一的变成了一个叫event的机制,你只要发出一个event给对应的那个CEO。

让他来处理就可以了,这样的话,各位机油和component之间的逻辑的话呢,它就是上就结耦合了,这样的话是不是变得就非常的干净对吧,那这个时候的话呢,其实在现代游戏引擎里面。

比如说我们讲unity unreal的话呢,这也是大家非常常用的一个机制,基本上所有的商业级引擎,我们都要做这样的机制,举个例子,比如说像unity里面,就是你可以简单的三的一个注册一个message。

注册一个event,然后呢三的event这里面它是用一个字符串说诶,damage event好,大家就知道了,然后那个那个物体的health component,他如果收到了这个这个。

这个这个这个这个一般的之后,他有一个回调函数被激活,然后它就会调调自己的血,这一切的话用字符串match就可以了,因为ARREAL呢是比较复杂,其实我个人觉得ARRA架构做的太复杂了。

其实它是用C加native code去做的,所以你需要一套比较复杂的,这个就是说呃反射机制,就是把C加加里面,你要注册这样的一个event,说诶当这个event发生的时候。

这个每个component哪个函数被毁掉,但其实它的基本道理都是大同小异的,那为什么unreal会做的这么复杂呢,因为当你注册这个一个event的时候,如果同学们有现代引擎使用经验。

比如说像ROO的经验的话呢,你们会发现就是有个蓝图,对不对,你注册了这个东西之后,那个蓝图就会增加了这样的一种消息类型,然后呢在你在一个比如说你做了一个炸弹的,他的行为的机油的时候。

你说诶我撞到地面的时候,我蓝图你们就会说,我要给大家发出这样的一个消息,这个一般的出去,那么另外一个比如说在你做的另外一个东西,他比如health component里面,它就会蓝图里面就会收到。

它又可以加一条选项,说如果我收到了damage这个消息的时候,我会怎么去处理,它的本质上就是说能够让这个整个接口,这些消息我们可以不断地扩张去定义,其实大家做游戏引擎啊。

最核心的就是要做一个可扩展的消息系统,让我们的游戏开发者可以在我们的引擎之上,可以不断的定制,跟自己玩法相关的各种各样的消息类型,然后呢,他们可以定制各种各样自己想要的component,去对这些消息。

对这些事件进行自己想要的逻辑的处理,这就是现在有游戏引擎的话呢,最核心的一个工作,所以讲到这一趴的话呢,基本上大家就知道怎么去做游戏了,但是呢先不要急,这里面还缺一个东西,就是在我们的游戏世界里面。

有那么多的机油对吧,在一个比如说单机游戏里面啊,就是大家比较喜欢的一个单机游戏里面,一般是几百个这个洞的机油吧,但是在有很多游戏里面可能到几千甚至上万个,那每个机油的话,这个就是那我发生的每一件事情。

我怎么去通知到这些机油,那回到我们刚才这个例子里面,所以那在小明想做的这款战争游戏,我有这么多的,比如说NPC的大兵,我还有飞机,坦克大炮这些东西,那我怎么去管理它,这个时候就有一个管理的概念了。

这里面就讲两个比较基本的概念,就是第一在我们的游戏实践中啊,我们每个机油一般都会给他一个唯一的编号,我们就也叫一个UID,就是unique id,其实刚才我上次上节课,讲到那个资源管理的时候。

也会讲的就是它有一个GUID对吧,当我们全球进行唯一的标识,这个对这个就是现在游戏引擎非常重要,因为我们很多时候去标识定位这个物体的时候,就像你们家的门牌号一样的,我需要给你一个门牌号,另外一个的话呢。

每个物体它在空间上基本上都是有各位置的,我们需要知道你的position,那好了,你们每个人都有唯一的标识了,然后呢不是不再是NPC12345了,而是说哎307405对吧,然后呢你们的位置有个经纬度。

那这个时候我们就可以进行场景的管理,那最简单的管理是什么,最简单的管理是不管理,假设小明很粗暴说,反正我没有几个人,没几个兵的好,每一个阿莫的就是那个炮弹的那个component,里面。

当我发生爆炸的时候,很简单,我把场景里所有的机油全部发一遍消息,或者说呢我做的稍微优雅一点,把场景里每一个机的位置查询一下,然后判断它的位置是小于我的爆炸半径对吧,一个一个爆炸半径好。

我就告诉你说我对你有伤害的输出,这样写行不行,其实这样写也是可以的,如果大家做一些小游戏的话,没有问题,这样完全能跑得动,但是呢当我们场景中有,比如说几千到上万个机油的时候,这就会是一场灾难,为什么呢。

因为这就是我们今天要讲的就是游戏,引擎的挑战,叫做N平方的挑战,什么意思,就是说我每一个物体都会可能,和其他的物体发生发生互动,如果每一次,我要和另外的所有的物体去问一遍呢。

那就是N乘以N减一约等于N平方嘛,那么只要是N平方,比如说有1万个物体的话,N平方是多少,是一个亿,对不对,那这样会对计算机造成巨大的负担,尤其你的这些数据,如果分散在内存的各个地方的话。

这个效率是非常低的,那么这个时候最简单的方法就来啦,比如说我们对世界画格子对吧,分而治之,Divide and conquer,这是大家最直觉的做法,其实画格子大家不要嘲笑他。

我们把这个世界化成均匀的格子,然后呢就相当于你有一个门牌号,然后这个时候我就可以找我临近的格子,这个方法虽然听上去很简单,但其实在很多场景里面是使用的,比如说我的这个场景并不是特别大。

那我就可以这样简单的画格子,那么它唯一会出问题的是什么呢,就是当这个场景物分布的不够均匀的时候,那么现在游戏中,我们的这个就是长期五分布的均匀,到底是均匀还是不均匀的,实际上呢是很不均匀的。

我在以大家特别喜欢的这个,比如说3A大作主机游戏为例啊,在主机游戏中呢,其实你看的是一个很广阔的世界,对不对,但实际上你会发现作为一个玩家,我们能走的地方是非常受限制的,以前我们在国外做游戏研发的时候。

我们这个叫做touch touch的意思是什么呢,就是那个那个打仗的时候挖的那个战壕,就是我们设计师会认为,就是我们给玩家挖了很多条RENCH,玩家只能在我们的这个账号里面走来走去,所以沿着站好。

我们的东西会放得非常的详细和密集,当然账号之外是非常稀疏的,那这个时候如果你把这么大的世界,均匀的打格子的时候,同学们会发现是不是又慢又非常浪费,那这个时候呢,其实就有一个非常简单的算法来啦。

就是说哎我们能不能够用一个层级结构,也就是一个hierarchy的架构去管理整个场景,刚才有聪明的同学告诉我,已经讲到八叉树了,说明很多同学是非常的厉害,已经做了预习,那么其实他的思想其实非常的简单。

就是说就像我们的地图一样,整个世界很大,但是呢我们把世界分成国家,国家分成行省,行省分成城市,城市分成街区区,再分成街道,那这个时候假设有一颗有一个事件发生的时候。

比如说我知道这是北京海淀区的某一条大街,发生的事情,那我很简单,我只需要在北京海淀区那个小区域里面去找,是不是就可以了,但实际上的话呢,这样的一个hierarchy的管理方法。

就是一个非常有效的场景管理方法,那么它几乎就回到,我们刚才小明这个案例里面的话,我们可以根据这个地图上的这个,这些机油的分布,我们不断的比如说以空间的四差进行划分,对不对,如果这个地方人数假如是足够少。

只有一个两个了,那我就不再划分了,如果人数很多,我就不停的划分,这样我就形成了这样的一个树状结构,大家同学们如果学过那个数据结构的话,就知道这是个典型的四叉树对吧,那么当我任何一个事件发生的时候。

其实我知道我是在师大树的哪个节点,当我去寻找我的周边的时候,我只需要上上或者向下去寻找,或者找我的这个sibling,就是那个我的这个叫什么呢,叫兄弟节点对吧,或者我的parent节点。

或者是我的那个那个那个那个sun节点,往下去找就可以了,这个呢是一个数据结构的课程,同学们不用钻的太深,其实非常的简单,因为实际上在游戏中的场景管理啊,随着现代游戏的发展啊,这个是一个最简单的策略。

但实际上呢有很多的流派,比如说啊最简单的二叉树的流派,我们把世界按一刀一刀的把它分掉,那这个二叉树的画分呢,有的时候我们会做的更精致一点,比如说沿着墙去分,那么还有呢最经典的比如说八叉树对吧。

刚才有同学已经提到了OCG,那orchestra的话呢也是一个非常经典的,对空间不断细分的一个方法,那么现在游戏引擎呢比较流行的是BVH,就是说我们用这个就是bounding box。

就是每一个物体有一个小BINBOX,我们从小往大慢慢喝,慢慢喝慢慢合,当我去发生一个事情,或者说我作为一个一些比如说像一些计算,比如说最常见的是什么呢,这就已经跳课了,比如说世界追的裁剪。

那我们就要用BBS快速的把很多东西全部扔掉,那么当我们去打出一条子弹,一个弹道的时候,其实我们也需要用这样的一个技术,去帮我们去快速定位,所以special的就是空间上的数据管理,是场景管理的核心。

那么在真正的不同的游戏产品中的话呢,我们会采取不同的方法来解决它,比如说啊假设同学们做这个引擎,我们想做一个比如说呃2D的,像SUPERMARIA,就超级玛利亚这样的游戏。

我们英文叫做planet former,这样的一个游戏的话,你可能就不需要这么复杂的场景管理了,但是如果你想做一个像cod啊,像quick这样的游戏的时候,那你一定要花心思去仔细的设计。

你的款场景管理的方法,就是呢能够尽量节约你的计算资源,所以在我们这个案例中的话,小明的话我觉得他用一个就是说那个四叉树啊,或者是一个BFEH啊,基本上能够完成他的需求,所以呢到这一趴。

我们的课程的核心内容,基本上就是给大家讲明白了,就是说其实在游戏中啊,所有的这个物体都是一个object,然后呢,每一个object呢都是用component base的方法去描述它。

那用这个component组合出物体的不同的行为,那么就是说所有的component呢,我们用一个tick的方法,就会不断的去替他各自的逻辑去往前去走,那么在这个就是呃component里面的话呢。

我们所有的机油之间通讯是什么呢,通过了一套复杂的消息机制来彼此进行通讯,那么我们在这么多物体在管理的时候,我们需要一套这个非常高效的,层次结构的场景管理机制,基本上听到这儿。

我觉得如果动手能力比较强的同学,已经可以动手去构建,大家想要的这样的一个游戏引擎了,那实际上的话呢,就是说我们讲这个就是游戏引擎的话呢,真的大家是在商业学期做的时候呢,可能就有些更复杂的情况。

我这里面的话呢,这一页就跟大家讲一些比较高能的东西了,举个例子啊,比如说在这个我们在游戏中,最常见的东西是什么呢,叫物体之间的绑定,那比如说像以我们大家都特别喜欢的深海,这个游戏里面。

大家最喜欢的是什么,是开着车飙车对吧,那你开车的时候你是个机油,那车本身也是个CEO,但你那一刻你就被绑到车上面去了,对不对,那这个时候那个车在动你的,你的位移是被车锁锁定的。

那你们两个之间的话该怎么去在一起联动呢,实际上这个时候我们在机邮局tick的时候,就有一个先后关系的问题,比如说我们一般会要求这个附节点腹肌会先替,可,然后呢我挂在上面的东西在后面T格。

这样的话当我自己被踢开的时候,我会去问诶,我的车在哪里,我的车已经往前移了30cm的好吧,那我也往前移30cm吧,我在做相应的动作,但是呢这样的一个T课程序,当我就是说有更多的东西举个例子。

比如说我们假设刚才讲的那个一个,一个component去听歌的时候呢,会变得相对复杂,但这件事情为什么这么重要呢,这个顺序这么重要,就是因为其实现在游戏中啊,当我们去T1个component的时候呢。

我们很多时候是要分散到很多,很多的CPU上去执行的,就是他很多的T恤是并行执行的,而并行执行的时序是非常重要的,那这件事情的话呢,其实就引入了我们另外一个难题,就是我们刚才讲。

就是说其实我们机构之间的通讯,是不是通过一个叫event event,就相当于我给你写信,就是我冲到你家门口,把游戏邮件塞到你们家门口的邮箱,对不对,但是这件事情它是有一个逻辑上的悖论的。

这个悖论是什么呢,举个例子啊,就比如说大家在大学,有没有跟女朋友分手的经历啊,比如说当你去兴冲冲的写了一封封分手信,打算投送到你女朋友的寝室的时候,你突然发现你的女朋友也穿着衣服从寝室出来。

手上拿着另外一封信,你那时候是不是马上要怀疑是是不是她的,同时给我也在写一封分手信,那到底是你耍赖你女朋友,还是你女朋友耍赖你呢,这件事你就讲不清楚了,对不对,我相信同学们在日常生活中。

都会遇到这样的一个公案对吧,那这个时候其实在游戏世界里面,如果我们让GO直接彼此之间可以写信的话,它会产生很多我们叫做逻辑上的ambiguity,就逻辑上的混乱性,这个混乱性呢在很多时候你会注意不到。

但实际上的话呢,对游戏的他的这个影响是非常大的,因为在游戏中啊,我们希望当用户是一模一样的输出的时候,我希望游戏世界里发生的行为他是确定的,一致的,不会变的,我们叫做deterministic。

就是它的确定性,那举个例子吧,比如说同学们很喜欢玩各种对战游戏,对不对,当你打完了对战游戏之后,你最喜欢看的东西是什么,是精彩回放,而精彩回放本身呢,就是一个引擎提供的一种核心的能力。

那一般的精彩回放是怎么做的呢,它并不是这个把刚才的你的游戏过程,整个状态全部都录了,像那时候那个录像的文件就会非常非常大,他是存不下来的,他怎么办,他只录了每一个小伙伴的输入。

然后呢他把这个游戏重新又跑了一遍,但是呢重新跑了一遍之后,他和你刚才打的时候效果是一模一样的,那这个时候,如果大家所有的物体都是依次执行的话,那没有关系,一样的输入我一定跑出一样的结果。

反正假设这个顺序是你负责先去送信,接下来才是你的女朋友的话,那你一定是你女朋友先于你收到这封信,对不对,所以你永远确保说嗯是我先甩了他,但是如果这个时候你们是并行的,就是分散到不同和尚。

就是我们叫做多线程的运行的时候,它的结果就会完全不一样,大家能理解这里面的这个复杂度吗,那这个时候呢,我们就要引入一个很关键的第三方了,怎么办,我们要引入一个叫邮局,你们所有人都不许给彼此去直接写。

投递这个信了,你们要比如说你要给你女朋友写信,你先把信寄到邮局去,然后邮局在统一时间把信发到每一个人,每个人都是统一的,第二天能收到你的心性,然后呢你第二天收到这个信之后,诶,我再去决定下一步的工作。

比如说你女朋友看到你的这份分手信很生气,打算写一封信来骂你的时候,他也是只能当天晚上写完,然后再寄到邮局,第二天早上你才能收到,这样的话,我们能能就能确保它的时序是严格一致的。

所以这个就是真实的在游戏引擎中,这个消息的传递啊,比大家想象的要复杂得多,所以刚才我讲的就像tick对吧,其实它是最简单的一个体格,但实际上的话呢在所有的component实现中。

会有一个叫predict和POSTC这两个函数,它就是为了解决各种各样的实质性的问题,这种持续性的问题的话呢,在我们基于component base的这个,游戏世界构建的时候,实际上非常的重要。

再举一个例子啊,就比如说呃我们这些component呢,大家其实是有一个依赖关系的,比如说刚才我提到诶,我要先动一下,比如说我现在MOTO告诉我说,你现在的移动速度是5米每秒。

这个时候呢你的状态就从走路变成了跑步,对不对,那这个时候接下来我tick我的animation emission,说好的,我懂了,那我把我的动画从走路动画变成跑酷动画。

但是其实呢那个animation呢它又会触发什么呢,触发我的物理,对不对,当我腿动了之后,我的这个物理的碰撞体是不是就伸出去了一下,对不对,伸出了一下之后诶,我说不定我的脚迈出这一下。

我会撞到某一个东西对吧,或者是我的一些东西发生了变化,那么这里面当然今天我不讲了,过于复杂了,但是这些系统当我的状态发生变化的时候,它是不会反过来又会影响到我的位置,所以在我们真实的游戏引擎开发的时候。

会经常遇到这种,就是说诶,他们彼此之间好像有那么一点点循环依赖,所以大家看到很多游戏他如果写的不够,那引擎写的不够好的时候,经常会发现有一个行为,他有大概一周到两人的lg就是说延迟,而这种lag的话呢。

很多时候就是因为时序问题导致了,所以今天为什么我会花这么大的一页,跟大家讲这件事情呢,就是说其实当大家理解了什么叫做component,什么叫做tick,什么叫消息机制的时候。

其实每一个组件他去替他去发消息,他的对象是在哪一帧,就是他之当前帧还是在下一帧才收到消息,收到消息之后是当场做动作,还是在等着做动作,其实对游戏的那个核心逻辑,影响是非常非常大的。

那这个的话呢就是说我希望同学们,当大家兴冲冲的开始在做自己的引擎的时候,这一点一定要注意,就这个是游戏引擎最精妙的一个东西,这个就是那个我们这节课的主体内容,那这里面的话呢就是说我顺便再说一下。

我们的小引擎,首先跟大家道个歉啊,我们那个本来上周要上线的小引擎,这个pilot的引擎被我们推迟了,那那原因呢,其实是确实是工作量比我们想象的大的多,我们课程组真的是他那些同学们非常的辛苦。

然后我们最主要主要的原因就是,为什么要把这个相应情,就是这次作为一个大的改版呢,就是我我们上周在做code review的时候,因为我们本来是我们课程组分了两波同学。

一波同学是专门负责写这个pilot的小引擎,给大家,另外一个同学准备课件,但是后来我们上周的code review发现,就是课程上讲的这些命名啊,这些写法结构和小引擎的实现有很大的差别。

因为最大的差别就是我们当时想做e cs给大家,但是一旦上了ECS之后呢,这个小引擎的结构就会变得非常的复杂,所以我们后来经过整夜的讨论吧,到半夜我们做了一个很痛苦的决定,我们说那不行。

我们得把相应请重新写,要按照课程的逻辑去写,为什么呢,因为否则很多基础就是没有太多基础的同学,跟不上,那也有很多同学问我了,说哎那这个小引擎的话,我们也想看ECS啊对吧。

那有会不会有e cs这样的东西呢,首先的话呢就是在我们的课程的高级那一趴,会跟大家去讲ECS这套体系,那同时的话呢,就是说如果同学们会对这个东西感兴趣的,因为我们这个104课程呢是一个基础课程。

面向很多可能基础不是那么强的同学,那我们后面的话呢随着时间的这个充裕的话,我们可能会准备一些专题,也会邀请同学们跟我们一起,我们深度的探讨就是基于ECS啊,基于这个面向数据编程啊,怎么样做更高的效率。

当然我们也争取能够哎再搞一个版本,但这件事情我现在还不敢保证,因为我现在知道我们的团队他工作量非常大,但是好消息其实呢,就是我们争取在下周的release的时候,直接把动画系统和物理系统都放出来。

所以大家看到这是我们相信现在的最新的效果,就是你们的角色是有简单的动画,和它的物理的碰撞,那为什么把它跟我们打算一起放出来呢,因为我们会发现就是说如果没有这些模块的话,大家看到的只是一个编辑器。

而不是一个真的可以互动,可以playable的这样的一个游戏,所以呢有这个东西之后,同学们就可以基于它自由地放飞,构建各种各样你想要的东西,所以我们希望给大家创造一个相对好的基础,然后另外一个的话呢。

就是那个就是我们的课程组一时兴起,还给我们小引擎设计了一个小小的图标,大家如果住的那个注意,注意到屏幕下面有一个小三角,那个像一个像一个小旗帜,像个小风帆的东西,就是我们的PIO引擎的图标。

我们也希望就是这个小引擎的话,能够成为大家进入快乐的游戏引擎,航这个世界的这个嗯一个领路人嘛,这也是我们这个课程的一个一个,一个很humble的就是一个目标,我们很希望能达到这个目标,所以这里面的话呢。

就是我要特别特别的感谢一下我们的课程团队,他们真的非常的辛苦,我们今天这个课件的话整整改了38版,这个是到今天晚上,我看来我们版本号已经升到了38,因为确实就是没有一个就是游戏引擎的这样的。

一个一个就是现代游戏引擎这样的一个课程,然后呢每一节课怎么讲讲什么,怎么把一个比较晦涩的引擎设计的pattern模式,变成一个大家很容易懂得这样的一个案例,其实我们花了非常多的心血啊。

其实爆肝做了很多东西,所以的话呢我是特别想,就是那个感谢一下我们的课程组的同学,然后呢,所以呢因为这也是我们第一次做这样的课程嘛,我们也很担心我们的课程讲不好,所以呢我们想做一个小小的调研调研问卷。

就希望小伙伴们你们去扫一下这个二维码,然后告诉我们说诶你现在是在哪上学,就是你是上大学还是在上研究生,还是你在做什么工作,然后告诉我们课程哪个地方讲的不好,一定要讲的不好,包括哪些地方讲的。

如果大家听不懂,也可以直接问我们,我们去给大家教,就是我们后面会调整我们的难度,或者大家觉得我们讲的太简单了,我们可以加入一些更深度的内容,所以的话呢就是也希望同学们和我们一起,打造一个精品的这个课程。

我们也很希望就是说这个我们的games,104课程上完之后,我们的每个同学人手一个自研引擎,这也是我们104引擎,大家一起做的一个flag,如何好的,那今天呢我的课程的主体也就到此为止。

那同学们有没有什么问题可以问我,啊对哇,这个同学问的很专业,就有同学问我们说如果一个tick时间过长的话,游戏引擎怎么处理,这个确实是在现代游戏引擎中,很常见的一个挑战,为什么呢。

因为我们会假设说一个游戏,每隔呃就是30ms,我们会tick一次对吧,但是如果有的时候一个引擎,它的计算机就那一个T,可我的计算机过于复杂了,那我算不完怎么办,那机器只能算完,算完之后。

那等我下次来的时候,可能已经过了40ms,已经过了这个60ms,但这里面处理方法有好几种,比如说一种最简单的处理方法是,我每个tick的时候呢,我会把那个部长传进去,这样的话比如像我的位移啊。

现在这些东西我会把它补偿起来,这样人不太会注意得到,那么还有一种方法呢是我直接跳过一个tick,我就直接TK两针两针,但这个东西的话呢是比较比较危险的,那么实际实际上呢这个T和过程过长的话。

一般来讲我们都会去优化,整个引擎和游戏的设计,举个例子吧,比如说当我们一个游戏,比如说发生了一个一个爆炸,突然一下子产生了很多物体的受击的这个事件,那这个时候一下子系统就处理不过来了。

那这个时候呢我们有一种方法叫做differ的,这个processing,什么意思,就是说我们并不需要把这一件事情全部,比如说这几十个上百个物体都放在这一帧处理,我们会把它分成几批,一批处理20个。

一批处理20个,差个五帧处理完,因为五帧的话呢,在人的视觉中的话,还就是0。6秒到呃,呃呃0。2秒到0。2秒左右,所以有的时候大家还是能接受的了,所以这里面确实有很多的策略来解决这个问题。

这个这个问题问得非常的专业,好的大家好,有什么问题,我看到问题刷得特别快啊,空气侠其实刚才举的不是一个特别好的例子,其实在游戏中啊,我们用的最多的这个看不见的机油呢,比如说像那个trigger。

就是各种,如果大家打开这个一个游戏的编辑器的时候,你会看到很多非常多的这种,这个透明的这种东西,就是你走过去触发一个什么事件,比如说你在做单机游戏的时候,你走到一个地方。

然后呢突然天上一个boss掉下来,开始虐你了,对不对,这个地方一般是个trigger发生的,像这种invisible object非常多的,那空气墙有时候也做机优势做事呢。

比如说啊我们在做单机游戏的时候,我们会有个地方有一面墙,我不能让你跳过去,因为那边我没有做东西对吧,但是呢我一开始有几何又没有做的特别好,那怎么办,我会人为地放一个blocker放在那儿,把你给阻断。

当然还有一些就是比如说我们做这个visibility,做做就是做那个视觉裁剪的时候,我们也会放一些看不见的东西,告诉你说这个你走到这儿的时候,可能我有些呃场景,有些东西我会加载。

否则的话你会看到那边是空的,所以这里面的话直接看不见的东西会非常多,空气墙呢一般也会作为一个机油,但是呢有的时候我们会一个大机油就解决掉了,有的时候也会分成很多很小的机油,所以作为做引擎的人来讲的话。

你就不用管了,你就反正就你随便你怎么定义它的shape,但是呢空气墙我们一般有一个建议,就是说都会用最简单的形体来构建,就是有不会直接导你的mesh,很多时候我们空气墙会用一些简单的面啊,圆柱啊。

或者是一些参数曲面来表达它,哇我发现我的同学们都很专业啊,有个同学就在问我说check的时候,渲染线程和逻辑线程怎么同步啊,这是一个非常非常专业的一个问题,其实呢一般来讲就是我还记得我在上节课讲过。

就是一般来讲两大神兽,tik render和TIK逻辑对吧,所以呢其实logic线程,一般来讲会和逻辑和渲染线程会分成两个线程,当我们一般TIK这个render的时候啊,TIK逻辑的时候是TIK。

各位component的逻辑的部分,那么但是呢tik render的时候呢,他很多时候是做各种数据准备,包括一些render specific的东西,举个例子,比如像例子系统。

它的tick就在render线程里面进行,那么实际上的话,现在呃在在现在的游戏引擎架构的时候,我们都都不只是一个线程做render了,可能是很多个线程在做这些,相应的准备和数据准备。

所以的话一般来讲的话,但是如果从最简单的好去理解这个事情的话呢,我们一般会在tick logic产生的结果,会在tik render是在他后面,所以有的时候会如果引擎做的不好,会出现什么情况呢。

就是逻辑会先跑一帧,然后你看到的画面又会延迟一帧,然后呢再讲一个更专业的,就比如说你画面准备好了,绘制出来你的FRAMEBUFFER,交换的时候又会延迟一帧,所以如果同学们在研究生在游戏引擎。

你会发现就是我们以前有一个指标,就是当我在游戏手柄上做了一步操作之后,到我眼睛能看见这个延迟有多少,比如说大家很喜欢玩的,比如像XBOXPLAYSTATION的手柄,在最早期的时候。

我们会发现这个可以达到100多毫秒,也就是三针到四针的lag,你才能感应感应到,但是呢我们做了大量的设计,让大家觉得这个东西打击感是很实时的,但这里面就有很多很深的一些trick在里面了。

所以一般回到最原始的这个问题的话,就是啊tick logic会比tick render稍微早一点,而且呢我们一般会把它分成两个不同的线程,好的还有没有什么问题,同学们嗯,啊对其实这个同学问的也很专业。

他说空间竟然划分了我那些动态物体,怎么办呢,其实这是真的是要处理的问题,为什么呢,因为我们不能够对整个场景每一帧都更新一些,但这是最简单的做法了,比如说我每一帧。

我把空间中1000个物体全部再去生成一次,比如说二叉树,八叉树啊,但这个效率就特别低,大家如果以前学过数据结构的话,应该都学过叫树的这个插入和删除节点对吧,比如说有些节点消失了,我的有的有的节点要合并。

如果有些节点插入了之后,我有些节点需要再一次再一次去分裂,包括有些节点发生移动了,我们去看怎么去表达它,所以呢其实刚才提到的几个算法,比如像BVH,比如说像那个啊BYH,就是那个包围盒的那个。

那个就是那个绑定那个vertical,那个就那个volume的HRHI嘛,就是包括像那个BSP啊,像OCTREE啊,他们都会有一个共同的问题,就是如何去更新,一般来讲的话呢。

就这也是我们在做游戏选择的时候,一般会选择那种更新起来比较比较,就是轻量的东西,我举个例子吧,比如说我们假设做一个室内的设计游戏,这个时候我们用那个就是啊二分世界,比如像P那个BSP税tree。

或者p vs这个技术是可以的,因为这个世界基本上是静态的,我人只是人和小怪在里面走来走去,那我把世界进行静态划分,我甚至设置一些窗口啊,能看到彼此就可以了,但是的话呢。

如果假设我想做一个像小明想做的一个,类战地这样的游戏,我是个open world,那你BSP的话呢,它更新起来第一个效果不太好啊,效率也并不会特别高,那这个时候呢其实用更简单的叫BVH会更好。

因为BBH的话呢,它就是一大群物体的bd box,合来合去,它的算法其实你做的最简单的就是一个个的球,球的合并半径变得更大,所以呢,这个时候其实我更新的代价会非常非常低。

那这样如果场景中所有的东西都动的话,那我们会推荐说你用BFEH效率会更高,所以这就是一个就是说如果我们做引擎的话呢,我们会推荐大家要支持两三种以上,比较经典的这种空间划分的算法,交给游戏产品。

根据自己的需求去选择,好的啊啊这个问题我没听清楚,同学再说一遍,哪个模式哦,组件模式有什么缺点是吧啊,这个问题问的很挑战啊,组件模式呃,其实缺点还是很明显的,比如说啊组件模式。

如果用最基础的一个实现的时候,它的效率肯定没有你直接写一个class,效率会高对吧,因为你每一次都要找到那个组件,找到它的接口去访问它,那么但是的话呢组件模式的话呢。

就是这就是为什么我们后面要讲的高级课程,ESS很重要,就是说我们要把同样的组件全放到一起,把数据全放到一起,然后呢用方法快速的去处理这些数据,这样就避免了,就是说我们在切换的时候,它的成本特别的高。

组件模式,第二个缺点是什么呢,就是说其实刚才我们讲的通讯嘛对吧,比如说我一个机油,比如说这个小小明他要发个消息给小美,那他之间的话又有一个event机制,对不对,其实组件之间的话。

其实也要有一套通讯接口机制,而这个机制呢很多时候因为当我一个组件,他并不知道在同一个机构里面还有多少个组件,比如说我现在有一个组件叫做我的API对吧,那么API的话,假设我作为一个游戏里的人工智能的话。

我的行为会发生变化,比如说我的血量很高的时候,我更有攻击性一点,对不对,当我的血量不够高的时候,我这时是不是更倾向于防御一点,那我就要不停的去问说哎我现在的血量多少,但是当我写AI组件的时候。

我并不知道你有没有给我这个机油,挂了这个血量组件,所以我要不停的去query,就是去询问说,我有我有我有这个这个血量组件吗,如果有的话好,那告诉我现在血量是多少,而且你还告诉我绝对血量是多少。

我这样我才能决定我的行为,而这个过这种query的过程的话呢,在一个非常高频的调用里面的话,其实他对效率的影响是非常大的,这也是组件模式本身带来的一个巨大的弊端,但是呢就是世界上的事情就是这样的。

就是你凡事有利都有弊,所以说这就是我们愿意付出的代价,啊有个同学问了一个比较有意思的问题,就事件机制怎么去调试,这个其实是一个蛮难的一个问题,因为其实如果做真实的游戏产品的时候,大家会发现啊一帧的时候。

那真的是很多很多条,这个就是这个事件,所以呢我们一般,比如说像很多引擎里面的做法是什么呢,比如说像unreal的蓝图对吧,你可以逐帧的去看它的走动,你可以看到这个时候一个GO多少个事件出来。

比如像有些游戏里面的话呢,我们会锁定一个GO,然后呢我们会把这个CEO你现在发出去的,你现在收到了所有的消息,我们全部在你的头上顶出来,让你看到这个东西到底是怎么处理的,包括我们去这个。

其实这里面讲一个非常黑科技的东西啊,其实在很多复杂的游戏里面,我们认为最有效的debug机制就是这个log,就是不停的打log,你可以在这个你的log文件里面找到,那一刻发生了什么事。

那么当然当然当然了,就是游戏呢,它是一个就是啊就是艺术家的使用的工具,比如说对大量的这种,比如说啊非技术背景的同学,比如说像我们的设计师啊,很多时候他需要去debug,他的这个组件的行为的时候。

我们还是会做很多可视化的方法,把这些消息,把每一个消息,消息后面带的这些内容,全部显示到3D的这个空间里面去,比如在游戏中有一个debug模式,我能让你看到所有的消息。

这样的话我把这一帧pose注所有同学都看到哦,现在发出了什么消息,现在收到了什么消息,然后他判断说这个消息是不是没发出来,如果消息发出来啦,哎我这个机油,我这component不是没有处理。

那这样的一个可视化的这种debug模式呢,现在的话呢也非常的多,所以的话呢这也是一个比较好的一种,就是第八个模式,但是实话实说,就是他肯定没有直接去掉那个东西很方便,而且的话呢就是真实的游戏里面。

他的消息类型和种类是非常多的,所以这也是现在我们一个就是啊,重点在优化的东西,其实今天我们要讲的就是,其实像刚才讲的,如果所有人能把消息都寄到邮局,邮局都把消息发到所有人,其实大家可能没有注意到。

就是这个消息的发送,接收分发本身如果做得不好,也会成为我们的游戏引擎的效率瓶颈,因为游戏引擎一个我在第一节课讲过,就是它最核心的挑战是什么,就是everything is real time。

所有的东西都是要实时的,所以他要求效率非常的快,这个同学问的问题就比较难了,就是物理和动画互相处理的影响的时候,怎么去处理这个case呢,其实是比较比较复杂的,就是啊我们举一个例子吧,比如说呃。

现在在很多游戏中有这么一个那个表现,就比如说当我一个人被受击的时候,那最早呢我们会把这个人切到一个布娃娃系统,对吧,那整个人就像没有骨头的人一样,这样就被打飞了,虽然看上去很物理真实,但是觉得好假。

那我们的动画师呢就会设计一个动画,就是说诶我们把这个动画去,这个这个有一种很酷炫的一种表现,当然其实基于深度学习的话,会有一些更好的一个结果了,那今天不展开,那这个时候其实它物理和动画。

彼此之间就会有影响,那讲个最简单的方法,比如说现在的很多主流的做法是什么呢,比如说我们是用插值的方法,比如在刚刚收集开始的时候,我先切动画的表现,然后呢越到后来我这个动画的这个位移。

比如说我一打肩膀往后一靠,然后呢我的手一伸长,把这个东西作为我物理的出师输入,然后物理再去模拟,这样到后面越来越多的,我就把它交给物理去模拟了,这样的话当大家看起来的时候。

就会觉得诶这个人倒地的姿势又很英雄主义,很有设计感,但同时又非常的物理的真实,最后他在地上躺在那的时候,那个手和脚的姿势也很随机,很真实,所以这就是一个很典型的。

就是物理和动画和互相影响的这样的一个案例,好的那今天的话课程的话我们先到此这个结束,也今天这门课学完的话呢,就今天这节课程,我觉得同学们基本上就可以尝试去,构建自己的引擎了,当然你要解决渲染的问题。

在渲染的问题的话,相信后面的节课我们会大家讲,就是游戏引擎的渲染的基础课,那我们的课的话呢,不会讲过于详细的渲染的算法,而更多的会告诉大家,就是在游戏的这个引擎里面,怎么去。

怎么去组织这些渲染的数据结构和它的算法,选择这些算法,所以的话呢就是同学们的话呢,如果有更多的问题,可以到我们的微信群里面继续问我们,然后另外一个就是也欢迎大家,就是希望大家帮我们去做一下这个SWE。

告诉我们说我们的课程在什么地方做的不好,什么地方需要优化,我们也希望和大家一起把这个课程,就是越做越好好的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值