转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=1952

大气散射是日常生活中天天能见到的现象。由于大气的厚度、密度和微尘的影响,大气散射不但会在亮度,还会在频谱上产生丰富的变化(雷利散射)。最明显的是蓝色的天空和金黄的夕阳。

近几年的游戏(尤其是有太空镜头的)也开始试着表现大气散射的效果了。由于存在各种各样的变化,如果完全靠手调,工作量很大。所以各种自动计算的方法油然而生。比较有影响力的有GPU Gems 2第 16章的Accurate Atmospheric Scattering。它用视线穿越大气的厚度来直接计算散射,不需要预计算,但效果集中在单方向单次散射。接着就出现了Precomputed Atmospheric Scattering,通过预计算的4D table来表达不同视线方向接收到的散射频谱。可以处理单次和多次散射,但需要预计算,无法让美术交互地调整参数。

前不久,组员胡勤在GPU Pro 3里找到一篇An Approx­i­ma­tion to the Chap­man Grazing-Incidence Func­tion for Atmos­pheric Scat­ter­ing,利用对Chapman function的近似来计算大气散射。这个方法在不需要预计算的情况下也能处理全方向单次多次散射,对参数的调整可以直接响应到渲染结果里。而且这个方法是基于物理的近似,参数很少很直观,更方便了美术做进一步调整。

Atmospheric scattering

看看日落时分阳光的颜色:

Atmospheric scattering sunset

不需要任何手工修改,阳光自然就变成了金黄色。

这个系统的参数有:大气层厚度、大气密度、散射的颜色分布、吸收的颜色分布,仅此而已,就这么简单。同样的系统,不同的参数就可以生成各种星球的大气散射结果。这个例子以后将会发展成一个大气散射编辑器。