声明:本文引用了一些来自Lightspeed项目的一些图片,版权属于原作者。
Notice : I have referenced some picture from Lightspeed project. The copyright is belong to origin author.
Relighting系统是成熟的CG制作流程中不可或缺的一个环节。不过有趣的是,目前除了NVIDIA Gelato的那个附带的部件以及PIXAR曾经的IRMA,Relighting似乎还没有成熟的商业版本问世。这是由于Relighting系统的先天存在条件所决定的,它必须与制作流程紧密结合,绝非一个独立存在的功能。Relighting可以大幅度的提高艺术家的角色、灯光的布置设计,进而提高生产速度与品质。目前在ILM、PIXA R、DreamWorks等顶尖的CG工作室中都早就有了自己与整套制作流程相结合密切的Relighting系统,如PIXAR的Lpcis、ILM的Lightspeed等。
Relighting系统的主要工作过程如下:
-
选择关键帧,为这些关键帧预设计灯光
-
选择一种BRDF即光照模型
-
编写渲染器Shader,将计算光照所需要的所有数据以帧的方式渲染出来
-
将灯光参数、BRDF数据载入硬件进行实时计算
-
根据反馈结果调整灯光参数,直到符合要求为止
Position | |
Normal | |
Diffuse | |
Specular | |
Rendering Result |
在这里我们看到,整个Relighting过程类似于调整灯光进行延迟着色,而且可以牺牲掉一定的实时性能,而获得与真正渲染素质几乎相同的画面给艺术家参考。为了进行最大程度近似的光照计算,输出光照计算所需要成分的贴图时可以预先做好光线跟踪与环境照明,预先执行Displacement Shader等。
但是随着渲染场景复杂度的提升,艺术家所设计的灯光数目也越来越多,可能有几千个灯光用于构建真实场景的照明效果。同时,Surface Shader的复杂度、相关OP很有可能是硬件无法支持的。所以为了适应GPU加速计算,Lightspeed开发了编译器优化系统,通过分析RSL语法树识别出Surface Shader中动态与静态的部分,然后拆解为相应的Cg Shader,载入GPU进行渲染。在Relighting系统中真正许多调用的是Light Shader,Lightspeed通过Cg接口实现调用。对于一个基于GPU与GLSL的Relighting系统框架来说,可是预先编写好相应的Light Shader,包括Spot、Direction等。
多光源的问题将是一个不小的负担,因为对于GPU这样高度并行的流处理器来说,最慢的操作莫过于内循环。如果在GPU Shader中要求遍历100000次,这是相当不可思议的耗费。我们首先需要承认这样的一个事实,不是所有的光源对于场景都有巨大的贡献,很多光源只是为了模拟局部地区照明,在Relighting时几乎没有任何贡献,所以我们可以进行一些简化。康奈尔大学一直在做Relighting系统的设计,最新的《GPU Gems 3》中就有康奈尔学者的文章。从《Direct-to-Indirect Transfer for Cinematic Relighting》到《Matrix Row-Column Sampling for the Many Light Problem》,都是为了提高Relighting的速度,拓展Relighting的适用范围,更好的为制作流程服务。