计算机中的几何表示方法
本节旨在梳理在计算机图形学中表示三维物体形状的核心方法,重点介绍参数曲线(贝塞尔、B样条、NURBS、Catmull-Rom)的原理与特性。
一、 几何表示方法概述
在计算机中描述物体形状,主要有两种思路:隐式表示和显式表示。
1.1 隐式表示 (Implicit Representation)
核心观点: 通过一个数学关系或函数来定义物体,而不是直接给出物体的点。一个点如果在物体上,它的坐标 就会满足这个函数。
- 
关键方法: - 隐式曲面 (Implicit Surface): 由方程 定义的所有点的集合。例如,单位球可以简单地用 表示。
- 构造实体几何 (CSG - Constructive Solid Geometry): 通过对一些基础几何体(球、立方体等)进行布尔运算(并、交、差)来组合成复杂的形状。
- 距离函数 (Distance Functions): 存储空间中任意一点到物体表面的最近距离,通常带有符号(内部为负,外部为正),即 SDF (Signed Distance Field)。
- 水平集 (Level Sets): 将曲面定义为某个更高维函数值为零的等值面,擅长处理拓扑结构变化(如流体模拟)。
 
- 
优点与挑战: - 优点: 存储紧凑,判断点内外关系、求交等操作非常方便,适合处理复杂的拓扑变化。
- 挑战: 难以直观地从公式想象出具体形状,对艺术家不友好,建模复杂任意形状比较困难。
 
1.2 显式表示 (Explicit Representation)
核心观点: 直接或通过参数映射的方式,明确给出构成物体的所有点或面片。
- 关键方法:
- 点云 (Point Cloud): 最直接的方式,就是一堆点的集合。通常是三维扫描的原始数据。
- 多边形网格 (Polygon Mesh): 图形学中最常见的表示方式。通过大量的顶点 (Vertices) 以及连接这些顶点的面片(通常是三角形或四边形)来逼近物体表面。
- 参数曲面 (Parametric Surface): 用一个二维参数  映射到三维空间中的一个点 。例如,P(u, v) = (x(u,v), y(u,v), z(u,v))。
- 细分曲面 (Subdivision Surface): 从一个粗糙的基础网格开始,通过一套固定的细化规则,迭代地增加面数,最终生成一个光滑的曲面。兼具了网格的灵活性和参数曲面的光滑性。
 
二、 参数曲线详解
参数曲线在建模细长物体(如毛发、路径)时非常有用。它们通过一个参数 映射到空间中的点 。
2.1 贝塞尔曲线 (Bézier Curve)
核心观点: 通过对一系列控制点 (Control Points) 进行加权平均来生成平滑曲线。权重由伯恩斯坦基函数 (Bernstein Basis Functions) 决定。
- 
解析定义 ( 次贝塞尔曲线): 其中 是控制点, 是伯恩斯坦基函数。 
- 
几何定义:De Casteljau 算法 这是一个非常直观的几何构造方法,通过递归线性插值得到曲线上任意一点。例如,对于三个控制点 : - 在 线上按 比例取点 。
- 在 线上按 比例取点 。
- 在 线上按 比例取点 ,该点就在贝塞尔曲线上。
 
- 
关键特性: - 凸包性 (Convex Hull Property): 曲线永远不会超出其控制点构成的凸包。
- 全局影响: 移动任何一个控制点都会影响整条曲线的形状,缺乏局部控制能力。
 
2.2 样条 (Spline) 与连续性
核心观点: 为了解决贝塞尔曲线的局部控制问题,样条将多段低阶曲线(如三次多项式)平滑地拼接起来。
- 关键术语:连续性 (Continuity)
- 连续 (参数连续性): 两段曲线首尾相连,位置连续。
- 连续 (参数连续性): 在连接点处,两段曲线的一阶导数(切线向量)相等。这保证了速度上的平滑。
- 连续 (几何连续性): 在连接点处,两段曲线的一阶导数成比例(即切线方向相同,但大小可以不同)。这保证了视觉上的平滑,条件比 更宽松。
 
2.3 B样条曲线 (B-Spline Curve)
核心观点: 贝塞尔曲线的推广,通过引入节点向量 (Knot Vector) 实现了强大的局部控制能力。
- 
关键组件: - 控制点 (Control Points): 和贝塞尔一样,定义曲线的大致走向。
- 节点向量 (Knot Vector): 一个非递减的参数序列 。它定义了每个控制点在哪个参数范围 内对曲线产生影响。
- B样条基函数: 基函数由节点向量递归定义,具有局部支撑性(只在一段区间内非零)。
 
- 
关键算法:De Boor 算法 这是 De Casteljau 算法在 B 样条上的推广,同样通过递归插值来计算曲线上的一点,但插值比例由参数 和相关的节点值共同决定。 
- 
重要特性: - 强大的局部控制: 移动一个控制点只会影响曲线的一小部分。
- 连续性: 次 B 样条在节点处至少具有 连续性。
- 节点向量类型: 开放均匀 (Open Uniform) 节点向量最为常用,它能让曲线的端点恰好落在首尾控制点上,行为类似贝塞尔曲线。
 
2.4 NURBS (非均匀有理B样条)
核心观点: B样条的终极形态,通过为每个控制点增加一个权重 (Weight),获得了更高的灵活性,能够精确地表示圆、椭圆等圆锥曲线。
- 
解析定义: 公式是一个分数形式,因此称为“有理 (Rational)”样条。 - 是第 个控制点 的权重。
- 权重越大,曲线越被拉向对应的控制点。
- 所有权重为1时,NURBS 退化为 B 样条。
 
- 
与齐次坐标的关系: 权重 可以被优雅地整合到齐次坐标中。一个三维控制点 及其权重 可以表示为四维齐次坐标 。在这种表示下,NURBS的计算形式和B样条是统一的。 
2.5 Catmull-Rom 样条曲线
核心观点: 一种特殊的插值样条 (Interpolating Spline),其曲线必定穿过所有的中间控制点。
- 
关键特性: - 插值性: 与贝塞尔和B样条(通常是逼近样条)不同,它经过控制点,非常直观。
- 切线定义: 曲线上任意一点 的切线方向由其相邻两个点 和 的位置决定(通常为 )。
- 应用广泛: 由于其直观和易于控制的特性,在游戏和动画中被广泛用于创建相机路径、角色运动轨迹等。
 
- 
参数方程 (第 段,从 到 ): 
光的能量与颜色——渲染的物理基础
本节旨在梳理真实感渲染背后的两大物理基石:如何度量光的“能量”(辐射度量学与光度学),以及如何表示光的“颜色”(色度学)。
一、 辐射度量学与光度学 (Measuring Light)
核心观点: 计算机渲染是模拟光的物理过程。我们有两种度量体系:辐射度量学 (Radiometry) 从纯物理角度客观度量光的能量;光度学 (Photometry) 则考虑了人眼的视觉敏感度,是与人类感知更相关的度量。
简单来说,光度学 = 辐射度量学 × 人眼对不同波长光的敏感度曲线。
以下是四个在渲染中至关重要的核心概念,每个都有一对“物理量”和“感知量”。
1.1 通量 (Flux): 光源发出的总能量
- 
辐射通量 (Radiant Flux, ) - 定义: 光源每秒发出的所有电磁辐射总功率。
- 单位: 瓦特 (Watt, W)。
- 类比: 一个加热灯的总发热功率,无论你是否看得见。
 
- 
光通量 (Luminous Flux, ) - 定义: 光源每秒发出的、能被人眼感知到的那部分功率。
- 单位: 流明 (lumen, lm)。
- 应用: 这是我们日常生活中衡量灯泡“有多亮”的指标。
 
1.2 强度 (Intensity): 特定方向上的能量密度
- 
辐射强度 (Radiant Intensity, ) - 定义: 光源向某个特定方向(单位立体角内)发射的功率。
- 单位: 瓦特/球面度 (W/sr)。
- 类比: 一个聚光灯灯头中心方向的能量,远大于其侧面方向。
 
- 
发光强度 (Luminous Intensity, ) - 定义: 光源向某个特定方向(单位立体角内)发射的、能被人眼感知到的功率。
- 单位: 坎德拉 (candela, cd),即 1 lm/sr。
- 应用: 描述一个光源在特定方向上的“刺眼”程度。
 
1.3 亮度 (Radiance / Luminance): 渲染中最核心的量
- 
辐射亮度 (Radiance, ) - 定义: 从某个表面上的某一点,沿某一特定方向发射出的能量密度。
- 单位: 瓦特/(球面度·平方米) (W/(sr·m²))。
- 核心地位: 这是物理渲染中最终要求解的量。无论是相机、光线追踪的虚拟光线、还是人眼,“看到”的都是这个值。它在传播过程中(真空中)保持不变。
 
- 
光亮度 (Luminance, ) - 定义: 从某个表面上的某一点,沿某一特定方向发射出的、能被人眼感知到的能量密度。
- 单位: 尼特 (nit),即 1 cd/m²。
- 应用: 显示器屏幕的亮度就是用这个单位衡量的(例如 800 nits)。
 
1.4 照度 (Irradiance / Illuminance): 表面接收到的总能量
- 
辐射照度 (Irradiance, ) - 定义: 到达表面某一点上的、来自所有方向的辐射总功率密度。
- 单位: 瓦特/平方米 (W/m²)。
- 类比: 夏天正午,单位面积的地面接收到的太阳总能量。
 
- 
光照度 (Illuminance, ) - 定义: 到达表面某一点上的、来自所有方向的、能被人眼感知到的总功率密度。
- 单位: 勒克斯 (lux, lx),即 1 lm/m²。
- 应用: 室内照明设计中用来衡量桌面是否足够明亮。
 
核心概念快速查阅表
| 概念分类 | 物理量 (Radiometry) | 感知量 (Photometry) | 描述 | 
|---|---|---|---|
| 总功率 (Flux) | 辐射通量 (W) | 光通量 (lm) | 光源发出的全部能量 | 
| 方向功率 (Intensity) | 辐射强度 (W/sr) | 发光强度 (cd) | 往一个方向发射的能量 | 
| 观测亮度 (Radiance) | 辐射亮度 (W/sr·m²) | 光亮度 (nit) | 从一个点、一个方向看到的能量(渲染核心) | 
| 接收功率 (Irradiance) | 辐射照度 (W/m²) | 光照度 (lux) | 一个点接收到的来自所有方向的能量 | 
二、 色度学 (Colorimetry)
核心观点: 物理世界中的颜色是由连续的光谱功率分布 (SPD) 决定的。但人眼并不能分辨光谱的微小差异,而是通过三种不同的视锥细胞将其简化为三个刺激值。这套简化和标准化的理论就是色度学。
2.1 从光谱到三原色
- 
光谱功率分布 (Spectral Power Distribution, SPD) - 定义: 描述一束光在不同波长下能量分布的连续函数。这是颜色的终极物理定义。
- 挑战: 直接在渲染中计算连续的SPD函数,计算量极大,不切实际。
 
- 
三原色理论 (Tristimulus Theory) - 原理: 人眼视网膜有三种视锥细胞,分别对短(S, 蓝)、中(M, 绿)、长(L, 红)波长的光最敏感。大脑通过这三种细胞受到的刺激强度比例来感知颜色。
- 意义: 这为我们用**三种基本颜色(原色)**的混合来模拟绝大多数颜色提供了生物学依据。
 
- 
同色异谱 (Metamerism) - 定义: 两种完全不同的光谱功率分布 (SPD),在人眼看来却是同一种颜色的现象。
- 核心价值: 这是整个计算机色彩科学的基石。它意味着我们不需要完美复现真实世界的光谱,只需要找到一个能对人眼产生相同三色刺激的RGB组合即可。
 
2.2 颜色空间 (Color Space)
核心观点: 颜色空间是一个数学模型,它定义了一套标准,用于将颜色量化为一组数值(通常是三个),例如RGB值。
- 
CIE 1931 XYZ 颜色空间 - 地位: 这是一个基础、设备无关的“母”颜色空间,是所有其他颜色空间的参考标准。
- 特性:
- 通过对早期RGB空间的线性变换得到。
- 巧妙地设计使得所有可见颜色的坐标值均为正。
- Y分量被特意设计为与颜色的亮度(Luminance)相关,而X和Z代表色度信息。
 
 
- 
CIE 1931 RGB 颜色空间 - 一个早期的标准,直接基于红、绿、蓝三种单色光匹配实验建立。它的一个主要问题是,为了匹配某些颜色,需要出现负的权重值,不便于应用。
 
- 
HSV / HSL 颜色空间 - 定义: 基于人类对颜色感知的直观方式建立的模型,使用色调 (Hue)、饱和度 (Saturation) 和 明度 (Value/Lightness) 来描述颜色。
- 优点: 对艺术家非常友好,调整颜色(例如只改变深浅而不改变色彩)非常方便。它是一种非线性的颜色空间。
 
渲染流程总结
真实感渲染的流程可以概括为:
- 物理模拟: 基于物理规律(如渲染方程),计算场景中各点在我们观察方向上的辐射亮度 (Radiance)。
- 颜色转换: 将计算出的辐射亮度(通常是其光谱或简化后的XYZ值)转换到标准的目标颜色空间(如sRGB)。
- 图像输出: 经过伽马校正等一系列图像处理后,最终将颜色值存为像素数据,显示在屏幕上。
光线的旅程——反射、折射与菲涅尔效应
本节旨在梳理真实感渲染所依据的几何光学三大基本定律,并深入探讨在渲染实践中至关重要的菲涅尔效应及其近似方法。
零、 渲染的基石:几何光学假设
在计算机图形学中,我们并不会模拟光的完整波动或量子特性,而是依赖于几何光学 (Geometrical Optics) 的一套简化模型。这是实现高效计算的前提。
- 核心假设:
- 直线传播: 光在均匀介质中沿直线传播。
- 独立传播: 光线相遇时互不干扰,能量简单叠加。
- 反射与折射: 光在遇到不同介质的光滑分界面时,发生反射和折射。
- 光路可逆: 光线沿原路反向传播,其路径不变。
 
一、 光的反射 (Reflection)
核心观点: 当光线从一个表面弹回时,其行为遵循一个简单而严格的对称定律。
- 
反射定律 (Law of Reflection): - 反射角等于入射角 ()。
- 入射光线、法线和反射光线处于同一平面内。
 
