阴影图

更新时间:2022-08-25 12:10

阴影图是一种基于图像的阴影生成方法,对场景空间的复杂度依赖性很低,它的复杂度仅取决于光源数和阴影图分辨率。阴影图算法最早是由Williams提出的一种用Z缓存生成场景中物体阴影的方法。

基本信息

阴影对于真实感场景绘制具有重要的意义,不仅能够反映空间中物体之间的相互遮挡关系,也能反映遮挡物以及接收表面的几何信息,阴影的实时绘制还大大增加了场景绘制的真实度,阴影绘制技术主要有阴影图算法和阴影体算法两类,与阴影体算法相比,阴影图算法具有与场景复杂度无关、易于实现以及受图形硬件支持等优点,它在业界得到了更广泛的应用。

阴影图描绘过程

传统阴影图算法可以分为2个基本绘制过程:

1、将光源作为视点,对整个场景进行绘制。此时,仅在Z缓存中保存从光源到场景的最小深度值,从而得到一张阴影图,阴影图中的每个单元称为一个阴影纹素。在静态场景的情况下,这一步可以作为预计算部分;而在动态场景中,一旦场景中的遮挡关系发生改变,就需要实时地更新阴影图。

2、回到以相机为视点的视图中,按照传统的渲染流水线方式对场景进行绘制。不同的是,在绘制过程中要进行阴影判断,即判断某个像素是否处于场景的阴影中。若像素不在阴影中,则正常绘制;否则绘制成阴影。判断场景中某个点是否在阴影中需要用到第一次绘制的阴影图:对于场景中的某个点P,首先将其转换到以光源为视点的3D空间,得到P点在该空间下的深度值;然后与阴影图中P点对应的纹素所保存的深度值作比较,若P点深度值大于阴影图中保存的深度值,则说明P点被遮挡,处于阴影区域,否则说明不在阴影区域。通过这种简单的判断,就可以得到场景中的阴影区域。

优势

1、原理简单,实现方便。阴影图算法的基本原理比较简单,其涉及2个基本的绘制过程:阴影图生成和场景绘制。阴影图可以使用2D纹理贴图实现;场景绘制过程增加一个深度比较功能,其实现也很方便,3D图形库(如OpenGL)一般自动实现深度比较功能。

2、独立于场景复杂度。阴影图是一种基于图像的阴影生成方法,对场景空间的复杂度依赖性很低,它的复杂度仅取决于光源数和阴影图分辨率。这一点是区别于基于物体的方法的,在阴影体方法中,需要对场景中的物体进行分析,并根据物体几何特征得到其阴影体,所以场景越复杂,需要分析的物体就越多,该方法效率越低.相反,阴影图方法无需分析场景,无论对什么场景,在光源一定的情况下,只要阴影图的分辨率确定,其复杂度就确定。

3、适合GPU硬件实现。GPU是一种专门用于图形处理的硬件,其相对于CPU具有强大的浮点数运算能力和并行处理能力,所以对于处理大数据量的运算(特别是图形图像相关的任务)而言,它具有独特的优势。GPU都提供了高度的可编程性,所以一般的阴影图算法都可以移植到GPU上,以提高整体渲染速率。

缺点

1、走样问题。该问题是阴影图算法的最主要问题,原因是在深度比较过程中涉及到对阴影图的采样。如果阴影图的分辨率低于采样需求,就会产生走样,其典型的表现为锯齿状阴影边界。还有一种称为自阴影走样,是受各类数值精度的影响,包括缓存本身精度的限制和各种转换的数值精度影响而产生的;光源采样和屏幕采样的偏差也会产生这种问题,其表现为阴影中一些斑驳的色块,即光渗现象。通过提高Z缓存位数或者引入偏移因子可以改善阴影效果,但是偏移因子的确定很困难。

2、处理全向光或半球形光问题。全向光就是向整个空间发射光线的光源(如白炽灯),半球形光是向半个空间发射光线的光源。由于该类光源的视域非常大,所以处理起来比较麻烦,一般一个简单的阴影图无法保存所有的深度值,所以必须使用其他的技术来解决。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}