Unity Shader入门精要读书笔记(三)Shader必须的数学基础

时间:2021-11-25 10:22:24

Xyz三维坐标系如下:左手坐标系

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

但是摄像机观察空间则是采用右手系:

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

右手法则判断叉乘的结果的方向;

正交矩阵(单位互相垂直的基矢量构成正交矩阵)具有逆与转置一致性;

列矩阵运算CBAv和行矩阵的运算vATBTCT一致;

平移变换不是一个线性变换;

仿射变换合并了线性变换和平移变换,在齐次坐标空间中进行;

纯平移、纯旋转和纯放缩的变换称为基础变换,那么一个齐次坐标矩阵如下:

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

其中M表示缩放和旋转,t表示平移,0表示0,1表示1

为什么呢?

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

从C空间变到P空间的矩阵:

Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

其中Oc是选取的原点,xcyczcC下的P的基矢量(不一定要是单位的);
对于矢量从C空间变到P空间中,则只需要:

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

 

如果是正交矩阵的话,可以轻易地得到反推的矩阵(读取行即可);

[正交矩阵] 利用试探法写MA->B,已知B空间的基矢量是xbybzb(用A来描述),那么xb(用A系来描述Bx基矢量)经过AB的转换后,得到的应该是100

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

模型变换:从模型空间到世界空间;

先缩放、后旋转、后平移;

摄像机的放置:缩放(不缩放)、旋转(镜头的旋转)、平移(镜头的平移),即摄像机有一个transform;由于观察空间是一个右手系,所以对z进行取反,即和[1000; 0100 ;00-10 ; 0001]相乘,得到观察变换矩阵,也就是以镜头位置为原点,以镜头指向为坐标轴(其中镜头后方为+z)的坐标系;

齐次裁剪空间,这个空间的变换矩阵称为裁剪矩阵或者投影矩阵;

 

利用三角形关系和FOV可以知道近裁平面和远裁平面的高度

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

 

Aspect是宽高比,那么从观察空间(摄像机做原点)到裁剪空间为:

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

经过裁剪变换后,所有不满足xyz限定在±w内的片元都被丢弃;

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

正交投影的裁剪变换如下:

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

 

 

所有不满足xyz在±1以内的,都被裁剪;

透视除法:就是用w分量去除以xyz分量(限定在了-11的立方体内)

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

正交投影的齐次除法就是除以1

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

在Unity中屏幕空间左上角是原点,右下角是pixelWpixelH,那么就有最后一个从齐次除法后到屏幕映射:

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

其中clipx是裁剪空间中的xclipw是裁剪空间中的w

 Unity Shader入门精要读书笔记(三)Shader必须的数学基础

 

为了将法向量从A空间变换到B空间,直接和Mab相乘是不对的。变换到B切线方向记为TbNb记为变换到B的法线方向,那么满足点积为零的约束:(我们希望求得G表示法线从AB的变换矩阵)

如果Mab是正交矩阵(即旋转),那么直接和Mab相乘是正确的,如果带有统一放缩k,那么