[图形学] 光轴渲染 (Light Shafts)

reference:《Interactive Rendering Method for Displaying Shafts of Light》 Yoshinori Dobashi,  Tsuyoshi Yamamoto,  Tomoyuki Nishita 

本篇文章是2000年的论文,里面提到的很多硬件限制目前已经不是限制了,也就是说,文章中描述的一些问题在目前的硬件条件下并不是问题,会有更好的实现方式,不一定要遵循文章中提到的方法。

摘要

        最近,图形硬件的性能得到了提升,甚至可以在标准PC上使用了。这些进步使得研究人员可以使用硬件加速的方法来渲染更为真实的图像。大气散射效应是增强现实的重要因素之一。例如,为了显示摄影棚聚光灯或汽车前照灯产生的光轴,必须考虑到大气颗粒造成的光散射。本文的目的是开发一种利用图形硬件,以可交互的速率来显示光轴的方法。该方法利用硬件加速体绘制技术来显示光轴。

        关键词:光轴、图形硬件、大气散射、真实图像合成。

1.简介

        在计算机图形学领域,已经发展出多种依照物理现象来构造真实相片级别的图像的方法。其中,大气粒子对光的散射\吸收效应是产生真实图像的重要因素。这使得汽车前灯、路灯、摄影棚聚光灯以及穿过彩色玻璃窗的光线产生光轴称为可能。因此,人们对大气效应进行了大量的研究。这种效应的显示需要将大气粒子沿可见光散射的光强整合在一起。之前,整合的过程是通过光线追踪技术计算出来的,这是最耗时的方法之一。

        相反,最近图形映射的处理速度越来越快,此外,即便是在低端PC上也可以使用高性能图形映射。因此,硬件加速渲染的研究是真实图像合成最重要的研究领域之一。本文提出了一种利用图形硬件绘制光轴的方法。该方法利用硬件加速体绘制技术来显示光轴。大气中的阴影对增强合成图像的真实性起着非常重要的作用。物体阻挡了光源产生的部分光,从而在被照亮的体积内产生未被照亮的体积。我们的方法可以使用阴影映射的概念来处理阴影。利用该方法,可以用足够的速度生成真实的图像,用于交互式应用。由于图形硬件发展越来越快,我们相信我们的方法将在不久的将来实现光轴的实时绘制。

       本文的组织结构如下:前人使用的方法在第2节中进行了讨论;第3节中对我们的方法进行了概述;第4接种,简要地介绍了光轴的阴影模型。然后,在第5节中,提出了绘制光轴的硬件加速方法。在第6节中,用几个例子来演示我们方法的可用性。最终,在第7接种,讨论了结论和未来的工作。

2.之前的工作

        模拟大气例子散射/吸收的最简单方法之一,是根据视点的距离来衰减物体的颜色。由于该方法计算量小,易于实现,因此经常被使用。例如,标准图形API之一OpenGL实现了这一方法。但是,该方法无法显示光轴。因此,需要一种更精确的模拟物理现象的方法来创建照片级真实的图像。人们提出了许多不同的方法。

        Max提出了一种通过云层间隙显示光轴的方法,然而,这种方法仅限于平行光源。Nishita等人对其进行了改进,以便考虑到按发光强度分布的点光源。这种方法使得渲染聚光灯、汽车前照灯等发出的光轴成为可能。Rushmeier等人将光能传递方法扩展到了体积密度,并渲染了穿过窗户的光轴。最近,Jansen等人提出了一种利用光子映射的方法,提出了能在大气甚至在水下创建光轴的方法。然而,大多数这些方法都是基于光线追踪或者扫描线算法,创建单个图像至少需要几分钟。为了解决这个问题,最近有人提出了硬件加速的方法。Stam使用3D硬件纹理映射实时渲染气体。然而,这种方法侧重于显示气体现象,不适用于光轴。

        我们提出过一种硬件加速的方法,通过云的间隙绘制光轴。然而,这种方法仅限于通过云层和平行光源发出的光轴,此外,它没有考虑大气中的阴影。本文提出的方法是一种扩展的方法,可以处理点光源和阴影。

3.我们的方法的概述

       我们的方法使用硬件加速体绘制技术来显示光轴。对于绘制体积密度(如气体),使用3D纹理映射硬件是一种更有效的方法。然而,高分辨率3D纹理需要创建真实的无锯齿的光轴图像。这就需要增加纹理内存,加载如此大的3D纹理需要花费大量时间。此外,3D纹理映射硬件仍然很昂贵,并不普遍使用。因此,我们提出了一种基于二维纹理映射硬件的方法。该方法可以处理点光源/平行光元。大气中的阴影是通过使用阴影缓冲区来实现的。

扫描二维码关注公众号,回复: 5782661 查看本文章
图1 大气散射的着色模型

