三言两语说shader(三)矩阵变换

一、话痨

接下来两篇打算补点理论姿势,哪里讲错了大家及时指出,多多包涵。

说好讲轮廓效果的,怎么又扯起矩阵来了?
是这样的,即便是上一篇中最简单的黑屏效果,里头的顶点处理函数vert_img,其实也包含了一句:
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
这个MVP是unity shaderlab提供的内置矩阵,大体就是从物体本地坐标变换到世界坐标、再到摄像机坐标、再到屏幕投射坐标的一个总变换。

一般的这种矩阵乘法变换并不难理解,但猪哥前几天看轮廓效果shader时看到两句类似的乘法,感到非常懵逼,大体上能猜出它的意思,但为什么要这么写实在想不明白,于是就回头复习了下数学基础及渲染流水线(pipeline,我总觉得相对“管线”来说,译为“流水线”更贴切)。

《DX11》这本书的第一部分数学预备,一共三章,第一章讲向量,第二章讲矩阵,都是纯数学姿势,以前学得好的简直都不用看,没学好的静下心来看看也不难。
第三章不知是否我以前线代学得差都给忘了,反正看下来感觉有点偏应用了,现在就整理一下。
先申明,风格从简,严格的数学定义什么的都统统省略了。
现在csdn新的编辑器支持LaTex数学公式什么的,但我懒人一个,暂时也先不用了。

二、正文

1.平移竟然不是线性变换!

注意线性变换(Linear Transformation)的定义: f(a+b) = f(a)+f(b),假设简单的平移一个c向量,f(a+b) = a+b+c,f(a)+f(b) = a+b+2c,所以平移不是线性变换。
坑爹的以前我脑子里一向以为平移当然是线性的,不学无术啊。

2.缩放和旋转都是线性变换

缩放最简单,旋转稍复杂些,但这两个变换最终都可以表示成一个1*3表示的向量(或是三维坐标系里的点)和一个3*3矩阵相乘。
考虑到手打矩阵有些麻烦,而书上讲得比我清楚多了,这里就不多费精力详述了。

3.仿射变换什么鬼?

Affine Transformation,被译作仿射变换。这种不知道哪个天才发明的译法往往是最让初学者头疼的。查一下有道词典,发现Affine有“姻亲”的意思,这下就好理解了。
物体在空间里跑来跑去,分解下来无非缩放、旋转、平移,一开始说了,平移变换不能归类为线性变换,那一个线性变换加一个平移变换叫什么好呢?
1+1=2。 线性+平移=仿射。 Linear + Translation = Affine。注意这里的Translation,专指平移,不要和Transform变换搞混了。
当然我不确定仿射变换有没有其他的用途和来源,只是想说用文字表达某个意思实在太难了,换种语言更是难上加难,所以多学种语言比被译者误导要强。

4.齐次坐标又是什么鬼?

Homogeneous,homo——“人;人类;基佬”,基佬是出双入对的,本来不该在一起偏要强行搞在一起。
“向量”和“点”这对基佬也是,假如用3*3矩阵来处理的话,这两者是没法混为一谈的,因为向量再怎么平移还是它自己,而点平移后就是一个新的点了。
所以搞基成性的数学家们想了个办法把这两者统一处理,一个标为1,一个标为0,恩。
然后呢,仿射变换原本是用一个3*3矩阵乘对象,再拖个小尾巴做加法的,现在也愉快地合并成一个4*4矩阵了。

5.大一统

就这样,不管是点还是向量,不管是平移、缩放还是旋转,最后再加上一个本质雷同的坐标变换(坐标系变了物体没变,实际上和坐标不变物体变了是同一码事),大家都优雅地被归结为同一个式子:一个1*4矩阵和一个4*4矩阵相乘。

复杂地事情被搞简单了,喧嚣地城市安静了下来。

管你几路来,我只一路去,懒人又一次获得了胜利。

你可能感兴趣的:(shader)