这一篇的目标不用公式只用身边能看到的东西讲清楚两件事什么是“各向异性”什么是“各向异性高光”看懂之后再回头看上一篇里的 Kajiya-Kay、各向异性 GGX会容易很多。一、先说结论词大白话各向同性不管从哪个方向看、摸、用性质都一样各向异性换个方向性质就不一样普通高光灯光在物体表面的反光通常是圆形光斑各向异性高光因为表面在不同方向上“光滑程度不同”反光被拉成一条长带或一个光环如果只记一句话表面有“纹路方向”反光就会被拉长这就是各向异性高光。二、什么是“各向异性”先忘掉渲染“各向异性”不是图形学专有的词它来自物理和材料学。拆开看各向各个方向异性性质不同也就是沿不同方向这个东西的表现不一样。1. 生活中的各向异性例子方向 A方向 B说明劈木头顺着木纹劈一下就开横着木纹劈很难劈开木纤维有方向撕纸某个方向撕裂口很直换个方向撕裂口歪歪扭扭纸纤维在造纸时朝一个方向排列切肉顺纹切肉丝很长、嚼不烂横纹切肉丝短、口感嫩肌肉纤维有方向厨师常说“横切牛羊肉”摸猫顺毛摸很顺滑逆毛摸扎手毛的倾斜方向拉布料沿经线、纬线拉几乎拉不动斜着拉很有弹性纱线的编织方向劈竹子顺着竹子劈一刀到底横着砍很费力竹纤维纵向排列这些东西的共同点内部或表面有“纹路”纹路有方向。2. 生活中的各向同性例子说明玻璃往哪个方向敲碎法都差不多橡皮泥往哪个方向捏、拉手感都一样水没有方向可言一块抛光的钢球表面朝哪个方向都一样光滑这些东西没有纹路或者纹路是杂乱无章、不分方向的。3. 一个判断方法转一转把物体原地转一下例如旋转 90°它的表现变不变不变 → 各向同性变了 → 各向异性木头转 90° 之后原来好劈的方向变成了难劈的方向——各向异性。玻璃怎么转都一样——各向同性。后面判断高光时也用同一个方法。三、什么是“高光”高光本质上就是灯在物体表面的倒影。1. 越光滑倒影越清楚表面看到的高光镜子灯的清晰倒影灯是什么形状倒影就是什么形状台球、汽车漆一个很小、很亮的光点苹果、塑料玩具一个稍大、边缘柔和的光斑磨砂塑料、橡胶一大片模糊的微弱亮光粉笔、纸几乎看不到高光越光滑 ──────────────────────────────────────────→ 越粗糙 镜子 台球 苹果 磨砂塑料 ✦ ● ⬤ ░░░░░ 清晰倒影 小亮点 中光斑 一大片模糊2. 为什么粗糙的表面光斑大在显微镜下看“粗糙”其实就是表面有很多朝向各不相同的小斜面。光滑表面像一面大镜子 粗糙表面像很多小镜子朝向乱七八糟 ───────────────────── ╱╲╱‾╲_╱╲╱‾╲╱╲_╱ 所有地方朝向一致 每一小块朝向都不一样 → 光只往一个方向反射 → 光被反射到各个方向 → 光斑小而集中 → 光斑大而分散关键结论光斑的大小反映的是表面的粗糙程度。光滑 → 光斑窄粗糙 → 光斑宽注意普通的粗糙表面小斜面是乱的、不分方向的所以光斑往各个方向散开得一样多——光斑是圆的。这就是各向同性高光。四、把两者合起来各向异性高光1. 如果表面“一个方向光滑另一个方向粗糙”会怎样想象一块不锈钢板用砂纸只沿左右方向反复打磨表面会留下无数条平行的细槽——这就是拉丝不锈钢。俯视拉丝不锈钢板细槽沿左右方向 ════════════════════════════ ════════════════════════════ ════════════════════════════ ════════════════════════════现在分别从两个方向“切开”看它的表面① 沿着细槽方向左右切开看侧面 ────────────────────────── 几乎是平的像镜子 → 这个方向上光不会散开 → 光斑“窄” ② 垂直细槽方向上下切开看侧面 ⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒ 一个个小圆弧朝向各不相同 → 这个方向上光被散开 → 光斑“宽”一个方向窄、一个方向宽合起来就是——一条长带普通抛光钢板的高光 拉丝钢板的高光细槽沿左右方向 ┌──────────────┐ ┌──────────────┐ │ │ │ ┃ │ │ ● │ │ ┃ │ │ │ │ ┃ │ ← 光斑沿上下方向被拉长 │ │ │ ┃ │ └──────────────┘ └──────────────┘ 圆形光斑 细长光带这就是各向异性高光表面在不同方向上的光滑程度不同所以反光在一个方向上集中、在另一个方向上散开光斑被拉成了长条。2. 一个反直觉但很重要的规律高光带的方向与纹路的方向垂直。细槽是左右方向 → 高光带是上下方向头发是上下生长 → 高光是一圈横向的光环原因就是上面那张剖面图光是在“横穿纹路”的方向上被散开的所以光斑往这个方向拉长。3. 用“转一转”来验证还记得第二节的判断方法吗操作抛光钢球 / 抛光钢板拉丝钢板把物体原地旋转 90°光斑还是圆的没有变化光带跟着转了 90°从竖条变成横条结论各向同性各向异性五、大量案例身边的各向异性高光案例 1拉丝不锈钢直线纹路在哪能看到电梯门、冰箱门、不锈钢水槽、笔记本电脑外壳、拉丝不锈钢保温杯、厨房抽油烟机面板。纹路高光平行的直线细槽一条与细槽垂直的光带边缘发虚特征手电照上去看到的不是一个光点而是一道“光柱”。走动时光柱会跟着移动。案例 2锅底、金属锅盖同心圆纹路在哪能看到不锈钢锅的锅底、铝制锅盖、车床加工过的金属圆盘、汽车轮毂的车削面。锅底的纹路一圈圈同心圆 看到的高光穿过圆心的放射状光带 ╭──────╮ ╲ ╱ ╭─┤╭────╮├─╮ ╲ ╱ │ ││ ◯ ││ │ ─────◯───── 或一条斜向光带 ╰─┤╰────╯├─╯ ╱ ╲ ╰──────╯ ╱ ╲为什么纹路是一圈圈的圆每个位置的纹路方向都是“绕着圆心转”按照“高光与纹路垂直”的规律高光就沿半径方向——从圆心往外放射。特征移动灯光时光带像钟表指针一样绕着圆心转动。案例 3手表表盘太阳纹在哪能看到很多手表的表盘纹路从中心向外放射像太阳光线表盘行业称为“太阳纹”。纹路高光从中心向外放射的直线一道弧形或环形的光为什么纹路沿半径方向高光就沿垂直于半径的方向——也就是圆周方向。案例 2 和案例 3 正好相反纹路是圆的高光就是放射的纹路是放射的高光就是圆的。这是理解“高光与纹路垂直”的最好例子。案例 4头发的“天使环”在哪能看到黑色长直发、动漫角色的头发、洗发水广告。头顶 ╭──────╮ │││││││││ 发丝从头顶竖直向下 │││││││││ ═══════════ ← 高光是一圈横向的光环天使环 │││││││││ │││││││││纹路高光每根发丝都是一根细长的圆柱整体沿上下方向排列一圈环绕头部的横向光环特征头发越顺、越直光环越明显头发乱了、卷了发丝方向变得杂乱光环就消失或变成零散的亮点扎成马尾、编成辫子后发丝方向改变高光的形状也跟着改变。游戏中的对比做法效果头发用普通高光头上一个圆形亮斑看起来像塑料头盔头发用各向异性高光出现横向光环看起来像一根根发丝这是各向异性高光在游戏中最常见、最重要的用途几乎所有二次元角色的头发都会处理。案例 5丝绸、缎面在哪能看到丝巾、缎面礼服、旗袍、领带。纹路高光纤维沿织物的经纬方向排列高光沿褶皱“流动”形成长条状的光泽特征同一块缎子横着放和竖着放亮度和光泽完全不同布料摆动时光泽像水一样在褶皱间流动。普通棉布没有这种效果因为纤维短而杂乱接近各向同性。案例 6其他例子物体纹路你会看到黑色猫狗的毛、马的鬃毛毛顺着一个方向倒伏顺毛方向上的光带天鹅绒绒毛方向一致用手往不同方向抚过颜色深浅不同磨过的金属刀面、拉丝铝合金手机边框打磨方向的细纹与打磨方向垂直的光带CD / 唱片的背面同心圆细槽放射状光带CD 上的彩虹色是另一个现象“衍射”不属于本文内容刷过清漆的木地板木纹方向沿木纹方向会有轻微拉长的反光六、自己动手验证不需要任何工具用手机手电就能看到实验 1勺子 vs 拉丝保温杯关灯打开手机手电照一照不锈钢勺子的背面抛光看到一个圆形小光点再照一照拉丝不锈钢保温杯或冰箱门看到一条长长的光带。前者是各向同性高光后者是各向异性高光。实验 2转一转找一块拉丝金属拉丝笔记本外壳、拉丝金属名片、拉丝铝片平放在桌上手电从上方照把它原地旋转 90°光带的方向跟着转了 90°。同样的操作对勺子做光点不会变形。这就是“各向异性”的直接证据。实验 3观察锅底找一个不锈钢锅翻过来用手电照锅底然后绕着锅移动手电会看到一条光带像指针一样绕着中心转。七、容易混淆的情况1. 高光被拉长不一定是各向异性雨夜马路、湖面上的路灯倒影常常被拉成长长的竖条。但这不是材质的各向异性而是因为你在很低的角度看水面掠射角——即使是普通的粗糙表面在这种角度下反光也会被拉长。区分方法还是转一转现象把表面原地旋转后原因湖面的路灯倒影倒影方向不变始终指向你观察角度造成与材质无关拉丝金属的光带光带跟着旋转材质本身有方向各向异性2. 各向异性过滤 ≠ 各向异性高光游戏画质设置里的“各向异性过滤Anisotropic Filtering”是让斜着看的地面贴图更清晰的技术属于贴图采样与光照、高光无关。只是都用了“各向异性”这个词描述的都是“不同方向上处理方式不同”。3. 高光只是“更大”不是各向异性粗糙表面的光斑更大、更模糊但仍然是圆的这是各向同性高光。只有光斑在某个方向上比另一个方向明显更长才是各向异性。八、程序里怎么表达理解了原理代码就很好懂了。1. 需要的信息不同普通高光各向同性各向异性高光表面朝向法线 N法线 N光滑程度一个数粗糙度两个数沿纹路方向的粗糙度、垂直纹路方向的粗糙度纹路方向不需要需要切线 T纹路方向和副切线 B垂直方向也就是说各向异性高光比普通高光多问了一个问题“这个表面的纹路朝哪个方向”在模型数据里这个方向通常由切线Tangent提供切线又取决于模型 UV 的展开方向。这就是为什么做头发时美术必须按发丝方向展开 UV。2. 用代码对比// 普通高光Blinn-Phong // 只关心半角向量 H 离法线 N 有多远 // 不管 H 往哪个方向偏容忍度都一样 → 圆形光斑 float specIso pow(saturate(dot(N, H)), shininess); // 各向异性高光简化示意思路来自 Ward 模型 // 把“H 偏离 N 的程度”拆成两部分 // 沿纹路方向 T 偏了多少、沿垂直方向 B 偏了多少 // 两个方向使用不同的“宽度”宽的方向光斑就被拉长 float ht dot(H, T) / widthT; // widthT沿纹路方向的宽度纹路方向光滑 → 取小值 float hb dot(H, B) / widthB; // widthB垂直纹路方向的宽度横穿纹路粗糙 → 取大值 float hn max(dot(H, N), 1e-4); float specAniso exp(-(ht * ht hb * hb) / (hn * hn));调参时的直观效果参数设置光斑形状对应的真实材质widthT widthB圆形抛光金属、塑料退化为普通高光widthT小widthB大沿 B 方向拉长的光带拉丝金属细槽沿 T 方向widthT大widthB小沿 T 方向拉长的光带拉丝金属细槽沿 B 方向两者都小小而亮的圆点镜面抛光两者都大大而模糊的圆斑磨砂表面对照第四节的剖面图沿纹路方向光滑→widthT小 → 这个方向上光不散开横穿纹路方向粗糙→widthB大 → 这个方向上光被散开结果光斑沿 B 方向拉长也就是高光带与纹路垂直。代码里的两个参数对应的就是“一个方向光滑、另一个方向粗糙”这件事。3. 头发的写法换个角度想头发常用Kajiya-Kay 模型思路和上面略有不同但同样可以用大白话理解。一根头发是一根细圆柱。圆柱的侧面朝向四面八方朝上的、朝下的、朝左的、朝右的都有。一根发丝的横截面圆形 ↑ ↖ ● ↗ 圆柱侧面的法线绕着发丝一圈朝向各个方向 ← ● → ↙ ● ↘ ↓所以判断一根头发能不能把光反射到眼睛里不需要看某个具体的法线只需要看H光线和视线的“中间方向”是否垂直于发丝方向 T只要 H 垂直于发丝圆柱侧面上总能找到一个正好朝向 H 的位置反光就会进入眼睛。// 普通高光H 和法线 N 越接近越亮 float specIso pow(saturate(dot(N, H)), shininess); // Kajiya-KayH 和发丝方向 T 越垂直越亮 float TdotH dot(T, H); float sinTH sqrt(saturate(1.0 - TdotH * TdotH)); // 越垂直sin 越接近 1 float specHair pow(sinTH, shininess);整头头发的发丝都是上下走向满足“H 垂直于发丝”的位置会连成一圈横向的线——这就是天使环。4. 切线方向错了会怎样各向异性高光完全依赖“纹路方向”而程序里的纹路方向来自切线切线又来自UV 的展开方向。用拉丝金属来类比情况相当于现实中游戏里的现象切线方向正确整块钢板沿同一方向拉丝一条连续、干净的光带切线方向整体错 90°把拉丝方向转了 90°光带方向不对例如头发高光变成竖条切线方向东一块西一块钢板被拼成很多小块每块拉丝方向不同光带断成碎片、扭曲、闪烁UV 接缝两侧方向不同两块拉丝方向不同的钢板拼在一起接缝处高光突然断开这就是上一篇反复强调的头发 UV 要按发丝方向展开。不是美术习惯问题而是各向异性高光的“纹路方向”就写在 UV 里。九、游戏中的典型应用材质常见做法不做各向异性时的问题角色头发Kajiya-Kay或贴图高光模拟像塑料头盔没有发丝感拉丝金属枪械、机甲、家电、载具零件各向异性 GGX 方向贴图看起来像普通抛光金属缺少工业质感车削金属轮毂、表盘、锅具各向异性 GGX 绕圆心的切线方向圆形零件缺少旋转纹的光泽丝绸、缎面服装各向异性高光或专门的布料模型像普通塑料布没有“流动”的光泽动物毛发毛发着色模型类似头发毛发显得僵硬并不是所有项目都需要。移动端、风格化项目通常只在头发上做各向异性写实项目才会在金属、布料上大量使用。十、自测这些是不是各向异性高光现象是否各向异性理由不锈钢勺子背面的圆形光点否表面没有纹路方向光斑是圆的冰箱拉丝门板上的竖直光柱是横向拉丝纹路光带与纹路垂直黑色长发头顶的横向光环是发丝竖直排列雨夜马路上被拉长的路灯倒影否低角度观察造成旋转路面倒影不跟着转锅底绕中心转动的光带是同心圆纹路磨砂塑料上一大片模糊亮光否只是粗糙光斑仍然是圆的缎面礼服褶皱上流动的光泽是纤维方向一致游戏设置里的“16x 各向异性过滤”否那是贴图采样技术不是光照小结把整个思路串起来有纹路方向的表面拉丝、发丝、纤维 │ ▼ 沿纹路方向光滑横穿纹路方向粗糙 │ ▼ 反光在一个方向集中在另一个方向散开 │ ▼ 光斑被拉成长条或光环 —— 各向异性高光 │ ▼ 高光带的方向与纹路垂直问题答案什么是各向异性沿不同方向性质不一样。判断方法原地转一转表现会变什么是高光灯在表面的倒影。越光滑光斑越小越粗糙光斑越大什么是各向异性高光表面在不同方向上光滑程度不同光斑被拉长成带状或环状最典型的例子拉丝不锈钢、锅底、手表太阳纹、头发天使环、缎面最重要的规律高光带与纹路方向垂直程序里多需要什么纹路方向切线 T / 副切线 B以及两个方向各自的粗糙度最常见的问题切线方向不对高光方向错、断裂、扭曲根源多在 UV 展开一句话概括普通高光只问“表面朝哪”各向异性高光还要问**“表面的纹路朝哪”**——纹路决定了光往哪个方向散开于是光斑就被拉成了一条带。
阅读完成 · 觉得有帮助?