[EUROGRAPHICS 2009] Real-time Volumetric Lighting in Participating Media

Real-time Volumetric Lighting in Participating Media

本文是对"Real-time Volumetric Lighting in Participating Media - EUROGRAPHICS 2009 - Balázs Tóth and Tamás Umenhoffer"一文的学习与总结。

摘要

在一些大范围的媒介(比如烟雾,尘埃等)中给出对光照散射(light scattering)的模拟与仿真有助于进一步增强渲染效果的逼真度。在本文撰写的时候,由于此前实现技术的高消耗,这种volumetric的light scattering效果通常只见于离线计算,鲜少有用于实时渲染中的。本文给出一种在烟雾等媒介中通过单次散射(single scattering)计算实现volumetric light-shafts效果的算法,这个算法是基于GPU而实现的。这个算法将通过shadow map来计算light-shafts中的阴影数据,并通过interleaved sampling(间隔采样)的方式在保证渲染质量的同时兼顾实施效率。

1. 简介

volumetric light scattering对于逼近真实渲染效果有很大作用,而这个效果的产生,则是由于从可见物体表面到相机这一段空间中分散着众多的细小粒子,而光线在传播的过程中会与这些粒子发生众多如吸收散射之类的交互。因为光线与媒介粒子碰撞交互并不是一次性的,而是反复的持续性的,因此想要在渲染中实现对这个效果的模拟需要非常昂贵的计算消耗。不过本文观察到,在大多数情况下多次交互(或者说散射)对于最终的实现效果的影响并没有特别突出,大多数时候,只需要考虑单次散射就已经足够模拟出光线传播的主要特征了,因此这里给出一种在均匀介质中实现快速的light scattering计算的算法,这个算法的实现会考虑动态物体以及动态光源的影响。

2. 前人工作

volumetric light scattering效果此前都是在离线时计算的,常用的方法有ray marching (KH84),Monte Carlo
quadrature (Rus94)以及volumetric photon maps (JZJ08)等,这些算法的实现消耗通常都比较高,难以做到实时显示。

随着GPU性能的提升,人们也提出了一些瞄准实时显示的light scattering计算方法,这些方法大致可以分成两类:

  1. 基于ray marching的
  2. 基于shadow volumes的

使用shadow volume的方法(BAM06, Jam03)通过从光源扩展(extrusion)而得到的轮廓多边形(silhouette polygons)来对从相机所射出的射线的阴影部分进行标记而实现。之后对这些shadow volume按照从后到前的方式的顺序进行渲染(会有一个排序消耗)。

使用ray marching的方法则是沿着从相机到可见物体表面的射线,按照一个step一步步的对scattering数据进行累加而实现。

在实时渲染算法中,有一个基于slice的volume rendering算法能够对每个像素的ray marching通过采用shadow map计算普通物件(不透明物体等)的阴影来实现高效计算(DYN02,Mit04)。

此外还有将shadow volume与ray marching算法结合起来对经典ray marching算法进行加速的做法(WR08)。

最后,还有通过后处理方式如采用一个径向模糊算法来实现对light-shaft进行模拟的做法,不过这种算法通常只在光源在相机中可见的时候才有效(Mit07)。

本文给出的算法是在PS中实施的,可以看成是一个后处理算法。整个算法的实现是基于ray marching的,且普通物体的阴影是通过shadow map来获取的。

3. Volumetric lighting in participating media

这里给出一条射线的公式定义:\vec x(s) = \vec x_0 + \vec{\omega} \centerdot s,其中\vec x_0是射线的原点,\vec{\omega}则是射线的方向。在均匀的无自发光的介质中,辐射亮度沿着此射线的变化值可以通过L(\vec x, \vec{\omega})来表示,这个变化值可以通过radiative transport equation (SKSS08)计算得到:

