GPU Gems 2 · Chapter 19. Generic Refraction Simulation

用表面法线、介质折射率和厚度近似计算折射方向,再通过环境或屏幕空间查询生成可控的透明材质效果。

学习目标

  • 能解释 Generic Refraction Simulation 如何把入射方向、表面法线和介质 IOR 变成折射方向,并区分方向计算与颜色查询
  • 能实现厚度或后表面深度近似、屏幕空间颜色采样和 total internal reflection fallback,说明每种近似的失效边界
  • 能调节 RefractionLab 的介质方向、入射角、IOR 与厚度,定位法线错误、偏移过大和临界角闪烁

先把“透明”拆成方向、距离和颜色

透明材质最容易被一张扭曲的环境图伪装:画面看起来像玻璃,但折射角、物体厚度和背面颜色之间没有可解释的关系。GPU Gems 2 第 19 章的 Generic Refraction Simulation 关注的是一条可实时近似的路径:先根据入射方向和法线计算光线进入介质后的方向,再用厚度、后表面或屏幕空间信息决定它应该看到什么颜色。

先打开实验,固定 IOR,分别切换 air → glass 与 glass → air。增大入射角时,预测折射方向是更靠近法线还是更贴近界面;再切到厚度调试,确认厚度只改变颜色查询偏移,而不会替代正确的方向计算。最后用 TIR 调试观察临界角附近为何不能继续采样透射颜色。

Generic refraction 实验

改变介质方向、入射角、IOR 与厚度,分辨折射方向、颜色偏移和全内反射。

refract:方向随 IOR 改变air · n≈1glass · n=IORNθᵢ 34°θₜ 21.888°查询记录IOR1.50transmitted21.9°thickness0.60lookup offset0.24sin θₜ ≤ 1sample refracted color角度接近临界值时,先看 TIR 证据,再决定 screen-space lookup 如何退化

先计算 refract 方向,再决定使用环境、后表面或 screen-space 颜色来源。

Generic Refraction Simulation:方向计算与颜色查询分层表面输入I · N · IORfront positiondepth / thickness方向阶段Snell / refractT · exit pointTIR fallback颜色阶段screen lookupenvironment / backfaceblend · Fresnel折射向量决定“看向哪里”,厚度与深度决定“穿过多少介质”

折射模拟至少有两个可以独立验证的输出:第一是 T 的方向,第二是沿 T 查询到的颜色。即使方向正确,厚度或屏幕空间投影错误也会让背景拉伸;即使颜色查询看起来平滑,方向错误也会让 IOR 和视角失去意义。把它们分开显示,才能知道问题在几何、向量还是纹理坐标。

1. 用 Snell 定律计算折射方向

设入射介质折射率为 n1n_1,出射介质折射率为 n2n_2,法线方向为 NN。折射角满足:

n1sin(θi)=n2sin(θt). n_1\sin(\theta_i)=n_2\sin(\theta_t).

GPU shader 通常直接使用 refract(I, N, eta) 形式的向量函数,其中 eta=n1/n2eta=n_1/n_2。实现时要先把 IINN 归一化,并保证它们位于同一坐标空间。若法线来自法线贴图,需要先从切线空间变到世界或视图空间,再参与折射计算。

Snell:折射只改变法线方向上的分量medium 1 · n₁medium 2 · n₂normal Nθᵢθₜn₁ sin(θᵢ) = n₂ sin(θₜ);如果 sin(θₜ) 超过 1,就不能继续传播

etasin(θi)>1eta\sin(\theta_i)>1 时,θt\theta_t 不存在,光线不会离开当前介质,这就是 total internal reflection。不能把无效的平方根或 NaN 继续送进颜色采样;应检测判别式,使用反射向量作为 fallback,并在材质边缘保持连续。

2. 用厚度与后表面补回“穿过多少介质”

只知道 front surface 的位置和法线时,折射光线可以告诉我们“朝哪个方向看”,但不知道它在物体内部走了多远。薄片、球体和厚玻璃在相同 front normal 下会产生不同的颜色偏移,因此通用方案常用一个厚度代理:厚度纹理、backface depth、双层位置或预计算的 object-space thickness。