4.大气散射的着色模型

       人们提出了几种大气散射着色模型。我们的方法使用了Nishita等人提出的模型。本节将简要介绍着色模型。接下来,为了简单起见,让我们假设光源数目为1。对多个光源的扩展可以用一种简单的方法来实现,即通过计算每个光源的贡献并求和,得到多个光源到达视点的强度。

       图1显示了光散射计算的概念。在图1中,假设有一个点光源。一般来说,到达视点的光强可用以下方程式来表示:

       

       其中,Ieye是到达视点的强度,Iobj是物体的强度,β(t) 是视点和点p之间的大气粒子对视点和点p的衰减率,t是视点和点p之间的距离,点T是视点和物体之间的距离,Ip(t) 是从光源到达点p的光强。H(t)是一个可见性函数,如果点p处光源可见,则返回1,否则返回0。F(α)是大气粒子的相位函数,α是相位角(见图1)。假设粒子的密度是均匀时,β(t) 可由下式给出:

        

        其中,k是消光系数,ρ是粒子密度。此外,如果光源是点光源,则P(T)由如下方程给出:

        

        3式中,I(θ, φ) 是光源向点P方向发出的光强。(θ, φ)表示方向(见附录A)。如果光源是平行光源,Ip(t)=I0,其中I0是用户指定的常数。相位函数由如下式子给出:

        

         其中k是常数,此功能用于模糊大气条件。

         在式子1中,第二项表示由于大气例子而产生的散射光的总强度,并于光轴直接相关。大多数图形硬件都可以通过使用一个函数来模拟雾效来计算第一项。为了简单起见,下面让我们按照原样来表示第二个术语。下面的章节我们将解释使用硬件计算第二项的方法。

图2 渲染光轴的基本概念

5.光轴的硬件加速渲染

        首先,介绍了无阴影光轴的绘制方法。然后,描述了考虑阴影的扩展。

        5.1 光轴的渲染

       图2显示了使用图形硬件绘制光轴的方法。虚拟平面放置在视点的前面,以便整合散射光。每个虚拟平面与屏幕平行,由nuxnv网格表示(见图2)。让我们考虑散射光总强度的计算,在等式1中,对于可视光线v,Is是通过在光线和虚拟平面之间的交点处取样进行数值计算的,如果光源是点光源,则通过如下方程式得出:

        

        式中,(θk,φk)为射线V与虚拟平面K的交点方向,n为虚拟平面数,tk为视点到交点的距离,rk为光源与交点之间的距离,αk为相位角。如果光源是平行光源,则 I( θ k, φ k) = I0 且 ξ (tk) = F( α k) β (tk)。交点之间的间隔∆t在可见光V上是一个常数,因为虚拟平面是以规则的间隔放置的。

        在前面的方法中,对通过每个像素的每一条光线计算公式5,从而增加了计算时间。然而,在式5中,ξ存在强相干性,即,相邻的采样点ξ具有相似的值。这意味着使用ξ的较远的采样间距足以显示光轴。因此,我们计算并存储在虚拟平面的每个格点上。利用存储的值对每个虚拟平面上任意点的ξ值进行线性插值。该插值是使用所有图形硬件支持的Gouraud着色功能执行的。可以将ξ的值存储在查找表中。然后,可以将查找表用作虚拟平面的纹理。在这种情况下,需要多纹理功能。

        另一个方面,I(θk,φk)可能随着光源类型而有阶跃变化。例如,在聚光灯的情况下,在其截止角之外的点上,强度会突然变成零。很明显,在每个晶格点存储I(θk,φk)会在生成的图像中引入不必要的伪影。将虚拟平面细分为更细的晶格可以避免此问题,然而,这增加了计算ξ的时间。我们通过使用光照贴图纹理的思想来避免这个问题。光照贴图将光源I(θk,φk)的强度分布存储为纹理。这使得我们可以独立地控制ξ和I(θk,φk)的采样密度,因为它们以不同的方式存储。如图2所示,使用投影纹理映射技术将灯光贴图纹理投影到每个虚拟平面上。I(θk,φk)必须乘以式5中表示的ξ。这很容易通过多重纹理映射函数实现(例如,在OpenGL,纹理是使用GL_MODULATE映射的)。最后,公式5中的求和是通过渲染所有虚拟平面,并通过添加混合计算强度的组合来计算的。

        

图3 大气中的阴影计算

        5.2 大气的阴影

        当我们试图创建真实的图像时,投射在大气中粒子上的阴影非常重要。当有物体在被照亮的体积内时,非被照亮的部分也会出现在该体积内,如图3所示。为了显示这一点,我们必须确定观察光线v与虚拟平面的交点是否处在阴影中(见图3),因此必须检测虚拟平面的非照明部分。我们使用阴影映射算法的思想来实现这一点。阴影图是从光源观看的深度图像。可以通过将虚拟平面上的每个点的深度值与阴影贴图中相应深度值进行比较来计算阴影。使用图形硬件实现这一思路需要一个函数,该函数能将纹理元素与帧缓冲区中的像素值进行比较。不幸的是,许多硬件渲染引擎目前不支持这种功能。为了解决这个问题,Heidrich开发了一种方法,将阴影图存储在帧缓冲区的alpha平面中,并使用alpha测试显示阴影。但是,阴影图的深度必须存储在8位内存(或者使用高端工作站的12位内存)中。因此,该方法可能会导致精度问题,如果可以增加alpha平面的位数,该技术在将来会很有用。因此,我们通过为每个虚拟平面创建阴影纹理来实现阴影贴图的思想。

        

