BACK TO ARCHIVE
rendering path tracing glimpse stylized rendering penumbra shadows ray tracing usd

Fringe Lights:在 Glimpse 中实现彩色半影边缘(Colored Penumbra)

12.03.2024 ADUCG RESEARCH

原文:https://animallogic.com/technology/publications/fringe-lights/
PDF:https://animallogic.com/wp-content/uploads/2024/12/Fringe-Lights_-Colored-Penumbra-in-Glimpse.pdf
DOI:https://doi.org/10.1145/3681758.3697998

Figure 1

图 1:Netflix《Leo》中的一帧,使用 Glimpse 的 Fringe Lights 生成彩色半影边缘。在光源采样时最多额外追踪一条阴影射线,即可为半影区域着色,而不会影响场景中其余的照明。© 2023 Netflix US, LLC. All Rights Reserved.

摘要(Abstract)

风格化渲染(stylized rendering)近年来的流行,使得我们需要新的方法帮助艺术家快速实现目标画风。尽管部分效果可以在合成(compositing)阶段添加到渲染帧上,但这往往意味着需要在制作流程末端进行大量人工处理,并且让前序环节无法直观看到最终成片的影响。

本文介绍了我们在制作级路径追踪器 Glimpse 中实现 Fringe Lights(用于 Netflix《Leo》)。Fringe Lights 允许灯光艺术家轻松修改半影(penumbra)的外观,同时保持完全受光(unoccluded)完全阴影(fully shadowed)区域不变。通过在光源采样阶段最多额外追踪一条阴影射线,即可估计两者之间的柔和过渡区域,并以极小的计算开销实现独立的半影照明/着色。我们扩展了光源采样与求值流程,使其能够区分三种着色区域并相应调整光照贡献。该方法为艺术家提供了可直观调控半影风格的自由度,并能在制作流程每个阶段提供直接的视觉反馈。

CCS Concepts

  • Computing methodologies → Non-photorealistic rendering; Ray tracing.

关键词(Keywords)

非真实感渲染(Non-photorealistic rendering),阴影风格化(shadow stylization),光线追踪(ray tracing)

引用信息(ACM Reference Format)

Emanuel Schrade, Basile Fraboni, and Thibault Vergne. 2024. Fringe Lights: Colored Penumbra in Glimpse. In SIGGRAPH Asia 2024 Technical Communications (SA Technical Communications ’24), December 03–06, 2024, Tokyo, Japan. ACM, New York, NY, USA, 4 pages. https://doi.org/10.1145/3681758.3697998


控制半影的视觉外观能够帮助艺术家影响 CG 图像的照明风格,并通过额外的视觉线索增强观众对虚拟环境的沉浸感。在现实世界中,阴影外观会受到多种因素影响,例如:附近表面的间接反射光、色散/体散射(chromatic volumetric scattering),以及包括次表面散射(subsurface scattering)在内的体积/材质效应。

此外,人类视觉系统会在空间与时间维度上对注视点附近的颜色产生适应——观察者会对附近区域以及之前看到的颜色进行“自适应”。该现象被称为(局部/时间)色度适应(chromatic adaptation)颜色恒常性(color constancy)[Foster 2011]。在我们的语境下,即使阴影边缘本身是无彩色的,观众也可能在感知上“看到”边缘被周围颜色染色。

在非真实感(NPR)语境下,艺术家往往希望夸张这种效果,以传达特定的氛围。因此出现了多种工作流,用于实现常见的“彩色阴影边缘(colored shadow fringes)”效果:

  • 合成阶段用阴影遮罩着色:最直接,但会让制作流程早期环节无法预览最终影响,也常带来额外的手工工作量。
  • Blender 插件的接收面材质法:通过计算着色点到遮挡物的距离来调整颜色,利用“半影尺寸与遮挡物距离相关”的经验相关性。但该方法因为绑定在接收材质上:难以限定到某一盏灯、难以在不同灯之间独立控制;且一旦光源大小/位置变化导致半影宽度变化,所有接收材质参数都需要更新,在制作中不现实。
  • 额外添加“只照半影”的补光 [Brejon 2020, Chapter 7]:主光负责整体照明;次级、较弱且带颜色的光专门照射主光遮挡区域。对于面光(area light),次级光可以是主光的放大版本,用以覆盖主光半影的一部分。缺点是:次级光在其影响范围内也会照亮非半影区域,导致效果幅度受限;并且多盏有色光之间的相互作用往往不直观 [Hasenfratz et al. 2003],艺术家难以稳定控制。
  • 早期“双色 light map”尝试(见图 2):把光源贴图分成两块颜色区域,动机是“半影区域只看到光源的一部分”,因此把那部分染色即可染色半影。该方法将“主光+次级光”合并到单一光源中:light map 的内圈代表一个“更小”的光源(更小半影),外圈代表照亮阴影区域的有色光。为了避免场景整体照明发生偏色,完全可见时的光贡献需要保持中性,导致 fringe 颜色与强度选择受限(light map 必须积分为白色)。这种归一化会引入不希望出现的互补色染色伪影(例如选黄色 fringe 时出现蓝/紫伪影,见图 2)。
