[toc]

# 各种 Map

只用来记录一些 Map 中所需要特别注意的一些地方

# NormalMap - 法线贴图

简单来说,NormalMap 是用来解决简单表面的细节不足的问题的

# 切线空间 - TBN

切线空间的实际意义:

切线空间是在计算物体表面法线时,通过将副切线映射到 UV 坐标的 V, 切线映射到 UV 坐标的 U, 法线方向为垂直于 UV 贴图的方向 这三个轴建立 基坐标系 然后在基坐标系下通过 rgb 对 TBN 的权重来计算世界坐标下的向量,每个顶点都有属于自己的切线空间

  • 法线贴图定义在切线空间中
    • T 沿着 U 增大的方向
    • B 沿着 V 减小的方向
    • N 垂直于 T 和 B

通过切线空间可以构建出 TBN 矩阵 (从世界坐标转换到切线空间), 在计算前有一些点需要注意一下:
A-0: 法线贴图存储的是 TBN 矩阵的三个分量,T/B/N (实际上是个向量) - (r/g/b) A: 法线贴图中的值是 rgb 值 (0~1)
B: 在进行计算前,需要将 rgb 值转换到 (-1,1) 范围内
C: 求切线空间到世界空间的公式为: N\_World = T\*r + B\*g + N\*b C-0: 对于纯蓝色的法线贴图而言,求出的法线 <=> 原本模型的法线 D: TBN是正交矩阵,逆矩阵就是它的转置 在 Unity 中.
A: T 变量可以直接通过 shader 中的 tangent 获得
B: N 变量就是 normal
C: (副切线) B = N x T (为什么是 N 叉乘 T 呢?主要是因为 Unity 使用的是左手坐标系,三轴方向必须严格一致,所以,如果 NxT 反了,求出的结果也会反过来)
D: 上面有说切线空间的实际范围和 rgb 范围不一致,所以 Unity 提供了 UnpackNormal 函数可以把法线贴图的 rgb 值转换到切线空间范围 另外有一点,就是可以将视线向量和光线向量在顶点着色器阶段转换到切线空间内。
由于切线空间实际上是定义在一个 三角形的顶点上的 ,比如得到了三个顶点的切线空间的视角向量,那么就可以通过法线插值得到三角形内任意一个片元在切线空间内的视角向量.
使用切线空间的视角,就可以直接在 UV 贴图上进行视线方向的模拟,(比如视察贴图)


# CubeMap

  • 如果想在不透明物体上模拟穿透的效果,可以使用 CubeMap, 并用视角方向采样

# MatCap

就是 Material Capture


# Parallax Mapping

视察贴图

用切线空间下的视角方向偏移 UV
可以使用 HeightMap 进行更精细的控制 ASE Demo:


# Flow Map

就是 UV 流动图 可以用 FlowMapPainter 这个软件来手动绘制流动图