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来得到变换矩阵;如果包含了非统一变换,那么就必须要求解逆矩阵。
本文深入探讨Unity中Shader的类型及其数学基础,包括坐标系、矩阵变换、投影原理及法线变换等内容,适合游戏开发者及图形编程爱好者阅读。
2325

被折叠的 条评论
为什么被折叠?