front → inside → back:厚度决定颜色偏移front surfaceback surfaceinside distance / thicknessoffset = T · thickness → lookup UV只有 front normal 的近似会失去后表面信息;厚度纹理或 backface depth 能补回一部分证据

一种可解释的近似是先在 front surface 计算 TT,再用厚度 dd 沿 TT 推进到估计的 exit point:pexitpfront+dTp_{exit}\approx p_{front}+dT。随后把 exit point 投影到环境、后表面或屏幕空间,取得透过物体后的颜色。这个模型不等同于完整的光线与真实背面相交,但它把厚度参数和颜色偏移联系起来,便于按材质调节。

如果使用 backface depth,需要确认前后深度位于相同投影和线性化空间;直接相减非线性 depth 值会让远处厚度严重失真。screen-space 方案还需要处理射线走出屏幕、穿过别的物体或投影到透明物体自身之外的情况。遇到查询失败时,宁可使用环境颜色或反射 fallback,也不要把越界坐标 clamp 成一条明显的拉伸带。

3. 把方向投影成可查询的颜色

颜色来源有三类:环境图适合没有可见背景的封闭场景,屏幕颜色适合把场景背景折射进透明物体,后表面缓存适合需要近似穿透顺序的物体。三者都不是免费的真实光传输:环境图缺乏局部遮挡,屏幕颜色缺少屏幕外信息,后表面缓存需要额外的渲染目标和深度管理。

generic refraction 的误差来自哪里?normal方向偏差 → 高光/折射抖动IOR介质参数错 → 弯折角错误thickness深度近似错 → 偏移过大screen lookup投影出界 → 拉伸/黑洞先建立可解释的近似,再把误差限制在材质、视角和屏幕 footprint 能接受的范围

折射颜色常与 Fresnel 权重混合:正视角更多看到透射,掠射角更多看到反射。混合时要让反射与透射的颜色、曝光和 alpha 处在一致的能量约定中。若直接把两个未预乘颜色相加,边缘会过亮;若透明排序和深度写入不一致,正确的折射方向也会被错误遮挡。

三步实验:从向量到透射颜色

每一步只改变一个变量,记录入射角、IOR、折射角、TIR 状态和颜色查询偏移。不要用最终颜色单独判断方向正确性;先观察向量和命中点,再恢复材质混合。

分步1 / 3

第一步:验证 refraction vector

选择 air → glass,固定厚度,只改变 incident angle 与 IOR。预测 θₜ 如何变化,再用 Snell 图核对 n₁、n₂ 顺序、法线方向和归一化状态。

Snell:折射只改变法线方向上的分量medium 1 · n₁medium 2 · n₂normal Nθᵢθₜn₁ sin(θᵢ) = n₂ sin(θₜ);如果 sin(θₜ) 超过 1,就不能继续传播

常见误区

本章小结

  • Generic Refraction Simulation 先计算 refraction vector,再决定用环境、后表面或 screen-space lookup 得到透射颜色;方向和颜色来源必须分开验证。
  • Snell's law 由 n₁、n₂、法线和入射方向决定折射角;IOR 顺序错误或未检测 total internal reflection 会产生 NaN、黑洞和闪烁。
  • thickness proxy 让通用近似获得“穿过多少介质”的信息,但厚度应在 exit point/颜色查询阶段使用,不能替代方向公式。
  • 屏幕空间查询需要 validity 和边界 fallback;不能用 clamp 把越界样本伪装成有效背景。
  • 发布前应分别回归正视角、掠射角、玻璃到空气、厚度变化、屏幕边缘和透明排序,再决定近似是否满足材质预算。

练习

问题 1|计算折射角。 光线从空气进入 IOR 为 1.5 的玻璃,入射角为 30°。请写出折射角的计算关系,并说明 shader 需要先做什么。

问题 2|诊断黑洞。 玻璃到空气的折射在掠射角突然变黑。你会检查哪些证据?

问题 3|选择厚度方案。 一个凸透镜需要近景可见的背景变形,但屏幕外信息不可避免。你会如何组合厚度、后表面和环境 fallback?

名词解释

本章出现的专业名词,用大白话再讲一遍。

refraction vector
index of refraction
Snell’s law
total internal reflection
thickness proxy
screen-space lookup

资料与写作方式声明

本章以GPU Gems 2 · Chapter 19. Generic Refraction Simulation权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…