半透明表面与折射
Translucent Surfaces & Refraction
玻璃、水、红酒等高吸收、低散射材质:覆盖率 与透射率 是两回事——前者遮挡背景,后者按波长过滤背景。厚度变化时按 Beer-Lambert 定律计算彩色透射;折射可用环境贴图或屏幕空间扰动近似,粗糙表面按粗糙度模糊背景;焦散则用动画贴图、光线光栅化或图像空间光子溅射近似(RTR4 14.5 节)。
覆盖率与透射率
| 情形 | 混合公式 |
|---|---|
| 覆盖率(如织物纤维遮住一部分) | |
| 半透明(固体体积过滤背景) | |
| 两者统一(McGuire 与 Mara) |
含固体表面的镜面反射, 是三分量颜色;彩色半透明可用双源颜色混合输出两个颜色。Drobot 讨论了反射与透射是否带颜色时的不同混合方式。
厚度与彩色透射
- 为方便美术,Bavoil 让美术指定距离 处的目标透射色 ,反推 。例:、 m 得 。透射率为 0 需特判,例如各分量减去 0.000001。
- 薄壳(单层薄材质):Drobot 按视线在厚度 中走过的路径 计算,掠射时遮挡更强。
- 实体:先渲染视线离开体积处的表面(水晶球背面、海底)并存深度,再渲染体积表面,在着色器中求距离。要求凸闭合(每像素一入一出);凹物体用深度剥离按从后往前处理每段;同材质且无反射时可累加距离一次算;也可用 A-buffer/K-buffer 单 pass 存片元。大片海水直接把场景深度当海底。
- 必须考虑菲涅尔效应:掠射角下几乎全部反射,水下物体被水面遮住。
折射
未反射的光被透射,通量透射比为 ,但辐射亮度因投影面积和立体角差异:
- Bec 的高效折射向量:,其中 ,, 由 与 计算(见原书式 14.29),结果需归一化。折射率:水约 1.33,玻璃约 1.5,空气约 1.0。
- 色散:折射率随波长变化,形成棱镜与彩虹;镜头中即色差(摄影中的紫边)。图形学通常忽略,只用一条折射光线;部分 VR 渲染器施加反向色差以补偿头显透镜。
- 环境贴图折射:在物体位置生成立方体贴图,正面按折射方向采样。
- 屏幕空间折射(Sousa):先不含折射物渲染场景纹理 ;再把折射物写入预清为 1 的 alpha 通道(通过深度测试写 0);最后用法线切向 xy 分量扰动采样 ,仅在 时采用,避免把前方物体当背景拉进来;也可改用深度比较,扰动样本更近就退回普通样本。
- 这些方法只在入射时弯折一次,忽略出射界面,但人眼较宽容。屏幕外的东西无法参与折射。
- 粗糙折射:《毁灭战士》(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,金属用含消光系数的 );折射率符号区分反射体/漫反射/折射体。反射物体常只画前后两层 + 一层环境。动态分支下增加最大深度对帧率影响很小。局限:层数与分辨率不足会糊/漏;薄物体要求更细的行进步长。适合游戏引擎内的自我反射茶壶/镜面球,而非通用路径追踪。
GPU Gems 的视角:通用屏幕空间折射(GPU Gems 2 第 19 章)
来源:Tiago Sousa(Crytek)《Generic Refraction Simulation》;摘录 Chapter 19. Generic Refraction Simulation — Tiago Sousa (Crytek)。Far Cry 水系/热浪/瞄准镜透镜等方法的推广,也是后续许多屏幕空间折射的源头。
先把非折射几何渲进纹理 ,折射网格用法线贴图 XY 扰动投影 UV 去采 ——无需每物体一张环境图,水面也无需「裁掉水面以上再渲一遍」的折射 pass。
大扰动会把前景物体「折射」进折射体:把 的 alpha 清成白,折射网格只往 alpha 涂黑作遮罩;扰动采样与未扰动采样按 alpha 混合,保证扰动落点仍在折射体屏幕足迹内。水:遮罩 + 独立反射图 + 多层动画 bump + Fresnel,距离混合深水色。玻璃:漫反射染色 × 折射 + 环境图 × Fresnel。局限:不同色折射体重叠会错,需从后往前更新 或 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 反射搭配,即当年主流海面配方。
出处
- realtime_rendering_4ed.pdf 第 14 章 Volumetric and Translucency Rendering
- Chapter 17. Robust Multiple Specular Reflections and Refractions — Umenhoffer et al.
- developer.nvidia.com/gpugems/gpugems3/part-iii-rendering/chapter-17-robust-multiple-specular-reflections-and-refractions
- Chapter 19. Generic Refraction Simulation — Tiago Sousa (Crytek)
- developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-19-generic-refraction-simulation
- Chapter 18. Using Vertex Texture Displacement for Realistic Water — Yuri Kryachko
- developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-18-using-vertex-texture-displacement