图4 计算阴影的算法

        图4显示了计算阴影纹理的算法。首先,如图4a所示,用于创建阴影纹理的屏幕与用于渲染最终图像的屏幕分开准备。对于阴影屏幕,相机放置在光源的位置。然后,从光源查看的所有对象的深度值写入阴影屏幕的深度缓冲区,然后禁用写入深度缓冲区。图4a右侧的图像是深度图像。接下来,如图4b所示,在使用黑色初始化阴影屏幕的帧缓冲区后,渲染一个白色的虚拟平面。这将创建一个阴影图像,其中从光源查看的虚拟平面的可见部分呈现为白色(参见图4b右侧的图像),级图像的白色部分是虚拟平面的非照明部分。然后,如图4c所示,将光照映射和阴影图像用多重混合函数进行混合。生成的图像是一个新的光照贴图,其中不亮的地方被遮罩。图像将从帧缓冲区中读取并用作新的光照贴图纹理。将新的光照贴图纹理投影到虚拟平面上,如图4d所示,最终用多重混合函数对虚拟平面进行渲染。为了实现光轴,考虑到了对每个虚拟平面重复这些过程来显示。

        5.3 图像的生成

        绘制光轴的步骤总结如下。

        对于每个光源,重复以下过程:

                对于每个虚拟平面,重复以下过程:

                a) 计算虚拟平面每个网格点的ξ

                b) 使用上一节中描述的方法创建光照贴图纹理,同时考虑阴影

                c)使用多重混合功能的投影纹理映射技术将灯光贴图纹理投影到虚拟平面上

                d)使用附加混合功能渲染虚拟平面。

        如上述程序所示,所述方法的计算成本与光源、虚拟平面和网格点的数量成正比。

       5.4 精度讨论

        该方法使用网格表示多个虚拟平面。本节讨论了基于虚拟平面和网格点数量的方法的精度。

        图5和6显示了使用不同数量的虚拟平面和网格点创建的图像的比较。 

图5 使用不同虚拟平面的图像对比(网格点数量固定,为40x40)
图6 使用不同网格点数量的图像对比(虚拟平面数量固定,为75)

        在图中,从5a到5c,虚拟平面的数量分别为15,30,75,点阵点数固定为40x40。另一图中,6a到6c,虚拟平面的数量是固定的,点阵点数分别为5x5,20x20和80x80.这些图像的计算时间也如图所示,使用NIVIDIA Geforce 256在台式电脑(pentiumii 733MHz)上进行计算,图像大小为640x480。

        图5显示,当虚拟平面的数量很小时,阴影会产生严重的走样问题(见图5的5a和5b)。这一问题可以通过增加虚拟平面的数量来避免,尽管计算成本会增加。接下来,在图6中,我们可以看到明显的差异,特别是在光源的周围。在图6a中,光散射强度比在图6b,c中弱的多。这意味着使用5x5网格无法精确采样。比较图6b,6c,在这个例子中,20x20网格似乎已经足够了。

        如这些例子所示,指定适当数量的虚拟平面和网格点非常重要。在当前的视线中,我们通过实验来确定这些数字。

        此外,我们使用图5c研究了算法各个阶段的计算时间。结果,我们发现大部分计算都花在了每个虚拟平面的阴影纹理生成上。也就是说,大约70%的计算用于阴影计算。这是因为阴影图像必须从阴影屏幕的帧缓冲区中读取,然后必须将其发送到图形硬件的纹理内存中。当图形硬件支持阴影映射方法时,这将变得不必要。

6.示例

        (此篇演示的是几个demo效果,对每张图像进行了分析。然而我看的论文里并没有找到对应的图片,所以这段就没有翻译了)

7.结论

        本文提出了一种交互式绘制光轴的方法。该方法利用硬件加速体绘制技术,包括光轴在内的真实图像是使用OpenGL生成的。我们的方法具有以下优点:

        (1) 如果只有一个光源,则以每秒几帧的速度快速创建真实图像。

        (2) 利用阴影缓冲区的概念,显示由遮挡光束的物体引起的大气中的阴影。

        (3) 大多数支持OpenGL标准功能的图形版都可以加速该方法,不需要扩展。

        (4) 考虑了大气散射的物理现象,计算到达眼睛的光强。

        未来还有一些事情可做。粒子密度分布不均匀时光轴的显示是一个有趣的课题。由于帧缓冲区中可用的精度通常为每个颜色通道8位,因此大量虚拟平面的贡献可能会导致数值上的问题。这可能会产生严重的走样问题。最后,我们确信当图形硬件支持阴影映射方法和多重纹理功能时,我们的方法将能以实时帧速率工作。

猜你喜欢

转载自blog.csdn.net/ZJU_fish1996/article/details/86915322
今日推荐