中EN
概念页

半透明表面与折射

Translucent Surfaces & Refraction

更新于 2026-10-15 约 8 分钟透明透射率折射焦散色散混合

玻璃、水、红酒等高吸收、低散射材质:覆盖率 α\alpha 与透射率 TrT_r 是两回事——前者遮挡背景,后者按波长过滤背景。厚度变化时按 Beer-Lambert 定律计算彩色透射;折射可用环境贴图或屏幕空间扰动近似,粗糙表面按粗糙度模糊背景;焦散则用动画贴图、光线光栅化或图像空间光子溅射近似(RTR4 14.5 节)。

覆盖率与透射率

情形混合公式
覆盖率(如织物纤维遮住一部分)co=αcs+(1−α)cb\mathbf{c}_o=\alpha\mathbf{c}_s+(1-\alpha)\mathbf{c}_b
半透明(固体体积过滤背景)co=cs+Trcb\mathbf{c}_o=\mathbf{c}_s+T_r\mathbf{c}_b
两者统一(McGuire 与 Mara)co=α(cs+Trcb)+(1−α)cb\mathbf{c}_o=\alpha(\mathbf{c}_s+T_r\mathbf{c}_b)+(1-\alpha)\mathbf{c}_b

cs\mathbf{c}_s 含固体表面的镜面反射,TrT_r 是三分量颜色;彩色半透明可用双源颜色混合输出两个颜色。Drobot 讨论了反射与透射是否带颜色时的不同混合方式。

厚度与彩色透射

Tr=e−σtdT_r=e^{-\sigma_td}

  • 为方便美术,Bavoil 让美术指定距离 dd 处的目标透射色 tc\mathbf{t}_c,反推 σt=−log⁡(tc)d\sigma_t=\dfrac{-\log(\mathbf{t}_c)}{d}。例:tc=(0.3,0.7,0.1)\mathbf{t}_c=(0.3,0.7,0.1)、d=4d=4 m 得 σt=(0.3010,0.0892,0.5756)\sigma_t=(0.3010,0.0892,0.5756)。透射率为 0 需特判,例如各分量减去 0.000001。
  • 薄壳(单层薄材质):Drobot 按视线在厚度 tt 中走过的路径 d=tmax⁡(0.001, n⋅v)d=\dfrac{t}{\max(0.001,\ \mathbf{n}\cdot\mathbf{v})} 计算,掠射时遮挡更强。
  • 实体:先渲染视线离开体积处的表面(水晶球背面、海底)并存深度,再渲染体积表面,在着色器中求距离。要求凸闭合(每像素一入一出);凹物体用深度剥离按从后往前处理每段;同材质且无反射时可累加距离一次算;也可用 A-buffer/K-buffer 单 pass 存片元。大片海水直接把场景深度当海底。
  • 必须考虑菲涅尔效应:掠射角下几乎全部反射,水下物体被水面遮住。

折射

未反射的光被透射,通量透射比为 1−f1-f,但辐射亮度因投影面积和立体角差异:

Lt=(1−F(θi))sin⁡2θisin⁡2θtLi=(1−F(θi))n22n12LiL_t=(1-F(\theta_i))\frac{\sin^2\theta_i}{\sin^2\theta_t}L_i=(1-F(\theta_i))\frac{n_2^2}{n_1^2}L_i

  • Bec 的高效折射向量:t=(w−k)N−nl\mathbf{t}=(w-k)\mathbf{N}-n\mathbf{l},其中 n=n1/n2n=n_1/n_2,w=n(l⋅N)w=n(\mathbf{l}\cdot\mathbf{N}),kk 由 ww 与 nn 计算(见原书式 14.29),结果需归一化。折射率:水约 1.33,玻璃约 1.5,空气约 1.0。
  • 色散:折射率随波长变化,形成棱镜与彩虹;镜头中即色差(摄影中的紫边)。图形学通常忽略,只用一条折射光线;部分 VR 渲染器施加反向色差以补偿头显透镜。
  • 环境贴图折射:在物体位置生成立方体贴图,正面按折射方向采样。
  • 屏幕空间折射(Sousa):先不含折射物渲染场景纹理 ss;再把折射物写入预清为 1 的 alpha 通道(通过深度测试写 0);最后用法线切向 xy 分量扰动采样 ss,仅在 α=0\alpha=0 时采用,避免把前方物体当背景拉进来;也可改用深度比较,扰动样本更近就退回普通样本。
  • 这些方法只在入射时弯折一次,忽略出射界面,但人眼较宽容。屏幕外的东西无法参与折射。
  • 粗糙折射:《毁灭战士》(2016) 将场景降到半分辨率并生成 4 级 mip,每级用模拟 GGX 波瓣的高斯模糊,折射网格按粗糙度映射 mip 级采样,越粗糙越模糊;McGuire 与 Mara 单 pass 用高斯点扩散函数采样。
  • 多层折射:每层存深度与法线纹理,按类似浮雕映射的方式把深度视为高度场行进求交(Oliveira 与 Brauwers 处理背面折射);附近不透明物体可转为颜色+深度图作为最后一层。

