07.VR/AR主流显示技术概要 | GAMES204-计算成像 - P1 - GAMES-Webinar - BV18g411r7Fn
OK那那个时间也差不多了,我相信这个技术的同事也做了很多的工作,非常感谢啊,那各位同学晚上好,这个我们上周由于是SIGGRAPH的会议期间,以及games的年度会议。
所以我们上周的这个games204的课程,暂停了一周对,所以就非常欢迎大家这个本周回来啊,那首先给大家说一下这个抱歉,由于我现在是在人在香港,所以在海外的IP,境外IP其实是这个哔哩哔哩的直播。
会有一些问题需要通过国内的代理,所以可能会有一些延迟,或者是一些嗯这个不稳定的地方,还希望大家多多包涵,那今天我们可能给大家讲一下,这个display的一些东西,因为之前几周的课程啊,孙启迪教授。
其实给大家在这个成像的一些基本的显示,基本的一些概念以及颜色,冷眼的一些信息处理方面,有一些比较基础的介绍了,那其实很多同学当时在弹幕也提到了,这个形式方面的一些东西,所以这周我们稍微花一个课时的时间。
来给大家简单的分享一下,当前的一些显示技术的基本原理,以及它可能在一些啊目前非常火热的VRAR,虚拟现实和增强现实方面的应用,对今天的这个课程可能会比较的出现,那其实只是一个抛砖引玉的作用。
就如果大家对这个方向还是比较感兴趣的话,那我们后面其实可以再花一些课程的时间,再好好探讨一下当前一些研究的热点,还有一些研究的技术,所以今天可能是更一些,怎么说。
就是display one of one,只是一个take off的一个课程,OK那我们开始呃,首先我自我介绍一下,我叫吴一帆,大家也可以直接叫我EVAN,来自香港大学。
可以大家可以看到我的slice吗。
因为我自己是看不到建这个延迟的,对所以我来自香港大学啊,最后一个简单自我介绍,香港大学的单位E跟cs一个john fish,然后我之前是在STANFORD的完成我的post store,博士后的工作。
在之前是在UBCBRITISHCOLBIA,英属哥伦比亚大学,攻读这个计算机图形学的博士学位,在之前是浙大光电的这个本硕对,然后我在这边主要的研究方向是光学跟算法的,高design。
主要是为了这个next generation vidual and social resistance,然后这边是我的个人主页,就如果大家对我的方向感兴趣的话,也欢迎就是到我的个人主页去看一下。
那也随时欢迎更多的宝贵的意见和沟通,那我这边其实也在啊,朝夕2023年的博士以及博士后,还有这个I等等,所以大家如果有兴趣的话,欢迎来探讨咨询,OK那我们开始今天的课程,我们今天在线上碰面。
所以我相信大家可能都已经习惯了,这种所谓的这个啊online conference,尤其是在3年的疫情期间,我相信大家也都会同意说。
Zoom every day i have more than right,所以其实是一个very few of pandemic windo,那其实我们也可以说它是一个很好的。
visual computing six的SUMPTION,那是什么呢,是所谓的teddy ication,所谓的视讯通信,我们说实际上这种啊telecommunication。
它是一个一个从capture到display的一个过程来,它是involve不同的这个啊DISPL,我们说希望好的这个视频会议,我们会希望有好的cameras,我们有好的sense。
但同时我们也希望获取的这个内容,可以在事件的另一头可以很好的显示出来,所以我们也需要有很好的display,当然随着这些年,尤其是疫情期间啊,大家这个技术的发展,如今的这个视讯通信已经做得非常非常的好。
比之前来讲,然而实际上我们依然是土地的这样一个,面对面的过程,而无法实现深邃地,所以你eventually,我们还是希望有这个three d的vision sensors。
He dirty displaced,大家显而易见,这个还有很长的学术道路要走,我们说这样的一个telecommunication system,它实际上是目前最火热的VRAR。
也就是所谓的virtual reality,meal reality的一个很好的平台,那我们今天也会从VRAR的角度来探讨一下,有哪些基本的体制技术的应用,可以去更好地促进VR和AR的一些发展。
那我们take a step back,回到一个很早很有意思的问题,首先什么是显示,从这个一个很枯燥的文字来说,我们说显示是把通过光板信息,以符号文字,图形图像的方式呈现出来的一种技术。
当然这是一个很官方的定义,那我们可以再细化一点,考虑到人眼来说,显示的对象是冷眼,我们说人眼的各种感知器官会从外界获取信息,视觉占据了将近60%的这个信息获取,同时听觉占据了20%,由此可见。
视听两个维度合起来,占据了能接收信息总量的将近80%,所以我们说显示是非常重要的,那关于这个问题,什么是显示,我们来看一个有趣的例子啊,回到100多年前这张图。
我相信之前这个孙教授其实也可能提到过,大家也看到过,在讲camera的时候,这是historic comments camera,Great strid university。
那我们曾经的step大农场,如何去获取这个啊奔跑的这个market的一个过程,但实际上当时是通过了一系列的这个camera rate,去拍摄的这个过程,这个是获取的,那拍摄完之后呢,我们希望看到。
接下来我们说这是一个显示的过程,right就当你把不同的这个啊啊films就是底片,the query的选显示出来的时候,你就可以看到一个单套的骏马,The horse in motion。
这是一个非常经典的拍摄和显示的案例,当然这是西方的实验,那同学可能会感兴趣,我们东方呢,我们说中国古人的智慧其实是非常令人惊叹的。
那其实早在千年前,我们实际上就有了日冕,通过太阳的阴影做一些显示,它其实也是一个视觉信息的一个感知过程,同样我们还有皮影戏,我们拥有这个走马灯等等,这些所有的这个中国早期古人智慧的这个东西。
都是早期的显示形式,于是我们再回到这个官方的定义,WIKIPEDIA是这么给显示定义,An awful device for representation of information in the visual tea form。
那这个teppt form实际上说的是说啊,一个触觉的这个形式啊,那在一些特殊的场合,特殊的群体,也比如说这个马来群体,我们也是希望这个电子显示有一个感知的过程,当然我这么解释。
可能大家会觉得还是非常的枯燥啊,无法有一个感知的直观的理解,到底什么是显示,我们来看啊,几个最再举一个身边的例子,Everyone watch team is right。
就我相信大家对电视都非常的熟悉,那第四个发展也是经历了将近100年的时间啊,这边我们展示了一张图,其实从30年代,50年代早期的这个非常啊boy,就是非常厚重的这样电视的模式,到70年代。
大家可以看到越来越像一个小的一个方盒子,那我不知道同学们小时候有没有经历过,这种所谓的一个啊厚重的这个电脑显示屏,或者是电视,它其实是一个球面的显示屏幕,我们称之为这个形象,我显示CRTY好。
我相信更多的同学可能是在经历了,90年代以及2000年代的,这种所谓的平板显示的电视,那这个时候呢我们就有了平面的的电视,而且它变得越来越薄,那在两千一零年左右,我们又有了这个所谓的客服曲面的显示。
这个电视完全进化到了一个新的一个模式,但其实我们是要显示不仅限于电视,那我相信有不少同学可能每年都会关注,apple的发布会,那我们来看啊,这个apple的IPAD更新换代以及IPHONE的更新换福袋。
除了越来越大的尺寸以及不断增加的重量之外,那其实每年显示的提升都是更新换代的,重型制作right,所以我们说mode formation display,大家可能会经常在看这个发布会,在看这个电视广告。
或者在卖场去选购自己心仪的电视和显示器,的时候,可能会关注到这些英文的缩写啊,CRT就是我们所谓的这个应急显示管,应急射线管,Story,就是早期的这个啊球面的这个电视的形象模式,那当然了。
我们现在可能更多的是PPT display,所谓的平板显示,包括了电容,包括了等离子LCD,OLED以及这个投影机等等,那其实你在市场上逛一圈,你会发现非常多的有意思的品牌。
大家可以看到包括我们这个邻国和韩国的双手,lg跟SUS,那以及其他的一些这个国际知名大厂,飞利浦,索尼,宏基,明基等等,但实际上如果说早期的这个液晶显示,就是不可忽视的,那这两年其实我们啊中国的产品。
这个代表新兴的企业,包括TCL的华星光电,那bio e也就是京东方对这两家国产的厂商,其实在啊厚积薄发,在这个显示面板,现在显示面板上面的这个基站和市场份额,是在不断提升的。
那今天我们可能更focus在一些大家经常会听到,或者是常用的一些显示上面,比如说LCD,Oled,Higher projection,OK我们来说lcd everywhere来。
那什么是lcd again,我们先来看一个很官方的VOIP点的解释,他说LCD是一个fpal display,Or alan is a journal modulating optical,Devs。
The uses the live moderating properties of liquirestric,Combined with horizons,我们说LCD显示器它是用了一个液晶。
那什么是液晶呢,就大家可能有这样的一个想法啊,就我不知道我们同学以前就是用手指轻触过啊,早期液晶显示器的屏幕,你会发现它其实会有一些水波纹的出现,那这个就是液晶的一个形态。
但液晶其实是介于这个spy跟liquid,是这个特殊的形态,我们首先来给大家讲一下这个立意识啊,其实音乐经的发现你是很有意思的,它是1888年的时候,奥地利的植物学家,他首先发现了这种所谓的相变现象。
然后由德国的物理学家在接下来几年,拉登他提出了所谓的液晶像这个概念,然后呢在1963年的时候,又发现了通过电子刺激液晶分子,它的透光方式会发生改变,然后在64年以及69年的时候。
商业化的液晶显示面板原型被开发出来,那这个已经是有100多年的历史,那我们说液晶显示器,其实最主要的工作原理是什么呢,它最简单的就是说在电场的作用下,它这个液晶分子的排布,它的排列方向会发生改变。
使得光源透过率发生了改变,完成从光而从电到光转换的过程,然后我们会通过这样一个RGB的滤光膜,实现时域和空域的色彩呈现,就可能有点复杂,大家可以看右边这幅图,那我们从右往左来看啊。
这是一个基本的液晶显示器的拆解的过程,我们有最后的这个case,就是他的啊外观的呃模组平和,然后我们的背光会通过第一层的promise line,就是呃偏振片产生了偏振光,偏振光会经过这个TFT。
就是所谓的薄膜晶体显示在这样一个器件,然后会经过液晶分子策,每一个液晶分子层的像素,其实都是有一个color theatters,那这个其实跟我们之前的课程讨论的sensor。
分手端的这个rgb filter是很类似的,它其实每个像素里面也是看到的啊,三个的啊滤光片,然后会经过第二层的这个评论,电provise filter,再经过cover glass。
最终deliver上门验,那我们来简单分析一下,怎么去实现这个调试的过程,来做一个简单动画,我们用这个tn最常见的tn液晶,所谓的扭曲向量LCD的面板来进行一个分析,这边我们展示了一些不同通电与否的。
这样一个模式下的一个图案,首先我们说它的液晶有上下两集的这个啊,垂直的排列,就像我右图所示的,那在这之间它的液晶分子是螺旋排列的,比如大家可以看到的,就是上面一行的这个液晶分子啊,它的排列模式。
这个时候我们从左边进来的背光,经过第一层的这个滤光片,它通过液晶分子后,它会发生发生了转变,right就从这里到这里,对它会有一个啊偏振方向的转变,那这个转变后的偏振方向呢。
跟我们第二层右侧的这个偏振片子,中间的那个偏振方向,大家可以看到这个呃横向的一个箭头啊,垂直于纸面的这样一个箭头方向它是呃相同的,所以这样一个偏振光就可以迅速的通过了,这个啊偏振片就被人眼观察到。
这个时候我们液晶看上去从外面右侧往里看,它是灰色的,这个是不通电的状态,那么如果我们将电荷加到这个透明电极上面,之后,会发生什么,我们会发现液晶分子会顺着电场的方向,产生一个平行的排列。
也就是大家看到的下面这一行的,这样一个排列模式,这个时候我们发现绿色的这个偏振光,经过了这个嗯液晶层之后,它的偏振方向并没有发生旋转,而这个光的偏振方向,是跟我们第二次用天正片的这个垂直。
纸面方向是完全垂直的,这说明了什么,说明了,这个光线是无法通过第二层偏振片的调制,那么它就被完全阻挡了,这个时候你看到的话术它实际上是近近,似乎是黑色的对,所以这样一个基本的原理。
我们也就可以通过控制电压去实现,控制液晶分子的排列的这个扭曲的程度,从而达到不同的灰阶显示,那这也就是最基本的液晶显示的原理了,那当然我相信大家经常会去啊,卖场购买显示器啊。
可能会所以这个不同的这个啊学术名词所困扰,包括tn v a或者IPS等等,那么我们说这些其实是不同的,这个液晶面板的类型,那如何去选择你所要的显示器呢,实际上不同的面板类型。
关系着关系的液晶显示器的响应时间,色彩可视角度以及对比度这些,那今天我们给大家做一个非常简单的,一些概念上的一些啊,一些普及吧,怎么说,我们说常用的面板有这个ta,就是TRI的扭曲向上行。
那以及可能大家经常听到非常熟悉的ISP,In print witching,就是在平面内的转换类型,以及vertical lemon,就是多项垂直配上三种类型,那我们首先来看这个ta。
就可能大家早期的这个显示屏,就如果大家有用的话,会发现我们通常说TM是软屏,什么是软屏,就是当你用手指去触摸液晶屏幕的时候,早期的显示器屏幕,你会发现它是可以轻微按压的,它会出现一些水波纹的形状。
所以我们称之为软屏,这其实是一种早期的LCD面板的显示形态,但直到现在它还是大量使用,为什么我们说它即使城市成本低,并且非常大的优势,在于tn屏的响应速度非常之快,可以达到一个毫秒甚至以下。
它不会出现残影,那这种材质的屏幕就可以用来什么呢,就所谓大家的职业电竞,就是我相信很多同学会玩DOTA,或者玩其他的这个啊电竞游戏啊,这个时候我们往往会希望有114,144HZ乃至于更高的显示速率,对。
才不会留下这个啊残影,这个时候才能体现你犀利的走位和犀利的操作,所以通常很多电竞屏依然使用的,这个是tn的屏幕,那么相对的它的缺陷也比较明显了,因为他输出的灰阶比较少,色彩偏白。
另外就是他这个可视角度还是比较受限的,所以我们说如果你从事的是啊影视设计,图像设计或者是观影娱乐时,对屏幕色彩有较高的要求,那我们可以选择IPS的屏幕,那我们说IP的题目它称之为硬拼,因为它的面板较硬。
所以当你用手指轻触现在的电脑屏幕,或者是你手机屏幕的时候,通常来说不会发生变形,嗯啊其实大家在购买显示器的时候,IP一个最大的生产亮点是什么,就是他认为说它的色彩显示,和它的可视角度范围。
要比传统的tn的面板要更好一些,最大的这个原生优势就是广视角,因为在啊看不同的视角的时候,它的这个亮度都是很好的,所以不会产生色偏,那这个时候大家在嗯,很多家居的所谓的家庭影院,选择大屏幕电视的时候。
通常来讲我们会选择IPS的屏幕,这样子你全家人一起观看的时候,它有更好的一个感官效果,那苹果其实一直是跟IPS人马销售的,所以大家如果钟爱Mac的用户,IP是一个不错的选择,那ITS目前最大的问题就是。
它可能需要更高的背光亮度来提升,所以它其实啊功耗来说相对是稍微高一些的,所以控制不好可能会出现一些漏光,所以通常来讲,如果是选择IPISP的话,我个人会建议选择一些啊比较大厂的牌子对。
那从另外一个就是所谓的UAVN电脑,VN也是软件,所以当你在清初的时候,你也会出现一些花纹,但这个时候vi出现的是一个梅花纹,而不是这个tn的水花纹,通常来讲,我们说VA这种面板是中高端显示液晶显示器。
所用到的这个面板类型啊,它其最大的特点是宽容度和对比度都更高,所以大家可以看到我这边列出的一个表格,在contrast对比度这一项,V1A的面板,通常可以达到3000比一来至更高的这个对比度。
所以它是需要显示这个,黑色和白色都会更加的纯净,那反之亦然,实际上它带来的问题是什么,就是大家可以看到在response响应时间上面,它会稍稍逊色于IPS跟tn面板对,所以总结来说。
就如果各位同学是属于职业玩家,电竞玩家那一类的,那需要很快的响应时间,那可能天平是更好的一个选择,如果追求优质色彩呈现以及影视专业的用户,或者是普普通的上班族使用的话。
我觉得目前的这个IP屏是一个非常不错的选择,OK说了这么多,就另一个非常有意思的这个啊缩写QED。
我相信大家可能在卖场都或多或少会看到啊,所谓的量子点显示,这个是非常有意义有意思的事情啊,现在很多东西大家都喜欢宣传为量子点,很多大厂,但实际上我说我想告诉大家,老师。
量子点显示并不是用量子点技术来去做显示,它本质上还是液晶显示啊,不过是说我们在背光的这个层面上面,因为我们用液晶是这个passive的一个被动式形式,在背光的层面上面用了一些量子点技术。
那什么是量子点呢,量子点是一种非常微小的纳米晶体,所以在受到高能光子撞击的时候,它会吸收光子,同时激发出一个另外一个波长,不同颜色的波长的光,那不同颜色的这个光取决于能量是晶体的大小。
那这个就非常有意思了,所以在液晶显示屏里面呢,我们可以用量子点这个技术来做绿光绿色成,比如说很多的这个目前的显示器啊,蓝光led的背光灯的光线穿过量子,增强成所谓的光纤DOS。
然后就可以将这些蓝光转为红光和绿光,这个时候量子显示,量子显示可以提高这个更宽广的色域,所以大家在看这个啊,在购买显示器和电视的时候,你会发现,通常来说pure l e d的显示的效果会更加鲜艳。
更加艳丽,它能cover的这个色域的范围会比传统的LCD,用led背光实现LGD要更高一些,我们称之为PPT,对这个技术实际上是这个索尼大法,在13年的时候将其商业化的,那目前来讲啊。
SAMSLG包括我们国内的华星光电,以及下部这四大厂商,实际上合计占了QLD是场的,大概70%的提升而左右对,但我相信大家也不要被这个各大厂商的广告,有名骗了。
实际上所谓的量子方TLED还是LCD显示显示,只不过它的这个色彩范围确实更好一些,当然它这个价格也稍微高一些,OK我们刚刚讲的会讲到两个方面的。
一个显示技术,一个是LCD,另一个就是所谓的OLED,我相信大家最近可能听得非常多啊,有机电池发光显示,首先依然是给出一个WIKIPEDIA的定义,官方的定义它是一个EMC的一个layer。
他是在有机薄膜上实现了一个一个啊,一个显示器件,对,那这个OLED实际上是由我们华联科学家CW藤,所谓的邓秋云教授在87年的时候,在我们非常知名的,可能有些同学现在已经没有啊,没听说过了。
柯达公司提出的对,然后在90年的时候呢,又研制成功了高分子系统有机发光,然后在92年的时候,由CAMBRIDGE剑桥大学那边成立一个新的显示技术公司,把它进行了一个商业化,那我们说他从和LAD。
就有最大的一个区别是什么,就是LED大家会理解成是有个PN结的东西,但实际上OLED它并没有欧莱最大的特点是什么,它有自发光性,它是active的,还有广视角,它有高对比度,还有低功耗等等。
那可能大家会比较熟悉的,OLED是在于它是柔性显示一个非常重要的载体啊,就这两年大家可能看到了非常多的所谓的啊,折叠手机,包括三送,包括毛孔,包括华为等等厂商都推出了折叠手机。
那大多数折叠手机的屏幕都是我们的OLED屏幕,根据驱动方式的不同呢,我们又可以分为啊active and passive的两种,就是所谓的主动跟被动啊,那这两种其实在显示技术上面并没有太大区别。
不过是说啊在active的这层主动的这个形式模式上,看到这两张图啊,我们可以看到多了一层TFT的这一层,所以它的结构来说相对会复杂一些,但是他可以啊,Sorry,但是它会有更高的一个刷新率。
同时可以有更小的功耗,因为这个TFT所需的外部电量要更少一些对,所以大家在啊目前购买购买的这个啊,智能手机也好,或者是OLED电视也好,其实大多数使用的面板都是AMOL。
所以大家看到这个AMOLED这个名词的时候,没有必要认为说他一定比传统的欧莱相机能,其实二者是完全一套一套东西,只不过是各大厂商在做一些宣传上面的,一些一些啊名词而已,那大家可能会感兴趣,说。
LCD液晶显示跟online,以及半导体显示会有什么区别呢,其实这张图非常好的直观的解释了,要怎么区别啊,我们说LCD包括所谓的led display,实际上是led做背光的LCD显示。
那它是一个martleg structure,多层的结构,而OLED它是主动发光的,实际上它只有非常simple的一个structure,那总结来说,我们说LCD需要背光,因为它是被动式的形式。
因此带来的问题是limit的contrast对比度有限,同时啊比它的功能利用率也低,但是它已经成熟了这么几十年的工艺,所以说目前来说这个成本是比较可控的低的。
那OLED作为近10年来比较新兴的一个显示技术,它是自发光的,所以它的对比度和颜色的表现力都更好,它的这个功能利用率也高,那由此也带来了一个重要的问题是啊,他的目前的这个成品率啊,它是有限的。
在实现大尺度高分辨率以及长寿命的,这样欧乐形式方面,目前它的成本还是比较高的,所以大家在购买的时候也可以酌情考虑,OK我们说除了这个通常的这个显示器的平板。
液晶跟OLED显示之外,我相信很多的家庭或者很多同学在宿舍,已经厌倦了这个50寸的这个电视的形式,或者是27寸的显示屏,所以很多的朋友可能会选择投影机,做一个家庭影院,那一旦存在投影机。
我们就不得不谈到一个非常经典的缩写啊,大家肯定也经常听到special live model s a n,那我们说它是一个object。
That can imposes some from the specially very motivation of lighting,那简单来说,它是可以对这个路上的光进行PERFEL。
就是每像素进行光调制的一个器件,它有点类似于这个sensor,也是像素级别的,只不过是主动式的对光线进行调制,那市场上我们可以看到各种各样的所谓,special modulations啊,品牌啊。
在学术圈可能大家比较熟悉的,包括霍乱爱德国的,那包括就是来自日本的三叉跟哈马马子,哈马马子就是所谓的啊冰封科技,以及大家非常熟悉的这个TI德州仪器,我们再来细化一下,L啊。
我们说通常来讲special language reality有两种,一种是air cos,所谓的liquid crystal or cirica,就是所谓的硅基液晶,这个是在1988年所提出来的。
应该是对它的工作原理,其实我不在展开,因为我认为它其实就是液晶,只不过是在覆盖在硅基上的一个液晶显示,那它最大的优点就在于,可以大幅度的降低液晶屏显示面板的生产成本。
所以通常来说它是一个反射式的一个显示对,所以我这里写了,他是一个basically is certainly lefty sd。
It’s a standard component in projectors,And hamoji dispace,比方说google glass。
我们后面会谈到google glass的这个啊拆机视频啊,那这个时候呢我们在想,如果没有了,我刚刚前面讲到了第二层的这个啊偏振片,但实际上它就从强度的角色变成了相位的调制,所以这里我们不再赘述赘述。
第二个非常有意思的这个special greater,就是所谓的DMD啊,数字镇静镇定,它是一个MAMASTER的T0件的,对它实际上也是大家可能经常听到了,DJROSECDRP的一个核心科技。
我们可以理解为,它实际上呢就是很多很多微小的反射进入阵列,这边我展示了一个右侧,是一个啊显微镜下看到的无间进的一个图案,大家可以看到每一个小方块,它实际上是一个类似于嗯两个角度偏转。
正十度偏转的一个小的镜子反射镜,那它这个尺度大概在十几个微米,所以实际上它是一堆的消防设计,那么它怎么实现显示呢,就是他会通过这个呃,这个布在半导体上布置的这个微针微镜片,组成了这个矩阵。
去投影到画面中的对应的一个像素,然后这些证件呢可以在数字驱动信号给控制,下面进行一个偏转,就会倾斜十度,正十度的这个概念,从而使得入射的光线发生了一个偏转,处于投影状态的镜片,我们称之为泵。
也就是所谓的开关的开,并且随着数字信号的倾斜,你从投影状态倾斜到非投影状态,称之为官,所以本质上来说,他这个角度只有banner2元化的开源源光,那如何实现我们所要的飞度显示呢。
实际上我们是通过在这两个状态之间切换的,频率,也就是持续上升的,因为我们认为这个DMD的偏转是非常快的,现在大多数的这个投影机啊,就你可以在淘宝上面买到的这个所谓的微投,大多数使用的是第二批的一个形式。
作为投影显示人,它通常通过两种颜色的两种方式来产生彩色啊,就是包括单片的投影,以及我们这种三片dd合成的投影,对不对,OK那在这之前,我们花了大概将近半小时的时间,给大家普及了一些硬件方面。
关于显示的一些基本技术啊,那我们接下来考虑说,这些显示技术到底有什么用啊,全世界都在讨论METAVERSE元宇宙,所以我们会有这样一个想法,我really make a house。
其实这个问题就元宇宙到底有什么用,很难回答,我们这里也只是做一些抛砖引玉的探讨,首先我们来讲说电影,科幻现实,我不知道有多少同学其实看过这些啊。
science fiction movies这边包括了非常经典的这个啊,star wars已经好几个,Decade of a stop chat,Hero,Man,Register。
One mission,impossible等等等等等,就是很多不同的这个科幻电影,这个通常来讲我们去电影院看的时候,我们往往会被他这种所谓的啊全息显示,或者是虚拟现实显示所惊叹。
但实际上这些显示都是下一代的这样,一个显示技术,希望去肯定是大家说VR AI s coming,那我们回归现实啊,我们text debug,我们可以想想是什么样的这个display。
什么样的显示才是promising的,在短期内的这个dispair with jensity是promising,我们说啊通常来讲会有两种显示模式,一种就是啊上半部所所这个解释的。
它是一种多人的比较大型的,主要是在好多人的这个信息的分享的一个,显示模式,第二种就是我们说的nei displace,所谓的经营显示,通常是只在于提供一个immersive,沉浸式的个人体验。
但就像我们开篇的这个语言的这个例子来说,其实不论哪一种这个显示的场景,它都是一个SISTANTVER系统级的一个解决方案,它包括了CTURE,Ranging display,还有interaction。
那我们再来细化一下啊,什么是VR virtual reality,同样的这个是WIKIPEDIA的这个定义,就是committed to distination of three dimension。
Image of environment,They can be interacted with the,Simply rear of physical wave by a person。
Using special is the chinequipment,这个听起来非常的复杂啊,那我们如何把它这个直观一点呢,我们来说它其实就是一个啊头戴式的显示,那这边我们来说它为什么不重要。
这个是national academy of energy,I sorry of engineering,就是美国工程国家工程学院,他对这个21世纪,他列出了一个,21世纪的14个巨大挑战之一。
In test virtual reality,所以我们说从这个宏观层面来讲,它是非常有意思的,那它有哪些应用呢,就大家可以看到啊,在很多不同的领域,VR都是有非常好的这个啊应用价值的。
啊vehicle strong对吧,还有我们这个gaming of course,游戏娱乐产业,还有在医学领域,我们通常可以希望做一些robot的,虚拟现实的这个啊手术的一些training等等。
包括education,那接下来我们可能会更focus在一些啊,基因显示的一些东西,为什么呢,因为我们说实际上基因显示它是人类,就是啊个体用户跟我们这个地区的content数字事件。
一个很好的沟通的interface上的一个媒介,所以我们来从engineering的角度来考虑到,到底在VR跟R的角度,有哪些东西是非常的F有趣的意思啊,那我们说它其实是一个各个领域的一个集成化,对吧。
所以我们这里呢用一个大家可能非常经典的,头戴显示器来做个例子,我们对它进行一个拆解啊,我们会发现,我们有这个计算的单元对吧,我们需要有数字处理,所以我们有CPUGPU。
I pu and gpu right,然后我们需要跟这个啊外部的用户,跟外部的世界进行交互和感知,所以我们需要获取足够的信息输入,所以我们有SENSUS,有computer vision的内容。
我们要去感知这个世界,那我们得到了这个信息处理之后呢,我们需要给它显示出来,deliver到用户的人眼上面,所以这里我们会有光学,会用PHOTONICS。
包括会有一些human perception的东西,那么在这个维度,我们说显示display这里是非常非常重要的一个模块,可以说目前的这个所谓ZRR显示,王老师最重要的那个内核。
那这里的显示啊是一个网页上的显示,也包括了所谓的vision,视觉上的啊,可能有语义的,以及我们happy就是触觉上的一些东西,那当然我们希望我们的这个沟通啊不局限啊。
不只局限于你在进场范围内的这样一个沟通,我们希望能够有很多的亲人朋友进行沟通,所以我们会考虑到有更多的VR cameras,我们会考虑到如何对这个信号进行压缩,跟streaming传播等等。
那这个时候就会有clog computing,跟如何需要这个experience的一些探讨,最后我们还是会有一些啊,HCRSM肯定检查身,还有一些应用场景的设计,那所有的这些东西合在一起。
构成了这个VRAR的头衔,所以我们希望把所有的这些东西,集成到这样一个器件里面,这听起来可能不是一件简单的事情啊,是比较困难的事情,但是我们发现,我们最终希望的并不是这么多的一个东西,做不好。
我们希望得到的一个形态是什么,我们希望得到的是,This is what we want to be right,我们希望所有的系统能够尽可能的集成化,注意中能够有一些嗯。
Extremely lightweight and power about you,的眼镜形态的一个器件,然而很不幸,我们目前还没有这样一个场景和解决方案,能做到这样一个一个模式。
那啊对于这个power就是电源方面,我可能不是太懂,但即使哪怕从光学可显示的角度而言,我们都很难在目前的这个形态上面做到眼镜端,当然有不同的这个大厂一直在我方向探讨,大家可能也看到不同的新闻。
但实际上我们告诉大家的是,目前没有任何一项技术才能做到,在这么好的这个这么轻的这个眼镜形态上面,是集成了很好的VR,但是我们说我们不能被这个嗯这样一个,Challenge of discourage。
因为我们实际上人类真的是很聪明,在很多年很多年以前,我们实际上或多或少已经实现了类似的形态,Wait a second right,这个啊google couple和我们刚刚看到这样一个眼镜。
它是很类似的,还有呢我们再来看啊,这个是150年前,就超过一个半世纪以前的这样一个东西,是不是跟眼镜做的其实还是蛮像的,The only differences,只是说我们目前的这个显示上面加了一些。
I m m u,我们有一些更好的DIPPT的显示,而不是单纯只是胶片,所以但是从这个啊光学原理来讲,他们是类似的,不要我们进一步分解了,这是一个非常有趣的例子,最早的一个3D显示的案例之一啊。
这边是LEN啊,大家应该也认识啊,就是美国总统对,这是在11865年的时候给林肯拍的,这两张照片是两个相机左右拍了一个小角度,于是我们把它放到这里,我们会发生什么。
我们就有了第一代的discovery disposterious,Scultidispace,所谓的双视差,显示左右左右左右的这个市场的变化,所以大家可以看到啊,非常小的这个市场的变化。
就是你单独看的时候,可能看不出来太明显的区别,但是当你放在这里啊,Back at force,通过back at force的时候,你就会发现他的左右市场的变化,那么这个是早期非常有意思的。
Stereoscopic dispace,这个也由此引出了,我们来讨论一下VR的history,非常有意思的,刚才讲到1838年超过一个半世纪以前,在这两个世纪我们有了STERIOUSSCOTTI。
所以人类人类其实比我们想象的还要聪明,更早的就已经是对这个three d scenery,有一个interest,但是第二个我们能看到一个真实的产品,就已经要到一个世纪以后了,1968年算了。
我们有了IPHONE,提出了这样做了这样一个cat multi display系统,那实际上就是当年的一篇paper,是在一个join computer conference发布的一个paper。
那看起来有点科幻,有点像我们现在看到的这个呃,科幻电影里面的一些东西,那当时他实际上用了两个很小的两层,121英寸的这个CRT显像管显示在眼前,所以他非常的是KY,那么已经实现了所谓的3D显示的功能了。
然后又到了95年的时候,我们有了演唱者大可能非常熟悉,任天堂推出了这款产品叫做virtual boy,所以它实际上是一个first ba wiisp。
Commercial release of consumer haya,消费电子厂啊领域的一个第一款的heat,那它实际上已经是做到了一定的对吧,我们可以看到有一个可移动的手柄,一个control。
那它有双目可以提供这个3D的图像,但非常可惜啊,他并没有成为这个一个巨大的商业成功,当时的设计可能太过了啊,前卫了,因为在内容,计算机算力以及这个显示效果上面都没有看上,所以可能昙花一现。
接下来我们说在过去的10年间啊,VRAR是经历了一个爆炸式的增长,就大家可以看到非常非常多的品牌跟大厂,投入到这个领域,那熟知的国际大厂OCULUS,索尼,Htc microsoft,那包括我们国内。
基本上有无数的创业公司,都在往这个方向百花齐放,但实际上我们来看啊,回到这张图,其实经历了这么多年的发展,这二者的形态和基本原理还是类似对吧,但是又不完全相同,那这个时候我们就会思考到底问题出在哪里。
有哪些问题值得我们学术界和产业界去研究的,这个时候,Now take a step back,那我们退一步啊,首先再一次来回顾一下我们的human mage system,就我们到底双目是如何工作的啊。
这里说当冷眼去看一个感知外部世界的时候,实际上我们的眼睛它是会perform两个action的,同时我们说有一个BURGESS,就是所谓的双目的对焦。
那有一个augmentation就是我们的molecule,就是所谓的弹幕的一个自适应的过程啊,那这两个啊action实际上会对应的,通常两种不同的focal cues就是深度感知。
我们说呃binocular呢你会有一个binocular disparity,就是所谓的双目视差对,然后这个时候呢,你的molecule呢会感受到弹幕的这个retina,这所谓的市场是我们模糊。
就这个这样解释,可能大家有点不理解,我们来做一个简单的实验,就同学们可以伸出一根手指,然后呢放在你的双目中间的位置离前,那么往前移,然后你的双目呢尽可能尝试着,钉在你自己的食指,但你这个会发现。
实际上你的双眼是会尽可能地,聚焦到你的实验啊,实质上是有双目视为一个小小的一个rotation,的一个过程的,所以实际上就有了啊,板专科disparity以及逻辑融合了。
当这两个这个focal cues,我们就对真实的世界感知有一个深度的感知,有一个three d的war,这个时候我们讨论的就是3T的世界,而不知道是二维世界。
Ok so we need to know about ourselves right,那我们做一个简单的总结啊,我们来考虑人眼的视力,所谓的势力就是指视觉的灵敏一些清晰度,那我们说从像素的角度来说。
人眼的分辨率是非常非常之高的,实际上人也有超过1亿2000万个视杆细胞,将近700万的视锥细胞,所以严格意义上来说,人也是上亿级像素的相机,这也就是目前很多的这个新型概念的手机,包括小米,包括华为。
包括MOTO3星等等,都在宣传自己的这个手机,摄像头是一级像素对吧,所以人眼实际上的理论分辨率,可以达到18~20个角远,但是我们说每个人的感光细胞的分布和本身,都是有一些缺陷的。
那实际上的这个分辨率只能达到一个角分,而且是在理想的晴天白纸黑字的情况下面,你能看到这样的一个分辨率,那这个换算过来呢,就会得到所谓的这个writing a屏,就是所谓的视网膜屏了,我们后面会讲到啊。
那同样的我们说field view弹幕的,你可以看到将近180度,但当你双目合起来,重叠区域就大概有120度,在130度的这样一个范围内,那关于动态范围等等,其实是啊。
之前这个孙启明教授之前大家分析经过了,这里就不再赘述,我们来看一下所谓的rina display,就是视网膜屏,那什么是视网膜屏的,实际上就是一个非常简单的数学关系。
所以大家可以看到你有一个MACBOOK,当你放到它冷眼,距离大概12个inch的位置的时候,简单的这样一个计算,你就可以得到他的这个dpi了,Steven jobs tale told us。
It’s about three,上去第一篇,这个是我们品,这max不告诉你,大概就是290左右,这个实际上就是所谓苹果视网膜屏的一个概念,OK经过过了这么多年的发展,我们现在做到哪一步了。
就我们其实这样想,就当你把一个VR头显去拆解的时候,拆机视频就会发现,实际上呢它很大程度上,他的这个发展,是由于这个啊手机产业的发展所促进的,所以你看啊我们拆解之后,他一个现代的HND里面。
所有的这个器件,基本上都是cfm industry的一些components对吧,但实际上我们会有一个比较lower,Cost high resolution display,我们有一些IU。
我们有一些光学器件等等,所以实际上最简单的如何pk黑暗了,你只需要把你的手机加上lessons,于是乎我们会见到各种各样的method file,Tv on display,我们称之为naif的。
就是非常好,初级的一些displace,各种各样的形态,大家都通过了这个binocular,去实现所谓的3D视觉和沉浸感知,但是这个我们会说啊,这样的一个模式它有好有坏,问题在哪里呢。
几乎所有的这个模式,你实际上它的光学原理看到的就是一个virtual to the,Image of micro display,被这个光学透镜所magnify,就如我这边啊,右图展示的就等同威力。
其实拿一个放大镜,通过放大镜去看一个啊手机屏幕,或者是看一个显示屏幕,那这样的一个显示模式呢,它带来的问题是什么,就是它只提供了一个fixed coco,就是这个时候你的聚焦平面是固定的。
那它就缺乏了我们刚刚前面提到了这个啊,Focu,这个时候就会引入了virtual commodation coffee vs,我相信大家可能在学习中,听到了很多这样一个词啊。
具体来说就是我们真实的看自然场景是A,你看的brawall in the focus distance,和你的virgin distance是重合的,Is no confit right。
但实际上我们现在看的这个黑鸭的啊,头戴显示器,这之间是会有一个perfect的,因为你最终是会focus在啊,前面的这个物理的显示屏是上面的,那这个VC会带来什么问题呢,这也就是为什么。
相信很多同学尝试这个头戴显示器的时候,第一下会非常惊艳啊,但是如果再超过5分钟或者10分钟,你会发现啊,有一些discomfort,头部大目眩等等等,这个时候就是冷眼和大脑。
视觉系统在不断的这个调教对焦的过程,他这个没法满足这个coffee,所以实际上会给你的感知就是discomfort,那学术界其实做了很多很多的工作,尝试去bypass,这个后面如果大家感兴趣。
对我们在花一呃一个课时的时间去探讨一下,这个大家如何去去by pass这个CONFID,好的,我们谈论了很多VR,那我们再来过渡到A2,所谓的argument l p增强现实。
同样的我们给出先给出一个这个官方的问题,P点和定义,And interactive experience of real world environment。
Where the objets reside in the real world,Part in hands by vitality,Perceptual information。
就说可能还是有些这个怎么来说,就是啊文字性的枯燥的有些复杂,还是来看这个视觉上面的东西,我相信很多朋友都玩过这样一个游戏游戏,Pokeman,这个就是一个非常经典的A2的一个例子。
或者中国某种程度上的A啊,Some kind of f,所以这里我们有这个forty or generated的卡,还有这边的各种说法,cheers跟我们现实生活中的这个场景,进行一个增强的一个过程。
This is a2,但实际上我们说我们关心的是,更感兴趣的是fancy的VA,就是如何把它实现到,我们的头戴式眼镜层面的A,那过去的树里面啊,大家可能也见到过非常多的a r display。
基本上是每个月都有一个新的形态出现。
那这边我列举了几个比较有代表性的,包括microsoft flowland right,到过了meta,那现在这家公司已经不存在了,对还有这个融资的20亿美金的GDP,非常有意思啊。
非常多的这个东西还是跟我们的VR一样的,我们在这里take a close,暂停几秒钟,我们take a step back,就考虑一下更早的时候的人们的这个创新啊,还有一点在啊10年前的时候。
我相信大家不可避免地会讨论到的就是google glass,The early generation of csu a r,早期的这个可透视a r display。
一定避不开的就是google googas,后面我们也会有一个解析分解啊,我们对于这个顾客啊做了一个拆解财经,同样的大家可以看到啊,同样是类类似于啊手机模组里面,不同的这个成分。
当然就是谷歌也非常好的工业设计风格啊,那跟这个VR比较大的不同是,这边会有一个光波档,就是把实现这个CSU的一个模块,我们后面会有具体分解,就这张图啊,这边实际上是一个啊。
good glass的一个专利的一个截图了,我们说实际上从光学的角度而言是非常simple的,它只是一个非常bey的这种啊,Semiches parent reduction。
所谓的半透半反的一个光学原理,那具体来说呢,假设我们希望看到这句阿来,我们从l cos左下角投进去一个图像,它会经过第一层的这个BB,这反射经过第二层最右边的这个啊再一次反射。
然后经过第二层的这个45度倾斜的啊,镜子的第三次反射,最终达到人眼是不是很简单,这就是最基本的这个啊,matthew regression的这种GOOGC思路的形态,但是实际上again历史告诉我们。
人类远比你想象的更加quality,实际上我们在一个半世纪以前,我们就有了类似的csl display,这个是叫做paper goes,是在1862年的时候,能ghost image,大家可以看到啊。
这个光学和我们GOOGAS是非常类似的,底下有个投影,你找到这样一个啊ghost的这个这个model上面,然后上面放了45度倾斜的一块,这个平板玻璃,能go right。
the office是跟google glass是几乎是一样的,以及或者事故多的,包括我们现在看到了很多这种啊,黑暗形态里面的这个optic combiner,几乎是类似的,当然从简单的这种反射式呢。
我们需要逐步的过渡到还有是否有其他的形态,这个时候我们就不得不提到,非常出名的这个MICROSOFTHOLOLI,那与之前的这种半透半反的模式,麦克斯大家可能会用听到这个web gun这个词。
所谓的光波的,那至今为止HOLMES已经有了两代了,我们首先来看第一代产品啊,这个是在啊56年前提出来的一个HOLENONE。
对它,实际上这个波导呢用的是一个defection,grading的一个模式,那这边可能比较光实的,我们就不再展开了,这边我放了一张这个显微镜,下图大家可以理解这个所谓的光波档。
就是在显微镜下是一系列的周期啊,排列结构的光栅式的结构,所以每一个小结构呢,实际上是在对陆射光进行一个呃,方向的调制和反射,对那第一代HOLIC最大的问题是什么呢。
我们说他的field of view是非常有限的,只有30~17度,那也就是说当你放在人眼看的时候,你并没有这个沉浸式的体验,因为它的市场价是非常熟悉的,那当然它的image quality也是有限的。
尤其是颜色上面,于是乎微软在啊三到4年前吧,对可能是更加量产的。
应该是两年前推出过HOLOLITO,那这个时候微软变得更加smart聪明了一些,他们从传统的这种投影显示的模式,变成了啊laser scanning with sky。
就是把一个two taco改成了一个激光扫描,中间扫描的模式,那这个带来的好处是什么呢,首先激光的模组可以做到更轻便,第二就是说啊,理论上,你可以实现更高的分辨率和更大的市场价,至少在微软层面。
他们可能可以实现到2K的输出,是单眼来讲,那同时这个第二代的HOLANCE,他们的视场角已经提升到了,52度的对角线的这样一个尺度,所以已经有property,是当前的AR商业报的AR产品里面啊。
最好的这个显示效果之一了,但是我们说我们说从刚刚前面所分析的,真实的这个显示的效果来说,It’s far from sufficient right,所以实际上呢大家就会在思考。
就我们说目前的这个场景不够,目前的这个投影显示,液晶显示,都没有达到最好的这个3D显示的效果,那下一代是什么,Oliver,就我相信大家或多或少都听到了这个,那之前有很多节课,也有不少同学提出了。
是否能讲一下前期这个东西啊,那我们这里可能说全息是下一代显示,至少是很多人说believe的,下一代显示的一个解决方案,那什么是全息呢,它实际上利用的是啊衍射波动光学,去实现高的图像分辨率,高的对比度。
以及一些深度信息的一个显示模式了,那具体的光学原理,我们后面会再抽一节课的时间跟大家解释一下,因为包括也涉及到啊,成像部分也是有一些不同方式的部分,这个我们后面会再讲。
这里只是一个很简单的一个intuitive的感知,就是啊印象上面什么是全息啊,这里我展示了一些optic record hoges,就是通过光学和曝光的方式记录的全息图,大家可以看到啊。
就是第一眼直观的感受,它的显示效果是非常逼真的,有一点点以假乱真,比方说左边的这个图,就是可以看到virtual和real的这种object,他们是非常嗯类似的,是几乎是identical。
所以光学的这个全息图已经是发展的非常好,但是我需要提醒大家的是,从1960年代激光被发明出来,至今,经历了超过半个世纪的发展,全新技术依然没有进入主流的显示技术,那这个是为什么呢。
这个我们后续会在分析啊,就目前来讲,大家还在不断学术界的这个努力中,去实现更好的computer,General writing hotographic,也是所谓的计算权限,那这个时候抛个引子啊。
就大家可能会关心,但目前全新显示技术到底做到什么样的,一个水准啊,这个是STANFORD团队,我们在上周的SURAPH传奇传奇,去这个刚刚发布的一个啊这段曲线显示的工作,它是一个AFFIRMCGH存货。
可以实现two d2。5D三D和4D的cg h,最重要的是我们实现nature decovers,这里我们看到的是一个实拍的相机,前后对焦实拍,你们也可以看到的这个真实的显示的效果,大家可以看到啊。
从这个啊这个RUTTER从后往前奔跑的过程啊,我们可以对焦到后面的竹林,然后慢慢的对焦到前景的这个人物身上,当我们对焦的时候,它这个泥浆的部分的这个模糊是非常的natural。
And discomfort,Sorry,And comforter,不像目前很多的这个计算全息显示的工作,号称所谓的3D,但实际上在我个人看来,那就是伪3D,或者说2。5D并不是真正的3D。
因为真实的3D场景还是需要满足这种嗯,提交的真实的场景的同时,要有这个view dependent effect,对吧,那今天时间也差不多,我们做到做一个简单的总结啊,其实今天讲了很多东西。
其实最主要的一个核心概念,就是给大家这样一个一个一个概念,什么是所谓的显示显示,从早期的纯光电显示,慢慢的过渡到当前我们讨论的说计算显示,包括这门课的核心,也叫做计算成像,所以我们说计算显示。
它实际上它是啊一个过程,它是bridge in a different disciples right,我们说会有computer science,包括optimization,包括model。
包括了machine learning,我们说会有这个器件,包括我们之前提到的APOSLCD,以及各种的驱动等等,然后当然会有很多光学部分,有,包括我们传统的光学optics,当然有一些光电子的pt。
还有我们需要考虑到human vision的一些理论上,那把所有的这些东西尽可能的合在一起,实际上你就会去enable这个所谓的competitional display。
然后今天只是给大家讲一些比较high lever的概念,就如果大家后面有兴趣的话,我们还会再抽一节课的时间,给大家介绍一下这个3D显示跟全息显示,哦有同学说卡了对,可能刷新一下就非常不好意思啊,对。
因为我们现在是通过这个国内的代理对,进行直播间,因为我现在也在境外对,然后最后我做一个小小的,这个结束之前会做一个简单的广告嘛,就是啊如果大家对这个感知,计算成像和显示感兴趣的话。
我们这里有个学术的公众号啊,就我们每周会有一些呃,对当前比较好的一个论文的一些解读,就包括了计算成像,计算显示等等,那也当然包括了很多啊,STANFORD计算成像显示,计算成像组的一些工作的解读。
包括我刚刚前面提到的这个全息显示等等都有,所以欢迎大家关注,也欢迎大家如果有好的工作,随时来搞宣传交流对,OK今天的这个内容就到这里,就如果大家有问题的话,可以随时在弹幕中提出来。
那也可以就是直接给我邮件啊,放进一步的交流对,就今天可能讲的是比较high level的一些东西,因为我们实际上希望给大家普及一下,显示的一些概念,因为其实我们很多的这个受众的同学啊。
来自于不同专业或者是不同的这个啊年龄层段,所以我们不知道大家的背景如何,所以希望有一些东西,可以是先从一些fundamental的东西讲起,那后面我们会再抽一两节课时的时间。
就逐步过渡到从目前讲的这个VR,RR的显示技术上面,我们怎么去进一步的发展做一些啊,Life field,包括广场,包括holographic display,对这个后面还会有几个课程来讲啊。
我看一下这边有一些同学有什么问题,对同学会说,CP有哪些技术已经用在AR设备上面,这非常有意思啊,我们说我们这边讨论的可能更多是cg被图形学,但实际上CD计算视觉,或者说对计算机视觉的发展。
其实更向前走一步啊,比方说我们说有一个CP里最经典的就是flag,对吧,他在目前的tracking,在空间的定位上面已经有很好的应用bug,实际上你在玩手机玩破后面的时候。
你已经有很多CV的技术用到了这个里面,对这个的话,大家可以去了解一下,那国内其实很多CB的大厂,也都在这方面做得很好,BRAI光学设计可以申请两大博士啊,无相欢迎啊。
对那香港大学这块也其实目前也刚刚起步,就是如果有同学感兴趣的话,也欢迎这个浏览我们的主页,那通过申请香港大学的博士,可能还有一些CRITERIC要满足,这个可以参考我们广大的官方的这个WPAGE对。
同学们也可以看一下还有什么其他问题对,因为今天可能讲的比较这个high lever啊,所以比较啊浅显,就希望大家能够了解一下,然后有任何问题或者有什么建议和意见,也随时可以留言啊。
就确实实是今天稍微有点仓促,那后面我们会再花一点时间给大家讲一下,全息显示等等,啊有的有回放,我们我相信这个games应该会有录制这个RECORDA,但这个回放的上限可能要花一两天的时间等等。
啊有同学问说全新显示的UFOV,就是feel的视角比较小,是因为激光发散角小吗,这怎么说呢,就是其实全息显示也好,当前的所谓的这种啊,非全新的ARVR的显示也好,它的一个市场角啊。
和他的一个IBOSS是有一个TRAL的,我们说最核心的限制,实际上是光学器件给大家宽受限,那再理解来说,全息显示就是你那块显示的这个airports,special mode later的大小的限制呢。
理论上我们希望有尽可能大的special mrating,并且这个special moor的每个像素都尽可能少,也就是说我希望有一个空间,光调制器本身的尺度是大的,它又有非常非常多的像素。
那么这个时候他的filter view跟这个啊,high box都能做的比较好,但目前来讲最大V比较小,有这两方面的原因吧,对就是一个人来讲,我们说他的这个影视角本身也是很小的。
然后他的这个啊DISPENA也是很少的,就导致你看到的地方也是很少,啊后面的话我们会在全息的那个讲全息的时候,会专门讨论到这个file view的问题,对,因为这些是比较技术性相关的。
所以今天游戏时间游戏我就没有展开了,OK啊,有同学问到说这个超表面黑暗的前景如何啊,这个非常有意思啊,Mea service,这是怎么说呢,Holo deep neural meta quarter。
这些都是近期非常热门的一些词汇啊,meta这个东西呢,其实meta service无非是衍射走到一个极端对吧,它实际上也是个,我个人认为它也是影射的一种一种模式,只不过说我们把这个器件的尺度走到啊。
SUWON其实比传统的这种国产量级更小一个字,那它其实会带来一些很好的更大的优化自由度,包括我们也可以用到这个啊POLIZATION,那在ARVR目前有一些paper。
有些研究小组包括了像美国的KHARA把手,大家肯定也知道了,然后华盛顿大学的对,包括最近MEA跟URISTON,包括STANFORD,其实也有在这个方向来做meta surface的一些东西。
用到啊AR跟VR的里面去做一些呃,BWISH就是带宽拓展,就在于目前的问题是我个人的理解,就有两个方面的问题,一个来说就是这目前的meta service的加工工艺,很难做到大尺度的这个产品。
所以实际上做的东西都很小,都只是实验性的,第二就是目前的工艺也难以支撑,在这个呃有量的这样一个低成本的生产过程,所以我觉得还是需要一些啊时间吧,第二个就是说嗯,meta由于考虑的更细的这样一个电磁波。
电磁场的一个数学模型,所以在做仿真和设计的时候,它所需要用到的这个理论和算力,远比我们目前用到的这个折射光学,跟传统的衍射光学要来得更深一些,所以从算力的角度来讲,还有很多研究的空间,这也是很多这个啊。
国内外研究小组织在做的事情,然后从这个加工的工业角度来讲,那目前还很难做的,比较量产化可控成本,但是我相信这也是一个方向,啊有同学问说LCD跟OLED未来如何看啊,这个我们之前前面有刚刚做了一个比较。
就是目前来讲LCD跟OLED有各自的优势和劣势,对这个未来怎么看,那其实也看各大厂商怎么在压榜,就目前samsub lg已经慢慢把宝往上,这个OLED这么压了,对这些大厂,所以怎么看,我觉得也看工艺吧。
对,好M设备跟VRR设备有什么区别啊,实际上这个是很有意思的,就是通常来讲,我个人会倾向于把所有东西都称为X2,就是X2,Y就是无非是大家给了一个不同的一个定义,在名称上面。
VR大家可以区分说是一个VTUAL,是一个argument的,那M是什么呢,我今天看到一个非常有意思的评论了,就是VR是什么,老师你梦到做梦的时候梦到有鬼,然后A2是梦到看到了鬼,那挨骂是什么。
挨骂是跟这个梦到看到了鬼,同时跟鬼有一个交流,所以实际上你可以理解为说,它是一个更进一步的融合的东西,我们AA2无非是对现实中的场景做一个增强,但是那可能是更进一步的融合。
有了更多的一个交和交流的一个过程,实际上这只是一种定义而已,啊对有同学回答了,说下一代的A2是没有VIVISUALAMOUNDATION,coffee的问题的一个哪种技术啊,对这个也是很有意思的。
我刚刚提到了学术界和产业界,在过去的10年之间,无论是光学或者图形学有了很多的这个研究,尽可能的去bypass这个visual,对但是呢啊还是没有办法做的非常好,所以我们可以想到有像一些裸眼3D广场。
包括这个全息,那其实大家很多人都把好运在全息上面,尤其是近年显示,那我们也希望说在全新经营形式上面,能做出一些成果来,就希望大家等着看吧,但其实很多人也在看这个啊。
学术界也在等这个apple grass对吧,就从产业和风向标来讲,我们还是希望苹果能够有一些引领的作用,对这个其实就是敬请期待吧,OK今天可能就直播时间先到这里了,因为确实也比较晚。
然后周晚上我们也不希望大家,耽误大家太多的时间,就如果还有问题和建议,欢迎随时联络,那下周的话我们可能会在通知,是我们下周应该是会有这个啊,伯克利大学的教授。
伯克利的这个呃一位讲者divine speaker,来给大家分享一下,WIFENCING的一些非常有意思的工作啊,那由于时差的问题呢,所以我们可能需要这个直播时间会有些调整。
我们在下周的时候请大家继续关注公众号,我们会进一步的通知,对哦,当然最后问题是,VR在解决舒适度上面有什么新成果,而这个其实这两年有一个非常有意思的工作。
就是大家听过可能叫做for vii t rendering,就是啊,因为人眼,实际上你只有在中间,在一个很小的一个for visual region的时候,你是看的高分辨率的,所以在舒适度上面。
大家会把这个i checking跟for via random,结合在一起去,使得VR的显示效果做的更好一些,对这个我们后面也会再找机会跟大家cover,那我们的公众号以及我个人的主页上面。
也有很多这方面的工作,就是如果大家感兴趣,也欢迎这个呃去关注浏览一下,那同样的就是公众号,如果大家有什么想要听到分解就解读的一些paper,也欢迎告诉我们,那我们会尽可能的去去收集大家。
一些感兴趣的话题,那当然目前这个公众号可能就是还起步的,比较啊粗糙对,所以我们这个啊因为我们这个是自发的,这个是个人学术号对,所以没有太多的支持啊,所以这个精力也是有限的,那么我欢迎就是如果有志的同学。
也可以跟我们联络,那一起加入到就是呃去做这样一个学术平台,交流平台的这样一个东西,就我们还是希望做成一个非盈利,非商业的,一个更加具有一些干货的一个学术交流平台,而不是发一些软文的公众号。
OK我相信今天因为时间也比较晚啊,就是祝大家这个周五周末快乐啊,同样的就是请大家继续关注我们的课程,那关于下周的这个呃emt speaker的,包括这个时间和title,我们会在下周二周三的时间。
在啊课程的几个啊群里面会有一个发布,请大家关注。
07.游戏中渲染管线、后处理和其他的一切 | GAMES104-现代游戏引擎:从入门到实践 - P1:GAMES104_Lecture7 整段 - GAMES-Webinar - BV1kY411P7QM
Hello,大家好,我是王西,欢迎大家回到games104,现代游戏引擎的理论与实践,欢迎大家回到我们这个就是内卷之王,就是老师和同学们一起卷的这个卷王之王的课,那么过去一个星期的话。
我们又终于卷完了我们的渲染的最后一节课,其实呢在前面的几趴的时候,我们跟同学们讲我们的课程的时候,我们也看到很多同学们的反馈,然后的话呢就有些同学讲,说我们这很多的课程的东西。
数据量就是那个算法量特别大,很多很多的算法,然后很多算法大家都听不懂,其实这个当时我也看到了,我也在一直在想这个问题,其实这里面的话我想跟大家分享一下,我自己这边的观点。
就是说其实我在准备这个课程的时候,我们课程组的话其实也非常的纠结,因为如果我们讲一些比较简单的,比较基础的算法的话呢,实际上它是能很容易把大家讲明白的,而且呢我一个算法假设留20分钟左右。
那么它出现的问题是什么,就是这些算法实际上在行业里面,大家已经基本上不怎么去用了,那实际上他已经有点absolute了,第二个就是我一直在思考,就是说games104克到底它的定位是什么。
我的理解它像一个通识课,什么意思呢,就是说其实游戏引擎啊,它真的是一个非常非常博大精深的一个,就是啊计算机软件系统,它几乎涵盖了计算机科学所有的知识,其实在全球,我觉得能够完整地知道。
就是现游戏引擎的所有的知识点,和方方面面的东西的人,应该是非常非常屈指可数的,也就是说这样的话,大家想象一下,如果这么难,那么我们怎么可能通过一个就是零基础,通过一个20个课时的课程。
我就能够听懂游戏引擎里面几乎所有的东西呢,这个其实在是实际上是做不到的,其实不只是游戏引擎了,就是游戏,你们就单独指一个东西,比如说渲染,其实就如果我们找到一个计算机图形学的,这个同学的话。
他能够把游戏渲染的所有的功能,全部都能想得明白,理解了透,实际上都已经是非常非常的难,所以当时在我去思考这门课的时候,我认为这门课它的核心是帮助大家建立概念,建立知识体系,那么让大家去理解。
这就是我一直在前面的课程给大家讲,就是说哎你不用特别care那个公式,那公式看不懂很正常,因为那个公式你真的要去推它,真的要去理解它,比如说积分,你们每个积分项,首先你的数学基础要够好,但这个不重要。
我相信很多同学都是有,这个就是大学的高等数学的基础,但是的话呢你真的去理解,那整个每一个光学的那个工具方程式的话,你可能提前要花一一周,甚至一周以上的时间去读那些的方程,那么为什么我讲公式不重要。
重要的是什么呢,是思想,因为你理解的这个思想,这些方法的思想的话,其实在你未来的工作中的话,可以举一反三,其实我们在我想象一下,我们104课程的很多同学的话呃,就大家将来真正去做游戏引擎开发的是很少数。
但是如果你真的理解了游戏引擎设计的,遇到各种各样的问题,他选择了各种各样解决的方法的话,实际上在你实际的未来的工作开发中的话,你很容易的就可以举一反三,那么其实这个东西的话,不仅仅是对于我们的这个。
比如说将来你成为游戏的影游戏开发,还包括比如说你可能是technical artist,就是那个一一就是那个TECHNR的技术美术,你甚至是自己做一些,比如说我可能是WEBGL。
或者是数字孪生的一些项目,实际上这些方法论对大家都是很有帮助的,那么我怎么去定位games104这个课程呢,我就觉得这门课程我们用两二十个小时的时间,帮大家建立,最正就是我们尽我所能。
对行业的这个就是比较主流的一些方法的,这个解决问题的方法,包括它的整个一个知识体系,然后呢,这样为大家未来的这个学习的话做好基础,而且呢我以前是做科研嘛,其实我我有一个经验,就是我在那个时候。
我老师经常让我去读那个前沿的科研论文,那个真的是很难读,真的我可以花一天时间只读一个算法,你都读不懂,但是后来我发现一个办法,就是说如果有一个人告诉我说,诶这个文论文它实际上就是核心点,就这三点。
然后呢当我听到了这这个三点的点播之后,我再去读这个论文的话,我的速度就会快非常非常多,因为我知道我该看的是什么,我该忽略的细节是什么,所以其实这也是我们的games104课程的话。
我最想给大家传递的一个东西,另外一个就是说大家不要急,其实很多知识啊我们听到了放在脑脑子里面,你当时不明白,但是也许几年后你在做另外一件事情的时候,诶,突然你在104这个课程上,建立了这样的一个印象。
这样的一个知识的这个方法,一下子就能蹦跶出来,所以我在我其实我自己在读书治学的时候啊,实践上我以前很信奉一个方法叫囫囵吞枣,就是说你先大量的吸收知识,然后呢吸收一遍,再吸收两遍,不懂没关系。
然后我再去实践,当我在实践中遇到一个卡点的时候,我会突然发现,当时我好像听过一句话,我一下子茅塞顿开了,所以的话这就是说啊,这是我自己作为这个课程的这个,这个主导创造者的话,我自己对这个课程的一个理解。
就是大家怎么去理解games104课程的逻辑,他的逻辑就是说,帮大家建立一个整个的知识体系,大家听不懂没有关系,公式看不明白也没有关系,但是的话呢你一定要就是听懂这些方法,听懂它的整个一个知识结构。
以及人们怎么把这些知识串在一起,你这样建立了一个现代引擎的知识的全部体系,所以在这个这一节课开始之前的话,我先啰嗦这么一段,因为这个因为我发现,其实后台我们同学们反应还是蛮热烈的,我知道大家有压力。
但是的话呢我们一定会就是说,既能保证同学们能知道上面的体系,同时的话呢我们也会让大家能入得了手,能够落得了,就是能够做得了的东西,那就是我们的小引擎,后面会讲到,那么今天的话呢。
实际上是我们的渲染的最后一节课,实际上前三节课啊,我相信同学们压力很大,我自己压力也很大,然后我们基本上把这个真的是,把一个至少30~40个课程的东西吧,压缩到了四个课程,但这个是OK的。
因为实际上这一课,因为我们讲的是整个游戏引擎嘛,所以rendering这一趴的话,帮助大家建立就是渲染的游戏,渲染的基础概念,大家千万不要轻视这里面所点的每一个技术,因为这里的每个技术都是经过很多个。
就是成百甚至上千的优秀的工程师,他们在实践中总结出来的这些方法,所以它真正的价值就在这个地方好,那今天的话呢我们开始第四节课,那我先一开始呢,从一个相对比较简单的东西开始。
那就从我们的这个AMBULLOCUTION,就大家看到这个场景,这个场景是没有任何渲染,没有任何shading的,就是没有材质的,他让大家看到没有,就是你会看到非常清晰的结构空空间感。
这里面有很多的那个几何的细节,那么它实际上在广场中,表现出了一定的明暗关系,这个明暗关系呢和我们传统的明暗关系不一样,它实际上是你会发现诶有个小凹槽,它就显得比较黑对吧,那么有个小突出它就比较亮。
这个很符合我们生活中的这个实践,这种细节的光影变化呢,实际上也是满足凯基亚的光照方程,但是呢它实际上在渲染的时候,是非常难以做到的,为什么,因为它这个结构非常的小。
我们在计算机同学里面一般叫做myself structure,就中尺度的这个结构,那么当在他对整个天光都在进行照明的时候,你会发现它表面的几何细节会有相应的响应。
那么AO这个效果呢在平时大家可能注意不到,但实际上在现代游戏渲染中的话呢,AO的效果是非常明显的,给大家看一个例子,这是一个场景,大家看到这里面用了pp r材质,用了很很漂亮的光照,看着很好看,对不对。
但是其实这张图里面缺了AO效果,那现在的话呢我们把AO效果一打开,大家发现没有,就是说这个图,一下子就有非常强的这个立体感了,因为人眼对空间的结构的感知机,完全是基于我们大脑的深度学习的结那个基础。
所以我们大脑对这种光影的明暗的变化,是非常敏感的,而且我们可以根据这个光影的明暗变化,构建了我们一个3D视觉,就比如说大家一直以为,3D视觉是基于这个双眼BAROCULAR双目嘛,对是的。
双目是一个很重要的,就是空间立体感的perception的一个基础,但是你即使只有一张图的话,我们人也可以在大脑中构建出一个,非常有立体感的东西,那就要通过这个光影变变化,而在这个光影变化里面的话。
ambient cushion就是环境光照,那么呃这个好像不是黄金广场,我都不知道中文翻译翻译什么话,我们一般叫AO吧,就是那么它实际上的话呢,是一个非常重要的一个视觉元素,其实在很计算机图形学。
到我们游戏渲染很早期的时候,大家就意识到了这个AO的重要性,比如说在我们去渲染那个他的数学原理,刚才也提到,就是说实际上就是对于我的表面上的每一个点,那么他在它的可看见的正半球面的话。
它只有部分能够看见天光,有些部分被他周围的几何给遮挡住了,所以呢就会产生了我们的AO的这个效果,那么这个东西有点像什么呢,大家还记得我们在前几课讲那个COOKTOYS的,那个材质模型。
就是BRDF表面上很多小面片,它有个选项叫geometry对吧,就是他讲的是几何的自遮挡,其实你没有发现,这个AO跟那个几何字上是不是很像,实际上这个呢如果你把相机拉拉的足够远的话。
那这个AO所表现出的数学方程的话,其实你会发现他和那个B2DF是非常接近的,所以我就讲就是尺度它是相对的,就是取决于我们相机的远近好,那么其实呢AO这个效果是非常重要的,那么在最早期的时候呢。
我们的做法是比较简单和粗暴的,那就是哎我们比如说做一个角色,实际上这个角色我们在就是大家知道,在ZBRUSH,ZBRUSH里面,我们去雕他们那个高精度模型的时候,是有很多很多细节的。
比如像这个人的皱纹啊,他眼角的东西,但是呢一旦我们把它变成游戏里面消耗的,用的那个模型,就是说是低精度的模型的时候,这些细节我们全部把它烘培到那个法向上去了,但是法向呢它只是一种明暗的变化。
它实际上不能告诉你几何的变化,而且呢在做渲染的时候,我们实质上也不能够表现出这种诶,就是因为你凹进去了,所以呢你周围的天光看不懂比较少的效果,所以呢在现代的,比如说很多建模软件里面。
他都提供了一个叫AO烘培的东西,就像刚才这个老人的脸,如果我们把它烘焙成这个AO图的话,你会发现诶就是这样的一个图,这个图看着有点吓人啊,这个其实你们如果看所有的这个游戏的资,资产图的话。
无论是帅哥美女,你去看他的贴图的时候,就看见一张脸被拉得很丑很丑,所以说帅哥美女再漂亮,摊在哪儿都是很都是很恐怖的,那么当当我们有了这样的一张AO的,在渲染的时候加上去的时候。
你会发现这个画面右边的那个角色,他的表现感觉完全不一样,那么这种PRECOMPUTER的AO啊,实际上在游戏行业里面,十几年前可能更早就已经在用起来了,而且呢效果是非常的好,直到今天。
我们接下来会讲一些更多的real time的计算,AO的方法,但是呢这个方法还是不能被取代掉,为什么呢,因为我们的AO计算都是基于你有几何的,如果你没有几个,就是你的你的表面的。
没有真的真真真真切切的那些小的结构的话,我就算real time的方法我也是算不出来的,所以这个方法目前在很多character,就是角色的表达的时候,我们还是很重要的一张图。
如果就像我们在上一节课讲到,就是大家如果画一个角色的时候,那么AO这张图的话,一般来讲会出现在你的资产里面好,这是我们最简单的就是用预计算的方法,我记得我们在我们的课程一直在讲,这个思想是什么。
就是凡事不取一计算,什么意思,就是说用空间换时间对吧,我在离线的算好,存储在那,那我在real time的时候,我只需要去直接三里就可以了,这也符合我们空间换时间的思想,那么但是的话呢。
你现在只能表达一个一个的物体,但是我整个给你一个environment的时候,你会发现诶这个好像不行,因为比如说我一个桌子放在这个地板上,旁边有个椅子,桌子和椅子的位置一直在变呢。
那我没有办法在地板上pre bake,就是预先烘培好它的AOCAOAO的效果,对不对,这个肯定是不对的,那怎么办呢,其实这个方法有一个很简单的方法,这个方法呢我先介绍给大家,介绍一个最基础的方法。
叫screen space ambinclusion,叫ASSO,今天的话呢同学们一定要记住很多缩写,就是在图形学,计算机的图形学,和这个我们的这个这个游戏的渲染里面的话呢,黑化是特别多的,全是缩写。
比如说SSLO就是指的是screen space,Ambient occlusion,这个听上去非常的高大上啊,但其实他的思想是非常简单的,就是说诶,你既然我我从我我的一个相机渲染过去。
我就会得到我的一个场景,对不对,得到我的一生图像,一种图像我们看到的是颜色对吧,这个RGB的颜色其实不止一张,图像里面还有什么呢,还有它的深度信息,如果我们把每个像素点的深度信息,连到一起的话。
那是不是就是一个high field,大家还记得我们上节课讲地形是high field,对不对好,那如果我知道一个height field,那实际上我实事实上它就是一个几何。
我是不是就可以估算这个height field,对它的各个就是它的每一个区域的自制导的,自自制导的关系是什么样子的,那么他就这么一个简单的思想,那怎么做呢,其实比较简单,就是说哎我从这个眼睛射出去。
一根光线交到了我看见物体的任何一个点,我知道它在三维空间的XYZ,对不对好,我给您一个半径,我在它的半径的周边,随机的在球形球形的这个空间里面啊,随机的撒若干个采样点,那这个若干的采样点的话呢。
我再用相机去投投射,其实我就知道它的深度那么好,它的深度如果比如说我这个采样点,它的深度比我现在在z buffer里面的深度要更近,说明什么意思,说明哎我这个采样点是在可以看得见光的地方,对不对。
那如果我的这个深度的话,比现在Z8分的更远,说明什么呢,它一定被当前汇制中的某一个几何给挡住了,对吧,所以这里面一个很重要的思想是什么,这也是我们今天课程反复会出现的,就是screen space。
就是啊其实我们虽然在游戏里面,对整个世界有一个完整的几何表达,但是呢我们在做很多运算的时候,如果你真的把那上万个物体对吧,上百万的面片做各种各样的几何运算,它的效率是非常低的。
后来大家就发现就说哎我在屏幕上,因为我有深度了,其实我就得到了很多,就是只是对这个世界一个局部采样的几何信息,用这个局部采样的几何信息呢,其实我们可以做很多的因素啊。
所以今天我们讲的第一个技术叫screen space,Ambient cushion,就是利用这个原理,其实后面呢我们会提到,比如说screen screen space,shadow map对吧。
Screen space reflections,screen space gi这些这些放东西的话呢,实际上都是从这个原始思想出来的,那我们今天先不展开,我们先讲SALO那么好。
这个时候实际上当我比如说我是踩了呃,60个点对吧,随机的那中间假设有32个点可见的话,那是不是就意味着说哦我明白了,我大概有一半的空间是被挡住了,所以我的光枪只有它的一半。
所以他就给出了一个非常简单的方程,就是这个我多少个采样点N个,然后呢我有有这个讴歌被ACUTION格被挡住了,那我可以看见的光强就是一减它的分子分母。
这是他screen space amiddle ution的话,最古老的一个方程,实话实说呢,这个想思想是非常好的,甚至有人专门实践过,但是的话呢说实话,我觉得这个这个方程可能是错的。
这个方式错在很多很多地方,那其中第一个我自己当年看的时候,我最诟病的东西就是说大哥,你这不对吧,因为我的一个面能接受光的话,它实际上不是一个完整的球,是一个半球面对吧。
那你现在的话如果给我按个点去采样的话,那么假设你是个完整的平面的话,你是不是一定有按概率分布,有一半的点是在那个下半球面的,对不对,那你就是本来平面上应该是没有AO的效果的,大家想想。
平面是不是所有的光强我都能看得见对吧,但是按这个工程方方程的话算出来,你就是个1/2了,所以这个这个方程现在用的人应该非常少,而且其实大家都意识到这个方程是有问题的,那么很遗憾就是我现在找到他。
那paper上语文真好,他真的是这么写的,当然有人他已经意识到这是他加了个0。5,但这个不重要,重要的是,我觉得大家首先要理解就是screen space这个想法,包括我在这个。
以我每一个就是眼睛射出去的像素,我对它进行一个立体空间的采样,这个思想是非常重要的,好那这里面的话呢大家已经意识到了,说我这个采样是多余的,因为我只需要踩半球面,所以呢基于这个思想。
我们呢就引入了另外一个方法,就是A我们只需要如果我知道你的法向朝向,我是不是沿着你的法向,只需要踩半个小半个半球,所以呢就有一个改进算法,我们一般传统叫做SSLO的加plus,就是它的加法。
那这样的话你的采样点就可以少一半对吧,而且能解决刚才我讲的那个artifacts,他的那个问题,所以说啊最早期的SO的话,据说跑起来的话,整个画面直接就全部给你按按了,也没给你解释为什么是这样。
但现在我们知道,其实可能是数学生出了一点问题,好这个方法呢是非常的简单,但是呢你说它好不好用也蛮好用的,比如说像这个结果,这是一个就是有SSAO的结果,那就是没有的,然后大家看一下哎。
有了之后你发现整个它的立体感就很好,但这个方法呢其实有很多的问题,比如说你们看那个交通,那个那个那个那个就是那个水泥灯,他那个背后那个地面上出现了很强的那个,AO的效果,那个AO效果其实是错误的。
为什么呢,因为它实际上那个离它已经很远了,它不应该对地面产生那么强的AO效果,但是呢在屏幕空间中,它没有办法区分这件事情,所以它会产生一个就是我们叫做artifact,就是说一个不应该出现的一个重影。
所以这就是一个简单算法,他所付出的代价好,那后面的人呢就会不停的去改进它,那我们继续看另外一个算法,这个叫HBL这个方法呢,其实他就已经部分解决了我们讲的问题,他说哎。
你现在不就是说要求一个在这个球面空间上的,你的可见性吗,那么我实际上从这个点出发的话,我沿着各个方向去转,我去找一个,就是他光线能越过他那个最高的那个邻居,几何的那个叫我们叫做叫peach angle。
就是向上的那个仰角,大家这个怎么解释呢,就是说假设我现在出现了AO,我就在一个山谷里面,那好我就问一个问题,假设我射一束光,我这时光的就是仰角要多高,能够越过这。
我现在能看到的那个就是仰角最高的那个山脊,对吧,我要越过它的山脊,实际上他就去找那个点,那么如果我在周边的这一圈的,这个点都找到的话,我是不是就可以得到一个,在这个就是我们的右上角那个图上,有一个。
就是那种诶高高低低的那样的一个覆盖图,那你知道这个球形空间的这个仰角的,这个采样的话,实际上我们是不是就能估算出来,说有多大的面积的天顶,它是可见的,有多大面积的,那个就是那个就是那个面积是被遮挡住的。
实际上就是用一个很简单的一个,你可以理解为这个离散积分的思想好,但这里面的话呢它就引入了一个hack,他加了一个叫attenuation的方式方程,就是说如果啊那个山离我太远了。
我认为他对我的AO没有什么变化,刚才我讲的那个artifact,对不对,那大家想想看,这个地方我的距离如果设计的比较短的话,是不是就会那个地方就是那个W它就变成零了。
所以就不会出现说其实距离你一个很远的物体,但是呢它还显示在我那边产生了个AO,所以HBO的话呢,它实际上就是一下子又解决了这个问题,那这个问题的话呢,它实际上它的结果呢相对来讲就更好一点。
但具体怎么做的呢,这里面就有很多的细节,但今天我的细节不展开了,你可以你需要大家需要知道的东西是什么呢,就是说它实际上用的是一个叫REMARCH,它又又是一个REMARIN的算法,Marching。
大家还记得吗,就是诶我一个像素一个像素的掌握,当然它是有个步长了,它不是一那个一个一个像素,但是呢它就会从那个点出发,他那个当然它的它的方向,它在每个每个每个点的时候,它会稍微坚持一下,就是要变一下。
为什么呢,因为如果我每次找的这个方向都是一致的话,你会发现因为你采样率很低啊,它会出现一些很明显的一些就是ALEX的花纹,就是大家如果学过信号和系统,就知道,就是说如果我对一个信号采样率特别低。
而且我采样的那个滤波气它是非常规整的话,那你滤出来的信号它本身是有很明显的pattern,所以呢他就加了个hack,说我加了一个JRAN,然后呢我就在那个pixel shader里面。
我一步一步沿着刚才我讲的时候,你的z buffer给你生成的那个,你可以理解成一个后面的一个height field,我去找我最远的那个攻角是多少,这样我就可以找一圈,我就可以算出我的值。
这就是HBAO的这个核心的想法,所以呢这个HBO的话呢,它实际上就是说它是基于一个半球面的一个,积分的这样的一个想法,这个想法实际上它的结果的话,实际上是比刚才我讲的SAO的效果要好很多。
二技能解决这个artifacts,但是呢这个HBO的话呢,实际上它还是有它的算法上,一个很核心的问题呢,这个问题是什么呢,就是大家还记得我们在前面讲材质的时候,大家想象一下我们天空还是个球,对不对。
从假设我的表面,大家想的最简单的情况,我是朝上的,那我从四面八方照过来的光,大家想想,他从天顶上射下来的光和从这边射下来的光,它的贡献值是一样的吗,同学们,还记得我们在前面讲一个漫反射模型里面。
有一个叫NUMBERATION的这个模型对吧,实际上在南边是模型里面,有一个很重要的因素是什么呢,是个扩散,因此什么意思,就是说你的光越是靠近靠近天顶的时候,假如那个角叫theta啊。
他cos cos theta为零的时候,那你的IRRADIANCE,就是你射出来的强度是百分之百的,被我这个表面给吸收了,然后呢我的反射是怕四面八方均匀的反射,所以说OK这是没有区别。
所以无论你从什么地方看,你看到的都是百分之百的强度,没问题,就是反射的就反射的强度百分之百好,但是同样亮度的光,假设是以这个比如说斜45度射过来的话,他的那个就是实际上就反射出来的光,是不是那个扩散。
现在也就是cos45度,Cos45,大概是二分之根号二吧,大概0。7左右,所以刚才他们在算那个球的面积的时候,就是在H,就其实在那个HABO和那个SSAO的时候,实际上呢他们都没有考虑这个因子。
所以他们算出来那个值啊全是错误的,那么这就说了,就这也是现在大家用的最多的,叫GTAO,GTO这个AO这个名字取得是非常的霸气的,叫ground truth。
Based ambient occlusion,ground truth呢是一个行业的通用语,就是说我和真实的值,或者叫我的基准参考值是一致的,ground truth一般我不知道怎么翻译啊。
就是就叫做正确值吧,或者说叫做我的这个参考正确值,也就是说他climb我的AO是符合,这个,就是真真正的,这个你你用那个离线算法算出来的结果,确实他的论文中也给出了这个demo。
就是说诶你会发现我们渲染的结果,和你和那个就是用蒙托卡罗积分,然后非常慢的去做的结果几乎是一样的,那么这里面的话就等于说,其实他真的把这个你表面的法向考虑进去了,那这样的话我就知道。
当你的光从各方面来的时候,你斜过来的那个天顶的那个,就是权重是要被打折的,你靠近天顶的那个面积是非常,贡献度是非常大的,所以大家去只要理解这个思想就可以了,那么这里面的话呢。
其实在这个ground truth a o里面,还有一个非常厉害的地方,这也是我个人觉得他们是非常聪明的地方,也特别希望大家能掌握思想的地方,就是说他们意识到一件事,就是说如果我们能算出来这个东西。
就是它的AO值是多少,我能不能猜一下这个光射进来之后,在这里面来回bounce,就是我们叫multi scattering,最后形成的亮度是多少,大家想想看,因为现在AO的话只是说光挡住了,挡住了。
光射到另外一边,那么的话呢它你看不见它就没有共享,但实际上跟真实的物理效果是不一样的,对不对,真实的物理效果,实际上你可以看到它的那个就是说呃,就是说还是会就来回在那个。
就是假设你个山谷光射到山谷的另外一侧,你在山谷底照射是最黑的地方对吧,但实际上因为山谷两侧的反光,你实际上那个底没有那么黑,对不对,而且还有一点就是这个里面的颜色的话,跟我山谷的周边的颜色是有关。
比如说我讲解这个山谷这边是绿的,这边是红的,那我这个股在这个山谷里面看到那个眼,那个AO的那个颜色是不是带色相的,这个听上去是不是很复杂对吧,我们是不是要做很多的积分才能得到这个结果。
但是呢这也是GTAO,我认为他这个名字叫gt,那个里面一个非常好的一个想法,他这个老哥做了一件什么事情呢,就是说它根据你不同的AO值,实际上比如说0。60。4,0。20。3,他做了一个就是大量的。
大家现在如果学机器学习的话,他就做大量的分析,对这个数值进行分析,他发现就是说啊,你的这个AO值实际上和你的multi scans值,实际上是有一定的关联度的,这个关联度当然不是一个简单的线性的。
然后呢他发现它里面符合了某一条曲线,然后这个曲线呢这个老哥就很厉害,给出了一个就是polynomial的,就是一个多项式的方程,这个方程呢大概是三阶的,你就可以用一个多项式计算。
你就能够根根据你的这个就是现在的AO值,我能估算出来,光在你们来回boss最终的结果,这个听上去是不是非常的神奇,觉得卧槽,这这简直就是就像我经常讲的,就是那个还记得在上一节课,我讲那个fog的时候。
就讲那个最新的那个就是那个fog的方法的话,实际上他就是只算了一次的,这个这个就是那个啊光的in那个single scattering,但是呢我觉得那个approximate multi screen。
他两个思想是不是有异曲同工之妙,那这件事情到底有没有道理呢,其实我个人觉得就是,他虽然在原来的原来的论文中,没有给出这个理论证明啊,但是其实我个人觉得他是在数学上是有基础的,因为大家想想看。
我们在算那个就是BRDF模型的时候,我们其实也并不知道他那个微表面上有很多,很多的细节结构,对不对,但是我们用了一个统一的量叫做RAGHNESS,roughness呢,就表达了它的几何的不平整度对吧。
大家想想看这里的AO那个值的话,是不是有点像那个小区域的roughness的值,也就表示了我周围对我的遮挡性,就是有点像BTM的那个G,如果你假设在这个表面上分布,大家基本上符合一个统计学分布的话。
实际上你用统计学的方法去算的话,这里面肯定是有一个关联度的,但这个关联度可能是个积分值,可能是个更复杂的方程,但是呢你再复杂的方程在某些情况下,你可以用一个比如说多项式去拟合它,这个在数学上也是成立的。
所以我个人觉得就是说gt a o的这个discovery,就是这个这个observer就是他这个发现啊,我认为它是有数学的foundation的,所以同学们,如果有人对这个东西特别感兴趣的话。
我会觉得大家可以深入研究一下,因为对于我们的graphics engineer来讲的话,我就觉得哇很厉害,你就用这个方法来解决了,那这也是回到我刚才在课程一开始讲的东西啊。
就是虽然我在这里面跟大家讲一个算法,其实本身作为一个GTO这个算法的话呢,我不需要花这么多久,这么久跟大家去讲,但是呢我个人觉得他的这个思想特别的好,就是从最开始的就是大家做SAO。
就是想到了用screen space方法对吧,我不用对整个世界进行几何的运算,到这个HPAO呢,你可以认为它是一个过渡性的一个产品,那么到了GTAO的话呢,是从数学上彻底的把这个问题给解掉了。
同时的话呢,他还观察到了一个很重要的一个性质,然后呢给出了一个拟合方程,这样的话一下子让我们的AO的效果,就是从一个简单的这种黑白分明,变成了有彩色有色相的这样的一个效果。
所以我个人是蛮喜欢这个这个这个这个算法的,那么呃哎哟我这边少了两张图,其实我本来有一张那个GTAO的,这个前后的图,其实特别在他给出了一个人脸,一个一个一个人的皮肤的渲染,效果是非常的好的。
那么AO的话呢,因为我今天的课程有限,所以我不讲了太多,希望大家注意的就是现在还有一个比较,现在慢慢越来越火的一个方向,就是real time retracing amazon clusion。
那这个大家都知道,大名鼎鼎的这个这个这个RTX对吧,就是我们所有人游戏没有return tron,好像都不是这个时代的游戏了,那么既然rotary tracing的数学,基础的核心是什么呢。
就是说现在GPU能够帮助你快速的做一个,recasting的这样的一个计算,告诉你说你到底有没有hit到,那么实际上我对屏幕上的每个像素我可以设ray,然后他知道我跟周围有没有遮挡。
但这里面呢其实有很多的细节,今天我不展开了,就实际上在如果你想做对的话,实际上你应该在屏幕上的每个像素点,在他的半球面射出很多关锐,对不对,但是呢既是地主家,他也不能这么造。
就是说你现在的GPU也不能跑的那么快,所以呢他真实的做法是在每一帧的时候,对于每个像素大概只对外设一一到两根瑞,但是呢他在这个时序上进行了一个,这个数据的收集,这样的话能够完成这样的一个球面的一个。
采样的近似,这里面有很多的细节,所以今天在这课程我不展开,但是我希望同学们关注这个方向的发展,所以AO的话呢基本上大家看到GTAO,看到retracing ammaccretion的话。
基本是现在大家比较前沿的一个,AO的一个方向,好了我们有了这个AO了,那接下来呢给大家讲一个,也是非常好看的一个效果,叫做fog,叫误校对吧,负,我觉得物小时,基本上所有同学都会注意到的一个效果。
那么fog呢其实它的原理啊,最最开始的这个,在游戏里面用的是非常非常简单的,我们叫做depth fog,它就简单来讲就是从你的眼睛看出去,然后呢随着距离你的透明度逐渐的下降。
那么大家想的最简单的方法是什么,linear fog对吧,就是说我用这个线性的方法,就是从一般这种fog我们会设置一个起始点,比如说特别近的地方,我们还是希望没有bug看得清楚啊,逐渐逐渐fork起来。
然后到了一定远处,这个fog就到了它的最大值,然后呢但是呢实际上在大家用的过程中呢,我们会发现诶用指数型fog是特别比较好对吧,然后的话呢大家一般喜欢用,就是二阶的指数型fog。
这个里面是非常非常简单的max,如果今天大家打开任何一个商用引擎吧,如果你选择那个fog,它最缺省的最简单的模式就是这个fog模式,大家如果打开unity的话,你可以看到我们这边的三种模式。
就是linear fog,Exponential fog,exponential那个squad fog,其实在里面都是你的选项,他的数学基础也是非常的简单,基本上就是我们的高中数学吧。
但是呢这个fog呢,实际上对世界的表达力还是有限的,我再举个例子,就是说大家看这个我们在真实践,你们会发现,就经常这个fog它实际上是有一个高度的,这个是原因很简单,就是fog它是一个气溶胶对吧。
它实际上呢很多时候会沉淀在靠近地面的地方,特别是我们在爬山的时候,我们会发现诶我爬上山顶的时候是没有fog的,但是我在山脚下的时候,我是有fog对吧,那包括就比如说我们在游戏里面,营造一种很恐怖的场景。
比如说这是一个大猎物,然后下面跑的都是这种什么什么有毒的东西,然后下面有一层毒雾,然后呢你站在那个裂谷上面,看下去那个下面的场景,所以这个时候就是也是一个非常常用的效果,叫做HIFK。
那HEDFG呢就是在计算机图渲染里面的话呢,他的假设是这样的,就是我的fog是有一个就是说哎最大值,就是当这个高度低于某个高度的时候,下面所有的fog都是那个fog的,最大的那个fog值。
但是当你的高度高于它的时候呢,我们认为你的fog的那个强度呢,是以指数在递减的好,那这时候我就问题就来了,就是当我一个人站在一个某个特定的高度,比如说那个ZV对吧,就是我的view的这个Z这个V呢。
我解释简单一点吧,它比那个fog的高度高一点,我看fog里面的一个东西,那我应该看到那个fog强度是多少呢,大家想想这个问题,这个问题呢其实它不简单,为什么呢,呃他不是一个简单的说。
我算那一点的fog是多少,我就我就是算出来的fog,他为什么不能用那个东西去算呢,因为很简单,就是说假设那个点正好是在那个,high fog的最高点的话,是不是从他到我这边来的时候。
它的fog的浓度会越来越低,越来越低越来越低,对不对是吧,所以说它不是一个简单的一个匀质的fog,那么大家还记得我们在讲那个,前面讲天空和大气的时候,我们遇到这种事情怎么办。
只有REMARCHING进行积分,对不对,所以说那我们只能一步一步的积分,那么其实这个算法呢,就这个效果呢其实很早以前就提出来了,那个时候大家就意识到说对啊,这个地方我确实要想做对的话。
我需要对它进行积分,但是那个时候我还没有能力,就是没在pixel shader里面一步步的积分,这个解释在那个那个时代的硬件是要死的,那怎么办,诶大家发现我对他作为一个做了个简化。
就是说我认为就是fog intensity,直接对你的fog的那个,就是它的透明度是一个线性相关的,那我就沿着这个路径进行,一个只对你的浓度进行积分,算出你个浓度值,包括算用它来估算你的透明度。
这个具体的计算过程呢我就不推荐,因为你会发现啊,这个函数如果都是E的自然对数的一个函数啊,你在对它进行积分求导的时候,你可以求出它的解析解,所以在真实计算的时候呢,你只需要把解释解带进去就可以了。
但是这个公式其实是非常简化的,实际上你的眼睛在fog就是那条高面以下,高面以上,你的物体在高面以上,高面以下其实还是有一点点区别的,那么包括就是说你的颜色就in scatter to fog。
给你的颜色在这个过程中也是一个积分值,那这里面的话呢就是说有很多小的数学细节,那今天我们就不展开,但是大家要知道知道就是说fog在古典时代,我经常讲古典时代什么,就10年前的3A游戏。
基本上DEPLOGHDFG基本够用了,那么但是在现代的话呢,就是我希望大家关注的一个东西,就是说诶基于体系化的这个fog,大家看到这边的效果没有,就是说诶我们的fog开始有这种体量感了。
比如说你一道光射出来的时候,我能看到一道道的光柱射出来对吧,这个效果是不是看上去非常的苦,那么很遗憾,就是刚才我介绍的那个就是depth fog,和height fog是实现不了这个效果的。
这个效果呢它是用什么方法实现的,它其实实际上是我们把相机空间的整个空间,进行WORKALIZE,大家注意啊,这个WORKSALIZE呢和我们以前讲的均匀的体系化,不太一样,你想空间中经营的体系化。
我根据XYZ对吧,我就把他一刀刀切过去,但是大家想想看,从我的人一眼看过去的话,我们是不是在近处的时候,它的很多进步是被浪,就是不够对吧,就是颗粒度太大,但是呢到远处的时候,它的颗粒度又太细了。
它实际上就是你产生不到你你想要的效果,所以聪明的这个就是graphics engineer,他们想了个方法是什么呢,就是根据我的视锥诶,以我的镜平面平面,用我的视锥进行切分。
大家看到那个上面那个黄色的那个切分图,你会发现就是他在近处,就离你眼睛近的地方切得非常的密,离你眼睛眼睛远的地方切得非常的远,这个时候他在这样的一个不规则的,就是不均匀的这样的,其实它是它是规则的。
但是呢它只是不均匀的这样的一个grade里面,进行各种各样的remarching in scattering,multi scussion的这个计算,这个计算的话呢。
其实它的方法和我们在上一节课里面讲的,算那个语音核算,那个sky的方法其实是大同小异的,所以说那个如果大家对这个fog,对于这种volumetric的,这种foggy的rendering的感兴趣的话。
你其实只要把上一节课里面就是怎么讲,算大气的方法看明白了,你就知道这个fog怎么算了,其实呢你把大型的东西看明白了,你其实就知道那个那个那个语音啊,他是怎么做的了,所以我在讲。
就是说我们实际上很很注重跟大家讲这个方法,就是讲这个思路,他的这个思想是一致的,那么大在工程实践中的话呢,我们一般会A构建一个3D的texture来存,这里面所有的中间计算的结果来看。
我们一般的分辨率怎么看呢,大家看到这里面这个数字非常有意思啊,比如说我这个3D texture呢是横160,总数是90,然后深度呢可能是64,可能是这个更高一点,128,大家有没有注意到。
为什么它的横竖不是我们在做纹理的时候,经常看到的那个二的幂次方呢,大家仔细看里面发现一个细节没有,就16比九是什么,是不是我们屏幕的resolution,所以呢他这个texture。
实际上尽量保持在屏幕上的一个像素块,我对他的采样是一致的,这样的话我这个采样出来的这个,比如说这些线条,这些这些结构看上去才比较好看,所以这是一个非常有意思的一个细节,但是如果大家自己去做的时候。
你就知道这个texture,我是resolution,我是不能乱射的好,那么这个就是这个现代fog的话呢,一个比较热门的一个方向,接下来讲一个大家特别不注意不到的东西。
就是所以今天我的这个课程标题特别有意思,我就讲个post process,这个render pipeline and everything,就是说因为今天是rendering最后收官的一刻吗。
我会讲到很多大家注意不到的东西,但是呢当你在做引擎的时候,这些东西呢又非常有用,它是必须要做的东西,反走样又是我们在渲染的时候特别头疼,又是要特别需要解决的东西,那么走样的话是什么东西呢。
其实大家仔细看啊,就是说其实啊我们在绘绘制的时候,不管我的算法显得多高级,最后我是一个像素,一个像素的把这个世界绘出来,对不对,那么每一个像素呢,你可以理解成就是对一个连续的,就是这个世界的一个采样。
因为真实世界的这个信号的频率,这个信号的密度是无限高的,对不对,但是我用一个像素,一个像素的去表达它的时候,那我是不是这个采样率是不够的,就像我们一张一个照片,在以前的时候。
数字数码相机那个精度不高的时候,我们看到那时候的照片,我们人脸上感觉那个色块很大很多的马赛克,对不对,但现在数码相机的分辨率越来越高的时候,我们发现这个马赛克越来越小了,那么其实aliens的话呢。
本质上就是因为我们的屏幕的resolution,他是有限的,而呢我们的要表达的后面的几何世界,它的频率是非常非常高的,那举个例子,它这里面有三大源泉,这是我个人总结的不一定正确。
就是说第一个呢就是由几何导致的,比如说我一条一个一个几何的边,它只要不是严格的横平竖直的话,那你在这个屏幕上一个像素一个上踩过去的话,它一定是会产生这种ZC的这个效果的,大家想想是不是。
就像刚才我一开始举的那个例子,就是字体的例子的时候哦,它的采样就是不均匀的哦,这个例子在后面,不好意思,那么第二个的话呢,就是说哎我的在这个就是在这个物体系表面,表面,我有很多的细节。
比如说texture,那么texture的话呢,它的采样就是当我在不同的角度去看的时候,这个texture就会产生各种各样的artifact,就是就像这个中间那张图展示出来那个摩尔纹。
但是texture这个采样的aliens的话呢,是由我们在前面课讲的就是mid map解决了,就是说OK你如果很清晰的看我texture,我就我就直接把你预先filter到了,最核心的那个点啊。
最远处的那个mp去了,这样的话你这个效果也没有了,还有一类的A类型资源呢,是大家其实平时注意不到的,就是说实际上对于在场景中,很多高频的就是非常容易变化,所所谓的高频就变化,它的幅度可能很小。
但是变化速度非常快的这种东西,比如什么东西呢,高光大家想想看,我拿一个很光亮光亮的东西,当我去动它的时候,它上面的高光流动是不是非常的迅速对吧,我我稍微转一个小小的角度,它的高光就一瞬间就流动了。
其实高光也是在游戏里面产生,很重要的一个一个源泉,所以其实这些所有的东西都会让整个游戏,画面变得非常的难看,就是说如果一个现代游戏啊,如果我把他的NTLS给关掉,打开的话,你会觉得是两个游戏关掉之后。
你觉得整个眼睛都在闪,我相信很多同学喜欢玩游戏的,都知道我在讲什么对吧,我们在游戏里面那个那个GRAPHX设置里面,经常有你要四倍AA还是这个更大的A,这都是你的选择的对吧,现在一般都是4XA吧。
好像是好,那么怎么去这个把这个alien给去除掉呢,这就是我们叫做anti anything,就是跟ALEX作战对吧,这就是刚才我提前讲的那个图,就是说,其实所有的这个就是去除那个alien的方法。
它的核心思想都很很很简单,都是一个思想,就是说OK我知道我在屏幕上,每个像素它的采样是不充分的好,那我就多采样几个,就我们一般叫做SUBSAMPLING或者sub pixel,我就多采用几次。
那这样我采用出的值的话,它就有变化了,对不对,我把这些变化的值呢,我对它进行一个平均平均之后,虽然我这时候你会你会发现,就是说它不再是那么硬的一个边界,它会产生很多过渡区域。
这些过渡区域在一个个像素你看起来的时候,它就显得很光滑,举个例子,像刚才这个字体,以字体为例,就是现在同学们你在电脑里面打的所有的字,他都是true type,出tab是什么呢。
它都是矢量的这个字矢量的字的话呢,它的精度是可以无限放大的,对不对,但是它在放大的时候,实际上它的那个你的屏幕的分辨率是一定的,所以如果你仔细去看的话,你会发现诶它最终会形成一个一个ZC的结果。
你看到那个这边的那个就是靠啊,左边的这个没有被A类型过的,这个NTA类型过的这个A字,那么但现代计算机在渲染的时候呢,我们一般都会打开NTA型的,所以你如果在电脑上看到那个A的时候。
你会发现它的边界不再是一个明确的零一变化,虽然你看起来好像觉得是零一,但实际上他做了很多的这个超采样,让你看到了那种A半透明的那个区域,这个区域你怎么看呢,就大家如果眯起眼睛去看的话,你就能发现诶。
那个好像这个右边的这个A,看上去线条更平滑一点,这就是NTA类型,就是我们叫做AA的一个核心的思想和它的效果,那好那在我们的这个渲染中的话,AA这么重要,那我们怎么做呢,先给大家介绍两个非常简单的方法。
第一个方法呢叫super sampling的一个ASSA对吧,那这个方法呢它其实是非常的简单和直接的,就是说OK你不就是要超采样吗,假设你现在要绘制一个1024×7,六八的一个图像,对不对。
我把你所有的尺寸double一下,好不好,我会这个2048对吧,乘上一个这个E4多少的这样的一个尺寸,然后呢我把这个就是四,这就是传说中4X对不对,我把你这个4X倍大小的这个图像。
我把它作为一个当SA对吧,我甚至更高级一点,我做一个小的滤波,Ging filter,诶,我把你变成我下面的那个结果,那么这就是一个A很好的一个anta lien的方法。
这个方法呢其实它是一定是work的,但是呢他付出的代价就是说哎呀,我这个无论是我的z buffer呀,还是我的这个frame buffer呀,包括我的所有的pixel shader的渲染呢。
都付出了额外的四倍的代价对吧,那么就是说这样的话呢,实际上就意味着说如果我的显卡足够牛逼,那我就用这个SSA,但是呢这个实话实说,好像现在的游戏引擎中,已经很少有人用这个方法了。
那么这里面大家就会观察到,一个非常有意思的事情,就是说刚才我们讲了,就是说哎alien产生资源最多的是什么,是发生在这种几何的边缘,对不对,比如说以这边的三角形为例,你会发现啊,如果我想对它进行超采样。
你会发现这个三角形中间的大部分的点,其实我不需要进行超采样,为什么它都在我一个三角形内部,对不对,我用中间的那个颜色大致代表一下,应该问题也不大,他真正问题出在什么地方呢,是出在那个诶边界上的点。
就是我那个像素,我我站了一点,但又没有完全站,那个时候可能是另外一个三星在那边了,所以呢后人呢又发明了一个叫MASA,叫multi sample a n t a s那个MA的思想呢。
其实实际上就非常的简单和淳朴,就是说我虽然对这个空间还是四倍的去采样,但是呢当我在做shading的时候,我会去看说如果我这四个sub3,SUBPIXEL或者叫SUBSAMPLE,都落在同一个节目水。
就其实他反射它它它算法的时候是反过来的,是说这个triangle coverage,对这四个采样点是百分之百的话,那我只是一定一次,但是呢如果我在这个四个采样点中诶,不止一个赛团队贡献的话。
那我把你们都设定一下,然后我算一下你们的average对吧,根据你们的采样点的占的比例,比如说比如说四个采样点,四个四个四个sub su的点,那两个人各占一半,那好我们讲解二一添作,五一人一半。
如果你三我一好,那你就是75%的权重,我就是25%的权重,那么这个方法的话呢,实际上非常的有意思啊,这个方法实际上是啊,现代硬件基很早就已经彻底支持了,所以说当你去做一个游戏研发的时候。
你说我打开一个功能叫MSA的话,就是一个flag打开之后,这些所有的计算硬件把你全部做掉对吧,他就不用你再去操心,但是呢这个算法实际上呢他还是要付掉,就是四倍的,这个就是说啊这个这个z buffer。
四倍的rust rization的结果,然后呢,就是说它的frame buffer其实也是需要四倍的,但最后的话他会就只是在做pixel shading的时候,他会帮你跳的很多不需要的那种渲染。
这个方法其实是非常好的一个方法,但这个方法其实也是有它的问题,它的问题是什么呢,就是说在我们现代游戏下面下面啊,其实我们的这个就是说,我们的几何密度是非常非常高的。
就是就像大家我们在后面高级课程跟大家讲,我们的NANA的技术点吧,NANA的技术点是什么,就是我们client说我们在一个场景中,你看到的船购的数量会超过你的像素数量,那么密的三角形的话。
大家想想看MCA是不是会彻底彻底的失效,对不对,所以说的话呢这个也是一个非常古老的技术,但这两个技术呢,实际上就是那个SSA和MSA的话呢,你看今天那个术语太多啊,但大家记得就是这个MCASSSSA。
你看我这经常会弄混,那么它是一个就是上古时代的一个NTAS的,技术,很简单,但其实还是蛮蛮蛮实用的,但是呢其实也是比较古老的好,其实今天的话呢其实anta lion算法的话呢,实际上有很多很多的变种。
但今天呢我只跟大家着重的讲两种,NTA类的算法,因为我个人为什么选这两个方法,第一个是在工业界,现在大家觉得这个方法都特别的好,更重要的一点是什么呢,就是说它代表了两个非常巧妙的思想的,这个方向。
那么第一个呢我们叫做FXA,它的它是什么缩写呢,叫ffast approximate antella,从它的名字你可以看出来说,我是一个快速估算的anti的算法,这个方法是什么意思呢。
就是说啊你就不要那么笨了,就是把这个采样做大对吧,采样做大学不会啊,我现在就给你原始图像,你有没有本事帮我去做他的NTAC,你看这个问题是不是很难,就是说就像老师说,老板让你把生意做得更好。
但是又不给你更多的本钱,这个头很疼对吧,诶但是这个就是这个FXA,他就是说诶我要发挥我的聪明才智,发挥我的主观主观能动性,他怎么做,他说你们在做这个NT类型的时候,不都是在那些边界吗。
比如说高光颜色在高速的变化,或者说一个一个三角形,它发生折线,快速的折到另外一边,那其实这个时候会产生什么呢,产生这个颜色的跳变,就是大家如果学过computer vision的话。
就是计算机视觉的有个很重要的领域,叫做ag detection,就是我会把这个画图片中的很多edge,给它提取出来对吧,那么他说如果我在这个你生成的这一帧画面中,我帮你把所有的这个A级提取出来。
我只在A级的这个地方,我采用一些聪明的差值的方法,我是不是也能产生一个这个反走样的效果呢,唉这帮人说干就干,他首先干第一个事,就是用了一个非常简单的十字形滤波,就是说啊我对于每个像素点。
我把你的这个左右邻居上下邻居加在一起,我去算你的这个这个差异值,当你的这个综合差异,就是平均差异值大于了某个阈值的时候,我说不好意思,老哥你就是一个边界,而这个阈值是多少呢。
他首先是把那个整个这个图片啊,转换到一个就是亮度空间,亮度空间的话呢就是个颜色空间的概念,就是说我们的看到图像是有颜色的,对不对,但是呢其实每个颜色对亮度是有个色感的,这里面就是在这边的话。
就右边有个公式,就是那个你会发现,就是绿色的亮度贡献是最大的,蓝色亮度贡献是最小的,红色是居中的对吧,这个这个数值是非常了不起的经验数值,这个基本上你们所有的做这个。
就是把这个比如说财大家在玩手机的时候,特别喜欢把这个彩色照片变成黑白照片,很有艺术感,对不对,那基本上你就用这个公式一算,你就可以迅速的把一个彩色照片变得,变成黑白照片好,我变成了黑白黑白照片之后。
我对每个像素对它的上下左右几个邻居去找我,比较一下我们的色差,如果我们的色差综合色差超过这个阈值的时候,我就说不好意思,老哥,你就是我的一个边界点,你就有可能我需要对你进行NTA类型了。
那这个时候呢他就拿到了每个点,比如说以这个为例子啊,我们这边取了一个很小的一块铜线,他就以那个高亮的绿色的点,他就说哎呀,我这个颜色变化到底是这个竖向的变化多呢,还是横向的变化多,因为我要是反走样的话。
是不是我要和那个跟我差别很大的,那个这个像素进行这个blending,对不对,他其实呢用了一个非常聪明,而简单的这个一个卷积算法,就是诶他沿竖向转了卷了一下,加算了个绝对值,横向卷了一下,算了个绝对值。
基本上就是一个9×9的矩阵啊,3×3的矩阵拍上去诶,它可以判断出来,好像比如以这个例子的话,我的横向好像这个差别大一点好,我的横向无非也就是左边和右边的邻居,对不对,他在这比较说诶。
是我左边的邻居跟我这个差距大一点呢,还是我右边的邻居跟我差距大诶,他这边一看我的我的右边的邻居是一,我是零对吧,那我肯定是右边的领域上,他就得到了一个叫offset的朝向,意思就是说。
我如果要进行ANTA类型反走样的blending的话,我应该跟他去,本来定,因为我们两个差距大,大概率是在这个地方会出问题的,对不对,这个方法是不是很简单,很直觉,好有意思的地方就来了。
你有了这个blending的话,我不能够很粗暴的blending吧,这个是他想法特别巧妙的一个地方,就是说OK那我从我的这个点出发,我向上的那个那个就是我应该不在那个点,我们形成一个对。
我们之间呢求个平均的这个强度值,然后呢我们就沿着这个,你刚才不是讲了一个方向吗,你一个朝上的方向,那我的perpendicular垂直的方向就是左右,对不对,我沿左边沿右边就一直找,找什么呢。
找就是如果我找下去一对一对的像素,如果呢你的颜色变化跟我是差不多的好,我认为我们是一伙的,我们就不动,但是呢我一旦找到说诶你的两个相邻的pixel,它的颜色变化一下子发生了巨大的,这个就是跟我不一样。
比如说你找到最这个最左边是两个白色的像素,它两个颜色是一致的对吧,好像跟我不一样,对不对,他找到最右边诶,发现两个都是黑的,它的颜色变化也跟我不一样,我等于什么呢,我找到了一个边的两个端点。
唉这个地方是他最巧妙的地方,好这个时候它有意思的地方就来了,他呢就把我的左边这个端,右边这个端两个长度进行比较,唉这个比较就告诉我什么呢,就告诉说我是更应该去听我的,这个就是我自己一点呢。
还是更应该听别人一点,但这个地方这个数学我就不展开了,其实它的基本的原理是什么呢,就是我们小时候学的那个相似三角形,三相似三角形的原理,因为这里面都是一个正的矩形吗,那你在里面做任何一条切线的话。
你会发现啊,它的这个值你根据两边AG的长短长短的话,你就知道你在这个上下的这个距离是多少,大家想像三角形的原理对不对,所以他就用一个非常简单的原理,但是呢它就可以算出来,说我每一个点我去真实渲染。
它采样的时候,我应该采样的时候往上移一点点,往下移一点,就是因为你想想看,我在绘制的时候,实际上我是一个差值,所以说我可以取一点我周边领域的颜色,这里面利用了就是我们的显卡的这个texture。
sample领域的机制,我现在之前课程给大家讲解,text3里的核心是什么,Blinear interpolation,相当于说我只要把它坐标往上移,零点几个像素的话,实际上我就可以取我领域的颜色。
3632非常巧妙,它巧妙的地方就在于是说,每一个点他只自己这么算,每个点自己找自己的H,但是呢当所有点算出来的时候,他就能出现右边这样一个结果,大家看右边那个结果是不是很帅对吧,所以其实啊我想这个算法。
为什么我觉得他很很有意思啊,它基本上只用到了,我们大概呃初中的这个数学知识,真的是平面几何的知识,连立体几何的知识都没有用到,只是用最简单的颜色,然后呢比大小比边长长短。
但是呢它没有让你多绘制任何一点东西,但是他就把一个基本上可以接受的效果,给你绘制出来,那这里面的话呢就有这样的一个结果,你看比如说像这个城堡对吧,它的右侧他这里面的几个图呢。
第一个图就是那个黄色和蓝色的图,就代表他找到了方向,哎我到底是vertical的多一点,还是这个horizontal,就是还是还是数值的多啊,还是那个数值的多一点,然后呢,接下来几张图就表示说诶。
我要去找到它那个颜色到底朝左朝右,朝上朝下对吧,还有呢接下来那个图的话表示说诶,我我应该根据我的找到了那个边对吧,我应该往我的邻居往哪个邻居去靠,然后最后它形成的结果。
大家看一下那个结果是不是还是挺不错的,其实FXAA的话是一个非常实用的一个算法,而且包括其实现在现在现在显卡里面,基本上就直接集成了这个这个方法,效果也非常好,那么它的速度呢实际上是非常快的。
我我们像我们就是一个商业级的游戏的话,很多时候大家也在用FXFXA,这就是一个非常好的一个思路,这就是我讲的,就是哎我一辈的什么都不都不去做额外的信息,信息,我只是对这个数据进行观察和处理。
我也能对它进行这种反走样后处理,那么这是一种流派,那么第二种流派是什么呢,是ta但但这个我不展开去讲了,就是它的核心思想是什么呢,就是说其实你不就是要反走样嘛对吧,那有个简单的方法。
就是说这个在这个世界啊,我对他渲染过去渲染了很多针,其实我在你过去的帧里面,我只要找到这个像素对应的时候,我把你的那个信号拿过来,跟我进行加权平均的时候,实际上也是完成了一个信息的blending。
对不对,这个思想其实非常的重要,其实在我们很多现代引擎的算法里面,我们都用了这个就是叫temporal,就是时序上的数据,就是我这一帧我会利用前一帧的数据进行计算,那这里面就引入了一个很有意思的概念。
我们叫做这个motion vector,就是说我当前像素看到的每一个点,他在上一帧的上映的时候,大家知道吗,它自己会动,对不对,然后呢它的这个这个这个相机也会动,那我们就找关系了。
说哎我这边呢现在我脸上这个点,我在上一帧的时候,它的像像素的什么地方,那我如果动了之后,他的vector就会往这边走一走,这个地方,当然这个地方很很复杂了,它其实是在渲染那边,我要做这个准备。
但是呢你有了这个东西之后,实际上你就可以和上一章进行这种blending,那么他这个ta的聪明在什么地方呢,就是说他也是不需要你去做更多的采样,但是的话呢我在时间轴上找数据。
我也能进行我的anta lion的运算。
那么就是这这是一个TA的一个效果了,就比如说这里面一个鼓,一个角色站在桥上,这个角色是在动的,你会发现就是说对于静态物体,但是这个时候相机是不动的,就是静态物体。
它的motion vector几乎是黑的,就表示不同,但这个motion vector实际上是放大了很多倍了,那么对天上的云在动,包括那个角色在动的时候。
它的motion vector就是有有就是有值的,但是我们对他的,因为它是有方向性的嘛,我们对它的PVE方向进行了RGB的CODEC,就是进行了编码,然后呢我们再去算他之前的布兰妮的权重。
这个布兰妮的权重指的是什么呢,就是我当前这一章的执行度,和我过去的一针的执行度,你会发现这里面有个有意思的细节,这是我们在做的时候,我们经常会用的一个hack,就是说呃当这个物体在高速用运动的时候。
我们会更加的相信当前这一帧的结果,然后呢不会过度相信过学生的结果,但是呢如果这个东西的话呢,就是它基本静止的话,那两边的权重是差不多的,所以的话呢你会发现这个权重,对于这个就是运动的东西的话。
他当前的权重会略高一点,最后你形成的结果是这样的一个结果,所以ta的话呢,现在也是游戏引擎里面非常主流的一个,NTLS的一个算法,在这里给大家看一个就那个实践的结果,这个结果的话呢实际上它不是游戏了。
它实际上是NVIDIA自己做的一个一个一个一个demo,从效果上来看其实还非常的好,大家能注意到就是比如像高光啊,像那个几何细节,当你的这个ta的没开的时候,它有很多的抖动,特别像那个吧台上的那种高光。
大家能能不能看得到,但是我不知道直播推流的效果会怎么样,那这里面有一个细节啊,就是说有没有发现就ta1旦开了之后,它的像素和它没有开的时候有个小小的错位,这是为什么呢,因为你的相机一直在动对吧。
但ta我老师要跟过去的那个图像进行blending,所以呢它会有一点点小的offset,这是我个人认为ta的一个问题,而且ta做不好的时候,有时候会出现一些残影,这也就是说你在时序上的比较的时候。
出现的问题,所以啊ta FX a对吧,实际上是现在比较主流的,NTAS的这样的一个算法,讲到这儿,基本上我们的渲染从几何地形,天空语音fog天,还有这个就是说AMAINCLUSION对吧。
ANTELINE基本上有了,讲到这,大家是不是觉得哎,我们的渲染是不是基本上已经ready了,但是呢事实上我们还有一个非常重要的一个part,没有上来,就是我们叫做后处理。
其实这边我刚才本来放了一张图的,就是这个后处理啊,对于整个游戏渲染来讲,我个人一直认为是个美颜相机,就是所谓3A大作,你只要把他的后处理这一趴给关掉之后,你无论上什么高端的渲染,你看起来也就那么回事。
但是呢你一旦上了这个滤镜,上了后处理之后哇,那简直是你一看就是大片感就出来了,我相信很多同学喜欢玩摄影啊,喜欢做这种图片梳理的人,都知道我这句话在讲什么,那么后处理对于游戏引擎渲染来讲的话呢。
就是它的这个大滤镜对吧,就是美颜美颜相机,那好那后处理到底有哪几趴呢,今天呢我讲的就相对比较简单一点,就是说我讲几个就是最常用的就后处理啊,其实他无非也就是两个目的,第一个一一类。
目的呢是为了它在物理上把它做正确,比如说我要让这个画面正确的被曝光,大家想想我们我们拍照的原理对吧,我们相机拍照整个真实世界的那个,就是那个它的光强和明暗变化,幅度是很大很大的。
就是一个太阳光可能是一个烛光的几亿倍对吧,但是的话我拍到一张照片上的时候,诶我要进正确的曝光对吧,我才能产生我想要的效果,那么还有呢是什么呢,就是说哎我还有一些光晕的效果对吧。
那么这都是这个我们叫做物理真实的需要,那还有一个是什么呢,就是哎我要有些风格化的表达对吧,这里面就是著名的这个就是color grading的效果,所以今天的话呢我只讲三个效果。
就是这也是三个我认为是最常用的效果吧,第一个是blooming,第二个呢是这个同map就是曝光,第三个代码是color grading调色,你看就是先给你上光晕,美元的光晕。
第二个呢我帮你给你曝光团队对吧,第三个呢我再给你整个画面调色,基本上一个漂亮的美女就这样可以产生了,我们先讲什么叫blue嘛,布鲁米,其实在那个游戏里面是非常常用的一个现象。
就是你在游戏里面看到很多霓虹灯啊,强光晕啊,你是不是觉得光有点刺眼,那这个效果呢就是bloom effects,那么bloom effects的话呢,实际上在就是物理学。
在我们的这个计算机的引擎里面或者渲染中,我们经常有一些讨论,就是这个到底什么原因,为什么我看了那个强光,我能看到旁边的一些光晕,那么这里面有很多种解释了,毕竟第一种解释就是,他觉得我们的人眼跟相机一样。
相机大家知道有个光圈对吧,对于任何突破性的成像的话呢,实际上因为它并不是一个完美的小孔成像,它实际上并不能完美的聚焦到一个焦平面上,所以它就会产生一些这个散发发散,那发散的话呢。
这个叫every disk这样的一个东西,你可以看到这样的一个disk,那么这是一种解释了,其实还有一种解释是什么,他认为我们人眼里面的晶状体里面是很多叫。
还记得上节课我们讲的叫participant media,就是半透明材质诶,这种半透明的材,这个叫这种这种叫,就是这个里面有就有介质的材质吧,这个中文真的不知道怎么翻译。
就是participating media,然后呢,他说这些partician media呢就跟气溶胶在里面一样的,就是它会产生这个miss gathering。
大家还记得什么叫miss gerine吗,就是说那个光照过来之后,它会沿着光的方向,产生一个有迹象的这样的一个反射,对不对,那么好,当光射过来在我的眼睛里面,我眼睛里面很多小液珠啊,小液体在里面。
它会产生一些反射,所以这些反射在我的这个视网膜上,形成这样光晕的效果,那不管它什么原理吧,但是这个效果是我们是真实能看得见的,对不对,包括我们可以看到就是有些那个照片啊。
它实际上也能产生这样的一个不入门的效果,那么好,那怎么去做它呢,其实非常简单,就是诶我渲染出一个光照出来,对不对,那我首先呢把它高亮的地方给它取出来,高亮的地方怎么取呢。
首先第一步我要把整个画面转成一个,我要算它的int luminous,就是它的亮度,大家还记得前面我们讲的那个亮度算法,对不对,就是ARGB3个颜色给个不同的权重,绿绿色高一点对吧,红色次之。
蓝色最最低算出它的亮度,当它的亮度超过某个阈值的时候,我们就认为哦大哥你这个地方很亮,那么这个阈值呢说句实话是一个magic number对吧,那么最初的做法就是大于一。
但实际上这个一呢在现代游戏渲染中,其实我们认为它也不一定正确,因为现在游戏渲染中,有的时候我们基本上都是HDR的那个光强的强度,幅度会非常的大,所以有的时候我们有的人会选择,这个平均的广场亮度啊。
这种方法来算啊,这个我觉得会更好一点,那么他的就把所有这种,我们认为他的那个LUMINANCE,就是它的亮度超过我的阈值的区域,全部把它取出来了,但是呢记记住它取的是它的颜色。
不仅仅是它的那个就是它的强度好,当我取出这个东西的时候,其实呢我们图形学的精神就来了,就是凡事不行,我就hack一下,我就给他B乐一下对吧,那我们就上一个大名鼎鼎的高斯不乐。
那么高斯bl其实是非常简单的,比如说我们上一个5V5的,这个就是55的高斯bl,就是在二维空间做不了的话呢,实际上它高斯的方程,它有一个很巧妙的一个特性,就是说假设我做一个5×5的卷积的话。
实际上它可以通过两次,就是五个像素的卷积就可以实现25-1,这个讲解来说有点细节了,但实际上你可以理解成就是说对于每一个点,我第一个pass把它上下的就是上下的这个五根相。
其实是上下的两个相邻像素把它合到一起去好,我形成一个结果诶,我第二个pass的时候,还是每个点是那是上一个pass的结果啊,把它左右合到一起,你把这个最后合到一起,它的数学结果呢,就相当于你在每个点。
把周边25个像素全部取了一遍的结果,这个呢实际上就会让你的,比如说我我假设我的高斯的卷积的课程都很大,比如说我是一个九个像素,就是这个九以九为半径的这样的啊,久为直径的这样的color的话。
原来我要卷80一个数值,但是在这里面的话,我只需要卷19个数值,所以这样的话我的那个计算量就会小很多,所以呢我加个高兴的话,我时常就可以得到我的B入门的这个区域,那么哎但是呢这样不露出来的区域。
不漏出来的区域呢其实是不够大的,大家想想看,如果能真的形成我们这种朦胧的效果的话,大家想想那个坑的有多大,可能要几十个,三四十个,四五十个,那大家想想,就算是我用这种快速的方法的话。
我一个每一个像素点我要去卷上百个数据的话,这是不是很疯掉了,那聪明的这个人类就有个方法,就这也是一个非常经典的一个方法,就是我用一个pyramid的方法,就是说我对这个图像不断的进行。
当三我在他最低的一节用一个color去,不乐的话,你想想看我对它进行这个不热的效果,经过一级级的放大回来的时候,是不是这个光晕就很大,所以他的做法其实非常简单,就是哎我在最低的一届。
我对它进行高速bug,然后呢把它放大之后,跟原来的图再加到一起,但注意啊,这里面加的话是有个权重的,这就是一个图形学的一个黑科技了,就是你这个权重到底是,比如说原来的那个图是0。5,这个图是0。5。
还是原来那个图0。3,你这个图是0。7,这个呢每一家都是自己设的,其实每一个引擎给的方法都不一样,甚至这个东西我可以开放给艺术家,然后呢就是说我每一层加回来,再对它进行一次不乐,然后再把它放大。
再跟上一集合到一起,加全合到一起再放大,最后你能得到一个这个光晕的很开的结果,但是你的计算量的话呢,它是远远小于你在那个最高精度的图上,进行一个大的放大,其实这个思想啊其实在渲染中非常常见。
就是我我我们在后面做很多预算的时候,实际上我们经常讲叫half resolution,或者说我用这个MIMP的方法,一层层从从低往上算,都是降低我的计算的复杂度的一个方法。
那么你最后得到了这个bug的这个,这个这个这个就是bloom的效果图的话,你把它叠加到你原始的图上的话,你就能得到一个非常漂亮的一个blue的效果,所以这就是一个啊非常简单,但是呢又非常重要的效果。
因为在现在游戏中你可以看到,就比如像这个里面,如果你把bloom效果关掉的话,那么你看到的这个场景的艺术感,就会小很多对吧,那么所以说这是一个非常基础的一个,后处理的效果。
那么另外一个后处理效果是什么呢,就是我们叫做tm mapping,那么这个通病呢听上去这个很陌生啊,那么它其实解决的问题是什么呢,其实在我们相机中的时候,经常用的,就是说大家知道。
就是比如说你们有没有这样一个经验,你如果啊去大家如果有去过教堂或者是大礼堂,大礼堂的话呢,白天窗子那边会非常的亮对吧,你进去之后你会发现诶,你看的是窗子也看得清楚,然后里面的东西也看得非常清楚,对不对。
但是这时候你如果掏出一个手机,拍个照片的时候,你大概率拍出来的是,要么就是里面的东西看得很清楚,窗子那边已经爆掉了对吧,要么就是窗子那边看得很清楚,里面看起来特别的黑,这是为什么呢。
因为整个真实世界的光照,它的range是非常大的,你的曝光如果没有仔细调过的话,你就会出现就是说那个就是要么就是明亮,不就是过暗啊,过量要么就是暗部过暗,就这个效果,那所有搞photograph。
搞照片的同学应该都知道我在讲什么,我记得我以前在那个就是国外,我看那些那个卖房子的人,拍那个房子的那个照片的时候,像国内也是一样的,就是他他们拍出来的照片,比我自己拍我家的照片看起来完全就不一样。
为什么他拍的时候外面是蓝天白云,家里面窗明几净,实际上这个呢是要认真的拍过的,反正这个技术的话,我当时是不会的,对吧好,但是我如果做渲染,我知道怎么做,因为我知道我要做tom mapping。
那么通拍品它的基本的解决的问题是什么呢,就是说其实现在我们游戏的渲染,基本上都是HDR的渲染,就是说光阳光能直射到的地方的话,它的亮度可能是非常非常高对吧,但是在阴影里面它的亮度可能是非常的低。
那么就是说你如果不用一条曝光曲线,就是说把这个这么大range的这个这个光照数据,把它映射到一个,就是啊LDR或者SDR的映射数据的话,实际上你看到的东西,就是就像我们的左边那张图一样。
就是天空它已经过爆掉了,然后呢下面的环境你看上去他已经看不清楚了,而且出现了色偏,因为这个就是说如果你因为颜色,如果它的亮度很高,但是呢你做了个clamp,就是说超过一的我给你截断的话。
其实这种HTR的颜色它会产生一个色偏的,那么我们需要用通过通mapping把他曝光对,那你看通过这个这里面用了一个film filmic cube,就是说一个fm curve。
待会讲就是说哎他曝光完之后,你会发现这边的天空也看得清楚了,这些房子的颜色也是对的,那么这个里面的话呢,它的算法其实是非常简单的,也就是说我把你一个040,050的值。
我通过一条曲线映射回一个0~1之间的值,就是这么一个简单的想法,那么那么你想这个映射的话,在二维空间上是不是就是一条曲线对吧,那这里面的话呢,就是说同8P其实有很多方法了,很多曲线,但是呢其实你会发现。
行业随着现在这么多年的发展,其实最经典的曲线也就这么几条,那这里面首先我要讲解一下大名鼎鼎的FILMIC的,这个就是那个这条曲线,这条曲线的话呢首先从名字上取下来,就非常的霸气。
为什么当年我为什么觉得这个曲线,我一定要用呢,就是因为它的名字太吊了,它让你的游戏产生出了像电影般的画质感,这个好像如果没记错的话,应该是ni dog他们自己提出来的,然后整个行业都觉得非常的棒。
那么他很聪明的一件事情是什么呢,就是说这样一条曲线,大家想想看,我去曝光,我怎么去曝光啊,我我去算,就是我我有任何一个算出来一个点的,这个它的luminous就是它的光的强度,我去算它新的映射的时候。
我是把这个东西变成一张纹理,我对它进行采样,但这个好像效率很低对吧,而且这个怎么存呢,存存是可以确实可以存,但是呢这也是他们很厉害的地方,就是他们其实是用一个多项式的公式的拟合。
拟合出来的这样的一个通mapping,就支持他的shader code,但这color大家有有有兴趣的话,可以仔细研究一下,这个就非常像我刚才讲的那个做AO的时候,那个老哥。
他从这个一个简单的AO数值就可以推出来,你的multi scaring数值,一个道理,它就是一个你讲不清楚它为什么work了,但是它它就是work了这么一个数值,它给你产生了这样一条curve。
但这条curve产生的效果它就是非常的好,那么这个呢,我认为是我们游戏行业的巅峰水平了对吧,FILMIC的这个东西,我记得我在10年前,我在读那个他的paper的时候,我就觉得惊为天人。
我说啊敢叫FILMIC的,叫曲线,那一定是跟电影行业是高度相关和一致的,我怀疑当时nt dog的这个technical artist,是对着电影胶片去调的,就是说能调出这样的一个效果。
但是这个呢世界上的事情就是不怕不识货,就怕货比货,那现在在我们行业里面呢,大家慢慢慢慢的在切的,我们叫做ACES,大家看到这个ACS的logo是不是有点熟,中间那个东西是什么,是小金人,对不对对。
那就是那个美国电影协会,这个就是他是个academy,哇,这个名字听academy的意思就是学院,电影学院就是电影界的同志们说,哎你们这些人都在瞎搞,你们根本不懂什么叫颜色。
什么叫这个这个调色的这个真谛,所以ACES它结合他多年的经验,提出了他的一套就是这个曝光曲,就ACES这条曲线,实话实说啊,这套曲线我觉得效果确实做得是非常不错的,确实是这帮大事。
而且他解决了一个非常厉害的东西是什么呢,就是说实际上在我们的颜色,就是我们渲染出来的东西的时候,它实际上会在不同的设备上去去去播放,比如说现在大家买显示器的时候,你们会有两种显示器选择。
一种是HDR的显示器,对不对,一种是普通的非HDR显示器,那么你最后这个颜色怎么映射上去,这个还是那个一点,其实还有一点更讲究的是什么呢,就大家看我们人眼的颜色的感感知都是相对的,比如说同样一个绿色。
你在一个比如说我在打印的一张纸上,或者在我们电脑屏幕上周围都是白光的情况下,你那个绿色感知到同样的RGB啊,和你在电影院里面周围都是黑色的,你我要让你感知到一样的绿色,其实它两个颜色是要调过的。
而ACES的这个color的这个同mapping的话呢,他给你转换完之后,你后面再加一道工序的话,你就能够无差别地适应到各种各样的现实终端,这一点确实我觉得就是说啊,他们的这所有的数值。
所有的曲线都是有大量的专业的,这个就是视觉的艺术家去调校过的,所以这个的话呢就是目前我们可以看到,就是在工业界里面越来越多的人,我们在用ACES的这个模型,所以我觉得这个真的是我们这个行业。
一个打脸的一个一个很有意思的一个故事,就是说我们本来觉得我们已经尽了全力了,我们自称我们可以达到电影般的效果了,结果人家正主跑过来说,我来教你怎么做颜色,怎么做这个这个这个就是说曝光的这个曲线。
那实话实说的话呢,这这张图是从那个知乎上的,那个就是那个叛逆者敏敏,他那个博客上我拔下来的,那么他这个工作做的非常的好,就是说你可以看到同样一个场景,其实你用各种不同的语言去曝光呃。
我个人觉得就是说那个就是ACES的,这条曲线的话,确实效果很漂亮,它的亮部看起来足够暗,足够足够亮,然后呢色彩足够饱满,然后呢暗部的话呢其实看着也很清晰,整个画面的话显得明暗非常有致对吧。
其实我们人眼的话天然的对这种就是高对比的,这种就是非常vivid生动的东西是感兴趣的,所以这也是就是说目前在游戏行业里面,大家越来越多的去签到,这个ACESS这条曲线的一个原因。
那么所以说这就是我们的那个我们的post processing,第2part就这个都这part非常重要,因为现在大家做引擎的话呢,一般你的太阳光的亮度基本上是HDR了,你宣传的东西HDR。
所以你的场景美不美,同花瓶非常重要,那么刚才讲的这个blooming啊,TOMAP啊,基本上还是一个比较符合真实的实践的东西,接下来讲的这一趴的话呢,那就是彻头彻尾的美颜相机了对吧,大家看这张图对吧。
左边和右边它的区别是什么,其实是同个照片,但是我们调了个色之后,你会发现感觉完全不一样了,对不对,那么右边的这张图一下子让你有这种诶,有这种老照片新闻感,有种年代感,有情绪感的,对不对。
其实color grading,我认为是现代游戏中非常非常重要的一个东西,但是它呢它简单到让你觉得都不可以想象,那么其实在这个它其实在现代游戏中,我去表达情绪,表达环境,比如说你打boss对吧。
你这个boss特别难打,然后呢你的情绪非常低的时候,你会发现整个游戏画面的颜色,好像色相在偷偷摸摸地发生变化,其实这就是这个color grading在在起作用。
color grading呢又有一个有一个叫法叫LUT叫root,Look up table,他什么意思呢,就是说其实它本质上是什么呢,就是说你原始的一个颜色和我想调到的一个,色相空间的一个映射。
这个映射呢我们一般用一个表格来做,这个表格长什么样子呢,其实大家可以想象到,就是如果我在世界上所有的颜色不是RGB吗,256256256吗,它不就是一张3D的texture嘛,对不对。
那好那任何一个就是你给我的颜色,我呢把它变化成另外一种颜色,所以这就是个映射嘛对吧,那么好,那如果这个3D texture的话呢,在我们早期的时候,因为早期很多硬件它不支持3D texture诶。
我可以把它拍平成一个二维的texture对吧,我一样可以存到SHADER里面,那么这里面的话有一个小细节,就是说其实啊我们并不需要存一个,256×256乘256,这么大的材质,这个材质还是蛮大的。
实际上呢很多时候在工业界里面,大家用的发现A1616乘16,或者32乘三十二十三,32基本够用了,这是为什么呢,因为颜色它是连续的,所以你大概觉得颜色怎么变化就好了,那你在中间的那个颜色。
比如说啊我们假设只采32×32对吧,那你现在假设告诉我说诶我现在的颜色值是,比如说啊75啊,这个值有点难吧,我讲解简单一点,比如说啊69好吧,那我颜色值的话呢,我32~250个隔了八个,对不对。
那好我下一个是64对吧,那其实它就在64和72之间差一个值,其实那个值基本上就够用了,这就是为什么所有的look up table的话,就是color gradient,Look up table。
它一般不会做得非常的密度,这就够了,那么这个东西的话呢非常的简单,对不对,但是呢其实非常的实用,因为它的好处是什么呢,你这是一个典型的就是程序员写完一个算法,接下来所有的事情交给艺术家自由游戏发挥的。
比如说在PHOTOSHOP里面,你艺术家可以做一张原始图,比如说我们经常干的事情是什么,游戏以及截张图,然后艺术家呢在上面加一个图层,自己调调调,调出各种各样想要的效果。
然后PHOTOSHOP一个插件说我要导成look那个color gradient,Look up table,然后你可以选择我要导成2D的还是3D的,哐叽一键啪,这个图学生成了艺术家。
不用管这个图是怎么算的,但是呢你把这个look up table,读到我们的color grading的后后处理的话,你真的能在游戏里面产生一模一样的效果,那么甚至像这边那个这个软件的话呢。
它是专门做这个color grading,look look up table的一个软件,那这里面的话artist的话,他就不用那个就自己去P图了,它在里面拉一拉颜色,像空间的分布诶。
它就能完成这样的一个变化,所以这个东西的话呢,实际上是我自己在工程经验中,我认为artist是特别喜欢的东西,而且呢做游戏引擎的话,我认为这是你必须要做的东西。
所以其实怎么去解释这个color grading呢,其实啊color grading这个东西的话,我认为是啊在游戏渲染里面,性价比最高的一个功能,非常简单,但是呢对游戏的效果我认为是有质的飞跃的。
它原始图你看着就很一般蓝天白云那个东西,但是他一旦color a上去之后,你就觉得非常的压抑,非常的有情绪对吧,所以color grading是post process的话呢。
我们非常重要的一个part好,讲到这儿的话呢,这是我们的渲染的这个核心算法,基本上就讲完了,好,这个时候呢,我们就开始到我们这课程的后面的这个,这个收官的阶段了。
大家回顾一下我们rendering的四节课,其实最开始从哪个东西开始的对吧,是从我们卡基亚老先生的这个,render equation开始的,这个我今天的课讲了这么长时间,讲了将近有七八个小时了。
但是呢所有的东西都在他老学生的方程里面,真的这个我实话实说,我没有做,我们图形学,到目前为止,还没有超越老学生的这个方程的东西在里面,但是老先生的方程给出来之后,我们就死去活来。
大家回想一下是不是已经有点忘了,比如说第一节课里面,我们教给大家说哦,这个世界你是用这个mesh材质对吧,去那个SHADER去绘制出来,然后你要做卡里,你要把不必要的东西裁剪掉。
这样你这个世界就能画的出来了,对不对,第一节课讲的还可以比较简单好,到第二节课我们开始讲的就比较难了,就告诉大家说,其实呢卡基尔形式的方程最难的是什么,比如像shadow对吧。
包括像那个GLOBINATION,它的全局光照,就光和这个世界是怎么变化的,好光和材质呢有就是我们最难的这个材质系统,所幸现在有PB2材质一统天下,那让我们一下子,这个材质基本上完成了一样的统一。
这是我们第二节课的内容,大家知道了哦,我怎么能画一个很有观感,很有真实感的这样一个世界,那么第三节课呢我们学到了哦,那这个世界里面比较难以表达的,是个巨大的地形对吧,复杂的天空和云。
我们有一系列的这个非常复杂的这种,积分算法诶,我们能够近似模拟卡基亚老学生的需求,同时能把这个世界做的非常大,开放世界有无数的细节好,那今天我们这节课呢,看起来学的是一些零零碎碎的东西对吧。
比如说我们知道了,如果表达这个世界,我们一定要有NB的CLUSION对吧,这样我们这个世界才有感觉凹凸有致,然后呢我一定要有一层fog,让这个世界更有层次感对吧,而且呢因为世界里的东西太多了。
我的屏幕reduction又不够,所以呢我们一定要anta lien,让这个世界变得诶看起来更平滑,那最后呢我们还要做一些后处理给它进行美颜,所以我们需要把这个bloom的效果,光晕的效果把它表达出来。
我们要对它进行正确的曝光,不要让这相片看起来曝光还有色偏对吧,最后呢哎我们可以上一个魔法科技color grading,把这个整个游戏的画面调成我想要的这种色相,有了这么多东西之后。
我们是不是真的就知道这个游戏,这个产品是怎么绘制了,实际上呢这里面有个很重要的东西,叫做rendering pipeline,也就是最简单的解释是什么呢,我叫做绘制顺序也好吧,就是说实际上这么多的算法。
它必须有一套规则,谁先做谁后做对吧,然后呢,这样的话呢我才能保证这个东西是有序的,这就是我在第一节课给大家讲的,就是说其实游戏引擎,你的渲染和图形学里的渲染最本质的区别是。
我们是没有办法抽象出一个简单干净的算法,实际上我们在一个游戏画面里面,真的是几十种到上百种的算法同时在运作,然后呢我们要让它的效果是不出问题的,那这里面的话呢我们就需要有一个pipeline。
就是把这么多的算法依次依次往里面放,那么最简单的排放是什么呢,就是哎我先把shadow map算出来对吧,把光影明暗算出来,接下来呢我把物体依次放进去,对它进行光照进行shading对吧。
每个光晕我给它做一次,然后最后诶我把这个灯最后的结果再放呢,post process对它进行一个,比如说blue效果算不算对它进行一个曝光,进行一个color grading,那就能拿到我想要的结果。
这其实就是一个最简单的排版,大家别小看它这个pipeline的话,事实上是真的可以work的,很多商业级的游戏就是这么做出来的,那这个pipeline的话呢。
就是大名鼎鼎的叫我们叫做FORENDERING对吧,就是说我对每一个mesh,对每个光我把它炫一遍,就像我们这边用小引擎做个例子,大家看他就说诶你东西一个一个的被绘制出来,对吧。
然后好for the rendering的话呢,这里面你们看到所有的东西啊,注意在这里每一个细节就是A,为什么天空是最后绘制,因为天空第一个是最远,第二个呢这是我们下一页讲的东西。
就是说PHOENN有个小细节是什么呢,就是说我们有一些物体啊,它是透明物,透明物的绘制啊,它首先不能够和不透明物质和物体,混合到一起去,他必须是最后回绘制,而且透明物质物体绘制呢,它有一个细节叫什么呢。
叫transparency sorting,就透明物排序,为什么呢,就是说当我在屏幕上去叠加透明效果的时候,如果你的不透明材质在前面的话,挡着我的话,那我这透明我是不是不需要会了,对不对。
我说我z buffer我就知道了,那如果我的透明物在你前面的话,那我事实上要混合你射出来的光,对不对,那实际上我必须要在你之后好,那是这是透明物和不透明物之间的关系,所以为什么。
透明物一定要在不透明的物体之后之后去绘制,那么但是呢如果我这时候有两个三个,四个五个六个透明物,我怎么去绘制呢,这里面就有一个很著名的一个算法,叫TRANSPARENSIN。
就是说把所有的透明物由远极近的绘制,就是说我首先绘制离相机远的,然后依次往相机镜的绘制,这是为什么,大家想想看,当玻璃两个玻璃我前后重叠的时候,我是不是先要后面的东西颜色先出来之后,我前面的玻璃罩上去。
我才能够把你的颜色做,对对吧,所以这边有一个例子,就是说一个黄色的,一个绿色的玻璃和一个红色的玻璃,它两种不同方式叠叠在一起的话,它是产生的结果是不一样的,所以其实在现代的游戏引擎里面。
就是transporting是一个非常难的问题,它其实会导致很多的bug,那么其实呢这个方法呢,差不多是在呃游戏引擎很早期大家就提出来了,但是呢事实上它是有问题的,比如说我上次在这个上面出现了一个概念。
就是这三根棍子,它是三个透明物,那么你说哪个先哪个先哪个后呢,你会发现它是一个有点像莫比乌斯环,有点像一个puzzle一样,就是你无论怎么解释,他都解不了的,所以这种情况在我们游戏引擎里面怎么办。
我们不管了对吧,我们一般用透明物的中心点去排序,所以你会发现就是在游戏中啊,透明物其实非常多,举个例子吧,比如说你扔下一颗手雷,怕一瞬间它炸出了很多的烟对吧,那个烟呢就是一个个的particle。
它都是透明的,那个烟的排序,就这一件事情就让我们的游戏引擎难了好多年,我在下这个后面讲那个粒子系统的时候,会跟大家去讲一下,那个里面排序所遇到的各种困难,所以呢大家只要记住。
就是说在forward rendering的时候,你一定要把透明物放在不透明的物体之后绘制,然后呢对它进行一次排序就好了,所以这样的一个pipeline呢,基本上就能完成早期的游戏的绘制过程。
那么大家可以看到就是早期的像just cos对吧,像那个heavy rain,Heavin,其实是一个我很喜欢的游戏了,你看看它的效果做的其实还挺不错的,而且这是个正儿八经的3A游戏啊,还真的是卖钱了。
但是呢这个技术的大概在十几年前吧,逐渐的这个pipeline被大家就觉得他有问题,那现在的话呢大家最主流的PAPI为什么要变呢,其实有一个很核心的问题,就是说在我们现代的游戏场景里面。
它的光啊是非常丰富和复杂的对吧,你墙上吊的那个吊灯对不对,你扔出去的一个照明弹对吧,地上那个燃起的火把,所以说其实以一个现代游戏来讲的话,你的光是极其的丰富,所以这个时候呢。
我们就引入了大名鼎鼎的叫延迟渲染,其实这个different shading,或者叫different rendering,那么different rendering呢,他的思想其实非常的简单。
他说呢你不就是要渲染吗,我先把所有的物体我渲染一遍,但是呢我先不去算它和光的关系,光我放到后面去,我算什么呢,我把你的这个材质,比如说你的ABELE,你的SPECOLOR,你的roughness对吧。
你的depth,全部扔到一个巨大的这个buffer里面去,这个buffer一般我们叫做g buffer,然后当我有了这个信息的时候,那我一块一块的光apply到这个屏幕上的时候。
是不是我就可以只算光的部分了,这样的话我所有的顶点啊,所有的像素就不会被overdraw,每一个就是他最后的shading预算,只会去算最后一次,所以呢differ rendering。
实际上是在过去的这个时间里面的话,大家在游戏引擎行业最常用的一种绘制,绘制方式,这个方式还有一个潜在的一个好处是什么呢,就是说大家讲到我们的材质,是不是越来越统一了,对不对,我们用了P2这个材质对吧。
那其实早在PB2流行之前的话,人们已经开始逐渐喜欢,就是说把材质数据全部拍到我们的FM,这个g buffer里面去,这样让后面的计算的话高度的一致,这就是difficult rendering。
这样的好处,就是它能够绘制很多光晕的这样的一个结果,那么就是different rendering的话呢,它的好处就是说它可以对光的处理,是非常的方便。
就像我们比如说我们以前在做这个叫screen space light,就是我在screen,就是在那个屏幕上我要加很多小的点光的时候,诶,我只需要在点光要覆盖的那个区域,画一个小的disc。
那个区域的话,我把那个光叠加上去,我以前还做过这screen,就这样这边这个结果可以花很多的小的点光,这个要表达这是晚上的街道的场景,是不是特别的有用对吧。
那么而且呢它的那个就是渲染是很很容易debug,很多问题很容易发现,但是他的问题是什么呢,就是他的g buffer实际上是非常的废的,就是说我们讲的就是说在在硬件上,实际上我去读写这些数据。
其实效率是非常低的,而这个问题呢在移动端的时候哦,这边我们先给大家看一个简单的视频,就是这个,这也是我们这一个星期,那个就是PO的引擎的一个更新,就是我们把differ rendering加上去了。
大家可以看到,就是说我们会先生成它的G8er,然后呢再开始这个就是后面去渲染它,确定它,我每次看弹幕,同学们都让我多喝水,所以今天我就放了一瓶水放在这了啊,对响应大家号召,我就好好喝水,省得嗓子哑了。
好哎呀,今天又讲了一个半小时,后面我争取两小时内能解决吧。
好那么确实今天是最后一节课,我确定我必须要把所有的东西给大家先讲完,好,那么其实呢,这个时候就出现了著名的这个TALIRENDERING,TALIRENDERING的话呢,它的源头是什么呢。
源头实际上是在移动端,因为移动端它有一个问题,就是说它对发热是特别敏感的,那么在移动端的话呢,什么东西是最容易发热呢,就是存储芯片,那么所以呢他做了这样一个结构,就是说在主板上它一个d run。
d run上的话呢,它的速度比较慢,而且呢你在这读写的话是很消耗很多能量,但是它chips里面呢他又做了个s ros one的话呢,视频率特别高,但是它尺寸特别特别的小,那这时候他就想了,那这样吧。
你不就要绘制画面吗,那我就在java层面把你的画面切成一小块一小块,你就一小块一小块,只渲染那一小块,你的几何那一小块的东西,然后呢哎我渲染好了之后。
我把那一小块把它放到我们的free buffer里面,最终的结果,而不用存一个巨大无比的奇buffer,所以到今天就是现在,可能有一些越来越多的手游,开始用different renderings。
其实在很早以前呃,呃英布就是其实现在主流,我猜那个手机上的渲染还是用FRENDERING制作,渲染,也是这个道理,那这个时候呢其实大家会发现,就是说怎样减少对这个frame buffer的读写的压力。
其实我可以把画面拆成一小块一小块来,这样做效率更好,那么这样的一个差呢,实际上带来了一个额外的好处是什么呢,就是光可以被切割,就是会被卡到一个个的太阳里面去,也就是说在屏幕上的每一个小太阳。
我上次知道的时候,我是被几个光给照照上的,那么实际上在每个tag,我只要做一个非常简单的view frustr的处理,我就知道说哎我这个tile里面到底有几个光,可见它们叫什么,叫light list。
这个算法其实非常的简单,那么好,这个算法够不够,我们还可以再往后走一步,实际上呢我们在渲染这个世界的时候,我们在做设定的时候,我先不是会生成一个大的early或者叫PZ。
我会生成它一个z buffer的深度,那实际上在每个tell,我事实上是可以知道他最远的和最近的,自己在那里,就像那个我们的右边途中,你这辆摩托车,它其实它的BACKFACE你是不会被设定的对吧。
它只有它的front face a,它形成了一个小的区域,那我假设有一个点光源,点光源一般在空间中是一个球吗,其实我们就可以知道说哪几个tell会把它照到,哪些tell all,虽然空间上有。
但是它不会被照到,你看这边就是说,其实那个点光源能覆盖到的只有几个tile,而大百分之就是可以说是90%以上,就是学生五以上的面积都不需要被他照到,这就是这个你对空间划分之后,带来了一个很大的优势。
而这个TALIST那个rendering或者TBRENDERING的话,现在是很多游戏的主流的绘制方案,就是因为它对光的处理非常的高效,那么其实我们可以看到就是在5年前左右吧。
很多的大作基本上是采取了这样的一个架构,你会发现在这里面的光影,各方面是那个处理得非常的好好,那基于这个town的话,这个pipeline的话,我们能不能再往前走一步呢。
哎这个哦顺便给大家顺便穿插一个概念,叫forward的家,其实真的学图形学的话,你可能要背很多黑化的这个forward的家,在实际上没有那么夸张,就是刚才我讲的就是你是ford rendering。
但是呢你按照一个tile excel绘制的话,我们叫做forward,加这个的话呢,实际上就是说啊对东端特别友好,其实即使在一些PC游戏上的话,也有人用这种方法去做好,那么还有如果我们对这个世界分成。
就是在在那个像素空间,对它进行一个切分的时候,实际上刚才在那个Z的那个地方呢,我们不是算了z miz max吗,那其实有个更简单的方法是,我们对Z空间直接进行一个切分,好不好。
我们就把这个空间分成一个个的那种,四棱锥的那个体柱,它叫class对吧,就是这种class base rendering的话,他就更加丧心病狂,你像这个case里面,我这里面应该有上千个光源吧。
那实际上它就能够高效地做成return render,大家想象一下,如果还是用古老的这个forward rendering的话,那你这个几千光源,对这个场景几乎是没有办法渲染的。
而这个classmates rendering的话呢,现在也在慢慢的变成,就是很多游戏引擎用的方法,但这个方法,它其实我觉得个人觉得没有什么太多的花头。
它实际上就是你不需要再算什么zz m z max了,我就是一个tie,1tie去算这个对于light的这个visibility,那么最后呢我给大家讲一个,就是现在在蓬勃发展的一个新的rendering。
pipeline的技术叫做visibility buffer,刚才我们讲的所有的这个渲染呢,大部分人用的都是FARENDERING,它本质上是什么呢,他把所有的材质信息。
写到了一个巨大的G8缝里面去了对吧,这G8份里面我会存它的深度,存它的法向,存它的那个颜色,存它的这个那个模,那个粗糙度roughness,那么其实随着现代硬件的发展,大家意识到一件事情,就是说。
我们其实可以把几何信息和材质信息剥离开来,我在一个frame buffer里面,我写什么呢,我写你这个像素它是属于哪一个几何体,就是你的primitive id,就比如说你是属于哪个啊。
比如说我们之前讲的那个MSI,你属于哪个MASALT,然后呢你的这个你是你是你的传统id是什么,我就知道你的传统id,我还告诉你说你的这个传统里面你的那个点。
他的那个就是叫biocentric corner,就是你在那个三角形的,因为就是大家如果学过图形学基本概念,就知道就是说一个三角形,我一个about central color叫叫什么重心坐标。
我就可以知道你真正的是哪个点,我就知道从这三个点的数据提示好吧,那这样的话我有了primitive id,我有了BSA的话,实际上我可以反向的去查你这个物体系,你这个三角形应该用的是什么材质。
你应该是什么,Normal,应该是什么东西,对不对,所以我其实用一个visibility,Visibility buffer,我把它几何信息全部存下来了,那么好,我有这样的一个信息之后,诶。
我在后面可以对他直接的进行shading,那为什么这件事情这么重要呢,因为大家啊去去想一下,就是说其实啊在过去的计算机里面,我们一直认为材质呢渲染是比较复杂的,几何是比较简单的对吧。
那么几何一般就是一个个的面片,但是在现代引擎,特别你当然看了像虚幻五的NANA这个技术对吧,包括像这个地平线最新的一座,它的那个foliage,其实它的几何密度是非常非常高的。
很多时候它的几何会超过像素,那么传统的去写这个g buffer的方法的话,其实你会浪费掉大量的这种几何的overdraw,这个东西,然后呢我要去取大量texture fashion,大量的运算。
所以呢其实大家在这个时候会发现说诶,我只需要把几何写上去就可以了,那么这个呢实际上在现代的很多引擎中,逐渐的逐渐的它成为一个非常重要的,rendering pipeline的一个发展方向。
而且这里面还有一个原因,就是说我们现在的这个比如说GOMETERSHADER,mash shader越来越成熟,大家会发现一件事情,就是说我走传统的。
就是诶我把顶点vertex index buffer传进去,然后呢rust riser去把它变成光栅化,然后再进行pixel shading,它的效率其实没有,我们自己直接去写它的光栅化的效率高。
这个事情很神奇啊,你自己用GPU直接去写那个shader code,去把一个三角形rust rise成一个点,其实它的效率啊比硬件做的更快,那么还有一点是什么呢,就是说在g buffer里面的话。
我在做设定的时候,我要不停的去查那个g buffer对吧,那那是一个texture sampling,其实那个texture sampling的效率是非常非常低的。
但是的话呢我现在在那个visibility buffer里面,我在做设定的时候,实际上是我取到你的值之后,我直接是什么呢,我去查你的vb和IB那个效率其实是非常高的,所以的话呢vb的buffer。
实际上是现代pipeline的话呢,一个很重要的一个前沿的发展方向,我们可以看到,就在我们可以预测在未来的三到5年的话,会有越来越多的这个管线,它会引引入这个机制,但是呢就是现在我看到的东西的话。
它一般不会完全的不像低分的differ的设定,就是完全的是一个主主pine,现在它变成一个就是我,我的感觉像个增强型的pipeline,但是未来保不齐,随着技术的成熟的话,它变成一个主PAPI。
这个方向的话,我觉得同学们可以关注,如果大家真的理解了什么叫differ rendering,理解了g buffer的话呢,你把这个东西反过来再理解一下去,你在那g buffer里面。
differ shine存的是材质的全属性对吧,你想想的那一张贴图诶,在visit buffer里面,我存的是几何的全属性,那么你通过几何的属性呢,你也可以反向的找到材质。
而且他用了VCD buffer,还有个好处,就是说我把所有的没有用的材质,信息全部剔除掉了,就是没有用的材质我都不需要,我只需要用我自己的药的材质,而且他的支持的材质类型会更加的复杂,更加的丰富。
相反就是说你用g buffer的话呢,一般来讲它的材质是假设是一致的,好这个地方讲的有点多了,但是呢我觉得这是个很有趣的一个方向,大家可以关注好,那么懂了这些所有的东西,对不对。
我们是不是就真的知道怎么做游戏了,那老套路还是比较难,那这里面的话呢,这是大名鼎鼎的unreal的这个,这个pipeline的图,大家看一看,这已经是画的,这是我见过画的最清晰最明了。
但其实呢也是做了大量简化的一点PON的图了,大家看看有多复杂对吧,很多很多东西,但是的话呢就是说真的,我们去构建一个游戏引擎的时候,那这个地方就是大家会吓着大家了,就是构建引擎看听起来很难,对不对。
但实际上的话呢,它每一个算法拆下来都都是可以理解的,都是可以读的,但是你真的贡献一个引擎的时候,其实他的就这么多算法在一起怎么work,实际上呢是非常麻烦的,它麻烦在什么地方呢。
我觉得就麻烦在这么几个地方,第一个就是说我做完一个引擎对吧,我要给别人做各种各样的游戏,其实每个游戏的渲染需求都是不一样的,对不对,比如说这个人我希望我的NTLEEN用的是TA。
那个人我喜欢用的是FXA,因为我要更强调我的效率对吧,那么好,那么但是呢我有那么多的模块,这些模块其实是什么呢,它是lego piece,是一个积木,这金木我怎么样自由的那个搭了起来。
那么第二点是什么呢,就是每一个算法它除了计算之外,还要占用很多的就是存储资源,那么这个存储资源的话呢,比如说这个buffer那个buffer对吧,实际上在整个这一站渲染里面,它并不需要从头到尾。
可能一个计算算完之后,他把结果存出来之后,给另外一个计算消耗掉之后,哎这个办法就应该被释放掉,但是呢如果你不去对它进行一个,进行一个精密的管理的话,其实你会发现很多的内存空间,很多的那个buffer。
很多text空间,很多的显存空间全部是被浪费的,那么你如果一开始,当这个PON比较简单的时候啊,那还是有很多牛人管理的很好,他说哎我这地方重用那个调释放对吧,但是的话呢当PIPA变得非常非常复杂的时候。
其实几乎没有人能管得了这件事情,那么第三个呢很大的挑战是什么呢,是随着这个DX12和van,这一代的这个graphics API的兴起,这一代graphics API,它最大的一个设计理念是什么呢。
就是说我不再像早期的open gl或者DX9DX11样,就是把很多硬件的复杂度全给你封装起来对吧,对你来讲就是我上面的一个光,我设置一个材质参数,我设置个SHADER,Px shader。
Word shader,我设置VBIBH动我就画出来,但是呢在van和direct12里面,它是几乎把这个裸的硬件的这个算力,给你开放出来了,包括它的内存,你怎么去管理对吧,你怎么去理解这个内存。
你到底这个内存是啊是一个texture还是一个array,这个内存是可读可写,还是现在我要把它屏蔽起来,比如说最最重要的就是说因为我们的这个GPU啊,它是高度并行化的计算,很多的内存它是要加锁的。
我们叫做memory barrier,我们加很多锁,这个锁你一旦没加,加对或者少加的话,他要么就是导致整个游戏直接就Rush掉了,而且在某些特殊情况会Rush掉,你都不知道,还有是什么呢,还有就是说哎。
他会突然的就是进入了一个一个死循环对吧,我们叫死锁,死锁是写多线程最怕的一个东西,那么好,那这样的一个东西的话呢,实际上在现代真实的游戏引擎开发的时候,困难其实是非常非常大,那这个东西我们怎么去解决它。
所以呢这里面的话呢,我今天就给大家只点一个概念,就是说叫render graph graph或者叫phone graph,这个概念的话,大家如果在那个就是如果大家玩引擎。
比如说无论玩最新的那个一代的unreal,还是unity的话,大家看到就SRP对吧,就是script to render pipel,其实就是一个概念,就是说诶我们把这个pipeline里的所有的东西。
把它变成一个的module,这个module的话呢,我一或者用脚本,甚至将来可以用可可拖拽的一个图,把这个pipeline,把这里面所用的计算和它的资源的依赖,依依次用,这个就是deck。
就是一个叫有向无环图把它表达出来,然后呢,我由系统自动帮你去检查,他们彼此之间的依赖关系,自动帮你优化这些自用资源之间的,可重用的部分,比如说我发现一个buffer,其实你后面的预算就用不到了。
那我就把你释放掉,然后呢在另外一个计算里面再用一下,这个东西叫什么呢,叫做aliens,就是我把这个buffer给alien过去,那么这样的一个东西的话呢,它就能够避免很多同学们犯的错误。
其实这个思想我认为就是说,大家在做任何一个大型系统的时候,早期一开始一定是自己写代码,觉得我是一切尽在掌握中,当你开始跟一个大团队在一起协作的时候,你会发现啊,你的大部分时间不应该去来去想这个这个算法。
每个算法怎么做,而去想一个工具,让每一个同学自己写算法的话,彼此之间不打架,那这里面举个例子,下面这张图的话呢是这个啊,如果我没记错,应该是占地四的这个它的frame graph图。
大家可以看看这个图有多复杂,你展开一个很小的一个地方,它有那么多的节点,所以大家想这样的一个pipeline,如果你没有一个frame graph,这样的东西去管理的话,它是不是特别容易出错。
那要出错的时候,大家想想看怎么提bug,那跟大家分享一个那个经验,就是说你在GPU上写东西,渲染的东西,你一旦挂掉之后,那是直接就GPU写的不好,现在我不知道了,以前我记得是经常可以把操作系统给刮掉的。
那这个debug起来就非常头疼,所以的话呢就是frame graph这个东西的话呢,实际上是一个非常重要的一个未来的发展方向,比如说以unity为例吧,unity有两套管弦,一个叫URP。
一个叫这个HDRP对吧,就是一个UP,是一个更加简单通用的rendering pip,HDRP呢是一个加了很多高端效果的,看起来高高高高高质量的。
这样的一个一个一个那个就是rendering pipeline,那么这两个pipeline它下面都是用SRP去定义的,我认为这个动作就做的非常的好,所以其实呢to be honest。
我觉得今天啊就是render graph,这个东西呢还不算很成熟,其实现在在行业里面大家还都在探索,就是因为接口到底怎么封装对吧,到底开放给这个graphics performer是怎么开放。
到底technical artist能不能直接用,那么这里面有很多的挑战,但是的话呢这个思想我觉得大家一定可以,值得大家去了解,就是说当一个系统足够复杂,连渲染这个本身变得足够复杂的时候。
我们定义了一个图形化的语言,把渲染本身的那个前后关系,依赖关系给它表达出来了,这样的话呢,才能够让我们这种超复杂的3A级游戏的开发,能够被有序地这个管理起来,基本上讲到这的话,我们的渲染这一趴就结束了。
那最后呢跟同学们讲一件事情,就是你看这个故事总是没完没了,渲染我全部搞完了,我这个游戏是不是就可以做了,就可以渲染出来了,但这里面的还有最后一件事情,就是说我怎么把这个渲染,导到我的电脑屏幕上去。
这里面给大家介绍一个非常大名鼎鼎的概念,叫做这个we we think,那么首先呢大家了解一个一个artifact,就是说你们不知有没有发现,就是说当我把那个就是我的游戏里面的VC,关掉之后。
你会发现你的画面,特别是现在大家那种4K显示器啊,有的人会出现这种就是A画面,上下两边错开的这种这个情况,对不对,这个叫什么呢,这个学名叫screen teing,它的本质原因是什么呢。
就是我们的引擎在疯狂的渲染,但是引擎的每一帧啊,它的时间是不一定的,比如说有的时候有的场景复杂的场景简单对吧,它它这个帧数有的有的时候是不一定,但是呢显示器刷新的频率是一致的。
那么你那个时候如果正好好巧不巧,你正好错过了他一次刷新频率的时候,哎你这个时候就会出现你在等的这种情况,那这个的话呢,实际上就是screen tan产生的一个原因,那所谓的微信呢其实它就非常的简单。
就是说他每一次都是说,你必须要把frame buffer全部写完之后,然后呢我要等到你的下一次刷新的时候,我整个frame刷新过去,而不能是你写到一半,我再刷新它,那这个时候他的画面就会出现问题。
那么这里面的话呢,顺便给大家讲一个现在很流行的概念叫VR,那个VR就variable refresh rate,这个其实现在今天那个,你看那个NVIDIA和AMD都在卖钱,其实他简单的讲法就是说,哎。
我能不能把你显示器的刷新频率变成动态,可调的,也就是说你的游戏按什么帧率去去渲染,我就跟你去对接在一起,这样的话我们就没有刚才大家讲的那个问题,而且呢他刚才在刚才那个微信的时候,它会产生一个问题。
就是说因为我老师在等显示器的刷新频率吧,就有可能会出现就是画面就是一块块一块慢,因为你正好错过了那么一点点,这个的话呢实际上对于那种非常professional gamer,你才能注意到了。
但这个地方呢我个人觉得还好,为什么呢,因为现在显示器的刷新率越来越高了,所以这个还可以,但anyway就是不妨碍大家去解决这个问题,所以这个实际上是我们写游戏引擎的最后一步,就是你要把你要渲染游戏引擎。
渲染的最后一步,就是要把你渲染的东西投到我们的屏幕上去,所以讲到这一趴的话呢,基本上我们的就是游戏1104课程的渲染,这1part我们就讲完了,那么确实是现在同学们讲的,就是实际上在这个四节课里面啊。
我们浓缩了几乎渲染的所有的东西,它的信息密度是非常高的,那么大家的话呢就是课程的话呢,在课程我们直播看完之后,如果听不懂没关系的,也一点都不要慌,这个真的不要慌,说实话,如果我就别说。
现在就说我5年前我自己去听,我讲的这门课的话,很可能有些东西我课下还是要查查资料,去理解一下,才能明白我在讲什么东西,这也是为什么我们在准备这节课的时候,我们我经常讲解,就是我们肝都爆了。
因为我们要查大量的资料,确保我们讲的东西还真的是state of art,就是说前沿的一些东西,那同学们的话呢就是千呼万唤的东西就来了,就是说哎呀这个games14课程开了这么多集了,从来不补作业。
对不对,是的,因为实际上我们的压力是什么呢,就是说呃对于比如说像渲染哪,像这个就是比如说动画或者物理这种东西的话,你如果单独的做一个PTAP,其实是很简单的,但是对104呢你是游戏引擎嘛。
要游戏引擎的话,那它首先是个系统,所以你会发现啊,在一个大系统里面写任何一个东西,它算法本身你去想并不难,难的是说,如何正确的把你这个算法,插入到这个引擎里面去,所以呢我们前面留了比较充足的时间。
让大家去熟悉这个小引擎,那么这个时候的话呢,我们所马上我们不是说哎这节课完了之后,我们要休息一周吗,正好是五一长假,对了,五一长假大家就可以愉快的做作业了,所以这是我们的真正的作业来了。
这个做这次作业做什么呢,就让大家做一个刚才讲了游戏引擎,您费效比最高的渲染技术是什么呢,是color grading,对不对,调色对吧,那么color grading的话。
就让这次让大家去实践一个非自己的,color grading的算法,那我们在引擎里面加了一个post,process的一个一个框架,然后呢你把你的color grading shader。
你的code把它进去,包括的话,那就是大家那个就是要想这个资源怎么去导入,怎么怎么去apply到你最终的画面上去,大家想象一下,我们小引擎的画面看上去不是很素面朝天吗。
那你是不是可以把它变得非常的artistic,非常的梵高对吧,那么这就是呢我们这个这个一周多,给同学们留的作业,差不多两周时间吧,那么大家的话呢,关于这个这个作业的详细的描述的话。
可以在我们的课程官网上可以下下来,那么就是说虽然我那个就是说啊,这个东西看着很简单,但实际上大家如果真的去能集成到pilot,这个小引擎的话,我个人觉得还是蛮挑战的,也是很有意思的。
然后同学们的话写完之后的话呢,我们也希望同学们提供一个文档,就是告诉一下,就是描述一下你的实践思路,你的你的整个一个设计思想,包括呢提供一个截图,然后呢我们的这个就是啊助教我们的整个课程。
助教团队的会帮大家一起来去给大家反馈,帮大家批改,当然看取决于我们说的作业量吧,如果作业量很大的话,我们可能批改的就稍微快一点,看看截图,简单扫扫文档,如果作业量没有那么大的话呢。
那我们就给大家更详细的一点反馈,但是实话实说啊,这个东西看上去非常简单,这是我们能想到最简单的东西,但是呢你真的集成到小引擎里面的话,还是有点挑战的,比如说你要去想这个资源是怎么导进来的对吧。
然后呢这个SHADER是怎么加载的对吧,然后的话呢,就是说我这个在我的渲染的那个render pipeline,刚才我们讲了我们的pipeline有deer afford对吧。
那现在那小引擎最新版本是deferred rendering,那么好,那我在papa哪一趴去加上他,那包括像这个这个color grading的话,它还有很多的细节,举个例子啊,比如说你如果进去之后。
把它拍成一个2D的texture,那么当你进行颜色采样的时候,你踩到每一个小色块的边界的时候,它会不会越过那个边界,对不对,那怎么办,我怎么算那个texture的UV。
确保它在任何时候进行BINAR插值的时候,它不会错误地插插到边界另外一边的那个颜色,那这里面有很多的小细节,那这个就是我觉得同学们,非常值得同学们去练习,去思考的点,真的这个动作做完之后的话。
你对小引擎的理解我觉得会上一个很大的档次,而这个时候大家可以真说诶,我会做游戏的渲染了,好那么顺便跟大家汇报一下,就是在过去的一周的话呢,我们小引擎又做了一些那个升级,就是最最重要的就是。
我们终于把DEFRENDERING给它加上去了,这样的话我们给大家讲这个地方人类pipeline,我们最大的压力就是我们课程讲了,蒂芬内pine自己都没做,这太不好意思了,虽然一开始我们做小引擎。
都想就是这个简单的框架,但是呢随着课程的进展,我们老觉得说我在课程上跟大家讲这个东西,行业里都这么做的,我们交易体没这么做,老师觉得很不好意思,然后总是给自己加料。
那包括的话呢就是在那个就是上上周的话呢,我们随着同学们一直在用的话,我们也发现了很多很有意思的问题,比如说啊比如说同学们打开很多同学反映,这个小引擎跑不起来,实际上是什么原因呢。
是因为笔记本电脑它有两块显卡对吧,一块70显卡,一块独显,然后呢一一个是MD的,一个是MVIDIA的,两个显显卡都在抢,都说我是爸爸,然后然后结果结果就把整个状态搞得一塌糊涂,那这些问题的话呢。
其实我们后来发现了嘛,然后去修了,其实这个问题,为什么我特别喜欢跟同学们分享了,这就是做引擎的真实的状态,就是你想象一下,你做一个游戏,做一个引擎,他要支持很多游戏,然后呢要在上百万台不同配置的电脑。
有的是笔记本对吧,有的是高配机,有的是很低配的电脑,有的是这个就是那个那个很4K的显示器,有的是很挫的显示器,你都要让这个东西能跑得起来,实际上这种兼容性和稳定性,才是引擎研发的工程的一个核心挑战。
所以呢我也希望小引擎,一开始我们设定的目标很低嘛,但是随着同学们一起来加入,我们一起来做的时候,我们也开始慢慢慢慢的把一些很小引擎,工程感的东西,放入到我们的小引擎的这个环境里面。
其实也能帮助我们所有课程的同学啊,建立一种工程的这种实践能力,我相信这种能力同学们以后走上工作岗位之后,对你会非常有帮助,那么另外一个的话呢,就是说啊,这这也是非常感谢同学们给我们反馈啊。
我觉得其实我挺不好意思的,因为我们这个课程现在直播的环境呢,让我没有办法跟大家做太多的弹幕互动,那但是呢实际上同学们给我们很多反馈,我们都会在看,然后呢就是同学们普遍反映一件事情,就是小引擎的代码。
大家上手还是有难度的,确实是因为说实话虽然讲讲理论都很简单对吧,那包括我后面讲了一些比较高端的引擎的东西,大家会觉得哎思想我大概都明白,但是当你真的动手去写一个引擎的时候,当你面对的几万行代码的时候。
这几万行代码已经是非常非常简单了对吧,几乎是真正的一个引擎的不到1%的代码,但是的话呢实际上啊上手还是有难度的,所以我们在考虑两件事情,第一个就是说啊,这这是同学们给我的建议。
因为我们本来说我们要写一个比较好的一个,spec的文档,但是同学们说你们别别忙了,你就简单告诉我们怎么看就可以了,我觉得大家说的是对的,我们先给大家准备一个相对简单的版本,可能有粗糙一点,大家原谅我们。
然后呢,但是呢我们尽快的把它准备出来,然后尽量的构建我们一个wiki,方便大家去理解这个小引擎,另外一个的话呢就是我们后面还在想,就是要不要做一个,就是啊小引擎101的一个小视频。
就是说101这里比如说101课程,他这就是国外的一个说法,就是说哎我教你,就是从从从简单的123怎么去勾输出,看引擎的代码,这个结构是怎么回事,因为上次我做过一次,但是呢那次只是啊非常非常简单的。
这一次可能会想办法做的长一点,然后呢,帮助同学们能够,就是那个理解小引擎的代码结构,那这个视频如果我们能做好的话,到时候我们也想办法通过课程啊,通过我们B站的公众号啊,B站的那个公众号把这视频给大家。
就是说大家反正在学习中,在这个小引擎的实践中,在做作业中有任何的困难的话,就那个直接告诉我们,因为我们做这个课程的话,真的是真心希望能把它做好,就是我特别怕的一件事情,就是我们花了这么多心血做的课程。
结果没有帮到大家对吧,我特别开心的一件事情,就是说大家说诶我读懂了小引擎的代码,我学完了这门课,我的毕设就完美的碾压了,我身边所有没上课程的同学对吧,当我出去去做一些更复杂的工作的时候。
我学这个104课程,对我建立的这个知识体系,让我一下子有很宽广的视野,对吧,那我觉得我就会非常的开心好,那最后呢就是我最开心的事情了,我们经过连续跟大家干了,这差不多快两个月了吧。
那我们终于可以休息一个五一长假了,那么五一长假的话跟大家告个价,就是我们会在那个就是说5月2号那节课的话,我们会跳到5月9号,就是五一长假之后,这样的话,我们确实有更多的时间去准备下一趴的课程。
因为确实是就是这个课程,准备的工作量还是蛮大的,另外一个的话呢就是大家不用担心,就是虽然在这中间的话,我们会那个就是啊课程会修修整一下,但是大家关于作业小引擎的所有的问题。
我们课程组的小伙伴也会和大家积极的回答,就是说帮助大家解决大家的困难,那么就是说我们这个短暂的休整,是为了更高质量的这个给大家讲后面的课程,好的,那就非常期待同学们五一之后我们再见。
那接下来的话大学有没有什么问题可以去,那个我们可以回答一下大家,啊这个同学问的问题很专业,他说刚才我讲的class brendering,在开放实践怎么划分,这个其实是他很巧妙的地方。
因为它所有的划分都是用事件追了划分的,也就是说你的世界可以无限大,对不对,但是在任何一个时刻,我仍观察到的世界就是一个锥形的世界,然后呢,哎我比如设置一个100米或者500米一个锥。
然后呢我就这样依次的去收集了,这个其实非常像那个呃,非常像那个理论物理里面讲的那个叫事件追,就是那个我不知道大家以前有没有看过那个,爱因斯坦假说,哎我对这个是这个宇宙是无穷大的,但是对人类来讲的话。
你在实践位上,你对这个世界的感知是一个追,那个追的话,它它的半径扩张不能超过光光速,那在这个锥之外的一切对你是没有意义的对吧,其实那个cluster brendering的话,它去构建这个锥体的话。
其实也是用这个思想和逻辑去做的,所以你世界再大,再开放世界,它其实也是可以的,但是这个同学的问题问的还是蛮专业的好,还有什么问题哦,render graph是吧,对对对哦,有个同学问我说。
render graph到底是个高层的功能,还是个底层的功能啊,这个问题问的非常的好,其实那个虽然render graph在我们这个课程,render这个那个就是rendering,这一趴的话。
最后就讲了,听起来像一个非常高级的东西对吧,但实际上的话呢,大家如果有机会参与下一代引擎的研发的话,我们会认为就是render graph,至少我个人认为这是很个人的。
就是说它是一个非常底层的functionality,什么意思,就是说我们理想的话,我们希望下一代的引擎,它的绘制的基础是通过render graph的,然后呢。
大家的各种各样的feature是架在这个graph上面,这样的好处,就是刚才我讲的就是在这么复杂的,就rendering pipeline的情况下,在这么多复杂的这个资源的管理和调度。
在那个就是非常难以驾驭的,就是graphics SDK的情况下,我有一层中间层,把你的所有的资源的调用,硬件的接口,包括你的前后的依赖关系全部给你管理好,所以我个人认为就是说render graph。
是一个底层的那个functionality,但是很就是目前的现实是说,这个概念呢提出来的年头并不久,大概可能还不到10年吧,那么其实因为就是工程上的东西是这样,就大家提出的概念觉得很棒。
但是呢你真正在这个游戏引擎里面,非常的复杂的时候,其实大家也是在一步步的摸索接口该怎么定义,它的语法该怎么定义,包括就是它的资源该用什么一种语义去管理,能够既具有这种管理的一致性。
又能够呢诶这个管理的这个又能够进行,具有无限的可扩张性,这就相当于你定义一种语言一样的,就像C语言,为什么今天这么难学,大家还取代不掉,就是因为它发展了20这个几十年之后啊,他的能量他能力是非常丰富的。
那这种丰富度不可能是轻易的,被一个新语言就给取代掉,也是一个道理,所以我看了render graph是一个语言,是一个底层的渲染语言,啊这个同学问的就非常的专业了,他说TAA怎么去除鬼影。
那说明这个同学,他其实是对这种算法是有思考和理解的,确实是ta是有鬼影的,那如果做得不好的话,实际上它会就是你会因为是这样的,就是说当我这个环境里的东西在动的时候。
就是我们叫的就是parallax或者ACLUSION,发生变化的时候,实际上很多你在当前帧看到的东西,在之前真是没有的对吧,你的你的那个就是那个motion vector,它不能表达。
所以呢这里面是有很多的,就是说hack,就比如说你的这个motion exture跑得太远了,我就说哎不行,你虽然理论上你说的是对的,但是我还是不信对吧,还有就是说诶你的两个颜色差别太大了对吧。
就比如说你刚才这边是红的,但是我找到你的,在上一周的时候你是绿的,我说大哥,你这个有点魔幻了吧,那我也不信你了,所以说其实这里面有很多很小的trick,这个大家如果查了个论文的原文。
包括它原始实践的时候,这里面都会有一大堆的很奇怪的代码,但这些dirty的代码,这些代码甚至里面还写死一些magic number,那用这种大概是这样的一个思路去去除掉贵,因为大家按这个思路去想的话。
比如说它的空间位置差距过大,或者说有一些比如说其他的这种camera扩大,那我这个TA的话暂时会让他不去执行它,好的那因为今天又是成功的拖堂到两个小时了。
那那个就是说我们今天的就rendering的这一趴,基本上到此结束了,那我们下一趴的话,同学们还是我讲的,就是同学们千万不要怕课程难,因为那个就是说这一节课就是帮助大家啊,这门课就是帮助大家建立。
整个知识的基础体系的,那么就是说在后面的讲座中的话呢,我们也会尽可能的把这个东西讲的,就是说很明确很简单,但是呢他又让大家知道,这个行业的最重要的思想和方向是什么,所以的话呢期待大家五一之后我们再见好。
08.成像工具箱:透镜与像差 | GAMES204-计算成像 - P1 - GAMES-Webinar - BV1md4y1G71q
声音可以听到吗,诶好诶,首先欢迎同学们回到games 204的课堂,嗯,上节课上两周,就是我们彭一帆老师给大家分享了一个就是display的一个知识,还有一个像a r display。
还有大家正常display就display整个内容是非常至关重要的,因为我们最后无论是对图形还是图像来说,要给大家做一个展示呃,是非常需要这个就to pay这一块的知识。
然后我又邀请了就是uc berkeley的康丽王老师啊,他是跟我以前一个组的队友呃,它是在整个智能光学成像啊,就大家听过一节课可能会知道什么样叫微放,cd,主要是用来干什么的。
就是我们这那就we found,就是所谓的拨前,就大家看到这个锅前就一层一层的锅,它传播过程中诶,比如说我要受到一个透镜和这个透镜加工的不是很理想诶。
这个拨弦这个时候就会受到这个不理想的这个面积的一个扰动,最后我拿到在传感器上拿到了一个图像,就会因为这个扰动的一个结果产生怎么样这种那样或者那样差,就可以最后测量这个呃透镜表面加工的一些缺陷啊。
同时也可以呃测量一下这个透镜表面变形,where we found sensing,这个是在整个呃智能仪器里面是有一些呃非常广泛的应用,今天呢我们就回到我们的主线的课程。
就是今天给大家分享这个image toolbox呃,这个主要讲两个部分,透镜到底是怎么成效的,也不只是我们就是传统的一个简单的透镜啊,我们可以从呃一个selemodel,也就是一个薄透镜的一个模型开始。
然后去给大家追溯呃,我这个不一样的材料,不一样的这个面型哦,对成像会有怎样的影响啊,这里面会给大家详细的讲解呃,这个近轴近似的情况下,我这个两个界面在一个弧,在一个弧形下面,我到底是怎么计算。
然后呢因为这种各种各样的一个设计的问题啊,比如说我们就是想喜欢用球面镜,因为球面镜加工起来还比较容易,上面也会比较低,在这个时候呢,就是我们非常容易带来各种各样的相差。
这个相差是直接影响我们最后拿到了相制的,所以说哎如何优化这个相差的,这个在我们这个这节课里面会详细地分析这个问题。
今天呢就是内容会比较密集啊啊就我们就分三个两个两个半主题,三个主题来给大家分享,第一个就是一个parallel optics,就是大家所谓的一个近轴近似的一个光学,这个可以详细的拆解。
我这个透镜的就是表面到底是呃会出现什么样的一个现象,然后去怎么计算它,然后第二个就是retransfor matrix,就是transfer matrix,是一个非常好用的工具,就我们这么一个透镜。
我通过这个retransfer matrix,我可以直接的比如一个一根光,然后它有一个发射的角度,我这一根光它会穿过一个位置,这个时候这就是一个光线的一个方程,光线的方程。
我透过这一个透镜的表面或者一个介质的表面,我会怎么样的变化,所以我这一个retransform matrix就可以直接的描述一根光线啊,经过透镜啊,或者是介质面怎么变到下一根光线这么一个过程啊。
它是一个非常简单的一个二元方程,而且也是可以像叠加,先把多个透镜组合在一起,就可以用这个return rs很容易的去描述整个光线变化的过程,然后最后呢就给大家分享的一个主题就是aboration。
就是and componenses,就是我们各种各样透镜啊,它都有自己的相差,无论是什么样的面型啊,没有常见的呃球差呀,呃会差呀,下载啊,厂区畸变啊,子午会杀或是会杀等等等等,各种各样的相差,嗯。
这些相差是怎么产生的,对我们图像会有怎样的一个质量的影响,嗯下面会给大家揭秘,然后到最后会教给大家一些方法,到底是怎么校正它,在这个课开始之前啊,先给大家说一下作业的问题。
就整个home one就是基本上已经改完了,就是我们这个整个coding的部分是在60%的成绩啊,然后最后结果的好坏就是占20%的成绩,然后我们这个结果呈现的一个就是report写的怎么样。
这个时候也是占20%的一个分数,就是从就是第一次作业的一个结果来看,就是呃感觉可能第一次作业是不是有点太多了,就是大家有很多呃完成的一个情况不是特别好,就只有嗯不多的同学就是做完了整个流程。
而且达到一个比较好的效果,然后我希望大家就是呃后面能继续就深入这个作业,因为我们课堂上讲解的知识,因为时间啊还有一些嗯就是内容的一个丰富程度,就不可能面面俱到,这个时候还是需要大家在课下多下功夫。
因为这个课程是就免费给大家去发放一些呃,大家以前很难学到的一些知识,就是这整个体系构建下来之后呃,其实要是能完整的学下来去,对大家有一个非常好的艺术,无论是在找工作。
还在大家对大家做研究来说都是非常有意义的,就还是希望大家能坚持下去,就把整个作业这个地方做好,然后第二次作业就是明天后天会给大家发放下去啊,第二次作业的主要内容就是一个hdr的一个fusion。
还有一个local tmap distay,是继续用我们前面那套框架,我们会把这个标准的一个嗯i s p的一个框架给放下去,就是有一个work one的标准答案,然后再基于这个代码框架。
然后再去加几个函数,一个第一个就是我们通过多次不同程度曝光呃,这么一个饶图啊,要给大家去做一个融合,那融合之后其实想要我们融合会得到一个非常高倍数的一个图像吧,比如说可能呃就是14位。
14位的每一张截图,然后我再融合,每隔四个stop融合七八张,最后可能拿到二三十位的一个图,我想想显显示在我们的一个显示器上就可以做一些local tmap,我给大家一些就reference的方法。
还有一些参考资料,大家可以呃查这些参考资料,去把这整个的fusion跟tmap实现呃,其实目的呢就是能达到一个最好看的一个效果,这个同学们也不一定非得局限在我们,就是给到了这个就是参考答案。
或者是嗯像你就是reference的一个参考资料,大家也想要实现更好的方法,也可以去呃搜索一些更新的方法啊,这个在我们最后的一个呃结果,因为你的结果更好看,会有一些加分的,来下面回到我们课堂的主题呃。
第一部分就是讲parallel object,也就是近轴光学,为什么要禁轴光学呢,因为我们在进球的时候有非常多的地方可以可以做近似的,因为可以做近似,就是我们很多的计算都可以变得非常简单。
这个时候我们用数学形式上去描述它啊,就会显得比较好看,呃在说这个呢我们就是想一看到一个这个clemodel,就sl model就是呃一个最简单最简单的这么一个透镜的模型,就是我们的一个几何光学啊。
特别是在图形学里面,我们非常希望我们这个复杂的透镜诶,最后可以简化成一个薄薄的一个纸片的这么一个薄透镜,我们不用考虑后透镜这么乱七八糟的性子,然后通过这种近似呃。
我们就可以非常容易的就是呃在图形学里面去做一些像聚焦呀,成像呀,就是光线的弯折呀,猫会很容易的通过这个薄透镜啊,然后去描述这个光线到底是怎么变化的,然后这个很简单啊,大家可能初中的时候就学过这个。
我们一个像比如说我在s的一个位置呃,这个物距的一个分之一加上相距分之一,最后等于焦距分之一,然后我们这个放大率呢呃实际上就是等于一个我最后项的一个大小。
就是s prime减f比上个f就是我最后的一个呃一个放大的一个程度,然后这里面这个薄透镜啊有两个假设哈,第一个假设就是我这个光因为是薄的嘛,因为而且像这个我们这种透镜这个中心这个位置啊。
你他虽然说一个弧面,但是我离中心的位置,我可以假设它是一个平的,它又是很薄的嘛,所以说这个时候光穿过光心的时候,就是光珠正宗的性的时候,我们可以可以理解为整个光线它的传播不受影响,就是它没有被偏折。
也没有被拐弯拉,那么一下他就是一个直的打过去,然后另一个假设就是嗯就是我一个平行光打过来,有这么一个平行光打过来,我最后这些平行光都是可以呃,对于理想的宝透镜啊,是都可以理想的汇集到这么一个点上。
无论是斜着入射的一个平行光,还是值得入射的平行光都可以呃理想的汇聚到我这个小品面上,但是实际上呢我们日常生活中的各种就真实的一个透镜啊,它是还是挺复杂的,呃我们比如说我这是一个例子啊。
就我们一个关于系统里面,就是其中把其中一个透镜单独拿出来,就整个透镜的表现它是由哪几个因素决定的呢,第一就是就是我整个透镜的一个面型,就是我这个透镜比如说是球面的呃,是抛物面的或者椭圆的,椭球面的。
这个时候这个透镜的面型是呃,决定整个透镜参数的一个决定性因素之一,那第二个就是呃透镜的一个本身的一个就是fting index,就是它的折射率,还有我介质外部介质的折射率,为什么要说外部介质呢。
比如说我们常见的一些呃那个汽油的显微镜,我要提高它的一个numerical app,我需要对这个样本进行精油,这个时候我们外面的介质也不再是空气了。
这时候我们就要考虑到外部环境的一个reflecting index,当然它本身的这个reflect index也是很重要的,然后第三就是整个孔径的一个,就这一个大小,就整个就是我特定的口径到底是多大啊。
这个也是呃整个透镜的一些决定性因素,但除此之外啊,我们要提高整个透镜的光学性质,我们经常会有很多做法,像光度光学镀膜,我有时候镀增透膜,有时候镀滤光膜,哎,有时候做uv膜,有时候做那种红外截止滤光片。
诶这种每一种膜它都有自己的一种特性,这个度这个透镜表面的镀膜呢啊是除了这三种呃这种决定因素之外,其他的一种非常重要的一个因素,就是说到这个透镜就不得不提的就是一个啊折射的一个问题。
就是大家就是以前就学过啊,这个snice law,我入射角是一个c盘,一假设空气哈空气这个呃这个折射率近似为一,然后水里面就是1。33,水里面1。33,然后我们这个入射角是sone,然后出射角是c2 。
我这两个之间的关系啊,实际上通过snl就可以很简单地描述出来,就是n介质里面的呃,就是介质one,但是我们这个其实这个snatch law是怎么来的呢,嗯其实啊这个里面有非常多的一个。
就是其实大家以前学过这个最短光程的原理,呃,比如说像大家以前上初中做物理竞赛的时候,呃,有就是比如说举个例子哈,就是一个人在河边走,不要在河边,我要走路,怎么在河里面,河里面有留宿。
一个人在就河里面随着流速在走,诶,我这个人怎么样,作为一个怎么样的路径才能最快的接到这个人呢,因为人在水里游,跟在路上走,他这个速度不一样,这个时候就跟我们现在遇到这种情况是一样的。
在在介质中就是光实际上我们就可以观测到的一个速度哈,它是不一样的,然后通过最短光程原理,我们就可以推导出这个nslog,这个有同学问啊,这个镀膜有啥优势,其实呃各种情况都有镀膜。
比如说大家做一个有非常多的一个镜片啊,这种时候我要做一个增透膜,就减少反射的时候,这个image 10000这个同学回答了这个减少反射的时候,就会可以很大程度的减少这个杂光。
就我最后可达到的图像相机就会很少受砸光的影响,比如说我们要想要做一个uv镜,就是我们像我们拍外部景观的时候呃,有非常多的一些像呃紫外的一个成分,这个紫外的成分也可以被我这个ccd或cmos感知到。
那这个时候其实这个时候就会导致颜色会有一定的偏移,就是我们就是不想要的一个颜色偏移,比如说我紫外多的时候,诶,我可能观察到的这个图像就偏蓝诶,这个时候就不答对了,但有时候红外比较多的时候呢。
我想要把红外给滤掉诶,这有时候就红外截止,说这个你们这一曼同学回答这个还是挺好的,来我们继续,然后我们这个理想的一个附近啊,从一个比如说我要从一个点发射一个光,我最后想要拿到一个完全平行的光诶。
这个理想的一个特定面是什么样子呢,其实一个对一个单的一个表面来说,单单单单介就是从一个介质入射到另一个介质啊,比如说空气注射到一个玻璃里面。
他理想的一个单的一个surface应该是一个hyperbolic,也就是抛物面的这么一个变形,才可以达到理想的从一个点发散成一个平行光,或者是反之,从一个平行光理想的汇聚到一个点,不产生相差。
这时候就会产生一个泡面呃,所以说呢我们有时候想从一个点就是唉比如说f1 ,我想要到达f2 ,然后中间啊就是从理想的汇聚到22,就是我们就可以用两个泡面的,一个就是平抛的一个透镜,然后去组合起来。
然后就可以从一个点f一直接映射到一个f2 ,就是f一的,像这个f2 就完全对称的这么一种情况,但是哈这个我们从来没有看到过,就是日常生活中从来没看到过这个抛物面的一个透镜,这是为什么呢。
就是大家其实最后就是因为经过这么多年的一个反复的一个摸索,就是我们会发现这个球面镜是更容易加工的,就是大家要做一个全面镜的一个模型,我只要知道半径,我可以非常容易的把这个球面镜的就加就加工出来。
就大家可能很多学光学工程的一个同学就自己磨不透镜诶,大家知道这个先开粗,也要把这个透镜这个粗模开出来,然后再去抛光它,然后这个时候球面镜就非常容易操作,但是你要加工其他的面型,然后就比较困难。
因为有很多参数你是不可控的,所以说就历史的原因就是让大家历史跟成本的原因,就是让就整个球面镜面镜是球面的啊,因为它更易于加工,还有更于对心,比如说两个呃两个透镜的两个面,一个是球面,一个是非球面诶。
这个时候诶还是可以对新的,因为我整个球面都是一样的,但是我两个都是非球面的时候,它的光轴加工的时候就很难达到它一个光轴的一个一致,这时候对加工跟对齐都会比较困难,但是呢这个球面它有一个问题。
就是我一个平行光,我打过来到一个球面,诶,这个时候我发现这个最后这个图他没有办法理想汇聚到了一个点,然后在这个下面上会产生一个呃斑一样的一个东西,就是一个点,不再是一个点了,它会产生一片这么一个光晕。
就是感冒到一个图像,然后感光感受到这个东西呢,这一片晕开的东西从点然后散开到一面,这个就叫点扩散函数,从一个点散开了,其实很容易理解,就是点扩散函数,然后因为球面引起的相差,也就是叫球差。
这个球差是为什么呢,就是我距离这个光轴距离不一样的时候,我最后汇聚到我整个光轴上的一个位置是不一样的,比如说我这个呃,像这个例子里面就是我离中心轴越远,我汇聚到地方越近。
但是我的观测始终是在一个面上进行的,对不对,我在这个就是相面上就拿到这么一个这么大一个班,但这个班呢然后会有一个强度的分布,这就是所谓的求差,当我们把这个如果假。
我们假设这个这个球面这个相差是就是每个市场都是一样的哈,就我们最后拍照的时候,假设都一样,这个是因为求差引起的这么一个相差,就相当于我这么一个点光的函数,实际上大概是长这样一个强度分布的平抛哈。
这么一个强度分布是在跟图像做一个二维点积,然后我们就会或多或少的发现诶这个图像变模糊了,这个时候我们就不想要这种相差,这个就是所谓的求差,我们去如何呃去叫这个球差呢。
我们继续在刚才这个这个这个球差到底是怎么产生的呢,我们要去描述它的时候,然后就需要啊学到一些就是整个近轴近似的一些知识,来去简单的去描述它啊,为什么要进轴呢,就我一个角角度特别小的时候。
这个c它远远小于就是派的时候,这个时候sin theta就近似等于theta,那cos theta也就是呃一减约等于一啊,tan theta也是约等于c然后我们用就第一阶第一阶的一个技术。
它勒级数展开啊,我们可以看到fc很小的时候,我们高阶都可以约等于零,这个时候就不考虑,这时候也可以约等于等于零,之后我们就可以拿到进轴的时候呃,sin theta是约等于theta。
cos theta等于一,那这个时候方便计算,然后这种然后再recall一下这个reaction啊,就我们刚才拿到了这个n sin sy等于sin sone,然后n to等于一个。
然后等一个n two乘以3c的to,这个时候我们要通过进球进四的时候,我们那个c3 e c t2 非常小的时候,那我们最后会拿到什么结果呢,是这样。
我们就可以非常简单的拿到这个sone n one sone,对one to sit to,因为这个已经通过近轴近似这个sc tone也就约等于c tone,我们要推理一个标准的从一个介质到另一个介质啊。
这个光线是怎么传播的,比如说我们object p我通过啊这么一个,比如说这是一个球面,一个球面,然后这是介质一,这是介介质and prime,诶,我这个时候我最后拿到了相反p这个到底是什么位置呢。
这个位置是啥,然后这个角度又是啥,对不对,我要想要得到他们之间的关系,我们要如何推理它,其实这个大家要是学过物理竞赛,可能是大学物理可能都会讲到这个进球的一个fing,这么一个问题,今天继续给大家呃。
就整个把这个推理一遍,我们考虑到这个object p啊,发出一个光线,然后v然后它的角度呢是you啊,这个距离就近似为l,然后呢我们这个这个点的一个位置啊,就高度就定义为h。
然后这个呢是e因为这个u已经非常小了,然后这个z z然后乘以u就是约等于这个h对吧,然后这个h呢实际上这个也是u啊,这很容易这个再乘一个这个u呢就是u方了。
这个时候就是e就等于一个就是等于一个巴拉巴拉乘u方,然后这个时候u方二阶小数对吧,这个所以说大家可以把这个这两个点近似成一个点,就是e约等于零,然后su就可以近似为h除以l也就是这个除以l那cos也有。
就很容易就是呃这个z除以l对吧,然后最后我们怎么样通过我们已知这个z已知这个已知这个u对吧,然后介质n n prime,那我们怎么样去求导,然后我们还要需要知道这个球的半径对吧。
这个球这个半径我只要得到这个p的一个p prime这么一个位置,然后我们去画一条辅助线,辅助线这个比如是一个呃球星,然后就可以拿到,这么一个关系,然后通过进球数进四,我们可以知道这个n prime对吧。
这个介质在这个地方的位置,通过它一个cs law,你就可以得到第一个方程,n i乘等于n撇乘以i撇,我们再继续啊,同时呢这个u也是这个u就是等于h z,那么通过然后从这个p prime看。
我们这个这个是未知量哈,z prime是未知量,我们要加这个未知量,这个u ram这个角度就等于h除以z对不对,那这个时候我们就可以联立得到这么两个方程,然后通过联立这两个方程呢。
我们我们这得到这么两个,但是我们还是因为未知量非常多嘛,这个h是未知量啊,z prime是未知量,这个r这个角度a也是不知道,但是我们有很多角度的关系,我们最后想要强调这个i跟二prime的关系。
对不对,然后这个时候我们又通过就是三角形的这个关系,就这个角i i prime就是a就等于一个i pm,加上个you from me,对不对,有这个三角的关系就可以得到,然后同理呢。
然后这个这个这个这个i呢就等于啥呢,就等于一个这两这个这个这个三角形,看这个三角形,看这个三角形对不对,然后这个i呢又等于一个u加上a对吧,这个i撇u跟a的关系,还有i,当然这两个就可以连接两个方程。
所以我们现在已经得到了四个方程了哈,就是uu撇i啊,还有关于这个a的一个方程,然后这个a呢因为h又很简单啊,我们这个r一是已知这个球面是已知的,球面半径是已知的,所以说这个a可以近似得到。
然后最后我们通过联立这些方程,就可以通过计算得我们这个i跟ip之间的关系,那我们最后消掉这个h,然后再把这个a也给消掉,然后最后我们拿到这个z跟z撇二个m撇之间的关系,然后把这几个变量之后消掉之后。
我们就可以拿到的呃,很容易的拿到呃,这这个就给大家看一下结果,就是我们拿到的结果就是消掉这个h我们可以拿到n,然后这是u加上a也就是i n i等于n prime啊,乘以a。u对不对,也就是把这两个方程。
也就是这两个角度的关系,就是第一个方程对不对,然后第二个方程是什么呢,就这边的介质n prime,然后乘上这么一个就是呃跟z之间的关系,把这个这个方程继续往下推理哈,把这个a换掉。
n等于这个a等于h除以r对吧,把这个换掉,换掉之后,我们就可以得到这个z跟z prime之间的关系,让我们这个r是已知的哈,然后我们z已知我们最后想要得到z撇,最后我们把这个z撇给推出来。
哎我们最后通过计算就可以得到这个zz z撇,就是通过这个方程啊简化一下,然后就可以拿到一个r乘以n撇,也是这个半径乘以n撇啊,比上个他们这两个呃就是介质之间的一个呃折射率的差,诶这个时候大家看这个嗯。
这个透镜这个公式是不是越来越接近于,我们就是正常成像的一个公式了,就大家越看嗯,约了约那个好看一些,然后这个时候我们真正的一个透镜又是什么样子呢,我们就日常生活中可以见到了一个透镜。
我们通常是由两个球面来构成的,那我用一个近似的一个方式,我们就把两个透镜连立起来,就是一个是正的一个弧面,一个是反的一个弧面,这个时候把这两个联立起来,就可以得到这个s0 ,从s0 发出一个从。
s到p这么两个之间的一个关系,我们就可以得到物距和像距,因为最后是通过两个介质嘛,物距跟像距,物距分之一加上相距分之一,就等一个n l,当这个时候还是考虑到呃,我们拿到了这个高斯是薄透镜啊。
这个也就d就是约等于零,不考虑这个厚度,就因为我们是都是进轴嘛,这个进轴这个位置是非常小,然后就推理得到了一个lmarket equation,就是n l也就是这个透镜里面的介质减上一。
然后乘上一个r一分之一,减上r2 分之一,就是两个透镜弧面的一个分之一差诶,这个时候大家看到这个东西是不是跟大家薄透进了这个f分之一,就一样的吗,实际上这个东西啊。
实际上就是你可以近似的理解为就等于f分之一,这个就是一个理想的一个薄透镜的这个成像的一个过程啊,它有非常多的一个一个性质啊,比如说这个这个叫我们就要又常常把它叫做高斯透镜。
然后我们从这个landmarx formula去推,我们这个就是物距分之一加上相距分之一,就等于一个f分之一,对不对,然后这个时候又又等于n l减一,然后比上两个呃半径分之一的差。
这个时候f分之一就等于中间,这个是我们就可以很轻松的就把这个f给求出来,也就是它的分之一对吧,这就是f,然后再回到我们这个薄透顶的这么一个模型啊,就我们最后我们可以看到。
我们就是他把它简化成我们正常的一个透镜的时候,我们可以只考虑去特别是薄透镜,我们可以只考虑这个f这个问题,就不要考虑两个球面r12 ,这个再加上这个折射率,大家算算半天就非常困难,非常累。
所以这个我们通常就简单的用一个f去表示这么一个薄透镜,然后下面给大家讲一下这个retransform matrix,我们再从这个薄透镜去出发啊,就是我们假设这个基于两个假设,一个就是胖头进四。
然后另一个假设就是一个薄透镜,我们有这么一根光从这发出来入射到透镜到这个位置,就是i这个位置c他i这个位置对不对,这根光他有一个穿过这个点,然后有这么c它这个方向,然后我最后通过这个透镜,我出来之后。
我们拿到这个光线就是变成x啊成然后从这个对不对,这是我们新出来的光线入射光线,我们如何描述从这个光线到这个光线变化的过程呢,这个时候我们就要考虑到这个retransfer matrix。
还是像我们我们只是在这个进度近视下去算它,因为这个进近速算起来比较容易,就是我们静音下这个sin西塔就约等于这个c塔啊,所以说这个角小的时候就比较容易算了,然后同时也是考虑到是一个薄透镜。
就不考虑这个入射点和出射点之间的距离,就是这个d就是一就把它当成零就好了,这个时候就方便大家计算,诶这个时候我们我们已知啊这个雾的一个位置是s i,离透镜的一个点的距离是s i。
然后这根光线的一个角度就是c的i,对不对,从一个,c塔对不对,这个地方就等于一个si乘以一个c塔i,那这个x0 等于啥呢,x0 其实它就等于它也等于这个,对不对,但是他同时还跟这个物距有关。
就是它也等一个s0 ,乘一个c0 ,这c其实是out,好像是s out,是s1 s2 ,然后最后我们想要知道他们俩之间的关系是个是个啥,然后我们就可以动用我们的工具,这一个我之前推导到了一个工具对吧。
然后我们知道这两这两个x1 t x2 ,把他俩把这个入射距离跟注射距离这两个关系,那拿到拿到之后,我们要想要,其实我们想要求的呢,实际上就是这么一个x0 跟三点,这两个都是未知量,我们已知量是啥嘞。
已知量就是c塔i x i还有个透镜的一个焦距,然后通过这个透镜的焦距公式,然后这两个又相等,对不对,我们就可以呃用两个方程解两个未知量,其实再结合这个等一个对这两个方程,一。
诶我把这个时候我就把这个s0 n c t0 解出来,对不对,你知道两个二元二次方程,这个很容易就可以解出来,这个出射光线的角度跟位置,诶这个时候我们发现,通过简化之后,最后这个结果还是哎挺好看的哈。
我们最后拿到一个matrix,然后对角线是一,然后我的这个,左下呢左左下这个这个二一这个二幺这个位置就是负的f分之一,所以说这个时候我们把这个2x2的这么一个矩阵,它也叫这个a abcd matrix。
就是光学里面的一个呃retransfer matrix,这就是大家最常见的一个retranser matrix,有了这个return matrix,我们可以描述一个透镜。
同时我们知道整个光学变化的过程都是线性的,这个时候我们就可以很简单地通过这么一个region matrix去描述,这整个一个复杂的透镜,非常容易的去描述,最后所有的操作都变成了一个矩阵相乘对吧。
这个时候诶大家变都变得非常开心,就变得非常简单容易,当然除了这个通过透镜的一个变化,我们还可以就是把整个光线在空间中自由传播的这么一个,也可以用这个region matrix来表示。
哎当然同样的像反射呀,呃折射呀或者平面折射呀,曲面折射啊,我都可以用这个reacation来表示,它基本上就是整个几个光圈里面很万能的啊这么一种表示方法,但这个时候我们在图形学里面去做计算的时候。
这个光线通过这个return max变化,我们也可以可以就很简单了,通过我们这个整个图形学的方法去把这个最后我们想要的相差呀,或者是渲染的一个图像拿到就这跟物理相关的一个图像近似的。
哪个不是完全理想的一个东西,然后当我们考虑到就是我们经常嗯会遇到这么一个光学的黑盒子,就是我们有很多就是比如说文件啊,就光学文件就没有,不是很方便,就是向外透露的时候,特别有非常多的企业。
比如说像比如说像比如说华为以前跟蔡司那会合作的那首诶,我这个蔡司我这个想设计不想给你,但是我又必须得给你一个,就这么一个黑盒子来给你去去描述这个光线是怎么变化的。
这个时候你就可以通过这个黑盒子来评估向日诶,这个时候怎么办呢,其实我们通常都是用一个retransform matrix来表示的,但是这个因为整个管理系统会变成一个有非常多的镜片之后,就会变得非常复杂。
就没有很多的精,他也不再是一个理想的薄透镜,也不是理想薄透镜的组合,还有各种各样就是非球面镜啊,然后各种各样的位置又有光缆嗯,然后又有又有世兰,在这个时候大家想要描述它。
通常就拿到一个非线性的这么一个remain的一个form,也就是这个x out sout,它它同样也是一个x x1 c它印的一个函数,但是我这个光线跟角度都必须用两个非线性的一个函数来表示。
这个时候我们去如何去通过这么一个最近的一个呃,这么一个映射函数来得到我们这个a d a b c d matrix,因为我们还是想简单的一个线性的一个变化,来表示我们最后的一个结果。
因为这样的话对大家处理来说就会变得非常容易,诶这个时候大家就想想到了一些数学上的方法,比如说这个时候a b c d等于啥,因为我们这个时候你要看,如果大家看这个方程不是很好看的话,对不对,就就是。
round f比round x i x求导,哎这个就没了,对不对,然后就可以拿到一个a诶,这个时候我们就发现嗯,当当然我们这个时候也要让这个进度进四去成立哈,就是这个c3 i非常小的时候。
就可以近似为把这个导数,把它的导数对对x的偏导数近似为呃,我们这个a b a b c d matrix之类的一个a,那同理,我们也可以对这个round s,跟那个对这个c ti求偏导。
这个时候我们就可以很容易地得到b,当然它是conditionally嗯,在这个比如说呃c塔i等于零的这个位置,对啊,这个时候我们就可以拿到一个近似的一个a b c分进去,它因为它描述非线性的过程。
它不是一个完全理想的一个线性过程,最后说我们通过这个求导,可以拿到一个近似的一个a b c d的一个matrix的过程,那当我们这个a b c max,比如说在我们空间里面,我们可以知道通过一个薄透镜。
这个a b c d matrix,它是一个f分之一这么一种感觉,对不对,但我们实际上我们也想看到的一个,比如说我在free space propagation,就是我们在自由空间里面传播的时候。
出生在那这个d就是近似等于零哈,咱不管他啊,这个这个时候近似不等于零,因为这是在自由空间中传播d这么一个过程,诶,我们我们发现这个入射角出射角是不变的啊。
但是我们这个si到x x一到x2 这个位置变化了个d,所以说我们在a b c d这个地方就加了个d,这个也很容易去推出来啊,啊当我们遇到一个折射面的时候,哎我们就发现这个d啊就是实际上是n一比n2 。
到了一个mirror的时候呢,mirror其实就是完全的一个位置就不变,就可以知道a是一,b是零,那c他角也不变,对不对,这个就可以拿到一个对称的一个matrix。
所以这个a b c d a matrix每个值的一个这值啊都是有它一定的意义,就是说我这个b啊通常跟这个空间传播这个横向的位置有关系,然后d呢就跟直率就是通常率有关系,然后像像这个d这种情况呢。
就是n一比n2 ,它等于它等于一,就是n一等于n2 ,这个时候诶这不就是不就是它没有变嘛,但实际上它这个我们要考虑这个theta的这个正负号,这个时候a b c d matrix就可以很完整的描述啊。
这个光在空间中的一个传播,然后讲到了一个刚才讲到了一个单透镜的传播,当然我们有很多透镜的时候,我把这很多这个透镜叠在一起的时候,这个时候我们想要表述它,而这个时候用了abcd matrix。
就是也就是refer matrix就会变得非常容易,那我们现在有三个透镜啊,就f1 f2 f3 ,那我这个input plan还是sin跟s i s e,然后拿到的位置是x in。
这个时候我们就可以把这三个retransmissions按顺序去做一个矩阵相乘,最后我们就可以拿到我们最后要输出的这个就s2 跟这个set out,就是它最后的值就非常简单的一个计算。
哎说到这个return of matrix,就是我们呃就学光学的同学可能会接触到,但是所以说要给其他的一些就是经常做算法呀,或者是做那底层图像处理。
同学去给大家补一下这个a b c d的一个matrix的违规知识,这对任何的一个光源系统,无论是它都复杂,我们都可以用这个retract matrix来描述它。
特别是像我们这种碟子在一队of tical system嗯,我们就有非常多的elements,每一个elements啊有不一样的这个retract matrix,同时比如说他们之间有空隙。
我们就可以用那个飞space propagation这个a abcd matrix,然后最后用他们的乘积来拿到,我们最后想要的结果,当然所有的这个return matrix只是在这个几何光学里面使用了。
这个是呃不太适用于我们一些混合的像抄表面啊,d e啊,这些元件的一个描述,就是我们通常还是局限于啊对几何光学的一个描述,但是在我们镜头设计的时候,这个retransform matrix是非常有用。
但大家有兴趣的话,可以做一些光学镜头成像的一些仿真,就比如说呃这个复杂透镜,我想要真正的复杂透镜,就我们就是整个腾讯学里面做渲染,大家很多时候都只是在用一个小孔成像的模型。
来对我们最后一个地方去做一个retracing啊,去去找跟着物体的焦点,那我们就可以通过这种abcd matrix来给大家做一个realistic and model,来去做一个渲染。
就可以拿到一个更加真实的像,类似于拍照的这么一种结果,嗯大家如果对这个有传送matrix感兴趣的话,可以大家建议大家读一下这个principle and applications were pencil tracy。
让大家感兴趣的话,可以读一下这两篇文章,他让我们嗯就经常做上瘾,同学就是可以想办法利用这个result matrix,就是就不再是像之前大家去追cos,大家如果对做cos做光追的时候啊,是非常困难的。
就是大家会经常问你追100根光线,最后拿不到一张非常好的图像,你会拿到那种星星点点的那种班的那种感觉啊,大家上过这个game 101的课,可能会学到过这个部分。
大家怎么样通过这个return of matrix嗯来去呃,大家可以仔细的思考一下,拜拜,然后第三个课题给大家分享,在这里的是一个components and elebrations。
就我们刚才讲到的都是不简单的一个薄透镜的模型,也就是还有一个就是晋州近四成像的模型,但是这种就是理想的薄透镜呢,它是在我们日常生活中是不存在的,真实的透镜是非常复杂的,就是我非常非常多的一个就是镜片啊。
然后每个镜片也不跟各种各样的变形,各种各样的一个位置,还有我们这个光缆啊,还有我们是蓝,还有我们这个入同出同等设置,它是一个非常困难,非常复杂的一个系统,哎到今天为止,就整个镜头的一个光源设计。
通常还是描描述为the art of optical n,现在还是一个艺术,而并不是一个科学,就是它背后的一个原理,大家很多时候摸得不是特别清楚,就这个时候啊。
因为我们整个透镜是一个非常高的一个非线性的一个过程,他在优化透镜,我这么多参数在一起优化,能不能收敛到一个好的地方呢,是不他说这个透镜优化到今天为止还是the art of obstacd。
那有这种真实的透镜呢,它就不可避免的就是有各种各样的相差呀,这个相差就是跟光源设计本身就是密切相关,就这举两个例子,这是一个单反透镜的一个模型,我没看到,还有非常多的一个镜片,用各种各样的镜片啊。
这几个镜片是有点对称的结构,这里面还有一些胶合透镜,这个胶合透镜通常是用来消色差的,后面我们会讲到,那这个时候嗯,比如说这种单反头型,它通常是有十几片,可能最多18片,20多片。
这个时候来矫正各种各样的相差,然后呢像我们的手机摄影到我们的手机,今天嗯,据我所知,现在已经很多做公益的公司已经开始研究八个镜片,有这么一个手机镜头,大家可以想象到这么小这么短的一个地方塞八个镜片。
它的难度是有多大,然后我知道大家学过非球面镜的同学,就知道我们后面有高阶参数,有很多个透镜的高级参数呢已经涉及到20节了,那为什么就是东西要涉及到这么多阶段啊,其实有两个原因。
第一个原因就是就它本身是一个非线性的过程,就是很多相差它不大好直接优化,就不得不去用更直接的一个接触来优化整个透镜成像的质量,那这个时候有时候大家对这个光学这个镜片摆放的位置。
就是横向的位置其实非常重要的,这个时候没有优化好,我们就不得不去优化更高阶的参数来去校正我最后的相差,当然这个最后呃你要优化的这么高,结实非常非常困难的,就大家这个要很敬佩这些光学设计的工程师。
就做了一些呃非常那种难做的一些东西,最后大家才可以拿到一个比较好的相机,当然这个也跟后面的一个算法密切相关,就是各个手机厂家呀,还有国外的三星oppo,无论是在光学上,传感器上嗯,还有照明上。
还有最后的算法上呃,各有各有所长,这个嗯最后才能使大家拿到这个这么便宜的一个手机,情况下,就可以拿到一个非常好的相机,这也极大地改变了一个大家的一个生产生活方式,然后下面就说一下相差。
因为这个相差是我们需要克服的东西,因为每个光源系统它都有自己的相差。
最简单的就是这么一个球差,球差就是我们离轴越大的时候,这个这个不一样的就是主轴外位置啊,比如说这个r的位置,它会遇到这个点,是不一样的啊,离得近的时候聚焦就非得去到这个位置。
这个球差它是实际上是沿着这么一个轴拿到了这么一个相差,就聚焦到不一样的一个光轴的一个位置,然后最后我的下面就一个,那我们最后这个下面就只有这么一个位置,所以说这个时候我们就拿到一个就是这么一个球差。
球差就会引起模糊,因为我们最后拿到那么一个点扩散函数,我们这个点光算函数,然后最后每个点都不再是一个点,它是一个班,这个时候我们相当于一个清晰的图像,我们最后可以拿到右边那么一个模糊的图像诶。
这个时候大家不喜欢,就想要把这个球差去干掉。
这个整个球杀的成因其实也是,就是它跟那个面形是就是一个球,球面是一个比较有关系的啊,比如说,当我们是这个时候,球差也经常在人眼里面就出现了,对我们,但是我们人眼是怎么叫的这个球差呢。
我们一个球面我们知道一个球面很难汇聚到一个点,就是我们可以看到在这个位置跟这个位置它都有一个汇聚,但是呢这个我们想要把这个球差校定掉,我们是不是可以校正一下这个球员的面形,诶。
这个地也就是他所谓的一个非球面这么一个设计诶,大家可以知道这人的眼睛啊,实际上是一个非球面镜,它它是一个复合透镜,人也不是一个单透镜,不只是晶状体,像我们前面的一个角膜。
也是对我们最后成像起到非常关键的一个屈光作用,说说这个大家做这个激光近视手术的时候,哎,通常就是把这个角膜上面打薄一点,就消一块出来诶,这个时候对你这个屈光度就会用到下降。
大家不要觉得这个做近视眼手术是削这个晶状体啊,这个肯定大家消不了,最后实际上削的是角膜,整个矫正球差我们大概总结了大概有四种方法,但会有更多的方法,我总结是有四种方法,第一种就是用一个符合途径。
我们用多个正球差跟一个多个负球差,比如说呃正确差了,像一个convex l跟一个复仇差一个conclength,就是一个凹透镜这种交替组合去减弱这个球差这么一种效果,那第二种方法嗯。
就是一个用一个更小的一个action,就是我更小的一个口径,这个时候也是可以降低这个球差的这么一个效果,大家可以想象,当我们这个这个口这个actor无限小的时候,它就是一个小孔,这个光都是穿过光心。
然后直接就穿过这个光心,大家就没有这个球差,就是理想的一个项目,对不对,这个更小的一个app是可以降低这个求差的,那第三种方法就是用折射率渐变的一个optical length。
如果大家学过光鲜的这种做法啊,这边可以看到诶,我们就直接改变这个就是一言不一样光轴它的一个折射率,我们可以通过一个p c b d啊,或者是一个化学气象沉积啊,就做一个光纤的预制棒。
把那个切下来当一个镜片诶,这个时候我们要通过精心设计这个折射率的时候,也是可以把这个球差给削减的,当然最常见这3年的办法就是大家真正到今天比较好加工,比较便宜的一个办法啊。
又想又想保到大的一个一个action,然后又不想用复合透镜啊,这个时候我们可以选择用非球面镜啊,非前面镜呢就是它不是一个球面,然后这个大家也很好理解它是怎么组成的呢,就我当我当我们看到这个透镜啊。
它离轴的一个位置,我们叫入,就是我们这个光轴在这个位置,它离轴的位置是o那我这个h就是也就是从顶点到这个面的一个距离,h6 他怎么表示呢,它是一个c成一个肉,这个是肉。
这个肉就是它的这个这个这个这个这个距离,这个c呢实际上也就是跟这个它是一个curvature,分之一,也就是1/2,也就是描述这个基本的一个球面,圆锥系数啊就可以啊,描述我这个面型里面是是不是椭圆啊。
圆啊,或者是呃这个抛物面啊,比如说当这个这个圆锥系数阿尔法,那这个我们把它简化起来,这个阿尔法等于零的时候,哎,这个时候就前面这个面它就是一个球面,对不对,然后除此之外还有跟这个肉相关的一个高阶参数。
这就是大家刚才描述的一个高阶参数,这个整个通过这个公式,就共同构成了我们这个非球面镜的描述,我们最后加工的时候在加工非球面镜还是非常有意思哈,这是怎么加工的呢,呃其实加工非全面应该是非常困难的。
就是大家通常是呃就直接呃如果要直接加工的话,就是先要比如说要先搞一个玻璃的,我加工这个玻璃的时候,先都可以用先用磨牙先加热,压成一个进,就比那个稍微厚一点的一个模型,或者是用一些金刚石车。
就把它车成一个稍微厚点的模型,那这个时候呢我们面前表面也没有达到这个要求,没有达到要求之后,我就这个时候这个过程叫开粗,开粗就是达到一个差不多的一个变形,开除完之后诶,我们再用单点式金刚石车。
诶那么一圈一圈把它拆出来,这就是一个标准的一个加工模式,当然拆出来之后会有刀纹诶,会刀完之后,这后面我们就必须用一种叫自由变抛光,因为这个磁流变抛光它是就是那个像沥青啊,我像类似沥青那种东西。
我通过去控制它的磁场,然后可以精准的控制整个沥青表面平面抛光的那个位置,因为这个抛多一点,抛少一点就会直接影响我的这个屈光可以相差,然后这个自由便是挺贵的,其实国内能做的地方也不多。
嗯我知道上海应物所是可以做这个啊,除了这个之外呃,像大家日常手机镜头生产的时候就不一样了,这个时候你要一个个去车这个透镜是非常困难的,这个成本比较高,良率也不好把控,这是咋弄的呢,人们就是通常去开模。
就是在一个高模或者是一个玻璃膜上,我先用就是这种加工设备,带点凝水车加工出来呃,加工作之后我把那个加热加热我的光纤材料,然后去住宿,就手机里面经常都是塑料的一个镜片去住宿,然后最后把这个拿出来。
这个就是大家所谓的非球面镜,有非球面积不只是可以叫球差,而非常多的相差都可以啊,通过非酋命令来去矫正,大家可以看到右边这个整个非球面镜最后获取的一个效果,跟一个球面镜汇聚效果的一个对比就非常明显。
可以通过设计让它去理想的绘制到一个点上,那球面呢通常它会有非常多的不一样的一个离轴距离,就会有一个非常多的一个汇聚的一个位置,然后下面给大家说一下这个彩色的想法,romantic operation。
这个就是romantic operation呢,实际上呃也叫那个imperfect focus,就是我们最后因为这个透镜我们之前学过就是不一样的折射率,会产生就是不一样对,比如说我这个红的折少一点。
来的折多一点,哎这个时候这个颜色就没办法汇聚到一个点上,不一样无长没法把汇聚到一个点上,这个时候就会产生彩色的相差,就这个就是大家常常说的一个阿倍数,这个阿倍数就是基于这个啊折射率。
根据不同波长变化来描述的这么一个值,所以说大家有时候配眼镜的时候,诶就看到诶,好家伙,这个阿贝数这个现在大家可以知道这个阿倍数到底是干什么的,然后如果这个就是这个材料啊,就是对不一样的这个波长。
它那个折射率不变,这个时候我们就可以把它认为是没有一个,后面这个就是彩色的一个色彩,这个是不大可能的,这个基本上都有嗯,所以说我们就通常我们的一个正一个正常的一个折射率的材料呢,这是我们有这么一个性质。
就是一个更短的一个波长,通常是有一个更高对应的一个更高的折射率,就是同一种材料越短的波长,然后我们就是就是折射率变大了,它对应的关键就是折射率大了,然后就是波长变得更短,也也可以说呃波长变短了。
折射率变高了,所以说我们可以从左边那个图就看出来,这个蓝色就是短波长偏执的更高,然后长波长偏执的更小,然后最后就产生了这么一个色散的一个感觉,啊这个叫呃to rome test,也就是红绿测试。
这个通常就是测眼睛的,这个就是有没有记者这么一个问题,大家可以仔细盯着这个e去看一下啊,去抬一下头,然后再去低一下头,去看一下这个e变相的过程,当然也可以,大家如果近视眼的话,就可以把这个眼镜给拿掉。
还得去看一下这个e,你可以看一下是红的清晰呢,还是这个黑的清晰呢,对不对,就红利测试呃,它主要是用于检查,就是被被检查者那个引擎的一个求进度是否适量,这个大家在配眼镜的时候会经常遇到这个问题。
就会经常遇到这个红利测试,这红绿测试它的原理呢就是用于就是不一样的颜色,它的折射率不一样,然后产生了一个色相差的这么一个原理,就是当然我们这个这个时候我们可以看到刚才说到了哈,这个折射率就是波长越短。
折射率越大,对不对,所以说我们这个绿的通常就是呈现在我们眼睛离上膜更远的位置,也是离就是前面那个透镜更近的一个位置,要相反,红光实际上就会呃基本上呈现在就是离就是透镜,我们眼睛的晶状体更远的一个位置。
就是我们在做这个屈光矫正,就是在我配眼镜的时候,这个度数大了呢,这个度数大了小了,会产生一个什么样的效果呢,我们可以看到这个因为短的波长,它的折射率更大了,它就成了像就会更偏浅一点。
然后长波长就更偏厚一些,然后呢相反的就是当我们校正啊这个度数,就是我们拿到眼镜上就看到这个绿的更清晰的时候,就说明这个绿色的就离顺网膜更近,当我看到这个红色更清晰的时候。
我们就可以认为这个红色离视网膜附近,然后呢这个时候我们就可以看到,这个时候我们有时候要说这个red clarity,到了这个当绿的清楚跟那个红的清楚啊,它都不是啊,一个理想的一个位置,断网了吗。
诶可以看到吗,嗯好我们继续,我们当红的清晰还是绿的,绿的清晰就说明唉我这个度数小了,红的清晰就说明这个度数大了,当然这个是黄绿光,就是就是黄光,这个清晰的时候。
就说明我们这个眼睛是正儿八经就校正的比较好的这么一个效果,但我们最后这个就是色差是怎么校正呢,我们通常有非常多的一个校正方法,就是我们有时候会用两种就是政策上跟负数算的一个途径交汇在一起。
哎就可以把正的姿态给负的姿态相互抵消掉,因为这个时候就是大家呃就经常进到一个消色差透镜,就是嗯双胶合透镜,但有时候双标和交的不好,大家也可以用更多的资金做一个三角核相对来做定这个idea就非常简单。
用lpair正反的一个相差相互校正来实现一个测算的一个矫正,当然这个除了这种方法啊,我们就要考虑到一个人眼,其实人眼啊就是没有办法很好的校正一个左外的一个色彩,就是大家可以看到嗯,这个眼睛怪的。
其实当然大家可能就是主外的视线不是特别好,虽然说人也是一个比较复合透镜,但是这个对于色差还叫的还真真是不是特别好,他技能就是很少程度的话呃,去降低这么一个颜色的色差。
当然这个跟后面人眼的人脑的处理也有关系,这cormac aberation最后拿到一个图像的一个结果是啥嘞,就它还可以看到边缘的地方就出现这样那样的一个色彩。
大家可以看到这边缘的地方会出现一些呃不太好看的一些色彩,然后这个给大家讲一个optic operations,也就是嗯比如说有有很多就是高级的一些相差,像会差啊,像畸变,然后会差是怎么形成的。
就是当我们这个入射光线不是平行于我这个光轴的时候,对不对,然后我最后我这个光线它聚焦这个位置,然后通常就是不在一个焦平面上,就是我聚焦,然后聚焦到他这个外面这个位置。
也就是聚焦大家可以看到可以注意到这些位置,然后我们在一个从这张图上就可以很清晰的看到,我这一个点透过斜着穿过这个光线的时候,诶我们看到诶就是穿过中心的位置,我们聚焦到这个线面上对吧。
然后我们就是稍微角度稍微大一点,我注意到这个项目后面了,就因为我们这个透镜啊就是不平行,我们最后理想的一个聚焦的项链是沿着这么一个轴分布的,我们最后我们在我们实际上这个绿色的这个下面上。
就看到了这这么对应的这么一个点,然后这个地方一个小圈,最后一个大圈,然后经过这么多一个积分,最后这么一个点就变成了一个像彗星一样一个尾巴,像一个三角这么一个尾巴,中间是很亮,然后后面越来越暗,越来越暗。
这么一个尾巴,这个时候就是要会插,就像彗星一样,所以说大家要会插,那会差是咋校正类,那也是就是传统的一套方法,就是我们可以用复合透镜,我们可以用一个透镜,用不一样的一个面型curvatures来去呃。
校正这个会差,它实际上啊这个会差,就是因为嗯在这在就是斜射的时候,就是它实际上聚焦的一个位置就不在一个相片上,就产生那么一圈一圈的东西,然后就是所谓的一个会差。
那另一种方法就是那个small actor,同样的话就是理想的小孔诶,通过这个small action,我最后就会看到小孔吧对吧,我就没有这种相差,就比较经典的一个光学设计的方法是啥呢。
这个经典的关于设计方法里面就是让那个入同,这个时候就是啊什么是入铜呢,入铜就是啊我这个光缆对我前面透镜的一个项出头了,就反之就是我那个最后面那个光学系统的一个项,这个时候就是整个入铜没出头。
我们当我们把这个入口的位置,我们就发现这两个地方是重合的,哎这个时候我们协助式的时候怎样都是可以通过这个项链的时候,这个时候就没有会差,也就是大家通过正确设置的这个入同的位置的时候啊。
就可以很好的去校正这个相差,当做一个单透镜啊,这个相差就可以通过一些,比如像弯月型的一个透镜,就是一个大图面加上一个小凸面,然后一个正反一个正正,然后来去呃,一定程度上去校正啊。
这个就是a smagic的这种相差,这个时候为什么呢,因为两个bending的那个透镜,这两个都是这样的弧面哈,做这样的弧面,我注射过来的时候嗯,可以就是不像两个都是就双凸面跟一个凸凹面在一个区别。
就是我在最后汇聚的过程中,我会有一定的程度对这个光学的一个分点进行改善,实际上这个时候就可以一定程度减少它就会差,但是会差其实对人人也是没有办法解决会差这个问题,因为人眼轴外市场。
因为这个视力也比较差吧,可能看的也不是很清楚,所以说人的眼睛设计的时候就没有管这个会差这个问题,所以说在特别是斜着进入研究的时候,大家可以边缘都模糊掉了,会刷大家也就不管了。
然后大家做这个图像校正的时候,就特别是拿过来一个相机,所以经常会说到这个distortion这个问题就是就是畸变的问题,还有畸变,就是畸变也是跟它是随着就是光轴变化的这么一个畸变,然后说一下人眼啊。
因为人眼他是一个比较复杂的系统,它有这个我们把这块就成像系统放大来看哈,它有个角膜,角膜实际上是有一定的屈光度的,你看大家可以看到是一个呃一个凸的一个这么一个面,这个时候大家把角膜这个地方抠薄一点。
这个时候就会诶这个屈光度就变小了,然后角膜后面就是一个瞳孔,瞳孔就是大家所谓的一个光缆,这是一个物理学的一个光缆哈,就是可以通过这个光缆调控这个光缆的大小,来可以调控这个最后的一个进光量。
同时这个光缆这个也可以进行一个消杂光,这两个透镜中间加个光缆是一个有一个消杂光的效果,就是使大家看了一个更清晰嗯,当然比如说大家有时候近视眼哈,对不对,这个前面的角膜就会被盖住一部分。
那实际上它是用一个更小的一个光轴来注射这个光线,最后大家就会看得比较清晰,当然大家也尽量少,是戴眼镜矫正是比较好的,然后最后呢给大家就是说一下这个哈勃望远镜的这个故事。
当然我们最早发射这个哈勃望远镜的时候,诶,我们我靠这个图像好像设计是有问题,然后我的边缘因为设计的当时那个最早那个透镜发射的时候,边缘设计的比较薄,就太平了,就跟我们实际的位置差了一个2000个微米啊。
放上太空之后,我靠这个也非常严重的一个球差,当然也有就是来自很多个镜面边缘的反射光啊,这个是产生非常大的一个球差,然后后来就没那么美味,几年就大家看这个左边这个图像诶,太糊了,这个咋办呢。
那时候人就我们就搞了一个就是正正球面相差的一个仪表,也叫做空间望远镜,光轴补偿校正模型,也就是这上面写的是一个cost a,用其中一个将球面向它校正过来,然后光线被汇聚到这个暗天体照相的时候。
就是按天体的光谱仪啊,和这个高达解析高解析的一个摄谱仪,最后我们在就相当于我们在太空里面塞了一个透镜来叫着这个想法,因为我把这个哈佛远镜把这个搞回来去修一修是挺贵的,但还不如再发射一个。
我这个人没想了一个办法,就是再造一个透镜,把之前那个相差给叫过来,这个就是矫正光学,就是给这个哈勃望远镜戴了个眼镜,诶,戴上眼镜之后果然就变得非常清晰了,然后最后大家都可以看到这个戴眼镜不戴眼镜。
拍出来这个星系的一个效果,但现在就大家这个处理算法能力越来越强了,就大家也非常多的一个底部的一个方法,就是我们可以把这个相差先标出来,然后去用一个need的求解逆问题。
去deep lear求解这个you competition的一个问题,嗯,来去做一个deep,这个后面我们会给大家布置一次作业啊,去做这个deep lear,然后通过一个物理学的prior。
我们可以知道,因为物理空间中我们很多信号都是稀疏的,那么这一个prior去做一个底部,这那我今天为什么要讲这么多,讲的那个相差,因为相差在关于系统里面或者成像系统里面,会起一个非常坏的一个效果啊。
然后我们有两种交通方法,一种就是工业交流,交流就是算法校正,当然无论你怎么矫正,这个都不可能是完全理想的,所以说也需要大家就继续钻研,就光学跟算法一些联合优化,这个相差来拿到最好的一个图像。
一个效果的一个图像,这个时候啊可以让大家最后捕获到了一个信号,更加清晰,更加亮丽啊,好,谢谢大家,大家有问题的话,可以继续问一下,哎有问题吗,有色散完成自定温度的,有的这个色散通常是嗯比如说我做多光谱。
我直接用一个呃光栅,或者是用一个棱镜,我把这个光谱散开,哎我用这个特色用色散,然后后面跟一行一排传感器,这个时候就可以把这个光谱来探测出来,这个时候就是利用色彩来完成特定的任务,后面有答案嘛。
作业肯定是有答案的,就大家可以通过这个作业系统里面去看到这个答案,因为第二次作业是基于第一次作业答案来继续做的,大家有什么作业,有什么问题可以在群里去问助教,嗯depth for colors,嗯。
这个是哎,确实是可以,当然这个有很多诶,直接用这种色散去编码deft,最后结果不是特别理想,开源代码模拟色彩嗯,这个用那个disc,没选直接写就可以了啊,这个裙子你你也早官网等那个应该就可以了。
自由曲面设计有跟踪的组,我觉得北里有个老师在做自由曲面设计,这可以关注一下他,自由曲面,其实唉自由曲面是个好东西,但是现在有啥问题呢,就是他加工的良率比较低,然后这个自由曲面就加工良率低的就没办法量产。
所以最后现在这个东西到底能不能行,也要看就大家最后加工生产工艺到底能不能呃,把这个东西去做出来,对如果大家做个自由曲面研究的话,大家可以试一试这个勒让德来描述这个曲面,这个我一直挺感兴趣。
但是一直没有时间是,大家可以试试这个罗朗德这个多项式来去描述这个自由曲面,因为乐上德他是一个正交完备的一个基底啊,它可以比这个比这个就是非就是那个泽林克去更好地描述这个变形。
然后大家有兴趣的话可以试一试手机镜片,现在目前大部分都是玻璃的,当然也有一些比较高端的透镜,是多数混合的,按这个塑料就便宜了,就这个就比较贵,但现在有一种新的工艺啊,叫wo的工艺。
就是把这个透镜做到一个微博上,我用加工半导体的那套玩那套方法啊,去加工,这个就是就是复杂的透镜,加工完之后,我用slice slice之后,然后再用mark对齐,这个时候可以做的非常小。
但现在这个生产良率到底怎么样,嗯这块业界做的怎么样,不是特别清楚,会差和球差会差,球差就是沿轴的一个汇聚的位置不一样,会差就是呃我这个斜着入射的时候,我们发现他那个聚焦的位置是在一个斜面上。
而不是一个平面上,比如说我们的向的平面上,这个时候就产生了求差跟会差,他是这个区别,如果大家没有别的问题,就今天的课就到这里,然后下节课嗯可能会给大家分享一些就是传感器。
最后我们传感器到底是怎么样拿到这个图像的,这个我们拿到头像之后,这个信号会有什么样的干扰,给这个分享完之后会给大家分享一个信号的基本处理,诶,好今天的课程就到这里。
08.游戏引擎的动画技术基础(上) | GAMES104-现代游戏引擎:从入门到实践 - P1:GAMES104_Lecture8 -01 - GAMES-Webinar - BV1jr4y1t7WR
Hello,大家好,那个欢迎大家回到games104,有现代游戏引擎的理论与世界,这个刚过了一个五一长假,大家感觉怎么样,休息的是不是好一点,然后我感觉我这个五一长假在那躺着,这个胡吃海喝。
好像吃胖了好多,我觉得大家应该也是每逢过节胖三斤吧,那么今天的话呢开始就是终于结束了,特别挑战的这个渲染这一趴,那我们这这一趴呢就开始讲我们的动画,那今天这个课件呢虽然比较长啊。
但是我个人觉得还是比较好懂,因为动画是蛮直观的,而且也非常的有意思,而且今天这节课的话呢,我会尝试把它最基础的原理给大家讲清楚,所以的话呢动画也是游戏中最重要的一个系统,所以非常值得大家去啊钻进去。
看看它里面有意思的东西,那么首先从动画系统,就是说为什么我们要做动画系统,实际上这个人类啊,在很早时代就开始对动物的东西很感兴趣,因为我们观察到的自然界它都是动作嘛,但是呢最早人类的表达方式只能绘画。
所以但是你会发现就是在几万年前,就是在岩石上,我们的先辈画的这个东西的时候,它都是动感很足,包括在先祖的陶器中,你会发现他画了一系列人物的动态,而不是只是一个竞争,所以那个时候没有投影的技术。
但是我想我们的先祖脑子里面想的,他就是一个动起来的世界,所以我们一直在探索这样的一个方法,那么其实呢直到就是近代,我们人人人类发现一个非常有意思的现象,就是著名的视觉残留的现象。
这其实也是现代所有的电视啊,所有的显示的设备的一个基础,理论的一个基础,也就是我们发现就是说当我们看到一个东西,这个影像在我们的眼里面会残留,大概1/24秒,而这个呢就是所有的电影,电视。
包括游戏以及游戏动画的一个基础的理论支撑,因为我们没有办法真的实现在这自然界里面,那种连续不断的,可以无限细分的这样的一个动画系统,而这里面的话,那就不得不提,我们早期的一个特别有意思的尝试了。
就是这个这个就是叫我们叫西洋景这样的东西,这个东西其实还蛮有意思的,就是以前在大家科学不发达的时候,很多那个我最近看了一部电影,他就讲你们的牧师的话,他就用这种方法,让大家的话呢能看到一个在投影上看到。
一个动的东西,你没有说是一个蜡烛或者什么,一个比较亮的一个东西,然后你会在很暗的地方看到一个洞的小人在走,包括那个小时候在纸上画的那个小人的动画,我记得我小时候读书的时候。
我是经常在这个我的每一本教科书上,都要画一个故事,就一个两个人在打架,怎么样,这个是我小时候最爱的一种游戏了,那么实际上的话呢,这个其实也就是现代动画的一个基础,那么从最早的就是说。
我们的动画的先驱是什么呢,首先是电影行业,可以这么认为,就是说游戏行业的动画的基础的理论,基础的工具都是来自于电影行业,那么从最早的迪士尼动画对吧,2D动画,然后呢。
到后面就是说我们在早期的七八十年代的时候,那时候最早的电影里面开始用了一些动画,生生成的这个虚像和实拍的石像合到一起,那报到后面就等到那个就是侏罗纪公园的时候,那我们的计算机。
动画技术已经到了一个非常高的高度,那个时候当美国的电影院里面,大家看到的那个就是非常震撼的,那个怪兽的时候,大家都觉得非常的震撼,其实今天我们在游戏中实现了很多,动画的效果的话,实际上实际上的话。
我们就在逼逼近这些离线渲染的效果,那包括像阿凡达对吧,达到了一个非常高的高度,我一直在讲,就是当年我看到阿凡达的时候,觉得这确实是我们未来要努力的方向,那么那么这里面呢也要提一个电影,就是那个ZUI。
ZUI的话呢,是实际上这是第一部,完全用游戏引擎实时渲染出了动画片,所以我觉得这也是代表了动画的未来的方向,就是以前我们这动画是个离线的东西,而今天呢变成了一个实时的东西。
那么这些动画的技术它底层到底是什么呢,其实从最早电影里面讲的话,它其实非常简单,它就是2D的,我一帧帧的手绘对吧,把它绘制出来,然后呢到后来的话呢,大家就发现了。
说诶我们可以就是说用那个很多个摄像机拍摄,这个演员的动作,他身上加了很多的marker,就很多的点,然后我通过光学的方法追踪这些点,就能够把人物的动作给给恢复出来,那这里面的话呢。
就是前段时间我也蛮喜欢的一部电影,就是那个战斗天使对吧,那个忘了叫什么战斗天使什么,然后的话呢,他就是你们的人物表现得非常的真实,非常的自然,那么它实际上也在用这样的一个动捕的技术,这个技术的话。
现在我相信在很多同学看到,那个电影的幕后的时候都能看得到,那这些技术的话,实际上也是我们游戏的动画的一个核心的基础,那接下来呢就来了教了我们讲游戏引擎了对吧,因为今天我们这节课不是讲电影节的动画。
怎么做的,我们是讲游戏里怎么怎么做的,但是呢这里面不得不highlight一下,就是我们的老祖宗绝对还是电影行业,那么从最早的,比如说最早期的动画,它其实非常的简单,就是几个几个图片翻来翻去对吧。
在这里面我们不得不提两个游戏,一个呢是就是199几年的这个这个波斯王子,大家仔细看这个波斯王子啊,这里面的那个小人,他的动作你看上去是不是特别灵活对吧,实际上他是用一张张图片做出来了。
那为什么这些人动作看上去那么的鲜活呢,事实上当时这个程序员他为了做波斯王子,他拍了他的弟弟,让他弟弟模仿了里面所有的动作,然后把里面的人物的动作,在那照片上一张一张的抠下来,做成了这个游戏里的相似。
所以在那个时代,波斯王子他的动作确实是非常的自然,你比如看这个小孩子,他一跳一下挂在那个上面的样子,是不是很自然,实际上今天我们虽然讲很高端的这个3D的,基于骨骼的动画技术。
但实际上我们追求的这种自然感,还是来自于真实的人类,而人类对这种自然的真实感的话,是非常非常的敏感的,那么另外一个的话呢,我想highlight就是这个doom对吧,那最早这个游戏的话。
它看上去是不是像一个3D的游戏,对不对,但实际上这个游戏,它完全是用2D的动画实现的,包括你看到那个墙体所有东西给你的空间感,它实际上是通过图片的变形实现的,而这里面的开枪包括怪物被打倒。
实际上是用一组的这个照片,根据你当前的相机角度,它贴上不同的贴片,让你以为你真的在一个3D的空间去渲染,旋转啊,去去去绘制这个东西,这也说明就是人类真的是非常非常的聪明,这也是我们游戏动画的一个鼻祖。
那么接下来的话呢也就是进入了3D时代,看我们开始有显卡了,那从最早的比如说像那个就是生化危机的时候,你看到这里面的人物开始有动画了,但那时候动画你会看到有很多穿帮的地方,待会我跟大家解释了为什么会穿帮。
因为它只是在动很硬的骨骼,到后面的话呢,我们开始用蒙皮动画,这个时候我们可以像一个真人一样的,这个动画看上去就非常的自然一点,但是呢其实这个动画你现在看的还是觉得很土,那到现在的话。
像神海这种越来越真实细腻,就是有既有物理的仿真,又有这个就是啊人物的非常自然的这种动画,那这也是代表了我们现代的游戏,动画的一个高度,所以今天这节课的话呢,我们着重给大家讲的。
就是我们现在游戏引擎的这些动画的一个,一些技术,那么讲到这个动画,动画技术在游戏引擎中的话呢,实际上我们不得不说他有很多的挑战,这个和大家想电影行业不太一样,电影行业我们做动画呢,他很多时候你做好了。
我就一帧一帧的播放给你就可以了对吧,但是在游戏里面他的第一个挑战是什么呢,因为在游戏中我们并不能预设玩家的行为,所以玩家在游戏中会遇到很多的东西,比如说我突然一开始走着走着,我突然决定要跑对吧。
跑的时候我突然一下子,我看到前面有个障碍物要去跳,跳起来之后我觉得有个东西我要抓住,所以其实在游戏的世界里面,他的动画是要和很多game play去互动的,也就是说,我们要这个。
就是说要接受很多来自于用户的输入,同时呢我的动画还受制于游戏的整个环境,比如说哎我跑到一半,我撞到一面墙,这个时候我要表现一个被撞到的动画,或者我走着走着,突然一个怪物把我抓起来,或者把我打倒。
那这些games play的东西,这些物理的反馈,我怎么能够在我的这个动画系统里面,能及时的反应,表现得非常自然,这就是游戏动画系统里面,它相对于游戏电影来讲的话,它的挑战的地方,那么另外一个的话呢。
也就是游戏引擎,我们从渲染那一趴,一直跟大家讲的就是游戏引擎,还有一个很大的挑战是什么呢,所有的东西都是实时的,Everything is real time,就是我想你无论你想了最复杂,最高端的算法。
他永远要在1/30秒里面把它烧完,还记住每一个系统,比如说我们前面讲到的绘制对吧,我们现在讲的动画,包括我们的游戏逻辑,我们的物理,我们的AI,这所有的东西都要竞争那个1/30秒。
也就是30ms的窗窗口,但是呢现代游戏呢,我们又希望这些啊游戏里的角色,他越越做越新颖,而且呢我们希望场景越来越宏大,这事实上给动画系统造来造成了巨大的挑战,因为它的挑战不仅仅是我们算不过来。
还包括什么呢,还包括就是我的动画数据本身非常的大,当我去不停的去取这些数据进行计算对吧,然后这个取来取去,还记得我们在渲染那一趴,讲的就是说当我在内存里面跳来跳去的时候,我的性能也是非常非常低的。
所以呢这也是在游戏引擎里面,动画系统的一个很大的挑战,所以今天我们会讲一个就是动画压缩,实际上也在解决这样的一个挑战,那么第三个呢,也就是说,实际上随着现代游戏的这个就是要求,越来越高的话。
我们对角色的这种自然感和真实度,要求也是非常的高,其实当我们的动画师在做做动画的时候呢,我们一般会预设一个,比如说你在一个无限延伸那个平面上,去做反复循环的动作,但是真实的在游戏里面的话。
你会发现角色他每时每刻都要接受,来自于用户的输入,那他的动作就会变得非常自然,你像那个最右边那个图里面的话,也就是现在在三游戏游戏里面,最火的叫motion matching技术对吧。
它是有很多很多动作融合在一起,让你看起来这个角色非常的鲜活,那包括的话呢,这个角色他还要跟环境进行,各种符合物理规则的互动,我们叫physics based animation。
还有呢更加的难的是什么呢,就是当我们的相机推得足够近的时候,我们就可以看到角色的脸,那时候我们就会进入人类最敏感的东西,叫做表情,实际上表情直到现在,在计算机那个游戏里面,都是一个非常挑战的东西。
你想做的质量很好的话,其实非常的难,这就是动画,我们对realistic的话也在提出越来越高的要求,因为现在大家已经越来越习惯,也就是动啊游戏引擎实现的效果逼近于电影,而且的话呢我们的屏幕也越来越大。
从4K降到8K,将来我们的V2,我们就希望有一个非常high fidelity的,这样的一个虚拟的人物站在我们的面前对吧,那么我们讲虚拟人技术的话,其实虚拟人技术里面最核心的,就是它的这个动画技术,好。
O,这就是游戏引擎里面动画技术的一个核心挑战,那今天的话呢,所以我们今天这两节课,大概可能我争取三个小时左右吧,那能全部讲完两节课,一个一个一节课,一半小时能够给大家构思一下。
就是说动画系统最核心的技术,我们把这个课程呢分成两派,第一趴呢就是今天我们会介绍一些非常基础的,关于动画系统系统的这些技术,也就是说你上完这节课,基本上你能做一个简单的带动画系统的游戏了。
那么我们会从什么时候开始开讲呢,可能会让大家有点意外,我们首先会讲2D的动画技术,为什么,因为我们这节课讲的是游戏引擎,对不对,大家不要认为今天的游戏全3D了。
其实这个星球上最popular的最赚钱的游戏,很其实是2D游戏,那么其实2D的动画技术,也是一个非常重要的技术,然后呢,接下来我们给大家讲一下3D的动画技术,而在3D动画技术,你们的好了。
我们会辟出一个专门的章节,给大家讲的就是蒙皮动画的真正的实施的细节,为什么呢,因为就是说大家提到3D动画呢,其实核心的就是这个蒙皮动画,也就是我们见的最多的游戏里面角色的动画。
但是呢蒙皮动画它的原理讲起来非常简单,但是当你钻下去,当你真的开始去写一个游戏引擎,不是只是简单的调用引擎的时候,你会发现这里面有很多的就是基础理论,基础数学的问题,那么我们今天这节课讲的是游戏引擎嘛。
所以我会跟大家讲一些真正细节的东西,这些东西是很重要,因为它就是动画是这样,你很多时候你认为你懂了,但是你写的时候,如果你对他那个他的基础知识,掌握的不够扎实的话,你可以写出很多的bug出来。
那么第4part呢,就是我们会讲一下动画数据的处理,那今天呢我们讲的是非常简单,但又是非常实用的一个东西,就动画数据是如何压缩的,因为这个也是呃,基本上今天你要如果写个游戏引擎的话。
动画数据是一定要压缩的,否则的话它会有很多的问题,那最后呢我们会给大家介绍一下,整个动画真正生产的pipeline,为什么呢,因为当我们去写游戏引擎的时候啊,你不是只是写引擎里面的那些东西。
你大概率可能会要写很多,3D max maya的这个插件,就是帮助艺术家把动画,导致你自己的引擎所能接受的这种格式,而这里面的话呢,你实际上是要对艺术家的整个动画,素材和数据生产的流程需要有所了解。
所以基本上听完今天第一节课的话,你就能做一个完整的动画的pipeline了,那么第二节课呢,我们会给大家介绍一些,就是相对来讲比较啊高端一点的东西,但这个高端其实也不算是什么啊,就是fancy的技术。
应该也属于现代游戏引擎的标配,比如说动画到底是怎么去blending呢,就是刚才我讲的,就是怎么根据我的游戏的操作逻辑,进行各种合理的混合,包括我们会介绍IK技术点,就是说动画和环境进行互动。
还有呢就是这个你的整个复杂的animation pipeline,还有呢就是说大家喜闻乐见的就是动画书,叫animation graph,它的设计原理,它有哪些节点,它是怎么怎么运作的。
然后最后呢我会跟大家去讲两个,就是说比较有意思的东西,就是说怎么去做人面部的,就是official animation,其实你们会发现就是facial animation。
和普通的形体的动画是两套技术体系,两套完全不同的方法论和技术上,那么最后呢会给大家讲一个比较有意思的,就是说诶我做了一个动画,A动画和这个A角色,我把它的形体变一变,比如说我本来是一个人在走路。
我能不能把它转移到一个大怪兽的走路上面,那就叫做animation retargeting,那这些技术呢就相对来讲,虽然呃就是说比这一第一节课讲的要难一点,但是呢如果你想做一个。
就是说3A级的游戏引擎的话呢,这些也属于入门级的一些技术体系,所以我们动画的两节课的话呢,就会讲一些非常标准的,就是现代游戏性的核心模块,那么其实呢还有就是比较前沿的动物。
比如像motion matching这种东西的话,我们可能会把整个课程上完之后,争取在高级课里面跟大家去讲,那么先在这两节课的话,我们把大家对于动画系统的基础一定要打好。
那如果你将来想成为一个游戏动画师啊,如果你想成为就是游戏的,这个就是说game play的这种这个designer,那么还有game play的programmer。
包括你在想做这个动画方面的这个专家的话,那这节课的内容的话跟你挂相关度会非常的高,那我们就先从这个我们的这个就是2D的动画,开始说下来对吧,那2D动画呢,事实上它也是我们整个游戏引擎动画的鼻祖。
那么最标准的就是我们叫做精灵动画,那其实他他的想法就非常的简单,就是我把游戏里的角色,然后呢把它整个动作一帧一帧一帧一帧,每一帧哒哒哒哒哒哒哒,全部把它记下来,然后呢我在游戏中循环播放。
是不是就是一个很完美的2D动画,其实我们童年的回忆其实全是这样的,2D的动画,我们不知道大家有没有玩过有一个游戏主机,什么任天堂啊,什么小霸王啊,暴露年龄系列对吧,我不知道在座的同学中。
有多少人见到过小霸王的那个机器,那个上面所有的游戏都是这种游戏的欢乐,都是用这个2D动画的技术做出来的,那这里面特别要讲的super maria,我记得我在第一节课。
我听大家讲的就是那个时代做游戏和游戏的人,他根本不需要游戏引擎,它们真的非常的聪明,比如像这只小蘑菇的话,当它开始动起来的时候,它实际上就是一张图,它就是把它flipping左右左右。
把它flak播放的时候,你就感觉到一个小家伙瞪着眼睛向你走过来,所以那个时候真的是因为资源很少,大家做东西还是非常具有想象力的,那么接下来的话呢,就是说我们随着这个计算机的发展,就像刚才我强调的。
像doom的话,他实际上就会意识到说诶,我如果让如何表现这个角色更加生动,我要让她觉得像个3D空间真实的角色的感觉,他实际上就在各个视角去踩了一系列他的动作,然后呢根据你的相机位置。
我在播放不同的spirit的动画,这样给你一种很虚拟的这种3D的感觉,实际上我真的也是非常的震惊,就是在那个时代他们就可以做的这么好,因为我入行的时候就是3D,所以我我我我我是当上这节课。
我在准备的时候,我才意识到,就是说原来doom是用2D的方法去做出来的,那么其实这样的技术啊,它虽然很古老,但是在现代游戏引擎里面,就算是一个很高端的纯3D的游戏,引游戏或者游戏引擎里面。
这个技术并没有完全消耗掉,因为在我们的这个很多游戏中的东西,比如像particle system,我们有一节专门的课给大家讲的就是粒子系统,其实party system,比如说大家看到那种烟和成的爆炸。
它爆炸出来的每个离子,那个离子呢它不是一个静态的一张图,它实际上是一个序列帧,就是你可以看到一个烟球,从慢慢的扩散开来的效果,其实在我们的2D的游戏,在特效系统里面还是非常广泛地应用起来的,一个系统。
而但是呢我们真正的大量的游戏,也就是大家经常那个氪金对吧,就是什么六先充个648的这种游戏呢,实际上是用了一个更高端的2D动画技术,就是我这里面要着重介绍的就是live two d。
当时你真的真的是个非常了不起的一个系统,就是说呃我个人还是蛮喜欢这个技术体系,就是非常简单,但是给艺术家的空间特别大,就是你看右边这个二次元的这个角色,非常的鲜活对吧,他就是用一系列图片通过变形。
通过编辑就可以形成,那这个live two d它是怎么用的,我觉得如果同学们你们如果想做卡牌游戏,想做二次元游戏,如果你没有觉得哎呀,我的预算有限,我的时间有限的话。
我觉得这一趴的话就是你们最关注的东西了,那么拉土地其实他的想法非常的简单,就是说诶我我把一个角色上面的所有的元素,比如她的头发,她的眼睛,她的眉毛变成一个个的小图源,我把这个图片拼在一起。
变成一个大资源放进去,那里面每个图源的话呢,实际上我们通过它的这个旋转放缩,还有呢WARING就变形,WARING呢就是简单来讲,就是你给他套一个框架,你对那个框架各种拉伸的时候。
它在每一个就是那个小的框架里的三角形也好,或者四边形好,它会进行一个叫我们叫做反射变换,然后通过这种变化的话,我就能够把它各种元素做出来,让你觉得很鲜活,那么这个听上去是不是诶真的有这么强吗。
我一看我以前也觉得他怎么可以做的这么好,包括我们有很多大作啊,就是比如说那个像这种所有的二次元的,这个少女这样的游戏,其实都是用这个技术做的,做的真的让我觉得非常的棒,没有想到。
就是就是拥有简单的二级技术就做出来了,那这里面的话呢它的方法其实非常简单,它首先呢会把所有的图源,把它设置设置成各种的深度,然后深度就可以定义,他说哎一会儿出现,一会出现对吧,包括他们之间的层次关系。
当它动起来的时候,互相不会乱,不会穿插,然后呢这里面的话呢,他会把每一个就是你的图片元素,生成一个控制网格,在这个网格上呢,你可以随随机的加入你的控制点,当你对那些点进行移动的时候。
这个图源也就跟着去变,这个就非常的聪明,也就是说当我比如说一个角色,我开心不开心,我的眉毛一会儿皱一会儿,一会儿那个弯下来笑,其实就用这种简单的技术就能实现了,因为二次元的话。
实际上这种表达本身就已经非常的具有表达力,那这个时候那当我就是说怎么去K1个动画呢,实际上你可以想想这么多图源,我一针,我第一个叫k friend,这一帧,我比如说我这一帧这个角色眼睛是闭的对吧。
下一帧这个角色眼睛闭了,再头动一下,再下一帧呢,哎我再摇摇头好,我这三针坐在一起,我把它串起来,一就在这k fk fence中间一帧帧过去的时候,你这时候就看到一个非常鲜活的角色出来。
所以这就是live to d的原理,这个工具,实际上我认为就是他非常符合艺术家的直觉,而且这也是少有几个,就是说不用非常复杂的理解什么3D呀,变化呀,这个什么那个什么三角形啊,这个这个投影啊,矩阵啊。
那么复杂的数学啊,就能做出一个很棒的游戏的,这样的一个一个一个体系,包括像unity unreal,包括我们自己的引擎,我们都会全面的支持live two d,我觉得这个他做的太好了。
我真的没有必要再做一遍,而且就是我我还是非常敬佩,就是说因为这个星球上最厉害的游戏,其实是2D游戏,不是3D游戏,3D游戏很多时候它就是技术上非常复杂,他做得非常真实,但是的话呢从游戏性上来讲的话。
2D游戏真的是王道,其实如果大家经常做引擎的时候,2D游戏引擎也是一个,很值得大家关注的一个方向,因为实际上有些很前沿的游戏游戏引擎的话,他的2D这一块做的非常的好。
而且我们我们也看到一些非常优秀的作品啊,他做的给你的感觉非常的好,就是说这里面其实有很多很有意思的,一些技术在里面好,所以呢但是今天我们的课程的主体,还是要回归到我们的这个104的核心的主题。
就是我们要做个3D的对吧,像阿凡达,像一个很棒的3A级游戏的游戏引擎,所以我们同时重点要放回到,我们的3D的动画技术,那首先第一趴呢我给大家快速的构思一下,如果你的游戏是个3D游戏的话。
你会用到哪些技术,那首先在讲这个3D动画技术的时候,之前呢,我先给大家介绍一个概念叫degree of freedom,就是自由度的概念对吧,指的就是说一个物体,他在这个就是它有多少个自由度。
也就是你可以在多少个维度去变化,包括我前段时间我们在看那个就是很有意思,国内模大厂他出了一个就是VR眼镜啊,是VR眼镜,还是啊对应该是VR眼镜,然后呢它上面有个核心的广告词,叫六D6DOF的这个设计。
让我觉得很多消费者可能看了之后就疯掉了,什么叫6DF对吧,那我接下来给大家解释一下什么叫6DOF,其实对于一个缸体来讲的话,它在整个三维空间运动的自由度,就是六个自由度,为什么呢。
首先它有平移的三个自由度,就是说你可以把它沿着XYZ3个方向去平移,对不对,那么如果你想象一个小方块的话,就你怎么动,它朝着你的方向永远朝着你,背,对你的方向永远背着你,这就是三个自由度。
就是三个degree of freedom,Three dio f,那么但是呢这是个刚体对吧,钢铁还有个能力是什么旋转,其实你会发现它旋转可以沿着三个轴旋转,对不对,我可以沿着X轴。
我以X轴为中心绕着它转,我也可以Y轴为中心绕着它转,我也可以Z轴为为中心绕着他转,所以你会发现在空间中的所有的钢铁,但这里面讲的是三维空间啊,它的整个自由度就是3+3,三个就是这个平移三个旋转。
所以所谓说的很高端的这个六自由度的VR眼镜,本质上就是你可以在这个世界,你可以这样看,这样看,可以上看下看,that’s it就是这样了,所以买东西的时候,还是要学一点引擎的基础知识。
因为这样你至少不会被他这种广告词,给给带节奏带走,那么其实我们的整个游戏动画的话,它核心就是基于对自由度的表达,也就是我们去对这缸体的运动的一个表达,那么好,那我们在游戏里面的话呢。
我们做这个3D的动画的时候,其实最基础的就是一个,就是基于一个层次结构的一个缸体的一个动画,它其实非常像我们小时候看的那个皮影戏,就是说我们把角色的每个关节对吧,做成一个可动的东西,当我去动它的时候。
诶那个角色整个就动起来了,那么实际上这个关节呢,它本身会有一个叫树状结构,所以我们叫做hierarchy,就是一层一层的下来,那么其实从最早的古墓丽影开始的话啊。
不不是古墓丽输出那个resident evil的时候,你实际上就可以看到,就是说这些动画的基础,这也是最基础的动画,那个3D的动画系统,但是呢这个女人的话呢,它实际上有一个问题。
就是说我把我的这个mesh的每个地方,跟一根骨骼绑定的时候,当你骨骼动的时候,这些啊mesh它彼此会穿插的,对不对,大家想就像我们小时候看皮影戏的时候,它各个关节之间是不会互相穿插穿插。
所以呢这个时候就是啊,哦这个是一个大家很少见到的一个技术,叫做provilex animation,就是叫顶点动画,这个技术它可能会注意不到,但实际上你们玩的所有的3A游戏里面。
基本上应该都用了这个技术,比如说这边这个旗帜,你看到在游戏中,如果一个旗帜啊,这我们表现的特别好的话,要么他用的是这个物理的动画,要么呢它用的是顶点动画,因为这里面的话,你如果你想表达一个风吹过布料的。
这个效果的话,如果放骨骼,你都不知道要放多少根骨骼,但是呢你索性把它每一个顶点就是它的位置,随着时间的变化把它存下来,这个存下来呢我们一般会存两个texture。
第一个texture呢它的横向轴就是每一个顶点,顶点123456789十,假设你有1万个顶点,那就1万个,对不对,然后呢接下来呢假设你这个动画是有100帧,那我的数轴就是100帧。
我就索性把每个顶点的offset,就是它的平移存下来,但其实顶点一遍的时候,大家会觉得大家就知道它的表面的法向,是不会变,还记得在上一节课里面我讲过,就是说我直接用顶点的位置算法向。
有时候会算出问题对吧,那为了有的时候为了效率呢,我们就直接把他那个,就是因为你顶点的位置变了,在那一帧每个顶点的法向我也存下来,基本上这张图呢,一般我们是用物理引擎模拟出来。
就是我现在离线的把这东西模拟好,然后呢,我存储成这个这个vertex animation的这个texture,那这样我在引擎中就能够展现出非常真实的,这个旗帜的效果,包括下面这个弹幕也是一个顶点动画。
大家想象不到,就是如果我的游戏中的表,表现一个像水流的这种效果的话,假如像这样的效果的话,其实我也是用顶点动画去做的,那么接下来的话呢,也就是说其实哦这是wolf target的。
哎呀我我觉得我接下来讲吧,就是这个其实我认为这是两个,就是后面的技术了,那么wolf move animation呢,它其实也是一种也是一种顶点动画,但是呢他跟那个传统顶点动画不太一样。
就是说它是一个叫顶点影响权重的东西,那这个东西呢它会就是几种不同的key pose,就是每一个顶点的key frame之间去插值,这个东西在什么地方很有用呢,就是说我们在做人脸的时候。
相信很多小伙伴都特别喜欢玩,游戏里面的捏脸系统对吧,我我我,我一直认为很多游戏,它的捏脸系统就是游戏的本体,大家拿到一个游戏的话,愿意花三四个小时去捏个脸,捏个脸,那么其实为什么。
我可以一会儿这个人是个蒜头鼻,一会儿是个高天高尖鼻对吧,大家会觉得我是不是可以通过啊,你们买一根骨骼把它捏一捏,算放一放,是的确实可以这样,但是呢你会发现当你的这种变形过大的时候。
那个脸上的那些五官看上去就不自然了,而那个时候呢,实际上我们很多时候是在各个不同的模,f target的时间来进行插值,我们在下一节课讲这个FISHANIMATION的时候,会给大家详细讲。
而我们这节课呢非常重点的给大家讲的,就是就是就是3D的skin animation,就是蒙皮动画,为什么呢,因为我们在游戏中最多出现的对象是什么,是人啊,动物啊,我们人和动物最大的特点是什么呢。
就是说诶我们表面有一层皮肤对吧,它不会当随着我的身体动的时候,我的皮肤之间会自我穿插,但是呢我里面其实是一个缸体的骨骼,那为什么就是说当我的缸体骨骼在驱动的时候,那么我的蒙皮也跟着动,看上去那么自然呢。
实际上他一个核心的思想,就是说我每一个地,每很多每个顶点它受它影响的不止一个骨骼,而是多根骨骼在一起同时作用,这样的话我能保证,就是说当这个对象运动的时候,它是一个水密性的,叫watertight。
就是他不会互相穿插,那么它比早期的那种钢铁的skeleton,动画的话呢,要做的更好,这也是就是说我们现代游戏引擎,最常见的这个动画模型,那么其实呢就是说如果我们知道了,3D的这个就是蒙皮动画的话呢。
这里面就断开一笔,就是说其实这个技术呢在2D动画里面,现在也有很多人在用,为什么呢,因为它也是一样的问题,就是如果你只是用谷歌去驱动,一个个的小图片运动的话,那这些图片之间彼此肯定会有穿插,对不对。
你看上去就像这个所有的角色,看起来就像机器机器人一样,但是呢其实你用同样的原理,把2D的这个这个角色,也用磨皮动画的方法来做的话,你能看到这个人动的时候,他整个身体和相对自然的去去变形。
所以呢它的技术的原理是一致的,所以说也就是说我们今天在3D的这里面讲的,所有的数学运算,在2D里面也是完全起作用的,那么最后一种的动画形式呢,就是physics based animation。
这个也相对来讲就比较难了,比如说我们怎么去这个这个角色,他一旦受受击了,或者他死亡的时候,它就会进入一个我们叫做ragdoll rock door的,中文叫做布娃娃系统对吧,我相信很多同学都听过。
那么而且早期的时候,布娃系统把人做的跟沙袋一样,但现在的话呢不想做的,就是说,他既有一部分设计师设计的这种animation的感觉,又有整个人摔在地上的感觉,那么还有呢就是说物理的模拟。
它物理模拟的动画最用的最多的地方在哪里呢,就是我们的医疗,我相信大家现在很多小伙伴去玩游戏的时候,你们会非常在意这个医疗这个角色身上的衣料,表达的好不好,但是医疗模拟其实是游戏。
动画或者游戏物理里面最难的一个东西,包括像流体的木那个模拟,那么最后一个呢也是我们在下节课会讲的,就是IK,就是说诶我怎么样的保证我手永远能抓到一点,IK的全称叫啊反向动力学,就中文叫反向动力学。
它指的意思是什么呢,指的意思就是说我给定一个指定点,我的身身体就是这个角色该怎么运动,看上去才最自然,这件事情讲起来很简单,就比如说我在你面前放个苹果,你去抓它这个东西我是不需要训练你的,你天然就会了。
对不对,但是在游戏里面如何让这个动作整个一气呵成,实际上是非常非常复杂的,但大家会觉得这很奇怪,为什么电脑会比人笨,但是你仔细观察一下,你看看小朋友,当他在只有0~6个月的时候,你在他面前放个东西。
它其实是抓不住的,他要练习练习很久,才能够准确的一下子抓到苹果,所以我们人的话,我一直认为是用DEPING的方法,深度学习方法,经过了长达就是以年为单位的训练,终于练就了那种准确的抓取能力。
但今天的话呢我们在游戏里面的话,用什么算法也能模拟出人的这种聪明的话,实际上就是IK这个系统干的事情,所以physics based animation的话呢,实际上也是动画非常重要的一个。
一个一个一个分支方向,那基本上呢就是说呃animation,你在run time就是这些方法,那另外一个更重要也是我们讲的就是animation,Creation,就是如何去创造animation。
对吧,你那么传统的方法有两种,一种就是说我在编辑器里面有我们的动画师,手K动画,我们经常叫手K动画,K的意思是什么呢,叫k free,就是我我我是通过一个月的K分K这个动画,待会后面我跟大家详细的讲。
那还有就是motion capture对吧,就是动捕,动捕的话,现在基本上无论在电影还是游戏中,用的已经是非常非常的广泛了,好那接下来的话呢我们将进入这节课的话呢,真正就是比较核心的。
也是数学比较密集的这个爬,就说我们知道了就是蒙皮动画这个需求,那这个蒙皮动画到底是怎么做的,其实我们顺便把整个动画给大家讲清楚,那首先的话呢我们来跟他讲,就是如何给你一个一个一个一个模型。
我们叫做一个mesh,你是如何让它动起来的,其实讲起来呢他就五步非常简单,第一个呢我们先做一个模型,也也就是一个max在他的bounding pose对吧,那么第二个的话呢我们去做一个骨骼。
这个骨骼呢就跟人类的骨骼一样,它就内嵌在我们的皮肤之下对吧,那么他跟这个这个这个mesh的样子,正好是可以这个align到一起去的,然后呢这个时候我们给它刷上它的蒙皮,对啊,这个具体怎么刷,大家不用管。
就是我们刷上那个蒙皮了,就是给每个顶点说哎你该受哪个骨骼的影响,哪个骨骼对你的影响大一点,哪个骨骼对你影响小一点,听上去也很直觉对吧,第三个就是诶我们的animator,就开始让这个骨骼动起来了。
那你这些顶点不是被我刷了蒙皮了吗,他姐也就也就跟着动了,对不对,其实你想蒙皮动画的原理,是不是就这个原理非常的简单,但是呢,如果你真的开始动手去写这个代码的时候,你看到的情况大部分时候是这样的。
就是你看到那个骨骼诶真的在动了,但是那个角色他就一直傻站在这,或者是整个角色冻就冻飞掉了,其实大家在写这个动画系统的时候,特别是如果这些数学公式没有完全推倒,对的时候。
很多时候我们经常讲就把模型给写炸掉了,就是你本来这个角色好好的放在这儿,你一旦动画你写上去的时候,一般动画我们会在SHADER里面去做,vertex shader里面就是每个顶点要去计算。
经常有一个公式算错了,或者一个矩阵放错了之后,这个模型直接就炸开来了,所以的话呢,这个地方,为什么我们这节课真正的主体,会把这个地方讲清楚呢,因为这就是一切动画系统的foundation。
你把这个就是skinning的,就是蒙皮动画的这个数学和它的实现,整个搞明白了之后,其实你后面去理解IK啊,理解其他的一些动画的时候,其实难度就不大了,所以的话呢,这也是我们今天特别想跟大家讲明白的。
这个这个游戏引擎的基础好,那在讲蒙平的话之前的话呢,首先要跟大家讲三个空间,因为你的所有的计算就是在动画系统的计算,他都是在各自的空间里面的这个东西提上去,是不是有点抽象对吧,我们的空间不是很明确吗。
我的面前放着就是XYZ对吧,这个东西叫什么呢,这个我们叫做worst space,世界坐标系对吧,在游戏里面我们会建立坐标系,就像我在上一节课讲渲染的时候,我跟大家讲过,就是说在世界坐标系里面的话。
我们可以做的非常非常大,可以到一个整个太阳系的距离对吧,但是的话呢对于每一个我的角色来讲的话,实际上我有一个什么坐标系呢,是我自己的坐标系,那大家讲这个时候是不是就表示local坐标系呢,对不对。
哎不对,这个地方我们叫什么呢,叫做模型坐标系,也就是以我自己为中心的,比如说我站在这儿,我面前的这样的一个比如说两立方米的空间,它所定义的样子是我的local space。
那么我的model space啊,我自己都被带跑了,那我的模型坐标系和世界坐标系是什么关系呢,大家记住它不是一个简单的诶平移的关系啊,因为比如说我的朝向可能会变,对不对,我的整个人可能会这样仰过来对吧。
假设你踩在地球表面上,整个宇宙的坐标系的话,它是XYZ,但是你在地球的,比如说45度和南极北极,你的人的朝向是不是都发生变化,当然我只是开个玩笑,一般我们永远会认为我们是头朝上去,站在这儿呢对吧。
所以的话呢,其实从世界坐标系到我的模型坐标系,就发生了一个很大的,就是它就有了刚才教大教大家的那个东西,叫DOF,大家还记得吗,自由度对吧,其实有六个自由度的变化,就是我可能会发生平移。
XYZ我还会发生什么呢,旋转对吧,我沿着X轴Y轴Z轴去旋转,这样能定义我一个唯一的一个空间的,这样的一个一个姿态,讲到这儿已经很晕了,对不对,但是呢前面在rendering的时候。
其实我们也讲了这个概念,就是说你怎么从世界坐标系与模型坐标系变化,然后呢再进行投影对吧,其实讲的就是这个道理,但是呢做动画的时候有一个东西是在模型之上,还有个坐标系是什么呢,我们叫做local坐标系。
这个是有点抽象了,它叫局部坐标系,它指的是什么呢,就是我们在动画里面每一根骨骼,大家想我们的骨骼不是一根一根,一根一根上来嘛对吧,每一根骨骼它自己会发生什么呢,会发生这个平移对吧,会发生旋转。
那么它相对于你的模型坐标系,是不是又发生变化了,而且这个事情很讨厌的地方是什么呢,就是每一个骨骼它的这个标价,它的这个坐标系都是不一样的,也就是说当我想知道,比如说我们举个例子。
比如说我们有个朝向是这个坐标,当你在这个在它的根部,一路往他的手指尖去传递的时候,这个方向就可能发生很大的改变,比如说我现在的手掌的朝向,实际上是由我这个坐标系,这个坐标系,这个坐标系到这个坐标系。
比如整个一起形成的,它就一个一个传递过去,那我的整个动画顺序的表达,实际上很多时候我待会给大家解释,就是实际上是在局部坐标系的,就是local坐标系的,而你把logo图标是一路从它的根节点积分上来。
就是累累累算上来,你才能算成他的模型坐标系,你把模型坐标系考虑到这个角色,他自身站的位置和它的旋转,你才能把它变成世界坐标系,你只有把它变到世界坐标系的时候,这个角色才会被渲染,所以这三个坐标系的话。
是你我们在做动画系统之前,一定要搞得非常清楚的一个一个体系,那这个时候我们理解了三个坐标系的概念,我们就开始给这个角色构建它的骨骼了,那么其实骨骼呢大家可以想就是在角色中,骨骼我们可以任意的去构建。
对不对,但是在游戏的这个这个实践中的话呢,其实我们不会,我们一般对于比如说这个人类人形的物体,我们一般叫做这个BPD对吧,就是两足生物,我们会构建这样的一个,跟人类的骨骼非常接近的这样一个骨骼结构。
对不对,那么在这个骨骼结构里面啊,大家一定要记住,有个点就是它的起点在哪里,我们讲的是个树状结构对吧,大家想想这个缺点在哪里呢,其实一般是在人的胯部,我们叫做papers,就是你的脊椎的最后一根骨头。
那个地方我们叫papers,因为那个点出去之后呢,你会发现它向下就可以分化出你的两条腿,向上就是你的脊椎,脊椎决定你的身体是公的还是直的,对不对,然后呢到你的肩膀一展开诶,它就变成两只手。
所以它的中心点是在那个PIA,就是那个脊椎尾椎骨那个地方,但是呢我们有时候会做一个root放在那边,那么其实这个结构呢对于很多啊,游戏里面大部分应用就是够的,但是游戏里面我们还要做什么。
我们要做很多可爱的小动物对吧,小动物它就很讨厌了,因为小动物是趴在地上的,它叫什么呢,我们叫QUAL派的四足动物,那四足动物的骨架它就又不一样,那为什么我们要把它定义成这种标准的骨骼呢。
因为当我们去生产动画资源的时候,特别是当你去做motion caption的时候啊,包括资源的生产的时候,我们不太可能去生产那么多不一样的资源,如果你的骨骼就这个基础结构啊老是在变的话。
其实动画师他是很难做的,因为它有大量的资源库,如果你的骨骼拓扑老是在变,你一会儿以脚趾头为起点,一会儿以脑袋为起点对吧,那这些动画资源之间就很难复用,所以的话呢这个技术结构也是我们这个行业。
约定俗成的这样的一个结构,那在这里面的话呢,我们给大家clarify个概念,这个概念其实特别容易混淆,包括我们在游戏里面,包括我自己讲的时候,也会经常讲说骨骼,骨骼骨骼,我们用骨骼构建了。
这个这个这个这个这个skeleton,就是股价对不对,skeleton英文的意思就是骨架的意思,但实际上呢在游戏引擎里面,我们并不是真正表达的是五个,我们表达的是什么呢,是joint,就是关节。
也就是说实际上我们存储的,比如说是这个肘关节的数据,因为你肘关节前面连了个缸体的骨骼,所以当你的肘关节发生旋转变化的时候,或者发生偏移平移的时候,你的这个骨骼也会跟着动。
但是我们并不会直接存储骨骼的数据,那我这个肘关节的下一个子节点,就是下一个那个树状的节点是什么,是我的肘关节,对不对啊,这个这个手这个手腕关节,那这个手腕关节前面就控制了我的手掌。
所以实际上在游戏引擎里面我们听到了叫骨骼,骨骼的东西,它实际上是joint,是关节,两个关节之间定义了一个叫做这个这个骨头,但是呢没关系,大家在看,无论是游戏引擎的代码,包括你自己写的时候。
你真的把它写成蹦也没有关系,但是这里面的话呢,我想从数学上跟大家把它定义清楚,其实就是说joint呢它本身是有很多的自由度的,但是呢BM它本身是没有的,因为BM是有两个join的,联合在一起定义出来的。
而且你想啊,为什么说我们存的是join,不是BN,因为joint它是个刚体对吧,它不会被twist,但是呢你想我的骨骼啊,其实像这边的肌肉,我们是可以被twist,为什么呢,假设骨骼不是个钢铁啊。
因为我这边的这个骨骼,这个这个joint在这个地方对吧,这个哎那个这个肘这个地方,这个地方是另外一个一个一个joint,但我这两个join可以这样转,那这个就是这个小B这个地方,它实际上是被扭曲的。
对不对,在skinny动画里面我们也会看到这种扭曲,所以的话这就是BM的表达的,它的不严谨性就在这个地方好,其实呢在游戏中我们构建一个骨骼的时候呢,除了我们讲人正常的要的这些骨骼之外呢。
实际上我们还会加很多很奇怪的骨骼,这个这也是因为,我们今天要教大家做游戏引擎嘛,一般在游戏引擎里面会加很多很奇怪的,额外的骨骼,最最恐怖的时候,我们一个标准骨骼可能也就100多个左右吧。
但是呢我要考虑到这个人脸,我要做很多很细致的表情,我可能又要加七八十个甚至到100个骨骼,很多的细节,这眼睛眉毛的运动啊,比如说大家经常看到眼球的运动啊,我们下节课会讲,他都是用骨骼去驱动的。
然后呢游戏动画对这个人有很多的变形,比如说我们会要给他做个大翅膀对吧,大家想做的那种斗篷,还有这个我手上拿的这个武器对吧,各种各样的变形,这些骨骼呢,实际上都会加到这个角色的标准骨骼上面。
所以当我们想做一个游戏引擎的时候呢,一般首先第一步就要定义一个标准角色的,这个叫标准组合是多少,这个也是我们的ta团队就是技术,美术团队和技术团队最核心的要确定的东西,那么这里面就讲了。
比如说我手上拿了个大斧,那么我的武器实际上是有个叫武器mt骨骼,也就是我手上为了拿了个巨剑,还是拿个大斧,实际上它是mount到你手上一个叫weapon,这个这个这个这个这个joint上面的。
然后这个时候你看到这个,好像看着像两只手拿的武器,但一般来讲呢,很多动画师他是把这个武器单一的绑在手上的,那跟武器骨骼上的,一般我们都是角色用右手拿武器嘛对吧,就是右手骨骼,所以呢。
其实包括人骑乘在一个这个这个生物上面,它会有一个骑乘的这个joint这样一个骨骼点,那么就是说刚才也提到了,就是说我们虽然说很多股价啊,它实际上都是从这个就是尾椎这个地方,叫PVZ开始。
但是在真正的游戏引擎里面呢,我们一般会定义一个叫root的骨骼,root格一般会放定在比如说以人形为例啊,我们会定义它它两脚中间,那为什么这个我要放钉在这呢,大家想想看,比如说我们在游戏里面。
表达一个角色的移速对吧,或者他跳起来了,那你比如说我说这个人的离地高度是0。5米,如果你在这个就是说以PVS那个骨骼来存的话,当这个人蹲在那,或者说在那跳起来的时候,或者或者站起来。
它的离地高度都会变对吧,但是我们关心的离地高度一般指的是它的角,所以呢那个root的骨骼呢反而更加的自然,就是说当我们去决定一个角色的移速啊,他跳起来的高度的时候,我们一般从他root开始。
这就像什么呢,大家喜欢玩手办,对不对,你们无论那个手办摆出各种各样很漂亮的姿势,你发现没有手办,它下面总有一根支架,那根骨骼,那根骨骼是插到你的那个台座上面的,对不对。
那个台座你可以在你的桌子上移来移去,而那个支架插下来的就是我们的root骨骼,而这个骨骼呢其实非常的重要,那么另外一个呢很重要的骨骼是什么呢,就这个就这是一个给大家演示的一个问题了。
就是说假设我们一个表达像四肢动物的话,那么他的PVS骨骼就是它的尾椎骨骼在哪里,他的入睡在哪里,这个地方呢其实非常有意思,大家想象一下,我们一个演员如果想让他扮演一匹小马的话,那他的尾椎在哪里呢。
是不是正好在马的屁股那边,所以呢其实动画师一般会把他的PVS那个骨骼,放到他的尾椎那个地方,但是他的root呢,诶他就很聪明的放到那个母马的肚子下面,为什么呢,因为我现在要表达一个码的位置的时候。
我一般都会以它的中心点那个位置来表达,所以这个地方其实很有意思,就是你会发现,当这些骨骼结构在行业里面约定俗成的时候,它还有它很深的一个道理在里面,就是方便让我们对它的位置的表达,就非常的准确好。
那么就是这里面也讲了一个很重要的概念,就是说我们大家还记得,我们在前面在讲这个就是game play系统的时候,讲到那个object之间是有父子关系的,对不对,但为什么我们需要有父子关系呢。
因为在游戏中啊,有很多动画,很多角色之间的行为是绑定的,所以经典的就是人骑在马上,那这个东西是怎么做的呢,实际上人是播放人的动画,马是播放马的动画,我怎么让他的动画一致呢。
我在人的上面会有一个叫mt的这个joint,这个这个这个这个关节在马的马鞍那个位置,我们有也有一个mt的那个那个那个joint,这两个joint它就重合在一起,这个重合记住啊。
不是一个简单的XYZ空间的重合,还有什么呢,它的旋转重合,也就是说你可想象他那个坐标系,它的轴是整个对接在一起的,大家想象一个卡槽,它不是一个简单的一个点连接,点连接只是位置重合,它是连你的朝向。
就是当马前倾的时候,你人要跟着前倾,马后仰的时候,你要跟着后仰,这样的完美的卡在一起,这就实现了我们的BOUNDANIMATION,其实这个BOUNDANIMATION的话,对于角色来讲非常的重要。
我们有大量的叫做载具,比如说大家经常在游戏中看到的,比如说我开汽车,对不对,那角色是怎么开汽车呢,实际上就是你看到角色展开了一系列很花哨的,比如说拉开车门翻身跳进车里面,你看着很厉害吧。
但是他总有那一帧诶,这个角色的屁股,就绑死在那个汽车的某一个座椅上了,然后呢这个时候车怎么动人呢,就跟着动了,所以这其实就是游戏引擎里面,如何实现这个绑定动画的,而这个呢也是引擎必须要实现这个功能。
它一般会和跟play系统连接得非常的近,所以动画为什么我讲,就是说,如果大家想做这个game play的这个程序开发的话,一定要理解动画系统,因为这是他两个是不可分加的紧密关联的。
这里面的讲一个就是在工业上,我们一个常见的一个现象,就是说其实在早期的时候,我们在做游戏引擎的时候呢,我们会把角色的骨骼,角色和骨骼的绑定,我们用什么呢,我们叫TPOS。
我相信大家能想到TPOS很自然对吧,整个人双臂张开,对不对,但是呢随着现在的商业游戏的发展呢,大家逐渐会发现这个t pose有问题,就是这个角色的这个肩膀这个地方诶,他其实是被挤压的,比如说想象一下。
我要做一个比较复杂的这个角色,这边的肩胛的这种展开啊,变形的动作的时候,那你这边的精度其实就是不够,所以在现在3A游戏中的话呢,我们一般越来越多的用我们叫做apples,就是整个人站的相对自然一点。
那这个地方就会给它相对高的这样的一个精度,这个呢实际上也是行业里面一个一个实践,那么其实呢当我有了这样的一个骨骼,我有了这个mesh之后,实际上当我去动这个骨骼的时候,骨骼它比如说表达走。
当我把这个动作做出来之后,这一个静止的状态叫什么呢,我们叫做一个pose,Pose,这个词大家很熟吧,就是什么就是姿势吗,姿态,比如说你拍照片的时候,我说你摆个pose对,就是你在动画中。
我们一个pose指的就是一针你的镜在这,或者你手举在这儿,这就叫一个一个pose,那我们把很多的pose连到一起的时候呢,我们就会形成一个动画对吧,但是呢这里面在post里面呢,我们要讲一个细节哦。
我这个PPT上少了一行,就是说其实我们在真正的表达一个动画的,这个pose的时候呢,它是有九个自由度的,刚才我讲了一个钢铁的运动,不是只有旋转啊,只有平移和旋转嘛,但实际上呢在真正做动画的时候。
我们还有一个叫skill放缩,放缩在比如说很多动画里面其实是非常有用的,比如说我去做人脸的变形啊,我去做一些,比如说一些角色的弹性的一些变化的时候,我们需要用到放缩,这个呢其实比较简单,我们以后面再讲。
接下来这一趴就是我们今天这节课呢,相对来讲比较硬核的部分,就是真正就是他的数学是什么,在理解这个动画之前啊,你们会发现,就是说,如果我们的动画适用各个关键点表达的时候。
你们想我们手上的关节做得最多的运动是什么,是旋转对吧,这个旋转呢它很难,它就是它有很多的自由度,它不是一个简单的,就是说哎一个轴旋转,它有很多的旋转,我们的我们的人的关节也是设计得非常精巧的。
一个一个一个关节,那么如何能在3D空间表达旋转呢,这件事情还真的是不简单的,那么最简单的这个旋转,就是我们想2D空间里面对吧,我们假设重要的一个角度叫西塔,那他呢有两种表达,就是一个是在角度空间里面。
我们叫C塔角对吧,还有一种呢,就是我们的大名鼎鼎的笛卡尔坐标系,在这里面我们会告诉你说,它的旋转可以用一个向量表达,就是X等于这个R乘以一个cos的阿尔法对吧,Y等于21个sin阿尔法。
这样我就能表达这个一个旋转,当两个宣传,就是我们中学经常学着说诶,当我转完一个阿尔法,我再去转一个贝塔角,那就是扩散,就是阿尔法cos阿尔法加贝塔等于多少呢,我们小时候都学过这个工程的工那个方程是吧。
就我记得我在高中的时候,这个学的就是这个三角函数,我相信大家高考啊一定要背这些,应该是中考啊,中考就要背这些东西了,那么我在大学里面我们学了什么,学了线性代数,对不对,我们就可以用线性代数的方法。
把它的旋转表达表达成一个2×2的矩阵,大家看下面那个矩阵就是哎,它的横轴是cos c的负sin theta对吧,第二第二排就是那个什么sin theta,Cos theta。
然后呢我把任何一个向量XY放进去,我乘上它,它就能旋转,这个是什么呢,这就是二维空间的旋转矩阵,非常的elegant,非常的美,很好看,但是呢这件事情呢,到了三维之后就会变得复杂了。
首先三维空间它的旋转,因为在二维空间大家看啊,它的旋转的轴只有一个,就是绕着它的中心点,对不对,在三维空间的话,它不是轴变成两个,而是一下子变成了三个,你可以要绕着X轴做一个旋转对吧。
你也可以绕着Y轴做个旋转,你也可以绕着Z轴去做个旋转,实际上呢更难的是什么呢,你可以绕着任意轴去旋转,因为没有人,没有谁规定说我一个东西只能绕着一个特定的。
就是跟坐标对齐的access align的方向去旋转,那这个就表达起来就很麻烦了,但是呢数学家证明了,就是说你在这个空间上的任何一个旋转,我可以用这三个轴的旋转把你叠加出来。
那这里面有一个非常重要的一个点,就是说那假设我沿着这个轴依依次沿着X轴,Y轴,Z轴旋转,我沿着每个轴转的这个C塔,那阿尔法贝塔伽马的角度,其实呢我们就可以算出很多个,就是3×3的矩阵。
那么你注意就是说如果我只沿着X轴群呢,你会发现这个旋转矩阵里面的很多项它都是零,对吧,它其实真正有效的是你们的2×2,四个四个因子,其他的那个一和000都是配平的,这个公式大家自己可以推一下。
其实非常的简单,然后呢你就可以把这个旋转,这样的话,当我沿着X轴转一个阿尔法角度,沿着Y轴转一个贝塔角度,沿着Z轴线个那个伽马角度的话,那你把这三个矩阵垒成在一起,就得到下面的那个形式。
那个矩阵看上去很复杂,但计算机写起来是很简单的,然后呢,你把任何一个空间上的那个那个点,或者是方向XYZ带进去的话,你就能算出来它的沿着这三个旋转之后,它的样子,这就是一个典型的什么呢。
我们叫做欧拉欧拉角,欧拉角的话,我相信大家应该在高中的立体几何里面,或者解析几何,你应该学过这个概念对吧,欧拉角欧拉角也是一个很早期的,很经典的一个对三维空间旋转的这个表达,那么欧拉角这个东西啊。
实际上是非常重要的一个东西,比如说你们在这个玩所有的空战模拟游戏,包括你们去玩那个比如说航海游戏,或者说你们真的在开一个游艇,或者开一个飞机的时候,你会知道有个概念叫鸭肉peach对吧。
ya呢就是这个航向角对吧,我们一般传统的用那个FI来表达,那么那个peach呢我们叫做攻角,它指的是飞机在气动力的时候,哎我的这个对空气的攻角,那么就是大家peach这个词,就是这个网上进攻嘛意思。
那么就是比如说飞机失速对吧,他就是个这个屁是角太大导致的这个动力骤减,让飞机在空中就解体了对吧,那roll是什么呢,诶这个飞机这样自己的这个就是往左啊啊腰啊,这样摇摆,就我这样模拟一下,这个很笨拙。
但是基本上能表达这个鸭肉皮吃,其实鸭肉peach呢,它就是一种欧拉角的另外一种话术的表达,它也是其实你可以认为就是现在的导航啊,航空器啊,都是用这个很基础的概念,就是这个这个。
比如说你们要做一个vo vehicle系统,就载具系统,或者是这个就是那个空战模拟系统,这是你最核心的几个概念好,包括我们做气动力模拟的时候,我们也要用这个压轴皮尺这个概念在里面。
那也是欧拉角的一个一个一个典型案例,那么欧拉角呢其实它是有问题的,欧拉角最大的一个挑战是什么呢,之一不能讲的最大的挑战它是有很多问题,我们先讲一个,我自己认为我最讨厌的问题是什么。
就是你对它的计算是严格的,那个叫all the dependency,就是说顺序依赖的,就刚才我讲的就是说它沿着X轴转阿尔法,沿着Y轴转贝塔角,沿着Z轴转那个伽马角对吧,阿尔法贝塔伽马。
但是的话呢你去apply,这个运算的顺序不一样的话,其实你得出的角度是不一样的,大家可以想象我们在里面画了一个图,比如说我先沿着这个,这个就是说X轴转90度对吧。
我在沿着这个就是说Z轴转90度就转出来的,结果和你反过来转的话,它的结果是完全不一样对吧,这就是三维空间的复杂度,你就会发现就是说在二维上面没有这个问题,二维因为你只有一个度,只有零就好了。
这三维你有三个度,这三个度之间的话,它的旋转结果是完全是如果你的顺序错了,它的结果完全不一样,所以说当我们在用欧拉角的时候,一定要约定这个旋转顺序,就是必须是先沿X轴,再沿Y轴,等于ZZ轴。
否则整个顺序就是乱的,那么其实这个欧拉角这个东西啊,在我们的实践中,最有一个最贴近的一个实用价值的东西,就是万向节,万向节其实是非常符合人类对空间旋转,感知的一种表达,那么这里面的话呢。
就比如说在现代游戏引擎里面,其实我们让艺术家来表达旋转的时候,用的全是这个万向节的这个方法,也是个欧拉角,那万元节这个东西它为什么非常有用呢,我给大家举一个,就是大家可能注意不到的东西啊。
我们那个大家拍摄像的时候,有一种叫机头像机头架对吧,就是那个相机放在这,无论你怎么动,他那个朝向永远是对着那个屏幕的方向,这个东西它用的其实就是个万向节的技术,就有三个自由度的旋转,永远保证它的朝向。
包括大家喜欢飞的那个无人机,比如大疆无人机,它那个机头,你的飞机飞的时候其实有很多抖动啊,或者这个方向朝,但是你会发现你的画面总是很稳定,对不对,包括我们现在叫什么微云台啊,这种技术。
它实际上里面用的也是一个变了形的,这个万向节,保持这个方向就非常的稳定,那么另外一个呢也是一个非常重要的应用,是什么呢,陀螺仪,请大家想象一下,就是在没有GPS导航的时代,我们一个导弹打出去。
它是怎么样的不偏航的呢,实际上这里面呢,它有一个高速的旋转的一个陀螺,他这个陀螺呢因为它的惯性的原理,它始终指向一个方向,对不对,但是呢你这个这个导弹它身体它会这样,一会儿上一会儿左,一会儿右,对不对。
他怎么能保证那个陀螺永远指的一个方向呢,哎他这地方就其实就做了一个万向节,而且呢我去测量每一个节点呢旋转的角度,实际上我就知道你这个导弹的话,它的方向是怎么偏的,那么我把这个导弹在沿着时间轴上的。
所有的方向偏的这个方向做一个积分,和它的速度在一起积分啊,那我就可以算出什么呢,我其实就可以算出来它的轨迹,所以这个事情真的很了不起啊,就是就用这么简单的一个原理,就比如说我一根空速管测出我的速度。
再加上一个我的这个方向的积分,我就能够对我的这个导弹进行导航,当然了,那个时候的误差还是很大的对吧,我飞一个1000km,我能误差个几百米,但是这已经非常了不起了,所以其实你会发现就是游戏。
动画里面很多的数学的概念,实际上在真实的世界里面也是非常有用的东西,但是呢万向节呢它其实是有一个小问题的,我们还回归到刚才那个旋转的方程方程啊,你会发现高斯欧拉角的这个表达方式的话呢。
当你把它沿着Y轴转了90度之后,你会发现你因为X轴的旋转,它是这样转,对不对,你的Z轴啊,当你沿着Y轴转了一个就是90度之后啊,你的Z轴实际上转的跟X轴是共轴了。
那你这你这个时候沿着Z轴做的任何一个旋转,实际上它本身是没有太大意义,只有这两个旋转之间,就是我们叫做阿尔法角和伽马角之间的差值,才有真正的数学意义,这是什么呢,这就是我们经常讲的。
就是这个欧拉角的一个退化情况,这个退化情况会导致整个这个模型的旋转,是被锁死了,他就只能沿着那个方向,就就是定死了才转,另外一个呢他会给我们,再比如说我有两个空间上的旋转,我从旋转一到旋转二插值的时候。
在这个地方它就会出很大的问题,这也是欧拉角一个很挑战的一个地方,那么其实奥拉贾的话呢还有很多的,虽然它非常有用啊,我们非常符合人的直觉,其实呢它还有这个几个很两两个,我认为是比较难的问题。
第一个就是说它非常难以去插值,也就是说我给你一个欧拉角的旋转,就是阿尔法贝塔伽马一对吧,我还有一个阿尔法贝塔伽马二,他俩的差值呢,其实不能简单的用他两个线性上去做,因为你如果大家差一下。
你就知道这个值是是错的,第二个的话呢,就是说假设我有两个旋转,一个是阿尔法贝塔伽马,一,有另外一个旋转阿法贝塔伽马二,那他两个假设我按第一次旋转再加叠,加上第二次旋转。
就比如说像刚才我举得我们的动画的例子,就是说我这个关节做完了一个旋转,我在这个关节再做一次旋转,这个旋转比较复杂,我在这个方向再转一下,那最后我问这个手手掌面转成什么样子了,你会发现它不能用,简单的。
就是说阿尔法,贝塔伽马的一和,阿尔法跟贝塔伽马二两个的数学加在一起,他的这个值是错的,所以其实欧拉角的这个旋转的叫做combination,就是叠加实际上是非常的难,那么第三个呢。
也是一个他欧拉角一个最难的问题,就是刚才你会发现我对所有的旋转的表达呢,都是沿着这个就是坐标轴,也就是沿沿着这个xx就是那个X轴Y轴Z轴,但是大家想一想,在真实的世界里面,大部分的旋转。
它并不是严格的沿着空间上的XYZ去做的,举个例子,比如说当我的手是这样的时候,诶,我我可能要沿着这个斜向的这个角度,这个角度可能是呃指向空间的-45度啊,这个60度的这个角对吧。
我这个时候我做这样的一个旋转,大家发现没有,他其实是很很常见的,那我给定一个定轴,就是任意空间的一个app的一个方向的时候,这个旋转就会变得很很难,所以这其实就是说欧拉角呢。
一般来讲我们在给artist的做这个这个,这个编辑的时候,特别是物体的摆放的时候会经常用,但实际上呢在做动画的时候,我们不能用欧拉角,这就是因为欧拉角它本身不好,差值不好去叠加。
而且呢也没有办法很难做定轴运算,所以呢这是欧拉角一个很大的场数学的问题,但是它非常符合我们人的自然认知,所以这里面的话呢,就要引出我们大名鼎鼎的这个四元数了对吧,这个四元数真的是非常非常了不起。
我我在前几节课一直在讲这样一个概念,就是说我觉得我们的人类,一定要感谢这些非常伟大的数学家,当我们遇到一个真正,我们觉得我们要解决问题的时候,数学家一般在100到200年前。
他就已经把数学工具给你准备好了,那哈密尔顿也是一个非常了不起的一个人,这个人应该是个爵士,就是他非常厉害的一件事情是什么呢,就是说他他说那个他的他有次跟这,是他跟他跟他儿子的对话。
他说你的哥哥老是在问我说,对于三维空间的这个旋转能不能像负数一样,就非常简单的通过一些数学的RGB,就是那个代数运算,我就能完成这个旋转的叠加,然后呢就是汉密尔顿老先生呢,就每天在早饭散步。
通过这个桥的时候,都会在脑子里面去想这个问题,直到有一天他过桥的时候,突然产生了这个伟大的想法,叫四元数的想法,所以他去世之后呢,他的家乡人,就在他那个桥上刻了这个这个这段故事。
所以就是他确实是非常了不起的,把这件事情给解决掉,提出了一个叫四元数的概念,那么首先呢什么怎么就理解四元数呢,我们理解四元数之前,首先理解复数还是那个笛卡尔坐标系里面,其实复数它有一个非常好的性质。
就是说对于二维空间的任何一个旋转,那么我可以用一个归一化的一个负数值,就是A加BII就是那个负空间的那个轴,那么那么I的平方等于一这样一个定义,我将能够非常优优雅的表表达两个旋转的叠加。
大家记得刚才三角函数的公式,对不对,那么你发现A其实就是cos thetb,就是sin theta对吧,你这时候来了一个就是那个那个那个那个A撇,B撇,比如说cos伽马,那个3A伽马。
那么那个贝塔加伽马的叠加的话,实际上就可以用下面那个dot production,那个公式就可以完成,而且这个公式的话非常的简单,所以汉密尔顿老先生他就在想说,那对于三维空间的旋转对吧,他一下子多了。
就是比二维空间多了两个自由度的话,那我怎么去表达,那我这里面讲了一个非常粗暴的概念啊,就是因为三维空间的旋转,你是有三个轴,二维空间只有一个轴,所以我再加两个维度行不行,你看复数是实数加虚虚部对吧。
那我再加两个虚部是不是正好四元数,你看我这个解释听上去是不是很有道理对吧,但实际上呢这个解释是非常不正确的,那个我我我我们前段时间大家在研究的时候,我我我自己也做下去才发现。
就是说为什么四元数这东西work的,实际上只有在三维空间的旋转,我用四元数能够表达,你再往上走他就不行了,它实际上是用群论证明了这件事情,就是只有在这种特定的这个这个三维空间的,这个情况下。
你的这套数学方法是work的,但这个就非常的复杂,说实话我都没看懂,我记得我当年想研究一下,就是这个为什么这个好像五次以上的方程,就没有这个这个解析解的时候,还冒死去看了一点群论。
然后直接就被这个无情的教育了一遍,所以这个地方的话我就不带大家入坑了,因为我也没学会,那我当然素颜四元数的原理的话呢,其实是非常非常的elegant,非常的漂亮的,就是说它首先定义了三个虚无。
就是IJK3个序幕,那么我们对于任何一个,就是这个空间上的这个旋转,我们可以尝试用A加BA加C键加DK去表达,所以说大家在游戏引擎里面经常可以看到,CORTANCOTAN指的就是四元数。
那这里面的话呢它的三个虚轴呢,它实际上有一个数学规律的,就是I的平方就是负数,那个轴A等于一对吧,J的平方它也不是在十轴上,所以它的平方也等于一,那么K的平方呢也等于一,但这里面优雅的东西来了。
就是如果I乘积乘K等于什么呢,哎它也等于一,这个时候就很有意思了,我就问既然我知道I乘积乘K等于一的话,那我就问I乘积等于什么呢,这件事情好像很没有定义,对不对,哎这个时候我们就想起了数学的配平原理。
比如说我这里面叫I乘G乘K,我在后面再补个K,然后呢等于-1×2,K就等于负K对不对,那么因为I乘J呢,它的是个K平方,K平方是一,对不对,所以等于说负I界等于负K,所以呢I乘J等于什么呢,等于K。
其实你会发现它三个轴都有这样一个交换力,就是I乘J等于K那个J乘K等于I对吧,K乘I也等于J,这就是数学的优美,就是你定义了它的基础算数数学之后,它的整个一个交换和组合,它就全部定义出来了。
那么我对他的表达呢,一般我们有两种表达形式,一种就是我们三种吧,一般我们会写成,就,比如说哎我可以写成,就是A加IJK的这个这个虚部形式,有的时候呢我们也会用向量的形式去表达。
就是说哎他是一个就是一个一个一列的,四列的向量,有的时候呢我会用一个十步加一个虚部向量,比如说A加V的形式,V本身表达的是BCD也能表达,那么这个时候刚才我们定义了,就是说IJK的他们乘法关系的话。
那当我两个CORTI的乘法怎么定义呢,下面你看到那个矩阵了吗,那个矩阵的话是不是看上去很复杂,但是呢它实际上是非常简单的,就是说你得到了一个叫ABCD的,这个这个第一个containing。
你讲得到一个EFGH的第一个,第二个CONTAINAN的话,他两个乘法,你可以认为就是说A去乘上那个ED啊,就我或到了看嘛就E吧,E啊不对,应该是AA乘上EFGH的一个所有的虚实部。
然后呢他B再一次乘一遍,C在全部乘一遍,D再全部成一遍,然后这里面的话有的时候是I碰到了,有的是I键碰到了,有时候十步和J碰到了,你接下来那一组变换带过去,你发现你得到的就是这个矩阵。
这个矩阵其实是非常的简单,那在课上我不展开了,因为我没有办法就依次给大家推导,但是你会发现它你简单运算一下会非常有意思,它的运算就是那样的一个一个矩阵,而这里面的话呢我们就定义了一个东西。
就是哎这既然是一个空间上的一个某种轴啊,某种某种某种高高维数字,我们在这个无论在线性代数里面,在还是解析几何里面,我们会定义一个它的膜,对不对,那摩的话最长的定义是什么。
就是它的各个维度上的值就是A平方,B平方,C平方,B平方的根号对吧,平方根号也就是A它的膜,那么一个东西呢,它的膜假设等于一的话,我们认为呢它就是一个单位的一个四元数,单位向量。
那么这里面的话呢就跟负数一样的,我们引入了一个共轭的概念,就是说把它的虚部全部变成负数对吧,就是负B负C负C负D,那么其实呢这里面这个公式里面少写了一个,就是说如果我这个四元数它本身啊。
他是这个normalized,就是说是个单位的四元数的话,那么他的共轭就是它的逆,它的逆是怎么定义的,就是说这个四元数按照刚才那个乘法,乘上另外一个四元数,诶,正好等于一对吧,这个逆其实非常有用。
为什么逆就表示了,我假设四元数表达的是旋转的话,它的逆就表示了相反方向的旋转,他这个数学上就是这么定义的,这个概念,大家稍微稍微消化一下,其实呢它的核心原理跟复数非常的相像,但是呢他的乘法。
这个矩阵就是稍微计算步数多一点,那么当我有了这样一个四元数的时候,我们就会发现一个很有意思的事情了,就是这个东西呢大家就理解一下,就是说哎我们用四元数如何表达一个欧拉角,那他就这个汉密尔顿老先生。
就给出了这样的一个定义,这个呢和大家的理解可能不太一样,就是我们天然的会认为它不应该是不是一堆的,这个阿尔法贝塔伽马的这个sin和sin的组合,对不对,但是呢哈密尔顿给出的公式里面的话呢。
哎它都是二分之阿尔法,二分之贝塔,二分之伽马,那为什么他给出了这样的一个矩阵呢,这样呢这样的一个表达呢,是因为当我们用这个CORTI做旋转的时候,比如说我给你任何一个空间上的那个轴也好,坐标也好。
它假设它是这个这个这个就是它是BCD吧,这样的一个位置,那么我假设用CORTANA对它进行旋转的时候,你首先要把这个空间上的三维,变成那个就是COTAN的形式,四元数的形式,你把它的实部呢设成零。
然后呢你把它的这个就是三个轴,三个轴上的投影写到三个事务里面,就是BICJDK,那你对它进行这个表达之后,你的四元数对它进行旋转的话呢,实际上是用Q在第一个Q就是第一个旋转在前。
把那那个就是那个刚才你凑凑出来的那个,四元数夹在中间,然后呢再把他Q的那个me放到后面,记住啊,如果我们再去这个用那个负数去表达,旋转的时候,我只要就是哎,我这个轴承上那个负数就完了对吧。
但是呢你在三维空间表达旋转的时候,前后都要加一个,就是你要乘上它,再乘上个力,其实大家如果在学线性代数的时候,这个很像我们线性代数里面的那个SVD分解,对吧,我中间有一个就有一个有一个有个列。
向量放在中间,我就他叫那个什么叫做矩阵的秩,还叫什么来着哦,不叫质,叫矩阵的那个什么哎,i can lecture对吧,然后的话呢,两边放了一个这个这个这个标准矩阵,那边放个矩阵的逆,其实非常的像。
所以其实四元数,它的很多原理跟矩阵运算是非常非常接近的,那么你把刚才我们在第一节啊,上一次那个就是上一页里面定义的,就是说四元数运算的这个,比如说它的逆是怎么算出来的对吧,逆就是一个标准。
就是一个呃呃normalize的四元数的,他的公恶就是他的逆,然后呢,当这个两个四元数的乘法,实际上是一个矩阵的运算,那么其实你的连城就是Q和q-1的连城,你可以依次算过去,就是矩阵的连城吗。
那这个时候你就会得到一个非常有意思的公式,就是说我的任何一个空间上的,这个这个这个数字在rotation的时候,我实际上呢那个他做算出来就是一个三,一个3×3的矩阵。
这个矩阵因为它有有些项目就消掉了对吧,你只需要知道它的XYZ,那这个就是一个四元数的一个旋转的一个变化,那么这就意味着,就是说你不需要再去算什么sin或sin了,你实际上就是乘上这个矩阵。
这个这个任何一个方向,一个角度都可以被旋转起来,这就是非常有道理,非常有意思的一个东西,那么你有了四元数之后,我对他表达一个反向旋转的时候呢,我只要求它的那个那个叫逆就可以了,逆的话我讲过。
就是说如果他是个为标准化的四元数的话,你就是把他的IJK,整个反应变成负负数就可以了,是不是非常的简单,而呢那个当我有一个旋转QQ1,我还有一个旋转Q2,那我们假设想把一个点或者一个一个做一个。
一个向量,一个方向旋转,按照2Q1Q两次旋转怎么旋转的,其实他那个旋转的四元数呢就是Q1乘Q2,这个里面的话呢就是公式我不展开,但其实你们可以证明这两个事情是等价的,那么还有一个呢比较厉害的,就是说诶。
我怎么第一个就是我假设一个方向A方向,V1方向啊,U我要转的方向V怎么办,哎它其实它的原理是非常简单,我先定义一个W就是它的它的那个轴,大家想想差,首先我把那个U乘上个V叉乘个V啊。
叉成V就找到他那个向外延伸的那个轴,对不对,你想想大家想看两个方向,是不是定义了一个一个面,这个面的话是不是就可以有一个法向方向,所以呢我们用的右手坐标啊,右手原则的话。
我们可以找到一个它往外延伸的那个W的方向,这个时候呢你第一个四表那个第一个四元数,这个四元数呢它的这个就是十部,用这个下面那个公式去表达,就是U点VU点击V加上了开放的这个W点。
W加上那个就是那个优点V的这个平方,这个呢就是它的实物,它的虚部是什么呢,就是W本身就W如果你算出来它是XYZ的话,把XYZ把它放到他的那个,就是那个三个虚部里面去,这个课本身就能够表达。
这个从U向V的这样的一个旋转,它其实是非常的简单,但这里面的话都是有很多数学推导的,因为这节课的话我不想看,因为当时在我在做这个动画系统的时候,我也不会去过于的把这个公式再证明一遍。
基本上这些公式都被这个教科顺序拿过来,我们就可以直接用,而且呢你用完一遍之后,你会发现它用的基本上不会错,那么这里面的话呢就是你有了四元数之后,你想表达,就是说我沿着一个给定轴的旋转,也就非常的简单了。
其实呢他的想法也非常的简单,就是说哎你对于任何一个轴,你要去旋转它的时候,我其实定义了一个那个,一个围绕这个轴旋转的四元数,你会发现它的实部就是这个cos呢,它假如你要撞那个theta角嘛。
它的实部的话呢就是cos的二分之CA对吧,但是呢它的虚部呢是把那个轴的XYZ,放进去了,但是加上了sin的二分之theta,你用这个四元数去预算的话,你去任何一个向量都可以去转得过去。
所以这个你有了这个数学方法的话呢,就是说当我有了空间方向,我从给定了任何一个轴,比如说它是一个不不是轴对齐的轴的话,我其实就可以算出它的旋转了,所以你会发现,就是我们把一个非常复杂的空间的旋转。
包括大量的三角函数运算的这个问题的话,变成了一个非常简单的,就是linear egible线性代数的问题,这件事情其实非常的重要,因为同学们如果自己推导一下,就是说假设我全部用欧拉角。
我假设有第一组旋转就是阿尔法一贝塔一,伽马一,我有第二组旋转,阿尔法二,贝塔尔C那个伽马二,你把它两次旋转的结果,你想用一个叫阿尔法三,贝塔三,伽马三去表达的话,其实非常的难很复杂,而且可能还有多异性。
因为旋转它超过了二派,它不就转了一遍,而且你可以正向旋转,也可以反向旋转,那么这个里面的话呢,就是当你用四元数的时候,它就变得就是一些简单的,没有任何歧义的数学运算,所以CORTA的话。
实际上我认为是哈密尔顿对数学的一个,非常关键的贡献,而且这个贡献的话呢,我认为就是当我们进入了计算机时代,当我们进入了这个游戏的虚拟现实期待的时候,我们对其实他在做那个机械,在做钢铁的时候。
其实各种轨迹计算的时候,也是非常有用的一个东西,好那这就是我们整个游戏动画的一个数学基础,因为什么呢,因为rotation是动画的最核心的一个。