\frac{dL(\vec x(s), \vec{\omega})}{ds} = - \tau L(\vec x(s), \vec{\omega}) + \tau a \int\limits_{\Omega^`} L(\vec x(s), \vec {\omega}^`) P(\vec {\omega}^`, \vec {\omega}) d{\omega}^`

其中\tau指的是当前媒介中介质的密度,用于表征光线在传播过程中与媒介粒子发生碰撞的概率;a(albedo)指的是光线在与媒介粒子发生碰撞后发生散射(而非被吸收)的概率;P(\vec {\omega}^`, \vec {\omega})是相函数(phase function),用于表征散射函数的概率密度(即散射光线出射方向的概率分布)。

这个公式左边这个差分形式表明这个公式计算的是在\vec x(s)位置处新增的辐射亮度radiance,而这部分新增的辐射亮度包含两部分:第一部分- \tau L(\vec x(s), \vec{\omega})指的是从当前像素沿着指向相机的射线方向的反射光在此点的辐射亮度损耗;第二部分是个积分,表示的是从各个方向的光照打在此点之后沿着\vec \omega出射方向的散射辐射亮度(不过这部分只是单次反射的计算公式,并没有进一步给出多次反射的计算延伸)。

这个差分公式难以直接得到解析解,通常会考虑使用蒙特卡洛算法(SK08)来给出近似解,不过蒙特卡洛算法的缺点在于计算慢,所以很难用在实时渲染场景中。这里给出的做法是忽略公式中的多次散射项,直接使用单次散射项来对in-scattering进行模拟,如果用L_i表示in-scattering的话,那么有如下的近似公式:

\tau a \int \limits_{\Omega^`} L(\vec x(s), \vec {\omega} ^`) P(\vec {\omega}^`, \vec {\omega}) d\omega^` \approx L_i(\vec x, \vec \omega)

根据这个简化公式,得到最终的 公式如下:

\frac{dL(\vec x(s), \vec{\omega})}{ds} = - \tau L(\vec x(s), \vec{\omega}) + L_i(s, \vec \omega)

这个公式是存在解析解的:

L(\vec x(s), \vec \omega) = e^{-\tau s} L(\vec x_0, \vec \omega) + \int_{0}^{s}L_i(\vec x(l), \vec \omega) e ^{-\tau (s - l)} dl

上面公式中的积分项可以用黎曼求和公式来近似,从而可以将这个公式转换为如下的近似公式:

L(\vec x(s), \vec \omega) \approx e^{-\tau s} L(\vec x_0, \vec \omega) + \sum_{n=0}^{N}L_i(\vec x(l_n), \vec \omega) e ^{-\tau (s - l)} \Delta l -------- equation 1

其中step尺寸\Delta l = s / N,即与射线的长度成正比,与单条射线上的采样点数目成反比。

这个公式给出的是当前点\vec x(s)处的辐射亮度计算方法,分成原点辐射亮度随着距离的衰减项以及从各个方向的输入光经过单次散射之后的in-scattering项。

此外,需要注意的是,这个公式中的连续的采样点之间时相互独立的,之后会在4.1节中介绍的间隔采样中被用到。

如果假设前面in-scattering公式中所有入射光都具有相同的参数,对于只有一盏功率为\Phi的点光的场景而言,只需要考虑入射光方向参数\vec {\omega}^`,此时in-scattering公式可以改写成如下格式:

L_i(\vec x, \vec \omega) = \tau a \frac{\Phi}{4\pi d^2}v(\vec x) e^{-\tau d}P(\vec {\omega}_l, \vec \omega)

其中d表示的是此点距离光源的距离,而\vec {\omega}_l 则是此点对应的输入光线的方向,v(\vec x)则是对于光源而言此点的可见性。

3.1. Scattering calculation with ray-marching

使用前面一节给出的公式1,通过ray marching方法就能够实现对volumetric light scattering效果进行近似模拟了,具体算法给出如下:

  1. 对于屏幕空间中的每个像素,找到这个像素在世界空间中的对应表面上的点,以及此点的辐射亮度值
  2. 以此点作为原点,沿着从此点到相机的射线进行ray marching迭代计算,对于ray marching中的每个采样点,需要计算以下几项数据:
    1. in-scattering项L_i(x(l_n), \vec \omega)
    2. 从此点到相机的吸收因子(absorption):e^{-\tau (s - l_n)}
    3. 上述两项的乘积,并将这个乘积添加到累加列表中
  3. 累加结果对应的是此点的in-scattering辐射亮度,将此项存储在屏幕空间所对应像素的相应位置上

4. GPU Implementation

根据光源类型不同,需要生成不同类型的阴影贴图(2D贴图 for spotlight/directional light,cubemap for pointlight)。之后借助shadow map计算in-scattering项。

ray marching过程shader代码给出如下,其中shadowMC实现当前采样点visibility项的计算:

L = L0 * exp(-s * tau);//initialization

//ray marching, light space

for(float l = s - dl; l >= 0; l -= dl)

{

​ x += viewDir * dl; // step: dl

​ float v = shadowMC(shadowMap, x);

​ float d = length(x);//distance from light source

​ Lin = exp(-d * tau) * v * Phi/4/M_PI/d/d;

​ Li = Lin * tau * albedo * P(x, viewDir);//light direction == x in light space

​ L += Li * exp(-l * tau) * dl;

}

整个ray marching是在光源空间中进行的,这样做的好处是可以使得计算更为简便,计算过程中使用的相函数用P来代替,在实际计算中可以根据需要选取对应的实现(比如常用的Henyey-Greenstein相函数),当然,为了省略一些复杂的计算,也可以将这一项做成贴图,之后通过LUT的方式获取相应计算结果。

整个计算过程可以放到后处理中进行,只要有shadow map以及屏幕空间depth map作为输入即可。如果需要为场景中的多个光源添加light-shaft的话,那么每个光源都需要运行一遍这样的ray marching,并将计算结果累加起来作为输出即可。

4.1. Interleaved sampling

如果每个屏幕空间像素在ray marching中的采样点数目N很大的话,ray marching过程就会比较费时间,而如果采样点数目不够,就会导致计算得到的light-shaft结果存在比较明显的锯齿。想要通过较少采样点得到较高的渲染质量,需要做特殊的处理,间隔采样算法(interleaved sampling,KH01)正好能够满足这项需求。这个算法是基于以下观察结论提出的:屏幕空间上相邻像素的volume lighting以及对应的可见物体表面辐射亮度值是非常接近的,因而某个屏幕空间像素计算得到的light scattering辐射亮度可以用于近似模拟相邻像素的light scattering数值。

假设每个像素在ray marching中的采样点数目为N,并将屏幕空间分割成一个个的square block,每个block包含MxM个像素,这里的做法是,假设每个block中像素的in-scattering数值都比较接近,那么这里可以考虑将原来的NxMxM个采样点计算收缩为N个采样点,并将这N个采样点均分到MxM个像素上,使得每个采样点上的采样点数目缩小到N/(MxM),之后再通过一个addition pass(这个addition pass可以考虑分成横向跟纵向两个pass,消耗会更低一点),将MxM个像素block中各个像素的in-scattering数值加到一起,用于模拟整个block的平均in-scattering数值。

其实这里还可以考虑另一种interleaved sampling策略,即将全屏in-scattering计算分散到多帧完成,每帧只对MxM block中的一个像素进行更新,而其余像素则使用previous frame计算的结果加上其余像素的in-scattering结果加权而来。当然,这只是一个想法,具体实施效果尚未来得及验证。

5. Results

软硬件配置:DirectX9,NVidia 8800GTX GPU

场景数据:66000面,单个点光,800x600分辨率

性能对比:110 FPS(开启in-scattering前) ~ 42 FPS(开启in-scattering后,interleaved sampling off) ~ 100 FPS(开启in-scattering后,interleaved sampling on)

References

[BAM06] BIRI V., ARQUES D., MICHELIN S.: Real time rendering of atmospheric scattering and volumetric shadows. Journal of WSCG 14 (2006), 65–72.

[DC07] DOMONKOS B., CSÉBFALVI B.: Interactive distributed translucent volume rendering. In Winter School of Computer Graphics (2007), pp. 153–160.

[DYN02] DOBASHI Y., YAMAMOTO T., NISHITA T.: Interactive rendering of atmospheric scattering effects using graphics hardware. In Proceedings of the ACM SIGGRAPH/EUROGRAPHICS conference on Graphics hardware (2002), Eurographics Association Aire-la-Ville, Switzerland, Switzerland, pp. 99–107.

[Jam03] JAMES R.: True Volumetric Shadows. Graphics Programming Methods (2003).

[JZJ08] JAROSZ W., ZWICKER M., JENSEN H. W.: The beam radiance estimate for volumetric photon mapping. In SIGGRAPH ’08: ACM SIGGRAPH 2008 classes (New York, NY, USA, 2008), ACM, pp. 1–112.

[KH84] KAJIYA J. T., HERZEN B. P. V.: Ray tracing volume densities. In SIGGRAPH ’84: Proceedings of the 11th annual conference on Computer graphics and interactive techniques (New York, NY, USA, 1984), ACM, pp. 165–174.

[KH01] KELLER E., HEIDRICH W.: Interleaved sampling. In Rendering Techniques 2001 (Proc. 12th Eurographics Workshop on Rendering (2001), Springer, pp. 269–276.

[Mit04] MITCHELL J. L.: Light shaft rendering. In ShaderX3: Advanced Rendering Techniques in DirectX and OpenGL, Engel W., (Ed.). Charles River Media, Cambridge, MA, 2004.

[Mit07] MITCHELL K.: Volumetric light scattering as a postprocess. In GPU Gems 3, Nguyen H., (Ed.). Addison-Wesley, 2007.

[Rus94] RUSHMEIER H.: Rendering Participating Media: Problems and Solutions from Application Areas. In Proceedings of the 5th EurographicsWorkshop on Rendering (1994), pp. 35–56.

[SK08] SZIRMAY-KALOS L.: Monte-Carlo Methods in Global Illumination — Photo-realistic Rendering with Randomization. VDM, Verlag Dr. Müller, Saarbrücken, 2008.

[SKSS08] SZIRMAY-KALOS L., SZÉCSI L., SBERT M.: GPUBased Techniques for Global Illumination Effects. Morgan and Claypool Publishers, San Rafael, USA, 2008.

[WR08] WYMAN C., RAMSEY S.: Interactive volumetric shadows in participating media with single-scattering. In Proceedings of the IEEE Symposium on Interactive Ray Tracing (2008), pp. 87–92.
°

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355