# 矩阵
复合变换可以通过矩阵串联获得,通常顺序为
缩放、旋转、平移
矩阵的旋转顺序通常为zxy
Unity 内的模型和世界坐标系采用的都是左手坐标系
,摄像机坐标系采用的则是右手坐标系
# 缩放矩阵
# 旋转矩阵
绕 x 轴旋转
绕 y 轴旋转
绕 z 轴旋转
# 平移矩阵
# 模型空间转切线空间矩阵
Unity Shader 内置可用 TANGENT_SPACE_ROTATION
宏直接获得矩阵
# 标准光照模型
# 环境光
通常为一个全局变量,可在 Window->Lighting 中设置
# 自发光
通常使用该物体材质颜色,可自定义
# 漫反射
兰伯特定律漫反射 = 光源颜色 * 材质的漫反射颜色 * max(0,dot(单位法线,指向光源的单位矢量))
半兰伯特模型漫反射 = 光源颜色 * 材质的漫反射颜色 * (0.5*dot(单位法线,指向光源的单位矢量)+0.5)
# 高光反射
Phong 模型高光反射 = 光源颜色 * 材质的高光反射颜色 * pow(max(0,dot(指向观察摄像机的单位矢量,光源反射方向单位矢量)),材质光泽度)
Blinn Phong 模型高光反射 = 光源颜色 * 材质的高光反射颜色 * pow(max(0,dot(单位法线矢量,normalize(指向观察摄像机矢量+指向光源矢量))),材质光泽度)
# UV 采样
Unity 内函数
o.uv = TRANSFORM_TEX(data.texcoord,_MainTex);
实现原理
模型 UV*UV 缩放 + UV 偏移o.uv = data.texcoord *_MainTex_ST.xy+_MainTex_ST.zw;
# 法线贴图纹理映射
贴图像素值将法线由 [-1,1] 映射至 [0,1]
pixel = \dfrac{normal+1}{2}
# 获取法线纹理对应的法线向量
获取原理法线xy坐标
可经过贴图颜色采样 * 2-1 获得
由于法线是单位矢量,因此 法线z值
可以由 xy 计算而得
tangent.z = sqrt(1.0-saturate(dot(tangent.xy,tangent.xy)))
注意:当法线纹理设置 为Normal Map
时,由于 Unity 会根据不同平台对纹理进行压缩,部分压缩格式,如 DXT5nm 会有不同的采样公式,因此建议直接使用 Unity 内置的 UnpackNormal(tex2D(贴图,UV))
方法获取正确的法线位置
# 渐变纹理
使用半兰伯特值对渐变贴图进行纹理采样再乘以光照颜色和默认颜色得到漫反射颜色
fixed halfLambert = 0.5*dot(worldNormal,worldLightDir)+0.5
fixed3 diffuse = tex2D(渐变纹理,fixed2(halfLambert,halfLambert)).xyz * 默认颜色 * 光照颜色
注意:需要把 Wrap Mode 设置为 Clamp,Repeat 模式下会将精度为 1.00001 的变为 0.00001,导致颜色变黑
# 遮罩纹理
遮罩纹理作用于对颜色分布的二次处理,可以使最终颜色更加细腻。例如某些模型表面需要暗一些,可以用较暗的颜色填充这一部分遮罩纹理贴图的某个通道,使最终效果颜色值与该通道相乘变小。总共有 rgba 四个通道可以使用,如高光反射区域放在 r 通道中,反射指数放在 b 通道中等。。。