焦散与阴影

焦散是光线偏离直线后在某些区域散焦(形成阴影)、在另一些区域聚焦(变亮)的结果,例如咖啡杯中的心形反射焦散、透过水晶或水杯的折射焦散;水下汇聚的光路在水体中形成光柱。它独立于界面菲涅尔衰减和体内透射率。

  • 动画焦散贴图:离线生成的焦散动画作为光照贴图叠加(《孤岛危机 3》);水体顶面由凹凸动画或物理模拟驱动,其法线向上下垂直投影映射为亮度贡献,美术设定基于高度的最大影响距离。
  • 水下光柱(Lanza):从光源视角渲染水面位置与折射方向到纹理,再从水面沿折射方向光栅化线条,叠加混合并后处理模糊以掩盖线条稀少。
  • 图像空间焦散(Wyman):经物体正背面两次折射求光子位置与入射方向,纹理中存场景交点、折射后方向和菲涅尔透射率,每个纹素作为光子用高斯衰减的四边形在视空间或光空间溅射。
  • 简化(McGuire 与 Mara):按透明表面法线改变透射率——垂直时透射多,否则少,得到类焦散的阴影。

GPU Gems 的视角:分层距离图上的多次镜面反射/折射(GPU Gems 3 第 17 章)

来源:Umenhoffer / Patow / Szirmay-Kalos;摘录 Chapter 17. Robust Multiple Specular Reflections and Refractions — Umenhoffer et al.。在环境贴图思路上塞入距离与法线,让片元着色器能追二次射线。

分层立方体距离图存颜色、到参考点距离、法线;可用深度剥离建多层。求交:在纹理空间均匀射线行进保证不漏,再用割线法精炼;min-max 球加速。多次弹射读法线与 Fresnel(Schlick,金属用含消光系数的 F⊥F_\perp);折射率符号区分反射体/漫反射/折射体。反射物体常只画前后两层 + 一层环境。动态分支下增加最大深度对帧率影响很小。局限:层数与分辨率不足会糊/漏;薄物体要求更细的行进步长。适合游戏引擎内的自我反射茶壶/镜面球,而非通用路径追踪。

GPU Gems 的视角:通用屏幕空间折射(GPU Gems 2 第 19 章)

来源:Tiago Sousa(Crytek)《Generic Refraction Simulation》;摘录 Chapter 19. Generic Refraction Simulation — Tiago Sousa (Crytek)。Far Cry 水系/热浪/瞄准镜透镜等方法的推广,也是后续许多屏幕空间折射的源头。

先把非折射几何渲进纹理 SS,折射网格用法线贴图 XY 扰动投影 UV 去采 SS——无需每物体一张环境图,水面也无需「裁掉水面以上再渲一遍」的折射 pass。

大扰动会把前景物体「折射」进折射体:把 SS 的 alpha 清成白,折射网格只往 alpha 涂黑作遮罩;扰动采样与未扰动采样按 alpha 混合,保证扰动落点仍在折射体屏幕足迹内。水:遮罩 + 独立反射图 + 多层动画 bump + Fresnel,距离混合深水色。玻璃:漫反射染色 × 折射 + 环境图 × Fresnel。局限:不同色折射体重叠会错,需从后往前更新 SS 或 alpha 混合。与 Gems3 分层距离图折射对照:本章是屏幕扰动,距离图是沿视射线的预积分。

GPU Gems 的视角:顶点纹理位移做真实水面(GPU Gems 2 第 18 章)

来源:Yuri Kryachko《Using Vertex Texture Displacement for Realistic Water Rendering》(Pacific Fighters);摘录 Chapter 18. Using Vertex Texture Displacement for Realistic Water — Yuri Kryachko。

