这是我渲染的最终效果:
?
?
我的程序代码:
??????????????????????????????????
?本文来自? <<GPU Gem 3>>?Chapter 13. Volumetric Light Scattering as a Post-Process
在本章中,我们将介绍一种简单的后处理方法,它可以产生由于大气中的阴影而产生的体积光散射效果。我们改进了现有的日光散射分析模型,使其包含了体积遮挡的效果,并介绍了在像素着色器中的实现方法。该技术可应用于任意场景复杂度的任何动画图像。演示截图如图 13-1 所示。
13.1 导言
在现实世界中,我们很少在真空中观察事物,在真空中,物体和观察者之间什么都不存在。在实时渲染中,参与介质对光传输的影响往往受制于低复杂度的均质假设。这是由于在复杂的交互式动画环境中,辐射传输方程(Jensen 和 Christensen,1998 年)的难解性,需要考虑发射、吸收和散射。在本章中,我们将考虑大气中的体积阴影对光散射的影响,并展示如何通过 GPU 像素着色器后处理对一个或多个图像光源进行实时计算。
13.2 黄昏光线
在适当的条件下,当空间中含有足够密集的光散射介质混合物(如气体分子和气溶胶)时,被光线遮挡的物体会投射出大量阴影,并似乎形成从光源辐射出来的光线。这些现象被称为黄昏光线、太阳光、旭日、星耀、神光或光轴。在阳光下,这些体量实际上是平行的,但在透视图中似乎是从太阳向外散开的。
渲染黄昏光线首先在非实时渲染中使用改进的阴影体积算法(Max 1986)来解决,不久之后,开发了一种用于多光源的方法(Nishita 等人,1987)。 这个主题在实时渲染中被重新审视,使用基于切片的体积渲染技术(Dobashi et al. 2002),并且最近使用硬件阴影贴图(Mitchell 2004)进行应用。 然而,基于切片的体积渲染方法可能会出现采样伪影,需要高填充率,并且需要额外的场景设置。 虽然阴影贴图方法提高了效率,但它也有基于切片的缺点,并且需要更多的视频内存资源和渲染同步。 另一种实时方法基于 Radomir Mech (2001) 的工作,使用多边形体积 (James 2003),其中使用帧缓冲区混合和深度剥离来累积重叠体积。 类似的方法 (James 2004) 消除了使用累积体积厚度进行深度剥离的需要。 在我们的方法中,我们应用逐像素后处理操作,不需要预处理或其他场景设置,并且允许在任意复杂的动画场景中提供详细的光轴。
在之前的工作中(Hoffman and Preetham 2003),实现了用于均匀介质中光散射的 GPU 着色器。 我们通过后处理步骤对此进行扩展以考虑体积阴影。 这种后处理的基本表现可以追溯到图像处理操作,即径向模糊,它出现在许多 CG 演示作品中(Karras 1997)。 尽管此类演示使用软件光栅化来应用后处理效果,但我们使用硬件加速着色器后处理来允许基于日光分析模型的更复杂的采样。
13.3 体积光散射
为了计算每个像素的照度,我们必须考虑从光源到该像素的散射以及散射介质是否被遮挡。 对于阳光,我们从日光散射的分析模型开始(Hoffman and?Preetham 2003)。 回想以下内容:
????????????????????????????
其中 s 是穿过介质的距离,是光线与太阳之间的角度。 E sun 是来自太阳的光源照度,ex 是由光吸收和外散射特性组成的消光常数,sc 是由瑞利和米氏散射特性组成的角散射项。 该方程的重要方面是,第一项计算从发射点到视点吸收的光量,第二项计算由于光散射到视线路径中而产生的附加量。 与 Hoffman 和 Mitchell 2002 中一样,由于遮挡物质(例如云、建筑物和其他物体)而产生的效果在这里简单地建模为光源照明的衰减,
???????????????????????????
其中 D() 是视图位置 的组合衰减太阳遮挡对象的不透明度。
这种考虑带来了一个复杂的问题,那就是要确定图像中每个点的光源闭塞情况。在屏幕空间中,我们没有完整的体积信息来确定遮挡。不过,我们可以通过对图像空间中光源光线沿线的样本进行求和,来估算每个像素点闭塞的概率。根据击中发射区域的样本比例与击中遮挡区域的样本比例,我们就可以得出所需的遮挡百分比 D()。当发射区域比遮挡物体更亮时,这种估算方法效果最佳。在第 13.5 节中,我们将介绍处理不存在这种对比度的场景的方法。
如果我们将样本光照度除以样本数 n,后处理就可以简单地解决图像的加法采样问题:
??????????????????????????????
13.3.1 控制和合并
此外,我们引入衰减系数来参数化求和控制
????????????????
其中曝光控制后处理的整体强度,权重控制每个样本的强度,而 Decayi(范围 [0, 1])随着光线远离光源而消散每个样本的贡献。 这种指
数衰减因子实际上允许每个光轴平滑地远离光源。
暴露和重量因素只是比例因素。 增加其中任何一个都会增加结果的整体亮度。 在演示中,通过细粒度控制调整样本重量,通过粗粒度控制调整曝光。
由于样本纯粹源自源图像,因此无需额外的工作即可处理半透明对象。 可以通过每个光线投射光源的连续附加屏幕空间通道来应用多个光源。 尽管在本说明中我们使用了分析日光模型,但事实上,可以使用任何图像源。
对于太阳位置 和每个屏幕空间图像位置 ,我们沿光线矢量 = (-)/n(密度) 以规则间隔对源图像中的连续样本进行求和。 在这里,我们引入密度来允许控制样本之间的分离,在这种情况下,我们希望减少样本迭代的总数,同时保留足够的无混叠采样密度。 如果我们增加密度因子,我们就会减少样本之间的间隔,从而导致更亮的光轴覆盖更短的范围。
????????? ?
在图 13-2 中,1 中的样本没有被遮挡,从而在定期评估 L(s,) 时产生最大散射照明。 值为 2 时,沿光线的一定比例的样本撞击建筑物,因此累积的散射照明较少。 通过对图像中每个像素的投射光线求和,我们生成包含遮挡光散射的体积。
我们可以通过对源图像进行下采样来降低带宽要求。 通过滤波,这可以减少采样伪影,并因此通过滤波器内核的邻域采样引入局部散射贡献。 在演示中,基本的双线性滤波器就足够了。
????????????????????????????????????????????????????
13.4 后处理像素着色器
?
该技术的核心是后处理像素着色器,如清单 13-1 所示,它实现了公式 4 的简单求和。
给定初始图像,样本坐标是沿着从像素位置到屏幕空间光位置的光线投射生成的。 [1] 屏幕空间中的灯光位置通过标准世界视图投影变换计算,并进行缩放和偏置以获得 [-1, 1] 范围内的坐标。 方程 4 求和中的连续样本 L(s,...,i) 通过权重常数和指数衰减衰减系数进行缩放,以便对效果进行参数化控制。 样本密度之间的分离可以调整,并且作为最终控制因素,所得到的组合颜色通过恒定的衰减系数曝光来缩放。
例13-1。 加法采样的后处理着色器实现
?
13.5 屏幕空间遮挡方法
如前所述,屏幕空间采样并非纯粹的闭塞采样。由于表面纹理的变化,可能会出现不理想的条纹。幸运的是,我们可以使用以下措施来处理这些不良影响。
13.5.1 遮挡Pre-Pass Method
如果我们将未着色的黑色遮挡物体渲染到源帧缓冲区中,然后在此图像上进行图像处理以生成光线。然后用常规着色方法渲染遮挡场景物体,并将后处理结果添加到场景中。这种方法与渲染未着色深度预处理的常用技术相辅相成,以限制完全着色像素的深度复杂性。图 13-3 显示了相关步骤。
????????????????????????????
13.5.2 遮挡模版法
在早期的图形硬件上,通过使用模版缓冲区或 alpha 缓冲区,无需预处理也能达到同样的效果。图像的主要发射元素(如天空)在设置模版位的同时以正常方式渲染。然后对遮挡的场景对象进行无模板位渲染。在进行后期处理时,只有那些设置了模版位的样本才会被添加到混合效果中。
13.5.3 遮挡对比法
同样,这个问题也可以通过纹理的内容、雾气、空中透视或光线适应来降低纹理的对比度,因为在面对光源时,效果的强度会增加。只要能降低遮挡物体的照明频率和对比度,就能减少条纹伪影。
13.6 注意事项
虽然可以获得令人信服的效果,但这种方法并非没有局限性。在处理相对较近的光源时,背景物体的光轴可能会出现在前景物体的前面,如图 13-4 所示。在完全辐射传递解决方案中,前景物体会正确地遮住背景光轴。这种现象没有预期的那么明显,原因之一是它可以被视为相机镜头效应的一种表现形式,即光线散射发生在场景前方的一层。如果存在高频纹理物体,这种假象也会减少。
? ? ? ? ? ? ? ? ? ? ? ? ?
当遮挡物体穿过图像边界时,轴会闪烁,因为它们超出了可见采样的范围。可以通过渲染屏幕周围的扩展区域来增加可寻址样本的范围,从而减少这种假象。
最后,当垂直于光源时,光线的屏幕空间位置可能会趋向于无穷大,从而导致样品之间产生较大的分离。可通过将屏幕空间位置箝位在适当的保护带区域来减少这种情况。另外,这种影响也会向垂直方向减弱,在使用遮挡方法时会进一步减弱。
13.7 演示
本书 DVD 中的演示使用 Shader Model 3.0 进行后处理,因为所需的纹理样本数量超过了 Shader Model 2.0 的限制。不过,如图 13-5 所示,在早期的图形硬件上,通过使用模版遮蔽方法对多个通道进行帧缓冲区混合,也能实现几乎同样高效的效果。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
13.8 扩展
采样可以在较低分辨率下进行,以降低纹理带宽要求。另一种改进方法是通过随机取样改变取样模式,从而在取样密度降低时减少规则图案的伪影。
我们的方法是在着色器的单通道执行中进行后处理。在一种多通道方法中,可以执行像素着色器求和,将光源发出的同心矩形带的结果累积到连续的外部带中,其中 L(s, , ) = Li - 1(s, , ) + Li (s, , ) 。虽然这可能不太适合当前的硬件设计,但这是所需采样和计算量最小的方法。
要在光轴强度和避免过度饱和之间取得平衡,需要对衰减系数进行调整。如果有一个分析公式能使光线适应一致的图像色调平衡,那么它就能产生一种自动方法,获得一致的图像感知。例如,我们或许可以评估整个图像的平均、最小和最大照度的组合,然后应用一个校正色彩斜坡,从而避免图像过亮或过暗。
13.9 小结
我们展示了一种简单的后处理方法,它可以产生由于大气中的阴影而产生的体积光散射效果。我们扩展了现有的日光散射分析模型,将体积遮挡的贡献也包括在内,并介绍了在像素着色器中的实现方法。演示表明,这是一种实用技术,可应用于任意场景复杂度的任何动画图像。
13.10 参考资料
?
Dobashi, Y., T. Yamamoto, and T. Nishita. 2002. "Interactive Rendering of Atmospheric Scattering Effects Using Graphics Hardware."?Graphics Hardware.
Hoffman, N., and K. Mitchell. 2002. "Methods for Dynamic, Photorealistic Terrain Lighting." In?Game Programming Gems 3, edited by D. Treglia, pp. 433–443. Charles River Media.
Hoffman, N., and A. Preetham. 2003. "Real-Time Light-Atmosphere Interactions for Outdoor Scenes." In?Graphics Programming Methods, edited by Jeff Lander, pp. 337–352. Charles River Media.
James, R. 2003. "True Volumetric Shadows." In?Graphics Programming Methods, edited by Jeff Lander, pp. 353–366. Charles River Media.
Jensen, H. W., and P. H. Christensen. 1998. "Efficient Simulation of Light Transport in Scenes with Participating Media Using Photon Maps." In?Proceedings of SIGGRAPH 98, pp. 311–320.
Karras, T. 1997. Drain by Vista.?Abduction'97. Available online at?drain by vista :: pou?t.net.
Max, N. 1986. "Atmospheric Illumination and Shadows." In?Computer Graphics (Proceedings of SIGGRAPH 86)?20(4), pp. 117–124.
Mech, R. 2001. "Hardware-Accelerated Real-Time Rendering of Gaseous Phenomena."?Journal of Graphics Tools?6(3), pp. 1–16.
Mitchell, J. 2004. "Light Shafts: Rendering Shadows in Participating Media." Presentation at Game Developers Conference 2004.
Nishita, T., Y. Miyawaki, and E. Nakamae. 1987. "A Shading Model for Atmospheric Scattering Considering Luminous Intensity Distribution of Light Sources." In?Computer Graphics (Proceedings of SIGGRAPH 87)?21(4), pp. 303–310.