Figure 2

图 2:传统 light map(左)用于添加蓝色阴影边缘时,会因为归一化在画面中引入黄色(互补色)伪影(中)。我们的 Fringe Lights 不会产生该伪影(右)。

上述 light map 方法启发了我们将 shadow fringes 集成到 Glimpse 中的实现:不仅避免了颜色伪影(图 2 右),还能把彩色半影输出到独立 light group 以便合成阶段进一步调整。与我们相似的两种做法分别出现在 Pixar《Luca》的相关博客 [Pedersen and Sisson 2023] 与 Max Liani 的演示中,但两者均未公开技术细节。


2 Glimpse 中的 Fringe Lights(Fringe lights in Glimpse)

本节介绍我们与 USD 管线兼容的 Fringe Lights,并给出一种用于采样该类光源的随机(stochastic)算法。我们的实现受到“把一盏灯拆成两盏灯”这一思想启发:定义一个外层(outer)光源控制彩色 fringe 区域的覆盖范围,以及一个内层(inner)光源用于判定“非彩色阴影”的边界。

2.1 Fringe 区域与缩放系数 m

Fringe 区域通过可配置缩放系数 $m$ 控制,用于定义外层光相对内层光的参数尺度:

  • 对于面光(area light),缩放系数作用于半径: $$r_o = r_i \cdot m$$
  • 对于平行光(distant light)与聚光灯(spot light),缩放系数作用于发射角: $$\theta_o = \theta_i \cdot m$$

调节 $m$ 会改变(无彩)半影区域与(彩色)fringe 区域的重叠关系:

  • $m = 1$:fringe 覆盖范围与半影相同。
  • $m > 1$:fringe 影响范围大于半影,彩色边缘会进一步“侵入”到核心阴影(core shadow)内部。
  • $m < 1$:fringe 影响范围小于半影。但由于 fringe 范围更小,整体亮度梯度可能看起来不真实(见图 5)。

我们不强制限制 $m \ge 1$,但在制作中 $m \ge 1$ 通常更有用。

2.2 采样 Fringe Lights:最多两条阴影射线

图 3 展示了我们对 fringe 面光的随机采样流程,并在算法 1 中总结。核心思想是把光源拆成橙色(outer)与青色(inner)两部分;对于每次采样:

  1. 先像普通面光一样在 outer 光上采样一个随机位置 $s_o$,从着色点 $x$ 向 $s_o$ 追踪第一条阴影射线。
  2. 如果 $s_o$ 被遮挡(情况 a),则认为点 $x$ 完全处于阴影中,直接返回 0(无需第二条射线)。
  3. 若 $s_o$ 可见,则再在 inner 光上采样 $s_i$ 并追踪第二条阴影射线:
    • 若 $s_i$ 被遮挡(情况 b),则认为 $x$ 处于“部分可见”的半影/过渡区,返回 fringe 颜色贡献。
    • 若 $s_i$ 也可见(情况 c),则认为 $x$ 完全受光,返回 常规光颜色贡献。

备注(可选变体):情况 (c) 也可以被当作“阴影”,即把常规光颜色设为 0,这样即可得到 fringe-only light:只照亮 fringe 区域而不照亮完全受光区域。我们也可以(如果需要)改变核心阴影区域颜色,但那与本文方法正交;本文只影响半影区域。

Figure 3

图 3:采样 Fringe Lights 时最多追踪两条阴影射线:outer 样本被遮挡(a)则直接返回 0;outer 可见则采样 inner 并追踪第二条射线,inner 被遮挡(b)返回 fringe 颜色;两者都可见(c)返回常规光颜色,或在 fringe-only 模式下返回 0。

Algorithm 1: Fringe area light sampling(Fringe 面光采样)
s_o ← sampleRandomPos(r_o)
if visible(x, s_o) then
  s_i ← sampleRandomPos(r_i)
  if not visible(x, s_i) then
    return evalFringe(x, s_o)
  else
    return evalLight(x, s_o)
return zero

2.3 方向光与聚光灯:采样方向而非位置

平行光与聚光灯的 fringe 采样与面光类似,但需要相对于发射角采样方向而非位置,见算法 2。

Algorithm 2: Fringe directional light sampling(Fringe 方向光采样)
ω_o ← sampleRandomDir(θ_o)
if visible(x, ω_o) then
  ω_i ← sampleRandomDir(θ_i)
  if not visible(x, ω_i) then
    return evalFringe(x, ω_o)
  else
    return evalLight(x, ω_o)
return zero

2.4 USD 集成与工作流(Integration of fringe lights)

Fringe Lights 可以通过自定义 light API schema 的少量参数轻松集成到 USD 管线中。

支持“同时包含 fringe 与常规光颜色”的通用 fringe light,需要 4 个附加参数:

  • 是否启用 fringe 的布尔开关
  • 缩放系数 $m$(控制 fringe 大小)
  • fringe 颜色
  • fringe 强度

