PHASE 2 · 效果工坊

2.3玻璃工坊

毛玻璃、格栅玻璃与水珠折射

iOS 的磨砂面板、装修里大火的长虹玻璃(格栅玻璃)、淋浴房挂满水珠的雾面——这些「透过玻璃看世界」的质感,是 UI 设计的高级感担当。而在 Shader 眼里,它们是同一个把戏的三种变体:玻璃从不改变颜色,它只是让每个像素「看错位置」

1玻璃 = 会撒谎的 UV

光穿过玻璃会发生折射:表面法线歪一点,光线路径就偏一点,你看到的就不是正后方的东西,而是旁边某处的东西。物理公式是斯涅尔定律,但 Shader 里我们只取它的视觉本质:

GLSL · 折射的 Shader 化简
// 玻璃效果的全部本质:
// 表面在这一点越"歪"(法线偏移越大),采样位置就偏得越远
vec2 normal2D = 玻璃表面在此处的倾斜方向;   // ← 三种玻璃只有这里不同
vec3 color = texture(uTex, uv + normal2D * strength).rgb;

于是三种玻璃的区别,完全落在「表面倾斜(法线)怎么分布」上:

玻璃表面形状法线分布视觉结果
毛玻璃无数随机micro凸起逐像素随机影像被均匀打散 → 朦胧
格栅玻璃一排竖向半圆柱横向周期性摆动影像被竖条纹压缩重复
水珠玻璃散落的球面凸起珠内径向、珠外平坦珠里是缩小倒像,珠外平静

2毛玻璃:随机的谎言

毛玻璃表面的微观凸起完全无序——1.5 章的 hash 正好就是「逐像素随机」。每个像素往随机方向偏移采样,再多采几次取平均(不然是噪点而不是磨砂),最后兑一点白色模拟乳浊感:

Android 视角 毛玻璃面板

iOS 风的「毛玻璃卡片」在 Android 12+ 的正统做法:Modifier.blur()RenderEffect.createBlurEffect() 做主模糊(系统实现,多 pass 降采样,比我们手写的快),再叠一层本节的随机扰动 + 白色乳浊 + 细噪点纹理,质感立刻从「糊」升级成「磨砂玻璃」。差别就在后面这层「材质感」,这正是 Shader 的价值。

3格栅玻璃:规律的谎言

格栅玻璃(长虹玻璃/Reeded Glass)的表面是一排竖向半圆柱。圆柱面的法线有个漂亮的性质:在条纹中心指向正前(不偏移),越靠条纹边缘越向侧面倾斜(偏移越大)。所以每根条纹内部,图像被「横向挤压再展开」,而竖直方向完好无损——这就是它标志性的竖条纹朦胧:

拆开看只有三笔:法线折射(核心)、固定位置的高光条(圆柱面总有一个角度恰好把光反进你眼睛)、柱缝暗线。后两笔不参与折射,纯粹是「材质细节」,但删掉它们,效果立刻从「长虹玻璃」退化成「波浪扭曲」——质感藏在光影细节里,不在扭曲本身,这是效果工坊最重要的一课。

4水珠玻璃:圆形的谎言

淋浴房玻璃 = 平坦区域(轻磨砂)+ 散落的水珠(球面透镜)。球面透镜的性质:珠子里是周围景象的缩小倒像。用 1.3 章的网格 + 1.5 章的 hash 撒珠子,珠内做「反向放大采样」:

1.3 章预告的坑来了

珠心随机偏移 + 半径随机,珠子就可能压到格子边界被切一刀。本 Demo 靠「偏移量 ≤0.25 + 半径 ≤0.3」硬约束保证不越界;想要真·自由分布,把「检查本格」改成「检查周围 3×3 共九个格子,取最近的珠」——多一层循环,九倍采样,值不值看场景。滴落动画(珠子下滑拖尾)也是同一套框架加 uTime,搜 Shadertoy「Heartfelt」看满分答卷。

5通用配方:法线场思维

回看三种玻璃,配方完全一致,可以抽象成一个统一框架——这也是你自己发明新玻璃的模板:

GLSL · 玻璃通用框架
// ① 描述表面:每个位置的"倾斜方向"(2D 法线场)
vec2 n = surfaceNormal(uv);     // 毛玻璃=hash / 格栅=柱面 / 水珠=径向

// ② 折射:按法线偏移采样(可多次采样平均)
vec3 col = texture(uTex, uv + n * strength).rgb;

// ③ 材质细节:高光、暗缝、乳浊、薄雾 —— 质感的来源
col += specular(uv);  col = mix(col, milk, fog);

用这个框架自造效果:法线换成 1.5 章的 fbm 梯度 → 熔化的冰面;法线取自另一张纹理(比如文字图)→ 「浮雕玻璃 logo」;法线随 uTime 流动 → 热浪空气扭曲。第③步永远别省——那是质感的一大半。

本章小结

  • 玻璃不改颜色,只让像素「看错位置」:效果 = 法线场 × 折射强度。
  • 毛玻璃 = 逐像素随机法线 + 多次采样平均 + 乳浊白;单次采样是噪点,多次才是磨砂。
  • 格栅玻璃 = 竖条纹内的柱面法线(中心 0、边缘大)+ 固定高光条 + 柱缝暗线。
  • 水珠玻璃 = 网格 hash 撒珠 + 珠内负系数放大采样(倒像)+ 边缘高光;注意格界裁剪。
  • 质感在细节:高光、暗缝、薄雾这些「不参与折射的第③步」决定成色。

动手练习

  1. 把格栅玻璃转 90° 变成「百叶玻璃」(横条),再让 strips 随 uMouse.y 变化——鼠标上下滑动调节条纹密度。
  2. 组合两章效果:先乐高化(2.2),再蒙一层毛玻璃——注意顺序,先玻璃后乐高会得到完全不同(也挺有趣)的结果,想想为什么。
  3. 用「法线场框架」自造热浪效果:法线 = 随时间上涌的 fbm 梯度(对 fbm 在 x 方向差分),强度顶部大底部小,叠在照片上做出「路面热气蒸腾」。