面光源
Area Lights
真实光源从来不是点。面光源要求对光源所张立体角 积分 BRDF,实时渲染倾向于用闭式解或近似而不是多条光线取平均。主要做法有:Lambert 表面的矢量辐照度与包裹光照、光泽表面的粗糙度修正和"最具代表性的点",以及最准确的线性变换余弦 (LTC)。
点光源近似的误差
- 点/方向光的近似:。零立体角意味着无穷大辐亮度,物理上不可实现。
- 误差取决于两点:光源从着色点看去的立体角大小,以及表面的光泽程度。决定因素是光源发射角相对 BRDF 高光立体角的大小;小光源、粗糙表面误差小。
- 面光源高光可以用点光源加大粗糙度来模仿,这解释了为什么只用点光源的系统也能"看起来对"——美术在补偿误差。但这样把材质和特定灯光耦合在一起,换了灯光场景内容就不对了。
- 计算了面光源也应相应使用软阴影,否则硬阴影会抵消部分效果;漏光会产生明显瑕疵。
Lambert 表面:矢量辐照度
对 Lambert 表面 ,只需算辐照度。Gershun 提出、Arvo 推广的矢量辐照度:
平面净辐照度 。若光源没有任何部分处于表面"地平线以下",则 ,任意形状面光源可无误差地转换为方向光:,( 为可分离出的颜色)。
- 球形光源(半径 、中心 、均匀辐亮度 ):,,即标准平方反比衰减。但不是所有形状都如此,圆盘光的衰减正比于 。
- 对 Lambert 表面,面光源与点光源的全部差异都来自遮挡(地平线裁剪)。Snyder 给出考虑遮挡的球光源解析式,只依赖 与 ,可预计算为二维纹理。
包裹光照 (Wrap Lighting)
在钳制前修改 ,不太物理但有效:
- Forsyth:, 从 0(点光)到 1(覆盖整个半球)。
- Valve:。
光泽表面
光泽表面的主要视觉效果是高光:形状近似光源,边缘按粗糙度模糊。早期经验做法如给高光加阈值形成平顶高光。主流思路是为每个着色点找一个等效点光源设置,只改着色输入,不改着色数学,代码改动局部、在一定条件下退化为原始着色。
| 方法 | 做法 | 缺点 |
|---|---|---|
| 粗糙度修正(Mittring,UE "Elemental") | 光源锥与高光瓣锥立体角相加,换一个更粗糙的瓣。Karis 对 GGX 球光: 钳制到 [0,1] | 近镜面材质失效;微表面瓣有长拖尾,重映射效果差;高光过糊 |
| 最具代表性的点 (MRP) | 把光方向指向光源上贡献最大的点。Picott 用与反射线夹角最小的点;Karis 改用离反射线最近的点,并给出保能量的强度缩放 | 粗糙表面上高光比参考解"更锐" |
| Iwanicki & Pesce 拟合 | 对数值积分结果拟合 BRDF 瓣、软阈值、代表点参数与能量缩放,给出闭式近似 | 依赖拟合 |
| de Carpentier | 找使 而非 最大的代表点,改善掠射角高光形状 | — |
Karis 球光代表点:反射线上离球心 最近点 ,球面上离它最近的点 。
代表点方法的理论依据是积分中值定理 ,也类似蒙特卡洛的重要性采样。反射向量落在光源锥外时等同点光源;落在锥内时代表点连续移动,相当于把高光峰"拉宽"。
其他光源形状
- 球光只适合较小的真实灯具,但它是打破"灯光与粗糙度错误耦合"的最简单手段。
- 管状光 / 胶囊光(荧光灯管):Picott 给出 Lambert 闭式解,等价于线段两端两个点光源配合适当衰减;Phong 高光用线段上与反射向量夹角最小的点做代表点,再用球光近似"加粗"成胶囊。Karis 改用离反射向量最近的点并加能量缩放。
- 平面面光源(矩形即 card light、圆盘、多边形):可表示广告牌、电视屏、柔光箱、反光板、墙面反射等。Drobot 的代表点:Lambert 被积函数的 最大点 和 最大点 之间取 , 由数值积分拟合一个平均值;还支持带纹理的面光,用按不同半径圆形足迹预积分的三维查找表。
- 多边形光:Lambert 推出漫反射精确闭式解;Arvo 用辐照度张量与斯托克斯定理把面积分变为边界积分,支持 Phong 瓣,但每条边的开销与 Phong 指数成线性;Lecocq 给出 O(1) 近似并推广到半向量 BRDF。
线性变换余弦 (LTC)
Heitz 等:用 矩阵对余弦瓣做缩放、拉伸、倾斜,可表达多种球面形状。余弦瓣对球面多边形的积分早有闭式解;用矩阵的逆变换多边形域即可抵消矩阵,复杂度不变。离线把 BRDF 拟合成 LTC,按粗糙度、入射角等制表。支持带纹理多边形光以及更便宜的矩形、圆盘、线光。比代表点更贵,但准确得多。
flowchart LR A["LTC 瓣 + 球面多边形"] -->|"乘以矩阵逆"| B["余弦瓣 + 变换后多边形"] B --> C["闭式积分"] C --> D["等于原 LTC 在原多边形上的积分"]
上图表示 LTC 的核心:把积分域一起逆变换后,被积函数回到普通余弦瓣。
误差来源
- 真实灯具很少是均匀发光体:遮光片(gobo、cookie)、蜂窝格栅、反射镜系统会产生强方向性并形成远离物理中心的虚拟发光体,衰减计算应考虑这一偏移。
- 现有实时阴影技术都不能准确考虑光源形状:阴影只是乘一个标量,而正确做法应在与 BRDF 积分时计入遮挡。
- 多种光照表示混用时,不同表示之间的结果一致性可能比各自的绝对误差更重要;误差应在感知、面向结果的框架下评估。
- IES 灯光文件只描述角度发射分布,不建模光学系统对衰减的影响,也不描述光源表面上的发射。
PBRT 的视角:把形状当作面光源来采样(PBRT 4e 第 6 章)
在 pbrt 中,面光源就是给 Shape 附上发光分布,所以每种形状必须提供 Area() 和两套 Sample()/PDF():一套按面积,一套按参考点的立体角。默认只在法线所在一侧发光,ReverseOrientation 可以翻转;形状的 NormalBounds() 方向锥可以快速判断某个发光形状照不到某点。PBRT 的结论是:近处的大光源值得按立体角采样(球用锥内均匀采样,三角形用球面三角形采样,矩形用球面矩形采样,再用双线性 warp 近似 因子);圆柱、圆盘和一般双线性面片只做面积采样再换算 PDF;曲线不能当光源。公式和推导见 形状采样。上文实时渲染中的 LTC 等方法是解析地积分,PBRT 是用蒙特卡洛估计,二者目标相同、做法不同。
PBRT 的视角:DiffuseAreaLight(PBRT 4e 12.4)
- 面光源 = 形状 + 表面每点的方向分布;
DiffuseAreaLight的方向分布是均匀的(朗伯发射)。代价是积分通常没有闭式,要用蒙特卡洛,换来软阴影和更柔和的高光(书中图 12.15:圆盘越大,半影越宽,龙身上的高光越弱)。 - 默认只在外法线一侧发光,可用翻转变换或
ReverseOrientation改到另一侧,twoSided双面发光。若形状有 alpha 纹理,被抠掉的部分不发光(用随机 alpha 测试判断)。原书脚注:pbrt 还"勉强"支持一个非物理技巧——给面光源一张全零 alpha 纹理,得到不可见光源(光线永远打不到它);构造函数把这种光源归为LightType::DeltaPosition,使积分器只通过光源采样计入它,而不指望 BSDF 采样命中。 - 发光可以是常数光谱
Lemit,也可以是图像(查询时 翻转,与图像纹理约定一致),再乘scale。 SampleLi()直接调用Shape::Sample(ctx, u),它已返回相对接收点立体角的 PDF(见 形状采样);采样点被 alpha 抠掉或亮度为 0 则返回无效样本,省一条阴影光线。图像发光时只按形状采样不理想,pbrt 只让BilinearPatch额外接受一张采样用图像(需在场景里重复指定,作者承认不优雅)。- 功率 (双面再乘 2);图像发光取平均值,忽略 alpha 和 参数化畸变,因此可能有误差。
- 与本页上文的关系:上文 RTR4 方法是在着色时解析近似面光源积分(矢量辐照度、LTC、代表点);pbrt 用采样 + 阴影光线无偏地求积分,可见性自动正确,代价是噪声。延伸阅读中 Peters 2021a 用 LTC 做线光源的 BRDF 乘积采样,把两条路线接了起来。多光源时如何选面光源见 多光源采样与光源 BVH。
出处
- realtime_rendering_4ed.pdf 第 10 章 Local Illumination
- PBRT 4e source excerpt: chapter 06 (Shapes)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 6 章 6.1.6–6.1.7 节,pbr-book.org/4ed/Shapes
- PBRT 4e source excerpt: chapter 12 (Light Sources)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 12 章 12.4 节,pbr-book.org/4ed/Light_Sources