Unity Shader 概述
- Shader类型:
Standard Surface Shader:标准光照Shader
Unlit Shader:不包含光照
Image Effect Shader:实现屏幕后处理基本模板
Compute Shader:利用并行性进行一些物馆计算 - Unity Shader:
表面着色器(Surface Shader)是Unity对顶点/片元着色器的更高一层的抽象,被定义在SubShader语义块。
顶点/片元着色器(Vertex/Fragment Shader)定义在Pass语义块内,比较灵活,自定义。
Shader数学基础
- 坐标系
Unity模型空间和世界空间使用左手坐标系,观察空间使用右手坐标系(摄像机为原点,Z越小离物体越远) - 逆矩阵用来求解逆变换,如果能够验证矩阵为正交矩阵,那么 M T = M − 1 M^T=M^{-1} MT=M−1,就可以直接求解矩阵的转置,从而求得逆变换。
矩阵的几何意义:变换
线性变换:缩放、旋转、错切、镜像、正交投影。
- 仿射变换:合并线性变换和平移变换的变换类型。
- 分解基础变换矩阵:
M 3 × 3 M_{3\times3} M3×3表示旋转和缩放, t 3 × 1 t_{3\times1} t3×1表示平移。
例子如下:对一个点进行平移(如果是一个方向矢量,w分量是0,不能平移)。
缩放:
旋转矩阵:
先缩放,再旋转,最后平移
透视投影
对应Unity里面的参数:Field of View(FOV),Clipping Planes中的Near和Far。
当前摄像机的横纵比为:
投影矩阵:
正交投影
齐次除法
用
w
w
w分量除以
x
、
y
、
z
x、y、z
x、y、z分量,得到归一化的设备坐标(NDC)。
z
z
z分量另有他用
法线变换
使用用一个变换矩阵,无法维持法线的垂直性。(进行非统一缩放)
切线和法线垂直也就是:
T
A
⋅
N
A
=
0
T_A{\cdot}N_A=0
TA⋅NA=0,
T
B
=
M
A
→
B
T
A
T_B=M_{A{\rightarrow}B}T_A
TB=MA→BTA
要得到
T
B
⋅
N
B
=
(
M
A
→
B
T
A
)
⋅
(
G
N
A
)
=
0
T_B{\cdot}N_B=(M_{A{\rightarrow}B}T_A){\cdot}(GN_A)=0
TB⋅NB=(MA→BTA)⋅(GNA)=0
经过一下推导:
结论:如果变换只包括旋转变换,那么这个变换矩阵就是正交矩阵;如果变换包括旋转和统一缩放,则利用缩放系数K来得到变换矩阵;如果包含了非统一变换,那么就必须要求解逆矩阵。