基于直接光照的全局光照模拟

1、概述
  近年来,随着计算机图形图像技术在游戏、影视动西、虚拟现实、建筑漫游等领域应用的深入和普及,人们对计算机生成图形的逼真性要求越来越高。光照效果的计算是生成逼真图形的基础,要得到高度真实感的图形,不仅要计算直接光照,还需计算间接光照,获得全局光照效果。间接光照是由光线在物体之间的多次反射、折射引起的,其产生原理非常复杂,与光源特性、场景中物体的物理特性及物体问的相对空问位置等有关。因此,基于间接光照产生的物理原理的算法(如能量辐射、光影跟踪算法)计算量大、算法复杂,但目前绝大部分提供全局光照的软件都是采用这类算法,很难满足游戏、动画等实时性要求高或渲染最非常大的应用。如何实现一种既能达到一定的视觉效果,又能快速计算的方法成为研究的热点。通过光照环境贴图表示光在空间中的分布是一种较早被引入计算机图形学中用来模拟全局光照的方法。它假定物体离光源足够远,物体相对于光源可看作一个点,这样物体上每个点周围的光线分布可近似为相同的,每个点的光照效果通过对光照环境贴图积分获得。为了提高计算效率,文献[l-3]提出了用法向作为参数的球面协波函数和非线性小波表示光在空间的分布。但这种情况只适用于间接光来自很远处的情况,而且针对每幅光照环境贴图需要进行费时的预计算。文献f4J采用低阶函数拟合场景中的环境光照和间接光照分量,避免了全局光照计算,但其拟合产生的低阶重光照函数只反映了特定视点下的间接光照和环境光照。
  文献[5]提出了一种实时重建光照的方法。该方法是在演播室中建立一个大笼子,笼子上安装许多灯,通过拍摄的场景来控制每个灯的亮度和颜色,使笼内演员获得与实拍场景相似的光照效果,再通过红外技术将笼内演员合成到拍摄的场景之中,实现实时的视频合成。本文对上述方法加以改进,提出了一种从渲染的视觉效果出发、不需要借助硬件设备的模拟全局光照的方法。
  2、本文算法的原理
  直接光是从光源出发,直接照射到物体表面,由于物体问的遮挡和光源照射范围等因素,直接光照变化非常剧烈,分布很不均匀。而间接光照是由直接光照射到物体表面后,经过多次反射、折射产生的,因此。每个方向都有来自环境的间接光照,而且在空间的分布比较均匀,没有剧烈的变化,属于光照中的低频成分。由直接光照和间接光照产生的物体表面的光照效果可以统一表示为

 

  其中,x是顶点的位置;ω0是视方向;ω是入射光线方向;L是在x点的ω方向上的入射光线强度;S是可见性函数,确定沿ω方向入射到x的光线是否被遮挡;f是在x点的反射函数,对于漫反射表面,它与视角无关,而对于镜面反射表面,一旦确定了视点位置,视方向ω0将由x点的位置决定,即可表示为ω0(x)n(x)x点的法向;(ω.n(x))是入射角的余弦值。将可见性函数、反射函数和余弦函数合写为

 

  对x点周围的环境空间光线做离散采样,将积分转换为求和:

 

  通过这种离散化处理,物体上每个点J都存在一个反映其周围空间光线分布的采样图,计算每个点在每个采样方向上的L(x,ωj),运算量非常大。由于全局光照由直接光照和间接光照2个部分组成,两者在空间分布的规律不一样,一般情况下产生直接光照的光源用点光源模拟,数量非常有限,只分布在空间的几个点上,因此可以将直接光照和间接光照分别处理。直接光照可以按照下式计算:

 

  其中,BD表示直接光照效果;i表示光源的索引值;Yi表示第i个光源的位置;Li(ω(x,yi))表示第i个光源在x点在ω方向的光照强度。间接光照分布在空间各个方向,可以用一个包围物体的球(或者一个其他形状的包围盒)模拟其分布,球面上布满了光源。当间接光照主要由远处的环境产生时,L可看作只与ω有关,而与顶点位置无关,光源可简化为用一张光照环境图表示。

 

  其中,T(xω)由于只由该点所处位置的物体属性决定,与光源无关,因此可以进行预计算。按照ω进行离散化,将T(xω)的预计算结果存储后,在渲染时通过硬件支持的矩阵运算,计算TL乘积的累加和,达到非常快的渲染速度。当物体间存在较近距离的互反射,即物体相对于包围球的大小关系无法将它看作一个点时,L不仅与ω有关,还受顶点位置的影响,这时将球面进行离散采样后的每个采样点当作一个独立的光源处理,这些光源组成一个将物体包围在内的灯光阵列。利用式(4)计算这些光源的直接光照效果,如下式所示:

 

  合并直接光照和间接光照计算公式得到统一的全局光照计算公式:

 

  因此,在这种情况下,将间接光照转化为直接光照方式计算,简化了计算过程,达到了通过直接光照模拟全局光照的目的。而且在计算直接光照时,可通过GPU支持的矩阵运算来实现硬件加速,提高渲染速度。

  3、本文算法的实现
  3.1光源的位置
  球形分布光源的位置通过多面体对球形的逼近方法确定。多面体的顶点位置为光源的位置。如表1所示,多面体的基本型可以是四面体、八面体、十二面体,通过调整基本型的细分层级来控制顶点数,从而达到调节光源数量的目的,以此决定模拟的效果。球心的位置和球的半径可根据具体场景确定。光源数可根据具体应用需求,通过对渲染效果与渲染时间的折中来选取。

 

  光源的分布也可根据具体场景设定,如将光源分布在方形包围盒上,在确定形状后,类似干球面细分的过程,确定光源的位置和数量。用这种方法可模拟各种开窗的光照效果。
  3.2光源的颤色
  间接光照光源的亮度值比较小,且各光源问变化不大。光源颜色可通过多种方式确定,本文设计了如下3种光源颜色计算方法:
  (1)由用户设定2种颜色,分别对应顶部和底部的光源颜色,其余光源颜色由这两者插值产生,如顶部偏蓝、底部偏绿,其他光源颜色则为由蓝到绿的渐变色。光源按照位置的z轴坐标建立索引,每个光源的颜色计算公式为

 

  其中,L0,Ln-1分别对应顶部和底部的光源颜色;N为光源的数量。
  (2)由贴图确定光源的颜色。首先,对球面指定贴图映射方式,计算球面每个顶点的贴图坐标,再采用邻域平均法或加权邻域平均法,实现低通滤波,计算光源的颜色。邻域的大小根据邻近顶点的贴图坐标所形成的区域决定。
  (3)采用HDR(High—Dynamic—Range images)确定光源的颜色,类似于文献[5]中控制灯光的方法。由于HDR图用浮点数存储图像的RGB信息,因此更接近真实环境照明。但贴图方式无法采用常规的映射方式,其贴图坐标计算公式为

 

  其中,Nx,Ny为光源所在顶点的法向的xy分量;μv为贴图坐标。
  3.3光源的类星
  光源的类型采用了点光源、聚光源,聚光源的汇聚点设置在球心,灯光阵列中的所有光源具有共同的光照范围和衰减区域,其值町根据实际情况做调整。

  4、实验结果与讨论
  应用基于本算法开发的软件对多个场景进行了全局光照模拟渲染,通过实验发现,当模拟问接光照的光源数增加到42时,可取得比较理想的渲染效果,能满足一般的应用需要,再增加光源数后,对整体渲染效果的改善不是很明显。图I是用42个光源模拟间接光照效果的渲染图。

 

  由于一般情况下基于光影跟踪的算法比基于能量辐射的算法速度快,因此本实验只与MAX提供的光影跟踪算法做了对比测试,在渲染效果无明显差异的情况下。本算法渲染速度明显快于光影跟踪算法。所有测试在CPUP4 20 GHz、显卡为RADEON 8500l 024MB内存的计算机上完成,渲染图像的分辨率为800X600。表2中的主要光源指模拟场景中直接光照效果的光源。光影跟踪算法的光线弹跳次数设为一次,其余参数采用MAX6.0中的缺省设置。具体渲染时间
  如表2所示。图2采用了本算法渲染,设置了42个方向光模拟环境光效果,光源的颜色直接指定,同时设置了一个主光源和一个背景光;图3设置了同样的一个主光源和一个背景光,应用MAX的光影跟踪算法进行渲染。
  2种光照算法渲染效果的差异不是很明显,但图2中恐龙嘴的内部偏亮,显得不够自然,因为在实际场景中当光源位于恐龙上部时,没有直接光射进口腔内部,而且反射光也不容易进入,亮度应该偏暗。这是本算法的一个不足之处,容易在一些孔、洞或凹坑部位造成渲染效果不自然,主要原因就在于入射到这些部分的光过强,可通过增加光源数量、降低光源亮度的方法来消除。
  5、结束语
  本文针对目前全局光照算法存在的不足,讨论了用直接光照模拟全局光照的原理及其实现方法。本方法具有可利用GPU硬件加速、光源控制灵活、渲染速度快等特点。下一阶段将对通过视频序列控制光源颜色做进一步研究。

你可能感兴趣的:(游戏,算法,虚拟机,软件测试,影视)