如果只需要 fringe-only(用于把 fully-lit 与 fringe 输出到不同 light group / AOV 以便后期调节),则只需 2 个附加参数:

  • 把灯转为 fringe light 的布尔开关
  • 缩放系数 $m$

这样我们就可以复用同一盏灯已定义的颜色与强度来作为 fringe 的颜色与强度来源(避免额外冗余参数)。

Figure 4

图 4:Fringe Lights 在渲染器里与普通光源一致,但只照亮“部分阴影”的区域;同样支持 light linking / shadow linking。图中:一盏面光照亮全场景,另外两盏 fringe light(同尺寸与强度,$m=1$)通过 shadow linking 分别为两侧 logo 产生蓝色与橙色 fringe。

2.5 局限性(Limitations)

目前实现的局限包括:

  • 暂不支持在穹顶/环境光(dome/environment light)上生成彩色 fringe,因为不易为该类光源定义“缩放”的合理方式。
  • 在 Netflix《Leo》的制作中,我们大量使用 fringe-only lights,这意味着灯光 rig 中需要两盏灯:一盏主光(关闭 fringe)+ 一盏 fringe-only light(只出 fringe),从而带来小幅的渲染开销。
  • 一种替代方案是让 fringe light 自动把 fringe 与常规光分离到两个不同 AOV 中,但这需要改变工作流(从 light groups 转向 AOV 配置)并要求渲染器支持额外输出通道配置。

3 结果与讨论(Results and Discussion)

把 Fringe Lights 集成到渲染器后,灯光艺术家可以在预览/最终渲染中直接获得反馈,从而塑造风格化半影的外观。由于 Fringe Lights 在渲染器内与普通光源一致,它们可以与其他光照一起渲染,不需要额外的单独渲染 pass。并且通过把贡献写入独立 light group(或 AOV),可以在合成中进一步处理。艺术家可以对几何体做 light/shadow linking 来限定 fringe 影响对象,并为每一盏 fringe 定义颜色,使 fully-lit 区域与 core shadow 保持不变(见图 4)。缩放系数 $m$ 可用于调节彩色 fringe 的大小(见图 5)。

Table 1:每采样开销评估(Markdown 表)

表 1 评估了 fringe lights 在制作场景(图 1)与简单场景(图 5(c))中的“每样本”时间开销。作为参照,给出了未使用 fringe 的渲染时间(左列),并对比:

  • 合并 fringe light:把一盏普通灯直接改为 fringe light(中列)
  • 主光 + fringe-only 两盏灯:同时存在普通主光与 fringe-only lights(右列)
场景无 Fringe(No fringe)合并 Fringe Light(No primary)主光 + Fringe-only(All lights)
Figure 1(制作场景)2705.1 ms2940.2 ms(+8.7%)2943.2 ms(+8.8%)
Figure 5(c)(简单场景)117.4 ms118.9 ms(+1.3%)130.9 ms(+11.5%)

从表 1 可见:在简单场景中,把普通灯改为 fringe light 仅增加约 1.3% 开销;而额外添加 fringe-only light 会让渲染时间增加 11.5%(灯数量翻倍且阴影射线数量近似增至三倍,而材质求值与主射线相交成本很低)。在制作场景中,由于几何复杂,额外阴影射线更昂贵,因此把太阳光替换为 fringe light 会增加约 8.7% 开销;但同时使用“主光 + fringe-only”带来的额外开销在该案例中几乎可忽略。

Figure 5

图 5:缩放系数 $m$ 用于调节 fringe 的范围。inner 光源的可见性用于切换 fringe 光贡献,因此 fringe 始终受 inner 光源阴影边界的限制。(a)-(c) 为 fringe light 与同位置、同亮度的常规光叠加效果;(d) 显示隔离后的 fringe-only 结果。注意:当 $m<1$ 时 fringe 只覆盖半影的一部分,亮度梯度可能不真实。


4 结论(Conclusion)

我们提出了一种新的随机算法,用于在制作级渲染器 Glimpse 中集成彩色阴影 fringe。将该算法集成到光源采样与求值环节后,艺术家可以在不影响场景其余照明的前提下,便捷地改变半影的外观。与基于着色器或合成的方案相比,我们的方法更鲁棒,且不需要额外的手工处理;灯光艺术家只需为光源定义所需的半影风格即可。我们展示了该技术在制作中的工作流、可调参数以及可实现的视觉效果,并在近期项目中验证了其实用性。

致谢(Acknowledgments)

Figure 6

图 6:在 Netflix《Leo》中,彩色 Fringe Lights 被用于大多数日景镜头,包括室外(上)与室内(下)。© 2023 Netflix US, LLC. All Rights Reserved.

我们感谢 Zane Smedley 对制作资源的帮助,以及 Steve Agland 与 Rodrigo Janz 对制作素材的支持。我们也感谢 Animal Logic 的同事们审阅本文早期版本并在项目期间给予支持。


参考文献(References)

本文采用 Creative Commons BY-NC-ND 4.0 协议进行授权。

BY-NC-ND: 署名-非商业性使用-禁止演绎

End of Article