SM3.0 顶点纹理采样:低频大振幅高度图真正挤出水面网格,高频细节仍靠法线贴图光照。多张平铺高度图叠加,VS 分支做 LOD/性能。介于 Tessendorf FFT 流体与「平面 + 法线」之间。与同书 Ch19 屏幕空间折射、Fresnel 反射搭配,即当年主流海面配方。

  1. realtime_rendering_4ed.pdf 第 14 章 Volumetric and Translucency Rendering
  2. Chapter 17. Robust Multiple Specular Reflections and Refractions — Umenhoffer et al.
  3. developer.nvidia.com/gpugems/gpugems3/part-iii-rendering/chapter-17-robust-multiple-specular-reflections-and-refractions
  4. Chapter 19. Generic Refraction Simulation — Tiago Sousa (Crytek)
  5. developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-19-generic-refraction-simulation
  6. Chapter 18. Using Vertex Texture Displacement for Realistic Water — Yuri Kryachko
  7. developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-18-using-vertex-texture-displacement

相关页面

图形学参与介质与体积散射Participating Media & Volumetric Scattering参与介质是充满粒子、通过吸收和散射参与光传输的体积,如空气、水、雾、烟、云;皮肤、蜡等致密材质也有强烈散射——"一切都是散射"。实时渲染主要考虑单次散射:沿视线积分透射率衰减后的内散射光,内散射由相位函数和对光源的可见性(不透明阴影 × 体积阴影)决定。通用实时方案把介质材质和散射结果体素化到相机视锥体素 (froxel) 中逐片累积(RTR4 14.1、14.3、14.8 节)。图形学透明渲染与 Alpha 混合Transparency & Alpha Blending本页讲最简单的"视角相关"透明:半透明物体只衰减其后方物体的颜色。z-buffer 每像素只存一个表面,所以透明物体通常要从后往前用 over 运算符混合;顺序无关透明 (OIT) 方法用多遍渲染、逐像素链表或近似公式避免排序,各有内存、性能或准确性代价。预乘 alpha 让过滤、混合和合成更正确高效。图形学菲涅耳反射Fresnel Reflectance菲涅耳方程描述光在两种物质的平坦界面上反射的比例 F,它取决于入射角和两侧折射率:垂直入射时为材质特有的 F0(特征镜面色),掠射时趋于 1。实时渲染用以 F0 为参数的 Schlick 近似。电介质 F0 低且无色,金属 F0 高且常带色,半导体介于其间;金属度参数化利用了这一点。光从物体内部射向表面时还可能发生全内反射。本页对应 RTR4 9.5 节。图形学基于图像的光照Image-Based Lighting用纹理数据(通常是相机拍摄的 360° HDR 全景)照明场景称为基于图像的光照。实时引擎常用预滤波的高光立方体贴图(配合 split-sum 近似)处理高光,用辐照度环境贴图或球谐系数处理漫反射。它们只依赖少量光照图元而不需要知道场景其他表面,因此仍属局部光照。图形学实时次表面散射Real-Time Subsurface Scattering蜡、皮肤、牛奶等高散射固体中,光在离入射点不远处重新射出;当偏移大于一个像素时就不能再用 BRDF 表示。实时方法从便宜的包裹光照、法线模糊、预积分皮肤,到纹理空间/屏幕空间扩散,再到针对大尺度散射的深度图技术(RTR4 14.6 节)。图形学雾与简易体积光照Fog & Simple Volumetric Lighting这类"老派"技巧依赖经验模型,但至今仍然好用:深度雾、高度雾和局部雾体积用透射率混合雾色;光柱可用拉伸的面向相机粒子、单次散射的解析积分、平面切片,或屏幕空间径向模糊实现(RTR4 14.2 节)。图形学局部反射探针Localized Reflection Probes镜面全局光照需要高角分辨率但只关心反射方向附近的小立体角。实时中最流行的方案是在场景中稀疏放置局部环境贴图(反射探针),配合反射代理体做视差校正;它实现简单、快、美术可控,但有拉伸和漏光问题。另有体素锥追踪和平面反射等替代方案(RTR4 11.6–11.6.4 节)。图形学环境贴图Environment Mapping把球面函数记录在一张或多张图像里、用纹理查找来解码,就是环境贴图。它比其他球面表示占内存多,但解码简单快速,能表达任意高频和任意动态范围。最基本的用法是反射贴图:假设镜面 BRDF,用反射视线向量查表。本页比较经纬度、球面、立方体、双抛物面和八面体等投影。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原