physLight通过物理单位(如流明、亮度)规范数字照明,提升渲染真实度。其核心在于模拟真实相机,利用光谱灵敏度修正RGB渲染中的颜色偏差。该架构已集成至USD,旨在消除不同软件与设备间的差异,确保虚拟产品与实拍画面高度匹配。
引言:当物理学遇见数字渲染
在视觉特效(VFX)和计算机图形学的世界里,有一个长期存在的核心问题:如何让数字生成的图像与真实世界拍摄的影像在视觉上完全一致? 这不仅仅是艺术层面的匹配,更是物理层面的精确对应。NVIDIA的Luca Fascione在他的演讲”physLight: Physical Units in Digital Lighting”中,为我们展示了一个历时十年研发的解决方案——将真实世界的光度学单位、相机曝光和敏感度设置引入数字光照流程。
这个工作的意义是双重的:一方面,它解决了VFX制作中的经典难题——当需要用一个数字角色(比如一只猴子)替换实拍素材中的演员(比如Andy)时,如何让两者的光影效果完美融合;另一方面,它为产品可视化(如宜家家具展示)和虚拟原型制作提供了科学依据,确保计算机生成的图像与真实照片达到所需的接近程度。
本文将深入剖析physLight的技术细节,从基础的光度学概念到复杂的渲染器实现,从光谱分析到实际应用,为读者呈现一幅完整的物理光照技术图景。
第一部分:亮度与光度学基础
1.1 亮度:一个难以定义的基本概念
当我们谈论光照时,“亮度”(brightness)是最直观却又最难以精确定义的概念。Luca Fascione在演讲中指出,亮度是那些”很难用其他概念解释的基本概念”之一。在日常生活中,我们会轻松地说”这个灯更亮”或”那个区域更暗”,但在科学和工程领域,我们需要更精确的度量方式。
在数字图像制作中,我们使用两种主要工具来捕捉和生成图像:现实中的相机和虚拟世界中的渲染器。渲染器在将能量流转换为像素值时,本质上是在模拟相机的物理过程。这个过程可以用一个简化的方程表示:
Pixel Value = Radiance × Imaging Ratio (Ki)
这里的Radiance(辐射亮度)描述的是沿光线方向流动的能量密度,而**Imaging Ratio (Ki)**则包含了相机或渲染器的所有成像参数。
1.2 三种测量基准:光谱、辐射度与光度学
在physLight框架中,Fascione强调了三种不同的测量基准,每种都用特定的下标表示:
光谱基准(Λ - Lambda):考虑不同波长下的能量分布。这是物理世界最真实的描述,因为我们的眼睛和传感器对不同颜色(波长)的光有不同的响应。例如,人眼对绿光(约555纳米)最敏感,而对红光和蓝光的敏感度较低。
辐射度基准(E - Energy):测量纯粹的物理能量流动,不考虑人眼的感知特性。这在科学仪器测量和物理仿真中很有用,因为它直接反映了客观存在的能量。
光度学基准(V - Visual):这是最重要的基准,因为它考虑了人眼对不同波长光的感知差异。**V(λ)**函数(也称为明视觉光谱光视效率函数)定义于20世纪20-30年代,描述了标准人眼对不同波长光的相对敏感度。这个函数在555纳米处达到峰值,向两侧逐渐下降。
Fascione强调了一个重要观点:“如果你相信存在所谓的’标准人’,标准人感知到的亮度与V(λ)函数成正比。” 这意味着当我们讨论图像的”亮度”时,实际上是在讨论光度学量,而非纯粹的物理能量。
1.3 从辐射亮度到亮度
在光度学中,辐射亮度(Radiance)转换为亮度(Luminance)的过程涉及对V(λ)函数的积分:
Luminance = ∫ Radiance(λ) × V(λ) dλ
这个转换的意义在于,它将物理测量与人类感知联系起来。在数字图像处理中,当我们把像素颜色转换到CIE XYZ色彩空间时,Y通道就对应于亮度(Luminance)。这一对应关系为physLight提供了理论基础:渲染器的目标是让像素值在Y通道上与真实世界的亮度测量一致。
第二部分:成像方程与相机模型的深度解析
2.1 成像比率的构成与物理意义
physLight的核心是成像比率(Imaging Ratio, Ki),它描述了从场景亮度到像素值的完整转换过程。Fascione给出了这个方程的基本形式:
Pixel = Radiance × (t × N² / S) × K
其中:
- t 是快门时间(shutter time),单位秒
- N 是光圈数(f-number),如f/2.8、f/5.6等
- S 是曝光指数(exposure index,即ISO值),如ISO 100、ISO 800等
- K 是系统特定的比例常数
这个方程揭示了三个关键的物理关系:
- 快门时间越长,图像越亮(线性关系):如果快门时间从1/100秒增加到1/50秒(加倍),到达传感器的光量也加倍。
- 光圈数越大(光圈越小),图像越暗(平方反比关系):f-number是光圈直径的倒数相对焦距的度量。从f/2.8到f/5.6(加倍),光量变为1/4。
- ISO值越高,图像越亮(线性关系):ISO 800比ISO 100的敏感度高8倍,在相同光照下产生的像素值也高8倍。
这个方程的线性特性至关重要,因为它保证了物理正确性——如果场景亮度加倍,像素值也加倍。这与真实相机的行为一致,也是physLight能够与实拍素材匹配的基础。
2.2 曝光值的计算与传感器增益
在真实相机中,我们测量的是曝光量(Exposure, H),它表示在快门开启期间到达传感器的光量。曝光量的定义是:
H = E × t
其中E是照度(Illuminance,单位lux),t是快门时间(单位秒)。因此,曝光量的单位是勒克斯·秒(lux·seconds)。
Fascione指出,理想情况下,如果光量加倍,像素亮度也应该加倍——这是线性响应的假设。虽然真实传感器在高亮度区域会表现出非线性(饱和效应),但在正常工作范围内,线性假设是合理的。
**传感器增益(Sensor Gain)**是将曝光量(lux·seconds)转换为像素值的关键参数。根据数字相机标准ISO 12232,当像素值为0.18(即18%灰,对应于中性灰卡的反射率)时,传感器增益可以通过以下公式计算:
Gain = 1.8 / H_ref
其中H_ref是产生18%灰所需的曝光量。这个简单的结果(Gain = 1.8)是physLight的第一个重要成果,它提供了一个干净、易于记忆的标准值。
为什么选择0.18(18%)作为参考?这是因为中性灰卡(如Kodak灰卡)的反射率约为18%,它被广泛用作测光的标准。在区域曝光系统(Zone System)中,这个值对应于V区(中间灰),是正确曝光的基础。
2.3 渲染器的独特优势与实现策略
渲染器在测量曝光方面具有独特的优势:它拥有计算所需的所有信息。在真实世界中,我们需要使用测光表来测量场景亮度;但在虚拟世界中,渲染器可以直接计算光线追踪路径上的辐射亮度。
Fascione提出了一个实用的简化策略:如果场景中有运动物体,可以假设快门开启时间为1/100秒,然后将计算出的亮度乘以100。这种方法允许渲染器以物理上合理的方式处理运动模糊。
具体来说,渲染器的实现步骤如下:
-
计算辐射亮度:对于每个像素,通过光线追踪或光栅化计算到达图像平面的辐射亮度L(单位W/(m²·sr))。
-
转换为光度学单位:如果是光谱渲染,通过对V(λ)积分得到亮度(Luminance,单位cd/m²或nit);如果是RGB渲染,使用Y通道作为亮度近似。
-
计算照度:考虑镜头光圈,计算传感器表面的照度E(单位lux)。
-
计算曝光量:E × t(t为快门时间)。
-
应用增益:Pixel = Exposure × Gain = Exposure × 1.8 / H_ref。
-
归一化:根据所需的输出格式(如8位、16位浮点)进行适当的缩放。
2.4 从照度到亮度:光学转换的数学细节
为了在渲染器中实现物理正确的相机模型,我们需要考虑镜头的影响。在经典光学中,从镜头前方的照度(Illuminance)到传感器上的亮度的转换涉及F数(f-number)和余弦四次方定律(cosine fourth law)。
F数的定义:f-number N = f / D,其中f是焦距,D是光圈直径。F数描述了镜头的”速度”——f/1.4是”快”镜头(大光圈,进光多),f/16是”慢”镜头(小光圈,进光少)。
余弦四次方定律:对于离轴角度为θ的光线,到达传感器的光量按cos⁴(θ)衰减:
E(θ) = E(0) × cos⁴(θ)
这一效应在广角镜头中尤为明显。例如,对于90度视场角(θ=45度),cos⁴(45°) = 0.25,即边缘的光量只有中心的1/4。
然而,Fascione发现了一个重要的简化:成像比率Ki必须在整个图像中保持恒定。这意味着在图像中心(cos⁴(θ) = 1),我们可以忽略余弦四次方定律的影响。这一发现大大简化了渲染器的实现,因为我们只需要在中心计算一次Ki,然后应用于整个图像。
2.5 镜头透射损失的光谱特性
真实的镜头并非完全透明,它们会吸收一部分光线。这种吸收具有以下特性:
波长依赖性:不同波长的光被吸收的程度不同。例如,某些玻璃对紫外光强烈吸收,而对可见光相对透明;另一些玻璃可能吸收特定波长的光,产生色彩倾向。
老镜头的色彩:旧玻璃由于成分和老化,会呈现出轻微的色彩倾向。例如,某些老镜头会偏黄或偏蓝。
Fascione提到了ISO标准镜头的概念,这是一个参考标准,用于描述典型镜头的光谱透射特性。高质量镜头的测量数据显示,所有镜头都存在一定程度的光谱选择性吸收,不存在在整个光谱范围内完全平坦响应的镜头。
根据ISO标准,镜头透射的综合效应可以近似表示为:
Transmittance ≈ 0.65 / N²
其中0.65是一个经验值,实际值会根据具体镜头而变化(例如0.82等)。这个数值应该根据所使用的精度(浮点数或双精度浮点数)动态计算。
这个近似的物理意义是:镜头透射损失主要来自两个因素:
- 菲涅尔反射:在每个玻璃-空气界面,约4%的光被反射(对于典型折射率1.5)。现代镜头有多片镜片,总反射损失可达20-30%。
- 玻璃吸收:光通过玻璃时的吸收,这与波长和玻璃厚度有关。
2.6 整合所有因素的完整推导
将所有这些因素整合在一起,Fascione推导出了成像比率的最终表达式。让我们逐步跟随这个推导过程:
步骤1:基本成像方程
Pixel = Luminance × (t × N² / S) × K
步骤2:考虑镜头透射
Pixel = Luminance × (t × N² / S) × K × T
其中T是镜头透射率(约0.65/N²)。
步骤3:考虑传感器增益 对于18%灰,Pixel = 0.18,因此:
0.18 = Luminance_ref × (t × N² / S) × K × (0.65 / N²)
简化后:
0.18 = Luminance_ref × (t / S) × K × 0.65
步骤4:求解K 假设参考亮度Luminance_ref产生的曝光量H_ref = Luminance_ref × t(对于理想情况),并且Gain = 1.8 / H_ref,我们可以得到:
K = 1 / (0.65 × 1.8) ≈ 1 / 1.17
但这还没有考虑所有因素。Fascione的实际推导考虑了更多细节,最终得到:
Ki ≈ 1 / 67
这是physLight的第二个重要成果。这个值略高于数字相机标准建议的值,也略高于Ansel Adams在区域曝光系统中推荐的值(大约是两倍关系)。
Fascione强调:“这个近似引入的误差远小于你在物理介质或数字传感器生产过程中对其他环节的控制精度。” 换句话说,这个简化在工程实践中是完全可接受的。
2.7 与现有标准的对比
Fascione提到,Ki = 1/67的结果与一些现有标准存在微妙差异:
数字相机标准(ISO 12232):该标准建议的转换系数与physLight的结果略有不同。Fascione认为这可能是由于标准制定时的简化假设。
Ansel Adams的区域曝光系统:Adams建议将18%灰放置在特定区域,这对应于不同的曝光值。physLight的结果大约是Adams建议的两倍(或一半,取决于方向)。
这些差异的存在并不奇怪,因为不同的系统服务于不同的目的:
- 数字相机标准关注消费级设备的实用性
- 区域曝光系统关注黑白摄影的艺术控制
- physLight关注VFX制作中的物理正确性和一致性
Fascione的态度是务实的:“这个近似引入的误差远小于其他环节的控制精度”。在VFX制作中,光源功率的不确定性、材质反射率的变化、镜头特性的差异等因素引入的误差远大于Ki值的细微差别。因此,使用Ki = 1/67作为标准值是完全合理的。
第三部分:USD Lux与渲染器集成——从理论到标准化
3.1 相机模型的标准化之路
Anders Langlands(physLight的另一位主要贡献者)一直在与USD(Universal Scene Description)团队合作,将physLight的概念实现为USD的应用模式(Applied Schema)。这个模式允许在USD框架中描述具有镜头的相机的整体行为。
**USD(Universal Scene Description)**是Pixar开发的一种开放标准,用于在不同软件之间交换3D场景数据。它已经成为VFX和动画行业的事实标准,被Maya、Houdini、Blender、Katana等主流软件支持。
USD Lux是USD中专门用于描述光照的模块。通过将physLight集成到USD Lux中,这些物理正确的光照概念可以成为行业标准,使得不同工作室、不同软件之间可以无缝交换光照设置。
当前提出的模式假设:
- 镜头是简单对象:不考虑眩光、色差、场曲等高级光学效应
- 遵循经典光学定律:使用薄透镜近似和几何光学
- 支持物理正确的曝光计算:集成physLight的成像比率方程
- 光谱属性的可扩展性:允许未来支持更复杂的光谱描述
这个模式目前正在USD GitHub仓库中接受审查,预计将成为VFX和动画行业的标准做法。这对于行业的影响是深远的:一旦标准化,艺术家可以在Maya中设置光源,在Houdini中渲染,在Nuke中合成,而光照的物理属性始终保持一致。
3.2 USD相机模式的详细结构
USD Lux的相机模式包含以下关键属性:
基本曝光参数:
float shutter_time = 1.0/48.0 # 快门时间(秒)
float f_stop = 2.8 # 光圈数(f-number)
float iso = 100.0 # ISO感光度
float exposure_index = 100.0 # 曝光指数(与ISO相同)镜头特性:
float focal_length = 50.0 # 焦距(毫米)
float lens_transmittance = 0.65 # 镜头透射率(0-1)
bool apply_cosine_fourth = false # 是否应用余弦四次方定律成像比率:
float imaging_ratio = 0.014925 # 1/67,physLight标准值
float custom_ki = -1.0 # 自定义Ki值(-1表示使用标准值)光谱属性(未来扩展):
asset spectral_sensitivity = "" # 光谱响应曲线文件路径
asset lens_transmission_spectrum = "" # 镜头透射光谱这种结构化的描述使得相机设置可以被序列化到USD文件中,在不同软件和不同团队之间传递,而不会因为参数丢失或误解而导致渲染结果不一致。
3.3 光源的物理正确表示——从理论到实现
与相机相比,光源在physLight中的实现要简单得多,但这并不意味着它缺乏深度。Fascione将光源分解为三个基本组成部分,这种分解不仅理论清晰,而且实现高效。
1. 能量输出(Power)——流明(Lumen)的核心地位
光源发出的总光功率使用国际单位制中的**流明(Lumen, lm)**作为单位。选择流明的原因是实用性:当你购买灯具时,数据表上标注的就是流明数。例如:
- 标准60W白炽灯:约800流明
- 专业摄影灯:可能高达10,000流明或更多
- LED面板灯:通常在1,000-5,000流明范围
这使得虚拟光源可以直接与现实世界的光源规格关联。艺术家可以在场景中放置一个”800流明的暖白光LED”,而渲染器会正确地计算其光照效果。
2. 角分布(Angular Distribution)——从点光源到聚光灯
真实光源不会在所有方向上均匀发光。physLight使用角分布函数来描述这种方向性变化。常见的分布包括:
各向同性(Isotropic):在所有方向上均匀发光,如理想化的点光源。
I(θ) = 1.0 # 所有角度相同
朗伯体(Lambertian):如漫反射表面,发光强度随cos(θ)衰减。
I(θ) = cos(θ) # θ为与法线的夹角
聚光灯(Spotlight):使用圆锥形分布,有明确的内外锥角。
I(θ) = 1.0 # θ < inner_angle
I(θ) = falloff(θ) # inner_angle < θ < outer_angle
I(θ) = 0.0 # θ > outer_angle
IES文件:行业标准格式,包含测量得到的详细角分布数据。许多专业灯具制造商提供IES文件,艺术家可以直接使用这些文件来获得精确的光分布。
3. 纹理(Texture)——细节决定真实感
当观察反射表面上的光源反射时,光源表面的纹理细节变得重要。例如:
- 柔光箱的网格结构会在反射中呈现
- LED面板的单个LED会在高光中可见
- 彩色滤光片会在光源表面产生颜色变化
physLight支持在光源表面应用纹理,以准确模拟这种效果。这在渲染金属表面、玻璃、水面等反射性材质时尤为重要。
3.4 从经典CG光源到物理光源的转换
传统的计算机图形学光源通常使用任意单位(如”强度=1.0”),这种不明确的单位系统导致了以下问题:
- 不同场景之间的光源无法直接比较
- 光源设置依赖于艺术家的个人经验
- 合成时难以匹配实拍素材的光照
physLight提供了一种明确的转换方法:
Physical Light = Classic Light × (Lumen / Average Texture) × Normalization Factor
其中:
- Lumen是光源的总光通量(来自数据表或测量)
- Average Texture是光源纹理的平均值(由纹理硬件自动计算)
- Normalization Factor取决于角分布的形状
对于各向同性点光源,归一化因子为1/(4π),因为总光通量均匀分布在4π球面度上。
对于聚光灯,归一化因子为1/Ω,其中Ω是光锥的立体角(单位:球面度)。
实现细节:纹理平均值的计算由GPU纹理硬件自动完成。通过获取mipmap的最高级别(最粗糙级别),纹理单元已经预先计算了纹理的平均值,因此这个操作几乎是零成本的。
3.5 图像-based光照(IBL)的物理正确实现
图像-based光照(使用环境贴图照亮场景)遵循相同的原理,但实现方式略有不同。由于我们知道相机的工作原理,对于IBL可以执行逆向计算:从拍摄的照片推断场景中的光照条件,而无需像合成光源那样进行正向计算。
HDR Merge工具的原理:
Fascione提到了一个名为HDR Merge的工具,它用于合并不同曝光长度的多张照片,以捕捉真实场景的完整动态范围。这个工具的工作原理如下:
1. 多曝光拍摄:拍摄一系列照片,曝光值通常相差1-2档(如1/1000s, 1/500s, 1/250s, …, 1s)。
2. 响应曲线恢复:通过比较不同曝光下相同像素的值,可以恢复相机的响应曲线(通常是线性的,但可能有轻微的S形曲线)。
3. 合并算法:对于每个像素,选择信噪比最佳的曝光值,然后线性缩放以匹配绝对亮度。
4. 绝对校准:使用场景中的已知亮度参考(如灰卡)或测光表读数,将相对亮度转换为绝对亮度(cd/m²或nit)。
逆向方程的应用:
一旦获得了物理正确的HDR环境贴图,就可以使用physLight的逆向方程来计算场景中的光照:
Radiance_HDRI = Pixel_HDRI / Ki
其中Ki是拍摄时相机的成像比率。这个计算”撤销”了相机曝光的影响,恢复了场景的真实亮度分布。
IBL在渲染中的应用:
在渲染器中,IBL通常通过重要性采样来实现:
-
预处理:将HDR环境贴图转换为累积分布函数(CDF),以便根据亮度进行重要性采样。
-
直接光照:对于光泽反射,采样环境贴图的高亮区域。
-
间接光照:对于漫反射,可以使用球谐函数(Spherical Harmonics)或预计算的辐射度传递(PRT)来加速计算。
physLight确保IBL的亮度值是物理正确的,这意味着:
- 如果HDR环境贴图显示天空亮度为10,000 nit,渲染器会正确处理这个值
- 合成时,CG元素的光照会与实拍背景自然融合
- 曝光调整(如模拟人眼适应)可以基于物理正确的亮度值进行
3.6 USD Lux的未来发展
Fascione提到,USD Lux的集成工作正在进行中,虽然还有一些”小尾巴需要确定”,但主体部分已经完成。未来的发展方向包括:
光谱渲染支持:当前的模式主要关注RGB渲染,但已经预留了光谱属性的扩展接口。未来可能支持:
- 光源的光谱功率分布(SPD)
- 材质的光谱反射率
- 相机的光谱响应曲线
更复杂的镜头模型:当前的模式假设简单镜头,未来可能支持:
- 镜头眩光(Lens Flare)
- 色差(Chromatic Aberration)
- 场曲(Field Curvature)
- 渐晕(Vignetting)
交互式调整:在USD查看器(如usdview)中实时调整曝光参数,并立即看到结果,这对于灯光艺术家的工作流程至关重要。
与ACES的集成:确保physLight的物理正确性与ACES色彩管理系统的无缝协作,从渲染到最终输出的整个流程保持一致性。
与相机相比,光源在physLight中的实现要简单得多。Fascione将光源分解为三个基本组成部分:
1. 能量输出(Power) 这是光源发出的总光功率,使用国际单位制中的**流明(Lumen)**作为单位。选择流明的原因是实用性:当你购买灯具时,数据表上标注的就是流明数。这使得虚拟光源可以直接与现实世界的光源规格关联。
2. 角分布(Angular Distribution) 真实光源不会在所有方向上均匀发光。聚光灯在中心方向更强,而泛光灯则分布更均匀。physLight使用角分布函数来描述这种方向性变化。
3. 纹理(Texture) 当观察反射表面上的光源反射时,光源表面的纹理细节变得重要。physLight支持在光源表面应用纹理,以准确模拟这种效果。
第四部分:颜色科学与光谱渲染的深度分析
4.1 光谱与RGB的根本差异——两种范式的碰撞
到目前为止,我们的讨论主要集中在亮度(黑白图像)上。但真实世界是有颜色的,这就引出了光谱渲染与RGB渲染的核心问题——这是计算机图形学中最深刻的技术分歧之一。
光谱渲染(Spectral Rendering):在每个波长上独立计算光的传播和相互作用,通常以10纳米或更细的间隔采样可见光谱(380-780纳米)。这种方法在物理上是完全准确的,因为:
- 光源的光谱功率分布(SPD)被精确表示
- 材质的光谱反射率/透射率被精确表示
- 所有光学现象(色散、干涉、荧光)都可以被模拟
- 最终通过对V(λ)函数的积分得到光度学亮度
然而,光谱渲染的计算成本极高。对于每个光线-表面交互,需要计算30-40个波长样本,计算量是RGB渲染的10-30倍。
RGB渲染:使用三个通道(红、绿、蓝)来近似光谱信息。这种方法计算效率高,是行业的标准做法,但它引入了固有的近似误差。RGB渲染的核心假设是:
- 任何颜色都可以用红、绿、蓝三个基色的线性组合表示
- 光的叠加和材质的反射可以用RGB值的简单乘法和加法表示
- 三个通道可以独立处理
这些假设在物理上并不严格成立,导致了所谓的**同色异谱(Metamerism)**问题——两个在RGB值上相同的颜色,可能在光谱组成上完全不同,因此在不同光照下表现不同。
4.2 同色异谱与光照依赖性
同色异谱是RGB渲染的根本局限。考虑以下场景:
场景A:白色光源(D65日光)照射一个红色物体
- 光源SPD:在所有可见波长上相对均匀
- 物体反射率:在红光区域高,在绿光和蓝光区域低
- RGB结果:高R,低G,低B → 红色
场景B:红色光源(如红色LED)照射一个白色物体
- 光源SPD:仅在红光区域有能量
- 物体反射率:在所有波长上均匀(白色)
- RGB结果:高R,低G,低B → 红色
在RGB渲染中,这两个场景产生完全相同的RGB值,因此看起来是相同的红色。但在真实世界中,这两个红色在光谱组成上是完全不同的。如果用另一个光源(如纯绿光)照射这两个”红色”物体:
- 场景A的红色物体会反射绿光(因为白色物体反射所有光)
- 场景B的红色物体会吸收绿光(因为红色物体吸收绿光)
这种光照依赖性是RGB渲染无法捕捉的,也是physLight强调光谱重要性的原因。
4.3 光源光谱的影响——Will Smith实验的深度解析
Fascione展示了一个实验:使用光谱光度计测量真实光源的光谱分布,然后比较光谱渲染与RGB渲染的结果。实验使用了一个年轻版Will Smith的渲染图像和MacBeth色卡。
**MacBeth色卡(ColorChecker)**是色彩管理中的标准工具,包含24个色块:
- 6个灰度色块(从白到黑)
- 6个主要颜色(红、绿、蓝、青、品红、黄)
- 6个自然色(肤色、树叶、天空等)
- 6个杂色
每个色块都有测量的光谱反射率数据,使其成为测试渲染准确性的理想工具。
实验结果:左半部分(光谱渲染)比右半部分(RGB渲染)略微偏绿。更重要的是,某些色块匹配得很好,而另一些则完全不匹配——这意味着简单的色彩校正无法修复这种差异。
这种现象的物理原因是光源SPD与渲染器RGB模型的不匹配。如果渲染器假设光源是理想的D65日光(RGB: 1.0, 1.0, 1.0),但实际光源的SPD在绿光区域更强,那么:
- 光谱渲染会正确计算绿光区域的额外能量
- RGB渲染无法感知SPD的形状,只能看到RGB值
结果是,使用RGB光源近似时,某些颜色(对绿光敏感的颜色)会比实际更亮或更暗,导致整体色偏。
4.4 相机光谱响应的重要性——超越简单的RGB
相机也面临类似的问题。如果直接将之前讨论的方程应用于RGB渲染,可以在亮度上获得可接受的匹配,但在色度(Chroma)上的匹配相对较差。
Fascione提出了一个关键洞察:除了V(λ)(亮度敏感度)之外,我们还需要考虑R(λ)、G(λ)、B(λ)——即人眼或传感器对红、绿、蓝的敏感度。他半开玩笑地创造了三个新术语:Remos(红光敏感度)、Ginos(绿光敏感度)和Blumin(蓝光敏感度)。
这引出了一个重要结论:在RGB渲染中,流经场景的不是”nit”(光度学单位),而是”remos”、“ginos”等特定于设备的单位。不同相机的RGB响应不同,因此相同的物理场景在不同相机下会产生不同的RGB值。
相机的光谱响应曲线描述了传感器对每个波长光的相对敏感度。典型的相机响应具有以下特点:
- 红通道:在600-700纳米区域敏感,峰值约620纳米
- 绿通道:在500-600纳米区域敏感,峰值约550纳米(接近V(λ)的峰值)
- 蓝通道:在400-500纳米区域敏感,峰值约450纳米
这些响应曲线与V(λ)不同,这意味着:
- 相机”看到”的红色可能与人类感知的红色不同
- 两个相机可能对同一颜色产生不同的RGB值
- 简单的RGB到RGB转换无法修复这种差异
4.5 Lightsaber:光谱响应测量系统的设计与实现
为了解决这一问题,Fascione与Kimball Thurston合作设计了名为”Lightsaber”的测量系统。这是一个专门用于测量相机传感器光谱响应的精密仪器。
系统组成:
1. 可调色温光源
- 使用高质量的钨丝灯或LED作为基础光源
- 色温可调范围:约2700K(暖白)到6500K(日光)
- 配备热管理(散热片),确保长时间稳定工作
2. 准直透镜
- 将光源发出的光转换为平行光束
- 确保光线均匀照射到滤光片和传感器上
- 减少杂散光和角度依赖性
3. 窄带滤光片支架
- 可容纳多个带通滤光片
- 每个滤光片仅允许约10纳米宽的光通过
- 滤光片覆盖整个可见光谱(380-780纳米,步进10纳米)
- 精密机械结构,确保滤光片位置可重复
4. 精密相机安装座
- 螺纹接口(如1/4-20或3/8-16),可安装各种相机
- 可调节位置和角度,确保传感器与光轴对齐
- 刚性结构,减少振动和移动
测量流程:
-
暗场校准:拍摄无光照的图像,记录传感器的暗电流和噪声基底。
-
基线测量:使用宽带光源(无滤光片)拍摄参考图像。
-
光谱扫描:依次插入每个窄带滤光片,拍摄图像。
-
数据处理:
- 对每个滤光片,计算传感器R、G、B三个通道的平均响应
- 归一化到参考图像,消除光源光谱的影响
- 绘制光谱响应曲线(响应度 vs 波长)
结果分析:
通过将相机的RGB响应与光谱仪的读数比较,可以得到一个3×3转换矩阵:
[R_camera] [m11 m12 m13] [R_human]
[G_camera] = [m21 m22 m23] × [G_human]
[B_camera] [m31 m32 m33] [B_human]
这个矩阵通常具有良好的对角主导特性(即对角线元素远大于非对角线元素),这意味着:
- 相机的红通道主要响应人类感知的红色
- 相机的绿通道主要响应人类感知的绿色
- 相机的蓝通道主要响应人类感知的蓝色
由于矩阵条件良好,求逆是数值稳定的。逆矩阵允许将相机的RGB值转换为更接近人类感知的值:
[R_human] [m11 m12 m13]^-1 [R_camera]
[G_human] = [m21 m22 m23] × [G_camera]
[B_human] [m31 m32 m33] [B_camera]
制造公差的影响:
实验显示,即使是同一型号的相机(如两台佳能5D Mark IV),由于制造公差,它们的光谱响应也存在可测量的差异。这种差异可能来自:
- 传感器制造过程中的微小变化
- 拜耳滤色片(Bayer filter)的厚度和透过率变化
- 微透镜阵列的差异
- 红外截止滤光片的特性
这一发现强调了逐台测量或至少按型号校准的重要性。对于要求严格的VFX制作,使用特定相机的测量数据可以显著提高色彩匹配的准确性。
4.6 光谱渲染与RGB渲染的色度分析——数学与视觉的交汇
为了量化光谱渲染与RGB渲染的差异,Fascione进行了一系列色度分析。这些分析不仅展示了理论差异,还提供了实际可操作的指导。
实验设计:
假设场景中的光线在到达相机之前会在材料表面反射多次,每次反射都会改变光谱分布。这种多次反射在角落、凹槽或复杂几何体中尤为常见。
通过保持所有材料的总反射能量恒定(即保持亮度不变),Fascione分析了不同光谱曲线在经过多次反射后的色度变化。这种方法隔离了色度变化,独立于亮度变化。
光谱曲线的行为:
不同形状的光谱曲线表现出不同的行为:
窄带光谱(如激光或LED):
- 初始:尖锐的峰值
- 多次反射后:峰值保持不变,但相对强度可能变化
- 色度变化:较小,因为能量集中在特定波长
宽带光谱(如日光或白炽灯):
- 初始:相对平坦或平滑曲线
- 多次反射后:曲线形状可能显著改变,趋向于光源和材质的共同特性
- 色度变化:可能较大,取决于材质的选择性吸收
选择性反射材质(如彩色颜料):
- 初始:特定波长区域高反射
- 多次反射后:高反射区域被”放大”,低反射区域被”压缩”
- 色度变化:可能非常显著,导致饱和度增加
RGB渲染的局限:
RGB渲染无法准确预测这些行为,因为:
- RGB值丢失了光谱的详细形状信息
- 两个不同的光谱可能有相同的RGB值(同色异谱)
- 多次反射后的光谱变化无法用简单的RGB乘法表示
Fascione展示了几个具体案例:
案例1:绿色材料的”回旋镖”轨迹
- 初始:中等饱和度的绿色
- 多次反射后:先向更绿的方向移动,然后突然转向橙色
- RGB结果:无法产生这种复杂的轨迹
案例2:黄色材料的非线性漂移
- 初始:黄色
- 多次反射后:向红色方向漂移,但速度逐渐减慢
- RGB结果:线性漂移,无法匹配实际行为
这些案例表明,RGB渲染的误差不仅是定量的(亮度或饱和度的小偏差),而且是定性的(完全不同的颜色轨迹)。
4.7 色度图与感知均匀性——从CIE到Oklab
Fascione使用了两种色度图来可视化这些差异,每种都有其特定的用途和局限性。
CIE xy色度图(1931):
这是最著名的色度图,具有以下特征:
- 马蹄形边界:代表纯色(单色光),波长从380纳米(紫)到780纳米(红)
- 内部区域:代表混合色,包括所有可感知的颜色
- 白点:D65(日光)或D50等标准光源的位置
- 色域三角形:显示特定RGB色彩空间(如sRGB、Rec.2020)可表示的颜色范围
然而,CIE xy图有一个严重问题:它不是感知均匀的。也就是说,图上两点之间的几何距离不直接对应于人眼感知的色差。例如,在绿色区域,很小的距离可能对应很大的感知差异;而在蓝色区域,很大的距离可能对应很小的感知差异。
Oklab色彩空间:
为了解决感知均匀性问题,Björn Ottosson开发了Oklab色彩空间。Oklab的设计目标是:
- 感知均匀性:色彩空间中的欧几里得距离与感知色差成比例
- 简单性:转换公式相对简单,计算效率高
- 准确性:在预测感知色差方面比CIE Lab更准确
Oklab的三个通道是:
- L:明度(Lightness),对应于亮度感知
- a:绿-红轴
- b:蓝-黄轴
Fascione选择在Oklab空间中绘制色度轨迹,因为这样可以直观地判断感知差异的大小。如果两个点在Oklab空间中相距10个单位,那么人眼感知的色差也是”10个单位”(在JND - Just Noticeable Difference的意义上)。
色域边界的吸引效应:
在色度图分析中,Fascione观察到一个有趣的现象:RGB色域的三个角(红、绿、蓝基色)似乎对多次反射后的色度轨迹有”吸引”作用。这意味着:
- 接近红色基色的颜色会向红色方向漂移
- 接近绿色基色的颜色会向绿色方向漂移
- 接近蓝色基色的颜色会向蓝色方向漂移
这种行为在sRGB和ACEScg色域中都存在,但ACEScg的色域更大,因此”吸引效应”的范围也更广。
实际意义:
对于VFX制作,这些发现意味着:
- 使用宽色域(如ACEScg)可以减少色度漂移,因为颜色距离色域边界更远
- 对于高反射材质(如金属、镜子),多次反射的影响更显著
- 在合成时,简单的色彩校正可能无法修复光谱渲染与RGB渲染之间的差异
4.8 实际影响与行业实践——在理想与现实之间
尽管存在这些理论上的差异,Fascione承认:“RGB渲染器有效,它们能生成图像,整个行业都用RGB渲染器制作图像,合成效果也不错。” 但关键在于:“如果我们要就使用相同的数字达成一致,我们需要谨慎对待如何做这件事。”
当前行业实践:
大多数VFX工作室使用RGB渲染器(如RenderMan、Arnold、V-Ray),并采取以下策略来管理光谱误差:
1. 光源校准:
- 使用测量的光源SPD(如果可用)
- 在渲染器中创建自定义RGB光源,尽量匹配实际光源的颜色
- 对于关键光源,使用光谱渲染作为参考
2. 材质校准:
- 使用测量的材质反射率(光谱或RGB)
- 对于关键材质(如皮肤、金属),使用高分辨率纹理和复杂的BRDF模型
- 定期与实物样本进行比较
3. 相机特性化:
- 使用类似Lightsaber的系统测量相机的光谱响应
- 创建自定义的RGB到XYZ转换矩阵
- 在合成阶段应用色彩校正,匹配实拍素材
4. 质量控制和迭代:
- 渲染测试帧,与实拍参考进行比较
- 调整光源功率、颜色或位置,直到匹配
- 使用直方图和色度图进行客观比较
physLight的价值:
physLight的价值在于提供了一套标准化的方法,使得不同工作室、不同软件之间可以就”光有多亮”、“颜色是什么”达成共识。这对于需要多团队协作的大型制作(如漫威电影宇宙的作品)尤为重要。
通过使用physLight,工作室可以:
- 减少迭代次数,因为初始设置更接近物理正确
- 提高自动化程度,减少手动调整
- 改善资产重用,因为光照设置是标准化的
- 降低培训成本,因为概念是通用的
虽然RGB渲染在当前占据主导地位,但光谱渲染正在逐渐普及:
硬件进步:GPU计算能力的提升使得实时光谱渲染成为可能。例如,NVIDIA的RTX系列GPU支持硬件加速的光线追踪,可以处理更多的光线样本。
算法优化:新的算法(如光谱路径引导、光谱多重重要性采样)减少了达到相同误差水平所需的光谱样本数量。
混合方法:一些渲染器采用混合方法,在关键路径(如直接光照、镜面反射)使用光谱计算,在次要路径(如漫反射间接光照)使用RGB近似。
标准化需求:随着光谱渲染的普及,对标准化的需求也在增加。physLight的光谱扩展将为行业提供统一的框架。
Fascione的愿景是:“如果我们想要就使用相同的数字达成一致,我们需要谨慎对待如何做这件事。” 无论是RGB还是光谱,物理正确性和标准化都是关键。
Fascione展示了一个实验:使用光谱光度计测量真实光源的光谱分布,然后比较光谱渲染与RGB渲染的结果。实验使用了一个年轻版Will Smith的渲染图像和MacBeth色卡。
结果显示,当光源的光谱分布不能被渲染器的RGB模型很好近似时,会出现明显的色差。左半部分(光谱渲染)比右半部分(RGB渲染)略微偏绿。更重要的是,某些色块匹配得很好,而另一些则完全不匹配——这意味着简单的色彩校正无法修复这种差异。
相机也面临类似的问题。如果直接将之前讨论的方程应用于RGB渲染,可以在亮度上获得可接受的匹配,但在色度(Chroma)上的匹配相对较差。
Fascione提出了一个关键洞察:除了V(λ)(亮度敏感度)之外,我们还需要考虑R(λ)、G(λ)、B(λ)——即人眼或传感器对红、绿、蓝的敏感度。他半开玩笑地创造了三个新术语:Remos(红光敏感度)、Ginos(绿光敏感度)和Blumin(蓝光敏感度)。
这引出了一个重要结论:在RGB渲染中,流经场景的不是”nit”(光度学单位),而是”remos”、“ginos”等特定于设备的单位。不同相机的RGB响应不同,因此相同的物理场景在不同相机下会产生不同的RGB值。
为了解决这一问题,Fascione与Kimball Thurston合作设计了名为”Lightsaber”的测量系统。该系统包括:
- 一个可调色温的光源
- 准直透镜
- 带通滤光片支架(每次只允许约10纳米宽的光通过)
- 精密的相机安装座
通过拍摄一系列窄带光源的图像,可以直接测量相机传感器的裸响应(无镜头干预)。将这些测量结果与光谱仪读数比较,可以得到一个转换矩阵。这个矩阵通常具有良好的对角主导特性,易于求逆,从而可以将相机的RGB响应转换为接近人眼感知的值。
实验显示,即使是同一型号的相机(如两台佳能5D Mark IV),由于制造公差,它们的光谱响应也存在可测量的差异。这一发现强调了逐台测量或至少按型号校准的重要性。
为了量化光谱渲染与RGB渲染的差异,Fascione进行了一系列色度分析。他假设场景中的光线在到达相机之前会在材料表面反射多次,每次反射都会改变光谱分布。
通过保持所有材料的总反射能量恒定(即保持亮度不变),他分析了不同光谱曲线在经过多次反射后的色度变化。结果显示:
-
曲线形状决定对比度:光谱曲线的形状会在多次反射后产生对比度变化,趋向于在峰值处集中,在低谷处平坦化。
-
不同光谱行为各异:不同颜色的光谱曲线表现出完全不同的漂移行为。
-
RGB无法准确预测:某些光谱的色度轨迹呈现”回旋镖”形状(从绿色开始变为橙色),这种复杂的行为是RGB渲染无法预测的。
Fascione使用了两种色度图来可视化这些差异:
CIE xy色度图:马蹄形边界代表纯色(单色光),内部区域代表混合色。在这个图中,两点之间的距离并不直接对应于人眼感知的色差。
Oklab色彩空间:这是一个专门为预测感知色差而优化的色彩空间。在Oklab中,两点之间的欧几里得距离与感知色差成比例(对于标准观察者而言)。
在Oklab空间中绘制多次反射后的色度轨迹,可以清楚地看到不同光谱曲线的复杂行为。Fascione强调,由于这些分析是在恒定亮度假设下进行的,实际渲染中还需要考虑亮度的变化,这使得情况更加复杂。
尽管存在这些理论上的差异,Fascione承认:“RGB渲染器有效,它们能生成图像,整个行业都用RGB渲染器制作图像,合成效果也不错。” 但关键在于:**“如果我们要就使用相同的数字达成一致,我们需要谨慎对待如何做这件事。”
physLight的价值在于提供了一套标准化的方法,使得不同工作室、不同软件之间可以就”光有多亮”、“颜色是什么”达成共识。这对于需要多团队协作的大型制作(如漫威电影宇宙的作品)尤为重要。
第五部分:实际应用与行业影响——从实验室到银幕
5.1 Weta Digital与physLight的50部电影
physLight已经在Weta Digital(现在是Wētā FX)的内部流程中使用了近十年,参与了约50部电影的制作。这些电影包括:
- 《复仇者联盟》系列
- 《阿凡达》系列
- 《猩球崛起》系列
- 《指环王》和《霍比特人》系列
- 漫威电影宇宙的众多作品
Fascione在演讲结束时展示了一个片段混剪,其中包括了《复仇者联盟》的片段。他开玩笑说其中有几帧不是用physLight渲染的——“如果你能找到所有非physLight镜头,我会给你一张金票”(当然,他承认这是在开玩笑)。
这个混剪展示了physLight在实际生产环境中的成熟度。从宏大的战斗场面(如纽约之战)到细腻的角色特写(如灭霸的面部表情),physLight提供的物理正确光照为这些图像的真实感奠定了基础。
生产环境中的应用:
在Weta Digital的生产流程中,physLight被用于:
- 角色光照:确保数字角色与实拍演员的光照一致
- 环境扩展:将CG建筑、景观与实拍背景融合
- 特效元素:爆炸、能量束、魔法效果等的发光强度
- 虚拟摄影:在虚拟环境中预览实拍效果
在演讲后的问答环节,Fascione进一步澄清了几个重要观点:
关于人类感知阈值:
当被问及人眼在何种程度上能感知这些光谱差异时,Fascione指出Oklab空间的设计目标就是预测感知差异。如果相信Oklab的公式(它们尽可能准确地用简单公式描述感知差异),那么图中的欧几里得距离就与感知差异成比例。
当然,每个人的眼睛都不同:
- 年龄:随着年龄增长,晶状体变黄,对蓝光的敏感度下降
- 性别:研究表明,女性可能比男性有略微不同的色彩感知
- 个体差异:视锥细胞的分布和数量因人而异
- 适应状态:暗适应和亮适应状态下的色彩感知不同
这些差异使得精确处理人类感知变得极其困难。Fascione的解决方案是:“如果你测量一个人,一件事,一台相机……” 换句话说,对于关键制作,使用特定设备和特定观察者进行校准。
关于标准化的真正价值:
Fascione强调,physLight的主要目标不是让最终观众看到差异,而是消除不同供应商、不同相机、不同软件之间的差异,使得整个制作流程可以在一个统一的系统内 reasoning。这正是解决”用猴子替换Andy”问题的关键——如果你的材质采集准确,并且渲染器模拟了实拍时使用的相机,那么数字角色的颜色和亮度就会与实拍素材自然匹配。
这种标准化的价值体现在:
- 减少迭代:物理正确的初始设置减少了手动调整的需求
- 提高自动化:标准化的单位允许自动化工具正确工作
- 改善协作:不同工作室可以共享资产,而不用担心光照设置不兼容
- 降低成本:减少试错,提高生产效率
5.3 行业采用的障碍与解决方案
尽管physLight具有明显优势,但在整个行业范围内的采用仍面临一些障碍:
1. 学习曲线:
- 障碍:艺术家需要学习新的概念(流明、勒克斯、曝光值)
- 解决方案:提供培训材料和工具,将物理单位转换为更直观的概念(如”这个光源相当于60W灯泡”)
2. 现有资产:
- 障碍:大量的现有场景使用任意单位
- 解决方案:开发自动转换工具,根据光源类型和强度估计物理单位
3. 性能考虑:
- 障碍:物理正确的计算可能更耗时
- 解决方案:优化实现,使用查找表和近似,在质量和速度之间取得平衡
4. 软件支持:
- 障碍:并非所有渲染器都原生支持physLight
- 解决方案:通过USD Lux标准化,鼓励软件开发商集成
5. 验证和测试:
- 障碍:难以验证物理正确性
- 解决方案:开发测试套件,与真实测量进行比较
5.4 其他工作室的经验
虽然Weta Digital是physLight的主要开发者和早期采用者,但其他工作室也开始探索类似的概念:
工业光魔(ILM):开发了内部的光照标准化系统,与physLight有许多相似之处。ILM的StageCraft虚拟制作平台使用LED墙和实时渲染,物理正确的光照对于虚实融合至关重要。
Framestore:在《地心引力》等太空题材电影中,Framestore开发了复杂的物理光照系统,模拟太阳光在太空中的行为。
DNEG:在《银翼杀手2049》等电影中,DNEG探索了光谱渲染用于特定的视觉效果,如霓虹灯和全息投影。
这些工作室的经验表明,物理正确的光照正在成为VFX行业的共识,即使具体的实现细节可能不同。
5.5 产品可视化与虚拟原型
除了电影VFX,physLight的概念也适用于产品可视化和虚拟原型:
宜家(IKEA):如前所述,宜家使用CGI制作大部分产品目录图片。物理正确的光照确保:
- 产品颜色与实物一致
- 材质表现(金属、玻璃、织物)真实可信
- 不同批次的产品图片保持一致
汽车行业:汽车制造商使用虚拟原型来评估新车设计。物理正确的光照允许:
- 在不同光照条件下(日光、阴天、夜晚)评估外观
- 测试新漆色的效果
- 减少物理原型的需求,节省成本和时间
建筑可视化:建筑师使用渲染来展示设计。物理正确的光照帮助:
- 准确预测自然采光
- 评估人工照明设计
- 满足能源效率标准
这些应用强调了physLight的价值不仅在于视觉效果,还在于工程准确性。
Fascione进一步澄清了几个重要观点:
关于人类感知阈值:当被问及人眼在何种程度上能感知这些光谱差异时,Fascione指出Oklab空间的设计目标就是预测感知差异。如果相信Oklab的公式(它们尽可能准确地用简单公式描述感知差异),那么图中的欧几里得距离就与感知差异成比例。当然,每个人的眼睛都不同,这使得精确处理人类感知变得极其困难。
关于标准化的真正价值:Fascione强调,physLight的主要目标不是让最终观众看到差异,而是消除不同供应商、不同相机、不同软件之间的差异,使得整个制作流程可以在一个统一的系统内 reasoning。这正是解决”用猴子替换Andy”问题的关键——如果你的材质采集准确,并且渲染器模拟了实拍时使用的相机,那么数字角色的颜色和亮度就会与实拍素材自然匹配。
第六部分:技术细节与实现
6.1 数学推导
Fascione在演讲中多次提到他花了十年时间来完善这些方程,强调了其中的”信仰之跃”和”伤疤”。这反映了将物理学严谨引入计算机图形学的复杂性。
以成像比率Ki的推导为例,看似简单的1/67结果实际上涉及:
- 光学系统的精确建模:从几何光学到物理光学,从薄透镜到厚透镜
- ISO标准的仔细解读:理解标准背后的假设和近似
- 实际镜头测量数据的拟合:将理论模型与真实世界数据对齐
- 数值稳定性和计算效率的权衡:确保公式在计算机中实现时的鲁棒性
Fascione鼓励质疑这个结果,因为”这非常困难,有很多黑暗的角落可以让你陷入困境”。这种谨慎态度是科学研究的标志——即使经过多年的工作,仍然保持开放的心态,接受批评和改进。
推导过程中的关键决策:
在推导Ki = 1/67的过程中,Fascione面临多个设计决策:
1. 余弦四次方定律的处理:
- 选项A:在整幅图像中应用cos⁴(θ)
- 选项B:仅在中心应用(θ=0,cos⁴(0)=1)
- 决策:选择B,因为Ki必须在整幅图像中恒定
2. 镜头透射的近似:
- 选项A:使用测量的透射光谱
- 选项B:使用常数近似(0.65/N²)
- 决策:选择B,因为差异在工程容忍范围内
3. 参考点的选择:
- 选项A:使用18%灰(中间灰)
- 选项B:使用100%白
- 决策:选择A,因为这是行业标准,且有实际参考物(灰卡)
每个决策都涉及权衡:精度vs简洁性,通用性vs特定性,理论正确性vs工程实用性。
6.2 浮点精度与数值稳定性
在实际实现中,浮点精度是一个重要考量。Fascione建议根据所使用的精度(浮点数vs双精度浮点数)动态计算透射系数,而不是硬编码特定值。这确保了在不同硬件和软件环境下都能保持一致的数值行为。
数值稳定性问题:
在光照计算中,以下情况可能导致数值问题:
1. 极亮或极暗的光源:
- 太阳亮度:约1.6×10⁹ nit
- 星光亮度:约10⁻⁶ nit
- 动态范围:超过10¹⁵
- 解决方案:使用对数空间或浮点数(16位半浮点或32位全浮点)
2. 非常小的数字:
- 远距离光源的贡献
- 多次反射后的光衰减
- 解决方案:使用阈值裁剪,避免除以零
3. 累积误差:
- 多次累加小数值
- 浮点精度损失
- 解决方案:使用Kahan求和算法或其他高精度累加技术
实现建议:
// 示例:物理正确的曝光计算
float calculatePixelValue(float radiance,
float shutterTime,
float fNumber,
float iso,
float imagingRatio = 1.0f/67.0f) {
// 计算曝光量
float exposure = radiance * shutterTime * (fNumber * fNumber) / iso;
// 应用成像比率
float pixelValue = exposure * imagingRatio;
// 数值稳定性检查
if (pixelValue > 1e10f) {
// 处理极亮情况
pixelValue = 1e10f;
} else if (pixelValue < 1e-10f && pixelValue > 0.0f) {
// 处理极暗情况
pixelValue = 0.0f;
}
return pixelValue;
}6.3 与现有流程的集成
physLight的设计考虑了与现有VFX流程的兼容性:
1. USD集成:
- 作为USD Lux的一部分,physLight可以无缝集成到支持USD的流程中
- 场景描述、光照设置、相机参数都可以序列化为USD文件
- 不同软件(Maya、Houdini、Blender、Katana)可以读取和写入相同的USD文件
2. 渲染器无关性:
- 虽然演讲提到了多个渲染器(RenderMan、Arnold、V-Ray等),但physLight的原理是通用的
- 每个渲染器可以实现自己的physLight支持,只要遵循相同的数学模型
- 艺术家可以在不同渲染器之间切换,而光照设置保持一致
3. 后向兼容性:
- 通过标准化转换,可以将传统的任意单位光源转换为物理正确的单位
- 提供迁移工具和文档,帮助工作室过渡到physLight
- 允许混合使用:关键光源使用物理单位,背景光源使用任意单位
集成示例:
假设一个工作室当前的流程是:
- 在Maya中建模和绑定
- 在Maya或Houdini中设置光照
- 使用Arnold渲染
- 在Nuke中合成
集成physLight后:
- 在Maya中建模和绑定(不变)
- 在Maya中设置光照,但使用流明和勒克斯单位
- 导出为USD文件,包含物理正确的光照和相机设置
- Arnold读取USD文件,使用physLight计算曝光
- 渲染结果与实拍素材物理匹配
- 在Nuke中合成,色彩校正基于物理正确的亮度值
6.4 性能优化策略
物理正确的计算可能带来性能开销,但可以通过以下策略优化:
1. 预计算和缓存:
- 光源的角分布可以预计算为查找表
- 相机的光谱响应可以预计算为3×3矩阵
- 复杂的光学效应(如镜头眩光)可以预渲染为纹理
2. 级别 of Detail (LOD):
- 远处的光源使用简化的模型
- 近处的光源使用完整的物理模型
- 根据距离和重要性动态切换
3. GPU加速:
- 使用CUDA或OpenCL加速光谱计算
- 利用GPU的纹理硬件进行快速查找
- 批量处理多个光源和材质
4. 近似和简化:
- 对于间接光照,使用RGB近似而非完整光谱
- 对于次要光源,使用简化的曝光计算
- 在质量和速度之间取得平衡
性能基准:
根据Weta Digital的经验,集成physLight后的性能开销是可控的:
- 光源计算:增加约5-10%的时间
- 相机曝光计算:增加约1-2%的时间
- 总体渲染时间:增加约3-5%
考虑到质量提升和迭代减少,这个开销是合理的。
6.5 未来发展方向
Fascione提到了几个正在进行的和未来可能的发展方向:
1. HDR Merge工具:
- 将多曝光照片合并为物理正确的IBL
- 自动校准和验证
- 集成到Rotoscopys和USD Lux
2. 光谱相机响应模式:
- USD Lux中用于描述相机光谱响应的新模式
- 支持测量的响应曲线和参数化模型
- 允许不同相机型号之间的精确匹配
3. 更精确的镜头模型:
- 当前的模式假设简单镜头
- 未来可能支持复杂光学效应:
- 镜头眩光(Lens Flare):光线在镜头元件之间的反射
- 色差(Chromatic Aberration):不同波长的光聚焦在不同位置
- 场曲(Field Curvature):焦平面不是平的
- 渐晕(Vignetting):边缘光量减少
- 散景(Bokeh):焦外成像的形状和质感
4. 机器学习集成:
- 使用神经网络加速光谱渲染
- 自动校准和参数估计
- 智能降噪和采样
5. 实时光谱渲染:
- 随着GPU性能的提升,实时光谱渲染成为可能
- 游戏引擎和虚拟制作可以受益于物理正确的光照
- 混合方法:关键路径使用光谱,次要路径使用RGB
第七部分:扩展知识——相关物理与数学基础
7.1 辐射度量学基础——光的物理度量
为了更深入地理解physLight,我们需要回顾一些辐射度量学的基本概念。辐射度量学是研究电磁辐射能量测量的科学,它是光度学的基础。
辐射能量(Radiant Energy, Q):
- 定义:电磁波携带的能量
- 单位:焦耳(J)
- 类比:就像一箱苹果的总重量
辐射通量(Radiant Flux, Φ):
- 定义:单位时间内通过某个表面的辐射能量,也称为辐射功率
- 单位:瓦特(W)
- 公式:Φ = dQ/dt
- 类比:每秒通过某点的苹果数量
辐射照度(Irradiance, E):
- 定义:单位面积上接收到的辐射通量
- 单位:W/m²
- 公式:E = dΦ/dA
- 在physLight中,这对应于传感器表面的光照强度
- 类比:每平方米地面上的苹果数量
辐射亮度(Radiance, L):
- 定义:单位投影面积、单位立体角内的辐射通量
- 单位:W/(m²·sr)
- 公式:L = d²Φ/(dA·cosθ·dΩ)
- 这是渲染中最核心的量,因为渲染器计算的就是沿光线方向的辐射亮度
- 关键特性:在无损介质中,辐射亮度沿光线方向守恒
- 类比:从特定方向看,每平方米表面发出的光强度
辐射强度(Radiant Intensity, I):
- 定义:单位立体角内的辐射通量
- 单位:W/sr
- 公式:I = dΦ/dΩ
- 常用于描述点光源的定向发射
7.2 光度学单位——人眼感知的度量
光度学是辐射度量学的人眼感知版本,使用相同的概念但 weighted by V(λ):
光通量(Luminous Flux):
- 单位:流明(lm)
- 定义:1流明等于1瓦特的光功率在555纳米波长处的光度学等效值
- 公式:Φ_v = 683 lm/W × ∫ Φ_e(λ) × V(λ) dλ
- 其中683 lm/W是最大光谱光视效能(在555nm处)
照度(Illuminance):
- 单位:勒克斯(lux),1 lux = 1 lm/m²
- 常见参考值:
- 直射阳光:约100,000 lux
- 阴天:约1,000 lux
- 室内照明:约100-500 lux
- 满月:约0.2 lux
亮度(Luminance):
- 单位:坎德拉每平方米(cd/m²)或nit
- 1 nit = 1 cd/m²
- 常见参考值:
- 太阳表面:约1.6×10⁹ nit
- 普通显示器:约100-300 nit
- HDR显示器:可达1,000-2,000 nit
- 星光:约10⁻⁶ nit
发光强度(Luminous Intensity):
- 单位:坎德拉(cd),1 cd = 1 lm/sr
- 坎德拉是SI基本单位之一,光度学其他单位都由此导出
7.3 相机曝光方程——摄影的数学基础
经典相机曝光方程(也称为相机曝光方程或曝光值方程)可以表示为:
EV = log₂(N² / t)
其中EV是曝光值(Exposure Value),N是f-number,t是快门时间(秒)。
这个方程与physLight的成像比率方程密切相关。曝光值是一个相对量,表示曝光的组合设置,而physLight提供的Ki则完成了从物理亮度到像素值的最终映射。
曝光值(EV)的物理意义:
- EV 0:1秒快门,f/1.0光圈
- 每增加1 EV,曝光量减半
- 每减少1 EV,曝光量加倍
- 在ISO 100下,EV 15对应于晴天、f/16、1/125秒的曝光
曝光三角形: 摄影中常用的概念,包括三个相互关联的参数:
- 光圈(Aperture):控制进光量和景深
- 快门速度(Shutter Speed):控制进光时间和运动模糊
- ISO感光度:控制传感器对光的敏感度
physLight的成像比率方程可以看作是曝光三角形的数学形式化。
7.4 CIE色彩空间——颜色的科学描述
CIE(国际照明委员会)定义了一系列色彩空间,用于标准化颜色表示:
CIE XYZ(1931):
- 基于人眼三种锥细胞(L、M、S)的响应
- 线性色彩空间,适合数学运算
- Y通道对应于亮度(Luminance),这与physLight的V(λ)积分直接相关
- X和Z通道包含色度信息
- 覆盖所有人眼可感知的颜色
XYZ三刺激值的计算:
X = ∫ SPD(λ) × x̄(λ) dλ
Y = ∫ SPD(λ) × ȳ(λ) dλ (Y等于亮度)
Z = ∫ SPD(λ) × z̄(λ) dλ
其中x̄(λ)、ȳ(λ)、z̄(λ)是CIE 1931标准观察者配色函数。
CIE xy色度图:
- 从XYZ导出的二维色度图,移除了亮度信息
- x = X / (X + Y + Z)
- y = Y / (X + Y + Z)
- 马蹄形边界代表纯色(单色光)
- 内部区域代表混合色
- 白点(D65、D50等)表示标准光源
CIE Lab(1976):
- 设计目标是感知均匀性
- L*:明度(0=黑,100=白)
- a*:绿-红轴
- b*:蓝-黄轴
- 广泛用于色彩管理和质量控制
Oklab:
- 由Björn Ottosson于2020年开发
- 比CIE Lab更感知均匀
- 使用更简单的转换公式
- 特别适合于用户界面和色彩选择器
- Fascione使用Oklab来量化光谱渲染与RGB渲染的差异
7.5 光谱功率分布(SPD)——颜色的物理本质
光源的颜色由其**光谱功率分布(Spectral Power Distribution, SPD)**决定,即能量随波长的分布函数。不同光源具有截然不同的SPD:
日光(D65):
- 连续光谱,在蓝光区域较强
- 色温约6500K
- 被视为”标准白光”
- SPD相对平滑,有细微的吸收线(夫琅禾费线)
白炽灯:
- 连续光谱,在红光区域较强
- 色温约2700K-3200K
- 类似黑体辐射曲线
- 能量随温度升高向短波长移动(维恩位移定律)
荧光灯:
- 线状光谱(离散峰),由汞蒸气发射和荧光粉转换产生
- 多个尖锐峰值(汞的特征谱线:405nm, 436nm, 546nm, 578nm)
- 荧光粉涂层将紫外光转换为可见光,形成宽带连续背景
- 显色指数(CRI)通常低于白炽灯
LED(发光二极管):
- 取决于具体设计,可能是窄带或宽带
- 蓝光LED + 黄色荧光粉:产生白光,但红光区域较弱
- RGB LED:混合红、绿、蓝三个LED,可产生各种颜色
- 最新技术:使用紫外或蓝光LED激发多色荧光粉,产生更连续的光谱
气体放电灯(如钠灯、氙灯):
- 高度离散的线状光谱
- 低压钠灯:几乎纯单色(589nm),显色性极差但效率极高
- 氙灯:相对连续的光谱,类似日光,用于电影放映和汽车大灯
SPD的表示方法:
在实际应用中,SPD通常以离散样本表示:
- 采样间隔:通常1nm、5nm或10nm
- 波长范围:通常380-780nm(可见光)或360-830nm(扩展范围)
- 数据格式:文本文件、图像(如EXR格式)或专用格式
physLight强调测量真实光源SPD的重要性,因为这直接影响渲染的准确性。
7.6 色适应与色彩恒常性——人眼的神奇能力
人眼具有 remarkable 的能力,可以在不同光照条件下保持对物体颜色的稳定感知,这称为色彩恒常性(Color Constancy)。
色适应(Chromatic Adaptation):
- 当人眼从一种光照环境转移到另一种时,视觉系统会自动调整
- 这个过程涉及感光色素的漂白和再生
- 时间尺度:几秒到几分钟
von Kries色适应模型:
- 最简单的色适应模型
- 假设L、M、S三种锥细胞独立调整其增益
- 数学表示:L’ = L × k_L, M’ = M × k_M, S’ = S × k_S
- 其中k_L, k_M, k_S是适应系数
Bradford色适应变换:
- 更复杂的模型,考虑了锥细胞之间的相互作用
- 广泛用于色彩管理系统
- 从XYZ到LMS锥细胞空间的转换,然后应用增益,再转换回XYZ
对physLight的启示:
- 即使物理亮度匹配,人眼的色适应可能影响感知
- 在合成时,需要考虑观众观看环境的光照条件
- 色彩管理(ACES、OCIO)处理这些问题
黑体辐射:
- 理想化的物理模型:吸收所有入射辐射的物体
- 加热时发出电磁辐射
- 光谱仅取决于温度,与材料无关
- 由普朗克定律描述
普朗克定律:
B(λ, T) = (2hc²/λ⁵) × 1/(exp(hc/λkT) - 1)
其中:
- B(λ, T)是光谱辐射亮度
- h是普朗克常数
- c是光速
- k是玻尔兹曼常数
- T是绝对温度(开尔文)
- λ是波长
色温(Color Temperature):
- 以开尔文(K)为单位
- 表示光源颜色与黑体辐射的接近程度
- 低色温(2700K):暖黄,类似白炽灯
- 高色温(6500K):冷白,类似日光
- 极高色温(10000K+):偏蓝
相关色温(CCT, Correlated Color Temperature):
- 对于非黑体光源(如荧光灯),使用CCT
- 在CIE色度图上,找到最接近的黑体轨迹上的点
- 该点的温度即为CCT
对physLight的意义:
- 光源的SPD可以用色温近似描述
- 艺术家可以使用直观的色温概念(“这个光源是3200K的暖光”)
- 渲染器可以基于色温生成近似的SPD
光度学是辐射度量学的人眼感知版本,使用相同的概念但 weighted by V(λ):
光通量(Luminous Flux):单位是流明(lm)。1流明等于1瓦特的光功率在555纳米波长处的光度学等效值(考虑到V(λ) = 1 at 555nm)。
照度(Illuminance):单位是勒克斯(lux),1 lux = 1 lm/m²。这对应于辐射照度的光度学版本。
亮度(Luminance):单位是坎德拉每平方米(cd/m²)或nit。这对应于辐射亮度的光度学版本,是physLight中像素值最终对应的物理量。
经典相机曝光方程(也称为相机曝光方程或曝光值方程)可以表示为:
EV = log₂(N² / t)
其中EV是曝光值(Exposure Value),N是f-number,t是快门时间(秒)。
这个方程与physLight的成像比率方程密切相关。曝光值是一个相对量,表示曝光的组合设置,而physLight提供的Ki则完成了从物理亮度到像素值的最终映射。
CIE(国际照明委员会)定义了一系列色彩空间,用于标准化颜色表示:
CIE XYZ(1931):基于人眼三种锥细胞响应的线性色彩空间。Y通道对应于亮度(Luminance),这与physLight的V(λ)积分直接相关。
CIE xy色度图:从XYZ导出的二维色度图,移除了亮度信息,只表示颜色的色度(色相和饱和度)。
Oklab:由Björn Ottosson开发的感知均匀色彩空间,旨在使色彩空间中的欧几里得距离对应于感知色差。Fascione使用Oklab来量化光谱渲染与RGB渲染的差异。
光源的颜色由其**光谱功率分布(Spectral Power Distribution, SPD)**决定,即能量随波长的分布函数。不同光源具有截然不同的SPD:
- 日光:连续光谱,在蓝光区域较强
- 白炽灯:连续光谱,在红光区域较强
- 荧光灯:线状光谱(离散峰),由汞蒸气发射和荧光粉转换产生
- LED:取决于具体设计,可能是窄带或宽带
physLight强调测量真实光源SPD的重要性,因为这直接影响渲染的准确性。
最后
从Weta Digital的50部电影到未来的虚拟制作,physLight正在改变我们创造数字世界的方式。正如Fascione在演讲中所展示的,物理正确性不是限制,而是解放——它让我们能够更自信、更高效地创造,因为我们知道,我们的数字光照与真实世界的光一样,遵循着相同的物理定律。
在这个光与影的艺术中,physLight为我们提供了一把钥匙,打开了通往物理正确性的大门。门后的世界,是更真实、更一致、更美好的数字图像。
让我们拥抱这个光明的未来。
关于作者:本文基于Luca Fascione在Academy Software Foundation的演讲”physLight: Physical Units in Digital Lighting”整理和扩展而成。Luca Fascione是NVIDIA的高级研究员,此前在Weta Digital(Wētā FX)工作,参与了多部好莱坞大片的视觉特效制作。
参考资源:
- 演讲视频:YouTube链接
- USD Lux文档:OpenUSD GitHub
- physLight详细技术文档(包含完整参考文献)
- CIE标准文档:cie.co.at
- ISO 12232(数字相机曝光标准)
- ACES色彩管理系统:acescentral.com