03.色彩和人的视觉系统(II) | GAMES204-计算成像 - P1 - GAMES-Webinar - BV1WU4y1i7m5
对了这堂课开始之前想跟大家分享一下。
就这两天被一个韦伯望远镜刷爆空间的一件事情。
就是说大家前几年就NASA发了一个,就是替代以前的哈勃望远镜的一个韦伯望远镜,这有很多那种六面体的一个镜片,就是金属镜片去组成的,然后前两天终于他传回来的一张图,大家可以看到这几天朋友圈已经刷爆了。
大家可以看到就这么一张图,右边是传回来的一张很远距离的一个星空的图,差不多有几十亿到几亿光年几百亿光年这么一个距离,但是大家同学们有没有注意到,就是我们拍到的特别亮的一些星团或星系的时候。
就会产生这么一个六角形,或者是再加上横着边上的一个八角形的一个星毛,这个星毛是怎么形成的呢,这要从这个韦伯望远镜的一个结构说起,这个韦伯望远镜自己,大家可以看到左上角这种结构。
然后右边是垂直垂面的一个图,它是由很多这种六角形的镜片组成的,这个其实每个透镜是非常大的,只有接近一个人这么大,然后我们可以看到,它有自己的一个支撑杆,然后它是一个微微有一个弧面的反射式的望远镜。
然后在上面加了一个探测器,大家可以看到整个我们这个,telescope的一个望远镜的口径,就是它的一个aperture,就像一个由很多小六边形组成的一个大六边形的,这么一个望远镜。
所以说我们对这个孔蓝做了一个费列边上之后,就可以看到,大家可以看到它的整个六芒星的一个形状,比如说我在我这个形状的一个孔蓝下,就我们最后拿到的一个点扩散函数,就是这么一个像一个六芒星。
或者是再加两个小边边,这个6+2这么一个点扩散函数的形状,最后我们拍到的图,就可以看到这种类似星芒的一种情况,后面我可以给大家过一次作业,就是如何把这个星芒去掉,然后拿到一个更真实的色彩。
也就是image deconvolution,我们去模拟这个点扩散函数,比如说我们现在已经拿到这个口径的一个形状了,我们去做它的费列变换,拿到它的一个点扩散函数,然后通过这个点扩散函数。
构建一个求解逆问题的这么一个方程,最后我通过ADMM,然后加上一个我们常见的图像的一个regularizer,primer像total variation,就是我的gradient sparse。
最后求解这个逆问题,就可以把这个blur去掉,把这个绿芒星去掉,拿到一个清晰的图像,其实这种星芒,大家喜欢摄影的同学们是比较常见的,左下角我列出了一种叫星芒镜的一个东西,就是把这个它是比如说你四个星芒。
它就是像方格一样的结构,六个星芒就是像六边形一样的结构,通过这六边形的一些微结构,有这么一个镜片,我放到我的镜头前面,就可以产生这种星芒的效果,大家感兴趣的话可以买一个试试,就不用搞相机了。
就可以怼到自己的手机前面,大家如果还有一个特别有意思的现象,就比如说同学们拿一个自己的手机前置摄像头,对着一个点光源很亮的点光源去拍,你手指在你前置摄像头上,横着划一刀,就会出现一个竖着的星芒。
然后竖着划一刀就会出现一个横着星芒,这是由指纹产生的一个微大结构,最后在你的图像传感器上,就可以拿到两边形的这种星芒的结构,这是课前的一个开胃小菜,当然今天我们的主题还是要讲,继续讲我们的色彩。
因为色彩无论是在成像,在人的视觉中,还是在图形里面,都是一个非常重要的课题,我们稍微调整一下顺向,今天给大家首先讲解的是一个色彩空间的问题,包括我们常见的RGB色彩空间,HSV色彩空间。
还有比如说以前视频传输比较常用的,VLCRCP也就是VUV的一个升级版的色彩空间,还有最后我们的一个国际标准CIE LAB空间,然后给大家分析一下,我们整个monitor,就是我们的display。
是如何复现这些色彩,我们如何通过基色的混合去复现这些色彩呢,然后这就需要通过color reproduction的一个方法,我们是怎么样反向解出来,我们最后要显示的RGB的一个值。
最后把一个真实的色彩就复现给大家,到了最后我会给大家稍微分享一下,这个biofilter还有一个sensor的perception,因为后面我会专门在我呈现的环节中,讲到biofilter的一个问题。
biofilter有非常多的种类,包括RGB、YYC、RGBW,还有像translationXY,其实五花八门的,在人类发展的进程中,有非常多样的一个带流光片。
首先感谢一下今天对于slides的credit,包括Wolfram Hedges老师,还有任恩基,还有等等,就贡献了很多这堂课的一个slides,首先给大家分享的是一个叫color space。
为了方便人们对颜色的一个认知交流,我们需要一些比较统一的方法,来量化精确表达各种颜色,也就是说颜色定量表征,涉及人类的心理和生理的一些问题,同时也涉及照明,涉及观察物体的一个物理条件。
经过很长时间的一段摸索,国际照明委员会,也就是CIE在1931年,提出了CIE1931的标准色彩系统,就形成了RGB的颜色空间,我们在这个课的一个后面,会陆续给大家说出来,各种各样不一样需求的颜色空间。
或者颜色模型,那么这个问题来了,首先什么是颜色空间呢,因为颜色空间可以定义为,是一种表示颜色的数学方法,用表示颜色的基本参数,来描述和记录颜色,比如说像我们的日常常见的一个色彩空间,大概分为两种。
一个是跟设备相关的一个色彩空间,比如说RGB的色彩空间,还有跟设备无关的色彩空间,也就是方便大家去置换的一种色彩空间,也就是CIE1931,我们通常用三种维度,就是三个数字去定义我这种颜色。
但是我整个的颜色空间,也就是用三个维度去来定义,举个例子,比如说我们的一个显示器的,这么一个色彩空间是怎么定义呢,我们想定义一种用RGB,这三个标量来定义一种颜色,然后去产生这一种。
就是可以在显示器上显示这种颜色,最后你拿到的这么一种功率密度谱,就是RGB三种颜色的,三种primary light的一种组合,对不对,但是如何得到一个RGB的值,因为这个RGB的值。
在不同的一个显示器上,在不同的亮度,不同的伽玛都会产生一种颜色的差异,这个问题怎么解决,是我们在接下来的课程中会给大家解答这个问题,然后还有一种就是RGB的本身的这种色彩空间,它是跟我的设备极其相关的。
比如说我在我的显示器面前看到的颜色,跟大家在自己的显示器上看到的颜色,只要是厂家不一样,它的颜色多多少少会有一些出入,同时受限于我们本身的primary light,表示的色彩空间。
比如说像一些vivid yellow,就是这种颜色没有办法在我们显示上去表达,这个问题怎么办,也会给大家在接下来的课程中去介绍一下,在整个颜色空间的数学模型中,我们通常用一个三维的坐标值来描述这个颜色。
我们可以判断解决如何判断这个颜色是不是一样的问题,但是如何判断颜色的相差,仍是一个比较大的一个烫手的一个问题,所以说在整个颜色研究的过程中,我们国际照明委员会定义了cie XYZ这个空间。
它是一个最先采用数学方式来定义的色彩空间,因为cie XYZ最早是在20年代,19世纪20年代后期,一个叫David Varite和Juan Guit,通过做了很多的一些实验。
然后得到了这么一个色彩空间,他用的是一种三色加法的一个模型,然后通过这种三色加法,混合了不同颜色的一些分量,最后就可以达到我们最后就显示出来的一种颜色,然后最后并用xyz去表示。
这个xyz它是可以表示出我们所有可以人看到的一些颜色,但是我们要强调一下,就是我们的matching function,就是我们上一课讲到的matching function,它一定像是正值。
比如说像我们特尤其是我们显示的时候,就我们的光不可能是一个负值,然后其中外值也就是代表了luminance,也就是代表了整个的明度,当然我们可以看到我们左下角的。
CRE color matching function,我们是用虚部去表示的,因为有一些值它就是负的,我不得不得已,然后去表示了这么一种,用虚数去表示它的一个方法。
这个图它不是一个color matching,它不是一个spectral的一个响应,它只是一个color matching的一个值的一组对应关系,最后我们xyz的值是怎么得到呢。
我们color matching function,还有我们公寓谱函数,在每个条曲线上积分,然后拿到了一个值就是xyz的一个值,对这个是有一点抽象,有的同学说这个有点抽象,后面的话会给大家慢慢的解释到。
这个为什么要这么定义,而且整个包括跟RGB色彩空间的关系,这样的话大家就会对整个颜色空间,就有一个比较透彻的理解,同时我们也可以换一些机,因为我们有时候做显示的时候,我们想换一下它的颜色空间。
或者换一下它的primary light,这个时候我们是可以通过这么一个,三乘三的一个matrix,来去对一个颜色空间进行转换,比如说我们想要在一个标准的CIE RGB之间。
与一个CIE xyz之间去做一个色彩空间转换,然后我们就可以用一个三乘三的矩阵来表示它,就是做这么一个非常简单的变化,其实这个大家非常能理解,下面来给大家说一下这个明度,有时候大家也会说亮度。
但是这个最好不要混淆,其实有时候大家觉得明度跟亮度是一回事,但是这个明度跟亮度还是稍微有一些区别的,然后通过我们上节课的一个Coloring Matrix的实验,我们可以表明人是怎么样感知到一个颜色的。
但是我们可以用各种各样,我们知道我们整个产生了三种颜色,是通过对我的一个公义谱函数,对人眼的LMS曲线进行积分,拿到了一个三个值,这样的话就会产生一个同色异谱的现象。
因为我是整个积分的过程是一个多对一的过程,但是我反向解我的解空间几乎是无限的,还有上千万种颜色,这个时候我们就想问一个问题,我们看了一种两种不一样的颜色,但是相同的公语,这个亮度是怎么表示的呢。
下面就要给大家讲一下Luminance,亮度这个问题,亮度也是在CIE XYZ空间中的外,我们人眼就有两种细胞,一种是上节课讲到的追撞细胞,还有一种感光细胞,在我们整个的可见光谱内。
就是人眼对不同频率的光线的感性,就是感受的一种程度也是不一样的,这样的话我们就可以用光谱敏感函数,也就是右边这个图,大家可以看到一个不同细胞的光谱敏感函数,也就是光谱效率函数。
我们可以从图中看到一个追撞细胞,可以能吸收的可见光的光谱的频率的光,就是右边黑色的一个曲线,它在差不多555纳米的时候最为敏感,而对于一些比较短的波长,比如说像低于420纳米的。
还有超过650纳米的这些光,就变得不是很敏感,所以说感撞细胞,也就是对暗视觉显现的细胞,它是大概可以覆盖整个可见光的一个光谱,但是与肢体细胞相比,它对较高频率的一些光感受性就比较差。
感撞细胞差不多是在507纳米会达到一个峰值,而对超过像比如说超过620纳米的感撞细胞,基本上就是不响应了,然后我们最后能感受到的亮度值,就是我们演的光谱效率函数,然后对整个光谱进行积分。
他们一个成绩进行积分,最后你就拿到一个亮度的感受值,所以说人眼为什么对绿色比较敏感,就是我们在555纳米的时候,人眼睛是最为敏感的,就是光谱效率是最高的,而且人眼整个如何测量人眼的一个光谱光效率。
函数也就是我们可以用调节一个单色光的一个过程,我们去扫那么一遍,然后去看到人眼对亮度的一个感受,把它记录下来,就可以感受到我们这个颜色,就上一课我们看到这么一个光谱轨迹的一个函数。
叫Spectrum Locus,它是这几年才专门去定义的一个计量员的名词,就是差不多到2015年才会有的,就以前大家定义颜色空间的时候,又没有考虑到它在一个三维空间的一个响应。
这是我们对它在一个三维空间中的一个Virualization,也就是绘制了人眼的LMS曲线,在三维空间中的一个分布,它跟我们人能感受,它基本上表示了我们人眼所有可以看到的一个颜色。
但是这个跟我们的颜色空间有什么关系呢,大家就是最常见的一个叫色度图,有时候也叫马蹄图。
因为它叫像一个马蹄一样,将我们前面这个Spectrum Locus,就投影到X+Y+Z等于1的这个平面上,我们就可以拿到这么一个色度图,这个就建立起了整个人眼,和它表示的一个关系。
这个有同学问有没有做图形学的看这个,因为这个其实挺近似的,因为图形学里面这个也是必要的一课,但是这个地方又不得不给大家补一补,也就是说我们拿到的一个色度图,是一个从三维到二维的一个映射。
我们可以看到最外围的这个包罗,是我们人眼可以感受到的一个最大的一个色域,像我们的通常我们的显示器,它能表示的一个色域,是比我们人眼能感受到的要小得多,通常是比如说最常见的。
大家Display这个显示器上能看到的一个颜色色域,就是sRGB,好一点的显示器可以看到Adobe RGB,你的单反相机,比如说我们索尼A7,它是可以捕获到一个色域到Profoto RGB。
它是一个比较大的一个更接近人眼色域的,这么一个大色域,但是一般的显示器是没有办法显示出,那么大的一个色域的,对同学们要购买专业显示器的话。
可以参照这堂课,大家可以看到我们色度图,是如何跟人的LMS响应之间构建了一个关系的,就我们近似的想用一个线性的方式去来表示它,右边我们可以画到不同的设备,它在一个最外围当然是人眼的一个色域。
当然就像Apple P3,就是可能Apple比较专业的显示器,可以看到P3,就我们正常的一个显示器就可以看到一个SRGB,就SRGB是一个网络上最通用的一个色域空间,有同学问HDR10是什么意思。
HDR10它是一种HDR的显示标准,大家可以在这个显示标准下,能显示出HDR10的一个标准,但是它还有更高的一些规格,像杜比HDR这是一个比较更高的一个HDR显示规格,可以显示出更大的动态范围。
但跟本杰克没什么关系,但是我们表示我们设计的时候,通常我们想把这个Luminous Y就分开,因为我们不是很想让我们的一个亮度,来干扰我们对颜色的一个表示,同时我们就可以。
因为我们已经投影到了一个X+Y+Z等于1的这么一个平面,然后我们就想把这个Y单独分离出来,所以说在我们的这个,我们用X表示为X+Y+Z,这么一个方式,因为X+Y+Z也就是它们的一个叫色平。
也就是它们之间的比值来表示,这样的话我最后只表示我颜色的时候,就因为X+Y+Z等于1,就是最后我们可以把Z忽略掉,最后就用XY还有一个Luminous来表示,一个坐标来表示整个颜色和亮度。
这是一个C+E的一个色平的图,我们可以看到这整个就是色域的一张图之外,就是越往边缘的位置,它就是越纯净的颜色,也就是说我们饱和度就越高,越往中间,它是颜色也就是越脏,也就是颜色混合的程度就越高。
在正中间就是我整个重心的位置,也就是X=Y=Z=1/3的时候,这个时候我们就可以看到这是一个白点,就让我们的各种颜色的能量是一样的,它是最脏的一个地方,在我们定义了不一样的标准颜色空间。
刚才大家讲到sRGB,它是怎么来的呢,sRGB是一个叫BT709,还有一个BT601这里面没有写到,它是早期显示的一个标准,而且也是当今在互联网,还有一些显示器里面用的最广泛的一个标准。
就是你如果这个图你不知道保存成什么的一个色域的时候,你通常表示成sRGB,它最后打出来的颜色是比较安全的,大家显示器基本上都可以显示出sRGB,然后CIE的RGB它有一点不一样,它是通过用三种波长。
用546。1纳米,435。8纳米,还有一个700纳米的三个波长,来产生的一个颜色,这个怎么来定义呢,大家可以看到这是一个,在我们的整个我们的色域里面,我找三个点。
大家学过Games 101的时候可以知道,我们叫Biosentric Coordinates,我这里面的颜色,我都可以用这三个点的群众来表示,比如说三个点ABC,我分别其中的一个点就可以。
一个点的坐标就可以用αA+βB+γ=C,来表示其中αA+βB+γ=C,比如说我最大,我这三种三个顶点的一个参考的颜色,就是我画到这个三角形里面的颜色,我是都可以表达出来的。
但是我这三个primary light之外的,是没有办法表示的,但是同学们问题又来了,这个CIE RGB,它这个三个primary light,它这个三个基色是怎么定义的呢,为什么选546。1 435。
8,还有700纳米,也就是说因为546。1跟435。8,是拱蒸气放电产生的色线,就是拱蒸气产生了一个光谱,就有这么两个比较强的点,那为什么选700呢,因为700就是,人影对这个700纳米。
它的波长变化不是特别敏感,所以说在primary light颜色上有一个小的误差,对结果影响也不大,所以说那个时候就为什么选了这种三种颜色,来做一个三原色,CIE RGB的一个三原色。
然后就引出来从RGB,就引出来一个standard RGB,也就是说我们各种各样的,为什么要用standard sRGB呢,因为早期就是这个颜色没有办法统一,就每个设备之间都有差异。
我们就比如说记录下来的RGB值,其实就是不一样的,不一样的一个设备,就是记录的RGB值不一样的,所以说为了解决这么一个问题,那么在1996年,其实没有多久,是1996年开发出了sRGB的这么一个系统。
这样就方便了大家对具体的条件和设备,来确定一个色彩的配置,那个时候就是96年那会儿,就是sRGB的配置文件,就以常见的CRT显示器为基础,一般是针对家庭和办公环境来设计的。
sRGB是电脑显示器和互联网的,一个标准的色彩文件,因为这个时候就是刚才大家也提过,在这种情况下,就是在各种不受控的条件下,各种不一样的显示设备,还有存储设备不货设备。
我都转化成一个标准的一个standard sRGB,这个时候就可以统一大部分场景,来显示出一个,大家可以让大家看到一个比较真的一种颜色,大家刚才说到就是CIE的一个标准。
就捕获了所有的人眼可以看到的颜色,sRGB它是相对大家可以看到,这个相对整个人眼的色域是非常小的,是非常小的一个subset,我们可以看到在不同色域的显示下的一个比较。
左边黄花右边黄花,我们可以看到整个色彩的液力程度是非常不一样的,而且大家可以看到右边的一个P3跟sRGB,就在一个P3色域下,我们可以看到如果大家显示器比较好的话,就可以看到它不是一片红的。
它是有一个图案在上面的,但是把它转化到sRGB的一个色域下,它就没有办法去分这两种颜色,说到整个颜色空间,就不得不说有同学问如何判断显示器支持哪种色域。
大家可以看到红色的图。
左边是sRGB的一个,右边是P3的一个,现在的一般设备都可以大概覆盖90%或者99%的Adobe RGB,大家可以看到左边跟右边这么一个区别,左边sRGB是分不出两种颜色的。
右边P3就可以分出两种颜色的,如果要判断你整个显示器支持哪种色域,我建议同学直接看一下显示器后面说明书,这个上面会直接标出来你可以显示出什么色域,说到整个色域。
我们就不得不提一下白点,白点无论白点就是顾名思义,它是各种颜色最均衡的一个地方,也就是整个颜色空间的一个把心的位置,就是马蹄图的中心,我们在整个CIE的右边CIE的色图图上标注出来。
这么一行就是它的一个白点,因为白点对整个显示器最终显示出来的颜色,也是非常重要的,因为它并不是只是影响我白色是什么样的白色,而是白点定义之后,大部分的色空间中的颜色都会受到白点的影响。
除了一些专业的显示器,像我们大家平时日常用的消费级显示器,整个白点基本上说是没有是准的,基本上都是五花八门都是很准,大家不信可以测一测,大家显示的时候,它白点基本上是不会落在像D65或D50。
这么一个标准的白点上,我们自己因为看一台显示器不是特别明显,大家把这个显示器台式显示器跟笔记本显示器放在一起,看一个同样的颜色,差别是非常明显的,当然白色的定义也会根据色温。
就是大家上期课来说的一个色温来定义的,包括像D50 D65,它都定义了冷暖不一样的一个白色,大家在做摄影的时候,做白平衡的时候,就是不一样的环境,我们需要做不一样的白平衡。
但一般情况下大家通常用一张白纸,黑色的白纸,然后一拍做个白平衡就可以了,但是实际的专业器材里面有一个叫白平衡卡,通过拍摄在这个环境里面一个白平衡卡,我们先对相机一个白平衡参数进行校正。
然后再去拍摄就可以拍出来专业级的一个大片,当然这个显示设备也被定制上,我们如何利用这么一个色域图呢,大家可以看到我们当定义了白点之后,通常会有一种非常有意思的现象,就是我A点跟B点,C点跟D点。
这两个是对着的,我这两个像素按它的一个亮度加全之后,就可以拿到一个黑色白色,或者甚至一个灰色的这么一个东西,所以这个A点白点对应的颜色,或者是C点D点对应的颜色,后面大家会讲到这是比较补色的一个东西。
这两种颜色的对比是最强的,然后我们对我们显示器来说,我们要定义了三个primary light,就是PEPRP3,大家可以想到我们在一个,Barycentric coordinate三角坐标里面。
我可以表示出我这三个点以内的所有的颜色,当然它不能有负值,因为我这个重心,因为Barycentric coordinate里面这个值都是正的,这就是你能表现的最大的色域。
所以说我们的显示器能表示出什么样的色域,它的一个基测的光的位置是非常重要的,然后现在给大家batch一下HSV,上一块我们讲到了一个Pure Saturation and Brightness。
今天我们讲了一个方便表示颜色的空间,因为我们自然环境下获取的一个图像,就非常容易受到光照遮挡,阴影一些的影响,就是它对亮度是比较能感觉,我们刚才讲到RGB的颜色空间,我们RGB的三个值。
都跟亮度是密切相关的,就是我们它的亮度只要一改变,大家显示器我们的亮度稍微调一调,三个分量都会改变,其实它这个颜色是会变的,但是人眼又对RGB三种颜色的敏感程度是不一样。
所以说这个时候整个就不是很好调节了,因为RGB颜色空间它是一个均匀性比较差的颜色空间,它颜色的相似性如果用欧式距离来衡量的话,它的结果跟人眼的感觉会有一个非常大的偏差,我们也就是说用RGB表示的颜色。
我们比较难用一个很精确的三个数值分量去表示它,所以说像我们说到的一个RGB的颜色空间,就更适用于显示系统,但是它并不是适合图像处理,根据以上这种理由,我们聪明的人类就发明了HSV这种空间。
它比RGB更接近于人们对色彩的一个感知的经验,而且可以比较直观的表达出整个颜色的色调,就是鲜艳程度还有一个明暗程度,这样的话就比较容易对颜色进行对比,在我们HSV的颜色空间下。
比RGB的一个空间里面更容易追踪我这个颜色,到底是一个什么颜色,也是比较容易对一个特定颜色的物体进行分割,我们通常用图中的柱状图来表示HSV的空间,它的整个柱状图可以表示成一个极坐标系。
就是H表示极坐标的一个极角,Q就是我的一个色相,S就是saturation的饱和度,越靠近边缘的地方饱和度越高,也就是说代表这种颜色越纯,然后V实际上就是它的一个value,它是一个强度的一个值。
这个同学问老师带研究生吗,那肯定是带的,然后HSV空间这三个字母代表什么意思呢,Q也就是我们说的一个色调或者是色相,Saturation就是它的一个饱和度,也就意味着它的一个色彩纯净度。
这个value大家要注意一下,这个叫它的值,它是对光的量或者是光源的功率的感知,这个跟大家提到的SSL空间,就是Luminous,QSaturationLuminous。
这个和Brightness还有value不一样的地方是什么呢,就我们的value通常是被认为是光的量,可以是任何颜色,但是这个Brightness,就是这个L通常是用为白的量来解释的。
所以这两个是很近似,但是是稍微有点区别的,这个BD同学问,数学学得很好,数学学得不是很好能搞CV吗,因为我不是搞CV的,这块我不是特别熟,我们是做Computer Imaging。
最近在做RCC文件对色彩管理是比较麻烦,所以说最后大家做色彩映射的时候,通常会搞一个3D LUT,就是3D Lookup Table来做它,这样的话就是能比较精确的去表示出这个颜色,欢迎申请。
这个工作也是没问题,有工作经验,下面来给大家分享一下Mosaic Color System,这个翻译叫Mosaic颜色系统,它是色度或者是笔色法里面,通过我这个value。
就是Hue还有一个Chroma,就是叫彩度,Chroma叫彩度,三个维度来描述颜色的方法,这个颜色系统是美国艺术家孟赛尔,在上上个世纪末创立的,差不多上个世纪30年代,就是采纳为泥土研究的官方颜色描述。
到了今天仍是一个比较色法的标准,因为我们早期的几个色彩体系,将颜色放在不同的一个三维色的立体空间里面,但是孟赛尔是第一个把色调,明度跟彩度分离成感知均匀和独立的一个尺度。
而且是第一个系统在三个空间中表达对颜色的一个关系,大家可以看到右面这个图,在孟赛尔的系统,尤其是再标记法是基于严格的,基于人类受测试者的一个视觉反应,它是根据人的一个视觉反应的实验科学来定义的。
它是基于人类的一个视觉感知,哪怕是到了今天,现在的色彩模式已经非常丰富了,但是在一些特殊领域的一些用途,仍然是牢牢占住了它的地位,哪怕是今天的CIe LAB,还有CIe CAM的一个空间出现了。
在整个孟赛尔的一个系统,仍是很受欢迎的一个广泛使用的一个系统,大家看到CIe 1931里面,大家比如说画几个圈圈在上面,叫MACDAME Eclipse画几个椭圆在上面,我们可以发现在蓝色区域。
我这个点稍微移动一下,其实我这个颜色变化量是非常大的,相反比如说你在绿色或者是红色那个角,你颜色稍微变化一点,但是它的影响基本上就不大,这个时候我整个色度图,人类对这种颜色的感知是不均匀的。
就是我们表示它的时候,在这个色度上表示的时候,我们对蓝色稍微变一点值就会变非常大,这个对大家来说就是一个比较不好的事情,所以后来人们就发明了一个更新的一种,叫CIe 1971,这么一个色度图。
就是来把整形了一下,然后我在不一样的颜色里面看起来更均匀,下面来给大家就是batch一下,这个CIe LAB空间,这个CIe LAB有时候叫CIe Lab,是贯肠最好不要叫Lab。
叫LAB分开念它就有信号了,是贯肠用描述人眼可见的所有颜色的,一个最完美的一种色彩模型,因为这也是CIe提出的,它整个信号大家最好也不要省略,它是全民的一部分,它表示L* A和B,就不同于LAB。
因为红黄还有绿蓝这种对立的一种颜色,就是人对人的追撞细胞对这种对立颜色,类似于梦黛尔值的变换响应的一个差异,就CIe LAB是一个adam的色彩,也就是chromatic value空间里面的一个。
这三个值基本表示坐标的一个L,就是比如说我这个L*等于0的时候,就是黑色,大家可以看右边这个图,这个L这个value最下面的时候就是一个黑色,然后最亮的时候就是100这个值的时候,就是一个纯白的颜色。
我们看到AB这两个值,这个就是从红色从A+就是红色,然后慢慢到品红再到绿色之间A,这两个就是A+和A-这两个是补色,补色中间,中间的位置就是没有颜色就是灰度,就是我们在最下面的。
再把这整个往下拉的时候就是零,最上上的时候就是一个白点,就已经建立的这个LED颜色模型,通常来说是跟设备无关的一种模型,就只要认识到我们其实在视觉表示这种颜色,是没有办法是完全的精确去表示的。
但是这个概念就可以比较清晰的表示出,我们在三维空间中表示出的颜色模型,当然它也就是牵扯出了这么一个补色的这么一个原理,就是这个A-A+B-B+是一个复补的一个颜色。
现在讲一下CIE XRZ到CIE LAB,这个两个空间的一个相互转换,其实这个相互转换是比较简单的,因为这个纯粹是这个公式纯粹就是根据它,这个画的这个圈模拟出来的,也没有说特别精确。
但是大概这么表示就没有问题,大家把这个公式记住就可以了,但是要记住一下这个要注意一下这个Xn Yn Zn,它是对应着我在这个CIE XRZ空间里面对应的一个白点,刚才大家说到这个1931这个标准。
就是感觉这个均匀性不是特别好,尤其是对这个蓝色区域稍微动着一点,我这个整个颜色就变得一个变化就非常明显,所以说在1976年,这整个国际照明委员会,就把这个做了一个升级,改成一个LAB这么一个空间。
最后就把我们右边这个马蹄图,经过这边一个整形变换,就大家上面这个上一页这一页这个公式做了一个整形变换,我把它整成一个方的了,就可以拿到一个感知比较均匀的这么一个,人类的一个色域图。
大家有兴趣的话可以参照一下,这个CIE 1931跟1976的一个标准,还要看一下这两个定义的一个故事,链接是给大家了,大家可以课后点开去仔细阅读一下,其实这个CIE 1931那时候定义的并不是特别严谨。
他就是最后是17个人,17个标准的一个观察者,我这去观察这些颜色去做一些区分,你要说从今天来看其实挺玩笑的一个,但是那个时候就也是精挑细选,那么17个人定义了这么一个颜色标准,其实生活在不一样地区的人。
或者是不一样生活环境的人,就比如说咱在北极的人,那个颜色的感知它就是不一样,所以说这个定义也不是这么的完美,到了1976年其实人们就对这整个色彩空间的定义,包括CIE XYZ的定义,就会变得更科学一点。
刚才讲到CIE XYZ空间就牵扯到了一个补色的问题,什么是补色呢,就是说我这两个东西是相对的,就是我大脑里面对这两种颜色,就我的感受是最强烈的,比如说补色就白对黑,红对绿,黄对蓝,这个就是现代色彩理论。
比如说像RGB加色模型,或者是打印的CMY减色模型,就形成这么一个互补的一个对,但这个补色理论就一个非常有意思的事情,大家可以看到这么一个图,大家以前上图形学的课可能会看到。
我们盯在屏幕中间的小黑点盯个20秒,来倒数,15,14,13,盯在中间一个点,11,10,9,8,7,6,5,4,3,2,1,这一瞬间的感受是什么。
有没有看到彩色绿色蓝天,绿草,这个就是一个人的补色的一个响应,同样的给大家看到一个非常有名的一个,black and white的一个城堡,15 14,他自己倒计时了,大家可以看到,盯着屏幕看。
有没有看到颜色,在这一刻我们的脑补自己就补出来这么一个颜色,其实补色它是有一个标准的理论的,哪怕是一个非常简单的调整,比如像我的一个照明的情况,它整个都是基于你大脑的一个处理。
没有大家可以回头再看看视频,再盯着去看一下,我也会把slides发给大家,大家可以在自己电脑上多盯一会儿,对立集中一些就可以看到这个颜色是脑补出来了,而且我们很多的事情都是相对。
大家这个就经常常见的,A跟B它的灰度是不是一样了,遮挡一部分A跟B,这个时候看着还是不一样,这个时候看着还是不一样。
咋办呢,继续做遮挡。
这个AB看着还是不一样,就是相对的感觉,它确实是一直没法消失的,我们继续遮挡,这个时候我们看着AB还是不一样,这真的不一样吗,是不是,再继续遮挡,我发现这个A跟B它是一个灰度,是真的是一模一样。
人眼都是有一个叫visual adaptation的一个能力。
叫人眼的一个适应能力,就是大家可以看到左边这个图,其实大家可以看到就下面这种,它这个色彩其实都是不对的,但是人就可以脑补出来它的色彩,其实这下面这个东西是没有色彩的。
大家也可以看到就是apple true tone,这么一个东西,就是它在不同环境下,它最后感觉到我们自行车显示出来的东西,你感受到的感觉是差不太多,这个颜色也能感觉出来,像刚才我们看到的AB块。
它的颜色我们到,还有像乐图,比如这两个块,这中心黄块跟上面这个,褐色的块,这两个是一个颜色吗,在我们这里看,因为人眼的visual adaptation的一个效应,看着完全不一样的,但实际上这个AB。
跟玩具中心这个位置,它确实是一样的,是吧,这就是人眼的,在骗了你的大脑在骗你,你也可以说你的眼睛在骗你的大脑,讲了这么多,就不得不说,一个就是我们以前最早的一个。
像我们如何把三个颜色混在一起,产生颜色,因为这个对我们的一个显示还是打印,都是至关重要的,我们从小时候就学过,对光学上自然课,对光的就是绿色红色蓝色混在一起,就可以得到那么白色这么一个感觉,对不对。
然后红色我们看到了红色的物体,直反射红色,绿色的物体是因为它直反射绿色,蓝色的是因为它直反射蓝色,像镜子全都可以反射,但是黑的啥都不反射了,然后这个时候,因为像我们的显示器通常是用这种颜色相加。
来混合出颜色,但是对我们的打印机或者是我们的绘画,它就有点不一样了,这种我们就需要用检测法,因为我们最后我们打印出来的一个颜色,它是通过吸收跟反射光,来产生这么一种颜色,比如它是像比如说涂料,染料墨水。
还有各种天然色素混合,这种橙黑颜色,就大家小时候觉得,红黄蓝混在一起咋是黑的呢,是不是,这个时候就叫检测法,也就是说,这个黄,我们就通常定义一个CMY,就是CM Magenta跟,就是青色品红还有黄色。
用这三个颜色就是CMY空间去做一个打印的颜色,这个CM青色就是,我们整个的白色减掉一个,一个红色也就是说,它是B跟G的相加,Magenta就是品红,也就是这个蓝色跟红色的一个相加。
黄的就是绿的跟红的相加,这么一个表现方案,就是我们最后我们是要想让他看到它一个反射谱,而不是它的吸收谱,今天这个课有点长不好意思,因为内容太多了,这个我后面讲快一点,就是大家可以看到,右边的这张图。
就我在我们CMY打印出来一个空间,我把三个通道拆开,就可以看到像,CM Magenta品红还有黄色把它混在一起,就可以产生我们最后是这么一个颜色,因为它是一个补色,就是反射的一个减色,用了一个减色法。
它是用于颜色的混合的一个地方,老师是做打印机的色彩管理吗,对CMY空间通常是用在打印机,除了打印机,大家就是绘画的时候也都是通常用CMY,所以为什么要加个K呢,K就是简单来说就是黑色的一个墨粉。
用K之后主要是为了省墨,最右边大家可以看到,我们用了黑色之后,我整个品红蓝黄可以少用非常多,来混出黑色,因为黑色这个东西便宜,我们用墨就可以了,所以说只要加K主要是为了便宜,为了经济性更加的保障一些。
然后说到YCR CB CR这么个,黑色也不用做灰平衡,对这个也倒是,主要是为了省墨,灰平衡就是需要三个颜色去对它做一个平衡,这个YCR CB是用干嘛的呢,它主要是用于优化彩色细频信号的传输来的。
最早大家可以接受到YUV,为什么叫YUV呢,它的Y就是它的亮度,U跟V反映了它的一个颜色跟饱和度,为什么要用这个,其实这个有历史原因,早期在彩色电视没有普及的时候,黑白是混着用的。
最早搞YUV就是为了我这个格式又能给彩色相机看,又能给黑白电视看,我不能把一个RGB传给电视,所以说就搞了YUV这么一种格式,就Y黑白电视我可以只看Y通道,彩色电视又把后面色度跟饱和度一起。
拿出来看一下,对就是大家所说的黑白电视,但在RGB跟YCR CB空间,这个YCR CB实际上就是后来大家对整个,BT601跟BT709的一个显示标准,对YUV进行了升级。
最后拿到了一个YCR CBCR这么一个颜色空间,就是数字电视的颜色空间,它在YUV之间的转换是比较容易的,它对应的是亮度,色度还有一个饱和度这么一个问题,我们可以直接很容易的用下面的这么一个式子。
来做颜色的一个转换,又不得不提一句,这个YCBCR在影片处理中,特别是影像的连续处理中是非常常见的,但是有时候大家同学会看到Y’就是外撇,为什么有来这个外撇呢,突然想到了这个外撇跟Y是不一样的。
Y就是它的一个luminance,而外撇有时候大家看到外撇,这么一个东西,大家先到外撇,它表示光的浓度,因为这个,它的表示是光的浓度,大家要想清楚,但这个外撇通常是非线性的。
我们通常需要用一个γ校正来做编码处理,CB跟CR就是蓝色跟红色的浓度的一个偏移量,YCBCR它不是一种绝对的色彩空间,它是一个YUV的压缩和偏移的一个版本,它的整个Y是跟YUV是一样的。
但是CB跟CR比YUV的也都是指一个色彩,对这个是有人,很多书都会写这个,但是有时候值不一样,大家要是8位的时候,256的时候是可以用这个值的,要0的1的时候要注意一点,尤其不要让最高那一位去做饱和。
写代码的时候要尤其注意,YCBCR其实用的非常广泛,比如说像大家JPEG MPEG DVD,像摄影机,很多时候都会采用这种YCBCR的一种格式,当然一般现在可能大家对YUV跟YCBCR也不大分歧。
YUV也基本上就是俗称,这也就是我们YCBCR的一个俗称了,就是,Y’就是大家讲到这个Y’,这个跟YCR不一样的地方,就是像我们现在讲的YCBCR,它是对RGB的一个彩色进行编码。
其实最后真正我们要显色的时候,是要根据一个色盘就colorrand,然后去查找之后来显示的,就是刚才那个同学要在调RCC profile,也就是要调显示器的颜色,要根据RCC的数据,最后在色盘里的查找。
最后才能显示一个比较真的颜色,有时候大家通常喜欢用Y’CBCR,去做一个简单的图像压缩,通常有这个,大家经常可以听到什么呢,就是比如说YUV444,大家这个地方就是按俗称来,YUV444。
YUV444就是这三个通道,就是采样率是一样的,就是每个像素的一个都是一个完整的一个采样,最后我们,比如说8位的,这一个像素点就是三个byte,就YUV422,大家有时候说422,422指的是什么呢。
就是我们在这个图里面,它的水平方向的色素采样,是444的一半,我们后边那两个通道是不是就可以,做一个压缩了,就是我整个最后采出来的东西,是从一张图三个byte,到了两张图四个byte。
就是缩减了1/3的一个压缩量,然后还有一些像YUV420,就是我在这个采样了之后,我一张图里边,我搞个Y’CBCR就是420这种一个方式,下一张图就是422,但统一都说就是420。
它可以做一个简单的快速的有层压缩,因为我们后两个通道色彩,其实对我们整个看到的图影响不是那么强烈,就不像整个亮度的通道,它对细节的分辨率感觉特别明显,当然这也是由人眼性质本身决定的。
就是彩色的感知能力就570块像素,但是你的一个感双细胞,它对亮度的感双能力有1。2个亿,有一个本质的人眼的区别,刚才这同学也提到了RCC profile的一个问题,这个就涉及到了一个颜色的转换。
我们给了一个标准的颜色空间,就是sRGB,我们想要打印出来,就是转换成一个CM2K的这么一个值,最后打整,因为我们最后要它的一个任务,就是要对我们输出的,反射出来让人眼感受到的光谱是匹配的。
这个时候整个之前讲到的,一个同色异谱的效应就比较重要了,但是这个东西其实是非常困难的,比如说像我们的VR显示,跟打印机最后显示出来的东西,色域还有整个颜色管理都是不一样的。
而且我们有非常多的一些管理方式,比如像刚才同学说的RCC profile,也可以用Adobe Color Management,这个问题就比较复杂了,如果在Color Matching。
我们在这节课后面会给大家讲到,提到Gamma Correction,就不得不提CRT显示器,因为我们老式的CRT显示器,它这个音级视线管,就是它电流和最后显示出来,灵光响应的灰度。
它会有一个Gamma的值,比如说我最后打出来的一个光景,跟我这个偏压,就是跟我加的电压,它有这么一个Gamma差不多等于2。5的差别,也就是说我这要是Yuv传的话。
我这个Y通道就需要把它反向的拉这么一个,1/2。5的一个指数的一个值,才能在我的显示器上拿到一个别的颜色,这有历史原因,比如说右边这个,右边是我们想要看到的一个图,左边就是没有做Gamma矫正。
当然这个Gamma矫正发展到了今天,因为现在的Gamma很多都是,用的都是一个local tarmac,就是除了像我只是简单的做一个Gamma之外,我在我量暗变化比较大的地方。
我想过模仿人眼一个测预知的效应,然后去产生一个local adaptation,来对一个边缘的更加增强,也就需要像特别是在HDR显示里面,有一个time mapping这么一个环节。
而local time mapping就是对我图像的局部进行增强,然后这样的话我整体的量暗,包括对比就会看来更加舒服明显,讲了这么多,我们最后我们的显示器,到底是怎么把这个颜色显示出来的呢。
刚才我们讲到了,就是我整个色域图里面选三个点,这三个点里面我用它的一个加权权重,就是当值都是正的,就用biosensor code算了之后,其中一个点这个颜色就能表示,但对显示器来说。
比如说我们常见的显示器像LCD和LED,就是我最后我能表示出来这个谱线,它跟这三个基色是密切相关的,就是举个例子,像LCD来说,就是LCD就是有三个日光片,然后还有一个背光灯。
就是你最后三个基色发出来的颜色,就是你的背光,大家可以看到,大家把这个显示器可以,当然这不建议大家去撕了,表面上液晶撕下来之后,大家可以看到一个均匀的云光板,这个云光板就是我们最后的所谓的背光。
它的一个均匀的白色光,我透过这么个三个基色的一个color filter,然后就会产生三种的一个primary light,它最后的颜色就是我整个color filter的一个。
透射的光谱乘以我们最后它发光的光谱,就拿到最后三个光的波长的响应,LED显示器一定是LED它自发光的,直接就是这三个LED的一个光谱,然后通过这三个基色的组合,然后就可以拿到我们最后想要表示的色域。
当然这三个基色我们可以直接在我们的,马蹄图里面找到三个点,就是马蹄图里面直接找到三个基色的三个点,这里三个点的里面,就是我最后能表示的色域,表示出的颜色,当然我们显示器它是主动显示的一种显示器。
还是RGB三种颜色的相加,我们也可以调这种三种基色的一个亮度,来通过它的组合来最后拿到我想要,所展示出来的一个颜色的色彩,然后这个颜色的色彩它到底是怎么精确的,跟人眼的LMS曲线去匹配的呢。
这个时候就要涉及,一个color reproduction的一个环节。
就是我这个颜色到底是怎么跟,我这三个基色它有自己的响应曲线,我怎么样去混合,来跟我的人眼的LMS曲线去匹配呢,这个时候就是一个最后涉及到显示,到底是怎么显示出来的这么一个问题。
大家还记得这么一个matching function,对于任意一个光的光谱,S我们把它记为S,我最后感知到在一个CIE RGB的一个空间里面,就感知到这么个颜色。
它在我们RGB的color matching function,里面的一个积分的响应,也就是说我是每个通道对它自己的一个,光谱在通道的响应曲线上进行积分,拿到了这么一个值。
大家注意这个图不是color matching的curve,它不是一个primary spectrum,它是一个color matching的值,它有负的这个地方,通常说有时候大家把这个翻上去。
因为我们最后显示出来的时候,我们那个光发光不能有负值,所以有时候大家会用一个虚数来表示,有时候这时候我们色域就受限了,这个问题大家要注意到,然后继续像刚才的,当时我们这个积分过程。
有时候计算机不是很喜欢这种连续的积分,大家就可以把它离散采样,大概可能几百个上千个点就够了,大家这个地方就假设是n个点,它的积分实际上就是两个vector,做一个内积,最后我就得到一个值。
一个就是我光谱响应,我把它离散采样做成一个vector,另外一个就是我这个CIE,RGB上的一个响应拿到那么一个vector,两个vector相乘,然后大家做内积最后就是相加,实际上就是积分。
就可以写成这么一个形式,这样的话对于我们的计算机来说,是更容易去计算的,然后我们把这三个通道,就写成一个矩阵相乘的形式,我们可以看到我们的R值,就红色通道值,就是R bar,然后做一根S成一个内积。
然后其他的两个通道类似,就可以做到那么一个n乘3,三乘n,然后再一个n乘1,这么两个矩阵相乘,最后得到RGB三个值,实际上就是对它做积分,我们整个color reproduction的一个目标是什么。
也就是说在我们这么一个像素值上,我们拿到跟人眼睛匹配的这么一种颜色,就是我最后响应的值,我怎么去跟基色,还有人眼前人曲线去匹配,实际上我们的目的就是拿到了,我要给电脑的RGB三个值。
然后这三个值通过驱动了一个primary light,然后到最后在人眼里面显示的颜色,就跟自然空间里面看到的是一样的,这就是我们的目的,这个时候我们可以看到右边,我们最后显示出来的光谱。
我们就把它记为sdc,然后我们给到了显示器的三个值RGB,然后sr就是我们三个通道的一个,就是基色的一个谱线,我们当然把这些都写成vector形式,我们的目的就是让我们的display的光谱。
然后通过积分之后,对下一次可以加一支笔,然后把这个积分之后,就是跟人眼的lns曲线的积分,最后是一样的,这个怎么做呢,就是我让我的display的这个东西,就是人眼的lns曲线的响应。
就跟我最后display的光谱相乘,我这个display就根据上一页,我们可以把两个拆解,就可以拆解成我人眼的相应曲线,乘以三个基色的光谱响应,出光谱曲线,还有RGB的值。
然后我display里面的光谱,最后要跟自然界的光谱去匹配,比如说我要把我们左边的这一部分,跟自然界去画一个等号,然后来求解RGB的一个值,然后因为我们display的lns的值。
最后要跟真实物理世界的lns的值一样,对不对,这个是我们最终的目的,然后大家就可以看到,就跟自然界里面一样的一个颜色,我们把上面这个smr display,跟下面的smr real画一个等号。
然后就可以连力得到一个方程组,然后去求解RGB的值,我们在我们的显示器上,把这三个值输给电脑,就可以显示出跟自然界一样的一个颜色,对我们把它滑了一下,就是让它们画个等号,那我们可以把前面这一部分。
这个是n3,然后乘以一个3n的这么一个矩阵,最后拿到一个33的矩阵,因为这个响应大部分都不是,都是有响应的,所以说我们通常认为最后拿到一个3n,然后乘n3,最后得到一个33的矩阵。
它是可逆的,基本都是可逆的,它是一个满质的矩阵,那再通过一个人影的一个响应,还有本身这个spectrum的一个响应,我们通过这么一系列的求解,就可以拿到我在我,我给电脑最后的一个3个RGB的值。
看到的跟自然界的一样,然后大家可以看到,我要求解的事情,就是这个RGB的一个value,然后前面部分是一个33矩阵的e,后面也可以写成一个1*3的矩阵,大家简单一点,其实把这些写在一起也是没有问题的。
最后就得到一个RGB的一个value,就是最适合它显示,把前面一起组合了,再去解它,都一样的,反正这三个方法就是,纯新代数的算法,这个大家可以自由选择,大家要注意的是,本身我们去复现这个颜色的时候。
我们三个基色的颜色,是不可能是负的,这个大家要特别注意的,因为我们不可能产生一个负的光,但是我们可以用一些其他的办法,就是一些补色的原理,就大概让人感受到这么一个,负的RGB的值。
就最后把这个颜色给映射显示出来,也是让人感觉到也没有太大的问题,但这个时候就会严重的限制我们显示器的色域,就是比如说大家用有好的相机,比如说像索尼A7,我拍了它一个图。
我这个图是Profoto RGB的这么一张图,当然我们的显示器通常做不到,Profoto RGB这么大一个色域,通常顶多就是Adobe RGB,色域不如我这个图的色域小。
然后这个我硬是要显示出来这么大一个色域,然后这个时候就颜色就会,看到颜色就会发青,就偏灰的这种一种感觉,这个时候就是颜色显示,没有能力去显示它,但除了像我们刚才讲到了一个,imagery的一个方法。
其实还有一种方法叫,Pseudo-Geometric Interpretation,其实这个资料倒是不多,但是我看着倒是挺好的,这个东西可以讲一下,就我们的一个显示器,就是之前讲到了。
它是在一个比较低的一个,就是维度的一个,就是子空间里面去显示一个,就是各种各样可以,就通过各种各样线性的,对基色的一个组合来显示出来,这么一个子空间,在我们Color Reproduction的过程中。
就给了一个,响应的一个谱,就是一个光谱,它一个比较高的维度,它有非常多的一个点,就我们想用这么一个,窄色的一个谱,就S’,把它记录为S’,然后在我们显示里面,就用一个低维度的一个S’。
去对人眼的IRS群体,就产生了这么一个,相同的颜色,其实也就是做了一个,Dot Production,就是Dot Production as a Projection,我们想用一个高维度的一个投影。
就投影到这三个vector上,然后最后我们就可以,就想象,就是右边你可以想象一下,就我们在一个,有3D的模拟的这么一个空间里面,去把RGB的一个值,或者是抽出来,其实本身这个性质,就可以作为一个投影。
但这个时候,之前我们说到,这是我们对从一个高维向,一个低纹度的一个投影,然后我们想用,更少的一个三个基色,去表达出这种,对人眼IRS群体,一个相同的一个响应,这个时候我们就,想用一些垂直的一些基去表示。
这个就不细讲了,因为这个Circular Geometric Interpretation,的资料太少了,就大家有兴趣的,可以专门找一节,这个节看一下,大家可以去看一看,这个CRT显示器的一个三个基色。
然后我们就想用这么三个,SV SG SR显示,A高的一个颜色,对不对,因为这个CRT显示器,它是一个灵光发光的一个东西,它有自己的一个特殊的一个补件,它整个绿光片的材料,不能像今天LCD里面那么发达。
我可以去调绿光片的一个补件,不是这个不是风,那个同学问了,为什么会有四个风,它这就有三个风,最后这个是我要想要发出来的一个光,就是一个发出来的颜色的感受,这个就是,也不是不是,这个是这个四个风。
它这个两个风就SR,它确实有两个风,这是灵光它的一个响应,就是我CRT显示器表面是一个,我用阴极色线打到一种荧光材料上,我整个florescence的一个荧光的响应,它就是这么的红色的地方,就是两个风。
这个时候其实就挺有意思了,你在色素图上画到的,其实是相当于是四个点,但有两个点的一个相对位置是固定的,这个就是我们常见的一个LCD和LED的一个响应谱,蓝绿三个组合,是iPhone5。
iPhone5应该是LCD的,LED的,这个可能是LED的,然后通过这种基色的组合,我们去跟人眼的一个LMS去匹配,就可以最后显示出来,就人眼想要的一个效果。
最后给大家简单的科普一下这个Bayer filter,因为我们知道人眼的LMS曲线响应,其实到了我们成像那一关,其实就是我最后一个绿光片的一个响应,就是说这个时候大家就可以把这个套用过来。
这个其实是完全一样的,这个同学是LCD,对,这两个确实是工业界确实是太慢了,这个就是大家成像的时候,以前大家成像想要成色彩色的,就是在一个Bayer绿光片发明之前,想要成一个彩色的图像。
通常会用一个半透半反镜,然后每个地方加一个单个的绿光片,就好几个传感器,我去补着这么一个彩色,这个时候其实就是比较昂贵,系统也比较复杂,为了经济性,人们就做了一个color filter array。
就是像一个马赛克块的那么一个图,在一张传感器上就可以通过不一样的对光的过滤,来达到一个颜色,当然它也是有自己的一个想象一个谱的,就不一样的,就是绿光片它的一个透过的光谱,想象曲线。
也就是说对我最后补照的图,就会有一个不一样的色域,这个就比较简单了,它就是这种组合,除了之前大家说到的RGB,其实这几年就是手机摄影,图像是会产生混叠的,就是你采样的时候,确实是有问题的。
所以说大家要de-mosaic,de-mosaic还是一个很大的一个课题,就是从零几年到现在搞的论文是非常多的,就包括很好用的一个Marvel Zip,大概de-mosaic的方法就有五六种。
但是它本身有一些算法是可以抗混叠的,这个时候就是最后插足的时候,大家一定要特别注意,它极易对那些高频的地方就产生混叠,它是会产生混叠的,那就随了这几年,就手机的一个拍照的驱动,就对整个上游的产业链。
就是大家想出来各种各样,五花八门的一个color filter,就从最早的RGB到RYC,对是的,所以有很多研究去做驱马赛克,像RYC,这个Y咱就想了,它是两个通道的相加,C也是两个通道相加。
这个时候整个进光量就变大了,就说RYC RYB这种特殊的color filter rate,它对整个暗夜拍照的进光量是更大的,有性噪比是更高的,但是像用这种东西,大家可以就在色录图上划了一下。
就看到我用这几种颜色去组合,其实我最后的一个色域是变小了的,比如说我们能表示的颜色更少了,它为了进光量,牺牲了一下颜色的这么一个东西,但除了这些还有RGBW,我留一个通道是白的,还有RGBRR。
就有一个通道看红暗的,通过红暗的,我去增强这个图,其实受整个需求的驱使,它是五花八门的这么一种玩法,还有一种比较高级的一种绿光片,我这个叠三层,一层绿光片可以透,就直接下面跟一个sensor。
把这个透过去了,下一层,然后其他的红跟蓝通道是透过去了,然后下一层就是把绿的拦着了,然后感知到把红的透下去了,就这样叠在一起,这个方便这家公司就是搞一个,你不用代价filter,我就用更高级的。
一个像素才有三种颜色,是不是,但这种成本会比较高,最近也没有推广,但它的颜色也会受影响,因为整个透射跟反射的谱,它是受整个结构的这些,被绿光片的设计的影响,就是它颜色的质量会更差一些。
到最后颜色怎么补货,会给大家专门在后面成像的环节里面去讲,今天不好意思讲的有点长,就给大家讲了一下color space,如何去复现这个颜色,然后最后在我们的相机里面,颜色是怎么感知的。
对前面的铺垫基本上到了今天就完成了,后面就是下一节课,就给大家正把紧讲一下整个相机的这么一个系统,就是一般的一个成像的相机是什么样的系统,后面再会给大家讲到。
这个Optics Imaging Toolkit,Mathematics Toolkit,后面一些应用举例,好,谢谢大家,今天的课程就到此为止,有什么问题大家可以现在就问,现在没有问题了吗。
刚开始这一刻可能会有点抽象,但是用完后大家可能对整个,4代工具的理解就会越明白,它本质上都是一个Spectrum Low-cost的一种投影,下一课我用Pad讲,这个Pad可以画一下。
现在笔记本不大好画,下节课开始给大家用Pad好了,给大家写一写到底是咋玩的,色彩管理这个不会讲了,这个跟成像关系不是特别大,可以让伊凡老师后面专门开一节,Display的课给大家讲一讲。
现在都还在补基础的阶段,还没有完全进入整个成像的一个体系里面,明度亮度色度,其实明度其实就是人眼对这个东西的感知,这些大家理解就好了,不一定要背下来,这个关键在于理解,明度亮度色度。
这个东西主要是这个色度跟这前面两个没关系,就是先说明度跟亮度,明度就是Brightness,亮度是Luminance,就明度就是进光亮,然后这个亮度就是这东西有多白,你可以理解为就是明度。
它是一个可以你可以说一个单一色彩也可以更亮,但亮度通常就是说我这个整个就是白色的有多白,就是大概是这么一个东西,然后色度又不一样,色度就是我这色相,就是我这个颜色到底是啥,概念不用背,这个就是理解。
关键是要理解,就理解这个颜色空间怎么回事,最后怎么表示它,哪个空间用啥,三文成像会讲,这个会给大家讲三文成像会讲涉及到双目,结构光还有一个i-Tof跟D-Tof,我有时间的话,我可以给大家讲一下。
Abido 3D这一块,对,因为色彩这后面你会用到了,就因为主要是大家对显示这一块可能用的比较少,如果涉及到显示底层的话,比如说要做一个显示芯片,这个时候你对整个色彩理解就要比较透彻了。
这个时候你要会专门设计整个色彩的学解器,或者是RCC的profile或3D lookup table这些东西,这些同学们还有问题,偏振,这个要看后面有没有时间,本来规划是有要讲,因为偏振区成像这两年。
就已经越来越,对工业界的影响越来越大,亮度和灰度数字可以等同吗,就尽量不要等同,但你要硬化等号,确实是不行,好了,看同学没有问题没有了,今天的课就到这里,谢谢大家,好,同学们再见,下周见。
04.游戏引擎中的渲染实践 | GAMES104-现代游戏引擎:从入门到实践 - P1:0 - GAMES-Webinar - BV14r4y1p7tt
哈喽诶同学们好,我是王希,欢迎大家回到这个games104课程,现代游戏引擎的理论与实践,那么今天的话呢是这个即将开启,我们一个很大的一个section,就是绘制系统,那么现代游戏引擎的绘制系统。
将会是一个非常大的一个就是模块,那我们会用四节课的时间给大家讲一下,游戏引擎的绘制是怎么做的,那么实际上的话呢就是从游戏刚刚开始的时候,我们就和绘制走在一起,其实最早的游戏大家知道就是在50年前。
那个时候的显示器就像一个示波器,其实在那个示波器时代的话,我们已经很努力的要表现这些画面啊,小飞机飞来飞去对吧,那么就最早的红白机时代的时候,如果大家去读过那个时候的回忆的文章的时候。
它实际上是一行一行扫描,每一行只能放几种颜色,现在这种情况下,我们还是很艰难的写了一个绘制系统,然后能够把一些很精彩的游戏奉献给大家,也是我们童年的回忆了,那么实际上在今天的话呢。
现代游戏的绘制系统是已经是越来越丰富,越来越复杂,所以就像我们在第一节课跟大家讲过,就是很多人就是提到游戏引擎会下意识的说诶,游戏引擎是不是就是绘制引擎,那显然我们上过我们前三节课的同学。
就知道说游戏引擎其实是不止绘制,但是呢绘制呢又是游戏引擎,非常非常重要的一派,而且呢它其实从技术难度,到他的专业的壁垒来讲的话,也是最高的一趴,那么就是这里面我就抛一个问题来了,我们的同学吗。
就是有没有游戏是不需要绘制系统的,同学们想一想,那这里面的话跟大家,就是那个啊开个小小的玩笑,其实是有的,比如说有一种文字游戏叫做MAD,就是说你通过打字说你进入了一个房间,然后呢房间里有一张桌子。
你要不要走上桌子呢,你跟谁说了一句话呢,其实这种文字游戏它虽然也是电子游戏啊,它其实是不需要绘制系统的,那么但是呢现在大家玩的绝大部分游戏,都是需要绘制的,那这里面的话呢我们要cute cue一下。
就是那个101课程了对吧,我们的严厉起闫老师,那么练习的话呢,他在101课程里面给同学们系统的去讲了,就是游戏计算机图形学的一些理论,那这里面的话呢我们学了各种各样的算法,各种各样的基础理论。
这些东西的话呢,毫无疑问,他是这个就是游戏的渲染系统的一个基础,那这里面的话呢我们可以看到就是说啊,我们学了那么多知识,那在游戏的渲染系中中中,它的区别是什么呢,其实我们会发现啊。
就是在计算机图形学中我们学的东西呢,他第一个解决的问题是比较明确的,比如说你去一般绘制一个或者几个物体,绘制某个特定的效果,比如说我们要绘制这个透明物体translucency,对吧。
我们要去那个去做你们的他们的那种,就是那个就是那个比如折射和反射的效果,比如说我们要做水面,我们要做这个3S的这个透半透明材质,那这都是一个非常明确的一个需求,另外一个的话呢。
就是说其实在那个图形学理论中啊,我们一般不会特别关注它的硬件是怎么实现的,我们一般会关注他的算法或者数学上的正确性,比如说在我那个大学学图形学的时候,我们学过一个算法叫辐射度算法。
他就是一个完全按照光学理论去给出的模型,然后计算机也跑个几天,算出一张非常漂亮的图,他也很好看,所以在我们的那个同学学的时候,我们那时候做到30帧以上,甚至20帧以上,我们就说yeah。
我们是个ROA的一个算法,如果呢我只能算到十帧左右,我们叫什么呢,我们叫做interactive,就是说可以交互性的事实了,那实在不行,我不能实时,但是我画面做的特别好,比如像电影级的cg的渲染的话。
那我可以是几个小时甚至几天只渲染一帧,那么有的时候数据会大佬,连那个就是内存都装不下去,甚至很多台机器离散的去存储,我们叫什么呢,叫out of CORE rendering。
所以这个呢其实是就是理论的图形学,计算机科学学和游戏呢是有一个很大的区别,就在这一点,那么在游戏中的绘制系统,我们面临的挑战是什么呢,第一个挑战呢就是说在游戏的绘制系统里面,我们同时要处理的物体对象。
以及物体的各种类型,包括我需要实现的各种效果是极其复杂的,举个例子,就是说在我的场景中,有成千上万的这个物体的对象对吧,而且它每个形形式都不一样,有的是比如像水体,有的是这个这个foliage就是植被。
有的是角色,有的是天空中的云,那么我需要用到的这种绘制算法,比如说毛发的算法对吧,皮肤的算法,水体的算法和这个植被的算法,还有地面上材质的算法就完全不一样,然后我整体上还要加大量的后处理。
大量的这个就是说光照运算,所以这everything into one container,就是所有东西都放在一个容器里面,那大家想想看,这个游戏的绘制系统是不是会非常的复杂,这是我们的第一个挑战。
就是它非常复杂,它是一个all in one的一个组合,那么第二个事情呢,就是说其实在游戏的绘制系统的话呢,我们并不是跑在一个理想的,或者是一个一个idea的一个设备上,就SERRALLY。
我们证明它正确了,就能做,恰恰相反,我们需要跑在现代的硬件基础上,比如说这是一个很经典的计算机的,这个PC机的架构对吧,它南桥北桥,如果同学们自己组装过电脑,就知道说诶。
我要把这个显卡和这个CPU插在哪个地方,对不对,那么硬盘插在哪个地方,南桥北桥,那我们做的所有的算法,它必须要在这些现代的,比如说我们的PC或者是主机,或者是我们的这个小小的switch上面。
要跑得非常的快,那我们就需要对它的硬件了解的非常的深,我才能做的特别好,所以今天的这节课呢会相对来讲有点硬核,我会跟大家讲一些硬件的东西对吧,大家要做好后面高能的准备,我高能之前的话。
我一定会给大家做个预警,所以说我们的计算机图形学,渲染系统的第二个挑战呢,就是说你必须要深度的去适配当代的硬件,那么第三个呢,也就是说其实在我们在统计学理论的时候呢,我们其实一般来讲一个算法。
我们觉得这个效果做出来了,基本上能达到一个相对好一帧率,我们觉得不错了,但是在游戏中啊,其实你的场景是千变万化的,对不对,但是你的帧率必须是稳定的,举个例子,比如说我不能够一开门走出去。
看到一片巨大的山谷,然后呢很开阔的世界突然帧率掉了一半,那大家觉得这个游戏就不好玩了,对不对,我看了那个就是很多在网上,大家看到一些新的游戏的点评的时候,如果发现那个游戏打着打着帧率就掉下去了。
你们就会说这是很差的游戏,但是大家想象一下,我们在游戏世界里面,构建的场景是不是非常的多样,一会儿你在一个密闭的小房间里面,就几个怪物围着你打,你突然一下子跑到这个楼顶上,你看到一个整个城市的场景。
但是无论你是看到大还是小,无论是细腻的还是粗糙的,它都要保证是在1/30秒,就是30ms跑完,而且现代的游戏呢要求越来越高,比如说我们讲电竞,大家现在打一个FPS游戏的话,我们是不是都要求要60帧呢。
对不对,包括现在电竞屏的要求到120帧左右,那么我们的画幅呢又越来越大,最开始的时候我们叫做1080P高清,那现在的话呢,我就我相信我们很多同学的家里的那个游戏,电脑已经全部变成了4K了对吧。
即将我们到来的是8K的时代,想象一下,就是说如果大家在做绘制系统,说这个game engine的话,这个压力会多大,也就是给我们的时间越来越小,但是大家对我们画面的要求也越来越高,所以呢在大家去理解。
就是说游戏引擎的绘制系统设计的时候,要要理解一件事情,就是说他的这种就是绘制的算法,它必须装在一个非常固定的这个预算里面,就是你绝对不能超过大,你超过大的话,一帧率就掉下去了,那玩家的游戏体验就没有了。
所以这也是我们就是做和这个游戏引擎,其他的这个比如说设计师啊,美术啊,天天打架的地方,就是你把这东西弄得太复杂了,那你就会影响我的游戏性了,那么最后一个呢也是同学们可能会忽略的。
但是其实呢也很简单的一个道理,就是说我们这个游戏跑在我们的一台电脑上,显卡线我们可能可以百分之百的把它吃掉,但是CPU也就是我们最重要的计算单元,我们可以把它百分之百的吃掉吗,如果把它百分之百的吃掉。
那我们前面讲了那么多的游戏逻辑啊,游戏玩法是不是跑不起来了,对不对,包括网络啊,所以实际上的话呢,在我们的就是真正的游戏引擎里面的,绘制系统的话,它不能像我们在图形学课上。
我能百分之百的把车计算资源全部吃掉,我们硬盘只能吃掉大概10%到20左右吧,剩下的大部分的话,我们还是要让给我们其他的这种gap类的系统,所以这个呢也是一条阴线。
所以说当我们去做一个真实的游戏开发的时候,我们有一个很重要的工作叫做profile,然后呢那那个那个profiling的,现在一般游戏引擎都是全自动的,就是每天我们会自动的去跑,然后会告诉你说。
哎你这个系统好像超过了我的预算,你得赶快改回去,否则的话我这个游戏就不许你发布,所以这也是对游戏引擎的绘制,系统的这个巨大的限制,这四点挑战的话呢,也就导致了现代游戏引擎的渲染系统的设计。
会和传统的就是计算机图形学的理论,讲的是有比较大的一个差别好,那所以呢我们这一个章节,也就是我们连续的四节课,就是争取用大概四节课的时间,把游戏引擎中的绘制系统给大家讲清楚,在我开始讲这节课之前呢。
讲讲这些东西之前,我想给大家建立一个概念,就是我们接下来讲的所有的东西,它不是一个理论模型,它是一个工程实践过的,就是这个非常practical的,而且呢是经过这个行业将近30年的,这个迭代优化。
heavily optimized这样的一个software system,也就是说它是个软件工程系统,它是一个实践科学,其实大家以后在学一些理论,和学实践科学的时候,你会发现他们之间有很大的区别。
如果学理论科学的同学啊,其实比较舒服,为什么呢,一般理论知识它更新换代的速度不会特别的快,基本上那些基础理论你基本上十几年调一调,问题就不大,你就是差不多它的,就像数学,有些东西你是不会变的,对不对。
但是如果你是一个工程实践科学,就是它代表比如说最前沿的制造,制造制造技术,最前沿的计算机的体系结构技术,最前沿的这个游戏引擎的技术,和游戏引擎的渲染技术,那么它更新换代速度是非常的快。
因为它是在工程实践中演化出来的,而且呢它是会随着我们的硬件,整个游戏产业的环境的变化,在快速的不断的优化和迭代中,所以在这节课中的话呢,我们不会跟大家纠结一下,它的理论模型是什么样的。
我们更多的会跟大家讲什么东西呢,就是说这些工程上为什么是这么做,这么做,为什么是这么多最优秀的聪明的大佬,发现是最优的东西,所以它是一个practical的software system,这个概念的话。
我希望同学们建立起来,实际上也是到我们最难的这一趴了,就是今天是那个清明节对吧,我们的课程组的小伙伴们非常的干,其实非常的辛苦,那我们真的是花了很多很多时间在想一个问题。
就是说如何把这个游戏引擎的渲染系统,塞到四节课里面,因为大家知道就是游戏引擎啊,这个东西,它本身它的绘制系统本身就可以,成为一个20节以上的基础课程,而且20节还是非常浓缩的。
如果我们做一个叫real time rendering in game engine,这应该是这么厚的一本书,没什么太大问题的,然后的话呢,我们20节课给大家建立一个基础概念,也是没有什么太大问题的。
但是呢我们的挑战就是说,把这所有的东西用四节课讲清楚,所以呢花了很长时间,我们想了一下,就是说那个我们把这个课程分成四趴,第一part呢,就是今天我们会给大家讲一下,基础的GPU的硬件是怎么回事。
包括基于这个硬件的架构,我们对渲染的数据,包括体系是怎么管理的,包括可见性裁剪这些基础的东西,你至少知道说我给了你一堆东西,它怎么画出来对吧,那么第二节课呢,我们会讲一些就是真正在实战的。
比如说在现在游戏中,你的光照模型到底是什么,比如说最著名的IB2模型是怎么回事对吧,那么就是那个然后呢给大家介绍,就是现在行业最标准的就是材质系统,比如说PB2的材质,那么两种最经典的材质。
它模型它的优异度差别,然后最后呢会跟大家讲一下,就是说我们的SHADER模型,其实你把第二节课听完之后,你基本上能画出一个看上去非常非常就是CBB,就是跟现代游戏看起来很像的这样一些东西。
那你就不用再去纠结说我怎么去用这个模型,那个模型基本上你看第二节课的模型的话,做出来的东西看上去就很像我们叫做什么,来叫行货的东西了,那么第三节课呢我们会跟大家同学们讲一些。
就是其实游戏中很多很重要的这个子系统,比如说地形系统对吧,还有天空的这个系统,包括后处理系统,其实你们看到很多的3A大作,它的后处理其实是非常非常重要的,这些算法呢其实很深,也比较有比较有挑战性。
那当我们在三节课的时间,学会了这所有的基础的数据组织,基础的绘制算法,材质模型之后,那我们要讲什么东西呢,就跟大家讲就拍拍,那大家可能听说过很多很著名的pine。
比如说different shading对吧,延迟渲染,那different shading为什么要这么设计,它的点在哪里,包括就是说我们真的去做完了绘制之后,是不是这个不用管。
说显卡怎么提交到我们的屏幕上,那这里面他的这种绘制的,这些内容是怎么管理的,包括在屏幕上怎么去,那包括在这里面的话呢,我们也可以跟同学们讲一下,就是现在比较前沿的这个叫TBRENDERING。
所以说我们把所有的东西全部压缩到了,这个四节课里面,所以呢应该来讲就是知识密度有点高,有的时候可能有点挑战,如果同学们听不懂,不要慌,没关系,因为我们后面会上传录像到B站上。
所以同学们的话呢可以回头再去看,而且呢也不需要全部都懂,因为你只要知道一些核心的东西就可以了,那么今天的这节课呢就是我们可能需要拖点堂,就是我们前面所有的课程,都希望控制在一个小时之内的。
今天这个课我目测一下,好像一个小时有点有点难,没关系,就是希望既然是放假了对吧,我们就在一起,好好的在知识的海洋里面遨游一下好,那我们就开始今天的第一节课,就是渲染的基础。
那其实呢哦对在这节课里面的话呢,我们虽然已经尽了我们最大的努力,但是我们得向同学们坦诚啊,有些东西我们还是没有办法装进去,实在容量不够了,那比如说大家特别喜欢的这个卡通画渲染,大家都喜欢的二次元游戏。
对不对,那其实呢同学们不用慌,因为这个就是说你学完这节课的基础知识呢,你再去上面再学二次元的,就是mp2的非真实感渲染的知识呢,也不会特别难。
他其实他用的很多理念跟那比如说post processing啊,后处理啊,这种理念是相通的,那么包括呢像很多的2D游戏,其实我们叫的2D游戏引擎,它有一些很深的一些一些方法论的东西。
但是呢现在的其实很多2D引擎,现在也是采取3D引擎的方法,就是把这个东西在3D空间展开来,所以的话呢你这些知识也是可以相通的,当然了还包括一些大家特别喜欢的,比如说非常炫酷的这个皮肤的3S材质对吧。
就是半透明效果,比如说我们特别炫酷的毛发效果,这些呢都特别适合作为一些就是独特的专题,跟大家去讲,如果后面的话我们有时间或者有机会,我们会开开一个高级课程,或者开个专题讲座。
跟同学们去分享这些领域里面的,一些前沿的探索,所以呢这里面也跟大家道个歉,就是说虽然我们已经很尽力的往里面塞东西了,但这节课还是有很多的就是计算机图形学啊。
就是那个return rendering的东西,我们没有办法放进去,好的那我们就开始今天的课程的正文吧,先跟大家就是因为这是一个新的section的暖场嘛,我们几乎花了15分钟的时间。
给大家建立了一个基础的就是render系统,到底是个什么东西,那么好,那我们开始在做rendering之前的话呢,我觉得首先同学们要建立一个概念,就是说这个rendering到底是由哪些要素构成的。
那这里面的话呢,我们就那个扩一下我们的这个101的课程,对吧,我这个这一张图是从我们的101课程,练习的课件中扣下来了,然后我跟他讲,我说我要听你的课程,那么这里面的话大家可以看到。
就是说哎其实渲染好像也不难,对不对,他就是有很多的顶点,空间上的顶点,然后呢连成了一个个的面,这一面呢经过一个投影矩阵投到我的屏幕上,然后呢我们有个过程叫做rust rizer。
Rust ization,那么它就是把这个三角形呢就是rust rise,就官烧光栅化成一个个的小像素点,然后呢在每个小像素点上,我们去找到它的对应的材质啊,它对应的这个纹理啊。
就给它就就是给它渲染成各种各样的颜色,你可以考虑光照,可以考虑它本身的花纹,然后渲染出我们最后的效果,所以呢最后我们可以选出我们的这个结果,所以简单来讲的话,就是你看到这里面的话,有成百万的这个顶点啊。
三角形啊对吧,有上就是几千万以上的这种像素,有并联,觉得就是10亿级的这种ARU的和text的运算,这就是我们rendering的一个最基础的东西,那这里面的话呢我们可以看到,就是说在绘制的话。
它最核心的工作是什么,我们叫做computation对吧,计算机你要去画出一个东西,还要工作,其实这里面我给大家讲个概念啊,就是其实绘制系统对于游戏引擎来讲,就是说我们就做那种躲在像素之后之后的事情。
我记得以前在SIGGRAPH上有个section,就讲游戏引擎绘制嘛,在这中间的话呢,我们就会提到一个东西叫做the men and women behind,The pixel。
就是躲在像素之后的男人和女人们,为什么呢,因为就是说我们大家看到的那样,一个壮丽的画面,实际上是现代计算机一个一个像素堆起来了,那么这里面的话呢我们的计算第一种是什么呢,比如说最简单的投影和光栅化对吧。
这个在101课程中讲的特别的多,就是我们找一个相机位置,然后呢进行它的投影,无论是正交的还是这个那个透视投影,然后呢,我们得到这个屏幕空间上这个三角形之后,我们把它关上化成一个一个的像素。
这就是我们的投影,那么投影光栅化之后呢,诶我们就开始对它进行着色,就是绘制,绘制呢,其实这里面我们取一段就是我们看到这个球,对不对,我们取一段最简单的一个叫,就那个他的成它的代码的案例。
那证明这里面的话,他会发现它的运算其实也就几种,比如说第一种,我要去从这个这个常量里面取很多的常量,比如说我做个绘制,我需要知道屏幕上有多少长宽,有多少个像素,那我们是要访问一些常数呢对吧。
这些常数在每个像素里面我都要去访问它,那我们中间呢会做大量的加减乘除的运算,比如说我们要算一个缝模型的时候,你需要知道说法线在哪里,光线在哪里,我的眼睛在哪里,我就可以算出来说,诶,这个光有百分之多少。
会被我这个就是这个这个衰减掉对吧,那么我这个小球上有很多的花纹,那我是不是要把它存到一张这个2D的贴图上,我在那个点把那个贴图上那个颜色取出来,放到一起,这些东西就像炒一盘菜一样的,你用这几种运算。
就是说啊数学运算常数的访问变量的访问,再加上这个就是texture的访问的话,你就能得到你想要的结果,那这个事情呢其实听上去很简单,但这里面呢我要跟同学们建立一个概念,就是说其实在绘制中啊,有一个过程。
大家可能注意不到,但其实它非常的复杂或者是昂贵,就是什么呢,叫做texture,就是踩踩这个纹理,那为什么这个东西它其实非常的复杂呢,大家想想一下啊,就是这里面给大家讲个概念。
就是说啊我们在人身上贴个花纹,比如说我们作业面砖墙,这个砖墙离你很近的时候,你会看到一个一个的像素,对不对,但如果这个砖墙离你非常非常远的时候,其实啊你在屏幕上看到的一个像素。
在那个纹理上其实是隔了很多很多的像素的,那这个时候如果我们不去对它进行一个,叫做这个专业的说法叫滤波,做一个低频滤波的话,你当我的这个砖墙由远及近的移动的时候啊,由由近及远的移动的时候。
你会看到那个画面一直在抖动,这个东西叫什么呢,叫做走样,我相信很多同学玩游戏的时候,你们会有一个叫图形设置,叫NTL型防走样,对不对,那么如果你的显卡特别好的话,你会把你反走样开的特别高。
其实呢这也是一个很重要的反走样的方法,那在纹理上面的话呢,我们实际上每一张贴图我们会存很多很多层,当我作为一个屏幕上一个小小的像素点,我去取一个纹理的时候,实际上我首先我取的位置不一定在那个。
就是那个像素点上,所以呢我要取四个点,要对它进行插值,然后呢我还要在两层的放比例上去取,那这里面的话考大家一个数学题啊,我们要做一次纹理采样,我们要访问多少数据,我们要做多少次差值呢。
对这个答案是这样的,就是我们要是这个图上已经画的很清楚了,就是如果我们做一个采样,我们要采样八个顶点啊,就八个像素点的数据要做几次差值呢,要错四七次差值,所以大家想想看,就是我取一个最简单的颜色。
我的计算机要做这么多的工作,所以这件事情呢,其实也是绘制中的一个很重要的运算,所以这里面的话呢,我们就要隆重推出我们今天的主角了,就是GPU对吧,graphics的这个process unit。
那么实际上也就是大家讲的这个显卡,那么显卡这件事情的话呢,是非常了不起的一个发明创造,就像我们第一节课也讲过,就是现代的很多引擎,之所以能够就是啊有突飞猛进的变化,就是因为随着独立的显卡出现。
我们可以把这些复杂的运算,用一台更高效的机器进行处理,这样的话我极大的释放了我的这个CPU,同时的话呢我们可以把画面越做越清晰,所以说如果你想成为一个就是游戏引擎的图形,程序员的话,那这是你最好的伙伴。
你最好的buddy,包括我们现在游戏引擎里面,很多绘制系统的基础设计的话,它都是基于现代显卡的架构的理解,所以接下来这一趴呢会非常的高能,就是我要跟同学们讲一下,就是我我已经是尽可能的。
讲一些比较简单的东西,就帮助同学们建立就是显卡的基础架构,让大家知道,就是当我们架构一个系统的时候,我们需要关注什么,但是呢呃对于就是没有基础的同学呢,稍微有一点点高能啊,反正同学们如果听不懂的话。
会会可以告诉我们,我们后面再去看看怎么去补充好,那我们进入一个最基础的硬件的这个漫游概念,那要想理解显卡呢,我觉得首先要建立两个概念,就是叫SMD和SMT,这个听上去是不是很高大上。
其实SMD就是这个是我们的老朋友了,大家还记得我们在前面讲过,就是现在CPU里面的话,实际上呢已经广泛地使用了,这个就是要单指令多数据的加减,这个数学运算,简单来讲就是一个四维的向量对吧。
就那么当我做一次加法指令的时候,他的XYZW坐标同时在做运算,所以我一个指令能完成四个加法或者四个减法,这个听上去很简单对吧,就是那个在我们的那个,就是很多的高性能运算中,我们会呃,我跟同学讲过。
就是如果你们看C加代码,会看到有些叫SSE的这个扩展宏,那实际上就是在调用SMD的这个指令,大家想象一下我们在渲染的时候,是不是有大量的这种,就是这种类似于这样的运算,比如矩阵运算对吧,坐标变换运算。
所以SMD就是我们最好的朋友,这个概念非常好理解,而但是呢在现代显卡里面的话呢,我觉得同学们一定要理解,另外一个更有趣的概念,叫做SIMT叫single instruction。
Multi threst,就是他的想法呢其实也非常的简单,就是说如果我的一个计算内核,我把它做的很小,但是我可以做很多很多个,我这样的一条指令的时候,我可以在很多很多的盒上同做同样的指令操作。
那比如说我假设有100个盒放在那儿,那我一条指令下去,我是不是可以做100个四个数的加减乘除呢,那是不是我的计算效呢,以前是乘了四,我再乘了100,所以那我的比例是不是放大了400倍。
其实现代的这个显卡的话,大家如果去看的话,它本质上就是一个我认为是个大蜂巢,就是放了无数个小小的盒,那现在比如像那个NVIDIA的,就N卡的话,一般是放了无数个小库大盒的,后面我们会详细的讲到。
但是这个呢实际上就是现代显卡,为什么算力这么强的原因,那么就跟大家讲了基础的概念,就比如说像现在的很多显卡的,好的计算的这个性能,如果我们有一个有个概念叫flops,就是一个浮点运算能力吧。
就是那么一秒钟你能完成多少次浮点的计算,那么这个现在的显卡,一般能达到十个以上的TREFLOS,对不对,比如像XBOXX或PS5,但是呢现在的CPU的话呢,一般在很难达到一个turf。
它两个数量已经超差距,已经超过了一个数量级,那为什么显卡能够遥遥领先于CPU呢,本质上是显卡耍流氓,就是说CPU很老实对吧,我就是一个人闷头处理所有的事情,但是呢显卡很流氓,就是招了很多小伙伴。
虽然每个人能力都不是很强,但是大家一起来协作,所以他的算力非常的快,那为什么要让同学们知道这个SMT这个结构呢,就是说我们在做所有的绘制算法的时候,做所有的运算的时候,都尽可能是用同样的代码。
大家让大家一起跑,然后呢每个人分别访问自己的数据,这个时候你可以在显卡上跑起来非常的快,而且是远远远远超过你在CPU上算出来的东西,这个是做图形程序的话,最重要的要掌握的一个概念。
那么你有了这个概念的话呢,其实大家就可以窥探一下,就是现代GPU的这个架构了,那这张图就比较高呢,同学们看的是不是觉得很晕啊,密密麻麻的,如果有密集恐惧恐惧症的同学会觉得很难受。
其实呢这个图虽然很复杂吧,但是呢我们有一个简单的方法,就是你可以发现啊,其实它的结构是重复的,就比如说这里面我们选用了一个相对简单的,就是那个费米架构,费米架构大概是10年前的。
10年前的那个N卡的架构了吧,最新的架构应该是安培最新的哦,是四零系列的话,有可能是那个Hope的架构,那我们先当然他技术原理的差不多吧,那我们就用那个这个费米这个架构来给大家讲,就是一块显卡上。
他放了很多的内核,但是呢它分成一组一组的,这每一组叫什么呢,叫做GPC,其实是graphics process cluster,就是一个图形处理集群,然后在这个图形集集群里面的话呢,你可以看到很多的。
就是他们叫做那个就是那个string multiprocessor,这个stream multiprocessor里面装了很多的小的块,小内核,一般在N卡上,我们放的是库塔的盒,这个库塔核干什么事情呢。
它就做大量大量的数学运算,然后呢这个这样的一个那个string multiprocessor的话,你给他一条指令,这些小孩就哐叽就一下子狂跑起来了,然后在这里面的话呢,他有专门的硬件帮你去处理。
他的这个就是各种texture,就是我刚才讲的非常废的纹理采样的工作,包括呢做一些比较复杂的数学运算,比如说啊同学们要有概念,就是当你们将来以后做这个绘制的时候,如果你想在显卡上跑加减乘除没有太大问题。
但是如果你要扩一些像什么sign啊,cos啊这些什么这个这个这个三角函数啊,对吧,你可以明白它的运算速度会比较慢,还有专门的SFU帮你去处理这件事,这个讲讲起来就太深了,我们今天不展开。
其实大家如果看最新的,比如说安培架构里面的话,这里面会塞什么呢,会塞一个叫tensor CORE,就是这个著名的人工智能的这个,这个这个这个核心还放个什么东西,还放一个叫RT CORE。
就是大家喜闻乐见的光追,那其实那里面有个专门的核心去支持这件事情,所以这其实呢就是现代GPU的架构,但同学们怎么去理解这件事情呢,就是我们的很多的运算,这个CPU上都是分到一个个的。
这个叫这个string multiprocessor这个单元去处理,那么这里面的话几十个核的,其实他们不仅是并行的处理工作啊,他们还可以互相交换情报,形成这样的一个一个一个协作体。
所以呢这里面可以看到他们有shared memory这件事情,如果同学们如果有写过这个叫多,就是那个KROUTINE啊,就是B进化编程的时候,你们就知道说哦,我们的这些CPU之间还可以交换数据的话。
我可以做一些非常酷炫的运算了,所以这个是现代GPU最重要的架构,也就是我们几乎所有的运算,都是跑在这样的一个架构上面来,那么这里面的话呢,就是第一个,我们把这个SMT的架构这个概念教给大家,那第二个。
我想同学们建立了一个基本概念是什么呢,就是其实啊,我们的数据在这个计算机里面流动的时候,是有成本的,就是从我们计算机诞生开始的时候,我们用的是什么架构呢,这个有一个很著名的学术名词叫冯诺依曼架构。
冯诺依曼架构它的核心是什么呢,就是把计算和数据分开,这个架构非常好,会让硬件设计变得非常的简简单,对不对,当然其实现在有一些很前沿的研究,就是想打破这个架构,那我们今天不展开啊。
那么这个架构所带来最大的问题是什么,就是我每一个计算我可能需要去找数据,后来大家发现就是找数数据,这件事情是特别特别慢,而且数据呢在不同不同的计算单元中,搬来搬去也是非常慢,我们举个例子啊。
就比如说在这个,就是大家刚才还记得我们一开始的那个南桥,北桥嘛对吧,那个北桥上面我们放了一个这个CPU,这边放了一个显卡,但CPU呢它里面装的是一个主主内存,然后这里面的数据。
如果我把它上传到我们的显卡的显存上的话,这个速度是非常慢的,而且呢还有一点是什么呢,就是说我们GPU不是算的非常的快吗,显卡算的非常的快,但是呢大家想想看我的一个计算,如果我先从CPU准备好。
交给显卡去算,显卡算好,我把它的数据读回来,CPU再基于你对这个计算的结果再做一些判断,然后再告诉CPU怎么绘制的话,这个我们叫做这个数据的DK force吧,那实际上会有一个非常严重的问题。
什么问题呢,就是说啊因为在现代引擎架构中啊,一般绘制和逻辑是不同步的,但是你如果有一部绘制运算,需要等着他们来回去back force的话,实际上你很可能会导致就是半真到一帧的。
我们叫做这个latency,那整个画面就是我们经常会看见,就是这个逻辑和画面不同步,有的时候可能会因为这件事情会导致,所以呢在游戏引擎的绘制系统架构中,我们有一个原则,就是我们尽可能把数据单向传输。
就是CPU送到显卡就完事了,然后呢尽可能的不要从显卡里面读数据,这也是现代计算机结构,导致了我们的设计上的一个要点,那么第三件事情呢,我希望同学们对硬件掌握的建,建立的概念是什么呢,就是cash叫缓存。
那么其实cash这件事情是对现代计算的性能,影响是非常非常大的,可能远远超过大家的想象,我给大家建立一个基本的概念吧,就是说呃大家知道就是我们在CPU上,现在CPU啊,如果我们去做一次加减乘除。
可能一个clock就做完了,对不对,但是如果这个时候比如说我说A加B,但是A我找不到了,A在我的内存上,大家写代码的时候,是不是觉得就是内存上放数据,对不对,但这个时候实际上。
如果CPU发现不在自己的缓存里面,我需要去内存去找内存已经非常快了,对不对,实际上它要等100多个时钟周期,也就有那个时间,我已经做了几十个上百个运算走了,所以这就是为什么我在上一节课给大家讲的。
就是说数据一定要放在一起对吧,其实它就是为了cash去做这样的准备,这件事情呢在我们的图形,在我们的显存上是非常非常重要的,那包括就是说比如说有些数据过大了之后,它也会导致这个cash很难背这个利用好。
所以呢这里面两个概念,就是当我做每次计算的时候,如果A恰好数据都在我的缓存上,我们叫做什么呢,叫做cash hit,就是我们的缓存被命中了,那么如果呢这个时候我数据不在缓存中,我们叫什么呢。
叫cash miss,数据就是就我要等很久,所以你很多时候做这个计算机图形学的啊,就是做那个游戏引擎的绘制的时候,如果你的这些纹理这些计算没做好,老师让计算机产生catch miss的时候。
它的效率就直接下降了,所以呢这节课呢,我们高能的部分基本上快结束了,但是呢我跟大家去讲一下,就是如果大家以后有机会进入到这个就是啊,图形程序,这个对于我们的这个就是游戏引擎的话,你会学会很多黑化。
现在互联网黑话呀,你比如说这个au bound对吧,就是这个这个就是呃我的数学计算太多了,导致的就是说我其他的纹理采样什么都来得及,但是呢就是等你的数学运算结果,比如说像favorite bt。
就是说我所有的运算都算完了,但是呢我写到那个缓存,你的速度太慢了,结果就是一直要等大家都堵在那了,其实你会发现它的整个现代的计算机,它就是一个流水线,只要有一个环节它没有平衡好,它一旦卡住了。
你其他东西优化的再快,它也会被卡住,所以棒的这个词是一个最常用的一个黑化,所以但是今天呢我不展开,因为这个太深了,就是也不,或者说以后大家再进入到这个,就是游戏引擎开发中间的话,你们都会遇到。
所以这些东西其实让大家深度的理解了,就是现在的游戏,特别是呃就是非常复杂的顶级游戏的话,他再去做渲染系统的设计的时候,是会非常关注这个对GPU的使用和利用的,那么其实呢这里面我要跟同学们讲一下。
就是其实硬件的结构一直在变对吧,那么最像从最早的DX11时代,大概差不多10年前吧,我们看到的就是可以做更细分曲面的,更更加灵活的SHADER,包括可以更通用的计算SHADER,到今天的话。
我们看到了就是更容易去处理的这种mesh shader,这些结构一直在变,那么包括呢就是这里面,我们可以在之前经常跟同学们讲的,就是说当我从PC走向了主机之后,那主机的架构又不一样。
因为主机的话它是一个叫u ma,就是它的内存全部是共享的这样的一个架构,那你的这个引擎架构又会不一样,那么还有一个很著名的,就是这个大家现在天天见到的什么叫手游,手游是跑到哪了,是跑在移动端,对不对。
但在移动端上的话呢,他考虑到这个就是功耗,考虑到它的处理芯片的这个能力,因为这个就是说其实访问数据是最昂贵的,我一直讲过嘛,所以呢他们就develop的这个tale base renderry对吧。
就是我们你看着手机上一个,比如说1080P或者更高清的4K的画面,实际上它是一小块一小块的渲染出来的,那这些东西的话呢,其实你会发现我们所有的引擎架构都适合,硬件的架构息息相关的。
所以同学们在学渲染之前的话,我是特别特别希望同学们能够先去了解一下,这个显卡到底是怎么工作的,你理解了显卡是怎么工作的话,你对这种各种渲染的这个引擎算法,就有更深的理解。
所以这1part呢是相对比较高的,同学们听不懂没有关系,建立一个基础概念就可以了,那么同学们会说诶,那如果我不是做引擎的,我需要了解这些东西吗,我个人认为的哈,如果你是做游戏开发。
如果你是做有特别是游戏的这个art,就是艺术家的话,我觉得多少掌握这些概念还是有好处的,为什么呢,因为就是说当你去设计你的游戏的玩法的时候,你会知道硬件在什么地方会卡我们。
所以我们不会把这个场景做得无限的复杂,我能更专注于在我的玩法上面,好的高能的部分基本上讲完了,那接下来呢就我们把难度下降一点,给同学们讲一讲,就是那好了,我们已经知道这个显卡是怎么做出来了。
那现在可以让我去做一个简单的绘制了吧,那这个地方的话呢其实并不是特别的难,比如说我们打开一个游戏吧,我们看到的是什么,在上一节课我们讲的就是,这个世界里面大部分东西都是叫game object,对不对。
那么这些所有的game object的话呢,就是构建了这个世界,但是上节课我没有跟他讲的,是说我们对游戏里面的每一个物体,有很多的描述,比如说它是一辆车,它是一个飞机对吧,它可以有血量。
它可以有各种各样的行为,但是同学们意识到这里面所有的东西,它只是一个逻辑的描述,这个东西它其实是绘制不了的,所以这里面的话呢我们需要区分一个概念,就是说就是一个逻辑上表达的,这样的一个游戏对象。
和你真实可以绘制的东西是两个东西,所以那天我们在讲到这个组件的时候,会讲到有一个component叫什么,mesh component对吧,实际上这个名词呢,在不同的引擎里面有很多的变化。
有的人叫做mesh component的,有的人叫做skin mesh component,比如说skin mesh component,就是说假设这个mesh它是有骨骼的,可以一直去变形。
比如说我们做一个角色的时候,他可以动来动去,但是它的底层理念是大同小异的,那我们在这个component里面,存了一个很神奇的东西,我们一般在行业里叫什么呢,叫做RENDERABLE。
RENDERABLE是什么呢,就是可绘制的东西,就是我拿到了这个RENDERABLE这个物体,我就能把它绘制出来了,所以说这是我们这个绘制系统的,核心的数据对象,那么一个RENDERABLE怎么来了。
那我们首先看这个物体本身吧,那比如说以我们的这个小明,想做的这个,超越2042的现代战争游戏的为为例,它请了一个艺术家,做了这样的一个很酷的视频的角色,他就会发现诶。
这个家伙身上好像首先有很多的网格mesh对吧,就是它的几何形体,比如他的头盔,他的枪很帅,然后呢每一个mesh呢上面有各种各样的材质,比如说有的像布,有的像那个金属对吧,有的像皮肤。
然后呢这些材质上面呢还有很多的花纹,所以我们会展现出各种texture,但其实还有比如说它的normal对吧,normal就是说诶更细的,你没有办法用mesh表达的这些细节,我们用normal去表达。
好像你看这些东西是不是可以绘制的东西,这就是我们RENDERABLE的最简单的一个building block,但实际上RENDERABLE在现代游戏引擎中,比这个更复杂,但是这些是最基础的一个概念。
那我们再top down一下,就是说那首先咱mesh在我们的计算机引擎里面,游戏引擎里怎么表达呢,就是说如果大家不去做引擎的话,这些数据你是不用关注的,就比如说大家想象一个。
我从那个max用一个导入器导进来了,诶这个模型我在那个unity你就能看见了,对不对,其实这里面我们首先要定义一种叫做mesh,Primitive,对吧,这个primitive这个词呢。
其实有的时候会跟几何会通用,但我们这边就是简单的叫max primitive,那最简单的表达一个目的是什么哦,我们有很多的顶点,顶点上呢有很多的数据,比如说顶点的到底在哪里,这是一个数据,对不对。
还有什么呢,它的法向朝向,它就是它这个面是这个顶点是朝向哪的,还有一个是什么呢,比如说它的UV啊,还有其他一些各种各样的属性,然后每三个顶点我们放在一起,是不是就变成了一个三角形。
那我们把这些三角形放在一起,就形成了这样的一个外观,这个形状,当然了,这种数据存储方式是一种很笨的方式,实际上同学们如果写过这个,open gl和direct的代码的话,最基础的同学代码就知道。
我们会把数据用index data和vertex data去定义,什么意思呢,就是说我们把所有的顶点放在一起,三角形呢不会再把顶点数据再存一遍,我只存这个顶点的索引值,那为什么这么沉呢。
其实道理非常简单,就是说我们打开一个真实的模型的话,你会发现诶,他很多顶点是被很多个三角形共用的,实际上的话呢大家如果用数学算一下,就是很多模型中,大概顶点的数量只有三角形的数量的一半。
而一个三角形里面又有三个顶点,所以说你用这种index的方法的话呢,理论上它的计算存储量可以节约六倍以上,因为顶点的数据很费,它要存这个三个float的,它的空间位置对吧,三个float。
它的那个法向可以不需要三个float层了,比如说还有一大堆的UV这些数据,所以的话呢就是说这是在实战的系统中,一般采用的方法,这个东西是不是很好理解对吧,那么包括的话呢。
就是呃这里面还有一些简单的概念呢,比如说同学们想一下,如果我把顶点存在一起,我可不可以不需要index buffer呢,实际上是可以的,比如说大家知道有一种概念叫triangle strip。
就是说呃在我们的这个,就是他同学们小时候有没有做过,叫一笔画的问题,就是我假设一个复杂的网络,我用一一帧一笔把它所有的边全部勾勒出来,如果我所有的勾勒的过程的话,都符合一个个的三角形的话。
其实我可以每三个顶点,每就是D12,比如说我们顶点数是01234567,2012是一个三角形,123又是个三角形,这个234又是个三角形,这样的话呢我不用再单独的存储它的index buffer。
实际上呢它也能表达一个mesh,而且呢这样的表达还有一个很大的好处,是什么呢,刚才我们在前面讲这个GPU的架构的时候,想到一个很重要的东西,叫什么叫做cash缓存,如果我们每个三角形绘制的时候。
对顶点数据的访问都是这样顺序的话,是不是对缓存来讲最friendly,所以在早期的这个这个游戏引擎里面的话,我们会尽可能的想办法把一些模型变成这个,Triangle strip,也是这个道理。
但是呢现在游戏呢一般比较强大,所以我们也不太会特别强调这件事情,那这里面的话呢我跟同学们讲一个概念,就是这是我在最早做从,因为我以前是学计算机图形学嘛,当我开始做游戏引擎的时候,我当时就很晕。
我说为什么每个顶点都要从一个法向,这里面一个很简单的一个数学知识,就是说呃我们每个三角形可以算出它的朝向,对不对,那用邻近的几个三角形就可以average出来,就可以平均化出来,我的顶点朝向。
这个呢对于大部分情况下都是对的,但是呢一旦你的表面它是有这个硬表面,就是有一条折线的时候,你会发现两个顶点的位置是重合的,但是呢它的法向完全不一样,这里面举个例子就是正方形的Q,所以同学们在一开始入行。
去写游戏引擎的绘制系统的时候,在你定义你的顶点数据的时候,一定要给每个顶点单独定义它的法向方向,这里面也是我以前踩过的坑,所以当我今天在准备这个课件的时候,我就特别想把我这个当年犯的错误。
跟大家去分享一下,当然我相信我们的小伙伴可能比我聪明的多,也许说这么简单的问题,我怎么会不知道呢,唉那这就是我们的这个max形状数据,那么另外一个数据呢,就是刚才已经讲的就是材质对吧,我做出了他的样子。
那我就说这东西看起来像石头呢,还是像金属呢,还是像布呢,还是像漂亮的塑料呢,其实材质系统啊,它非常来自于我们真实的生活,你会发现早期的材质系统的表达,是非常非常接近于我们在物理世界,对东西的感知。
那么最早的这个这个比如像逢魔型的时候,大家就会说塑料它的反射应该是什么样子的,这个金属应该是什么样子对吧,石头那个非金属应该是什么样子的,但是的话呢就是说这些材质系统的话呢,其实大家讲一个小小的知识。
就是在后面我们讲到物理的时候,其实还有另外一种材质叫physics material,它其实跟这个东西呢很容易混到一起,那个东西更多的表达的是这个东西,它的摩擦系数对吧,它的这个你撞上去之后。
它的弹性反弹力是多少,和这个概念,其实你你有时候会觉得他们相近,但但是在现代引擎中的话呢,一般我们在绘制系统中定义的只是视觉材质,而物理材质呢我们会单独的去定义它。
那么材质系统呢其实经过了这么多年的发展,从图形学中最经典的,比如说缝模型对吧,大家最著名的缝模型,到现在的,就是我们在下一节课会给大家详细讲的,这个基于物理的。
就是physics based rendering,基于物理的PV2模型对吧,包括一些特殊的效果,比如说我们讲的这个半透明的3S材质,其实我们在这个行业里面,已经积累了一大批非常优秀的这个材质模型。
那么有了这些材质模型对吧,然后呢,接下来我们需要的是什么呢,就是这个需要纹理,其实啊在表达一个材质的时候,文理扮演了非常非常重要的作用,其实现在的这个就是计算机那个图形学里面,在我们的游戏引擎里面。
其实很多时候材质你觉得它是像金属,还是像一个这个这个这个生锈的非金属表面,并不是由材质的参数决定的,很多时候是由它的纹理决定的,在这个里面大家看到这个生锈的铁球,你怎么区分那个光滑的金属表面。
和那个生锈的非金属表面,那个就是那种他其实也算金属,但是你感觉像是石头或者什么东西在表面的话,实际上是通过这些纹理,比如roughness这样的纹理来区分的,所以纹理呢也是材质非常重要的一种表达方式。
那最后一个呢就是大家会忽略掉的,就是是不是我们有了这个材质的表达,我们有了文理,有了mesh,我就能够绘制出我的东西呢,这里面有一个无名英雄叫做SHADER,Shader,其实是在游戏引擎中啊。
一个非常奇葩的一个存在,因为我们做引擎的,一般会区分什么叫做数据对吧,就比如说我们做或者叫ASA的资产,我做的各种各样的模型是资产,对不对,然后呢什么东西是什么呢,叫source code。
是我写出的程序员写出的源码,一般艺术家设计师你们碰数据,程序员碰源码,但是SHADER呢是一个很神奇的存在,它首先肯定是源码,对不对,我们是要用大量的代码写出来,我这个怎么去表达这些材质。
但是呢他在游戏引擎中又会当成数据来处理,就是当我去绘制每一个东西的时候,我告诉现在的显卡说啊我要画一个球,OK这个球上贴了一个虎皮花纹,这个时候你还要给他一小段代码,我们一般叫一个block。
就是一个二进制的一个数据块,这是我的一个编译好的一个SHADER代码,你说你就用这个程序去把这些元素合到一起,绘制成我要的东西,那么SHADER其实变化也非常大,因为从固定的这个著名的材质模型。
包括现在在现代引擎中,大家可能听说过一个概念,叫做shader graph,shader graph是什么东西呢,就是当艺术家想表达各种各样的材质的时候,它就像搭积木一样的。
把各种元素组再按自己的方法进行组合,那它组合完之后呢,实际上它会生成一个一个不同的SHADER的代码,而这个设置代码的话呢,它又会编译成一个数据,这些数据呢又会和这些mesh存储在一起。
然后呢让我们去形成多种多样的游戏世界,所以SHADER也就是着色器的代码,它也是一种关键的RENDERABLE的数据,那好了,我们有了这样的一个东西的话,那我们就可以在引擎中绘制东西了。
因为我们有了我们就知道绘制东西,它有网格,我们有这个啊材质材质里面最多的数据是什么,是纹理,然后呢还要配上一小段的这个shader code,我们就可以绘制一个东西。
那这个时候呢我们开始绘制其实非常简单,就像我们在101课程里面会讲到,说我们先做个投影变化嘛,那就就是首先的话呢我把物体放在这儿对吧,我首先把它每个物体做好的时候,它在自身的这个坐标系。
我们要把它乘上一个叫模型矩阵,把它从自身的坐标系移到一个世界坐标系里面,然后呢一到世界坐标系的时候,这时候我确定一个相机的位置,我们用一个叫view matrix把它投影到相机坐标系。
然后呢相机呢我们再去对他进行正交,或者是这个这个这个这个透视投影,把它变成我们在这个屏幕坐标系里的东西,这个课程呢在这里面我们就不展开了,因为这是大家如果去学open g2,如果是学过101的课程。
这都是我们绘制的一个基础的东西,这一趴很简单,对不对,接下来我们就开始很愉快的,按照上一章节讲的东西,我先把你的vertex buffer,Index buffer。
就是这个mesh的东西我提交上去对吧,然后呢我把你的材质参数提交上去,我把一个个的这个texture提交上去,给我们的显卡,然后呢我再给你一小段代码,说显卡你看到的每一个顶点。
每个像素你就这么执行就对了,好显卡就很愉快地跑完,这个时候就把我们的这个物体,真的就绘制出来了,对不对,这就是这个时候就完成了,从一个抽象的逻辑上的游戏对象,变成了一个RENDERABLE可绘制的东西。
但这样位置对不对呢,其实我相信聪明的同学很快就会发现有问题,比如像我们的图片的这个,这个就是啊右边的这个这个角色,你会发现诶他不是这个人身上有很多的材质吗,如果我只是简单地这样去写的话。
一个物体我如果只设它一个材质对吧,一个纹理的一套纹理的话,他好像就画错了,所以呢那我身上有那么多材质,这个数据我怎么去整理呢,所以这里面我们想引入一个,就是说这个非常重要的一个概念叫做SUMESH。
就是其实在现代游戏引擎中啊,我们对于一个一个GO一个对象的话,它的一个所有的mesh,一个mesh我们会根据他身上用的材质不同,把它切换成很多的smash,就英文叫做SUMESH。
然后呢每个3mesh的话呢会对应于自己的材质,自己的纹理和自己的这个shader code是什么样的,但是呢我们一般会把它的顶点啊,把他的这个三角形呢,全部放到一个大的这个buffer里面去。
所以每个some mesh呢你只需要存一个offset,就是说哎我的index buffer从哪个点到哪个点去offset,就可以了,同学们能想象这个结构吗,也就是说我们把整个网格放成一个大的。
一个一个一个铺一个buffer,但是呢我每个smash呢只用了buffer中间的一小段,这样的话我就知道了,这个这个这从从这个起点到端点之间的,这些三角形,我需要设置成什么样的材质。
什么样的SHADER,什么样的texture来绘制它,所以呢some mesh的概念,其实是现在引擎里面特别常用的概念,如果大家打开,比如说像虚幻引擎啊,像很多引擎你们都会看到类似的这种结构。
可能名字叫的不一样,但基本逻辑是这样的,那这个时候,如果我们这样再去做这个游戏引擎的话,你会发现一个非常有意思的事情,就是当我去绘制很多很多东西的时候,我如果每一个机油,我们都去存储它的整个这一套。
从这个mesh到some mesh,到它的各种各样的材质,到他各种各样的这个SHADER,各种样的texture的话,这个数据量会不会非常的大,对不对,而且大家如果仔细观察。
你会发现这里面很多的mesh,甚至是有些贴图,甚至是SHADER,它都是一样的,那我们怎么样子节约它的空间呢,所以在现在游戏引擎中呢,我们一般的做法是会建立一个铺,我们把所有的mesh放到一起。
形成了一个mesh的P,我们把所有的texture也放在一起,比如说我们作为一个一个人吧,他身上很多的纹理,其实在在其他人身上可能会共用的对吧,特别是SHADER,比如说如果大家用的都是PP2的话。
那我们的SHADER是不是长得一模一样,我假设有1000个这样的对象,我是不是只需要存一份,所以SHADER我也是放在一个铺了,那这样的话当我绘制一个场景,各种各样的这个角色,各种小兵的时候。
你会发现它只是通过一个指引,指向了各自所需要的我的材质啊,我的mesh的网格,这个呢是一个非常经典的游戏引擎架构,所以同学们如果你们加自己的游戏引擎的话呢,就记住两点。
第一我要去通过sam mesh把每个对象,每个物体,每个mesh按照这个材质进行切换,但是切分好之后呢,我们要对把相同的材质全部归类到一起,有相同的纹理归类到一起,用一个大的push管理。
然后呢相同的mesh也放到一起,也是用一个大库去管理,到时候我去绘制每一个物体的时候,我就找它相应的对应就好了,这样我存储空间是最小的,那这里面其实就引入了这个游戏引擎架构里面,一个很经典的概念。
我们叫做instantly instances的意思是什么,意思叫实例化,就是刚才我们讲的那些数据啊,它都是它的定义,就是我定义了一个小屏,他的rainbow应该长什么样子对吧,但是呢。
当我在屏幕上画了这个几千个小兵的时候,那其实每一个小兵只是那个数据的一个实例,其实这个概念啊,在游戏引擎的设计中是从头贯贯彻到尾的,不仅是在绘制这一趴,其实在我们做游戏逻辑啊。
游戏的这种场景物的管理啊等等,都是有这个叫object definition,object instance这个概念,所以的话呢因此这个词同学们一定要牢记于心,当你做引擎的时候,一定要区分的非常清楚。
就是这个数据是我的定义对吧,那这个数据呢是我的实力,一般来讲我数据创建了实力之后,还可以再加一点点的变化,但这个讲起来就比较复杂了,今天我就不展开,所以讲到这一趴的话呢,我觉得同学们基本上已经知道说。
我怎么样的去构建一个可以绘制的,一个有很多很多物体的一个游戏世界,那这里面我们就往前再走一点点,就是说哎我们刚才讲的GPU啊,它其实有个有个特点,就是它特别懒,就是你给他设置了一个参数。
你每次去改变他的时候,他都很烦,他说啊你要改我的参数了,你是不是要改这个贴图啊,你要给我换SHADER扣的,大家想到那个刚才那个那个那个那个string,multiprocessor sm那个结构对吧。
你每次去换他的那些东西的时候,是不是那32小时都说啊,那我们停下来吧,等你把这个数据换好,我再去运转吧,其实在GPU上,在显卡上每一次换这个数据他都很烦,他都觉得你很慢诶。
这个时候呢聪明的小伙伴们就会想到一个办法,那我这样好不好,我们把这个场景里不是有很多的物体吗,比如像这个里面,你看了这么多的这个地上的那个碎木头,它其实都是同一个材质对吧,一个材质它就有相相相同的参数。
相同的纹理诶,我把整个场景的物体按照你的材质进行排序,那么把相同材质的东西国服到一起去,我设置一次材质,然后呢我就绘制这一个月的sub mesh,那这个速度是不是会更快呢。
实际上你去算它的计算量好像是一样的,但是呢你交给显卡的时候,这样速度确实是真的会变快,也就是包括在我们以后,如果有机会跟同学们讲,就是现代的这个一些,比如像DX12,像VULKAN的它的架构的话。
实际上它会把对CPU的状态设置,专门抽象成一个就是render state object对吧,一个就是他每个沃肯和那个都不太一样,它命名,不然它的基础逻辑就是说我对显卡的状态设置,实际上是预先非运好的。
一次性是好,尽量不要动,然后再做一大堆的预算,所以呢你这个绘制的时候可以用材质进行排序,把同样的smash归集在一起,那今天的话呢还可以,这其实在现代的游戏中的话呢,不只是这一步。
实际上我们会发现很多的这个子物体啊,它其实是一模一样的,这些物体的话,实际上我把它依次的去绘制,设置VBIB也是很浪费的,所以我们实际上现在用现在的计算SHADER,或者是其他SHADER的能力的话。
可以一个桌括设置一次,VBIB和它绘制的一堆位移的数据,也是一张就是一列数据放进去之后,我一下子一个桌括就是一次绘制指令,可以把几百个上千个东西全部创建出来。
这个东西呢就是GPU based bachelor,rendering的这样的一个思想,这个地方我们在今天课上不展开,但同学们要建立这个概念,就是我最后跟同学总结,就是说现在的游戏引擎架构中的话。
我们会尽可能的把绘制运算交给GPU来运算,而不是用CPU运算,那么这个东西呢,大家想象一下什么地方特别有用,比如说我们要绘制大量的树啊,草啊对吧,看起来差不多,但是我一下载要绘制这个几百米开外。
甚至上上公里的这样的东西的话,这个东西其实非常的有用,所以大家理解了,就是我们把一个对象怎么chop成材质,some mesh之后,那你这个时候就可以做很多,很有意思的这个优化了。
但最基础的概念还是mesh,Some mesh,这是我们的基础概念,那有了这样一个东西之后呢,其实我们基本上就开始可以作为绘制,一个小小的游戏场景了,但这样的绘制它是不是高效的呢,实际上并不高效。
为什么呢,大家知道我们的事件锥对吧,我们的世界锥实际上是一个锥形的东西,在你任何时候我们去看这个世界的时候,其实其他部分的东西我们是看不见的,比如在这里面案例里面,小明做的这个战争游戏的话。
当它的相机开始在移动的时候,你会发现,其实七八十%以上的空间我们是看不见的,那那你们的物体啊,对象啊,粒子效果,我们是不是都不需要绘制,包括地形。
所以呢viewer就是那个visibility colin,就可见性裁剪,是游戏的绘制系统的一个,最基础的一个底层系统,这个东西的话怎么去做,大家还记得我们在上一节课的时候讲过。
就是这个我们这个每一个物体它都有个包围盒,对不对,那我们这个包围盒呢,当我们给一个四面,就是四棱锥的这样一个view frustrand的话,你是不是可以去判断说做个最简单的数学运算,就知道说哎。
我这个包围盒是不是在这个事件吹里面,这个其实就是卡林的一个最基础的一个思想,那么这里面的话,我想给同学们讲一下,这个包围盒的一些数学概念,其实啊在游戏的这个这个这个体系里面,有性引擎的体系里面。
包围盒是一个非常重要的概念,基本上不仅是在绘制,包括在AI逻辑物理,我们都要用到包盒,那包围盒呢其实有很多种方法,他基本上从这个最简单的,比如说我把这个物体上面画一个球。
把这个人装在这个最紧的这个球里面,这叫什么bounding sphere对吧,就是包围的这个叫包围球吧,那么呢还有一种呢更常用的我们叫做AABB,什么叫AABB呢。
就是这个access line bounding box,就是说跟各个轴对称的包围和轴是什么呢,就是我们在我们游戏世界里构建的XYZ空间,因为它所有的东西啊都是轴对称的,你只要存两个顶点,就是端点。
两个端点,你就可以把这个一个一个a b box就能构建处理,而且它的计算的效率也是最高的,然后呢他要把仅次于球包围,球应该是最高的,然后呢在后面的话呢,我们有的时候包围盒,如果是贴着这个物体去走的话。
那我们叫什么呢,叫object o b b就是object的那个BINBOX,那么还有呢就是用凸包CONVEHALL,就是凸包,凸包呢在很多物理运算中,是特别常用的一个概念。
所以其实呢无论我们在做visibility,还是做游戏引擎的其他运算的时候,我们对很多物体的表达,因为一个物体的形状是不是非常的复杂,比如说一个角色,他是几万个面,我不可能跟这个几万个面进行一计算对吧。
那我就用一个包围盒大致表征你占领的地方,然后我判断说我这时候子弹能不能打中你,我这时候能不能看见你,所以包围盒是很多计算的基础,那有了这样一个包围盒的话,我们依次计算,实际上就能做卡点。
但这个效率大家知道一定是不高的,那我们在上一节课你们讲了什么诶,我们对这个空间里的物体进行各种各样的划分,那么最比较经典的,比如说像四叉树这样的划分,对不对,那么还有呢比如说叫我们叫做上节课。
教大家一个概念叫BVH叫bounding box,Bounding volutarchy,对吧,就是把这个绑定涡轮133,就像是这个这个这个这个树状结构的往上顶,那这样的好处。
就是当我去做一个卡林预算的时候,我可以从上到下一层层去问,比如说当我这几十个物体变成一个节点,我说哎你这个最大的包和我是不是能看得见,如果我看不见算了,你们这几十个物体我就不用了,不用画了,对不对。
但如果我能看见你,然后继续问说你是里面有没有更精细的划分呢,如果有我在一直问到你的业界里,我就知道哪些物体可见了,那么它的计算复杂度就会下降非常非常的多,那么其实呢就是在现代的这个游戏里面的话呢。
BBH用的是蛮多的,因为这个算法其实非常简单,也不是最高效的算法,那为什么他用的特别多呢,因为现在游戏里面他动的东西很多,就是很就像刚才我们讲的那个,小明要做的那个战争,游戏里面很多小兵会跑来跑去。
对不对,那这里面就有一个很复杂的问题了,就是我的这个b vex,就是这个树状结构构建好的时候,当我的这些节点发生变动的时候,那我在构建它的成本要尽可能的低,不能每一次你虽然去做这个卡点的。
速度是非常的快,但是每次我构建那个树状结构花的时间最久,所以呢BVH在这一点上是有很多的优势的,所以那个在现在游戏引擎中的话,BVH用的是蛮多的,特别是动态的东西,特别多的东西。
那么关于这个visibility ci呢,我有一个算法也特别想跟同学,就是其实呢不止于这一种算法,其实有很多很多的算法,那么这里面的话呢,我只想再讲一个非常有意思的一个一个算法,这其实是一个思想。
这个叫p vs,这个思想呢就是这个啊,就是那个potential visibility set,这个思想呢就是我们一直崇拜的john kmark,就是游戏引擎行业的支付,也是我们的大神。
当年他在做这个早期的FPS,我我忘了是doom还是quick的时候,他突然觉得哎呀,这个我们的机器性能那么差对吧,我在一个小房间打来打去,我把那么多房间的东西都化了,这是不是很亏呢。
他就想到了一个办法是什么,这个方法其实很简单了,就是说我先用BSP啊,这个讲起来有点专业了,就是说简单来讲,就是我把这个空间分成了一个个的小的格子,一个小方块,每个方块之间呢通过一个叫做pal。
就是大家如果玩过那个威慑的游戏叫pal的话,就知道,但是两个空间之间连接的窗口对吧,大家想象一下,比如说在一个建筑物里面的房子,是不是都通过门啊,窗啊连接在一起,那好了呀,我站在一个房间里面。
我能假设是一栋楼啊,111个,比如说我们豪华的大平层里面有几十个房子,那你在每个房子的时候,这个房子的门你能看过去,能看到其他几个房子,其实是不是固定的,对不对,所以PVS的想法呢非常的淳朴。
就是你在每一个房子的时候,你通过他的门或者是窗,你最多能看见哪几个其他的房间,比如说我们假设给每个房间有编号,1234567,比如说你站在那边的7号房间,你发现你最多的只能看到就是123对吧。
6123这三四个房间,那就意味着就是说当我站在7号房间的时候,我只需要渲染6123房间里的,无论这个房间本身,还有你们的物体,这个想法是不是非常的简单。
straight forward这个想法呢确实是非常的简单,而且非常的直觉,但是呢他执行的效率非常的高,那么实际上呢虽然我这个原理讲起来非常简单,但是PVS的计算包括对空间的划分。
partition的算法其实还是蛮复杂的,如果大家有兴趣的话,可以去看一看,去写一写,这是一个非常好的,大家的这个数学和编程能力训练的一个东西。
那为什么我会在这个就是visibility count里面,一定要讲这个PVS呢,实际上这是现代游戏啊,其实据我所知,就是真的全面的用p vs做卡林的kiss,好像已经没有那么多了。
但是这个思想其实非常的有用,为什么呢,比如说呃我们做一个单机游戏,大家很多小伙伴是不是喜欢玩,主机上的3A大作,对不对,那3A大作里面的话呢,我现在是在上节课讲过,就是我们很多时候设计一个关卡。
它其实是个linear线性的,虽然你觉得你是在开放世界,但实际上你走的都是在我设定好的,各个叫我们叫做创始里面好,我们假设把这个游戏玩家能经过的世界,分成一个个叫zone。
这个zone是不是像PV里面一个个的小房间,那每个字之间是不是有一个峡峡谷,有个关口,有的时候甚至是一道门挡住了,那我在每一个zone里面的话,我是不是就知道说你能看见其他几个Z。
那这件事情除了做visibility还有什么好处呢,实际上是资源的加载,就同学们玩一个游戏的时候,我不知道大家有没有注意到,就是当你闯关打过了一个boss之后,你通过一道门的时候,有的引擎如果做的不好。
你发现诶他好像在夹杂了一小会儿,这是为什么呢,就是因为哦你换了一个zone了,你需要你这时候能看见的东西,特别是有些远处的zone,他这时候被加载上来了,所以PVS的算法的话呢。
虽然呃我们认为就是在做visibility上面的话,已经没有像以前那么火了,但是呢这个思想其实非常的有用,就是说帮助我们进行各种资源的调度,所以我也希望同学们,就也要了解这样的一个思想。
但实际上我讲的这两个算法,都是非常经典的算法,就像我在前面跟同学们讲过,就是说游戏引擎的渲染系统,它是一个高度practical的一个工程事件,随着现在的硬件的性能发生了,突飞猛进的一个变化。
实际上越来越多的卡里,已经不再是,用刚才我讲的那些很精巧的算法来解决了,实际上就是用这个GPU就可以做掉,比如说一个很著名的叫accution query,什么意思呢,就是说我把很多物体扔给显卡。
显卡后来反反馈给我一个叫比特瑞,就是一群零一构成的一个一个一串数组,就是说这个第一号物体可见就是一,如果第2号物体不可见,就是零,我一看我就知道这个东西可见内容不可见,因为显卡它是B型。
它算起来非常的快,那包括呢就是像view flashcaring的话,我们现在可以很粗暴地把这些,帮你box直接扔过去,然后呢让显卡给我算完,其实速度也不会太慢,当然如果你想精彩一点,你可以用这个。
就是说显卡的这个这个,这个就是你你也在显卡上构建一个,hierarchy的数据结构,这个其实用现在的computer or也并不是特别的难,所以我这里面为什么跟同学们一定要讲GPU,base卡林呢。
因为这其实如果大家真的走上了工作岗位,真的在做现在的游戏的这个开发的时候,千万不要用老的算法去限制你的想法,一定要理解说能在硬件上做的事情,我一定做完,那这里面我跟同学在讲另外一个概念。
就是啊HZ的概念,或者叫early z的概念,什么意思呢,就是说其实显卡有个很聪明的能力,就是说当我发现我要绘制的一个像素,一般一般来讲我们在绘制的时候,像素就是因为像素数量特别多嘛。
比如说这都是几千万以上的像素点,每一帧,那我发现这个像素呢,其实已经被别的东西挡住了,我就不会它了,那其实呢一个最简单的思想,就是说我先把场景绘制一遍,但我什么渲染都不做,只是把它的深度绘制出来。
就是这边大家看到这个黑白的这个图,白的就离我近一点,黑的就离我远点,但实际上在GPU上存储的数据是反的,那这个时候如果我在绘制任何一个东西,只要它比它那个就是在后面的话,我整个绘制可以跳掉了。
甚至是整个物体都可以跳掉,这个呢就是一个非常淳朴的early z的思想呢,包括现在有些更复杂的,比如说基于这种hierarchy的方法,去做这个Z的处理,但是呢他的整个思想我认为是大同小异的。
就是说都是用GPU高速的并行化能力,然后呢加上这个就是我能够尽可能快的,廉廉价的成本形成一群遮挡物的深度图,然后呢把很多的东西能扔掉,尽可能扔掉这件事情,对于那种就是说非常复杂的这种场景很有用。
比如说你进入到一个房间的时候,你可以发现啊,就是这个世界的99%以上你都不见了,其实你就关注在这个房间里面这些人,所以这个当我们在做游戏引擎设计的时候,非常在意这些东西。
所以这就是calling的最核心的思想,那有了这些东西之后呢,我们基本上就可以做渲染渲做渲染了,那这里面的话呢,我还跟同学们讲一个另外一个很关键的概念,就是纹理压缩,大家会觉得很奇怪了。
哎今天我们不是讲渲染算法吗,为什么你老师围着数据跟我讲的,现在我讲的就是渲染的一切的基础叫RENDERABLE,那RENDERABLE里面呢就是可被绘制的东西呢。
其中有很重要的component叫做纹理,那纹理是不是可以像我们在电脑上,比如说打开一个图像,打开一个照片对吧,你可以发现照片会存成什么格式呢,比如说JPG格式啊,这个就是这个这个这个这个PNG格式啊。
或者什么很多很分散的格式,但是呢我想让同学们建立一个概念,就是说在游戏引擎里面,纹理不是像我们想的图片文件那样去存在,比如说像BP基本上没有人会用的,我们一般会把纹理进行压缩,那有其实大家知道。
就是说在计算机的那个照片的话是会被压缩的,大家如果比较一下,没有压缩的b mp格式和压缩过的街拍格式,是不是差别特别大对吧,有的时候能差到十倍以上,但是在游戏引擎里面绘制系统里面。
我们的图片压缩不能够用那些非常好的算法,为什么呢,因为这些压缩算法它不能够随机访问,就是说比如说我给你一个JPG文件,我突然要看坐标7567832的这个点的话,他很难快速的去拿到。
而且呢它的这个计算的复杂度非常的高,而在计算机的这个图,图片那个texture压缩的时候呢,我们一般采取的思想,就是那个绘制里面一般采取的思想是什么呢,叫block based。
就是说我们把图片切成一个个小块,最经典的就是一个4×4的小块,然后呢我们去压缩它,这里我给大家介绍一个非常经典的一个,一个算法,就是那个就是在DXD这种文件里面,它很简单,比如说我有一个4×4的这样的。
一个小的色块,我去找它最亮的就是颜色最鲜艳的那个点,和颜色最暗的那个点,那我们就认为这里面其他所有的点,就是这两个点之间的差值,因为呢在很多图片啊,它相邻的像素之间其实都有一定的。
我们叫做coherence,就是关联度,所以呢你就可以把它的最大值,最小值以及每个像素存一个诶,我是离你最大值近,还是离最小值近的一个比例关系,其实我就可以近似的去表达。
我这个像素的这个这个这个小色块的颜色,其实整个在计算机图形学里面的,texture compression都是基于这个思想,我们叫做block compression思想,那么在这个就是DX里面的话呢。
最经典的就是我们叫DXT系列的这个压缩算法,全家桶对吧,一整套,那现在呢研发了像BC系列,最新的应该已经到了b c seven了,就BC7了,那么但是呢,其实在这个这个算法其实有非常大的好处啊。
它好在什么地方,举个例子啊,你你生成了一个纹理,它可以在CPU上实时的把你压缩好,因为它这个算法无论是压缩还是解压缩,效率都非常的高,那么另外一派呢,就是我们现在在手机上用的比较多的。
就是STC这个算法呢我也不是特别熟,因为我一直在做这个PC和主机的游戏,但是呢它的它的分块就不再是严格的,就是4×4了,它可以任意的形状,而且呢据说是HTC的压缩的这个效果是最好的,解压缩的效率也不低。
但是呢就是说它的压缩的预算稍微有点费,就不能够我们叫做on the flight,就是在运行中进行压缩,但是呢它整个计算机的这个,就是这个渲染系统的话,我们的纹理压缩的基本逻辑。
是按这个思想来进行压缩的,所以这件事情为什么大家要知道呢,因为当你去构建游戏引擎的时候,其实你对texture的压缩和管理,是一个非常重要的一个模块,而且你下载到你的先看里面的话呢。
你肯定是基本上应该是个压缩过的,这个数据格式好,所以有了这样的一些东西的话呢,我们今天的一个最基础的绘制,基础的东西基本上是讲明白了对吧,那这里面的话呢,我们就讲这个rainbow到底是怎么来的呢。
我们一般会讲说这个东西,我们要放到工具里面去讲,是你要用大量的工具去构建,那样的小屏模型,但是呢我觉得作为引擎开发,特别是做这个到图形这一趴的时候,其实你需要对工具有所了解,那我们去构建一个物体的话呢。
最经典的是什么,3D max玛雅对吧,包括现在越来越流行的blender,我我其实非常看好blender,就是说因为它是越来越强大了,那大家在这里面就是点线面,我去构建我要的各种各样酷炫的模型对吧。
比如说我们经常最著名的是做一个枪,我要卡线,卡住那一个个关键的点,由粗到细的构建这个模型,但这个呢实际上在十几年前是非常的火了,但是呢现在受到了巨大的冲击,但是就是我们的ZBRUSH就是雕刻性的工具。
就是大家知道我们在真实的世界,塑造一个形体的时候,就是sculpture嘛,就雕刻家对吧,我就可以不断的把这个,就是把这些材料给它切削掉,然后形成我的形状,但实际上的话。
这种雕刻行为在计算机里面可以更自由,我不对,不仅可以切削掉哇,可以把它往上拎出来,那这样的话艺术家可以构建一些更加自由的,这些形体,那这个呢zbrush base的这样的一种。
就是说sculpture的这种啊素材生成工具的话呢,现在其实也是越来越火,那么另外一个第3part呢,就是这个大家知道了,最著名的这个扫描,我不知道同学们有没有见过,就是哎手机上有些app。
你绕着一个物体拍几张照片,他就能把3D的东西给你建起来,对不对,你们觉得很酷,这个呢也是得益于我们现在的人,这个深度学习啊,包括这些这个registration这些算法的提升。
所以其实在我们的3A的游戏行业里面,就是基于实体扫描的这种模型也越来越多,比如像这里面这样的一个非常复杂的,古代的武士的盔甲,那我们通过一圈扫描的话,能形成非常高精度的,达到十几个亿面级别的。
这样的一个这个非常的这个细腻的,这样的一个网格,这个精度也是远远超过人手工构建的,这样的一个网格,那么最后一个呢也是现在发展非常非常快的,就是说诶我们能通过一些算法。
通过一些规则自动的生成这样的一个网格,这里面我们讲的是个胡迪尼这样的,一个很强大的工具,它能生成漂亮的这个地形的网格,对不对,但实际上的话呢,现在有些前沿的人工智能的这个研发的话,它可以生成一个啊很多。
在Mac上我们要的这些细节,我个人认为的话呢,这也是这个游戏引擎工业的话,未来一个很重要的一个发展方向,因为我相信就是他能把我们的艺术家,从越来越繁琐的这种细节的,这种工作中解放出来。
能够真正专注在创意上面,就不用再花那么多时间做细节了,我用人工智能把你自动给补上,那其实这四种方法呢各有利弊对吧,那其实呢有的更flexible一点,有的呢可能更这个难以调整一点,比如说scan。
大家会觉得诶是不是特别方便,我把一个东西放在这一扫描一下就得到了,对不对,但是它有个很大的难题是什么,你首先得有这个东西对吧,所以说我们以前有个很著名的故事,就是某个大型大厂,他们为了做一个游戏。
先去逛淘宝,买到这些东西,扫描过来,我们就可以进入到我们的游戏了,所以呢其实不同的工艺制作方法,它会产生不一样的数据,而这些数据的话呢就是我们计算机绘制的粮食,就是我们的口粮,对不对。
那为什么我会在这一趴里面跟同学们讲,这些资产怎么去构造呢,这就想引出我今天的最后一趴了,就是讲渲染的,今天讲渲染的最后一趴,就是现代的游戏引擎的pipeline,在往哪个方向去发展。
因为刚才我给大家介绍了,比如说像这个mesh啊,some mesh啊,纹理啊,Shader,大家听上去是不是虽然说有点难啊,如果没有基础会有点难,但是实际上还是可以理解的不行,看两遍应该也能理解。
但是呢其实现在游戏,它的发展的工艺变化非常大,也就是说比如说现在现在大家玩的游戏,你们有没有发现就是细节越来越多对吧,而且呢地图越来越大,我们叫做开放世界,那么我一个同样一个射击游戏,同样的精度。
如果是传统的射击游戏和开放世界的设计游戏,它的在每一帧里面,你看到的这个这个数据量可以大十倍以上,一个数量级,同样就是随着我们刚才讲的那种sculpting,就是ZBRUSH这样的工具的普及。
包括3D扫描的普及,其实我们得到的这个模型的数据量是越来越大,这里面举个例子,一个很简单的一个小雕像,你推进之后,你发现他有无数的细节对吧,我相信我们的小伙伴们,就是现在如果你喜欢玩那个3A游戏的话。
你很在意就是说这个场景的精度够不够,这个东西当然是非常非常的重要,但是呢这恰恰又是对现代引擎的基础架构,产生了巨大巨大的冲击,所以我特别想让同学们建立一个概念,就是说这个游戏引擎的绘制系统。
它不是一个静态的,它的技术一直在往前去进步,那其实这里面的话呢有一个很重要的发展方向,我们叫做就class base的这个mesh pipeline,这是一条新的。
这个就是我们的这个这个模型表达的一个管线,它的基本思想呢其实在很早就有了,大概2015年吧,最著名的那个就是啊,育碧他们在做那个就是刺客信条大革命,那一作的时候大家回想一下那个游戏长什么样。
是不是有很多非常华丽的这种建筑,对不对,很多很多的细节,其实他那个时候就提出了这样的一个,基于class pine,那么经过56年的发展,同时硬件呢也越来越成熟了,实际上有越来越多的引擎。
再往这一条新的拍拉机转去去去去转移,那这个这个pipeline它的核心思想是什么呢,在这节课上我没有办法详详细的展开啊,我只跟大家讲一些最基础的概念,就是说当我面对一个非常精细的模型的时候。
我把它分成一个一个的小的,我们叫做max也好,我们叫做一个啊,小的这个这个这个小cluster也好,whatever对吧,那么他每一个小MESLIDE呢就是固定的,比如说32个三角形或者64个三角形。
当我看到这条龙,这条龙大概是几10万的面片,我把它分成了很多很多小的,64个面片的mes,那为什么要这么去做呢,因为是这样的,就是现代计算机啊,我们的显卡已经能够非常高效的。
就是说创建很多很多的几何细节,基于数据,而并不需要像传统的我们的管线说,你要预先把vertex buffer,index buffer构建好,就是把那个卖时间传进去,它的很多的几何是可以凭空算出来的。
而且你给他一个三角形,它可以给你生成无数个三角形,所以呢当你把每一个MASA的大小固定住之后,它的计算其实都是高效的一致的,大家想象一下刚才我讲的那个GPU的架构,它是不是有很多很多小盒。
所以你看到这条龙虽然很复杂,但是呢他很多的计算是不是都是完全一致的,所以说class base mesh pine a核心就是用这个思想,这个讲起来就比较复杂了,这里面的话呢我们就讲硬件的升级了。
就是最早的那个大家想到了学统计学的时候,你们学到的是什么,就是哎就是我们的构建好这个模型,构建好材质,然后呢有一个叫vs,就是那个每个顶点的着色器,还有个PS,每个像素的主色系,对不对。
这是个经典的一个pipeline,其实最经典的连vs p s都没有了,那从这个十几年前我们发现诶,我们可以在显卡里创建很多很精细的集合,我们加入了这个就是比如像whole shader对吧。
这个这个DOMINSHADER,还有这个geometry shader,它的核心目的是什么呢,就是你可以把你放进来的三角形,进行无限的细化,生成我们想要的细节,但是的话呢其实随着最新的这些硬件的发展。
我们干脆就提供了一个mesh shader,或者叫amplification shader,这两个两个不同的SHADER,不他的名字在open jia,VULKAN和direct里面都不太一样。
但是它的核心想法就是你可以用一个算法,基于数据凭空生成很多的集合,而且你可以根据它离你相机的远近,选择它的精度,那这样的话我们机CPU就是我们的显卡,处理起来最高效的,是不是都是大小一致的一个个小块呢。
大家想象一下这个是不是更快,这个是有点抽象,大家去想象一下,其实这个就是基于这个cluster base的,这个mesh pipeline呢,他对程序员的要求是比以前高很多了。
那么我们要做大量的处理和运算,而且这个代码写起来已经不太好去理解,但是呢它的好处是什么,它可以产生无数的细节,而且呢就是我们的艺术家可以自由的去发挥,而且我个人认为呢。
这是一个非常值得大家关注的一个前沿的引擎,的一个发展方向,那这里面给大家举个例子,比如说如果我们把这个这个这个这个,这个这个怪物叫阿玛提诺,我们如果学过通讯学的同学,都知道这个怪物的名字。
那么它有很多很多的面片,对不对,我把它分成了mesh的话,你会发现当你的相机在移动的时候,这个怪物就是他会会被裁剪掉,就以前我们的裁剪只能按照物体去裁剪,但是你会发现,现在这个时候。
我可以把他手的一部分就裁剪来了,因为每一个method他有他自己的绑定,我们在我们的GPU上可以实时的算出来,说在目前的这个相机的情况下,你这个东西不需要去绘制了,所以它的效率是非常非常高的。
那这里面的话呢就不得不提一下,我们大名鼎鼎的那个虚幻引擎的NT对吧,大家都知道虚幻引擎,那个叫这个像素级的网格密度,其实now night呢,你可以认为是这个思想又往前走了一步了,就做得更加的工业化。
更加的成熟,但是呢这也是我们认为就是现代引擎啊,它的拍发展的一个重要的方向,所以这节课呢我们给大家教育了,教教给大家了最基础的游戏引擎架构的思想,包括让大家去理解什么是显卡。
但是当同学们真的到这个行业里面的话呢,我们是非常希望同学们能够关注一些最前沿的,这些技术发展的趋势,其实呢渲染这个系统你怎么去理解它,我们这节课呢也就是就第一节课,我想给同学们建立这样几个基础的概念。
第一个的话呢就是说嗯游戏引擎的绘制系统,它是一个工程科学,它是深度依赖于你对硬件的现代图形,硬件的理解,所以说如果你想成为一个graphics engineer。
你必须要花时间去理解显卡的架构是怎么回事,知道它的性能卡点在哪里对吧,就是各种棒的这个水口就飞出来就可以了,那么第二个的话呢就是说其实在游戏里面,我们核心要解决的就是mesh模型。
材质这些数据之间的关系,那么最经典的mesh和smash,就是一个非常好的学习方法,但是呢在最前沿的话,我们有些变化,第三个呢,我希望同学们建立了一个一个概念的话,就是说我们在这个绘制的时候。
尽可能的通过一些运算,把绘制的东西减到越少越好,这样的话能够把性能变到最大,所以visibility非常的重要,那这里面跟大家分享一个大神的一句话,我忘了这个大神是谁了,他曾经以前有人问他说,哎。
大神这个你认为优化的最和高的境界是什么呢,那个大神说了一句叫do nothing,然后很多人就懵了,说DNI是不是我什么都不要做了,其实大神的意思是什么,就是你要通过你的算法,让计算机尽可能少的做事情。
那你的效率一定是最高的,所以叫do nothing,所以呢当我们去做这个优化的时候,我们尽可能让我们的计算机读nothing,那么最后一点呢,也是我认为是非常重要的一个趋势,就是说越来越多的绘制运算。
包括一些复杂的处理,我们都从CPU上移到了GPU,利用现在GPU10倍以上的高速的处理性能,包括这个里面呢有一个大词啊,我们叫做GPU driven对吧,这个词的意思是什么呢。
就是说把很多需要在CP上做的一些复杂运算,比如说我们后面可以讲的像动画系统对吧,我们教给大家的是最经典的动画系统架构,但是呢其实现在很多动画系统,全部都移到显卡上来做了。
这也是那个就GPU来帮CPU分担负担,的一个重要的发展方式,所以呢当大家去理解我们的绘制系统的话,把这四点记牢在脑子里面,基本上你就知道这个绘制技术发展的这个大的,这个方向,基本上我们今天这节课的内容。
已经讲的差不多了,那个不好意思,时间有点长,确实没有办法,以为我已经是这个就是怎么说呢,千挑万选,把很多的能够跳到的东西都跳掉了,但是还是要塞这么多,那么那剩下的时间呢我想给同学们讲一下。
就是这个我们期待已久的,也是我们欠大家的,就是我们小引擎的项目,实际上上次小引擎的话呢,这里面我是特别要感谢一下我们的这个课程组,同学嘛,因为上周我们为什么小引擎被delay呢。
就是因为我们发现就是那个引擎写的太抽象,太复杂,而且的话呢就是那个代码写的也不够好,还有不方便同学们阅读,所以其实在过去的这个,差不多有两周时间不到吧,整个团队几乎每天晚上都通宵,就是再去写。
我们其实一开始第一版的小引擎,大概是1万多行代码,这次整改完的话,小引擎代码大概是2万多行,2万多行,大部分基本上都是重写的,然后呢,我们希望能够给大家一个相对完整的框架,那么所以呢昨天夜里面吧。
我们拿到小引擎的最新版本了,然后呢,我本来想,今天我想怎么去跟大家讲一下小引擎怎么用,因为我觉得把这些代码扔给大家,同学们也不知道怎么去看,怎么从哪儿下手,所以呢我现在有没有办法在现场给大家去演示。
小米怎么怎么去看,所以呢,我就昨天晚上在家里面录制了两个视频给大家,因为我们家里条件有限啊,所以这个视频上面声音有很多的噪音,大家先听一听,首先的话呢大家去看一下小引擎,如果跑起来。
它的编辑器和它的引擎应该是什么样子的啊。
大家好,这是我们的小引擎,然后呢中间这个窗口就是我们的编辑界面,大家在用这个界面的时候,注意一定要把中文输入法关掉,然后呢首先是按住鼠标右键,这样你就可以就是上下左右的调整你的相机。
然后呢ASDW就像一个FPS游戏一样,你就可以去这样飞来飞去,看到这里面的东西,然后呢这是中间最重要的一个就是编辑窗口,然后你的鼠标左键点住每一个物体,它就会呢有一个坐标轴显示,就表明这个物体你选中了。
然后呢每个物体选中的时候呢,它就会出现很多的component,比如说在这边的panel,就是各个component的这里面,可以看到它很多的那个属性,这些属性呢都是用反射的方法自动生成的。
这个编辑UI,但是同学们如果不明白,没关系,先假设就是东西自动给你生成好了,然后呢在这边的话呢,就是当你去动它任何一个数值的时候,这边你可以看到它的数据的变化,比如像这个那个墙,它实际上是有碰撞体的。
那这里面的话呢我们可以看到有些物体,比如说看一下一个小小的,比如说这个你看到没有,它其实只有那个位移和mesh,所以呢这个它就没有碰撞,就是我们为了给大家展示清楚,然后呢比较复杂的是我们的主角。
然后呢主角你去选中它,你可以发现它不仅有位移,还有他的动画,我们做了一个非常简单的动画component的,它你会下载资源,同学们可以打开自己研究,然后呢它还有就是MOTO就控制它的移动。
我们是设置了一个就是移动速度,还有呢就是它的那个相机,因为一旦进入游戏模式的时候,相机就起作用了,所以这个虽然很小,但是它其实是一个完整的一个游戏引擎架构,然后呢它的整个引擎呢就是作为核心。
然后外面加了一层编辑器,那怎么样去切换呢,上面有个小小的按钮,你点它,你看它这边有editor mode嘛,就告诉你现在我在编辑模式,但是呢如果你点它一下诶,我们就进入了游戏模式。
这样这个小人物就开始进入游戏的T,可以叫动词了,当然现在的动画模型做的模式做的非常的简单,所以他就在循环播放一个动画,也不会停下来,因为后面真正的所以这速度和位移的话,去调整动画。
包括在比如说站在那idol和漫步,和这个基本的动画之间切换的话呢,实际上是要有动画不烂的一些基础的,我们在这么短的时间里面,暂时先不开放这些东西,然后呢刚才讲的像这些东西,它有碰撞,所以它要拦住。
有个简单的物理的阻挡,那么像这个呢就是没有做碰撞,你可以穿过去,这也让同学们知道就是不同的component,怎么在一起作用,那么这个时候如果你觉得游戏的这个模型,我已经看清楚了。
我我在哦整个这个引擎的话呢,现在我们实现了一个简单的PV2的材质,所以大家可以看到这个光照,基本上也能看到一些很多的细节,然后呢但是我们现在为了简单,就是先使用了那个forward的那个CD啊。
这个时候同学们如果想进入到编辑模式的话呢,可以按一个out,然后呢鼠标又出来了,然后切换到游戏模型模式啊,editor模式在这里面的话呢,大家可以看到就是说哎这些角色就会停在这,这个小橘子还蛮可爱的。
上面还有一个小小的我们的引擎的logo在上面,对吧,piano的引擎,然后呢这个编辑器里面呢还有很多细节,比如说这边是场景中所有的物体的列表,就是这是一个标准的一个游戏,编辑器的一个架构。
就是object list,就是所有的对象类的,包括这个角色自己呀,这是角色自己,还有哥哥的墙体物体,然后呢还我们还做了一个content browser,就是说你所有的资产在这边你都能看见。
比如说我们一定要好的各种物体,各种东西,同学们在这边的话呢,如果点击的话,其实他可以再加载进去的,所以说这个小小的编辑器啊,麻雀虽小,五脏俱全,所以整个小引擎团队还是蛮辛苦的。
他们这一个多星期疯狂的加班,然后基本上我们想给大家一个完整的现代,游戏引擎以及编辑器的一个架构。
好的这个说实话我昨天看到了还是蛮感动的,就是同学们是这样的,就是说虽然这个是一个公益课嘛,但是大家一旦做进去了之后就忍不住了,就说我们想再做的再好一点,然后呢尽可能给大家一些我们理解的引擎的。
最规规范的一些架构的一些知识,所以做了很多很多的小细节,那么接下来呢我还录了另外一个视频,就是说啊真的想钻进去写自己引擎的同学对吧,我们这个课程,很多同学是要立志要做自己的作业引擎的。
我们的口号叫课程结束,人均一个字眼引擎,那我们就要把给大家看代码,所以呢我这个也没有办法在现场打call vc,所以昨天夜里在家里面又录了另外一个视频,就是带大家简单的go through一下。
我们的源代码是怎么架的,好的,我现在跟同学们简单的讲一下,我们的引擎源码结构,那你其实拿到我们的引擎之后呢,无论你是从GITHUB还是我们的安装包,你首先可以看到这样的一个解码出来,这样一个结构。
当然这个build这个目录需要你自己构建的,然后呢这里面的话有个read me,如果大家打开的话,你可以看到就是说对于不同的平台的话呢,它会有不同的这个SIMC指令,大家正确的run。
比如说windows run cmc指令之后呢,你就可以生成啊,你想要的这个工程文件,一般我们会放到这个build目录下,大家注意这个build目录要自己创建的,你会得到这样的一个solution文件。
那么好,那这个时候呢,我们拿到了我们的整个这个源码嘛,那这个源码的话,大家如果看的话,在这边其实它的结构呢,引擎最核心的叫pilot one time,就是这个结构,如果大家点开呢,你会发现它是严格的。
按照我们的引擎的框架,就是从平台层,核心层,资源层,功能层,然后一层层垒起来,那么编辑器呢我们把它单独做成一个工程了,那这样也是以适合引擎的核心做出区别,那么然后在这里面的话呢,大家可以看到。
就是说我们的SHADER是单独放在一个工程里面,因为SHADER比较特殊,它虽然也是源码,我们选的选的是这个GLSL,但是的话呢它编译出的binary的话呢,需要单独的去管理,那这里面比较复杂呢。
是有一个就是PRECOMPOLE这个这个文件夹,这个这个工程,这个工程是什么呢,就是说我们在这里面的话呢,用了类似于虚幻的这种反射机制,就是说我们在C语言里面,定义了各种的数据类型。
然后呢我们做了一个decoration,它就自动的反射出了,你在这个资资产资源里面,应该用什么方式去读取,这个的话呢,实际上是游戏引擎非常重要的一个东西,那么就是说简单来讲的话呢,在这个引擎里面的话呢。
就这段这里面生成的代码全是全自动生成的,以后我们再讲到资源系统的时候,会跟同学们详细的去讲,那在功能层里面呢,大家可以看到就是标准的像动画呀,component control啊。
input怎么一层层怎么去管理,那么这里面简单跟大家讲一下,你在哪去找到我们游戏的资产,在目录下呢,你可以看到有就是有一个字目录叫做啊,就比如在那个根这个根目录下,你可以看到有个目录叫做。
engine里面有一个目录叫做asset,那这个asset里面的话呢就放了我们所有的资产,那你们举个例子,比如说我们有个叫level,大家可以发现我们是用JASON去存我们的数据,那我们点开一个关卡。
你发现这个数据,那引擎是怎么读这个数据呢,其实大家可以发现,就是在我们的资源层里面,有一个叫resource type的这个文件夹,这里面其实我们在C语言中,定义了每一种资源的描述。
比如说你看到一个宏叫做decoction type,它就说明这是一种我们可以反射的,就是可以读进来了资源类型,然后呢这里面的每一个结构它是一层能签到,比如这里面我们会定义每一个物体的instance。
它应该怎么样,如果大家去看一下它的定义的话,你发现它也是一层就是带反射的这个类型,那这里面的话每一个变量名,实际上到最后就会变成JSON里面的一个描述文件,你看到没有,这里面有name啊。
每个物体有name,然后呢每个物体有它的这个啊transform位移,位移里面也包括position,rotation和那个就是他的那个啊skill,实际上的话呢和这里面的是一一对应的。
但这个技术点相对来讲比较复杂,我们今天不展开,但是呢同学们按照这个思路可以逐步的理解,整个就是polo的引擎架构,那我们为什么去这样去做呢,实际上我们是希望给同学们建立一个。
相对规范的现代引擎的体系结构,也是我们尽我们所能吧,就是说尽可能把一些经典的这个,商业引擎的建结构教给大家。
这个就是说其实这里面的话呢,小引擎虽然很小啊,2万多行,但是呢它里面还是有一些就是有意思的,一些结构和和那个架构,比如像反射对吧,这个其实跟虚幻引擎的基础结构是很像很像的,但这个东西的话呢。
可能要到后面的课程同学们才能理解,所以他拿了小引擎之后呢,别慌,就是那个我们的第一个我我我先不剧透吧,我们的第一个作业,大家先呢把它编译过去就可以了,那在这个小引擎呢,这版那个发布的时候。
我们会把基本的编辑器啊,基本的这些物体啊,这些对象的东西全部都有,它其实是一个小小的游戏的框架了,刚才我看到很多同学说我的毕设就已经有了,确实是你拿这个小引擎改吧,改吧的话,我就做个毕设应该还是蛮酷的。
然后呢,我们在后面的话呢会把一些呃更好的graphic,因为我们这次时间仓促啊,我们把那个我们还是用OBJ这个模式,我们后面可能会切到那个FBX,因为方便同学们构建自己想要的,各种各样的模型。
包括我们会把这个mesh sumesh的整个结构,给大家搭起来,包括我们会就是可以跟同学们作业,或者是我们自己做,就跟那同学做一些简单的animation blending系统。
这样你可以看起来像个真的游戏一样的,这个人跑起来跳起来都会不太一样对吧,那那么的话呢就是说包括呃我们这次呢,那个其实课程组还是挺努力的,我们支持了这个windows Mac啊,还有那个LINUX。
但是max的m one的话,好像现在还不支持后面的呢,我们还要再优化一下,那么因为我上节课也讲了,就是说我们看了一下ECS的代码,实在是太抽象了,而且本身的话扩展性也不是特别好。
所以呢我们把ECS这一趴先撸掉,就以后再说,包括在这个架构中呢,我们就没有把这个多线程的架构放出来,因为那个会极大的降低整个代码的可读性,和可可观的,因为我觉得同学们一开始的话呢,还是要经常加断点。
去看这个功能到底是怎么跟进去了,这个主要是以学习为目的的,这个就是说这个引擎架构,所以我们是希望就是先把最基础的东西,通过代码,就是就是我们经常有个说法,叫做你代码写的好的,不用写注释。
大家就能感觉得到,那这里面的话呢,就是我们同学们剧透一下我们的作业吧,就是首先的话呢你得把小引擎下载来了对吧,那有两个两个下载渠道,就第一你可以从我们的官网上,有一个有一个下载好的包。
你也可以访问我们的GITHUB,在上面去去下载引擎,这样的话我们后面根据同学们的反馈啊,包括同学们如果写的一些非常优秀的代码,我们也可以考虑mg进去,这样同学们可以一直看到他的更新。
这个呢我们也是第一次这样去做,所以啊可能会有些地方一开始会遇到一些问题,希望同学们给我们多多的这个反馈,告诉我们该怎么去优化对吧,然后呢,希望这个小小的三角形,能带着我们真的进入到游戏引擎的这个世界。
那我们的第一次作业是什么,其实非常的简单,就同学们把我们的小引擎下载下来,然后呢你能编译出来,然后呢你跑起来截一张图,然后呢提交就可以了,因为这事虽然说你不用写一行代码,但是你真的把整个这个工程搭起来。
就像刚才我的视频中那样,看看每个资产是怎么放放的,每个资产是怎么定义的,那个数据和类,每个数据源代码是怎么放的,实际上的话会帮助你建立一个,最基础的游戏工程的这样的一个意识,这个东西的话呢。
我认为作为游戏引擎真的动手的第一节课,我认为非常重要,就像当年我去学游戏引擎的时候,我并不是一上来就去写什么东西的对吧,虽然我们知道,我那时候已经学了很多图形学的算法,但是我大量的时间在干嘛呢。
是我先去静静地去读别人的代码,跑别人的引擎跑了跑,然后加很多断点去看到每一步发生了什么事情,这样我其实心中就有感觉了,我知道这个东西是怎么做的,所以呢我们做了一个这样的一个一个。
就是同学们可以到我们的课程官网,然后呢有一个作业提交系统,这个是我们可以games一起做的,同学们你们做完了的这个这个这个作业,就是那张截图的话,同学们写上自己的名字。
按照我们的规范就提交到我们的官网上,我们每一次作业的话呢,在我们官网上都有非常非常详细的说明,那么如果大家觉得不清楚的话,一定要告诉我们,因为我们有很多的共创观,我们还有很多的微信群。
所以同学们可以在群里面,把我们做的不周到的地方反馈给我们,包括其实像上一次我们的课件中,有一张虚幻的图讲错了,那个后来有个同学告诉我们,我们还当时觉得哇这个幸好他告诉我们。
我们现在正在想办法更新我们的视频,去解决这个问题,因为这一次呢是我们第一次去筹备这个课,其实过去的差不多四五天了吧,我们的团队十几个人基本上都没怎么睡觉,就是每天都搞到四五点钟。
有些同学到昨天到现在还在通宵,就是我们是非常非常希望能给大家准备一个,尽可能好的课,我们希望我们讲的每个东西,都是尽可能是正确的,但是真的很多错误在所难免,也希望同学们给我们多多指正,好的。
这就是我今天课程的全部的内容,那同学们有什么问题吗,呃其实GO就是一个非常典型的,就有同学问我说引擎中还有其他因素的案例吗,其实JO就是game option,就是个很典型的因素案例。
比如说刚才你在资产里面打开的,每一个GO的定义的话,就是每一个比如说角色啊强啊,那个地面上的方块,它在数据中就是一个定义,比如说一个方块它放在哪啊,它是长多大,什么样子对吧,但是呢我在这个关卡里面。
我那个方块可以放十个,放100个,我那个墙可以放很多个,对不对,可以横着放,竖着放,那每一个墙它其实就是一个instance,所以instance的话呢在游戏中的案例特别的多,再举个例子。
比如说音乐或者音效,那么我的一声音效,比如说呃子弹打中墙的声音,大家想想这是不是它的定义,对不对,但是的话当我在一个游戏中的话,你拿着加特林对着墙一扫,是不是一瞬间可以听到十几个子弹。
黑的黑得到墙的声音,那每个内每个声音呢就叫instance,所以包括像粒子系统啊,像地表上的这种草啊,植被啊,全是用伊森的概念去做的,啊这个同学问的就比较专业的。
他就问我说mesh shader和class based match,未来会怎么发展,那我个人呢,这这这纯纯属是一家之言啊,就是因为我们也是在行业的前端,去看这些行业的发展。
我个人认为这是未来的发展的方向,为什么呢,因为硬件不可能会越来越简单对吧,他一定会越来越复杂,而且功能会越来越强大,所以的话呢其实mesh shader它它的核心计算理念。
就是把所有的因素啊全部并行化掉之后的话,包括每一个单元只处理简单的运算,这个思想实际上我认为是正确的,至少在未来10年一定是这个方向去发展,所以呢我们把一个复杂的游戏世界,拆解成一个一个个固定小的单元。
然后用这些B进化的计算迅速的完成的话,我个人认为是未来的发展的方向,所以的话那个就是说我认为这个pipeline的话,未来可能会取代掉,今天我在课程中讲的那个最经典的pipeline。
但是呢我觉得你要去理解那个pipeline的话呢,经典pipeline还是要学,因为你要去理解,因为即使切到那个pipeline的话,材质网格index,包括根据材质进行世界的破分。
这个基础逻辑还是需要在的,啊有个同学问我一个很扎心的问题,就是引擎有必要自写这个渲染管线吗,呃其实呢就是很多的引擎都会去写,自己的渲染管线,但是我个人认为其实渲染这个问题。
就像我一上来就讲的就是游戏game engine的渲染,它是个工业化的问题,其实只要是工业化的问题呢,你会发现随着时间的积累,在同样的这个技术水平下,大家最后的解决方案是大同小异的。
所以呢我会认为就是渲染管线的话呢,尽可能的去多学习,多去向别人请教,关注行业最前沿的发展方向,然后呢选择最主流的方案去构建你的管线,就是特别特别特别的不一样的关系,我个人认为的话呢。
就是它维护和发展起来挑战还是非常大的,这是也不是我们特别推荐的一种方法,所以我会建议就是说你自己写是可以的,没有问题,但是你的架构,尽可能要符合整个行业和工业的标准,哇这个这个问题有个同学问我的问题。
这个就太难了,叫图形代码有没有更好的第八个方法,呃,实话实说,这个问题非常的难,因为如果大家真的做了这个图形程序员的话,我自己就是图形程序员出身嘛,那我们的debug,应该是仅次于服务器端的那个难度吧。
因为你的很多计算全是在GPU中,然后GPU你就像那个你的子弹打出去了,你根本不知道在里面发生了什么,然后最后一个结果给你出来了,那实际上的话呢就现在的这个就是显卡driver。
包括各家厂商提供了很多的第八个工具,比如说每个像素的,每一到周末可以看到它的数值的变化,包括SHADER可以PERCEPT去debug,但是呢这些都比当年要好很多了,但我个人认为的话。
就当你去写图形程序的时候呢,一定要非常的谨慎,而且我会我一般建议的方法是,不要一次性把所有的代码全写完,最好把你的算法拆成很多小布,然后呢每一个小步实现验证,反复验证,证明没有问题了,再往上再加一步。
这样的话你出了问题之后,你可以至少退回去,然后再看哪一步错了,千万不要看到一个算法特别牛逼,哐哐就把它全写了,那到时候你死了都不知道死在哪里,所以说图形引擎的debug呢,实际上啊难度是蛮大的。
而且特别需要这个程序员的经验,就是他要经验非常的成熟,好的,因为今天的时间比较长了,我看了一下,我们讲了将近100分钟了,所以要不我们今天的课程先这样。
再次谢谢同学们,就是那个这么好学,在这个假期里面,还是一起来进入到游戏引擎的知识世界,那我们期待呢,在下一周我们继续深入的讲那个图形渲染对吧,这也是游戏引擎中最sexy的一个部分,大家能看到好的。
那今天我们先到这里。
04.相机系统 | GAMES204-计算成像 - P1 - GAMES-Webinar - BV1gG4y1i7m5
今天上课之前想跟大家先说一下。
我们的课程内容,后面的一些内容会稍微往前提一提,这节课讲完相机部分,想直接把SP部分提到下一课,因为这样的话就可以把作业第一次作业,布置下去,不用做太长的铺垫,因为我们现在已经到现在为止铺垫了4节课了。
第一次作业也是可以放上去了,而且现在在整个系统里面,已经注册了有150位同学,接近150位同学,我们可以通过系统把代码框架放下去,大家就可以直接在系统里面,就下到我们的一个代码框架。
然后再往通过代码框架去实现我们自己的,一个第一个作业,就是让大家写一个简单的IP,第二个作业大概是让大家写一下,Advanced Image Processing,我们的助教同学会给大家去修改这些内容。
有关注册应该是这两天应该就要截止了,大概因为整个第一次作业布置之后,就不大好再往后去接受同学注册了,如果大家想要注册的话,可以抓紧时间,整个作业我们大概会有6次作业,可能会有5个比较小的作业。
还有一个最后的一个比较大的project,覆盖的内容是第一个project,是一个让大家写一个简单版的一个图像处理的ISP,第二个就是比较一些高级的IP算法,比如说像HDR Fusion。
像或者是图像的一些拼接,还有可能让大家去选择去做一下像,Gradient based image fusion或者是其他的一些方法,到了第三次作业,就要给大家去写一个求解逆问题的一个基础方法。
就包括像类似像Half Quadratic Splitting,或者写一个ADMM,或者是一个Proximal Operator,去大家求解一个逆问题,可能会有几个选题。
选题大概覆盖有single pixel camera,就是我用一个像素,去做压缩感知,然后第二个选题可能就是coded aperture,第三个选题大概应该就是。
Time domain的一个encoding,这个也有可能会跟后面的一些课程,可以往后稍微放一放,因为ADMM本身不是大家考察的重点,因为这个难度也不是特别大,到了第四次作业,会给大家布置一个。
用一个简单的一个deep learning,或者比如说一个unet或resnet,求解一个computation imaging的逆问题,第五次作业可能就稍微难一些,第五次作业是要大家自己去想一个系统。
去实现一些比较好玩的一些东西,到最后一次作业就是一个Large Project,可能会给大家覆盖一些像Differentiable Optics,或者是一些Time of Flight Imaging。
因为后面我们会分别介绍非常多的课题,最后一次作业会让大家在,自由的在这几个课题里面去选一个去做,因为全部都做下来是可能不是很现实,所以说可能会给大家布置一些,像Polarization Imaging。
Time of Flight Imaging,或者是Coded Aperture这一系列的一些内容,就大家选一个最后一次作业选一个就可以了,今天这个时间差不多了,我们先开始吧。
其实之前我们前两节课首先介绍了一下,就是计算成像里面覆盖了什么内容,然后上一节课我们花了很多时间,去给同学们介绍一下色彩,包括色彩的捕获,色彩的复现,我们色彩是怎么形成的,其实色彩本身也就是人视觉。
跟心理学的这么一个过程,大家还记得三要素,包括光源,然后观察者,还有是光源反射的物体,这一课就给大家从真正的进入到整个成像这么一个环节,就给大家介绍一个传统的一个Camera。
是怎么样实现的这么一个成像的,当然按照回忆观念。
就是刚开始还是得给大家介绍一下,整个的一个成像过程,然后会给大家简略的去写一下整个的Imaging Optics,包括像简单的最早的一个小孔,或者是一些Simple Lens的模型。
或者是我们现在更复杂的透镜,是怎么样用来成像的,包括透镜的一些会产生一些的相差,或者一些不好的效应,我们会通过怎么样,是通过后面的算法去把这个校正过来,那么Aperture对一个相机来说。
就是它的一个孔栏,孔栏其实对一个光学成像系统来说,是一个非常重要的指标,就是我这个孔栏是我约束整个光学,就是整个口径的这么一个东西,它可以有非常多的作用,它一是可以把很多杂光消除掉。
就是我不想要杂光我用孔栏消除掉,第二个就是它是整个系统的一个比较核心的地方,它是决定你的一个进光量的这么一个物理量,就是Aperture的一个size,然后就给大家说一下Depth of Field。
就是本身我们的镜头设计的时候,它会有一个对焦的位置,它对焦的时候就会产生一个弥散源,就当我的弥散源小于我像素的时候,这个时候大家看到的时候,都是一个比较清晰均匀的图像,当我这个弥散源慢慢变大。
就是我这个物体在一个对焦的位置,离对焦的位置太远,这个弥散源就会变大,也就是它点光的函数变大,当超过这个像素尺寸的时候,这个时候很明显的就会产生模糊了,我们在整个弥散源的范围,就是前后的那么一段范围。
把它定义为Depth of Field,就是你可以看清晰的这么一个范围,就有时候大家想要的Depth of Field大一点,就因为像很多工业或者扫码应用,想要这个东西大一点,很多时候像我们这样拍照。
像单反拍照的时候,我想要做背景虚化,这个时候就想让大家焦身小一点,大家需要注意一下,有时候它毕竟是一个好一个坏的一个东西,后面会给大家讲一下整个视野,视野就很简单。
就是整个相机可以看到了一个最大的视野范围,然后给大家分享一下,整个拍照时候的一些小Tips,就是怎么样让图像拍的更好看去构图,还有一些像Diffraction Limit。
包括Sensor本身是怎么样补过到光子,然后最后成像,然后给大家简略的介绍一下Noise,后面我们会专门开一节课去讲Noise,所以这一节课就给大家粗略的介绍一下,Noise是怎么回事。
非常重要的一个物理指标就是Exposure,就是整个曝光,曝光整个相机它的一个核心就是曝光,我这个光有进来了我才能补过它,才能形成一张图像,到最后看有没有时间会给大家分享一下Dynamic Range。
因为我们Advanced Image Processing那节课,会专门讲一下Dynamic Range,就是这个讲不讲就看时间,当然也是国际惯例先感谢一下,Slides Created。
其实这个相机最早,这个叫就是Nautilus的一个眼睛,它是世界上生物界存在的一个,可能是唯一一个小恐龙像了,就是大部分都是有一个透镜的,大家有晶状体的这么一个眼睛。
但是这个Nautilus就是什么大王无贼,它还是停留在一个小恐龙像,这么一个阶段,像有时候同学夜里面会好奇,有时候我们看到猫的眼睛或者是狗的眼睛,好家伙它那个光就会直直地反着给你。
就会有一个很亮很亮的眼睛看着你,夜里看起来挺吓人的是不是,这个眼睛到底是怎么回事呢,其实我在第一节课提到过,这个猫眼它背面有一层这个叫,Capitum lucidum,就是一层像镜子一样的一个反光层。
就一层角质,它是可以反射,就是我没有被我这个retina,也没有被我上膜吸收的光,然后经过反射一次,再次打到了我这个上膜上,就可以很大程度的提高猫或者是其他动物的一些,夜间的一些对光的敏感程度。
就相当于光被吸收了两次,效率就提高了一倍,右边这个就是一个牛的眼底,它这么一个反射层,这是一个从National Graphics里面,就是抛出来的一个复演的那么一张图。
就是这个对应的就是可能现在的一个光场成像,因为整个相机的一个形成,基本上就是参照生物界里面,眼睛的这么一个过程,包括像单个的相机,就是像比如说像我们手机摄像头,或者是手机摄像头。
包括像单反相机都是单个特定的设计,像这种比如说像光场相机,这个就是类似于这种复演式的设计了,当然我们之前前一刻讲到色彩的时候,并没有对人眼一个视觉系统进行总结,人的一个视觉系统总结下来。
就是我们视觉能看到的一个accuracy,就是准度,就是20-20,也就是大概一胡分,这么一个范围,就是达到这个一胡分之后,你又可以说你是retina display,每只单眼,我们每只眼睛。
它覆盖的一个视野范围,横向就是190度,然后你双目视觉,就是你两个眼睛的交叠区域,你在这一个120度之间的范围内,是可以感受到立体视觉的,也就是两个monocular的一个交叠处,就是120度。
然后纵向大概有个135度的这么一个范围,就是人眼的整个的视野,大概人的分辨率,这个分辨率,人的时间分辨率,就是很多时候大家会看到,我们为什么我们电影是30帧24帧,打游戏是60帧,144赫兹。
这个就是跟人眼的一个时间分辨能力有关,当然这个也是跟,我们本身的画面的对比度,或者是亮度有关系,我们在彩色视觉的时候,可能会快一些,像我们就是感状细胞反应会,对,彩色会反应慢一些,感状会反应快一些。
这个时候暗里面其实,特别对黑白的变化,我们是可以比较敏感的,可以看到5060赫兹,但是像彩色的看电影,就是230赫兹,大概那么一个,电影基本都是24赫兹,大家为什么看着不卡。
因为电影里面它有个叫动态模糊的,这么一种感觉,我们真实物理场景过程中,我拍的时候它是有一定的模糊的,但是我们打游戏那会,打游戏,调到60帧了,我们还是感觉卡,是不是,这个就是因为整个游戏的渲染过程。
采样的过程中,它没有对一个动态模糊,进行处理,所以说有时候经常大家打游戏,非得要开到120赫兹,或者是144赫兹那种电竞屏,才能感受到它不卡,人的眼睛的一个动态范围,什么叫动态范围。
就是最亮跟最暗的这么一个比值,大概人眼的一个范围,其实也不是很大,因为你要是直接去算它,就该大概是6。5,2的6。5次方倍,但是人眼就本身就有可以调节的能力,这个可以最大最大可以做到46。5个。
Fstops,就是2的46。5次方倍,就是很吓人,当然大部分人是走不到的,就是只有在很多极端的情况下,是可以达到这么大一个动态范围,当然人眼能感受到色彩,就是上一课讲到的CIE XYZ。
或者投影到一个XY+Z+1的一个平线上,就是我们人能感受到的一个色域,叫CIE XR Diagram,人眼是通过双目视觉来感受到3D的,这就有一个就是vertex focus conflicts。
就是什么意思呢,特别是大家戴VR眼镜那会儿,就是为什么现在戴VR眼镜,这么不舒服,这么难受呢,大家戴一会儿就会感觉到晕,实际上这个就是我们人眼的精状体,精状体会调焦,调焦对的位置跟你两个眼睛旋转的。
这个角度是要匹配的,如果这个角度不匹配,就会产生一些不舒服,眩晕恶心这种感觉,因为它本身这个角度叫vertex,还有我们精状体对焦的位置,就叫focus,两个是neuralink在一起的。
当你的这个戴VR眼镜的时候,你一直对焦在那个屏幕上,就你focus是固定的,你vertex又一直在变,所以说这个时候就会给你大脑产生错误信号,这个时候就感觉到不舒服,人眼的一个account rate。
就是我最大最远最近,可以看到一个什么样距离,就是从8厘米到无穷大,当然你这个虽然年龄越来越大,就是你就是你的视力会退化,就是调节能力变弱了,就是越远的地,就是你最近的一个距离会变远,你可能到我这个年龄。
就可能只能15厘米到个无穷大,这么一个,大家可以看一看最近能看多近,就是说明大家年龄差不多有多大,这个也有个体差异,本身就是对比人眼跟相机。
其实这基本上算是一模一样的,就包括我们也要有自己的透镜系统,也包括有自己的pupil,就是我们的瞳孔,实际上就对应的Aperture,然后我们有自己的就是视网膜,就是我们的传感器。
其实基本上算是可以一一对应的,然后为了改善到彩色,人眼有三种不一样的,LSM三种不一样的一个追撞细胞,然后但是整个相机就可以用一个,白绿光片来实现这么一个彩色的一个捕获,下面给大家讲一个第一部分。
就是Imaging Optics。
其实最早成像的Imaging Optics,最早出现在差不多有2700年了。
那叫Nimbler Lens,就是这个考古发现了,这么一个水晶的这么一块透镜,那时候可能是只是为了太阳打个火,不一定是为了成像,但那时候透镜是已经有了,就是它可以干什么呢,就是那个时候大家对透镜的认知。
就是这玩意可以聚光,聚光的时候就可以打火了,特别是像以前尼罗河沿岸,像非洲北部或者是沙特那种地方,就是日照非常强,大家需要点火,就很困难,就弄一个透镜去给人来点火,然后第二个作用就是放大镜。
以前这个人的视力也会出问题,就是老花眼怎么办,古代发现这个东西可以放大,是吧,这个放大镜就可以看清细节,但一直到列伍古赫才会发现显微镜,但那个放大镜对2700年前来说,已经是一个非常伟大的进步。
这个透镜是怎么成像的呢,首先我们有一个物体。
在左边这个位置有个物体,这个物体我们把它定成object,然后这个物体所在的这个面,它就是雾面,然后通过一个透镜走走走,走到一个,走到整个所有的发出的光线再次聚焦,我们发现这有一个得到了一个实像。
这个是一个实像,这个时候大家初中已经学过,这个成像的距离位置放大率都非常简单,就是雾距分之一,加上相距分之一,最后就等于整个焦距分之一,对不对,然后我们放大率实际上就是。
这个real image的size,跟这个object size的比值,当然我们这个地方用负的,因为它是个倒向,这个real image是个倒向,就负的S2比S1,最后就可以拿到,我的一个放大率就是F。
比上个F-S1,但这个里面我们画这个时候,有一个假设,因为我们这个中心,假如说是一个薄的凸透镜,我中心那个地方,它是没有曲率的,没有曲率,这个光就可以直接穿过中心,到达这个位置,然后我们横着画一条光。
然后看到这个光会过焦点,然后再来一根光,从这个虚像反着连回去,这个平行光,然后会过前焦点,这样的话就把这个虚像,这么一下就打出来了,当然你要把这个物体,放到我们焦距范围内,这时候就变成了放大镜。
这时候就是你的VR眼镜了,就是实际上,大家在那个VR眼镜里边,它那个工作原理就是个放大镜,比如说实际上你这个object,就是你要观察的屏幕,你的virtual image,就在屏幕后方的一个位置。
然后你其实现在的VR眼镜的放大镜,基本上一面是这种非球面镜,或者球面镜,另一面为了做薄,我就做成费尿头镜,其实对人影的感受不是特别强烈,就可以,但是像质还是挺好的,然后另一种就是放小。
你要把它做成一个凹头镜的时候,也是在我要看一个物体的时候,我这个成像就成一个虚拟的像,这两个都是虚拟的像,就会呈现在焦距内,就会和放小的这么一张图片,讲透镜就不得不讲一下相差。
因为我们后面的这些计算成像,基本上都是根据相差,很多时候也不是基本上,就是大部分像日常生活中的成像,包括我们像镜头的设计,包括现在很多的ISP,基本上都是围绕着相差来去校正它的。
那就像相差跟噪声这两个位置,理想的情况下,我们一些平行光打过来,打到一个透镜上,它是可以汇聚到一个点的,但是实际情况是不可能的,但不是因为加工缺陷,就是设计有缺陷,像比如说像我们这一个平面的。
一个球面的这么一个透镜,我经过平行光汇聚,然后汇聚到,我发现离轴不一样的位置,我打到光线,最后我的焦点位置都不一样,我在一大片区域不一样的离轴程度,就是r,不一样的r对应着不一样的焦点。
这个就是spherical aberration,就是球差,然后另一种相差就是随着入射角度,变化而变化的相差,角度越大,比如说像我们左下角这张图,我们这斜着沿着一个θ打过来,我比如说过中心这个位置。
沿着就是靠近这个轴斜着打过来,靠近中心轴的位置,我最后能量越密集,然后靠边缘的地方,我就聚焦在别的地方了,然后它的能量会稀疏一些,这个时候就会产生一个,像彗星这么一个一圈一圈的这种,一种相差。
这个叫彗差,然后还有一种,它是随着整个轴变化而变化的,这么一种相差,叫antigmatism,这个叫怎么翻译的,好像是应该翻译为,这个叫散光,就是有一个就是意思就是有一个,注面镜了。
它整个就是点块的函数的一个形状,就是变成一个不是一个,不是一个就对称的那么一个形状,然后还有一种就是大家常见的一个,distortion,也就是畸变,就是对这相反,还有一个就是大家常见的一些畸变。
有统型畸变,整形畸变,就大家就一般都是要把它叫好,最后特别是大家做双目视觉,或多目视觉,特别是多目的一些光场相机,我们要匹配之前,是不是要把distortion叫掉,如果不叫掉的话。
你在空间中匹配的时候,就会产生一个比较大的一个错误,当然上面讲的这些都是叫,这个叫单色的一个相差,当然本身因为我们透镜,就不同的波长,同一个同一种光学材料,不同的波长,或者它那个折射率是不一样的。
不一样折射率就是大家就是聚不到一块去,就相当于聚不到一块去,就会产生这么一种叫chromatic aberration,就是彩色的一种相差,这个有时候就叫色散,给大家看一看。
有这个lens aberration的时候。
会是什么样子,当然我这个一个图非常锐利的时候,大家看的很清晰很舒服,当然我们加了一些光学的,比如说像球叉,包括像我们的一个color,这个一个彩色的一个色散,就是大家可以看到又模糊。
然后又会有这种微彩出现,这些东西都是大家不想要的,所以说很多时候,大家设计光学镜头的时候,就会想用更多的镜片,来相互矫正这个相差,我通过不断镜片堆叠,然后比如说还有一些特殊的结构,像双钢丝结构。
就可以叫畸变,我前三片镜片跟后三片镜片,是完全对称的这么一种设计,前面那三片产生一个正向的畸变,后面那三片又产生一个反向的畸变,这样就把这整个畸变抵消了,最后拿到了一个无畸变的一个透镜。
Aperture就是我们所说的一个孔蓝。
也就是大家拍摄的时候对应的光圈,我们可以看到一个点,整个光线的角度是被我们实际上,被我们的一个孔蓝,也就是被我们的光圈是约束掉的,我们可以看到,它除了控制光线数的角度,还很大程度的控制了一个进光量。
我这个进光量是由Aperture来控制的,就是Aperture越大,我的整个进光量也就越大,可以看到有不同尺寸的一个Aperture Size,大家比较好的透镜,就是卖的比较贵的那种单反相机。
或者手机也可以做到一个F1。4的,这么一个,这个F Number就是,是N等于F/D,这个F是什么,F就是这个里边的F就是一个焦距,D就是我们的Aperture的直径,F数越小,就说明我们的孔径越大。
就进光量也就越大,当然对应的就是我们的景深也就越小,我们可以看到F2的时候,F2。8,就很多变焦透镜的一个变焦镜头的,一个F数都是2。8,因为这个变焦镜头需要在不同的,一个焦距里面去做一个平衡。
就它是比较难,把这个F做小,还有一些像F4,F4有时候在监控镜头上,就是说就比较常见了,F5。6 F8工业里面会,特别是STIKO的镜头或者是,M12 M14的这种镜头里面会出现比较,小的光圈。
就F就是大光圈比较困难,这个我们发现,我们的Focal Plane在这个位置的时候,就我们相机对焦在,前面这一个Focal Plane的位置,超过往前挪一挪,就发现到最后,我在我的传感器上,经过透镜。
就没有办法形成一个比较小的一个点,这个时候我们的图像,就会受这个迷散源,半径太大了,就是每个点都是一个迷散源,然后最后积分起来,是不是就是,像做了个卷机,你拍到的图像就会显得模糊。
另一种情况也是Auto Focus,就是我焦距提前了,就没有对好焦,这个最后也会产生一个比较大的迷散源,我前后景深,它都是有一个范围的,就是因为这个范围的限制,我们就导致最后就没有办法拿到一个。
比较理想的图像,这个图好像有点bug,这应该是在前面这个位置,这个时候我们就可以看到,我在我的Focal Plane前面后面,各有一个边界,就在这个边界内,我的迷散源没有超过我的像素的大小。
所以说在这个范围内,就我最后呈现的一个图像,它就是都是清晰的,这个就是我们大家常见的一个,景深这么一个东西,就是大家拍照的时候你发现,对接到人脸的地方,这个时候是清晰的,但是背景都是虚化掉了。
这个就是因为背景的迷散源已经太大了,就只能呈现出一个模糊的图像,这个时候有利有弊,大家喜欢拍照,比如拍花草,想要那种虚化的感觉,但对很多工艺的场景,我们不想要那么小的一个景深,我想要更大的景深。
就需要在牺牲一下光圈,或者是在我们光学镜头上,做一些特殊的一些设计,包括像端道端的光学预算法联合设计,就可以在保证光圈的情况下,一定程度的扩展它的景深,这个特别是在工业里面应用会比较多。
这个就是所谓的Depth of Field,这个Depth of Field怎么算呢,算起来其实并不麻烦,整个Depth of Field,它跟什么相关呢,就是跟我的一个物距相关。
也是跟我的一个就是Diameter,就是整个Aperture的一个size,是成正比的,然后还有一个就是我的一个,放大率有关系,也就是说我这个Aperture越大,我的景深实际上就是越小的。
所以这个C它是一个反着的系数,我们也可以看到,这个C是它的就是弥散源,弥散源就等于一个放大率,乘以一个Diameter,再乘以一个就是整个弥散源,在我像素上的一个大小的一个尺寸。
就是我这个Aperture投影到大小,这个Aperture上一个,就是传感线上一个尺寸,就是这个弥散源的一个倒数,就是我们除以这个Pixel大小,实际上就得到我们了,最后一个景深的那么一个参数。
我们看到整个弥散源的大小,是怎么变化呢,就是在我的焦前,就我靠近我相机的那一端,它是猛然的就是下降,直到我对焦那一刻,对焦这个弥散源基本上就是一个点了,然后随着慢慢变化,然后距离不断变大,距离不断变大。
然后最后会收敛到一个比较大的,一个比较平衡的一个位置,然后我可以接受的这个弥散源的大小,就是不超过像素的位置的时候,这个就是我所用的对应的一个景深,有时候大家对焦到一定的距离之后。
比如说我要对焦到10米20米,一个比较远的距离之后,我再往外,再往外面看,其实这个就已经全都对焦了,然后这个面,就是刚好就是再往后,全部对上焦的这个面叫hyperplane,这个怎么翻译有点记不清了。
但是那个位置叫hyperplane,大家就可以很直观的看到。
不同的depth of field,是什么感觉,我们分别把Aperture的size,调到f1。8 f4跟f8,我们可以看到光圈越大的时候,我们可以看到景深实际上它是越小的,然后我们不断调小光圈。
就让调到f4调到f8,在同样的观测距离下,我们可以看到,孔越小就孔径越小,最后拿到的景深是越大的,这就有一个很矛盾的地方,我越想要大景深,我越想要大的一个Aperture,这个时候就比较困难了。
当然这也不是没有办法,这个就是在不同的一个光圈下。
因为光圈还有一个矛盾的地方是,我这个光圈,它是跟我的最后的拍照的时候的,这么一个exposure time,就是曝光时间,是一个比较对立的一个过程,我曝光时间越长,我要小光圈。
比如一个小光圈曝光时间越长,这时候有动的物体就怎么办,比如我们很多时候拍一个运动的物体,这个时候就产生了矛盾,就是光圈跟我最后的曝光时间,会产生一个天然的矛盾,大家又想光圈大,又想曝光时间小。
这个时候挺矛盾的,大家可以看到当光圈比较小的时候,我就需要一个比较长的曝光时间,最后看到鸽子整个全都模糊掉了,然后不断的增大光圈,减小曝光时间,就可以看到这个是拍的挺好的。
但这个时候光圈就会跟我们的景深,会产生一个矛盾,实际上这个矛盾就是景深跟曝光,跟曝光时间的一个,也就是噪声,曝光时间越短,我噪声越明显,就跟噪声本身是有一个天然的矛盾的地方,所以说谁好谁坏到底怎么选。
就需要大家用经验去判断一下,还有一个就是Field of View,就是我们整个能观测到的视野。
这个对相机来说是非常重要的,大家选相机的时候,想要特别是手机,有时候大家会听到手机厂商去吹超广角,我们可以看到非常大的一个全景的范围,这个有时候大家又想要拍那种特别远距离的东西,比如我们在一些自然公园。
像一些黄石,有些野生动物,不能离太近拍它,我就要离特别远的位置去拍,我就想用一个长焦镜头,在一个非常远距离的地方拍得非常清楚,这个时候就会有一个Field of View的问题,就是越长的一个焦。
在相同的一个传感器尺寸下,越长的焦它对应的一个Field of View就越小,实际上我们假设一个透镜,基本上都是在一个理想的透镜模型,我们其实你要硬算它的一个Field of View的时候。
你就把这个透镜当成一个小孔,因为我们透镜中心,理论上实际上不是这样的,理论等效的一个薄透镜的中心,光总是沿着直线穿过这个中心的,实际上跟大家把它想象成一个小孔的相机。
来算Field of View就可以了,这个怎么算非常简单,我的Focal Length是固定的,我传感器是固定的,我传感器跟Focal Length,穿过透镜的中心的时候。
就可以直接算到这么一个Field of View,就很简单,2倍的Arc Tangent,就2分之A是除以Focal Length,就直接可以算出Field of View,但这个时候要注意一下。
大家特别是对传感器选行的时候,会看到H Field of View,还有V Field of View,Vertical Field of View,就横着跟纵着的。
还有一个就D Field of View,就简单,我整个传感器因为是长方形的,我对角线的Field of View,就我这个透镜,我最后能覆盖的范围,一定要是要能cover掉。
我对角线的这么一个Field of View的话,这样的话就不会有黑边的问题,大家可以看到不同的Field of View。
本身跟尺寸也是比较有关系,就相同的一个透镜,我最后的底儿,就是我们传感器的尺寸越大,我就可以看到我最后的Field of View,对应也是越大,不同的传感器。
就对这种不一样的一个尺寸,这个还是有必要给大家分享一下的,现在大家市面上能买到的一些,就比较大的一个传感器,就是中画幅,还是有大画幅,因为大画幅,基本上都是非常专业的一些用户,其实现在已经不多了。
因为现在很多都是数码相机,就传统的相机,就那胶片,就是挺大的一个大胶片,那就是大画幅,大画幅它的传感器的尺寸,就是差不多53。7*42,40。2这么一个尺寸,很多高端的一些大画相机,像哈苏,菲斯。
马米亚,冰德,这些很高端的一些相机品牌,就会有一些中画幅的一些相机,这个时候就比较贵了,因为你传感器越大,对应的光源系统也越大,这个时候就都比较贵,大家日常生活中,比较常见的一些中高端机型。
就是用的很多都是全画幅,叫Full Frame,它的尺寸就是,36*23。9,也就是传统的135画幅的,这么一个相机,它的一个,大家可以看到这次面积,就跟中画幅相比,全画幅将近差了三倍的一个面积。
这个时候这个时候品牌就会比较多了,像尼康,佳能,索尼,现在大家大部分都是主打全画幅的,一个,中画幅的现在已经,不是特别多了,再往小一点,就是,再阉割一下尺寸,实际上就是,APS,或者,4/3,一英寸。
1/1。63,或者更小,到你的手机那端,就只能到一个,差不多1/3。2,但现在很多很变态的一些手机,就已经上到了1/1。1,就是索尼自己家,产了一款传感器,产了一款手机,它那个底就做到了1/1。1。
其实这个是非常大的,结果就是后面导致后面的光线系统是非常大,也就是大家手机后面,会凸出来很大一块,但这个可能尺寸小一点,因为传感器大了之后,它是非常有优势的,你看到10维米的像素,跟1维米的像素。
它的进光量,差了100倍的,所以说这个时候,就大家要注意点,这个像素高了,它不一定好,就像素小了,它也不一定好,像素大了之后,但是它光线系统就贵,所以说现在,特别是手机摄影。
就大家这所有的厂家都在陷入一个,就非常焦虑内卷的一种状态,就是大家,又想要这个好,又想要便宜,又想要它小,这个就很困难,但这些厂家已经不断努力,其实对整个大家手机拍照的质量,做出了非常卓越的贡献。
但也考虑到整个相机的一个fieldview,就因为我们的,就是单反相机,它是一个非常大的一个传感器,我对应的一个focal length就比较大,想要获得一个相同的一个视野,就拍到一个相同画面的一个图。
对应的手机,就是我一个小的一个传感器,对应一个短的一个焦距,我们实际上就是像素大小的一个对应,按比例的一个对应,当我们固定了我们传感器尺寸的大小之后,这个时候发现,这个焦距越长。
我最后能观察到的视长角就越小,就比如说就是我们8毫米这么一个透镜,我们装放到我们一个全画幅的一个相机上,我可以看到180度这么一个范围,到了像25就是很多25,28,35,这么一个波段。
经常就是用来拍人的这么一些镜头,这个时候它大概对应的一个视野范围,就是六七十度的一个视野范围,到了50度,就很多大家这个镜头是定焦到50度的镜头,这个是非常常见的,因为这50度的镜头它的量大。
所以说这个就特别便宜,比如说佳能的小弹云镜头,50毫米的镜头只要几百块钱,就可以获得一个非常好的一个相机,几百块钱就可以拿到一个F1。8的一个,好相机的定焦的50毫米的镜头,就是因为它量大。
这个时候覆盖掉的视野范围,差不多是43度,到了你要1000毫米,这个时候就会只有2。5度了,这么一个视野范围,就是非常小,大家可以也很显而易见,就是离着焦距越长,往中心连着传感器一算。
那个角度是变得小很多的,大家可以看到就是换不一样的焦距,我最后16毫米可以拍到这么大一个范围,我最后70毫米的时候,只能拍到这么小一个范围了,你到了5001000就只能拍到一个,人头这么一个范围。
大家喜欢用那种望远镜,就拍月亮的时候,就发现这个月亮到最后,我望远镜中间只有一个大月亮,这个时候它的视野范围就是非常小,因为它焦距已经做到非常长,上周也说到过这个微博望远镜。
微博望远镜它焦距到底是多长呢,因为这个微博它是一个反射式的望远镜,但它也有自己的一些焦距,它的一个等效焦距是131。4米,就是我们的焦距100多米,比我们现在这些单反镜头大了非常多,但除了这个之外。
就很多摇杆的一些,卫星摇杆的一些镜头,也是可以做到几米几十米的这么一个焦距范围,那哈勃望远镜我记得是50几米的一个焦距,有一些历史原因在,大家最后算这个35,大家最后算这个FieldView的时候。
通常就会拿这个,就是35毫米,Format的Field就是全画幅的这么一个,来算它就是135画幅来算,这是历史原因,大家算的时候都喜欢这么来算,拿这个35毫米的这么一个,就是穿上去来说,17毫米的一个。
透镜,就对应了一个广角104度,到200毫米的一个望远镜,望远的透镜一个,大家喜欢叫长枪短炮,200毫米的一个大炮,差不多就是12度的一个视野范围,有时候我们在手机摄影的时候,通常会有一些像等效的焦距。
比如说像等效的28毫米焦距,实际上它并不是一个像,真正的一个28毫米的焦距,因为28毫米焦距在手机,就比手机已经厚了非常多了,28毫米差不多这么厚了,实际上是一个等效的这么一个焦距。
它是拿135画幅的这么一个东西来去等效的,实际上情况是物理尺寸是,因为它像素比较小,它物理尺寸是实际上是差不多是5~6倍,或者更短,对微博那几个键盘是基本上,是接近一条直线了,有一定角度还是有的。
本身其实透镜除了像刚才讲的那些像差,它还有一个衍射极限在,我们以前上物理的时候,就会发现有个东西叫爱里曼,那时候就是1。2λ/d对吧,就是我过了一个孔,这个孔的大小是d,我最后到了一个下面的时候。
差不多就是1。2λ/d,这个东西,阿贝就是1837年的时候,对太空望远镜不需要大大幅度,因为这个数据量是很恐怖的,太空望远镜主要是需要是口径,因为它会面临的像现在这页说的,就是衍射极限的问题。
就口径越大,我这个衍射极限它也就是越小,就我最后的一个可以观测到的这么一个d,实际上就是约等于λ乘以一个f柱,我们最后本身就刨掉我们的,不要看我们像素的一个分辨率,就我这个光源系统的透镜的分辨率。
差不多是等于一个λ/f,就比如说我们的f柱是1,我的波长是550纳米,这么一个绿的,就是我最后的迷散源的半径,就是550纳米这么大一个数,我们很多那种microscopic。
这个f柱或者是它的一个倒数叫numeric aperture,numeric aperture就等于nθ,就是一个折射率乘以一个θ,在我们的microscopic就是我们的显微镜里面。
这个是它决定分辨率的一个东西,就我们最后的一个极限的分辨率,就是λ/2b的numeric aperture,所以说我们想要我们分辨极限更高,我们想要分辨更小的东西的时候。
我这个时候就需要一个更大的numeric aperture,对不对,所以说这个时候光线系统,我要想把这个数值口径做大,要把它的口径做大,其实是挺困难的,所以有的科学家就想着我这个n。
从公式上写不就是numeric aperture nθ,我这个n现在是空气,我把折射率提高,我这个分辨率就不是提高挺多的吗,比如说我把空气折射率是1,然后我把这个样品沁油。
我用一个折射率比较高的一种光学的一些油,就沁在样本跟最后一个透镜之间,比如我用一个折射率是1。6的那么一个油,沁着,最后我的分辨率实际上是提高了1/1。6,就提高了1。6倍,就可以分辨更小的一个物体。
它整个限制实际上也就是一个空间跟一个带宽的,一个乘积的一个限制,就是我的一个空间带宽机是固定的,就我由于物理学里面的一个不确定原理,我的空间带宽机是一定的,我想要提高一个,就需要在另一个地方去动手脚。
下面给大家分享一下拍照的一些小技巧,大家可以观察到,就是不一样的一个,对光刻机是有沁油的,但是现在的一些主流方案都是为了像用集子外,说到光刻机还真想给大家batch一下,就本身光刻机。
大家有时候可能概念上会有一些混淆,光刻我们要做一个芯片的这么一个流程,大概有几个步骤,第一部分就是写眼膜,我用大家就像激光止血去写一个二值的一个mask,就先甩胶完之后,我在胶上刻mask。
然后多了一层隔,它就会出现一个二值的一个图案,对不对,然后我把二值图案放到一个striper上面,这个striper有时候也翻译成光刻机,这个叫不近视光刻机。
我这个striper比如说我刻了pattern,我分辨的是一微米,我这个striper可以把从一微米,我可以缩小10倍,就可以出现100纳米,这么一个东西。
但是我要想要实现100纳米的这么一个投影的分辨率,这个striper就是大家所谓的生产时候的不近视光刻机,这个时候我光源就需要比较短的波长,到最早,包括像那种像DUV到现在的EUV,就是波长越做越短。
就是为了提高我这个,想当于微纳级的投影仪,就striper它最后的一个分辨率,其实这个striper做起来是比较困难的,现在可能,我见过一下striper,那个striper有200多个镜片。
就英特尔跟台积电好像各有一台,差不多有三层楼这么高,然后每个镜片的口径差不多有十几米,然后有200多个镜片,每一层都需要调硬力,因为硬力都变形了,然后除了还要调温度,都会引起最后的一个形变。
我最后生产的时候,12寸的一个生产线上,我这mask刻好,可能刻三次成mask,这边一曝光,曝光拿出去,曝光图案拿出去,然后再一层工艺,就通过几十层的堆叠就做成了芯片,但striper难度是比较大的。
这个是可能是最核心最难的一个地方,这个给大家讲一下拍照的一些技巧,像这种我们这种16纳米,我也可以看到,背景看的是比较远的,构图的时候,我们不断增加一下,它的一个焦距,我们看到可以把后面的背景。
拉的显得近一些,这就是它一个构图的一些技巧,我们想要背景远一些,我们就可以用一些广角的镜头,我想要背景近一些,就可以用一个比较长焦的镜头,它是一个符合一个,你要用透镜的时候,你就把它想象成一个小孔。
它是一个perspective conversation,就是你的这一个就是投影变换,就投影的一个构成,你想要这个图构成什么样的成分,你可以用一个像这种,就不一样的视角,然后构图我们后面背景的范围。
你看这个焦距越短,后面的背景越大,然后焦距越长,我们后面的背景就越小,就是你想要背景更清晰一些,或者是涵盖的东西,覆盖的范围更大一些,你又可以去调一下这个对焦的问题,你要调完,你要换不同的焦距。
你就不得不就是走远点或走近点,去调一下你主要要拍摄的人,或者物体的这么一个距离,这是一些不一样的投影的一个构图。
你们要最后你要选到这个构图是什么样子,大家可以先在草纸上先画一画,然后根据这个构图来去选择你的一个投影,什么样焦段的一个投影,这里面技巧其实是非常多的,反正这个也不是本课的重点。
就是给大家讲一些拍照的技巧。
首先就是选择一个你要拍的一个物体,差不多覆盖你到1/3的一个画面,这么一个地方,第二个就是选一个比较好的一个投影的视角,就是投影的就是你物体跟后面的一个,背景的一个相互之间的一个投影关系。
这个时候你又想找到一个比较好的一个构图,然后最后你可以调一下镜头的一个焦,或者换一个镜头来去,然后移动你一个相机的位置,来最后实现你的构图,最后其实还是要看你这个艺术细胞,这个只要看你这个审美的感觉。
大家可以手机上也是可以的,大家可以拿手机给大家拍个照,选一选构图,最后对大家找女朋友什么是比较有用的,提到构图就不得不说一说杜比,其实杜比zoom对整个物体的强调,其实是一个非常好的一个这么一个案例。
给大家看一下,放梦,就是它会对不一样的场景进行强调,手工拖镜头条,好像视频格式有点问题,它会有一个镜头由远拉近的这么一个过程,就是从一个很广的背景,拖到一个比较小的一个背景,这样的话。
就会对你的本身的一个物体,产生一个强调,产生一个更强悍的视觉出镜,这个视频有问题,回头我把这个视频单独放出来,给大家看一看,对,就这么,背景,由远到近,这么一个镜头拉伸的过程。
大家也是拍摄那种电影的一些常见的一些技巧,来讲到关键了,传感器,其实对相机来说是一个非常核心的一个地方,这个是一个传统的胶片式的传感器,胶片式的传感器其实问题是非常多的,就包括它是一个响应。
它是一个非常非线性的过程,我们可以看到右边这个,就不一样的一个,这么一个曝光的一个程度,看它最后拿到一个曝光的一个密度,就看这个好家伙它不是一个线性的,最后拿到的图看起来,挺难受。
而且我们这个已经是放上对数了,还还是不是特别线性,所以说这个,特别是在一些比较低的一些,比较暗的一些区域,其实这个是不是很好,而且它的一个动态范围也是比较受限了,就是我们传统的胶片式的化学式的胶片。
它的一个动态范围差不多是,比如1000比1或者是更多一点,但是有一个好处,它扯那么多它不好的地方,就是它有时候对色彩的还原,其实还是挺好的,就是不得不佩服,而且以前化学化工的调教。
对这个色彩其实保留是比较好的,当然这个还是,我们还是要说一下,现在的一个modem的一个传感器是什么样子,这是一个像素,它是一个像素的一个拆解图,我们一般最上面它是一个micro lens。
micro lens是干嘛呢,主要是为了收集光线,提高它的一个光线收集的效率,实际上也就是提高灵敏度,第二个原因就是用了micro lens,实际上就是靠滚别,我们本身有时候它填充率,我感光区域。
因为我的像素大小不是特别大的时候,Fill factor比较小,感光区域相比pixel比较小,这个时候我们要采用一个高频信号,这个时候用一个比较低频的一个玩意,一个像素分布。
去采用一个空间中分布的一个高频信号,这个时候就会产生走样的问题,就是alasing的问题,所以说micro lens第二个作用就是,收集到更多的信号平均起来,然后填到一个低通力国际。
去把这个alasing这种效应去给它pk掉,过了micro lens之后,它就是一层color filter,比如说像最经典的RGB,然后每个像素之间就有一个对应的,一个小块color filter。
这上面两层都是塑料的,如果大家手上有不建议大家抠了,这一层塑料可是可以用那种小铅笔,铅笔木块,你把铅笔木头削下来,削成一个小木刀,小木刀就可以把这层塑料刮掉,但是不会损伤后面的半导体传感器。
这个时候你就可以把一个彩色的传感器扣成黑白的,这个事我是干过的,然后到了后面,就会有一个光电的一个偏移节,大家可以看到,就是爱因斯坦就很厉害,他除了像那种,这个光电效应对他来说是一个比较小的发明。
就是那时候他的相对论出来之后,当时评选纳瓦尔奖的这些委员会,对相对论拿不准,他不敢直接把这个东西,就是通过相对论给纳瓦尔奖,就选他一个光电效应这么一个成果,就把纳瓦尔奖颁给爱因斯坦了,然后我们光子来。
就是激发我的光子控学队,就会导致我偏移节之间的一个电导率的变化,电脑率的变化,因为有变化了,我就可以往我后面的一个well里面,potential well里面去充电,这个时候就会产生一些电子的移动。
我的整个光产生电子的这么一个数量,一个光产生了另外几个电子,这个概率就叫QE,Quantum Efficiency,它就是我约1000个光子打过来,然后就产生了几个电子,它的比值就是QE。
就现在的一些半导体传感器,QE是可以做到非常高的,就有一些波段是可以做到85%,那么一个高的一个QE,除了光电传感器,就是photodiode,然后它下面是有一个叫potential well。
这个potential well是存储,我曝光之后产生了电子的,然后我这个电荷就可以通过ADC,去把它读出来,就可以最后读到我们接到传感器里面的值,后面这个Macro lens。
因为很多Macro lens,其实设计的不是特别好,大家可以看到边缘这些区域,还是有一些盲区,然后甚至因为是光线角度变大,很多光收不进来,就导致量子效率的一些浪费,还有一些就变成一些漏光的效应。
所以说之前我们做时间自己玩的时候,就发明了一种3D的Macro lens,上面是一种非球面的Macro lens的排布,下面是做了一些,就是用推优化优化出来的一些形状,这个光打过来之后。
然后反射到这个面上,这个面因为是经过精心设计的,它把所有的光都通过全反射,始终约束在这个柱子范围内,最后就所有的光都会可以,打到光线传感器上,它的一个fill factor。
就填充率基本上可以提升到100%,这是我们之前自己玩了一个这么个东西,就是用双光子吸收做了一个3D的微大结构,说到本身的光线传感器的这么一个响应,大家可以从右边观测到,我基本上在一定范围内。
就我光子数来到了光子数越多,我最后就产生了一个电子数据越多,它是一个比较线性的一个过程,就问大家一个问题,就是这个角度这个slope代表了什么,就问大家这么一个简单的一个问题,你可以回答一下。
这个很简单,这个就是电子数除以光子数,实际上就是QE,Quantum Efficiency,因为我们在一定的范围内,它是一个保持比较线性的一个,有一个良好的线性度,但是我到了一定范围内。
因为我potential well慢慢饱和了,这个时候到这个时候就我们不再曝光,这个值没法往里积了,到这个时候就会饱和了,对QE,然后在我们就比较暗的区域,特别是特别暗的区域。
它也会有一定的非线性的效应,所以说大家拍照的时候在暗的地方,其实就是很容易导致一些色彩的失真,除了跟造成有关,还是跟本身的一个器件设计也是有关系的,然后后面我们会专门开一节课,会讲HDR。
因为我们这个范围,我想要更大的范围内都是得到一个线性的,我说怎么办,怎么样得到一个HDR图像,因为我们受限于我们传感器的一个动态范围,就是我们线性的一个区间,就是很多没有拍张图。
因为我们自然场景的一个动态范围是非常大的,就是拍这个图,有时候基本上要么暗了,然后要么亮了,过曝了,就总是没有办法就同时捕捉好,所以说现在有很多很热门的话题,都是在做HDR成像,为了捕捉到彩色图像。
其实一个比较常见的方法,就是用一个color filter array,然后我整个因为我们每个像素,基本上只能感受到光强,然后我就用一个RGB的一个,就是color filter,然后铺到传感器上。
然后就可以拿到这么一个彩色的分量,当然这是牺牲了一定的分辨率,这按是后期p的效果,也不是就是曝光量不够,然后给大家说,但是这个就是会导致一定的一个,就是分辨率的牺牲。
就假如最经典的一个RGB的一个传感器,还有两个通道是绿的,然后一个通道红的,一个通道是蓝的,然后我基本上我蓝的值要差个,剩下三个空就要差一个蓝的值,然后绿的也要差个一倍,然后红的要差三倍。
所以说一个好的马赛克算法,其实对大家来说是一个非常重要的,一个去马赛克的算法,是一个非常重要的一块,就去不好,比如说像简单一点,Bilinear,Bicubic像Marble。
这种一些比较简单的一个去马赛克,就会产生一些比较明显的,就微彩效应,特别是边缘的地方,会产生一些微彩的效应,本身color filter array,其实就挺简单的,最经典的就是RGB。
当然现在还有很多,就是很多五花八门的,一个采样的一种效率,包括像华为P30和P30 Pro的时候,那时候大家打暗夜色彩,他们就提出了一种,可能是定制了一种叫RYYB的这种感光元件。
RYYB就是yellow,yellow是啥呢,yellow就是R加上G,就是我让R跟G两个通道同时过来,我这个进光量是不是一下子就大了,我的心脏比立马就高了,对不对,然后这个时候大家会有一个问题。
这个东西本质上是牺牲,就比较低光颜色的一个色准,来换取心脏比,这为什么呢,首先这个东西RYYB这种设计,就是R加上G等于Y,我们这个通道的,它心脏比是变高的,因为我们是R跟G。
两个通道的能量都同时来到传感器,对不对,但是R通道跟Y通道跟R通道,在低光下都是有噪声的,这个噪声其实是,并不是暗光下就是噪声越大,其实我们学过随机过程,就是整个破松抗性的一个过程,就我抗性的时间越长。
就我抗性的光子是越长,实际上我最后累积的噪声是越多的,但是这个时候我们的心脏比也是提高的,暗处因为我们累积的时间比较短,信号比较弱,它噪声虽然比较小,但是心脏比比较低,所以我们为什么老是说。
在暗夜情况下噪声大,但实际上只是它心脏比比低,实际上是更亮的时候,基本更长的时间,它的噪声是更大的,但这个RYYB,你要最后就算出来green,算出来绿的时候,实际上它噪声是基本上是放大了一倍的。
所以说RYYB这种设计,我的感觉好像就是为了牺牲,就是暗光情况下的颜色,来换取一个比较高的心脏比比,就是比较容易出现一个色差的问题,这个中国算法是比较难叫的一个东西,这个是比较困难。
除了像刚才讲的那些传感器。
给大家总结了一些比较常见的一些半导体传感器,包括像CCD叫Charged Couple Device,像半导体氧化物就是CMOS,还有像FORWAY那种,叠一层的,这个跟公义没关系。
除了这个还有一些就很好玩的一些传感器,包括像Charged Interaction Device,CID,还有光电倍增管,光电倍增管就是来一个光子,通过雪崩气穿,一个光子激发电子。
然后有很多电极去给反复加速,就一次一个光子来,就会产生一个大的一个反复加速的过程,就会产生一个比较快的信号,这个性道比是比较高的,但是光电倍增管这个东西比较贵,可能全世界可能只有一家日本的叫冰松光电。
是可以做光电倍增管的,还比较好玩,像CASCO的Ray Tubes,像SPED,SPED跟QRS这两年是比较火的,这是两个是激素形象机,这SPED咋回事呢,就是我这个APD工作在盖格模式。
就是我工作在反向极端区,来一光子就会触发雪崩,所以说叫雪崩光电极管,把它做成阵列,就是做成一个图像传感器了,这个用处就非常多,可以做3D探测,或者非视域成像,或者很灵敏的一些探测,当然它最主要的还是。
生物预设的一个Florescent Laptime Imaging,还有一种叫QRS,Quantum Image Sensor,它是可以获取在暗处比较好的一个心造笔,因为它也是一个激素形象机。
就是跟SPED的区别,就是它没有一个TDC,没有一个时间的一个转化电路,还比较好玩的,像2Bucket Sensor,就是我一个传感器后面有两个积分的尺子,我可以通过一个开关。
去选在哪个switch里面去积分,这个时候就可以在实际上去做调制,我既可以做Debray,也可以去做像ATR,就是比非常多的应用,大家可以搜一搜相关的论文,还有像PMD,就是大家所谓的Itof。
Indirect Time of Flight,还有很多,像不同的一些感光元件,它有一个不一样的拼图响应范围,我们可以看到,像这个CCD,就是它在近红外其实是比较敏感,然后CMOS。
它是大概是可以做到380到1100,这么一个范围,下面人眼大概就集中到550,所以大家可以对比看一下,不好意思又超时了,这个我讲快点,然后给大家讲一下Noise,Noise怎么形成的吗。
首先我们光子就打到传感器,因为我们光子到达传感器的一个过程,在一个比较短的时间内,大家可以看它是一个相互不相干的过程,就是一个破松过程,光子过来之后,它是随机的一个到达了这么一个东西。
所以说最后形成的分布,就是一个破松content的一个过程,就我们最后拿到的分布是一个破松分布,这是第一道造成的,就是破松content noise,这个造成无论是你后面的传感器,设计的多么好多么完美。
这个造成是永远存在的,就是你只要物理信号它里面就是这样的,还有像受限于传感器本身加工的一些问题,它会有一个fixed pattern noise,就是它我们不抠黑电瓶的时候。
就我们会看到它有一个条纹一样的那种形状,一个fixed pattern noise,这个在红外成像里面,fixed pattern noise是特别明显。
然后像additive noise受限于amplifier,包括感光度iso的调节跟争议的调节,也会有一些额外的造成,最后ADC采样的时候,我们受限于ADC的位数,就是到模拟到数字转化的一个过程。
比如我转化到10位,我一个模拟信号量的尾巴都丢了,就会有一个contentization noise,然后最后我们就拿到了这么一个绕图像,其实这个噪声其实是很多成像系统。
包括我们计算成像系统的一个最大的限制,它基本上就是比较坏的一个东西,它来源也非常多,包括热噪声,电磁噪声,就是放大噪声,就增益带来的噪声,光电转化的噪声,还有像坏了一些pixel的点,就非常多。
但是比较经典的就是两种造成模型,一个就是高斯,第二个就是婆松,像高斯噪声基本上有像热噪声,就是readout noise。
还有amplifier noise,它是一个跟信号无关的一个噪声,就我可以看到它最后跟噪声叠加是这么一个效果,它跟信号的强度关系不大,但实际的情况下,这个噪声大部分还是以婆松噪声。
特别是按的时候以婆松噪声为主。
它是跟信号本身相关的,因为我们最后光子抵达传感器,它是一个婆松过程,我们可以看到一个婆松分布,我们来n个传感器的时候,我最后sigma就是,就是我最后搜集到的一个光线的分布是一个2n。
sigma是一个2n,2n分布的时候就是更换2n,它也不是一个变化的过程,但是我们不断变化n,n非常大的时候,比如上面这个公式,这个lambda非常大的时候,我们用一个近似,这个lambda我这么大。
最后大家算一算,发现这个就变成高斯分布了,它是一个extential的,这个是非常有意思的,就是我们婆松噪声,婆松过程,抗听过程就不断变大的时候,光比较亮的时候,光的数足够多。
我噪声分布就变成一个高斯分布了,整个心造比的计算实际上就是,我最后pixel value的一个。
跟我最后pixel的一个,standard rotation的一个比值,实际上就是signal跟noise的一个比值,它是,比如说我们有这么p定义为,我们来的一个photon flux。
就是给来的光子数,然后乘以它的qe,就是我最后转让成电子的过程,对不对,然后通过一定时间的积分,就是拿到总的光子数,然后受限于dark current,或者是一些本身的,一些器件的一个影响,有个dt。
然后n是一个radio-off noise,我们发现,这个光强越强,SNR越高,但随着光强越强,比如说光子数越多,它本身噪声分布实际上是更大的,噪声是更大的,但它心造比会提高,就很多。
就大家做CV的同学,对这一块可能不是很敏感,大家有时候做去噪,基本上都是拿来高斯造成去做的,但最后发现,用到手机参考器,或者是用到成像的时候,实际效果并不是很好,就是因为对这个噪声模型。
并没有做到一个很好的分析,这些scientific sensor,就是比如说scientific CMOS,SCMOS,或者是一些比较好的CCD,它可以做制冷,就是很多噪声是可以避免掉的。
这个时候在生物荧光寿命,或者是比较弱的情况下,就比较有用的,但是其实制冷,就所有的噪声我都可以干掉,但是本身的photon content noise,就是这个photon content的过程。
是没有办法去除的,这个噪声是永远存在的,所以说说到这个photon噪声,我们干脆第三个作业,就给大家布置一个,就是photon噪声的denoise,说到一个曝光,曝光也很重要。
就是比如说我们这时候要拍一个。
比较快的一个photography,就比较快的过程,这时候我们针跟针之间的一个时间,是非常短的,就我需要比较短的一个曝光的过程,然后除了这个,因为我还要能量比较强,要不然我在短时间内光子数比较少。
我就需要一个比较强的一个照明,然后第三个就是我需要一个,同步的一个情况,我触发我的相机去补,因为我们会首先存储,我们不可能把所有的数据都存的,对不对,这是一个长曝光,你飞机起飞。
飞机翅膀上就有灯了,通过这么一个长曝光,我们可以看到轨迹是非常漂亮,飞机拉升,然后平稳,然后再去平稳飞的一个过程,我最后的一个曝光,它这个。
Q就是时间乘上它的一个,irradiance,我们曝光时间T,它是为什么控制,它是被一个shutter控制的,大家所谓的一个快门,这快门现在也有机械快门跟电子快门,还有它的irradiance。
最后我的光能达到,我传感器上的这么一个能量,这个是被,F数来控制的,就是,Aperture size跟Focal length,两个因素共同决定的,实际上就是F数,F数越小,曝光量越大。
所以我们可以看到,曝光1/3秒的时候,拖影只有这么长,曝光,当我想要拿到相同的曝光量,我把F数再调大一点,然后曝光两秒,这个就拖了那么长了,所以说,Aperture本身,是跟运动之间。
它是有一个天然的矛盾的,然后说到一个概念。
就是Exposure levels,我们通常用stop来说这个事,我们像,一个stop,就是两倍的曝光量,我们可以看到,中间那些正常曝光,我们按一个stop,就是削弱两倍,跟增强两倍。
就是到右边那个感觉,实际上我们,有时候人眼,我们把动态范围,有时候也用stop来表示,比如说像,相机,我们的动态范围,是比如说用12个stop,或者14个stop,实际上很简单,就是相机最后是多少位。
大概就是多少个stop,然后本身我们控制。
曝光的一个三要素,它是一个Aperture,就是我的光圈,我的shutter speed,就是我的快门,还有最后的一个,感光度的一个调节,因为现在很多感光度的调节,基本上就是模拟过数字的增益。
大家可以看到,像这么一张图,就我最后我随着光圈越来越大,我最后的景深是越来越小的,对不对,然后但是大家可以看到,我的曝光时间越长,然后对运动的模糊,就越不好,对不对,所以说景深跟运动的模糊,跟曝光时间。
通常是有一个矛盾的这么一个点,然后最下面是我们就不断调到ISO,就在相同的一个光线启存架,就是相同的其他几个变量都一样,我们就调大感光度,感光度越高,它的噪声是越大的,这个ISO本身设计是为了放大信号。
提高它的信号比例,所以说大家有时候在特别暗的时候,是可以调通过调节ISO,现在基本上就是定义为模拟增力,来去提高一下我们这个成像的质量,反正Fnumber我们刚才讲到。
它是一个F数跟diameter的一个比值。
就比较常见的一个F数,在我们现实生活中就比较常见的1。4,2 2。8,最小可能做到32,一个小口径的一个透镜,就一个stop,就是对我们整个成像的一个曝光程度是翻倍的,然后我们最后怎么记这个F数呢。
就是我们比如说F数是2,我们写就是f小f-2,或是大F2这么一个写法,就是它的F数,然后我们控制整个曝光,基本上就是用通过三个,就是光圈快门速度,还有最后感光度,这三个共同的值,来控制我们的曝光。
Fsize很简单,就是我们进光量,然后shutter speed就是控制曝光时间,ISO就是模拟增益,最后来一起决定了曝光值,这是列举的一些不同Fstop,就在比如说我们最后拿到一个相同的曝光情况下。
我们F数跟shutter speed这么一个关系,就F数越大的时候,我曝光时间就需要越长,说到感光度,还是给大家多讲一些,感光度这个叫ISO,它是衡量底片对光的一个灵敏程度,它是由敏感度的测量学。
测量得到这个数值,其实数码相机并不存在一个底片,然后底片上的一些化学反应,这时候这个ISO就是类似于胶片上的一个ISO的指标,是一种等效的感光度,就是我们数码相机的一个ISO,它是一个等效的感光度。
它也是一个传感器的一个比较标准的参数,就是它表示着每个像素能感受光信息能力的强弱,比如说光圈、跨媒我们都不变,我获取光强度的一个能力越强,就是在同等条件下获得更高的一个曝光。
也就是说我抓到更多的一个光信息,实际上其实我们现在的一个数码的传感器,它的ISO是调节光线的灵敏程度,通常就是模拟增益,就是我们有一个ADC,也不止叫运放,Amplifier,来去给它做一个模拟的放大。
之后再去采样,但这个ISO跟增益之间的关系,有时候同学们会混淆,就不同的相机,就是原生的感光度是不一样的,而且这个增益又是在原生的感光度基础上进行操作,所以说单缩增益,对很多相机来说就没有办法互通。
但是ISO是相当于对增益做了一个标准化,就是大家把这个增益标准化,就统一说成ISO,本身我们这个传感器,刚才说到了,第一个它是一个模拟的放大,采样之前的模拟放大,第二个它是一个比较现进的一个过程。
比如ISO200,实际上它需要的进光量等于,在按一倍的情况下去,等于ISO100,它是一个比较现进的过程,100 200 300 400,就是一个直接这么一个现进的一个过程。
这对比一下我们就是在一个相同曝光度。
我们就实际上不一样的ISO,它对应的一个噪声程度,实际上就是越往后,ISO越大,实际上它的这个光圈是一定的,就是它的这个场景越暗,越暗的话,它就经过放大之后,噪声就比较明显,给大家看一下。
就是这个物理上的快门,你看到这么一个快门,这个快门的速度实际上是非常快的。
这个也是人类机械工艺的巅峰之作。
很多比较好的快门可以做到,很精确的8000分之一秒的这么一个shutter speed,当然有这个shutter speed的。
就是这个曝光快门的速度,就会有一个很大的问题,比如说曝光时间比较长的时候,像我们物体运动或者是手抖,都会造成图像的模糊,有时候现在大家需要加光圈防抖,或者是降低一些对一些手抖的人。
就是我减少一下曝光时间,那就来换取一个比较清晰的图像,但最好的是大家直接就用一个三脚架,把那个相机固定住,这个就是最好的,当然现在随着技术的进步,云台越来越多了,其实大家搞一个手持云台。
或者是这种拖着的云台,就可以保证我的相机始终是不晃,这个时候就会拍的效果比较好,比如说像我们曝光时间长。
就是shutter speed比较慢的时候,就会产生这么一个模糊,快的时候就还好,本身除了我们机械快门。
还是有很多电子快门,电子快门我曝光之后我要去reset,reset之后我又可以再去曝光了,像我们有一种叫rolling shutter,就是叫卷连快门,就是我一行曝光完,reset一下,再一行曝光完。
再reset一下,我这一行曝光,一行reset,这个时候每次搞那么一行,我这个物体动的时候会怎么办呢,或者是我的摄像头动,这怎么办,就会产生一种叫rolling shutter的artifact。
也就是所谓的果冻效应,大家可以看到,就我侧面好家伙来了一个rolling shutter,我前面那一行跟后面那一行,曝光时间不一样,这个时候就会产生倾斜的,这么一种果冻效应。
这个在飞机螺旋桨看起来是特别明显,大家可以看到右边飞机螺旋桨拍的图片,出现rolling shutter之后,这个就已经不像螺旋桨了,对土豪妹同学说的一个,攻击脑袋就能做云台,对了,这个是现在的云台。
基本上就是基建于击头效应,通过击头效应来去做一个激情的预反馈,就有很多实际上日常生活中的一些,这种效应都可以做成一些产品,比如说平衡车,平衡车的一个原理就是倒立摆,就是我怎么去让一个摆立起来,这么远。
就是人实际上就是一个杆,把它当成一个杆,平衡车就当成一个摆,这攻击击头就可以做成云台,就通过一个预交阵去把,通过电击去反向的控制来补偿这么一个运动,所以大家有的比较有意思的,爱玩激情运动的时候。
比如骑自行车,我把摄像头绑在一个机脑袋上,我背着这个机去爬山也是没有问题的,说这个rolling shutter。
就是这种果冻效应,大家可以看到比较快的速度,会产生一些artifacts,比如像这种变形,这种是不可避免的,为什么,刚才讲到的,它一行曝光一行reset,一行曝光一行reset。
最后最上面那一行跟最下面那一行,就会产生一个时间差,因为我rolling shutter,是为什么要用rolling shutter呢,主要是为了快,这个rolling shutter是真的很快。
我一行读完,边读这一行就是这一行曝光完之后,我边读我就边曝光下一行,边读曝光下一行,好处是非常快,然后坏处就是,上面跟下面曝光时间不一样,所以说根据这种缺陷,大家就搞了个global shutter。
我一次性就曝光整张的,对不对,但是global shutter就需要,在内存里面去缓存一帧,就是我们也可能是一个RAM,就是block RAM,在我片上block RAM去缓存一帧。
缓存一帧就会有一帧的延时,就没有rolling shutter快,反正就没有很理想的,这么一个最后的一个,这个看过了,这些rolling shutter的一些效应。
就刚才讲到一个整个景深。
跟我的motion blur,它是一个矛盾的,就为什么,我景深就对应了Aperture,Aperture大了,然后我Aperture小了之后,Aperture大了之后,我曝光时间就越短,它的景深就越小。
所以Aperture小了之后,我需要获得相同的曝光度,需要增加它的一个曝光时间,这个时候有运动的时候,就会有motion blur,所以刚才讲的就是depth of field。
跟motion blur,它是一个天然的,很矛盾的这么一个点,这是一些,但是一些比较浅的一个depth of field,其实是可以比较产生一个,比较强的一些影响力的,比如大家拍。
人头的一个人的一个像的时候,我对背景虚化,实际上对这个和拍的目标,是做了一个突出的,对不对,大家可以看到左右两张图,我们左边就很容易的,就注意到前面这个花,右边之后,就是整个画面都是满的。
就是就很难看到哪个是主体,所以为什么拍照的时候,有时候就喜欢搞背景虚化这些东西,这个动态范围稍微讲一讲。
时间不够了,就是大概人眼的一个,就是luminous一个动态范围,它是6。5,这个上面写的不是很准,就是Sony BROKE Technology写的,本身的现在display的一个luminous。
差不多就是三个数量级,就是10^3 1000比1,差不多这么个概念,现在好一点的H。2显示器,可以得到1万比1,和100万比1可能也有,但是就是那个比较专业的显示器了,像那个叫什么。
叫日本的一个是日本的吗,不是叫一卓那家公司,就有一个非常专业的H。2显示器,它是两层LCD交合在一起的,每一层的大概是1000比1,两层按像素交合在一起,就是100万比1,这是一个很贵的显示器。
之前我们买过一台花了20多万,然后这个就可以做一些,光处理做参考,人眼差不多105这么一个,挺大的一个就是1万,就是105就是10万了,这么一个级别,说到H。2显示,就不得不提。
现在就比较大家廉价生产了。
能遇到的一个,LCD的一个动态背光的技术,就是我们在一个,就我们现在背光很多,以前传统的都是一个,均匀的一个背光板,想要产生一个动态的一个范围,就比如在低频的一个效应里面,就产生一个比较好的。
动态范围的感觉,就可以在后面的背光里面,就用一个小LED,就一个低频的LED去灯珠去做,就是照明,然后前面高频率的LCD,这个时候,这个就叫bright technology。
这个是我导师Wolfgang,提出来的一个技术,现在已经被工业界广泛应用,retracing lens。
real lens,下一课再讲,因为这一课已经时间太长了。
就对整个我们用光线追踪的方法,去怎么样去实现一个,对一个真的一个透镜的光线追踪。
就到下一节课讲吧。
今天就讲了这么多内容,就覆盖到了相机的介绍,imaging optics,Aperture depth of field,其实整个相机里面的一个基础流程,是大概就这样,下一节课会给大家讲一下。
我相机设计成怎么样,最后拿到一个彩图,这个彩图是怎么拿到的,这个叫image signal processing pipeline,然后这个也是大家第一次作业。
下一节课会把这个image processing pipeline,去好好讲一下,大家可以消化一下这节课的内容,就因为这一课是下一节课的基础,有什么问题的话可以快速问一下,这位ZYF同学问。
像素主像素分别控制曝光,有希望广泛应用吗,其实这个东西主要是控制起来比较困难,成本比较高,其实这个广泛应用的一个前提,就无论是大家生活中里面用什么东西,它能广泛应用的一个前提就是成本比较低。
做下来才是可以的,这个LAMP CG同学是ISO是增益,还有存在的必要吗,这个是非常有必要的,因为是特别是在暗光情况下,就是比如说我这个信号已经比我们最后ADC的,最后最小的一位还要低。
如果我们不加一个模拟的增益的话,这个图像是采不到的,就是纯黑了一片,所以说ISO的增益是非常必要的,它在一定的程度上是可以提高它的信道比的,同学们既然没有别的问题,我就谢谢大家。
就欢迎大家听Gamker204,就是计算真相是还是非常有意思的,后面课程会越来越有意思,我们会讲得越来越深,谢谢大家。
05.图像信号处理 | GAMES204-计算成像 - P1 - GAMES-Webinar - BV1YB4y1b7VH
好时间差不多了,那我们今天就开始吧,首先欢迎同学们回到204计算成像的课堂,今天要给大家分享一个主题是image signal profession。
有时候也叫image signal professor,也就是大家常说的image i hp,这个前节课我们讲到这整个成像的过程,相机成像的过程我们可以调光圈啊,嗯去调曝光了,然后去调白平衡了。
然后他整个我们拿到了图像,到我们最后可以呈现出来的图像,这些经历了怎样的过程,就是要今天来揭晓这一个答案,也就是image signal processing。
今天的这个课程结构啊,只是这样,就是我们就是根据它的一个处理的一个域来做了一个简单的分类呃,首先呢就是一个bear bear y,因为我们的传感器就会有一些i p t d啊。
或者是其他的一些嗯这样颜色排列的一个白金装片,就我们传感器拿到了图像,呃,其实已经是这样一个呃分布的一种财富的一种呃,原始向我们在这个原始图像域里面需要做呃,像校警校正啊啊是黑电平校正啊,去造啊。
但格利亚包括像风筝cd collection,就是大家所说的那种啊电音电音的教程,还有一个像盘子啊,然后经过这么一系列的处理,到一个关键环节,也就是去马赛克,我可以调一下,声音比较小,现在呢。
现在声音还小吗,呃我们到了一个关键的环节,就是去马赛克,然后去马赛克呢实际上就是一个color theory information的一个问题,就是我们差值差到这么空缺的位置。
然后推出一个rgb 3星号的一个值,但是这个时候我们拿到的图像还是有一些颜色的色偏啊,所以说接下来一个步骤,我们需要在h e或者是一个y v e去做一个颜色的矫正。
通常我们用一个颜色的一个矩阵去做一个简单的乘法就好了,再来更复杂的一些需要更精准的一个教材,我们可以用直接look up table,然后呢我们需要对边缘精彩,因为我们经过一系列处理嗯,一底噪。
要不就换个机,等下,我想去换个,只有右声道,看看加一个什么处理会不会好,也可能是那个风扇声音太大了,所以说搞了不少伤,就这样好,有没有怀旧,这还有到他们同学,嗯,增加平衡思路在低,哦我知道了。
只有单声道,我看看哈,等一下,你现在呢有没有好一些,那我们继续吧,就是我之前经过一系列的处理处理啊,诶现在是好还是不好呢,零现在又有造型了,这样吧,这样是好还是不好,不好看不好,现在呢,我把这个重新。
现在呢现在好了吗,我换了一个usb的一个网卡声卡,零,还有嗯真的换一个,还没告诉你不知道。
微微,嗯现在呢。
诶现在声音怎么样,有没有变好,我换了个耳机,然后我们继续呃,刚才说到了这个这个为什么要做这个age enhancement,就是我们之前做了很,我们之前做了很多的这个,我之前做了很多的这个处理之后。
他的很多边缘会变得模糊,也就是我们会有一些高频分量的损失,这时候我们要拿到一个比较锐利的图像,这个时候我们是想对它的边缘进行做一些增强的,而且呃还有一个什么问题呢,就是我们在去马赛克之后。
就有一些他的一些就是伪彩色的出现,就是我们也叫false carry,呃,我们要对这个伪彩色进行抑制,就是我们不想让它那些边缘的地方会出现一些不好的,一些像彩虹一样的一些色彩。
最后我们要对它的一个亮度呀,对比度啊,呃进行一个变换,这就是一个控制,然后在显示给大家的时候,我们要做做一个伽马的一个拉链的一个就是一种调节,然后还需要去做套白品,因为我们最后我们其实拿到了一个图像。
可能它的位数非常多,也可能是十位的,也可能是14位的,所以说这个时候我们想要让我们最后拿到了这个更好的,就是我们想嗯就需要对它一个动态范围进行压缩,实际上也就是tmap的一个过程。
然后到最后我们就也可以做一些简单的一些节拍的压缩呀,最后就拿到了你们最后可以看到的一张图片,啊这个一我们已经上了四节课了,所以说现在想要给大家先把这个作业布置下去,就是第一个assignment。
这整个第一个assignment大概就是这节课覆盖的内容啊,呃就是我们要第一个assignment就是去实现一个基础的image signal processing,太烂。
包括在外的一个processing,这个占总共100分哈,这个占50分,嗯,就是that gives correction,然后black level conversion就是黑店名叫正十分。
就我这里会大概讲到两种制造的方法,呃,就包括像nal in跟dmd,这个我们后面会再造声那一节,去单门去讲这一节,所以说这个大家可以看一看,就是先提前留意一下这个事情。
然后啊就是有一个简单的antilain可以在十分去马赛克二分,因为去马赛克还是比较重要的,然后在其他的意义大概从color correction嗯,边缘增强false pression嗯。
还有伽马tmap,这个要tmap这个问题会比较重要一些,所以说这个才20分,就整个嗯我们会把那个cold framework,还有还有一些拍到的数据啊,通过这个课程系统叫c e s阿尔法。
有一个新系统嗯,在周末的话可以给大家放出去,这个dd呢就是8月15号的11:59,因为这assement to是啊mone的延伸版呃,就包括了像图像的一些牢狱的图像的融合去做hdr,然后还做一些呃。
有可能会涉及一些就不乐呀,安妮普乐呀,就是local tommy,就是local toming啊,嗯还有一些像嗯也有可能会覆盖到那个就cross channel prior。
就是颜色通道的一个边缘对齐的一个问题,就是第二次作业的是第一次作业的一个延伸,所以说第一次作业,大家同学们尽可能的去用最短的时间去把这个效果调到最好,当然有精力的同学也可以沿着这个作业去往下再做一下。
就是尽可能的让视觉效果达到最好,因为我们计算成像啊,计算摄影除了嗯本身它是一个科学以外,它还是一个艺术性比较强的东西,就我们最后想拍到的东西嗯,除了跟就是科学理论有关系,它更多的是对人的眼睛。
还有心理学相关的一个,它是让人愉悦的一种过程,就说我会给大家一张参考了一张图片,然后大家可以根据这张参考图就去,然后把这个饶图去往上面调节啊,然后大家也可以做一些自己想要的一些尝试啊。
啊这个都是都是有加分的,我们就统一都用python写好了,而且给大家说一下,就是整个cold framework,就是大家自己写好了,也尽量不要在就不要尽量了,就不要在这个公网上就放出来。
包括像github呀,或者是呃那个step of flow就能放出来,因为这一放出来就是明年的同学们就不大好用,啊这个就参考了很多像open sp啊。
啊包括wolf from page老师ng lv laya的一些资料,就是上节课我们说到这个我们这个color filter rea,它是一项比较经典的,就是rg g b的一个排列。
然后我们在一个灰度的一个就是一个cmos和ccd的一个图像传感器,前面放了这么一个cut,福特锐,我们最后踩到了图像啊,就是他会拿到一个就是四个通道的,一个在在这么一个平面上的一个分布啊。
然后我们最后拿到的图像,其实我们要直接看的话,可能是非常难看的,就是我没有办法直接理解这么一个排列的一个图像是什么样子嗯,但是但是为了拿到这个图啊。
首先我们要把这个image formation去来说出来,就是我们从物理世界中嗯,然后到了我们传感器上,究竟它这个过程是怎么样的,那这个本身啊我们的物理世界就是我们第一节课讲到了,就整个物理世界第一。
它是有一个非常多维度的,就包括我们生活中的空间,它是一个三维的,然后光呀光有自己的性质,就比如说像相位啊,呃角度啊,偏振态呀,波长啊,而且我们整个的场景也是随时间变化的。
所以说就会拿到这么一个fly optic function,这个叫中文叫什么呢,呃这个就是所谓的全光函数ln这个前缀啊,line这个前缀啊,我给大家写一下哈,可能这个前缀有一个意思呢。
就是全能的万金油的意思,然后我们可以通过这么一个全功函数来完整的描述,整个光在空间中是怎么分布的,这个概念最早是1939年啊,由高盛的一篇论文里面和提出的。
后来被anderson和burger在就是90年代在论文中完善,并给出了我们最后的一个全光函数的一个形式,就简单的来说,这整个全包函数可以描述空间中任意一点,就是任意一个点。
然后穿过这个点的一个光线的一些强度啊,包括描述这整个全光函数,它是一个就是也就是大家常说的一个所谓的一个广场的一个函数,这广场函数有多少个维度,到至今来说一直也是个谜题,就大家有兴趣的话可以参照一下。
这个就邵晓鹏老师的有一个关于就是计算成像的专栏,它里面专门讲到了一个光场,还有全国函数的这么一个问题,但一般哈大家就是通常理解为这个全国函数为七维,也就是呃xyz就是空间为呃,角度为下位为。
还有一个像大家在这里看到了一个跟它的一个波长相关,但随时间变化就是像动画呀,还有一个就是跟它的偏振态相关,就是包括横片呃,纵片这些各各种各样的信息,整个就构成了这么一个全功函数。
但我们目前所接触到的是一个成像,就把这个情况还是稍微搜了一下,我们其实我们可以看到在我们最后拿到图像传感器上这么一个积分啊,有很多都可以忽略掉,就是我们只考虑我们的角度啊,波长啊。
还有时间在我们传感器上拿到的积分,这样的话就是实际上我们拿到了一个像素值,到最后,当我们拿到了像素值,我们最后怎么突,就是我们的相机是怎么样捕获到这个像素值呢,首先就是还要感谢爱因斯坦发现了光电效应。
我们的这个光子打到传感器上,然后上节课讲到了,就是会激发那种呃空穴对,电子空穴对,然后在电场作用下,然后被整个就是后面的一个叫vil capacitor去捕捉到,然后经过一些放大呀。
就就是我的传感器传感器在这个时候啊,就会有一个因为受限于传感器本身的一个加工的一个问题,就会有一个fix pattern noise,就是我们这是加工工艺跟电流的一些影响啊。
它有一个fix patternoise,然后我们在这个积分的一个井里面,我们就叫井里面,然后通过一些放大呀,包括呃有一些模拟的增益啊,或者iso把这个信号就是电信号放大放大之后。
我们通过一个analog to dividual converter,也就是a d c就是模拟数字转换器,把这个模放大后扣的模拟信号转换成数字信号,最后就拿到了我们这个饶头像。
但这过程中会有大概呃四种主要的一些噪声啊,就包括呃光子在积分的过程中,我们上节课讲到了一些嗯就是photo noise,就是整个泊松过程的一个noise,然后第二个就是游戏,就是传感器本身的电路啊。
还有一些工艺引起的一些fake peternoise,然后还有一些在增益过程中引入的noise,还有最后一个量化噪声,就是为我模拟到数字转换,假如说我有个八位的一个a d c。
就是我最小的那一部分就就被就被干掉了,这个时候就会有一个a d c就qualization noise,最后我们就拿到了一个rog图像,但我们可以看到左边那个图啊,就是我们实际上拿到了这么一个绕图。
它本身是没有颜色的哈,我们拿到这个图啊,我们可以看到它是rgg b4 个通道,然后经过这么一个绿光,然后在传感器上直接拿到了一个值,我们要直接用d c r,然后去打开的话。
这个导图看的就是一个就是灰不隆咚的一张黑白图啊,怎么样去转换到我们就是实际日常生活中,看到了这么一个漂亮的一个彩图呢,我们又需要经过那今天讲到的一系列的过程来实现这么一个呃。
由饶土到最后拿到了一个漂亮的彩图的这么一个过程,但是这个过程就包含了比较多的一些内容,就包括像,dark cos correction,呃,还有hot dtc correction。
也就是我们要去掉它的一个一些坏点,然后去做一些呃建运的教授叫vnt,也就是呃大家有时说的lcd lcting其实就是呃透镜的禁运,就是它是由透镜本身呃引起的一种问题,当然还有一些彩色的一些建议。
大家待会可以给大家详细的讲到,然后我们拿到这么一张彩图,在各个通道我们要做一个白平衡,我们要在一个我们想要的色温下,或者是想要的白点一下就拿到,我们就是就是一个最好的一个白色的一个点。
这样的话我对我们整个的一个颜色的控制就可以就比较好,还可以做一些呃自动曝光呀,呃去做and distortion嗯,然后呢本身由于我们就采样的过程啊,就是因为我们是用那个卡拉菲特瑞采用的过程中。
它是间隔采样的,就会有一些allazing artifacts,这个时候我们要做一个呃反怎样的过程,就是实际上也就是一个低通滤波器,但是怎么去设计这个低通滤波器,在这里面学问很多。
我们又不想丢掉我们的边缘,但是与此同时又想尽可能的就去掉这个aza带来的影响,就退学,学里面学的alyzing非常多啊,包括像超采样,超采样,还有一些而且包括fter啊等等一些方法。
但是有很多方法就是我们不能太随心所欲的,像图形学里面就是因为我们物物体是已知,这个时候我们解的是逆问题,就我们可能就只能采取一些嗯,就是就以前有很多放弃。
很多就是没办法随心所欲的一些措施来去设计一下它的antvc puter,最后来重建一个比较好的效果,那去马赛克啊,其实是整个sp里面的众筹之众,就实际上就是差值过程,就我们这个差值过程你要插不好呢。
就很容易引起这个就边缘的色彩的一个微踩,而且还会插不好呢,还会有一些呃细节和频率的损失,然后去马赛克嗯,所以经历了这么多年啊,去马赛克算法嗯,每个几十种也得有上百种,就是非常多,但是各有各的优劣。
到今天为止,去马赛克人世界中的一个比较热的一个课题,如何快速的嗯高效的,然后没有围采的就不丢失细节的去马赛克啊,这一直是整个呃计算摄影啊,包括传统成像领域的一个研究热点啊。
包括还有一些age enhancement呀,color correction呢还去做动态范围的压缩来显示呃,其实也就是对细节进行一个增强,那最后可能会有一些像jpc的一些压缩,这节课就可能覆盖不到。
下节课给大家稍微说一下。
整个的image processing pi大概就是这么一个流程,从某图像传感器呃,然后第一步我们就要把坏点抠掉,因为这个有一些坏点啊,他会对后续的后续的一些操作进行不好的影响。
比如说我这个点一直在闪烁啊,这个点一直是黑的,这个点一直是亮了,这对我们后续操作也不好的影响,那这个时候我们就第一步要先把这个快点干掉,然后第二步呢呃就是要做黑电瓶的意志,为什么会有这个黑电瓶的问题。
呃,这个黑电平这个历史上也挺复杂的,就是有时候为了保留暗部的细节啊,就是大家一起传统的公司,为了保留暗部的细节,就是我在我们a d c,因为我们a d c采样的位置有限。
所以说这个时候大家会在那个采样之前会给一个偏压,尽可能的去让这个暗部的细节可以被踩到,但是除了这个还有一些像本体电流的一些影响,就是它在黑的地方就不可能是零,那基于这些原因呢,就是我们要对黑电平进行。
就是早早的进行校正,如果不叫它黑电平检查,会有那很大的后果了,就是它会有一种灰蒙蒙的感觉,这个后面会给大家详细讲到,然后要快速的去做这个length setting correction。
然后嗯然后去做去噪,因为以前的传统的i s p去噪的时候,通常就在后面的情况下,但是就是近些年人们发现啊,包括现在大部分的手机摄影,很多时候要把这个noise放到扰动脉,这为什么呢。
因为就是我们的传感器啊,基本上它的一个捕获的积分的一个过程,它可以近似为看成一个线性,我没有在做太多的处理之后,我们本身造成的一个分布就是没有被破坏,也就是说我们噪声的一个表现形式没有变得更复杂。
这个时候处理我的噪声其实可以拿到一个最好的一个效果,所以说现在的一个modern i s t通常都是把这个牢狱的渠道呃,来做到一个拍拍里面,它还有一些3a就包括自动对焦呃,这个这个自动曝光。
还有一个就是呃自动白平衡这3a呢,所以它有一个反馈的回路,是可以对整个输入的镜头啊,然后还有一些链路进行一个动态的一个调解啊,这个前面这一部分就是牢狱的一个处理,疗愈处理完之后,哎这个我们做个差值。
做个卡拉夫特respiration就到了,rgb或者是也可以做个变换,去到我们讲到的vcr cp或者cv空间去做处理,这个时候我们查到一个拿到一个线性的图,我们可以快速的做了一个就是颜色的校正。
然后再去做伽马校正tmaking嗯,然后再转换我们的色彩啊,包括呃也可以,这个时候再进一部分的渠道,当然现在其实呃有非常好的算法在绕语里面去把这个噪声干掉,其实后面的有很多制造的方法就可以直接就扣掉。
但最后还是要做一些呃false color pression,还有一些还有赛车性的一些控制,然后再做边缘增强啊啊然后就是对比度和亮度的调节啊,最后拿到我们最想要的图像,这个图大家记住哈。
因为我们就是写作业的时候,要根据这个链路来去实现我们的这么一个第一次的一个assignment,就我们就是用单反拍相机的拍,就拍一个照的时候,我们就拿到了一个meta data。
就是就是我们这个参考的数据是什么样子呢,我们可以看到就是我可以拿到这个一些就是文件名啊,就是说这个是jpc一张图,然后可以拿到这个相机的型号,也可以拿到它报告时间f数啊。
还有像呃呃exposure的一些就是就是就是那个program这里面选的是一个mu,也可以看到就是它的一个偏执的一些值,还有最大的光圈值啊,那我们iso用了多少这个meta data嗯,这个就很重要。
所以说这第一次作业里面,我我用了一台佳能的相机给大家拍了一组呃图像,就整个meta data都是存在最后的一个dng的图里面,大家可以通过饶派呃去看到这个metadata。
因为这个metadata可以对后面的处理直接就去用它,当然这个代表框架我会给大家就把这些metadata嗯先给大家弄出来吧,先给大家弄出来,然后大家就可以直接在这个papi里面去用,下面来到正题。
就是我在待遇是如何做处理的,这个为什么第一个就是做了一个坏点矫正,为什么要做坏点校正呢,它是这个坏点是从怎么来的呢,就是坏点就是有时候也叫dead pixel,有时候也叫bad pixel。
就是他是就是图像传感器上光线采集点,就是这个像素点啊,在我最后加工的过程中,就是就做那个就是整个fabrication的一个工艺上的一个缺陷,然后或者是就是光信号转换成电信号的过程。
也可能后面后面电路的一个问题,就导致这个图像就是有可能是一直一直是低的,就是我一直是黑的,就大家从里面看到了这个that pixel,然后呢如果这个图像一直是亮的,这个就是叫hot pixel。
也就always high,还有叫stock pixel,这个就是他一直有一个灰度值,它既不亮也不暗,它就是一个固定的值,但除了这个这种一般啊,像我们列出来的这三种叫静态画点。
就是它一般都是不怎么动的哈,就是这个叫静态的,但除了这种静态的换点啊,还有动态的观点,就我一个像素啊,他跟着bling bling bling一直在闪,诶,这个时候就比这个静态的更难受。
因为这个静态的坏点啊,我们也可以标定一下,或者是可以直接记住,就是每次处理的时候诶就非常容易,那这个动态换点呢呃就比较麻烦了,就是我它是随着一些呃,比如说我们的温度升,就是变高了,传感器的温度变高了。
增益变化了,这个时候都会对这个坏点的一个闪烁呀,或者是值啊,就是有一个影响,所以说这个时候就就比较难过了,你为什么要把这个dp so放到最前面的,为什么要放到最前面处理,就如果这个图像存在坏点的话。
就我们后面的一些i s t,就比如说在插值或者去噪的时候或者滤波的时候,它会影响周围的一些像素的值啊,所以说我们一般都是在最前面去把这个坏点进行校正,而且这个有时候换点比较多的时候。
你要这时候来个去马赛克,这边缘就非常容易出现伪采了一些it fect,啊怎么去的呢,这个坏点去这个去除坏点大概两步走,第一步呢就是我需要检测到这个坏点,这个还是比较容易的啊,这个怎么去做这个坏点检测呢。
就是我们用了那么一个,首先哈这是我们拿出这一个rg g b4 个通道里面任意一个,就把这个中心设为p0 ,我们去做它这个八零域的一个差分,就我们看它的一个绝对值的一个差分。
然后如果这个difference就是这两个领域之间的一个差值,超过了一个threefold,我们设置一个thresh code的时候,哎这个时候我们就认为哎这个pixel有问题。
就直接判断这个pixel有问题,那如果呃这个没有超过这个threat错了,我们就是说哎这个没有问题,这个时候就可以把这个扣掉对,然后就因为我判断这个pixel有问题了,然后就需要进行第二步。
第二步是干啥呢,我我检测有问题了,就是我要把这个原来原有这个错误的值剔掉诶,这个时候一般大家是用一个差值这么一个做法,来去把这个就是坏掉的这个值插出来。
然后一般哈一个简单的一个做法就是用一个gradient base的future,这个怎么算呢,其实也很简单啊,就是我算这个p0 啊,跟p2 p7 之间,这么一个它的一个鬼点子,就四个方向的鬼点子嘛。
就是横竖斜着这几个方向,算到它的规定之后,我们找到它这个梯度最小的一个方向,就梯度最小的方向呢,我把这个呃比如说这个时候这么对值一来给它做一个一平均下,那个他这个值加上加一,为什么要加一呢。
因为怕有什么有的地方有零的过程就不好,然后这个时候再找个梯度最小的一个方向去把它这个插出来,这个就非常容易就可以把这个换脸抠掉,那第二步就是做这个黑电平校正,这个黑电瓶啊。
叫black level correction,因为这个黑就是我们拿到这个饶图啊,这个黑电瓶就是黑色数据的最低的一个值,也就是我们通常有时候指这个感光图像数据为零的时候,对应传感器的一个信号电平值。
就是我把整个摄像头给用那个摄像头盖儿盖住,这时候拍一张图诶,这个最小的值也就对应的这么一个黑电瓶,低电平形成的原因其实是挺复杂的,比如说我们的cmos传感器经过一系列的一个转化。
生成了一个绕图像的一个数据,我们就拿这个12位的一个最小差感器为例哈,这个12v的图像传感器,它最后能表现的一个像素值是0~4096,但实际我们a d c啊,就是一个12位的a d c就魔术转换芯片。
它的精度就没有办法把一些很小的一些模拟值啊,就转换成数字部分,就我这黑色小值比那个最小那一节,比如这二的12次方分之一还小,这时候就踩不到他,诶,这个时候咋整很多,就是这个传感器厂家就非常聪明。
就我现在我的这个模拟信号上加到一个偏压对吧,加到一个偏压之后,就固定的一个偏移量哈,然后再用这个ad去拆,这个时候嗯就是它会有一个最小的值,但是这个最小的值可以让暗部的细节完全保留。
但这个时候你要加一个偏压吧,就很多亮的地方就会有有,当然也不会太多哈,就是有一些亮亮亮的地方,它会过曝,这个时候就会损失一些细节,那这个也还好了,这个因为我们这个很多时候他的目的啊。
就是为了想找了一些暗部区域的一些细节,然后我们本身i s p后面还有一些呃,length shing correction,a w v啊,伽马呀,其实这个亮度量很很亮很亮的地方汇报一下。
然后这个事大家基本上也能忍,所以说最后通常大家去做了选择,就是保留暗部的细节,除了这个做一个本身给他一个偏压哈,就是就是整个传感器电路cc电路的本身还存在一个暗电流,就是导致在没有完全没有光照的情况下。
这个像素单位也会有一定的就是输出电压,而且按这个按电流啊其实也挺复杂的,按键按电流跟曝光时间,跟着我的增益都是有关系的,而且受限于工艺的问题,我这个按键流好家伙,跟在不同的像素区域。
他的那个值也是不一样的,这个时候有时候会说诶,大家有时候这个增益变大,发现电路的增益也变大了,这个按电流也变得增强,所以说有时候很多暗器啊会把那个在不同增益下减掉不一样的一个呃,黑电瓶。
比如说有有很多传感器要输出着的时候,为什么要把它也放到一个比较浅的位置呢,就是这个附加黑电瓶如果不去除干净,就是又要耗越复杂嘛,干扰的信息会影响后面整个ip的一个处理,会导致特别是一个白平衡。
自动白平衡的一个不准,就大家可以算一下哈,这个我们这个做黑电平校正啊,实际上其实也挺简单的,就是把这个后面这个值扣掉,那做白平衡的时候呃,如果你不把这个黑电瓶扣掉。
就会呃出现一些就是整体偏绿或者偏红的一种就是问题啊,而且会给大家一种蒙上一层雾的那种感觉,就是灰蒙蒙的那种感觉,现在主流的一些就是黑电平校正的一些方法,就有一些,比如说我硬件设计的时候。
直接就是很简单的,就是最简单的一种办法,就直接点了一个固定值,诶,我其他的不管了,然后第二个就是可以根据不同增益设定的一个不一样的固定值,但有的时候那些厂家会给一个黑电瓶,随着温度和增益的一个漂移曲线。
大家可以根据这个函数去来对这个黑电瓶进行校正,当然我还见过一些,因为我这本身是用过这个传感器的,我见过一些,就是有一些厂家啊,就把一些边缘的像素,就是比如说我们一个1920x1080那个像素。
实际的我们比如说像索尼的这个传感器,实际上我们拿到了这个图啊,会比这个图稍微大一点,就我们边缘还有那么两三行那个像素是就没有被读出来了,就是不是也不是没有被读出来,就没有就有有两有那么几行额外的像素。
这个额外的像素是干嘛的呢,它本身就是全黑的,就是前面给你全部涂黑,就是让你没有办法接触到外面的光,但这个时候我就可以实时的动态的检测出这个黑电平是多少诶,我最后把这个图像捕捉过来。
我根据那几行就参考了一个呃,一个像那那几行像素,然后那么一减,最后就可以拿到一个比较好的这么一个去黑电平的这么一个东西,而且这个值啊是一直是随着动态传感器的动态在变化。
就是这个时候去去去除这个效果会比较好,这antella呢其实就是比较好理解,就是大家上过图形学的课,那就不知道我们要就采样一个高频的一个图像的时候,因为一个比较低的一个采样率。
这个时候就会产生一些怎样的一个问题,就是说呃通常这个时候antilizing filter呃,大家加一个,其实这个时候对对对,一个饶狱的一个until lining也很简单,因为太简单了,就没有列出来。
实际上给大家画一下,这个就是,比如说这一个像素有,这么一个隔着几行的这么一个filter,大家用一用就可以了,这些中间都是零,这一个filter直接fter过去。
就是可以给很大程度的意义上这个analyzing filter啊,去去抑制它的一个怎样的一个问题,然后说到监狱呢就是类似cd。
这个有时候大家就叫剑玉哈,有时候有时候叫那个就类似cting,咋翻译啊,这个有点记不清了,这个它是由什么引起的呢,它实际上是由就是我们设计透镜的时候,它是有很一般我们的透镜是由一个或多个镜片组成的嘛。
而且这个是为什么呢,因为后方的一个原件就遮蔽了一些前方元件的一些公路,这个时候就会导致前端透镜离轴的,就是有效入射光减少,结果呢就是光的强度由中心向周围减弱。
这时候有时候我们在我们图像传感器拿到图像会发现呃,可能就是周围的一些亮度会变暗,可能会就是按照50%这么一种情况,也会有一些呃颜色的偏差,像一些color ching啊,这些问题。
这个就直接影响到了我们这个图像的一个整体效果,整个类似shing呢就是大概分呃,罗马试点就是亮度的均匀性跟一个color试点就是彩色的均匀性,这个亮度的经营性啊,就是大家可以看到这个图啊。
就是我们本身就是我们在这个我们整个出口的位置入射光线,光线首先就是我投影到了一个呃,首先我这是这个光被投影到这个像素上,然后呢这个像素我们可以看到随着这个角度的变大,然后我们看的这个光线啊。
假设是均匀的话,就会有一个cos的四次方的这么一个呃decrease的一个问题,但除了这个还有一些其他的,像刚才讲到的呃,透镜就遮挡问题的一些影响,就会产生一个亮度的一个禁运,然后彩色的界面就更复杂了。
就是由于就是我们这个镜头啊对不同,大概我想啊这个这个color设定可能大概有四种吧,大概有四种就产生的原因,就是第一种就是镜头对不同光谱光线的一个折射程度不一样。
就我们知道啊这个哦这个同学问只有边缘有黑电瓶吗,对,因为只有我不是是所有的,就是整个图像传感器的就是都会有这个黑电瓶的问题,它边缘是加两条黑边,让你去把这个黑边值采出来,就当黑电平校正。
然后就把它点掉用,然后我们哎我们回到这个cl city的问题,就我们刚才就是说到这第一种的一个原因呢,就是我们这个镜头因为对不一样的就是波长的光线折射程度不一样,这个时候就会导致入射光线的不同。
波长的光线落在我们传感器的一个位置不同,这时候就会引起一个cover设定的一个问题,还有第二个问题啊,就是我们有时候会用那个红外截止滤光片,为什么要拍彩色的图像,会加一个红外接的滤光片呢。
就是我们有时候加了一个rg d b filter之后,它本身就是我们自然界里面还是存在非常多的一个近红外的一个光,然后我们那个就是红色那个通道或者是其他的蓝色,绿色通道就绿不到。
这个滤不掉这个r fter说这个时候就会呃导致我们这个图像偏色,然后呢同时为了影响就是踢掉了这个镜头外,就是额外的一个影响,就会引起一个红外截止的一个滤光片,但是红外截止滤光片了这个膜呀。
嗯就是在我们角度比较大的时候,就是就是那个光线角度比较大的时候,就是红外光在我们这个红外截止滤光片的一个大盘射角上,会有一个比较强的反射,然后这个反射就比如说我这一个画完结局光线这一个大角度射过来。
反射之后,哎,经过我们这个镜头内部多次反射,诶,这个时候诶竟然被传感器看到了是吧,这个时候就会引起这个图像偏色的问题,当然还有一个呃就是也不是很常见啊,这个可能很多书上都没有讲到。
就是这个是传感器上的微透镜,他那个c r a与那个镜头的一个c r a就cherry angle,叫主观性的一个角度,就是我们这个维和天津店,有时候大家都是均匀排布,但实际上不是的。
特别是像一些就是广角的一些超广角的一些就是传感器啊,他为了适应那个大角度,然后为了提高一定的施工能力,诶我这个时候我这个mellia它是有一定的角度的。
这个时候v途径的角度要是跟我们主镜头的一个chef,安卓chef啊,叫什么主光线不匹配的时候,诶,我这个有时候,所以这一个一个通道就是说g我这个光像素哈,这个像素本来就都是透明的,基本上算是透明的。
我这个光线角度比较大的时候,诶,好家伙,我这一个光打到就穿过这个绿色通道之后,又打到旁边的一个红色通道了,诶这个时候也会出现像素之间的串扰,然后比如说整个光线都出现这个问题的时候。
这个时候就会产生一个比较明显的这么一个color ching,当然还有一个可能性就是大家标这个类似交际类似设定的时候,就是交通参数计算不准,也会引起这个color ching的问题,可能还有其他原因哈。
就我大概记得可能就是四种,这个叫他的时候,他咋叫呢,就是实际上其实也挺简单的,就是我们要对一个均匀的一个白光板,就是大家做那个就是这种视觉校正的时候,有一个均匀的一个白色的一个屏幕啊,或者一个白箱子。
这个时候拍的时候覆盖到整个视野,拍这么一张图,然后把这个图分成一个m3 ,成为了一个小块里面每个块儿,然后就乘一个系数,然后也有课,有时候有时候大家也是可以做成一个look up table。
去做一个查找表,去把这个边缘的增益给它增上了,他其实最后大家算的时候嗯也可以偷偷懒,就是比如说我用一个就二次,就是二维的一个曲面方程去拟合,哎,我拟合这么一个图,我只存这么一个方程。
结果我每次叫它的时候,我直接乘上这个方程对应的这个像素点的一个值,然后最后就可以拿到一个比较好的一个建议的一个焦点,那去造呢其实就是算法非常多啊,就包括大家以前学这个数字图像处理啊。
嗯或者学一些就是乱七八糟的一些方法,就就包括像呃双边滤波器啊,就是medium filter啊,像高斯滤波器啊,这些都各有各的优点和缺点,但是这个我不会覆盖这个内容哈。
我会讲一些就是我们真的觉得比较好的一些算法,就是第一个呢就是一个去噪的算法,叫ame not local me,呃这个是翻译过来就是非局部平均,这个时候是2005年吧。
最早由那个叫boss一个哥们儿提出来的这个算法,这个原理是啥呢,就是我们这个算法利用的是我们自然界的图像中啊,就我们就是随便拿一张自然界的图,它有非常多的冗余,就是我们这个哥哥。
然后有非常多的一些就自己相似的一些块应用这些块的自相似性呢,然后我们去找到一个匹配的一个相似块,然后去做一个平均诶,这个时候就可以很好的去掉一些像高斯噪声啊这么一个噪声,它本身利用的一个基本原理。
就是图像的一些特征的一些自相似性,这个是一个当然一一出来就有一个非常好的效果,就拿了工艺,刚开始呃,就一个非常好的效果,当然还有一个更好的就是叫block machine three d future。
叫就bm three d,就是叫也叫三维快匹配滤波,这个哪怕到了今天,这个是07年出来的,就哪怕这个b之一到了今天仍然是就是效果最好的算法之一,就包括b m b系列的一些这个算法的思想。
就是这个我仔细讲一讲啊,就跟a m是比较类似的,也是在这个图像里面寻找就是相似块的方法进行滤波,但这个时候这个这个bmg g比那个me还是复杂很多的,就是整个bm c d啊。
我们可以看到就也是寻找这些相似块,然后呃可以理解为就是做一个平均哈,然后最后这个他是到底是怎么做的呢,就是我们这个b m c d我们可以看到有下面那个图可以看到啊,大概还有两部分。
第一部分我们叫step one,叫基础估计,然后第二部分呃叫最终估计,然后每一步大家可以看到都有一个相似的一个部分,这block iation这个这两个部分都会有这个地方,啊这个这个地方扣掉。
这个有这么三个地方是可以直接给那个呃进似的哈,先说一下这个,然后这这三步就翻译成中文叫啥呢,一个叫grouping,也就是相似块分组,然后第二个就是呃collaborative filtering。
也就是协同滤波,然后第三个步骤就是呃做那么一个aggregation,也就是聚合,其实这里面也就对应了这一步两步,这个叫collaborative fitting,这个这个叫coloration。
三步一步两步三步诶,这这包括基础估计跟最终估计都是离不开这三步,首先说这个这个grouping啊,也就是我们要把这些相似的块垒的垒在一起,就比如说我们像一个噪声图像里面。
选择一个这个k8 k的一个大小的一个参照块,然后考虑到这个算法的复杂程度,我们可以隔那么几行,就隔那么几个像素去选一些,就可以大大提高它的一个速度,然后把这些参照块周围就是一个他一个锚定。
一个就是选定的一个区域,就是它可以说n n乘n的一个区域里面进行搜索,在这个n乘n的区域里面搜索到一个很多,就是就是特征相似的一些小块,然后这么多小块之后诶,我把这个第三个维度叠在一起。
就形成了一个三维的一个矩阵对吧,这个就是3d的由来哈,那这个顺序就无所谓,然后我们拿到了这个一个就匹配过的一个相似的一个三维的小块呢,就一个一个三维的一个呃数据立方体吧。
然后不一样的特征会当然会对应的不一样的一个三维数据立方体,然后将每个啊,这个我们叫这个每个就是数据立方体内有一个矩阵的二维小块,进行二维变换,我们可以用这个小波变换,也可以用d c t。
所以大家都可以试一试啊,然后经过二维变换之后,然后我们再对第三个维度,就是纵向那个维度进行一个呃,这个叫hdmd transform,叫叫可能叫阿阿达马变换对吧,然后这三个维度再做一个变化。
所以说变化而后我们对这个三维的一个矩阵啊,就是做了做了做一个hard的一个threcording,就是给他一个硬的一个阈值,将小于值这个系数全都置为零。
然后这个再通过一个这在每个维度一个第三维度跟它的逆变换,跟这个二维的一个逆变换来,最后拿到一个图像的一个像素块,然后拿到这么一个相册块之后,我们就可以做就做一个聚合将。
就是每个就是嗯这些融合的块就是打回到原来的位置是吧,就是每个像素的一个灰度值,就通过呃每个对应位置的一块的一个家庭平均,最后拿到这个,他当然他这个权重哈。
这个家庭平等权重决定于这个智联的个数跟这个噪声强度,然后这叫基础估计,然后最终估计呢它这个过程跟基础估计估计比较类似哈,就是第二部的这个最终估计就是它的聚合过程跟地步比较类似,但是有一个不一样的地方。
就是他会拿到两个三维数组,就是我们之前拿到了一个就是噪声图,拿到了一个三维矩阵跟最后基础估计达到了一个三维数据,两个三维矩阵,然后两个三维矩阵都进行一个上一部那样的一个二维跟一维变换。
那这个时候这个二维变换通常用一个d c t的一个变换,然后我再用一个哎,这个时候问题就来了,我们就使一个维纳滤波,将图像的将造成图的一个形成了一个三维矩阵进行技术缩放。
这个系数通过基础的估计的三维矩阵的值,然后跟那个噪声就可以得到它这个系数,然后最后给我们这个整个整个都处理完之后,把这些小块就融合到原来的位置,也就是这个时候我这个这个时候加权的群众就来自于维纳滤波了。
我就是维纳滤波的一个系数跟造成强度了,所以说这个时候就可以拿到一个比较好的那个结果,但是b m40 p这个算法复杂度啊真的是非常大,因为他在一个很大的一个范围内去搜索匹配啊。
然后去做那么呃就是反复的做那么三步啊,聚合呀,然后啊去然后去去协同滤波啊,这么一个,其实这个工作量是非常大的,它的就是整个算法复杂度大概是这上面的2~3倍。
就以前大家用bm c d搞一张5月2x52的图,好家伙,这就算了好几十秒,但是这个就是这个月哈,就是我们做了一个呃一个eea,用一个做了一个eec芯片的一个ip。
就实现了绕月的4k的b m video的一个处理,就是实现了一个实时的一个处理,这个bm举例我建议大家自己可以写一下,在我会在noise那一章里面去详细的讲解每一步到底怎么做,因为这个时间太太紧了。
然后说到这个就不得说的这个3a算法就自动曝光,自动聚焦,还有自动白平衡,我自动曝光,我们上节课讲到整个曝光啊,是由光圈,曝光时间,k s3 个变量同时决定的,就我自动曝光的目的是啥。
这个自动曝光的目的就是为了让我们拿到一个就是更好的曝光,一张图就是这样的,不要太亮,暗的,也不要太暗,这个时候保存更多的一个细节,这个时候我们能调的东西就有三个,就是光圈,曝光时间,还有i o综艺。
但有一些我们这个镜头啊,就是特别是手机镜头,就通常就是有一个固定的一个方式,它它不能调哈,所以说这个时模拟和数字增益就比较重要了,有时候就比较好单反,因为他那个像素啊太大了,就是太敏感了。
特别是在那种正午的大夏天,这个时候光线特别强,这个这怎么办呢,就会大家加一个nd future,也就是加一个衰减率更片,让光变暗一些,就是目前就是自动曝光里面比较常见的算法有一个呃。
比如说像这个平均亮度法呃,还有一个权重均值法,还有一个亮度直方图啊,这个其实还是比较多的,就是最普遍的就是一个平均亮度法,这个平均亮度法这个条曝光了是咋回事呢。
就是我让这个图像就是所有的像素就求个平均值,然后就直接呃通过这个都不断调整这个曝光参数,来达到这个最终的一个平均亮度,这个时候其实啊就是比较简单粗暴的一种办法啊,然后另一种方法叫那个权重均值。
就是对整个图像不同区域设置不一样的权重来计算,就是整个图像的亮度,比如说呃我们这个是单反相机啊,有些像测光模式,就测光模式就可以把这个图像分块啊分块,然后根据不一样的区域来做一个不一样的权重。
从而实现这么一个曝光的一个调节,还有就是亮度直方图,我们把每个像素点的它的亮度直方图统计出来,然后把这个直方图的这个风的一个位置作为不一样的分配来实现呃,计算这个图像的亮度。
然后这个自动曝光的这个过程啊,大概有这么几部吧,就是嗯自动曝光过程大概有五部吧,就是我们当前把它定义为五部,就第一步就是呃对我这个图像进行亮度统计对吧,我们就把这个直方图统计出来。
然后根据当前的亮度确定一个合适的曝光值,然后呢第三步就是计算机的一个曝光参数,曝光时间,光圈增益对吧,然后把这个新的曝光参数用到相机里面,就是第四步,那第五步就是重复前面1~4。
直到我们亮度满足一个需求位置,这个这个这这一页slides里面这个图表现了一个什么情况呢,就是从左到右这三张图就对应着嗯不一样的这么一个曝光的一个纸哈,大家可以看到最后啊。
我的这个communicative cdf就是概率累积函数,我们它的一个呃不一样,像素不一样,亮度像素的一个百分比可以看到诶,这个中间这个这个好像这个值就是拿到一个比较好的一个位置。
其实啊就是我们就是要说到一些摄影的技巧,就是具有一定反射率的一个物体,就是我们说一个就是一张,比如说一个衣服吧,就一定反射率的物体,在最终的图像中,我想把它还原到就是它所对应的一个灰度等级。
所以有时候大家买这个时候买这种卡的时候会有一种灰度卡,就摄影师里面属于那种中性的灰度卡,来测试这个曝光到底是不是正常的,但实际上我们这个相机在拍自然场景里面其实还是挺复杂哈,他没有办法呃。
这个识别物体的一个反射率,这个同学问呃,土豪们同学问,怎么把人曝光没了,这个你你把那个iso调到顶,然后再把光圈调到最大,再把那个你的这个曝光量调到最大,再打一个大灯,然后这个人基本上就没了。
刚才说到这个自然场景,就是其实有一个非常简单的一个简单粗暴的一个办法,就是我们可以把这个图像整体的一个平均亮度,设成一个中性灰的一个亮点,也就是就是有时候就好多科学家好,就是把这个自然界的平均反射率。
就是我们所有的东西都有了,就把这个估计平均反应率设成就18%这么一个呃经验值,这也就是大家所说的18度灰,就18度灰呢,就是为什么有时候看这个18度会比较舒服,就实际上它是所有所有场景。
他最后统计拿到了一个中性灰的一个亮度,也就是平均反杀率就是18%,不是动态上,就是所有的反射率哈,不是就拿到了一个图啊,就是反射率有时候拿到这个18度灰呢,嗯但它也不是万能的哈。
就是比如说我们要拍摄一个纯白的场景啊,特别是雪景要增加一些曝光补偿,这个时候就会偏暗,所以说这个有时候这种很白的一些场景,它的亮度实际上是远远大于这个18度灰的,这个时候就诶呃这18度灰就不适用了。
所以说有一句口诀啊,就大家记住啊,叫白增黑,减,白的时候这个曝光比18度会稍微亮点,黑的时候把这个18度会稍微降一点,就白色黑点,有时候这个大家统计完这个直方图呢,比如说我让那个99。5%的呃。
播报就是0。5%的一个地方不过曝,然后可以看到这个highlights这些部分也有是嗯直接让10%的一个呃,the exposure也可以拿到一个就是一个shadow,是一个图像。
大家可以看到右边这个图,然后自动曝光呢,呃就是在其中找到一个中间值,就是我让比如说让0。1%的,就是就是整个0。1的播报,然后0。4的就是稍微暗一点,就拿到一个比较好的自动曝光的值。
第一张图的两人已经曝光不见了,哦,不好意思,我还问觉得你这个问的是怎么样让一个人曝光没了,然后说到这个自动对焦啊,自动对焦很简单,它有一个主动的方法跟被动的方法。
这个被动的方法其实呃通常大家就可以理解为啊,这个被动的方法实际上就是就就做这个contrast detection,也就是测它的一个对比度,然后我们看到当这个我们这个自然聚焦的情况下。
我对比度实际上是最高的一个情况下,就是大家可以看到我们这个整个图啊,当我们聚焦这个这个这个这个这个位置呢,我这个图像按理说来说应该是最清晰的,这个时候就是因为我没有弥散圆啊。
就是这个时候它的对比度应该是最高的,然后,经过就是他离交之后,因为受到模糊了,它边缘已经丢掉了,这个时候它的对比度会下降,所以说呃这个工程师就很聪明,通过这个算它的这个对比度。
算这个整个图像的一个对比度,也就图像的对比度来直接判断诶,我最后这个有没有对上焦这个,然后大家可以这个时候对比度比如说大了小了稍微调一点,比如说这个位置稍微调一点,诶,发现这个对比度变大了诶。
就再往这调一点,一直调到这个稳定到这个聚焦的位置位置,然后反了之后就发现这个对比度变就差了,就往反方向调节诶,这个时候就可以快速的,当然这个这这种条不是很快哈,这种被动的调法不是很快。
有时候大家也会直接算一下mtf,这个后来直接就算in对焦,这个m p f呃,变大了,就最后通过率变大了,又高频信息更多了,也可以认为它是聚焦的,所以说有时候这个这个有时候也叫被动的一个呃对焦。
就是这是大部分很多很多很多的一个相机啊,嗯像单反相机啊,都是基于这个被动对焦的这么一种办法来进行对焦的,包括像以前传统的以以前很早以前就没有这个主动对光的情况下。
其实它是特别是像spd和top单点的tp,用到手机上去做一个快速辅助对焦的时候,这被动对焦那时候市场还是非常大的,大家说一下啊,这个就我们拍电影那个镜头,它是没有自动对焦的,这个他不行哈。
这个万一自动对焦就很麻烦,就是最后拍着拍着发现这个主角没了,这个被动这个自动被动的自动对焦呢,它需要反复的测量,然后反复的计算它的一个ctrl and racial,诶,这个时候大家也是挺不友好的,嗯。
这个就可以理解为它算是一个depth to focus的那么一个过程,它就需要比较长的一个时间啊,来去稳定的达到一个聚焦的一个位置,那这个时候比如说举个例子哈,就是大家单反相机拍照的时候啊。
我们这个比如镜头里面都有一个伺服电机,大家来看一下,像这种相机里面它会有一个自动对焦的这么一个镜头,对诶他可以看到诶,这个时候他就自己就动了,有不一样的位置诶,对对对,它就自己就动了。
这个时候就是它的伺服电机会跟踪我这个物体来,然后直接进行调教,然后第二步呢就是对那个嗯对焦与测光,然后通过这个如果物体成为焦点,我就出发,然后告诉你可以拍照了,或者是我直接已经按下快门了,它自动对焦完。
然后就就出发去拍照了,那我们也可以看到找到最严格最近的物体啊,呃来去自动调焦,但是有时候呢我们手动触发自动对焦的时候,如果发现我们对一张白纸,这个没有纹理啊,这个就contrast racial就不变。
咋整了,这个时候就就失效了,这个时候就真的是没有办法对这种被动对焦来说,那这个被动对焦失败的时候诶,这个时候就会有可能主动对焦的方法就来给大家,像比如说这个就主动对焦的话。
叫time of flight,这个也可以是光的,也可以是生的,就有很多声纳呀,通过这个收纳回拨的时间来测这个距离,就大概知道我对焦的位置是啥了,就是我根据这个测算的这个距离来直接去对焦。
但这个时候就主动对焦有一个坏处,就是因为我要发射声波或者光波嘛,这个时候我整个探测距离就会比较受限,然后这是一些光对焦的方法。
就是time fly传感器,这是我们做了一款就是光飞行时间的一个深度探测,这个时候就可以很快速的通过光的方法啊,进行一个嗯深度的一个探测,那通常就是我们手机里面或者相机里面用的都是一个单点的。
就用一个单点的就够了,大概或者或者4x4,顶多8x8,那就不可能再高了,因为再高就比较贵了,8x8的这么一个小东西,然后去做一个主动探测,来做一个快速的辅助对焦,当然也可以用一些像三角测距的一些方法呃。
去来测测这个深度呃,三角测距的这个方法也是work的,就是大家加一个散板结构光啊,或者是加了一个这么一个三角测距来进行一个快速的测距来辅助对焦,哎这就是主动的方法,啊为什么要叫白平衡呢。
就是我们可以看到嗯自动白平衡在3000k的色温,5500k的色温,6500k的色温跟自然界的情况下,我们呃就是把这个白平衡呢就是设到不一样的一个色温的情况下。
就可以拿到非常多不一样的这么一种色彩的感觉啊,它本身做这个白平衡的一个校正呢,实际上就是为了让我们拿到了一个图像更接近真实的,更自然的一种色彩,就是自动白平衡校正大概有两种,就是大的一个体系方法。
一个就是手动白平衡,就是比如说像我们之前就说到,我们在拍照之前拍一张18度灰的卡片是吧,然后计算这个卡片在当前的一个白面,等下我rgb 3个通道对应的增益值对吧,这个然后这个18度灰的一个增益值。
然后直接乘以一个系数哎,就在这里做一个白平衡校正,这个时候是比较准确的哈,这个18度灰卡出来还是比较准确的,还有一个就是自动白平衡,就是我们通过一个呃自身的一个算法来算到这个不同通道经验增益。
来做一个白平衡,那个白点更白,然后颜色更加真实,这其实这个做法也比较简单啊,实际上就是呃你给这个红色通道跟那个蓝色通道做了一个争议,但实际上这这个两个绿通道有时候嗯它会有一些工艺的问题。
这个值也会稍稍有一些差异,最后有时候增益的时候大家可以看到,经常有时候这个增益是三个通道有增益,虽然说那个嗯gr跟gg b这两个值就差的比较小,但是有时候还会再加一个增益来的话,就是更稳定一些。
最常见的一个自动白平衡的方法叫灰度世界法,就是灰度世界法,就是它是基于一个假说哈,这灰度世界就是假设我们有一任意一张图像,它有非常多足够的一个色彩变化,就是它的一个这个当这个我们色彩足够丰富的时候。
这张图啊就是它的就是r g b分量的这个值,就自然统计里面就会趋于相等,那这个时候就说诶我这个三个通道加起来这个值是一样的,这个时候就是不是就很简单了。
大家把这三个值加起来就是rgb 3个所有的通道就只加起来一算,我把这个争议是很简单的,就把这个争议算出来了,对不对,然后第二种比较常见的方法叫这个完全反射法,当然这些都是经验值哈,这经常会贵的。
如果拍到一个图,只有绿色,只有红色,这个时候你这个rgb这样它相等,这个时候肯定就不对了,对不对啊,这个是也是基于一种经验的一种方法,也不是完全每种环境都适应,那第二种方法叫就比较常见的话叫完全反射法。
就完全反射法也是基于一个假说,就是这个假设是什么样子呢,就是比如说一个图像里面最亮的像素,就是我们会经常会有一些就拍到玻璃啊啊,或者是那种光滑的球啊,就是这种最亮的像素就是相当于这个镜面上的一个点。
就是它直接就表现了这个场景里面照明的一些信息,如果这个景物里面有这个纯白的地方,哎我们就可以直接从这些像素里面这个纯白的地方提出,就取这个光源信息,因为镜面或者是有光泽的平面啊。
就是这种平滑的表面是它本身是有全反射,不吸收光线的,所以说哎这个时候反射的颜色就可以理解为是光源的真实的一个颜色,嗯所以说这个也是完美反射法,就是利用这种特性来进行听,就是整个图像调整的。
我们最后就用的时候呢,就是先检测图像中里面就是亮度最高的一些像素,把它作为参考白点,所以说基于这种思想的方法就是叫完美反射法,比较镜面法,就就就是通俗一点说就是最亮的地方。
就是白点或者是镜面反射出来的一个光,当然这个时候也会有各种各样的bug,所以后来呃同志们就搞出来了这个完美世界跟灰度呃结合的一些方法,但是现在还有更多就基于神经网络去做一个神经网络,白平衡的一种方法。
那就是在很多场景呃,灰土世界呀,包括像很多预设的一些白平衡的值,大家就首先可以先测一下这阴天呀,呃是不是在一个市里面的那个灯光环境下,还会和很多参考的一些值呃,会有一些更好的一些效果。
但除了这个还有一些就基于这个色温的一种方法嗯,就是我们首先就是先对这个环境光,我估一下它的一个色温,然后铺完色温之后,然后再去做,根据这个色温去做白平衡,其实这个好像我记得是哪家手机厂,是努比亚。
努比亚是哪家的,还有一个就是oppo好像都有这个关于用色温传感器来,首先我拿到环境的色温,然后再通过这个环境的色温嗯,来这个进行一个白平衡矫正,但这不是很常见的,这是呃手机摄影内卷的这一种结果。
但这个方法是非常好,这很准,哎讲到关键的地方了,就是这个呃carver fter interpolation,就是去马赛克,就我们实际达到了一个场景是这样的。
但是我们这个传感器上拿到的图呢,经过一个白绿光片之后,就拿到右边这么一种感觉,我想把这张就是很多哎这种就控不到的rgb b的这个bpon插出来,对不对,实际上表现在就是把这些空白的一些红的。
绿的,蓝的这些插出来,就是拿到一个完美的一个彩色的一个图对吧,其实这个呃简单一点就是大家想想到像同学里面最简单一点诶。
我是做一个呃bination,这个行不行,其实也可以,但是这个是非常容易去实现的,但是会有什么问题的,就我们举个例子哈,就是我们拿到这么红的这四个位置,红的几个位置诶。
我用一个简单的一个差值会发现a得到右边这个图a挺好的,这个灰度是逐渐就value是逐渐变过去的,但是我们遇到一些就比较锐的一些边的时候对吧,像我们比如真实的物理情况,这一个红的,然后后面跟着一个大块。
但我这个通过采样呢,然后通过采样呢,诶我就发现这几个位置哈,诶采样过后发现我们拿到了这个采样的值,是这样子,我经过一个简单的一个呃inia inflation,双线性差值a是吧,诶这个稍微差全红了。
这个一插就中间的这个灰度值,这个一插中间会出值,这两边一插会的,那就发现哦,好家伙,这中间这个值跟我真实的情况不一样了,对不对,哎这个时候就会出现一些呃就频率的损失吧,这个叫,那这种情况下又怎么处理呢。
嗯就是我们除了这种方法。
还会有很多的像呃呃比如说像a marvel method by cubic interpolation,这个大家课后可以试一下,但是我们这节课主要讲的是一个marvel这个ation。
当然这个也会有时候遇到噪声的一个情况下,就是理想的呃,这这这个图哈,比如说理想的一个原始图,然后通过一些噪声啊,有噪声的时候去马赛克去怎么查他啊,这个时候哎就非常就是有讲究了,这个时候给大家讲一下。
这个就非常好的一个快速的一个方法,我们把这个边缘也考虑进去,这个叫叫marble method,这哥们儿是04年提出来一个叫high quality linuflation for demosecond of fire。
pattern colummer jump jump,因为他是是他提出来的嘛,呃这个就叫marvel method,首先我们要对这个边缘呃进行一个就是我们要预测一下边缘,然后去根据这个边缘就调整。
就整个luminous就是跟这个rgb的这个值是相关的,然后边缘呢我们就假设是整个呃这个力亮度的一个变化,然后首先我们这个要查出来这个这个g的值在r这个地方,就是说像第一张图,我们要把这个g的值插出来。
对不对,然后当这个r的值就跟这个我先用这个双线性插值插出来啊,当这个r的值,然后跟这个,就是binipation cha这个值有很大的变化的时候,我们就也可以说这个叫lous changes。
我们这个时候就可以用双线性插值的方法去给它做成一个校正,就是我不一样了,我我一个通道不平滑,我用另一个通道的一个梯度值就来给就这一个通道去做一个矫正,这就是marble method的一个思想。
哎这个不好意思,就讲超了,今天这个内容有点多哈,我讲快一点,然后就要对图像进行一个颜色校正,其实这个颜色校正很简单啊,就是我们最后基本上颜色校正就是通过拍这么一个色卡,一个标准色卡。
标准色卡都一个颜色的值,通过这个标准色卡这个颜色值我们就可以做一个最小二乘法,最小二乘法,然后就可以拿到这么一个3x3的一个,有时候大家就直接把它补成一个4x4的。
一个homogeneous和homogeneous matrix,然后去做它正常时候也就3x3,加个offset就够了,这个时候通过啊这么一个就是就是就是这个叫叫色卡吧。
就叫色卡跟它的标准对应的值在一个标准光源下,然后对算出来,通过最小二乘法去算一下这个coration matrix就可以直接做一个颜色校正,那这个时候校正其实呃不是特别严谨。
就是我们对于一些显示要求特别高的一些情况下,我们通常会找一个three d look up table,通过一个three d look up table呃,来去呃。
做一个color correction,这样的话就可以得到更加真实细腻的一个色彩,这个通常比如说像大家手机量产标定或者是显示器量产标定。
而这个时候会做一个呃这个color correction的一个问题,就是特别是随机look up table,但有的这种图像看图软件也会给他们一个就是随机look up table,经过一系列的东西啊。
就是处理啊,就是很多边缘的信息会损失,这个时候我们就要想对边缘进行一个增强,这个边缘增强了,我们就要考虑啊,这个边缘增强多少啊,我这个呃增强的范围是多少啊,我给这个阈值啊,这几个点都要考虑。
当这节课我们讲到讲一个讲一个简单的话,就讲讲一个嗯拉普拉斯的算子对边缘进行一个增强,这有时候大家这个算个rgb啊,算了这三个坑道,这个挺累的,就是可以把他这个换到vv里去算一算这个yuv呢。
这个y就是它这个len,因为边缘通常就是对一个亮度变化进行一个增强,我们把这个rgb变成为微距呢,哎这个事情就变得比较简单,我直接用一个age future做一个拉普拉斯的一个增强,这个就可以了。
当然大家也可以直接去检测边缘啊,然后通过这个检测边缘去增强,哎这个时候注意到哈这个一个fter,这个这个其实就是做作业的时候就有一个简单的一个conclusion future。
大家做的时候要特别注意一下这个噪声的一个影响,这个噪声这种的az enhancement是噪声是会放大的对吧,当然我们也有其他的一些方法进行变异增强,大家有兴趣的情况呃。
可以在我们自己最后的这个作业里面去写加进去,这个时候大家就可以嗯,我会给大家一节课的机会,去每一每一个assignment会挑一个这个比较好的,就给大家建一个小club,然后让大家去交流一下。
然后有还有其他的方法,就是通过这个呃提取这个map,然后通过这个map,然后找一个一个look up table啊,比如说这个叫em l,通过这么一种方式呃,来对边缘进行一个增强。
当然我们会在这个时候设设这么一个surprise code,它它其实原理非常简单哈,它就是这么一个呃,就是中中间就是不响应的一个曲线,就在这个threefold一下就不响应。
然后再骑的这个关于这个threefold,就给它在不同程度上进行增强,那这个时候我们就可以算到四个不同不一样方向的一个梯度,算那个横竖斜这几个方向的一个梯度。
然后去呃找到这个最小的一个就是minimum的一个average值,来作为这个梯度的一个方向的一个替代,这个时候就会有这么通过这么ema的一个一个增强,就是我们直接在一个就歪了一个外uv那个y通道。
加上这个em拉这么一个值,当然要经过一个clip,就我们会clip掉,就是不想要的一些啊,这个范围的一些值,特别是一些过大过小的值,clip之后。
实际上我就是通过这个鬼点的把这个这个规定呢就把这个边缘找到,然后再加到原始那个y u v那个图上呃,这个呃这个放到作业里面,大家这两种方法都对比一下吧,一个简单的拉普拉斯算子嗯。
或者是再加上这么一种像我们这种emt这种a d20 ,这两个都试一试,其实大家可以看看这种效果的一个区别,然后这个false color suppression是怎么来的。
这个他是我们在这个去马赛克的这个过程中啊,有一些就特别特别就是细节的限制地方,就是我会受到一些就采样的问题啊,或者差值的问题诶,我这个时候会产生一些就围采的一些效应,除了这个呃,还有像我们这些镜头啊啊。
或者是一些光学的一些滤滤光片啊,绿绿就是还有一些像动态压缩的这些过程中,都会产生这一个false color,那我们要对这些呃就围采进行校正,这个时候我们仍然是在yuv必须做这个事情。
然后直接对cr c b这个channel去操作,然后我们忽略掉这个uma就是illuminous,这个是因为这个彩色跟这个y已经分开了,对不对,那这个时候怎么办呢,我整个ky的g,然后我首先还是一样。
就把这个age map,这就违踩边缘的一个age map就检测出来,就像那个检测就玩uv那个luminous那个一样的方法去检测出来,然后我把这个h max去剪掉,这个拿到这个边缘图。
然后去把这个值这个值去算出来,就是这个时候其实也挺简单的,如果这个这个它是我们要做这个false color,这个抑制的时候,我这个cha channel。
它这个边缘应该是比那个最小的一个就是彩色的一个边缘就更大了,所以说直接大家通过这么一个三段式的这么一种方法,如果这个变化这个值的变化小于最小值的时候,我的cr cb value就不动它,对不对。
如果在我们这个最大最小值之间的时候,就说明这个时候有违采,有微采的时候,诶,我这个时候就可以通过这么一个校正边缘的一个增强的校正,就把他叫回来,然后到最后就是有一些就是超出了我们这个阈值的时候。
我们就直接就丢掉它就不要了,然后再说一下这个breakfast and contrast,实际上这个跟大家就是调这个这个显示器的时候,很像大家调这个亮度,实际上实际就是在这个亮度值上就加了一个值。
这个是非常简单的,就大家可以现在动手调一下这个显示器这个亮度值,那contrast呢以contrast就是这个对比度也是比较简单,就是我这个亮度减掉我这个中间这个值,比如说是-128~170。
然后把这个卡特拉增强呢,就这个值就给大一点,就是ctrl值就给它减弱呢就成小一点,就是减弱就会显得偏灰,增强了就会就显得这整个亮暗拉拉的亮一点暗一点,这就是就是亮度跟ctrl的一个调节,最后说到关键了。
这个伽马tmap,这个伽马就是有时候大家跟tmap一起用啊,这个当然大部分时候是分开的,这伽马校正就是有一些历史原因,就是我们以前的这个就是这个应急射线管,它跟它这个最后打到这个临光粉上就有一个响应。
然后最后他有一个一个proportion,这伽马等于一个2。5的这么一个就是它会变暗,伽马等于2。5,然后实际上这个时候我们显示的时候,就要做一个拉量的一个反向的一个过程,那现在很多显示器都没这问题了。
所以说这个有时候伽马的时候,这个是特别是对小值有一个已经有一定的救助作用,实际上就是我们最后存的时候开了个根号,就开了个嗯01:25之一或者01:22之一,那几个常见的一个s r g b这个域里面。
那伽马是1。2,实际上就是把这个按时拉量,就是实际上就是简单一点,就是加速开根号就直接,如果伽马是二的话,就是开根号,当然这个伽马校正它是一个整体的一些校正方法,它有一些局部的局部的细节。
但是局部的亮暗程度就调节的不是很好,所以说这个时候呃,大家为了适应这个显示器,如果要在这个显示器上,比如说八位的显示器显示一张14位的图,我为了让亮的更暗的地方显示的都非常清晰。
所以说就需要做一个套白品,伽马可以认为是一个global的一个糖白品,但除了这个呃,我们可以根据这个这个像人眼的那种侧翼的效应,比如说暗的地方诶,我给它拉亮一些,亮的地方给它拉暗一些。
就给他做一个local的碳白屏,这个时候local time白就挺重要的,就可以把一些呃按区域给它对细节进行增强,尤其是对边缘的一些增强,暗部细节的拉亮跟亮部细节的压暗,最终我在我的显示器上。
整个显示器都可以看到嗯,更多更亮的信息,跟更多各样的信息就压在这么一个小的一个显示器的一个显示范围内,这个时候以前传统这个摊卖品啊,就是就是暗的地方叫shadows。
就是阴影中间这部分叫middle tom,亮的地方就是叫highlights是吧,这个可以很明显的这个很明显的看到这种问题,比如这个contrash比较低的时候,我这个套比较拥挤的时候。
会看到它这个对比度是比较低的,就是看到这个边缘细节会减少,我看到那我们把这趟拉的比较开,有亮的,暗的拉的比较开,这个时候就可以看到右边这种视觉效果就比较好,所以为什么我们要做这个汤卖品。
也是为了更好的让眼睛看到一个更好的一个效果。
当然这个我们这个对整个图像的一个对比调节啊,就是有时候大家photoshop有时候会手工拉一拉这个曲线,当然现在也有很多自动的一个local tmap的算法啊。
这个我会在一个下节课下节课的advanced一个image processing里面去讲到,当然这也是下节课的一个作业,去做一个local的一个糖麦品,大家去如何去把这个图像亮了啊,那按r亮。
这样达到一个最好的一个视觉效果,在今年今天这节课会比较长哈。
我就覆盖到了一个by adamental processing color correction,agenhancement,还有一些微采的意志亮度跟ctrl调节嗯,还有一些像伽妈呀。
还有抗白品这些概念,大家搞清楚啊,然后作业的时候哦,我会在这个周末翻下去,然后让大家去开启第一次作业啊,这个今天的课程就到这里,就感谢大家来到games 204计算成像的课堂嗯。
欢迎同学们继续嗯钻研这个计算成像,因为这个是一个真正的一个朝阳产业,也是一个学术圈里面的一个清新的一个方向,就是对大家无论是工作还是做学术,都是一个比较好的一个方向,好谢谢大家。
唉有什么问题大家可以快速问一下,手机arm svd啊,这个你还真到点了呃,以前华为麒麟990是用了b m s v d,我不知道是拍照还是视频哈,这个嗯现在目前是都没有了,因为但是后面可能会有。
因为我们已经把这个b c d做到实时了,可能会给一些手机厂家合作,或者是可能会跟美国或者是韩国的一些呃厂家合作,去把这个mcd真正做到手机里面,同学们还有别的问题吗,那为什么呢,work,这个n。
这个这个这个这个不是我,我不是很专业,这个np问题,但这个他好像这个乐府工作的确实是挺好的,因为这2年的效果已经看到nf的一个第三维重建的一个威力,同样降采样就一定会引起混结构呃,这个不一定的。
就是我们实际上我们可以看到奈奎斯特采样频率的时候,就是我们对它做一个频谱的变化,如果你要想降采样,就先把那个高频的给扣掉,然后把那个光皮抠掉之后再去降采样,这个时候就不会先去混解,当然会产生频率的损失。
这个关于这个混叠的问题,推荐大家去看一下那个嗯digital digital signal processing是吧,这个叫叫什么,这怎么翻译,这这这本书倒是挺好的。
digital signal processing,大家可以看一下,呃前后处理环节是互相解,这个你说是哪些环节啊,比如举个例子是这个饶玉之前的,还是像3a啊,还是跟后面的。
这这这3a之前呢应该是它是一个完整的一个loop,后面跟前面的应该就是分开的,lsd correction和dnoise先后顺序怎么呃,其实这个也没有太明显的一个那个。
但是一般哈就是有时候大家会把这个dnose往往前放一放,因为this is chincorrection会给那个病人做一个增益,但你要用这种local的方法,就是其实无所谓,就是这个影响不大。
但你要用一些比较高级的一个deny算法,这个那是ing correction,是要放在demd noise后面比较好一些,呃这个去噪是十分影响去马赛克效果,如果你这个噪声比较大的话。
你这个就是整个边缘啊,就是会产生非常大的一个问题,就说这个噪声越小,然后对去马赛克就是越好,就是说前面的一些在绕月的去噪是非常重要,同学们还有问题吗,没有问题,大家就拜拜了。