- 
关键向量:半程向量 (Halfway Vector, ) 在PBR(Physically Based Rendering)的微表面模型中,我们更关心那些朝向恰好能将光线反射到我们眼中的微小平面。这些平面的法线就是入射光 和出射光 的角平分线,即半程向量。 
二、 光的折射 (Refraction)
核心观点: 当光线穿过不同介质的边界时(如从空气到水),由于传播速度变化,其路径会发生弯曲。
- 
折射定律 (Snell's Law): 该定律精确描述了弯曲的程度,由介质的折射率 (Index of Refraction, IOR) 决定。 - 分别是入射侧和折射侧介质的折射率。
- 金属的折射率是一个复数,其虚部被称为消光系数 (Extinction Coefficient, ),描述了光在金属内部被吸收的速率。
 
- 
能量守恒的细节:辐射亮度的变化 这是一个在编写物理正确的路径追踪器时非常关键的细节:当光线从低折射率介质进入高折射率介质时(空气→水),光锥会被“压缩”,根据能量守恒,单位立体角内的能量——即辐射亮度 (Radiance)——会增加。 这确保了能量在跨介质传输时是守恒的。 
三、 菲涅尔效应 (Fresnel Effect)
核心观点: 当光线到达两种介质的交界面时,到底有多少能量被反射,多少能量被折射?菲涅尔方程 (Fresnel Equations) 回答了这个问题。它是决定一个物体看起来是金属还是电介质(非金属)的最关键因素。
- 
普适规律: 对于任何光滑物质,当你的视线垂直于表面时(法线入射),反射率是最低的;当你的视线接近平行于表面时(掠射角),反射率会急剧增高,趋近于100%。你现在就可以看看身边的桌子或者手机屏幕来验证这一点。 
- 
物理公式: 完整的菲涅尔方程相当复杂,它依赖于光的偏振状态(分为垂直偏振和平行偏振),对于无偏振的自然光,反射率是两者的平均值。 在实时渲染中,我们几乎从不直接使用这个完整公式,而是采用高效的近似。 
四、 菲涅尔效应的实时渲染实践
4.1 Schlick 近似 (Schlick's Approximation)
核心观点: 这是在游戏和实时渲染中应用最广泛的菲涅尔效应近似公式,尤其适用于电介质 (Dielectrics),如塑料、玻璃、水等。
- Schlick 近似公式:
- 是入射光与法线的夹角。
- (或写作 ) 是垂直入射时的反射率。这是PBR材质系统中一个核心参数。对于电介质,它是一个灰度值(通常很低,如水是0.02,塑料是0.04);对于金属,它是一个彩色值(如黄金的是金黄色)。
 
4.2 金属 (Metals) 的菲涅尔处理
挑战: 简单 Schlick 近似对金属的效果不佳,因为金属的消光系数对其反射曲线影响很大,导致其值很高且带有颜色。
- 
艺术家友好的参数化: 直接使用物理上的折射率 和消光系数 来定义金属材质对美术师来说非常不直观。因此,现代引擎通常会将其重新映射为两个更友好的参数: - 反射率 (Reflectivity / BaseColor): 即金属在垂直入射时的反射颜色 ()。
- 边缘染色 (Edge Tint): 控制掠射角下反射光颜色的变化。
 
- 
更精确的金属近似: 虽然基本 Schlick 对金属不完美,但学术界已提出多种改进方案(如 Lazániy, Hoffman 等人的工作),通过添加补偿项来更精确地模拟由 和 共同决定的复杂反射曲线。这些高级近似可以在追求更高渲染质量时被采用。 
总结:PBR材质的核心区别
电介质 (Dielectrics):
- 很低,是无色的 (0.02-0.05)。
- 反射的光基本是光源的颜色(白色)。
- 大部分光线会折射进入物体内部,发生散射后,带上物体本身的颜色(漫反射颜色)再射出。
金属 (Metals):
- 很高,是彩色的 (0.7-1.0)。
- 几乎没有漫反射,所有颜色信息都来自其彩色的高光反射。
- 进入金属的光线会立即被吸收(由消光系数描述),所以金属没有“漫反射颜色”这一说,其BaseColor贴图直接用于驱动。
光线追踪的核心——光线与图元求交
本节旨在深入剖析光线追踪流程中最基础、最关键的计算步骤:判断一条光线是否击中场景中的物体,并找出最近的交点。我们将重点讨论与球体、三角形和曲线的求交算法。
零、 求交前的准备:加速结构
核心观点: 在一个包含数百万个图元(Primitives)的复杂场景中,让每条光线都与每个图元进行一次求交测试是完全不可行的。因此,在执行求交计算前,我们必须使用加速结构 (Acceleration Structure) 来快速剔除大量不相关的物体。
- 关键术语:
- 轴对齐包围盒 (AABB - Axis-Aligned Bounding Box): 一个方方正正、各面平行于坐标轴的盒子,用于包裹一个或一组物体。光线与AABB的求交测试非常快速。
- 包围体层次结构 (BVH - Bounding Volume Hierarchy): 最常用的加速结构之一。它将整个场景包裹在一个大的AABB中,然后递归地将场景空间划分成更小的AABB,直到每个叶子节点的AABB只包含少量图元,最终形成一棵树状结构。
 
- 查询流程:
- 光线从根节点(包裹整个场景的AABB)开始测试。
- 如果光线未击中当前节点的AABB,则其内部的所有物体都可以被安全地剪枝 (Prune),无需进一步测试。
- 如果击中,则递归地测试其子节点的AABB。
- 当光线击中一个叶子节点的AABB时,才对该节点内的具体图元(如三角形)进行精确的求交计算。
 
一、 光线与球体求交(经典入门)
核心观点: 这是最简单的求交问题,可以通过解一个一元二次方程直接得到解析解。
- 算法原理:
- 光线方程 (参数形式): 
- 是光线起点, 是方向, 是距离。
 
- 球面方程 (隐式形式):   (即点到球心的距离等于半径)
- 是球心, 是半径。
 
- 将光线方程代入球面方程,会得到一个关于 的一元二次方程:
- 求解这个方程。判别式  的值决定了交点个数:
- : 光线未击中球体。
- : 光线与球体相切(一个交点)。
- : 光线穿过球体(两个交点)。
 
- 在所有为正的解 中,取最小的那个即为最近的交点。
 
- 光线方程 (参数形式): 
二、 光线与三角形求交(渲染核心)
核心观点: 这是光栅化和光线追踪渲染管线中最核心、执行最频繁的操作。算法的选择需要在速度和浮点数精度带来的稳定性之间做出权衡。
2.1 追求速度:Möller-Trumbore 算法
这是业界最经典、最高效的算法之一。
- 
算法原理: 通过重心坐标 (Barycentric Coordinates) 来表示三角形内的任意一点 。 - 光线方程:
- 三角形内点方程: 
- 是三角形的三个顶点。
- 是重心坐标分量。
 
- 联立两个方程,得到一个关于 的三元一次线性方程组:
- 通过克莱姆法则或逆矩阵高效求解出 。
 
- 
命中条件: 必须同时满足以下所有条件,才算有效命中: - : 交点在光线前进方向上。
- 且 : 交点在由两条边定义的区域内。
- : 交点在第三条边的内侧。
 
2.2 追求鲁棒性:Watertight (水密) 求交算法
核心问题: 使用标准浮点数计算时,当光线射向两个共享一条边的相邻三角形时,可能会因为精度误差,导致光线“穿过”两个三角形之间的“缝隙”,这是渲染中的严重瑕疵。
- 算法原理 (Woop et al.):
它的核心思想是将三维求交问题转化为二维的内外判断问题,从而提高数值稳定性。
- 坐标变换: 首先对整个坐标系进行变换,使得光线起点位于原点 ,并且方向朝向Z轴正方向 。
- 投影: 将三角形的三个顶点也进行相同的变换。此时,光线变成了一条通过原点并垂直于XY平面的直线。
- 二维判断: 问题简化为:原点 是否在变换后的三角形在XY平面上的投影之内? 这可以通过计算二维叉乘(有向面积)来快速、稳定地判断。
- 精度处理: 该算法非常注重浮点数的计算细节,例如在判断边界情况时临时使用双精度,并为AABB测试引入误差容限,以确保水密性 (Watertight),即光线绝不会从三角形之间的缝隙穿过。
 
三、 光线与曲线求交(用于毛发渲染)
核心观点: 渲染毛发、纤维等细长物体时,我们通常使用参数曲线(如B样条)作为骨架,并赋予其半径,形成一个扫描曲面 (Swept Surface)。与这种复杂曲面的求交通常采用数值方法。
- 算法原理 (Nakamaru & Ohno):
这是一个递归细分 (Recursive Subdivision) 的过程。
- 坐标变换: 与Watertight算法类似,先将曲线变换到以光线为基准的坐标系下(光线位于原点,朝向Z轴)。
- 包围盒测试: 利用B样条/贝塞尔曲线的凸包性 (Convex Hull Property),计算曲线控制点在XY平面投影的2D包围盒。如果这个包围盒不包含原点,则光线不可能与曲线相交,提前退出。
- 递归细分: 如果包围盒包含原点,且尚未达到最大递归深度,则将曲线从中间一分为二,并对两个子曲线重复步骤2和3。
- 最终判断: 当达到最大递归深度后,如果包围盒仍然包含原点,就将这段极小的曲线段近似为一条直线,计算其与原点的最近距离。若距离小于曲线半径,则认为光线命中。
 
局部光照模型——渲染方程与BRDF
本节旨在梳理现代渲染管线的理论核心:如何从一个包罗万象的物理概念(全光函数)出发,通过一系列合理的简化,最终得到在工程实践中至关重要的渲染方程 (Rendering Equation) 和用于描述材质的双向反射分布函数 (BRDF)。
一、 简化的艺术:从全光函数到BRDF
核心观点: 为了能在计算机中模拟光照,我们必须对真实世界光的复杂性进行一系列简化。这个过程就像一个漏斗,从一个无法计算的理论模型,层层过滤,最终得到一个可计算的实用模型。
1.1 理论的起点:全光函数 (Plenoptic Function)
这是一个纯理论的、描述宇宙中所有光线信息的“神级”函数,它有7个维度: 它描述了在任意时刻 、空间任意位置 、沿任意方向 、任意波长 的光线信息。直接计算它是不可能的。
1.2 走向实用的简化步骤
为了让模型变得可用,我们做出以下关键假设:
- 稳态光照: 假设场景光照是瞬时达到平衡的,忽略时间 (无磷光)。
- 三基色近似: 使用RGB三个离散通道来近似连续的波长 ,并假设没有荧光现象(即光的波长在与表面作用后不变)。
- 表面散射: 我们只关心物体表面的光线交互,将三维位置 简化为二维的表面位置。
1.3 简化的产物:光线散射函数族
经过简化后,我们得到了一系列描述表面光线交互的实用模型:
- 
BSSRDF (双向次表面散射反射分布函数) - 描述: 光线从表面一点 射入,在物体内部经过多次散射后,从另一点 射出。
- 应用: 模拟次表面散射 (Subsurface Scattering, SSS) 效应,用于玉石、皮肤、牛奶、蜡烛等半透明材质。
- 这是一个6维函数(2D入射点,2D入射方向 → 2D出射方向)。
 
- 
BRDF (双向反射分布函数) - 核心模型: 这是对BSSRDF的进一步简化,假设光线入射和出射点为同一点。
- 应用: 模拟绝大多数不透明物体的表面反射,例如金属、塑料、木材等。这是PBR(Physically Based Rendering)管线的核心。
- 这是一个4维函数(2D入射方向 → 2D出射方向)。
 
- 
BSDF (双向散射分布函数) - 这是一个统称,它包含了反射(BRDF)和透射(BTDF)两部分,用于描述光线与物体表面交互后所有可能的去向。
 
二、 渲染方程:光照计算的“宪法”
核心观点: 渲染方程是一个积分方程,它精确地描述了在一个点上,其最终射出的光线亮度,是自身发光与所有方向射入光线反射之和。
2.1 BRDF的数学定义
BRDF,符号为 ,其定义为出射辐射亮度 (Radiance) 微分 与 入射辐射照度 (Irradiance) 微分 之比。
- 直观理解: BRDF 是一个比例因子,它回答了这样一个问题:“当一束光从 方向射入时,到底有多少比例的能量被反射到了 方向?”。
- 关键变量: (入射方向), (出射/观察方向), (表面点), (入射角)。
2.2 渲染方程 (The Rendering Equation)
这是所有物理渲染算法试图求解的最终目标。
- 方程解析:
- : 从p点沿 方向射出的总光照(我们要求解的目标)。
- : p点自身沿 方向发出的光(如灯、自发光材质)。
- : 一个积分,代表对以p点为中心的整个上半球所有方向进行“求和”。
- : 材质的BRDF。
- : 从 方向射入p点的光照。注意,这个 本身也是另一个表面射出的 ,这体现了方程的递归性,也是全局光照(间接光照)的根源。
- : 入射角余弦,也叫 foreshortening or Lambert term。表示单位面积接收到的光能随入射角的衰减。
 
2.3 BRDF必须满足的物理定律
一个物理正确的BRDF模型,必须遵循以下两个原则:
- 亥姆霍兹互易性 (Helmholtz Reciprocity): 交换入射和出射方向,BRDF的值不变。即 。这对光线追踪等算法至关重要。
- 能量守恒 (Energy Conservation): 表面反射的总能量不能超过入射的总能量。即BRDF在整个半球上的积分值必须小于等于1。
三、 局部光照模型的建立方法
我们如何获得一个可以在引擎中使用的BRDF函数?主要有以下几种途径:
- 
经验模型 (Empirical Models): - 方法: 不基于物理,而是通过观察和总结,设计出“看起来还不错”的简单函数。
- 例子: 经典的 Phong模型。
- 优缺点: 计算速度极快,但不物理精确,参数不直观。
 
- 
物理模型 (Physically-Based Models): - 方法: 从微观层面分析光与物质的交互,推导出数学公式。
- 例子: 微表面模型 (Microfacet Model),是现代PBR的核心。
- 优缺点: 效果真实,参数有物理意义,但计算更复杂。
 
- 
数据驱动方法: - 测量与预计算: 直接用仪器测量真实材质的BRDF数据,或用离线渲染器预计算复杂模型的结果,存成查找表 (Look-Up Table, LUT),通常是一张纹理。
- 函数拟合: 将测量或预计算出的海量数据,用一个相对简单的函数去拟合。
- 频域分析: 一种高级的拟合技术,使用球谐函数 (Spherical Harmonics) 等基函数来表示BRDF。通常只保留低阶(低频)系数,可以高效地表示模糊的、柔和的光照效果(如环境光漫反射),这本质上是一种低通滤波。
 
漫反射模型——从Lambert到Oren-Nayar
本节旨在深入探讨在PBR(Physically Based Rendering)中用于模拟漫反射 (Diffuse Reflection) 的核心模型。我们将从最基础的理想模型(Lambert)出发,进阶到更符合物理现实的粗糙表面模型(Oren-Nayar),并最终讨论如何在路径追踪中高效地应用这些模型。
一、 Lambert模型:理想的漫反射表面
核心观点: Lambert模型是描述理想漫反射 (Ideal Diffuse) 或完美哑光 (Perfectly Matte) 表面的最基础、最简单的模型。它假设表面会将入射光在所有方向上均匀地散射出去。
- 
物理假设: - 无论从哪个角度观察,表面的亮度 (Radiance) 都是相同的。
- 反射出去的总能量只与入射光线和表面法线的夹角(即入射角 )有关。
 
- 
BRDF 公式: Lambert模型的BRDF是一个常数,完全由表面的反照率 (Albedo) 决定。 
- 
关键知识点:为什么分母是 ? - 这不是一个随意设定的值,而是能量守恒 (Energy Conservation) 的必然要求。
- 一个BRDF必须保证其在整个半球上的反射能量总和不能超过其接收的能量。将Lambert BRDF与渲染方程中的 项在整个半球上进行积分,结果恰好是 。
 - 因此, 这个因子确保了无论入射光如何,反射出去的总能量比例永远不会超过反照率 。
 
- 
优点与局限: - 优点: 计算极其简单、快速。
- 局限: 过于理想化。现实世界中绝大多数“哑光”表面(如粉笔、石膏、黏土)都比Lambert模型所描述的要粗糙,该模型在掠射角(grazing angles)下会显得过暗,缺乏真实感。
 
二、 Oren-Nayar模型:更真实的粗糙漫反射
核心观点: Oren-Nayar模型是Lambert模型的扩展,它引入了表面粗糙度 (Roughness) 的概念,旨在更精确地模拟现实世界中粗糙不平的哑光表面。
- 
物理假设 (Microfacet Theory): - 它不再将表面视为一个光滑平面,而是由大量随机朝向的、微小的理想漫反射平面(微表面 Microfacets)组成的集合,这些微表面形成了V形的凹槽。
- 它考虑了微表面之间的遮蔽 (Masking)、阴影 (Shadowing) 和内部反射 (Interreflection)。
 
- 
核心视觉效果:后向散射 (Backscattering) - 由于凹槽结构的存在,当观察方向与光照方向接近时,更多的、被照亮的微表面会映入眼帘,导致表面看起来更亮。
- 这使得物体在掠射角下看起来比Lambert模型更亮、更“粉质”,整体光照感更平坦、柔和,这非常符合对混凝土、沙子、布料等材质的观察。
 
- 
BRDF 公式 (简化版): 完整的Oren-Nayar公式非常复杂,但在实践中,通常使用一个效果良好且更简洁的近似版本: - 仍然是反照率 (Albedo)。
- 和 是由粗糙度 决定的系数。
- , 。
- 重要关系: 当粗糙度 时,,Oren-Nayar模型退化为Lambert模型。
 
三、 实践应用:漫反射的重要性采样
核心观点: 在使用蒙特卡洛路径追踪等算法求解渲染方程时,如果我们对整个半球进行均匀的随机采样来“寻找”光线,效率会非常低下。重要性采样 (Importance Sampling) 是一种优化策略,它让我们“智能地”朝贡献更大的方向发射更多的采样光线。
- 
采样策略:余弦加权半球采样 (Cosine-Weighted Hemisphere Sampling) - 在渲染方程的积分项 中,对于漫反射, 是常数,而入射光 是未知的。因此,我们唯一可以利用的已知信息就是 项。
- 的值在法线方向()最大,在切线方向()为零。这意味着与法线夹角越小的光线,对最终结果的贡献越大。
- 因此,我们的采样策略是让生成随机方向的概率密度函数 (PDF) 正比于 。经过归一化后,可得:
 
- 
采样算法 (反演法): 我们可以通过反演变换法 (Inverse Transform Sampling),将两个标准的均匀随机数 映射到遵循上述概率分布的球面坐标 : \theta = \arccos\sqrt{\xi_1} $$ $$ \phi = 2\pi\xi_2使用这个公式生成的采样方向会自然地更密集地分布在法线周围,从而极大提高了蒙特卡洛积分的收敛速度,有效降低了图像噪声。 
有光泽材质的经验模型
本节旨在梳理和对比几种经典且重要的经验 BRDF 模型。这些模型虽然在现代PBR(Physically Based Rendering)管线中大多已被微表面模型取代,但它们是理解光照模型演进历史、掌握核心概念(如高光、各向异性、菲涅尔效应)的绝佳基石。
核心观点: “经验模型”(或称“现象模型”)的主要目标是在视觉上复现观察到的高光现象,而非严格推导其背后的微观物理过程。它们的演进过程,体现了人们对光照物理现象认知不断加深的历史。
一、 Phong BRDF:高光模型的开山之作
核心观点: Phong 模型是第一个广泛用于计算机图形学、用以模拟光滑表面高光 (Specular Highlight) 的经验模型。它极其简单,将物体表面的反射分为“漫反射”和“镜面反射”两个独立部分的线性叠加。
- 
物理构想: - 漫反射部分:采用理想的Lambert模型。
- 镜面反射部分:认为高光是围绕着理想镜面反射方向的一个模糊光斑。光斑的亮度和范围由一个指数项控制。
 
- 
BRDF 公式: - :分别是漫反射和镜面反射的能量系数。
- :观察方向与理想镜面反射方向之间的夹角。
- :镜面指数 (Specular Exponent) 或“反光度 (Shininess)”。这是Phong模型最核心的参数:
- 值越大, 的高次幂衰减越快,产生的高光光斑越小、越锐利,表面看起来越光滑、越亮。
- 值越小,高光光斑越大、越模糊,表面看起来越粗糙。
 
- 注意公式中的 是为了保证能量守恒而引入的归一化因子。
 
- 
评价: - 优点: 计算极其廉价,参数 非常直观。
- 缺点: 完全不符合物理(如不满足亥姆霍兹互易性),没有考虑菲涅尔效应,在掠射角下高光形状会严重失真。
 
二、 Ward BRDF:引入各向异性
核心观点: Ward BRDF 是一个更先进的经验模型,它基于对真实材质数据的测量和拟合,其最重要的贡献是引入了对各向异性 (Anisotropy) 反射的模拟。
- 
物理构想: - 它不再像Phong那样只考虑宏观反射,而是假设物体表面由大量微小的斜面构成,这些斜面的朝向遵循某种统计分布(高斯分布)。这使其成为连接纯经验模型与物理微表面模型的桥梁。
- 通过在两个垂直方向上使用不同的粗糙度,可以模拟出拉丝金属、木纹清漆等材质上被拉伸的高光。
 
- 
BRDF 公式 (Dür 改进版): - :漫反射和镜面反射系数。
- :半程向量 (Halfway Vector),即入射光与观察方向的角平分线。Ward模型使用半程向量,使其在思想上更接近现代PBR模型。
- :核心参数,分别代表沿表面两个主方向(如切线和副切线方向)的粗糙度。
- 当 时,模型表现为各向同性 (Isotropic),产生圆形高光。
- 当 时,模型表现为各向异性 (Anisotropic),产生椭圆形或被拉伸的高光。
 
 
- 
评价: - 优点: 能够优雅地处理各向异性,参数直观,并且设计上考虑了重要性采样。
- 缺点: 原始模型能量守恒性不佳(后有多个改进版),并且没有考虑菲涅尔效应 (Fresnel Effect),这使得它在区分导体和电介质方面存在天然缺陷。
 
三、 Ashikhmin-Shirley BRDF:迈向现代PBR的重要一步
核心观点: Ashikhmin-Shirley模型是一个高度复杂的经验模型,它在设计时就明确追求满足现代物理渲染的各项要求,特别是引入了菲涅尔效应,并设计了更合理的漫反射项。
- 
设计目标(一个好BRDF的检验标准): - 能量守恒与互易性。
- 支持各向异性。
- 参数直观。
- 包含菲涅尔效应。
- 设计了更物理的漫反射项。
- 易于进行蒙特卡洛重要性采样。
 
- 
BRDF 结构: - 
漫反射项 : 不再是简单的常数。它通过 (1 - R_s)确保了漫反射和镜面反射之间的能量守恒,并且引入了(1 - (1 - cosθ/2)⁵)这样的项,使得漫反射在掠射角时会自然减弱,这与菲涅尔效应的行为一致。
- 
镜面反射项 : 其结构已经非常接近现代的Cook-Torrance微表面模型: - : 一个基于半程向量 的分布函数,用于控制高光的形状,由各向异性参数 控制。
- : 菲涅尔项,直接使用了高效的 Schlick 近似。这是该模型最核心的进步,使其能够区分金属(高菲涅尔反射)和非金属(低菲涅爾反射)。
 
 
- 
- 
评价: - 优点: 作为一个经验模型,它几乎满足了现代PBR BRDF的所有核心要求,效果非常出色,并且为路径追踪等算法提供了直接的重要性采样公式。
- 缺点: 公式相对复杂。但其设计思想对后来的主流PBR模型产生了深远影响。
 
模型演进总结
| 特性 | Phong BRDF | Ward BRDF | Ashikhmin-Shirley BRDF | 
|---|---|---|---|
| 核心思想 | 围绕镜面反射方向的指数衰减 | 基于半程向量的高斯分布 | 满足PBR设计原则的经验拟合 | 
| 各向异性 | 否 | 是 (通过 控制) | 是 (通过 控制) | 
| 菲涅尔效应 | 否 | 否 | 是 (Schlick近似) | 
| 能量守恒 | 较差 | 需改进版 | 是 (设计时考虑) | 
| 现代性 | 低(历史模型) | 中(引入半程向量和各向异性) | 高(结构接近微表面模型) | 
现代PBR的核心——微表面模型 (Microfacet Model)
本节旨在深入剖析在实时渲染和离线渲染中占据主导地位的物理光照模型——微表面BSDF。我们将解构其核心公式,理解每个组件的物理意义,并探讨其在实践中的高级应用。
核心观点: 微表面理论 (Microfacet Theory) 的基本假设是,从宏观上看是粗糙的物体表面,在微观尺度上是由无数个微小、平滑、像镜子一样的微表面 (Microfacets) 构成的。一个表面的整体视觉外观(如高光的模糊程度、形状)是由这些微表面的统计学朝向分布决定的。
一、 Cook-Torrance 微表面 BRDF
这是现代PBR管线的核心公式,用于描述不透明表面的反射(Specular BRDF)。它将复杂的反射现象分解为三个关键的物理部分和一个归一化因子。
- : 入射光方向 (light vector)
- : 观察方向 (view vector)
- : 宏观表面法线 (normal)
- : 半程向量 (halfway vector), 。这是对光线反射起决定性作用的微表面法线方向。
公式的三大支柱 (D, F, G):
- D (Distribution): 法线分布函数 (NDF)。决定高光的形状。
- F (Fresnel): 菲涅尔方程。决定高光的颜色和强度。
- G (Geometry): 几何遮蔽函数。决定高光的**“阴影”**。
下面我们来逐一拆解这三个核心组件。
二、 模型组件详解
2.1 D项:法线分布函数 (Normal Distribution Function, NDF)
- 物理意义: 这是微表面模型中最重要的部分,它从统计学上描述了微表面的朝向分布。它回答了这样一个问题:“在一个微小的区域内,朝向恰好是半程向量 h 方向的微表面占有多大比例?”
- 核心参数:粗糙度 (Roughness, )
- 低粗糙度 (表面光滑): 值小。微表面的朝向非常集中,绝大多数都与宏观法线 一致。这会产生小而亮的镜面高光。
- 高粗糙度 (表面粗糙): 值大。微表面的朝向分布非常混乱、分散。这会产生大而模糊的镜面高光。
 
- 常用模型:
- GGX (或称 Trowbridge-Reitz): 当前业界标准。它的高光形状带有一个非常柔和、长长的“拖尾”,能更好地模拟真实世界材质的质感,被广泛应用于Unreal Engine等主流引擎。
- Beckmann: 一个较早的模型,高光衰减比GGX更锐利。
 
2.2 G项:几何遮蔽函数 (Geometry Function)
- 物理意义: 描述了由微表面自身结构引起的自遮蔽现象。一个粗糙表面上的凹凸会互相遮挡光线。G项对这种能量损失进行建模。
- Shadowing (阴影): 一些微表面因为被其他微表面遮挡,而接收不到入射光。
- Masking (遮蔽): 一些反射了光线的微表面,因为被其他微表面遮挡,其反射光无法进入相机/人眼。
 
- 作用: G项在掠射角 (grazing angles) 下尤为重要。当视线或光线接近平行于表面时,自遮蔽现象最严重,G项会显著衰减高光亮度,确保模型的物理正确性。
2.3 F项:菲涅尔方程 (Fresnel Equation)
- 物理意义: 描述了在不同入射角下,光线在两种介质交界处(如空气和物体表面)的反射率。
- 核心作用:区分导体 (Metals) 与电介质 (Dielectrics)。
- 电介质 (非金属): 在垂直入射时反射率很低(如水约2%,塑料约4%),且反射光基本无色。
- 导体 (金属): 在垂直入射时反射率很高(如黄金约85%),并且反射光带有材质本身的颜色。
 
- 普适规律: 对于所有材质,当入射角趋向于90度(掠射角)时,其反射率都趋近于100%。
- 实践应用: 在实时渲染中,我们几乎总是使用 Schlick 近似 来高效地计算菲涅尔项。
三、 高级课题:多重散射与能量守恒
- 
问题所在: 基础的Cook-Torrance模型只考虑了光线在微表面上单次弹射的情况。对于高粗糙度表面(尤其是金属),光线很可能会在多个微表面之间多次弹射后才射出。基础模型忽略了这部分能量,导致高粗糙度材质(特别是金属)看起来会过暗,不符合能量守恒。 
- 
解决方法 (Kulla & Conty方案): - 首先计算单次散射模型“丢失”了多少能量。
- 然后,设计一个额外的、通常是类似漫反射的BRDF项,来补偿这部分丢失的多次散射能量。
- 最终的BRDF = 单次散射BRDF + 多次散射补偿项。
 
- 
实践应用: 在游戏引擎中,这个补偿项通常会被预计算成一张小尺寸的查找表 (Look-Up Table, LUT),渲染时根据材质粗糙度和视角进行采样,以极低的性能开销实现能量守恒,显著提升高粗糙度材质的真实感。 
四、 微表面透射 (BTDF)
微表面理论同样可以被扩展用来描述光线穿过粗糙表面的现象,例如毛玻璃、磨砂塑料等。其对应的函数被称为BTDF (Bidirectional Transmittance Distribution Function)。其公式结构与BRDF类似,但数学推导和半程向量的计算方式有所不同。
多层材质模型 (Clear Coat)
本节旨在深入探讨在PBR(Physically Based Rendering)中用于模拟多层材质 (Multi-Layered Material),特别是清漆涂层 (Clear Coat) 的核心方法。我们将从实时渲染中广泛使用的简化模型入手,逐步深入到更复杂的物理模型。
核心观点: 模拟清漆材质的关键,是将其分解为至少两个独立的光照行为(或称“波瓣”,Lobes):一层是来自顶层透明涂层的镜面反射 (Specular),另一层是穿透涂层后与基底材质交互的结果。
零、 实时渲染的核心:薄膜近似 (Thin-Film Approximation)
为了在游戏引擎等实时应用中高效地计算清漆效果,我们通常做出以下一系列关键的简化假设:
- 忽略折射: 假设光线穿过清漆层时方向不发生改变。
- 厚度为零: 假设清漆层极薄,光线与涂层和基底的交互都发生在同一点上。
- 无参与介质: 假设清漆层本身不吸收、也不散射光线。
- 无内部反射: 这是最重要的简化。我们忽略光线在“基底-涂层下表面”之间来回反弹的复杂情况,只考虑单次穿透和穿出。
基于这些假设,我们可以将复杂的多层物理现象,用一个混合的BRDF模型来高效地近似。
一、 模型一:涂层 + 金属基底
这是最简单的情景,例如清漆覆盖的金属车漆。
- 
光线的两种主要路径: - 路径1 (表面反射): 入射光直接被清漆层的外表面反射。这会形成一层无色的、电介质(Dielectric)类型的高光。
- 路径2 (基底反射): 入射光穿透清漆层,被下方的金属基底反射,然后再穿出清漆层。这会形成一层彩色的、导体(Conductor)类型的高光。
 
- 
BRDF混合模型 (线性插值): 最直接的方法是使用清漆层的菲涅尔项 作为权重,对两个部分的BRDF进行线性混合。 - :清漆层的菲涅尔反射率。光线有多少概率在表面被直接反射。
- :清漆层的透射率。光线有多少概率穿透表面。
- :描述金属基底的完整微表面BRDF。
- :描述清漆层的微表面BRDF,但通常只使用其D项和G项,因为F项已经作为混合权重被提取出来了。
- 实用参数: 清漆层的折射率 (IOR) 通常固定为 1.5(近似于聚氨酯)。
 
二、 模型二:涂层 + 漫反射基底 (塑料/清漆木材)
这是更常见的情景,例如塑料、上了清漆的木材或碳纤维。
- 
光线的两种主要路径: - 路径1 (表面反射): 与金属基底情况相同,形成一层无色的镜面高光。
- 路径2 (基底交互): 入射光穿透清漆层,被下方的漫反射基底向各个方向散射,然后再穿出清漆层,形成材质的固有色。
 
- 
BRDF混合模型 (能量守恒且互易的模型): 简单地将一个Lambert漫反射项和一个镜面反射项相加是错误的,因为它会违反能量守恒和物理互易性。一个物理上更合理的模型如下 (Kelemen et al.): - :与模型一中的清漆镜面反射项相同。
- 漫反射项解析:
- :入射光穿透涂层的能量比例。
- :从基底散射出的光能够穿透涂层到达观察者的能量比例。同时考虑这两个因子确保了模型的互易性。
- :归一化因子,用于确保在所有角度下,漫反射项的总能量是守恒的。是菲涅尔项在半球上的平均值。
 
 
三、 进阶模型:更精确的多层材质 (Weidlich & Wilkie)
当需要更高精度时(通常用于离线渲染),可以放宽一些“薄膜近似”中的假设。
- 
核心思想: 追踪光线在涂层内部的路径,并考虑其能量衰减。 
- 
新增的物理现象: - 折射 (Refraction): 使用斯涅耳定律计算光线进入和离开涂层时发生的弯曲。
- 吸收 (Absorption): 使用比尔-朗伯定律计算光线在有厚度 的涂层中传播时发生的能量衰减。这允许我们模拟有色玻璃或半透明涂层。
- 内部菲涅尔: 在计算光线从涂层内部射向外部(如空气)时,使用正确的菲涅尔公式(IOR从~1.5到1.0)。
 
- 
BRDF 结构: 其能量流可以概括为: 
- 
局限性: 这个模型虽然更精确,但通常仍然忽略涂层内部的多次反射,因此在基底非常粗糙时仍会有能量损失。完整的物理模拟需要更复杂的路径追踪方法。 
总结:实时渲染 vs 离线渲染
- 实时引擎 (Real-time): 普遍采用Sections 1和2中的“薄膜近似”模型。它们性能极高,并且视觉效果已经非常出色,足以满足绝大多数应用场景。
- 离线渲染器 (Offline): 为了追求极致的物理精度,可能会采用Section 3中的模型,甚至更复杂的、基于路径追踪的全光谱多层材质模拟。
次表面散射 (Subsurface Scattering) 与 BSSRDF
本节旨在深入探讨用于模拟半透明材质的核心概念——BSSRDF (双向次表面散射反射分布函数)。我们将阐明它与标准BSDF的区别,并剖析两种主流的BSSRDF模型:经典的偶极子模型 (Dipole Model) 和现代引擎中更常用的归一化扩散模型 (Normalized Diffusion)。
零、 超越表面:为什么需要BSSRDF?
核心观点: 标准的BSDF (如微表面模型) 假设光线与物体的交互严格发生在同一个表面点上 ()。但这无法模拟光线进入物体内部、经过多次散射、最终从另一个不同的点射出的物理现象,即次表面散射 (Subsurface Scattering, SSS)。
- BSDF 适用材质: 金属、塑料、木材等不透明物体。
- BSSRDF 适用材质: 皮肤、玉石、大理石、牛奶、蜡烛等半透明 (Translucent) 物体。这些材质的特征是光线会在其表面下“渗透”和“模糊”开来。
两种求解思路:
- 体渲染 (Volume Rendering): 最精确但计算最昂贵的方法。将物体视为一个参与介质 (Participating Media),在体积内部求解完整的辐射传输方程 (RTE)。
- BSSRDF: 一种高效的近似方法。它将复杂的内部散射过程抽象、封装成一个扩展的表面反射模型,允许我们继续在表面上求解一个修改版的渲染方程。
一、 BSSRDF:连接“入射点”与“出射点”的桥梁
核心观点: BSSRDF函数 描述了光线从点 沿方向 射入,最终对点 沿方向 射出的光照所做的贡献。
- 
BSSRDF渲染方程: 相比于BSDF的渲染方程,BSSRDF版本增加了一个对表面面积 A 的积分,用以收集附近所有入射点 的贡献。 - 这个双重积分(面积分+半球方向积分)是BSSRDF计算开销大的根源。
 
- 
散射分解: BSSRDF的散射效果主要由两部分构成: - 单次散射 (Single Scattering): 光线只在内部反弹一次。它贡献了材质细节和高光。
- 多次散射 (Multiple Scattering): 光线在内部经历了大量随机的反弹,失去了方向性。这是形成柔软、模糊的次表面散射视觉效果的主要原因。
 
二、 核心模型:对多次散射的近似
大多数BSSRDF模型的核心任务,就是找到一个高效且可信的函数来描述多次散射光照的分布。这个函数通常被称为扩散轮廓 (Diffusion Profile), ,它描述了出射光强度随入射点与出射点之间距离 的衰减关系。
2.1 物理方法:偶极子模型 (Dipole Model)
这是Jensen等人在2001年提出的开创性模型,首次将逼真的SSS效果带入图形学。
- 
核心思想: 为了近似光在物体内部复杂的扩散过程,同时满足光线在表面会逃逸出去的边界条件,该模型巧妙地使用了一对虚拟点光源——偶极子 (Dipole) 来模拟。 - 一个正光源放置在光线入射点下方的真实散射位置。
- 一个负光源镜像地放置在表面上方,用以抵消边界上的能量,从而满足物理约束。
 
- 
扩散轮廓 : 最终推导出的 公式较为复杂,它直接关联到材质的物理属性,如吸收系数 () 和散射系数 ()。 - 是菲涅尔透射项。整个BSSRDF由“入射透射 → 内部扩散 → 出射透射”三部分构成。
 
- 
评价: 模型物理基础扎实,效果逼真,但公式复杂,参数不直观,不利于美术师创作和实时计算。 
2.2 实用方法:归一化扩散模型 (Normalized Diffusion)
这是Christensen和Burley(迪士尼)提出的一个更现代、更实用、更高效的模型,已成为当今业界的主流标准。
- 
核心思想: 它并非从第一性原理推导,而是一个经过精心设计的经验模型,旨在用一个极其简单的函数来拟合真实世界和物理模拟的扩散轮廓。 
- 
扩散轮廓 : 该模型提出的扩散轮廓函数形式优雅且高效: - 直观的艺术参数:
- (Albedo): 材质的固有颜色/反照率。
- (Diffusion Radius): 扩散半径。这是最关键的艺术控制参数,决定了光线在表面下散射的距离和模糊程度。在实践中,这通常是一个RGB向量,允许红、绿、蓝光有不同的散射距离(例如在皮肤中,红光散射得最远)。
 
 
- 直观的艺术参数:
- 
评价: 效果出色,性能远超偶极子模型,参数非常直观,易于美术师理解和控制。它巧妙地用一个公式融合了近似的单次散射(较锐利的 e⁻ʳ/ᵈ项)和多次散射(较模糊的e⁻ʳ/³ᵈ项)。
三、 实践中的BSSRDF:重要性采样
核心观点: 为了高效求解BSSRDF的面积分,我们不能在表面上盲目地随机选择入射点 ,而必须使用重要性采样,优先选择那些贡献更大的点。
- 采样策略:
- 采样距离 : 根据所选扩散轮廓 的累积分布函数(CDF),将一个随机数映射为一个采样距离 。这样,距离近、贡献大的点被选中的概率更高。
- 采样角度 : 在到之间均匀选择一个随机角度。
- 确定入射点 : 结合 在着色点 的切平面上确定一个采样点,并将其投影回真实的3D模型表面,得到最终的入射点。
 
通过这种方式,我们可以用较少的采样次数,快速收敛得到一个低噪声的次表面散射效果。对于实时渲染,这一过程通常会被进一步简化为屏幕空间模糊 (Screen-Space Blurring) 等技术。
参与介质与体绘制
本节旨在深入探讨参与介质 (Participating Media) 的渲染。我们将从其核心物理模型——辐射传输方程 (Radiative Transfer Equation, RTE) 出发,理解光线在体积内部的复杂交互,并最终了解如何使用蒙特卡洛方法来模拟这一过程。
零、 超越表面:进入体积的世界
核心观点: 传统的 BSDF 模型只处理物体表面的光线交互,这对于金属、塑料等不透明材质是足够的。但对于云、烟、雾、乃至玉石、皮肤等半透明材质,光线会进入其内部并与之发生复杂作用,这类材质统称为参与介质。
- 两种渲染策略的对比:
- 体绘制 (Volume Rendering): 物理精确的方法。直接在三维体积数据内部模拟光的传播、吸收和散射,求解辐射传输方程。效果真实,但计算开销巨大。
- BSSRDF: 高效近似的方法。它将复杂的内部散射效应“打包”成一个表面模型,允许我们继续使用基于表面的渲染方程。效果很好,但它是对真实物理过程的简化。
 
本笔记聚焦于前者——体绘制的物理原理。
一、 辐射传输方程 (RTE):体积渲染的“宪法”
核心观点: 辐射传输方程 (RTE) 是描述光线在参与介质中传播时其辐射亮度 (Radiance) 如何变化的微分方程。它是一切体绘制技术的基础。
该方程描述了光线沿一个方向前进一小步时,其能量会因四种基本交互而发生改变:两种损失和两种增益。
1.1 体积介质的“材质”参数
要定义一个参与介质,你需要以下几个核心物理量,它们是RTE的系数:
- 吸收系数 (): 光线在介质中穿行单位距离被吸收的概率。吸收掉的能量通常转化为热能。
- 散射系数 (): 光线在介质中穿行单位距离被散射(改变方向)的概率。
- 消光/衰减系数 (): 光线发生任意交互(吸收或散射)的总概率。
- 单次散射反照率 (Albedo, ): 描述一次交互事件“是散射而非吸收”的概率。
- 表示纯散射介质(如理想的云雾), 表示纯吸收介质(如深色墨水)。
 
- 平均自由程 (Mean Free Path, ): 光子在两次连续交互之间能自由穿行的平均距离。
- 相函数 (Phase Function, ): 体积的“BRDF”。它描述了光线被散射后,其能量在各个方向上的空间分布。
1.2 相函数:决定散射的“形状”
核心观点: 相函数 决定了参与介质的宏观视觉外观。例如,它是让云彩看起来“软绵绵”还是让烟雾有“滚滚向前”感觉的关键。
- 常见相函数模型:
- 各向同性 (Isotropic): 最简单的模型,向所有方向均匀散射。适用于简单的雾效。
- 瑞利散射 (Rayleigh): 用于模拟光被远小于光波长的粒子(如空气分子)散射的物理现象。它更多地向前方和后方散射光线,是天空呈现蓝色的原因。
- 亨尼-格林斯坦 (Henyey-Greenstein, HG): 业界应用最广泛的经验模型。通过一个不对称参数 ,可以灵活地控制散射方向:
- : 前向散射,大部分光继续沿原方向前进(适用于云、雾)。
- : 后向散射,大部分光被反射回来。
- : 退化为各向同性散射。
 
 
二、 求解RTE:蒙特卡洛路径追踪
核心观点: RTE是一个复杂的积分-微分方程,解析求解几乎不可能。因此,我们使用蒙特卡洛方法,通过模拟单条光线(光子)在介质中的“随机游走”过程来得到其统计解。
2.1 朗伯-比尔定律:光线的衰减
这是从RTE中简化出的、描述光线在无“内散射”和“自发光”的介质中能量衰减的核心定律。
- 透射比 (Transmittance, ): 光线穿行距离 后,未发生任何交互而幸存下来的能量比例。 这个指数衰减是所有体积效应(如体积阴影)的基础。
2.2 体积光线步进算法 (Volume Path Tracing)
模拟单条光线在均匀介质中的生命周期如下:
- 采样散射距离: 首先,我们需要决定光线在介质中要走多远才会发生下一次交互。这个距离 是从一个指数分布中随机采样得到的:
- 判断事件:
- 如果采样出的距离 超出了介质边界,那么光线就成功穿过了体积而未发生交互。
- 如果 在介质边界之内,那么就在该点发生一次交互事件。
 
- 吸收还是散射?
- 在交互点,我们再根据反照率 进行一次“俄罗斯轮盘赌”。生成一个随机数,如果它小于 ,则发生散射;否则,发生吸收,光线被终结。
 
- 选择新方向:
- 如果事件是散射,就根据相函数 作为概率分布,采样一个新的光线方向。
 
- 循环:
- 从当前交互点,沿着新方向,重复步骤1,开始下一次“随机游走”。
 
通过模拟大量光线的此类路径,我们便可以统计出最终渲染图像的结果。
光照模型的层级关系
本节旨在梳理现代计算机图形学中,从最完备的理论模型全光函数 (Plenoptic Function) 出发,通过一系列的简化假设,逐步推导出我们在引擎中实际使用的各种实用模型(如BRDF、纹理贴图等)的层级关系。
核心观点: 所有的实用光照模型,都可以看作是对“完美”的、但无法计算的全光函数在不同维度上进行简化的结果。你选择做什么样的简化,就决定了你能模拟什么样的物理现象。
1. 理论的起点:全光函数 (7维)
全光函数 (Plenoptic Function) 是一个理论上的“终极”函数,它描述了宇宙中所有光线的完整信息。
- 它包含了7个维度:空间位置 (x, y, z),方向 (θ, φ),光波长 (λ),以及时间 (t)。
- 地位: 它是光照物理现象的“第一性原理”,但因其维度过高,在实际中无法直接使用。
2. 走向实用:通用散射函数与三大简化
光与物体的交互可以被看作是一个通用的散射函数,它将一个入射的全光函数映射到一个出射的全光函数(7维输入 → 7维输出,共14维)。为了让它变得可计算,我们首先进行三大通用简化,得到一个8维的基础散射模型:
- 三大简化:
- 时间无关: 假设光照瞬时传播,忽略时间 维度(即没有磷光等现象)。
- 波长无关: 假设没有荧光等改变光波长的现象,并用RGB三通道来近似连续的光谱 。
- 表面交互: 假设光线只在物体的二维表面上发生交互,将三维空间位置 简化为二维表面位置 。
 
从这个8维的基础模型出发,我们可以根据不同的需求,沿着两条主要的路径继续简化。
3. 简化的两条路径
路径 A:假设“空间均匀” (Spatially Uniform)
这条路径的核心假设是:一个物体的材质属性在它表面的任何地方都是完全一样的。
- 
BSSRDF (6维): - 描述: 双向次表面散射反射分布函数。
- 现象: 模拟光线从表面一点 进入,在内部散射后,从另一点 射出的次表面散射效果(如皮肤、玉石)。
- 简化: 在8维模型基础上,假设材质本身是均匀的,所以散射属性与入射点 的绝对位置无关,只和出射点 与入射点 的相对位置有关。
 
- 
BRDF (4维): - 描述: 双向反射分布函数。
- 现象: 模拟光线从表面一点进入,并从同一点射出的表面反射(如塑料、金属)。
- 简化: 在BSSRDF基础上,进一步假设没有次表面散射,即入射点与出射点相同 ()。这是现代PBR管线中描述均匀材质的核心。
 
- 
各向同性BRDF (Isotropic BRDF, 3维): - 现象: 模拟没有“纹理方向”或“拉丝”效果的材质(如普通塑料)。
- 简化: 在BRDF基础上,进一步假设材质绕其法线旋转后,反射属性不变。
 
路径 B:假设“无次表面散射” (No Subsurface Scattering)
这条路径的核心假设是:光线与物体表面的交互只发生在同一点上,但允许材质属性随表面位置变化。
- 
SVBRDF / BTF (6维): - SVBRDF描述: 空间可变双向反射分布函数。
- BTF描述: 双向纹理函数。
- 现象: 模拟一个物体表面各处的材质不相同的情况(如一张带有图案的木桌)。
- 简化: 在8维模型基础上,假设入射点与出射点相同 ()。
- 核心区别:
- SVBRDF 是一个参数化模型。我们在引擎中使用的PBR材质,其各种属性(如反照率、粗糙度、金属度)由纹理贴图 (Texture Maps) 提供,这就是一个典型的SVBRDF。
- BTF 是纯粹的测量数据。它通过真实扫描设备,记录下某个材质样本在所有光照和观察角度下的外观,数据量巨大。
 
 
- 
光场 (Light Fields, 4维): - 现象: 完整记录从一个物体的各个表面点、向各个方向射出的所有光线。
- 简化: 在SVBRDF基础上,忽略入射光的信息,只保留出射光。常用于图像渲染(Image-Based Rendering)。
 
- 
纹理贴图 (Texture Map, 2维): - 现象: 记录物体表面各点的颜色。
- 简化: 在光场基础上,进一步假设表面是理想漫反射 (Lambertian),即从任何角度看颜色都一样,所以无需记录方向信息。这就是我们最熟悉的反照率/漫反射贴图 (Albedo/Diffuse Map)。
 
总结:简化的层级关系图
                全光函数 (7D)
                      |
        [三大简化: t, λ, 表面交互]
                      |
          通用8D散射函数 (p_i, ω_i -> p_o, ω_o)
                      |
        +-------------------------------+
        |                               |
  [假设: 空间均匀]                [假设: 无次表面散射]
        |                               |
    BSSRDF (6D)                     SVBRDF / BTF (6D)
        |                               |
  [假设: 无次表面散射]                     |
        |                               |
      BRDF (4D)                     光场 (Light Fields, 4D)
        |                               |
  [假设: 各向同性]                [假设: 理想漫反射]
        |                               |
 各向同性BRDF (3D)                  纹理贴图 (2D)
PBR材质的重要性采样
本节旨在深入探讨在路径追踪等蒙特卡洛渲染算法中,如何针对不同的BRDF模型(从简单的Phong到主流的Microfacet)实施重要性采样 (Importance Sampling)。
核心观点: 在求解渲染方程时,天真地向半球内均匀发射光线是极其低效的,因为大部分光线方向对最终颜色的贡献几乎为零。重要性采样的核心思想是:让采样光线的概率密度 (PDF) 与该方向上光线的贡献度成正比,从而将计算力集中在高贡献区域(如高光中心),以更少的采样次数获得更低噪声的收敛结果。
采样的目标分布: 理论上,我们希望采样概率 pdf(ω) 正比于 f_r(ω) * L_i(ω) * cos(θ)。但在采样BRDF时,入射光 L_i(ω) 通常是未知的,因此我们的目标简化为:
1. 基础采样策略
1.1 均匀半球采样 (Uniform Hemisphere Sampling)
- 策略: 最朴素的方法,每个方向的立体角被选中的概率完全相等。
- PDF:
- 适用场景: 几乎从不用于采样BRDF,因为它完全没有“智能”。主要用于对未知或均匀分布的环境光进行采样。
- 采样公式: (从两个均匀随机数 生成)
1.2 余弦加权半球采样 (Cosine-Weighted Hemisphere Sampling)
- 策略: 使采样方向的概率密度正比于该方向与法线夹角的余弦值 cos(θ)。
- PDF:
- 适用场景: 这是对理想漫反射 (Lambertian) 材质的完美重要性采样策略,因为Lambertian BRDF ρ/π是常数,其贡献完全由cos(θ)项决定。
- 采样公式:
2. 采样经验模型 (Phong)
Phong模型由漫反射和镜面反射两部分组成。采样时,通常会先用一个随机数根据 k_d 和 k_s 的比例,决定本次采样是针对漫反射项还是镜面反射项。
- 采样漫反射项: 使用上一节的余弦加权半球采样。
- 采样镜面反射项:
- 策略: Phong的镜面项是 cosⁿ(α),其中α是采样方向与理想镜面反射方向R的夹角。我们的目标就是生成遵循这个cosⁿ分布的随机方向。
- PDF (在以R为中心的局部坐标系中):
- 采样公式 (生成相对于 R 的方向):
- 最后一步: 将这个在局部坐标系下生成的方向 (θ_r, φ_r)变换回世界坐标系。
 
- 策略: Phong的镜面项是 
3. 现代PBR核心:采样微表面法线
核心范式转变: 对于微表面模型,我们不再直接采样出射光线的方向 ω_o。取而代之的是,我们重要性采样微表面的法线 h,使其分布遵循法线分布函数 (NDF),即 D(h)。然后,根据采出的 h 和已知的观察方向 v,通过反射计算出对应的入射光方向 l。
采样 h -> 计算 l
3.1 采样 GGX 分布 (业界标准)
- 策略: GGX NDF是现代引擎的标准选择。我们需要生成一个微表面法线 h,其概率密度与D_GGX(h)和cos(θ_h)的乘积成正比(cos(θ_h)是微表面法线与宏观法线夹角的余弦,代表了微观面积到宏观面积的投影)。
- 采样公式 (生成 h 的方向 (θ_h, φ_h)):- 是材质的粗糙度 (Roughness)。
- 这组公式是所有现代PBR离线渲染器和烘焙工具的基石。
 
3.2 采样 Beckmann 分布
- 策略: 与GGX类似,但目标分布是Beckmann NDF。
- 采样公式 (生成 h 的方向 (θ_h, φ_h)):
3.3 PDF的转换 (Jacobian)
一个关键的数学细节:我们采样的是 h,但最终渲染方程积分的对象是出射方向 ω_o (或入射方向ω_i)。从 pdf(h) 转换到 pdf(ω_o) 需要乘以一个雅可比行列式 (Jacobian)。
- 对于反射:
在蒙特卡洛估计中,当用采样 h的pdf(h)来计算时,必须在分母中除以这个Jacobian,以得到正确的pdf(ω_o)。
全局光照 (Global Illumination) 概览
本节旨在概述全局光照 (GI) 的核心理念、其数学基础——渲染方程 (Rendering Equation),并梳理为求解该方程而诞生的各种主流渲染算法。
零、 局部光照 vs. 全局光照
核心观点: 理解光照模型的第一步,是区分“局部”与“全局”的差异。
- 
局部光照模型 (Local Illumination): - 关注点: 单个点如何对直接照射到它的光线做出反应。
- 工具: BRDF 等材质模型。
- 局限: 它不知道光线是如何到达这个点的,也无法模拟光线从该点反射出去后对场景中其他物体的影响。它只能处理直接光照。
 
- 
全局光照模型 (Global Illumination): - 关注点: 完整地模拟光线在整个三维场景中的传播、反弹和交互。
- 结果: 它能自然地产生所有真实世界的光照现象,包括直接光照和间接光照 (Indirect Illumination)。
- 关键视觉效果: 软阴影 (Soft Shadows)、颜色溢出 (Color Bleeding)、焦散 (Caustics)、漫反射互照 (Diffuse Interreflection) 等。
 
一、 渲染方程:所有光照现象的统一描述
核心观点: 渲染方程 (The Rendering Equation) 是所有物理光照模拟的数学基石。它是一个积分方程,精确描述了从一个表面点射出的光,是其自身发光与所有入射光反射之和。
- 
半球积分形式 (Hemisphere Form): 这是最常用的形式。 
- 
方程的通俗解读: “一个点向外发出的光” = “它自己发的光” + “它反射的所有方向来的光之和” - : 我们要求解的目标——从p点沿 方向出射的总光亮度。
- : p点自身沿 方向的自发光。
- : 对p点上方的整个半球进行积分(求和)。
- : 从 方向入射到p点的光亮度。
- : p点的材质 (BRDF),决定了光如何被反射。
- : 入射光能量因角度产生的衰减。
 
- 
递归的本质:光线的“弹射” 渲染方程最关键的特性是它的递归性。一个点接收到的入射光 ,实际上是场景中另一点射出的出射光 。将方程展开,可以清晰地看到光线的传播路径: 挑战: 这个递归的积分方程极难甚至不可能求得解析解。因此,所有全局光照算法的本质,都是在尝试用不同的数值方法来近似求解这个方程。 
二、 全局光照算法“全家桶”
以下是为求解渲染方程而设计的各种主流算法,它们各有优劣,适用于不同的场景。
2.1 路径追踪家族 (Path Tracing Family)
这类算法基于蒙特卡洛方法,通过模拟光线的随机路径来求解积分。
- 
(经典)光线追踪 (Whitted-Style Ray Tracing): - 核心思想: 算法的“鼻祖”。从视点发出的光线,遇到漫反射表面时只计算直接光照;遇到理想镜面或玻璃时,则递归地追踪反射/折射光线。
- 评价: 只能处理镜面反射的间接光照,无法处理漫反射间的反弹(如颜色溢出),并非完整的GI。
 
- 
路径追踪 (Path Tracing): - 核心思想: 现代离线渲染的基石。在每个表面弹射点,随机选择一个方向继续追踪,形成一条完整的光路,然后统计大量光路的结果。
- 评价: 算法简单、优雅、无偏(只要时间足够长,就能得到物理正确的结果)。主要缺点是收敛慢,容易产生噪点 (Noise)。
 
- 
双向路径追踪 (Bidirectional Path Tracing, BDPT): - 核心思想: 同时从相机和光源发出路径,然后在中间将两条路径的顶点连接起来,共同构建一条完整的光路。
- 评价: 在处理某些“困难”光路(如通过缝隙的光照、焦散)时,效率远高于普通路径追踪。
 
2.2 粒子与混合方法 (Particle & Hybrid Methods)
- 
光子映射 (Photon Mapping): - 核心思想: 一个两阶段算法。Pass 1 (光子发射): 从光源向场景发射大量“光子”,并记录它们落在物体表面的位置和能量。Pass 2 (最终渲染): 从相机发射光线,在其与物体交点处,查找周围一定范围内的光子,并估算其密度,从而计算间接光照。
- 评价: 渲染焦散 (Caustics) 效果的“神器”。缺点是结果有偏(会模糊细节),且需要大量内存来存储光子图。
 
- 
梅特罗波利斯光传输 (Metropolis Light Transport, MLT): - 核心思想: 一种更“智能”的蒙特卡洛方法。它首先找到一条有效的光路,然后通过对这条路径进行微小的、随机的**“变异”**来探索其他可能的高贡献路径。
- 评价: 极其擅长寻找和渲染非常复杂的“困难”光路,但算法实现复杂。
 
- 
顶点连接与合并 (Vertex Connection and Merging, VCM): - 核心思想: 一种强大的混合算法,它将双向路径追踪 (BDPT) 和光子映射的优点结合在了一起。
- 评价: 在几乎所有场景下都表现稳健,是目前最强大的离线渲染算法之一。
 
2.3 其他重要方法
- 
辐射度 (Radiosity): - 核心思想: 一种基于有限元思想的方法。它将场景中所有表面划分成小块(patches),然后解一个巨大的线性方程组,来计算每个小块之间相互传递了多少光能。
- 评价: 假设所有表面都是理想漫反射。其巨大优点是计算结果与视点无关,一次计算后可以任意漫游。非常适合模拟建筑室内等静态、漫反射为主的场景。是实时GI烘焙 (Light Baking) 技术的理论前身。
 
- 
多光照渲染 (Many-Lights Rendering / VPLs): - 核心思想: 将间接光照问题简化为直接光照问题。它首先从光源发射光线,当光线第一次弹射到漫反射表面时,就在该点创建一个虚拟点光源 (Virtual Point Light, VPL)。然后,通过渲染成百上千个VPL的直接光照来近似全局光照。
- 评价: 这是从离线渲染通向实时全局光照的重要桥梁技术。
 
蒙特卡洛路径追踪
本节旨在深入剖析基于蒙特卡洛 (Monte Carlo) 方法求解渲染方程 (Rendering Equation) 的核心技术——路径追踪 (Path Tracing),并介绍其重要的优化与进阶算法。
一、 核心工具:蒙特卡洛积分
核心观点: 渲染方程是一个极其复杂的递归积分,无法直接求解。蒙特卡洛方法为我们提供了一个强大、通用的数值工具,通过随机采样来近似这个积分的解。
- 
蒙特卡洛估算器 (The Estimator): 对于任意定积分 ,我们可以通过生成N个遵循某一概率密度函数 (PDF) 的随机样本 ,来近似它的值: - 关键特性: 这是一个无偏估计,意味着只要采样次数N足够大,其期望值就等于真实的积分值F。
 
- 
渲染中的头号公敌:方差 (Variance) - 表现: 蒙特卡洛估算中的方差,在渲染图像中直接表现为噪点 (Noise)。
- 收敛速度: 图像的“干净”程度(标准差)与采样次数的平方根成反比,即 。这意味着,要让噪点减半,需要将采样数(SPP)翻四倍,这就是路径追踪收敛缓慢的根本原因。
 
- 
对抗方差的武器:重要性采样 (Importance Sampling) - 核心思想: 为了在有限的采样次数内得到更精确的结果,我们应该让 pdf(x)的形状尽可能地接近被积函数f(x)的形状。这样,f(x)值越大的地方,被采样到的概率也越高,从而极大降低估算的方差。
 
- 核心思想: 为了在有限的采样次数内得到更精确的结果,我们应该让 
二、 基础算法:路径追踪 (Path Tracing)
核心观点: 路径追踪是蒙特卡洛方法在渲染方程上的直接、递归应用。它通过模拟一条光线从相机出发,在场景中**“随机游走”**的完整路径,来计算单个像素的颜色。
- 
算法流程(简化版): - 从相机(视点)出发,向场景中发射一条光线。
- 光线击中物体表面于 点。
- 在 点,使用重要性采样(如根据BRDF和cosine项)随机选择一个新的方向,发射下一条光线。
- 递归执行步骤2和3,每次弹射都将能量根据 (BRDF * cosθ / pdf)进行衰减。
- 当光线击中光源或逃逸出场景时,将累积的能量贡献给像素。
- 重复以上过程多次(增加SPP),并将所有路径的结果平均,得到最终的像素颜色。
 
- 
路径终止:俄罗斯轮盘赌 (Russian Roulette, RR) - 问题: 如何在不引入偏差的情况下,优雅地终止可能无限弹射的光线?
- 方法: 在每次弹射后,设定一个存活概率 (例如,可以基于当前光线能量)。然后生成一个随机数,如果随机数大于 ,则终止路径;如果小于 ,则让路径继续,但将其能量贡献放大 倍。
- 效果: 这种方法在数学上保证了能量守恒,是一种无偏的路径终止策略。
 
关键优化:Next Event Estimation (NEE)
也称为:直接光照采样 (Direct Light Sampling)
- 问题: 基础路径追踪完全依赖随机弹射来“撞”到光源,这对于场景中的小光源来说极其低效,会产生大量噪点。
- 解决方案:拆分积分,显式求解
在每个弹射点,我们将渲染方程的积分拆分为直接光照和间接光照两部分:
- 直接光照: 主动地从场景光源上随机选择一点,向当前着色点发射一条阴影光线 (Shadow Ray)。如果光线未被遮挡,则直接计算该光源的贡献。
- 间接光照: 正常地执行一次随机弹射来收集间接光照,但如果这条光线碰巧击中了光源,则其贡献必须记为0,以避免重复计算。
 
- 评价: NEE是所有现代路径追踪器必备的、至关重要的优化,它能以极小的代价,极大地降低直接光照产生的噪声。
三、 进阶算法:双向路径追踪 (Bidirectional Path Tracing, BDPT)
- 
动机: 即使有了NEE,某些复杂的“困难光路”依然很难被采样到。例如: - 焦散 (Caustics): 光线通过玻璃聚焦后照亮一个漫反射表面。
- 间接可见光源: 光源本身不可见,但其在一面镜子中的反射可见。
 
- 
核心思想: 两条路,中间连。 同时从相机和光源出发,各自生成一条路径(相机路径和光源路径),然后尝试将这两条路径上的每一个顶点两两连接,从而一次性生成大量不同长度和策略的有效光路。 - 相机路径 (Eye Path):
- 光源路径 (Light Path):
- 连接策略: 尝试连接 , , , ... 等所有组合。
 
- 
多重重要性采样 (Multiple Importance Sampling, MIS): 由于一条完整的光路可能由多种连接策略生成,BDPT使用MIS来为每种策略的贡献进行最优的加权,从而进一步降低方差。 
- 
评价: - 优点: 算法非常稳健 (Robust),在处理焦散等复杂光路时,其收敛速度和效果远超单向路径追踪。
- 缺点: 算法实现复杂度远高于普通路径追踪。
 
梅特罗波利斯光传输 (MLT)
本节旨在深入探讨梅特罗波利斯光传输 (Metropolis Light Transport, MLT) 的核心原理。我们将首先回顾传统蒙特卡洛方法的局限,然后引出其背后的理论引擎——马尔可夫链蒙特卡洛 (MCMC),并最终理解MLT如何将该理论应用于渲染,以解决“困难光路”的采样问题。
零、 传统蒙特卡洛方法的局限
核心观点: 传统的路径追踪(Path Tracing, PT)或双向路径追踪(BDPT)通过每次独立地生成随机光路来估算像素颜色。这种方法虽然稳健,但在处理某些**“困难光路”**(如焦散、光线通过门缝)时效率极低。可能会有成千上万次采样都无法找到那条关键的光路,导致图像充满噪点或部分区域完全黑暗。
重要性采样 (Importance Sampling) 可以在局部(如在一次弹射时根据BRDF采样)提供帮助,但它无法保证生成的整条光路都是高贡献的。我们需要一种方法,一旦找到一条高贡献的路径,就能在其周围进行更深入的**“探索”**。
一、 理论引擎:马尔可夫链蒙特卡洛 (MCMC)
核心观点: MCMC 是一种强大的采样技术,其目标是从一个我们不知道如何直接采样的复杂概率分布 中生成样本。它通过构建一条马尔可夫链 (Markov Chain) 来实现这一目标,这条链的最终稳定状态恰好就是我们想要的分布 。
- 马尔可夫链: 一个状态序列 ,其中下一个状态 的概率只依赖于当前状态 。
- MCMC的直观比喻 (智能探索的“醉汉”):
- 想象一个“醉汉”站在一张代表概率分布的地形图上(高处代表概率大)。
- 他随机地向周围迈出一小步,到达一个“提议”的新位置。
- 他根据一个聪明的规则(见下一节)决定是接受这个移动,还是拒绝并留在原地。
- 重复这个过程。最终,醉汉“访问过”的所有位置的分布,将完美地复现地形图的样貌。
 
二、 核心算法:梅特罗波利斯-黑斯廷斯 (Metropolis-Hastings)
核心观点: 这是实现MCMC“智能探索”最经典的算法。它提供了一个精确的数学规则——接受概率 (Acceptance Probability),来指导上述“醉汉”的每一步移动。
- 
算法步骤: - 从一个初始状态 开始。
- 提议 (Propose): 使用一个提议函数 对当前状态 进行一次随机的**“变异 (Mutation)”**,得到一个候选状态 。
- 决策 (Decide): 计算接受概率 。
- 接受/拒绝 (Accept/Reject): 生成一个 [0, 1] 的随机数 。如果 ,则接受变异,令下一个状态 ;否则,拒绝变异,令 (即在原地再待一轮)。
 
- 
接受概率公式 (The Secret Sauce): - 直观理解:
- 是核心。如果新提议的状态 的概率密度更高(即移动到了地形图的“上坡”),则接受概率会很高,我们倾向于接受这个移动。
- 即使 的概率密度更低(走到了“下坡”),我们仍有一定概率接受这个移动。这个特性至关重要,它保证了算法不会被困在某个局部的“山峰”上,而是能探索整个状态空间。
 
 
- 直观理解:
三、 MLT:将MCMC应用于渲染
核心观点: MLT就是将Metropolis-Hastings算法应用于光路空间 (Path Space) 的一次精彩实践。
- 
概念映射: - 状态空间 : 所有可能的、从光源到相机的完整光路的集合。
- 一个状态 : 一条具体的光路 。
- 目标分布 : 一条光路对图像的贡献度,通常用其光亮度 (Luminance) 来表示。我们的目标是,让贡献越大的光路被采样到的概率也越大。
 
- 
MLT 算法流程: - 启动 (Seeding): 使用BDPT等传统方法,先生成一批“种子”光路。从中选择一条贡献较高的光路作为MCMC链的初始状态 。
- 迭代 (Main Loop): a. 变异 (Mutate): 对当前光路 进行一次随机的、小幅度的修改,得到一条新的候选光路 。 b. 决策 (Decide): 计算接受概率 。(这里假设了变异是对称的,即 )。 c. 接受/拒绝: 根据概率 决定下一条光路是 还是 。 d. 贡献: 将最终确定的光路 的颜色贡献累加到图像上。
- 重复执行上一步,不断探索和贡献新的光路。
 
- 
光路变异策略 (Mutation Strategies): 如何“变异”一条光路是MLT实现的关键。主要有两种思路: - 路径空间变异 (Path Space): 直接修改光路的顶点。例如,随机移动一个弹射点,或者增加/删除一个弹射段。实现起来较为复杂。
- 主样本空间变异 (Primary Sample Space): 更现代、更常用的方法。我们知道,任何一条光路都是由一串伪随机数序列 (u₁, u₂, ...)唯一确定的。因此,我们可以通过轻微扰动这些输入的随机数,然后重新完整地生成一条新的光路。这种方法更容易保证变异的有效性。
 
MLT的优缺点
- 优点:
- 在处理有复杂间接光照和困难焦散的场景时,其渲染效率和效果远超传统路径追踪方法。
 
- 缺点:
- 算法实现复杂。
- 结果是有偏的(因为它依赖于初始种子路径,且相邻样本高度相关)。
- 收敛不均匀,容易在图像中产生“脏”的斑块,需要长时间渲染才能消除。
 
辐射度方法 (Radiosity Method)
本节旨在深入剖析辐射度 (Radiosity) 这一经典全局光照算法的核心原理、实现步骤、关键挑战及其在现代实时渲染中的深远影响。
零、 一种截然不同的GI思路
核心观点: 与基于蒙特卡洛的光线追踪 (Ray Tracing) 不同,辐射度方法是一种基于有限元分析 (Finite Element Method) 的全局光照算法。它不追踪单独的光线路径,而是将场景中的所有表面离散化,然后解一个巨大的方程组来计算它们之间的能量交换。
根本性假设: 经典的辐射度方法建立在一个核心假设之上——场景中的所有表面都必须是理想的漫反射 (Lambertian) 表面。这意味着光线会被均匀地向所有方向反射,与观察角度无关。
一、 辐射度方程:光能交换的数学描述
核心观点: 场景中任何一个表面面片 (Patch) 的总出射光能,等于它自身发出的光能,加上它反射的、来自所有其他面片的光能之和。
- 
辐射度 (Radiosity, B): 关键物理量,表示一个表面单位面积上射出的总能量(包括自发光和反射)。单位是 。 
- 
核心方程: 对于场景中的第 个面片,其辐射度 可以表示为: 
- 
方程各项解析: - : 我们要求解的未知数——面片 的最终辐射度。
- : 已知量——面片 的自发光度。如果它不是光源,则 。
- : 已知量——面片 的反射率 (Albedo)。
- : 其他所有面片 的辐射度(同样是未知数)。
- : 形状因子 (Form Factor)。这是辐射度方法中最核心、最关键的几何量。
 
- 
矩阵形式: 将场景中所有N个面片的方程联立起来,就形成了一个巨大的线性方程组: 全局光照的计算问题,至此被转化为了一个解线性方程组的数学问题。 
二、 辐射度算法的实践步骤
第1步:场景离散化
将场景中的所有几何体表面,剖分成N个更小的面片 (Patches)。剖分的精细度决定了最终光照贴图的分辨率和计算量。
第2步:计算形状因子 (Form Factor)
这是整个算法中最困难、最耗时的部分。
- 定义: 形状因子 表示从面片 射出的总能量中,有多少比例能够直接到达面片 。
- 物理意义: 它是一个纯粹的几何量,只与两个面片的大小、相对位置、朝向以及它们之间的可见性 (遮挡关系) 有关。
- 计算方法:
- 半立方体 (Hemi-cube): 一种经典的、基于硬件光栅化的快速近似方法。在面片中心放置一个虚拟的半立方体“相机”,将整个场景渲染到这个立方体的五个面上,通过统计每个像素代表的形状因子来累加总和。
- 蒙特卡洛 (Monte Carlo): 在两个面片之间随机发射大量光线,统计最终成功连接(未被遮挡)的光线比例。
 
第3步:求解线性方程组
由于场景面片数量巨大,直接对矩阵求逆是不可行的。实践中采用迭代法 (Iterative Methods) 求解。
- 核心思想: 从一个初始状态(只有光源发光)开始,迭代地模拟光能在面片间的“传递”过程,直到每个面片的辐射度值收敛稳定。
- 两类迭代策略:
- 收集 (Gathering): 在每次迭代中,让每个面片去“收集”来自所有其他面片的光能。如高斯-赛德尔迭代。
- 发射 (Shooting): **(效率更高)**在每次迭代中,找出当前“能量最强”且尚未发射的面片,让它把自己的光能“发射”给所有它能看到的面片。
 
第4步:渲染最终图像
一旦所有面片 的辐射度 都被解出,这个结果就与视点无关了。你可以将每个面片的 值(通常是RGB三通道)作为其颜色,从任意角度、任意位置渲染场景,而无需重新计算全局光照。
三、 辐射度方法的优劣与历史遗产
- 
巨大优点: - 视点无关性 (View-Independence): 计算一次,任意漫游。这是它成为光照烘焙 (Light Baking) 技术理论基础的根本原因。
- 非常擅长表现大面积、柔和的漫反射间接光照,如“颜色溢出”。
 
- 
致命缺陷: - 仅限漫反射: 无法处理镜面、高光等任何与方向相关的反射现象。
- 计算与存储开销巨大: N个面片需要计算 个形状因子,存储和计算成本极高。
- 网格依赖: 对静态场景要求高,动态物体难以处理。
 
- 
历史遗产: 尽管纯粹的辐射度方法已不再流行,但它的核心思想深刻影响了后续的渲染技术,尤其是在实时领域: - 光照贴图/光照烘焙 (Lightmapping/Light Baking): 游戏引擎中广泛使用的技术,其本质就是在离线状态下运行一个类似辐射度(或更高级的路径追踪)的算法,将复杂的静态全局光照结果预计算并存储在纹理中。
- 多光照算法 (Many-Lights Rendering): 辐射度“每个面片都成为次级光源”的思想,直接启发了将间接光照问题转化为成千上万个虚拟点光源 (VPLs) 的直接光照问题的思路,这是实时GI领域的一个重要方向。
 
多光照 (Many-Lights) 全局光照
本节旨在深入探讨多光照 (Many-Lights) 这一类全局光照(GI)算法。我们将从其 foundational concept——虚拟点光源 (VPLs) 出发,理解其带来的“多光照问题”,并梳理为解决此问题而演化出的几种核心技术,如Lightcuts和基于矩阵的方法。
零、 核心思想:将“间接”变为“直接”
核心观点: 传统的路径追踪通过递归地弹射光线来求解渲染方程,计算复杂度高。多光照方法另辟蹊径,它将复杂的间接光照问题,近似地转化为一个大规模的直接光照问题来求解。
这个转化的过程,就是通过在场景中生成成千上万个微小的、临时的虚拟点光源 (Virtual Point Lights, VPLs) 来模拟光线的第一次弹射。
一、 奠基石:即时辐射度 (Instant Radiosity) 与 VPL
即时辐射度 (Instant Radiosity, IR) 是多光照方法的开创性算法,它引入了虚拟点光源 (VPLs) 的概念。
- 
算法流程 (两阶段): - 
阶段一:VPL生成 (Light Pass) - 从场景中的真实光源出发,向场景中发射大量光线路径(光子)。
- 每当一条光线路径弹射到漫反射表面上时,就在该撞击点创建一个虚拟点光源 (VPL)。
- 这个VPL的颜色和强度,就代表了该光子携带的、准备向四周漫反射出去的能量。
- 通过发射大量光子,我们在场景的各个表面上“种”下了成百上千个VPLs。
 
- 
阶段二:最终渲染 (Camera Pass) - 从相机视角正常渲染场景。
- 对于屏幕上需要着色的每一个点,计算所有VPLs 对它的直接光照贡献之和。
- 最终的画面,就是来自真实光源的直接光照,与来自所有VPLs的“直接光照”(实际上是模拟了一次间接光照)的叠加。
 
 
- 
- 
带来的新问题:“多光照问题” (The Many-Lights Problem) 为了得到高质量的GI效果,VPL的数量需要非常庞大(数千到数百万)。让屏幕上的每个像素都去计算来自几百万个光源的直接光照,其计算开销是无法承受的。如何高效地计算这成千上万个光源的贡献,就是“多光照问题”的核心。 
二、 解决方案之一:聚类与剪枝 (Clustering & Culling)
核心观点: 对于一个着色点来说,大量远处的、亮度低的、或者方向相近的VPL,它们的集体贡献可以用一个单一的、更亮的代表性光源来近似,而无需逐一计算。
- 代表算法:Lightcuts
- 构建光源树: 首先,将场景中所有的VPLs根据其空间位置、法线方向、发光强度等信息,构建成一个层次化的光源簇树 (Light Cluster Tree)。树的每个节点都代表其所有子节点(可以是单个VPL或其他簇)的集合,并拥有一个代表性的亮度和位置。
- 自适应求和 (The "Cut"): 在为某个点着色时,从光源树的根节点开始递归遍历:
- 对当前节点(一个光源簇),估算一个误差上界——即“用这个簇的代表性光源”代替“计算簇内所有真实VPL”所产生的最大可能误差。
- 如果误差低于一个设定的阈值,就直接使用这个代表性光源的贡献,并停止对该分支的继续深入。这就在树上形成了一个**“剪枝” (Cut)**。
- 如果误差高于阈值,则继续递归遍历其子节点。
 
 - 效果: Lightcuts通过这种自适应的剪枝策略,能将每个着色点需要计算的光源数量从数百万个锐减到几百个,极大地提升了效率。
 
三、 解决方案之二:矩阵方法 (Matrix-Based Methods)
核心观点: 将整个多光照问题,抽象成一个巨大的光照传输矩阵 (Light Transport Matrix),然后利用线性代数和信号处理的理论,通过对矩阵的降维和采样来高效地近似求解。
- 
光照传输矩阵 A: - 这是一个 m x n的巨大矩阵,其中m是屏幕上的像素(或着色点)数量,n是VPL的数量。
- 矩阵中的元素 代表 VPL 对像素 的光照贡献。
- 像素 的最终颜色,就是矩阵第 行所有元素的总和。
 
- 这是一个 
- 
关键洞察: 这个矩阵通常是低秩 (Low-Rank) 和稀疏 (Sparse) 的。这意味着其中存在大量冗余信息(许多行/列是线性相关的),可以被压缩和近似。 
- 
算法演进: - MRCS (矩阵行列采样):
- 思路: 通过随机采样矩阵的少数几行(代表性像素)和少数几列(代表性VPLs),来构建一个能近似完整矩阵的小得多的矩阵,然后用它来重建最终图像。
 
- LightSlice:
- 思路: MRCS的改进版。它首先根据像素在世界空间中的几何邻近性,将矩阵的“行”预先聚类成**“切片” (Slices)**。然后,在每个“切片”内部进行更局部的、更精确的光源(列)聚类。
 
- 矩阵补全 (Matrix Completion):
- 思路: 更进一步,将这个问题视为一个**“矩阵填空”问题。我们只精确计算(投射阴影光线)矩阵中极少数元素的值,然后用机器学习(如分类算法)来猜测其他元素的可见性,最后通过凸优化**,从这些稀疏、带有噪声的样本中,重建出最可能的、完整的低秩矩阵。
 
 
- MRCS (矩阵行列采样):
总结:多光照渲染的意义
多光照渲染技术,特别是其背后光源聚类和利用相干性的思想,对实时渲染领域产生了深远的影响。虽然这些算法本身大多用于离线或软实时渲染,但它们启发了现代游戏引擎中的许多技术,例如:
- 延迟渲染 (Deferred Rendering) 中处理大量动态光源的光照通道。
- 反射阴影图 (Reflective Shadow Maps, RSM) 等利用GPU生成大量VPLs的实时GI技术。
- 各种基于光源聚类 (Light Clustering/Tiling) 的前向渲染管线优化。
渲染中的采样技术
本节旨在梳理和对比在计算机图形学中,为解决走样 (Aliasing) 问题而设计的几种核心采样 (Sampling) 技术。我们将从最基础的随机采样出发,逐步进阶到更高质量、更复杂的采样模式。
核心观点: 渲染的本质是从一个连续的信号(理想画面)中进行采样,以生成一个离散的图像(像素网格)。一个好的采样策略,其生成的样本点应该同时具备两个特性:均匀分布(避免样本聚集和出现大面积空白)与随机扰动(将结构化的走样错误转化为更不易察觉的噪声)。
1. 分层采样 (Stratified Sampling)
也称:抖动采样 (Jittered Sampling)
- 
核心思想: 这是对纯随机采样的第一个、也是最重要的改进。它将采样区域(例如一个像素)划分为一个均匀的网格 (Grid),然后确保在每个格子内,且仅在一个格子内,随机地放置一个样本点。 
- 
关键术语:抖动 (Jittering) - 指的是在每个格子内部随机放置样本点的过程。
- 抖动是至关重要的,因为它破坏了采样点规则的结构性,从而能有效地将走样(如摩尔纹、锯齿)转化为高频的、人眼不敏感的噪声。
 
- 
优点: - 相比纯随机采样,极大地改善了样本的分布均匀性,避免了样本“扎堆”和出现“空洞”的情况。
- 有效地将走样转化为噪声,提升视觉质量。
 
- 
缺点: - 虽然保证了每个格子只有一个样本,但相邻格子的样本点仍有可能靠得非常近(在格子的边界处)。
- 当采样数量为质数时(如17个样本),难以进行二维分层,只能进行一维分层(),效果大打折扣。
 
2. 拉丁超立方体采样 (Latin Hypercube Sampling, LHS)
- 
核心思想: LHS是分层采样的一种进阶形式,它保证了样本在每一个维度上都独立地满足分层特性。 
- 
直观类比 (“数独”采样): 在一个 的二维网格上生成N个样本,LHS能确保每一行、每一列都恰好只有一个样本点。 
- 
优点: - 解决了分层采样难以处理质数采样数量的问题。
- 在高维空间(例如,同时对像素位置、景深、运动模糊进行采样)中,能提供比简单分层更好的投影均匀性。
 
- 
缺点: - 样本的分布仍然可能存在一定的相关性。例如,通过随机置换后,所有样本点仍有可能“巧合地”排列在一条对角线上,导致大面积的采样空白。
 
3. 低差异序列 (Low-Discrepancy Sequences)
也称:拟蒙特卡洛方法 (Quasi-Monte Carlo, QMC)
- 
核心思想: 这是一类与“随机”采样完全不同的思路。低差异序列是确定性的 (Deterministic)、经过精心设计的点序列,其目标是尽可能快、尽可能均匀地“填满”整个采样空间。 
- 
关键术语:差异度 (Discrepancy) - 一个衡量样本点分布均匀程度的数学指标。它描述了样本分布与理想均匀分布之间的最大偏差。差异度越低,分布越均匀。
 
- 
代表算法: - 范德科普序列 (Van der Corput): 生成一维低差异序列的基础。通过对整数进行**“进制反转” (Radical Inverse)** 操作得到。
- 霍尔顿序列 (Halton): 将范德科普序列扩展到多维。每一维使用一个不同的素数作为进制反转的基底。例如,二维霍尔顿序列的一个点可以是 (基于2的进制反转, 基于3的进制反转)。
- 哈默斯利序列 (Hammersley): 霍尔顿序列的变体。当总样本数N已知时,它的第一维直接使用 $i/N$,后续维度使用霍尔顿序列。其差异度比霍尔顿序列更低。
 
- 
优点: - 极高的均匀性,收敛速度远快于(伪)随机方法,能用更少的样本数量达到更低的噪声水平。
 
- 
缺点: - 由于其确定性,样本点的排布具有明显的结构和规律。如果直接使用,走样会呈现为固定的图案而非噪声,非常扎眼。因此,在实践中通常需要对其进行**“加扰” (Scrambling)** 以引入随机性。
 
4. 泊松盘采样 (Poisson Disk Sampling)
- 
核心思想: 生成一系列随机样本点,同时保证任意两个样本点之间的距离都不小于一个指定的最小半径 。 
- 
产出的样本类型:蓝噪声 (Blue Noise) - 白噪声 (White Noise): 纯随机采样。频谱在所有频率上都有能量,视觉上“又脏又乱”。
- 蓝噪声 (Blue Noise): 缺少低频能量,主要能量分布在高频区域。这是自然界中(如人眼视锥细胞的分布)常见的、看起来最“自然”、最“舒服”的随机模式。
- 核心优势: 蓝噪声采样能将走样能量推向高频,形成非常精细、不易察觉的噪声模式,视觉质量是所有采样方法中最高的。
 
- 
优点: - 兼具了随机性(无明显重复图案)和均匀性(样本间距有保证)。
- 产生视觉上最舒适的蓝噪声,抗锯齿效果最好。
 
- 
缺点: - 生成样本点的算法比前几种要复杂和昂贵。Bridson在2007年提出的线性时间算法是目前事实上的标准。
 
总结与对比
| 采样方法 | 核心思想 | 优点 | 缺点 | 
|---|---|---|---|
| 分层采样 | 网格 + 抖动 | 避免扎堆,走样变噪声 | 相邻格子样本可能过近 | 
| 拉丁超立方体 | 各维度独立分层 | 高维投影性好 | 可能出现对角线等巧合 | 
| 低差异序列 | 确定性地均匀填充 | 收敛速度快 | 有固定模式,需加扰 | 
| 泊松盘采样 | 保证最小样本间距 | 视觉质量最高 (蓝噪声) | 生成样本的计算成本较高 | 
毛发渲染——BCSDF框架与Kajiya-Kay模型
本节旨在介绍用于毛发渲染的专用数学框架——BCSDF,并深入剖析第一个经典的毛发经验模型——Kajiya-Kay模型。
零、 引言:渲染毛发的独特性
核心观点: 渲染毛发与渲染普通固体表面在物理模型和数学描述上都有显著不同。毛发被建模为大量细长的圆柱/椭圆柱体,光线与其交互的方式比在平面上更为复杂。这催生了一套专用的理论框架和光照模型。
- 模型发展脉络:
- Kajiya-Kay (1989): 第一个经典的经验模型,是“毛发版的Phong模型”。
- Marschner (2003): 第一个里程碑式的物理模型,奠定了现代毛发渲染的基础。
- BCSDF (2007): 一个统一的数学框架,用于规范和描述各种毛发散射模型。
 
本笔记聚焦于 BCSDF框架 和 Kajiya-Kay模型。
一、 BCSDF:为“曲线”定制的BSDF
核心观点: 双向曲线散射分布函数 (Bidirectional Curve Scattering Distribution Function, BCSDF) 是专门为毛发这类线性、曲线结构定制的“BRDF”。它描述的是光线与单位长度的毛发纤维交互后的散射分布,而非与单位面积的表面交互。
1.1 关键假设:远场近似 (Far-Field Approximation)
为了简化计算,BCSDF框架做出了几个关键假设,最核心的是远场近似:
- 假设光源和相机距离毛发足够远。
- 因此,我们可以忽略光线照射到毛发纤维截面上具体哪一点,而是将其平均化,只考虑沿单位长度的整体散射效果。
- 同时,局部毛发的弯曲也被忽略,在着色点处被视为一根无限长的直线圆柱体。
1.2 独特的参数化:纵向-方位角坐标
毛发渲染不使用传统的表面法线、切线坐标系,而是采用一套专门的纵向-方位角参数化来描述光线方向。
- 局部坐标系:
- : 沿毛发生长方向的切线 (Tangent)。
- : 垂直于 的两个向量,构成毛发横截面 (法平面)。
 
- 方向角:
- 倾角 (Inclination): 光线方向与法平面 ( 平面) 的夹角。 表示光线垂直于毛发, 表示光线平行于毛发。
- 方位角 (Azimuth): 光线在法平面上的投影与 轴的夹角。
 
1.3 BCSDF渲染方程
在上述坐标系下,毛发渲染的绘制方程形式变为:
- : 即为BCSDF函数。
- 关键知识点:cos²θ项- 这个平方项是BCSDF方程与标准BRDF方程最显著的区别。它来源于两个部分的乘积:
- 一个 cos(θ)来自于立体角到 坐标的变换(雅可比行列式)。
- 另一个 cos(θ)来自于将入射辐射亮度(Radiance)转换为照射到圆柱体侧面的辐射照度(Irradiance)时产生的投影因子。
 
- 一个 
 
- 这个平方项是BCSDF方程与标准BRDF方程最显著的区别。它来源于两个部分的乘积:
二、 Kajiya-Kay模型:“毛发版的Phong”
核心观点: Kajiya-Kay模型是第一个专门用于毛发的经验模型。它简单地将Phong模型的思想从平面扩展到了圆柱体,将毛发光照分解为一个漫反射项和一个镜面反射项。
- 
物理构想: - 将毛发视为一个不透明的、有漫反射颜色的圆柱体。
- 在其表面,存在一个沿着毛发轴向延伸的、模糊的高光。
 
- 
BCSDF 公式: 
- 
公式解析: - : 漫反射系数,一个常数,代表毛发的基底颜色。
- : 镜面反射系数,控制高光的强度。
- : 镜面反射的核心项。它只依赖于入射和出射的倾角 ,与方位角 无关,因此产生的高光是一条贯穿整个毛发长度的“亮线”。 同样是控制高光锐利程度的“反光度”指数。
 
评价与局限
- 
优点: - 模型极其简单,计算速度飞快。
- 作为第一个毛发模型,具有开创性的历史意义。
 
- 
重大缺点: - 完全不基于物理: 只是一个“看起来像”的经验公式。
- 不满足能量守恒。
- 忽略了关键物理现象:
- 菲涅尔效应 (Fresnel Effect): 真实毛发在掠射角下反射率会显著增高。
- 半透明性 (Translucency): 真实毛发是半透明的介电质,光线会折射进入其内部,发生多次内部反射后再折射出来,形成多重高光(这正是Marschner等物理模型的核心)。
 
- 由于以上缺陷,其渲染效果与真实毛发相去甚vány,塑料感很强。
 
结论: Kajiya-Kay模型是理解毛发渲染历史的一个重要起点,但对于追求真实感的现代渲染引擎而言,其地位已被更复杂的、基于物理的Marschner模型及其变体所取代。
基于物理的毛发渲染
本节旨在深入剖析用于渲染真实感毛发的物理模型。我们将从毛发自身的物理结构出发,重点解析里程碑式的Marschner模型及其核心光路,最后介绍为动物毛发设计的双柱面模型。
零、 物理模型的基础:毛发的真实结构
核心观点: 为了构建一个物理正确的渲染模型,我们必须首先理解毛发并非一个简单的、不透明的圆柱体。它具有复杂的内部层次结构,光线会在其中发生反射、折射和吸收。
- 
毛发的三层结构: - 毛小皮 (Cuticle): 最外层,由透明的、瓦片状的鳞片细胞构成。它像一层清漆,主要负责产生高光反射。
- 毛皮质 (Cortex): 中间层,包含了决定毛发颜色的黑色素 (Pigment)。光线在这一层穿行时会被吸收,从而染上颜色。
- 毛髓质 (Medulla): 最内层的疏松多孔核心。在人类头发中不明显,但在动物毛发 (Fur) 中非常重要,会产生类似体积散射的漫反射效果。
 
- 
模型的映射: - Marschner 模型 (用于人类头发): 忽略毛髓质,将毛发简化为一个单一的、半透明的电介质圆柱体(毛小皮 + 毛皮质)。
- 双柱面模型 (用于动物毛发): 显式地为毛髓质添加一个内部圆柱体,形成内外双层圆柱结构。
 
一、 Marschner模型:现代毛发渲染的基石
核心观点: Marschner模型是第一个被广泛应用的物理毛发模型。它不再是简单的经验公式,而是通过几何光学,追踪光线穿过一个半透明圆柱体时的几条主要传播路径(光路波瓣),并将它们的贡献叠加。
1.1 三种主要的光路波瓣 (Lobes)
这是Marschner模型最核心的物理洞察。一根头发上的高光并非只有一处,而是由以下三种主要光路叠加形成的:
- R (Reflection): 主高光。光线直接从毛小皮外表面反射。这个高光接近光源的颜色(白色),位置最符合直觉。
- TT (Transmission-Transmission): 次高光。光线折射进入毛发,穿过毛皮质(被吸收染色),再从另一侧折射出去。这个高光被染上了毛发的颜色,位置相比R高光有所偏移。
- TRT (Transmission-Reflection-Transmission): 第二个次高光。光线折射进入毛发,在毛发内壁发生一次反射,再次穿过毛皮质(被二次染色),最后折射出去。这个高光颜色饱和度更高,位置偏移也更大。
最终的毛发外观 = R (主高光) + TT (染色高光) + TRT (更饱和的染色高光) + ...
1.2 模型的数学分解
为了简化计算,Marschner模型巧妙地将每个光路波瓣 (R, TT, TRT...) 的散射函数 分解为两个独立的部分:
- 
- 纵向散射函数 (Longitudinal Scattering): - 描述: 光线沿毛发长度方向的散射分布。
- 物理成因: 毛小皮的鳞片结构并非完全平行于毛干,而是有一定的倾斜角。这个倾斜导致高光会沿着毛发轴向发生偏移和模糊。
- 建模: 通常使用高斯或类似的分布函数来模拟。
 
- 
- 方位角散射函数 (Azimuthal Scattering): - 描述: 光线围绕毛发截面的散射分布。
- 物理成因: 这是模型最复杂的部分,它封装了光线在毛发横截面上经历的菲涅尔反射/折射、以及穿过毛皮质时的颜色吸收(比尔-朗伯定律)。每个波瓣(R, TT, TRT)都有其独特的方位角分布函数。
 
二、 双柱面模型:为动物毛发而生
核心观点: Marschner模型适用于渲染光滑的人类头发,但无法表现动物毛发那种更柔和、更具“体积感”的漫反射效果。双柱面模型通过显式地加入毛髓质 (Medulla) 来解决这个问题。
- 
模型结构: 在Marschner单圆柱的基础上,内部增加一个代表毛髓质的圆柱。毛髓质被视为一个参与介质 (Participating Media),光线进入其中会发生吸收和散射。 
- 
新增的光路波瓣: 除了Marschner的R, TT, TRT波瓣,双柱面模型额外增加了与毛髓质交互的散射波瓣,如: - TTˢ (Transmission-Medulla Scatter-Transmission): 光线进入毛发,在毛髓质中发生散射,然后穿出。
- TRTˢ (Transmission-Reflection-Medulla Scatter-Transmission): 光线经历一次内反射,并在毛髓质中发生散射。
- 这些带有 s标记的波瓣,为毛发增加了类似漫反射的柔和光照成分,这正是动物毛发质感的关键。
 
- 
实现方式: 毛髓质的散射极其复杂,难以求得解析解。因此,实践中通常通过预计算的方式,将其散射行为烘焙成查找表 (Look-Up Table, LUT),在渲染时进行采样。 
三、 远场 vs. 近场:一个重要的实践区分
核心观点: 选用何种BCSDF模型,取决于相机与毛发的距离。
- 
远场近似 (Far-Field Approximation): - 适用场景: 绝大多数渲染情况,此时一根毛发的直径小于一个像素。
- 做法: 将光线与毛发横截面的具体撞击点 的影响进行积分平均化,得到一个与 无关的、描述单位长度毛发平均散射特性的BCSDF。
 
- 
近场散射 (Near-Field Scattering): - 适用场景: 特写或微距渲染,此时毛发的圆柱形态清晰可见。
- 做法: 不进行对撞击点 的积分,BCSDF的计算结果直接依赖于光线击中毛发圆柱体上的具体位置。这能正确表现出圆柱体的高光和明暗过渡,避免毛发在特写下看起来像一根扁平的“丝带”。
 
深入Marschner毛发模型——冯·米塞斯-费希尔分布
本节旨在解释一个核心问题:为什么现代的、物理精确的Marschner毛发模型要使用一个看起来非常复杂的冯·米塞斯-费希尔 (VMF) 分布,而不是一个简单的正态(高斯)分布来描述其光照散射。
零、 问题的起源:Marschner模型中的能量守恒缺陷
- 
背景回顾: - Marschner毛发模型是现代物理毛发渲染的基石。它巧妙地将光线散射分解为两个独立部分:
- 纵向散射 (): 沿毛发长度方向的模糊效果,由毛小皮鳞片的倾斜和粗糙度引起。
- 方位角散射 (): 围绕毛发横截面的散射,由反射、折射和吸收决定。
 
 
- Marschner毛发模型是现代物理毛发渲染的基石。它巧妙地将光线散射分解为两个独立部分:
- 
原始模型的缺陷: - 最初的Marschner模型为了直观,使用了标准的正态(高斯)分布来模拟纵向散射函数 。
- 但这个做法存在一个致命的物理缺陷:它并不满足能量守恒。一个物理渲染模型如果能量不守恒,就意味着它在某些角度下可能会产生比接收到的光更多的光(无故变亮),或者无故丢失能量(不合理变暗)。
 
- 
我们的目标: 寻找一个新的数学工具来替换原始的正态分布,构建一个在物理上能量守恒的纵向散射函数 。 
一、 必备的数学工具:方向统计学
核心观点: 标准的正态分布描述的是在一条直线上的数据分布。但在图形学中,光线方向、法线等都是定义在球面上的三维向量。我们需要使用“方向统计学”中的专用工具来描述它们的分布。
- 
LV1. 正态分布 (Normal Distribution): - 领域: 一维直线。
- 描述: 大家熟悉的“钟形曲线”,由均值 和方差 定义。
 
- 
LV2. 冯·米塞斯分布 (Von Mises Distribution): - 领域: 二维圆周。
- 直观理解: “圆环上的正态分布”。它描述了一系列角度如何围绕一个平均角度 聚集,其集中度由参数 (类似于 )控制。
 
- 
LV3. 冯·米塞斯-费希尔分布 (Von Mises–Fisher, VMF): - 领域: 三维(或更高维)球面。
- 直观理解: “球面上的正态分布”。这是我们解决问题的终极工具。它精确地描述了一系列三维单位向量,如何围绕一个平均方向 聚集,其集中度由参数 控制。
 
二、 解决方案:从VMF分布推导能量守恒的
核心策略 (由d'Eon等人在2011年提出):
- 首先,使用最适合的工具——VMF分布——来完整地描述光线被毛发上的微小表面散射后,在三维空间中围绕理想反射方向的完整“高光”分布。
- 然后,通过数学方法,将这个三维的VMF分布在方位角(角)维度上进行积分平均化。
- 这个平均化的结果,就是我们最终想要的、只与倾角(角)相关的、并且数学上保证能量守恒的纵向散射函数 。
最终的纵向散射函数
经过上述推导,得到的能量守恒的 函数形式如下:
- 关键参数与函数解析:
- : 核心参数,它与VMF分布的集中度 直接相关,物理上代表了毛发表面的粗糙度。 越小,高光越锐利; 越大,高光越模糊。
- : 0阶第一类变形贝塞尔函数 (Modified Bessel function)。
- 不要被它吓到! 你不需要理解它复杂的定义。在这里,它只是作为VMF分布在积分平均化过程中自然产生的归一化因子而出现。
- 对于引擎开发者: 在实际工程中,这个函数通常会使用一个非常高效的多项式来近似计算,而不是直接求解其无穷级数。
 
 
总结:对渲染工程师的核心启示
- “用对的数学工具做对的事”:渲染物理现象时,方向的分布应该使用球面的统计模型(如VMF),而不是直线上的模型(如高斯)。
- 能量守恒至关重要:现代PBR材质模型的一个核心追求就是能量守恒,这是实现可信、可预测渲染效果的基础。Marschner模型的这个改进是该理念的绝佳体现。
- 复杂数学的工程化:看似恐怖的贝塞尔函数,在实际应用中往往会被简化为性能极高的近似多项式。作为引擎开发者,你需要理解它在物理模型中的作用(归一化),并知道如何找到并实现它的高效近似。