浅析阴影贴图技术在数字孪生虚拟仿真实时渲染技术上的应用
2024-10-30
阴影贴图技术在计算机虚拟仿真中通过模拟阴影效果,显著提升场景真实感与表现力,同时保证高效渲染,是图形学领域的重要技术支持。
一.阴影贴图的意义
阴影贴图作为一种实时渲染技术在计算机虚拟仿真中具有非常重要的意义。
首先,阴影是物体在光照条件下产生的自然现象,它能够为场景提供深度感和立体感,使虚拟场景更加逼真。阴影贴图通过模拟物体在光源下的阴影效果,显著提升了场景的真实感,使用户在虚拟环境中获得更加沉浸式的体验。
其次,在计算机虚拟仿真中,阴影贴图不仅增强了场景的真实感,还提升了场景的表现力。通过调整阴影的柔和度、方向、长度等参数,可以营造出不同的氛围和视觉效果,如阳光下的柔和阴影、聚光灯下的锐利阴影等。这些阴影效果能够丰富场景细节,增强场景的表现力和感染力。
再次,阴影贴图是一种高效的阴影生成方法,它利用纹理映射技术将阴影信息存储在纹理中,然后在渲染过程中根据纹理信息生成阴影效果。这种方法相比其他阴影生成方法(如光线追踪)具有更高的性能,能够在保证阴影质量的同时降低渲染开销,提升虚拟仿真的实时性和流畅性。
最后,阴影贴图技术是计算机图形学领域的重要研究内容之一。随着计算机技术的不断发展,阴影贴图技术也在不断更新和完善。通过研究阴影贴图技术,可以推动计算机图形学领域的发展和创新,为虚拟仿真、游戏开发、动画制作等领域提供更加先进的技术支持。
二.阴影贴图介绍
2.1.阴影贴图的基本原理
阴影贴图(Shadow Mapping)是一种在三维计算机图形中加入阴影的技术,也称作光照贴图(Light Mapping)。其基本原理是从光源的视角渲染场景,并生成一个深度图,即阴影贴图。这个深度图记录了从光源到场景中每个可见片段的最小深度。在后续的渲染过程中,通过比较实际片段的深度与阴影贴图中记录的深度,来判断该片段是否处于阴影中。
实现阴影贴图的基本步骤:
1.生成阴影贴图:从光源的视角渲染场景,并提取、保存深度缓冲,生成阴影贴图。这个深度图通常保存在图形卡的内存中,作为纹理使用。
2.场景渲染与阴影判断:在正常的场景渲染过程中,将每个点的坐标转换到光照空间,并与阴影贴图中的对应深度值进行比较。如果当前点的深度大于阴影贴图中记录的深度,则认为该点被其他物体遮挡,处于阴影中;否则,该点处于光照下。
2.2.常用的几种阴影贴图方式
阴影贴图有以下几种方式:
BasicShadowMap 基础阴影贴图,它通过渲染场景到一个深度贴图中,然后使用该贴图来确定光线是否被遮挡,从而产生阴影效果,性能好但质量很差,锯齿失真严重。
PCFShadowMap 百分比渐进过滤阴影贴图,通过对深度贴图进行多次采样,并平均这些采样结果来生成更平滑的阴影边缘的贴图方式,性能较差但效果比较好,改善阴影贴图边缘锯齿状失真。
PCFSoftShadowMapPCF 软阴影贴图,是PCF的改进版,增加阴影的模糊度,提供了比PCF更平滑、更柔和的阴影效果,但性能较差,需要比较好的显卡来支撑。
VSMShadowMap 方差阴影贴图,通过计算shadowmap中每个像素的深度值期望和方差来计算灰度值,从而生成阴影效果。它能够产生较为真实的阴影效果,特别是在处理多个阴影重合时表现较好。
2.3.PCF阴影贴图
PCF(Percentage Closer Filter)技术通过对阴影贴图进行采样的方式,对像素周围的多个采样点进行插值和混合,从而更加准确地确定每个像素点的阴影强度。具体而言,PCF方法将每个像素的阴影采样点划分为一个网格区域,并在每个区域内进行多个采样。通过对这些采样点的深度值进行比较和插值,可以得到一个更加平滑和准确的阴影效果。
这项技术的重点在于你去如何理解Filtering(本质上是平均)的意义。在这个过程中,Filtering的尺寸决定了阴影的软硬程度。Filtering的尺寸越大,得到的阴影越软,尺寸越小,得到的阴影越硬,如下图可见。
经过PCF之后就可以得到一个相对真实的阴影结果。
虽然PCF可以缓解阴影边缘的锯齿问题,但它只能通过模糊的方式进行处理,无法完全消除锯齿。此外,如果采样数目较大,过滤过程可能会消耗较多的时间。
2.4.VSM阴影贴图
VSM(variance shadow map)方差阴影贴图,方差阴影贴图(VSM)是一种改进的阴影映射方法,通过利用深度信息的均值和方差来实现软阴影效果。其工作流程包括以下几个步骤:
1.以光源为视点,生成场景的深度图。深度图记录了从光源到场景中每个点的最短距离。
2.计算深度分布的均值和方差:
对深度图中的每个像素,计算其周围区域内深度值的均值和方差。
3.阴影判断:
对于场景中的每个着色点,将其到光源的距离与深度图中对应像素的均值和方差进行比较。
根据比较结果,判断着色点是否处于阴影中。
4.阴影渲染:
根据阴影判断结果,对着色点进行着色,生成包含阴影效果的图像。
方差阴影贴图(VSM)的优势在于可以同时处理阴影边缘的柔和和深度偏移问题,无需额外的深度偏置调整。然而,它也可能存在浮点精度问题,尤其是在深度值范围较大的场景中。
虽然VSM能够得到不错的效果,但也存在以下两点不足之处:
1.光渗现象:当多个阴影重合时,VSM可能会出现“光渗”现象,即阴影区域之间可能会出现不必要的亮度过渡。这是由于切尔雪夫不等式所引起的。
2.计算复杂度:虽然VSM的效果良好,但其计算过程相对复杂,需要计算每个像素的深度值期望和方差,因此可能会消耗较多的计算资源。
三.联级阴影贴图
CSM(CascadedShadowMapping)联级阴影贴图之所以作为一个单独的章节来说,是由于其本身并不是一项单独的阴影贴图技术,是一个综合性的技术,解决的问题是在大场景中生成逼真的阴影效果。
3.1.CSM实现原理
1.视锥体分割
视锥体分片,光源的视锥体也被分割成多个较小的视锥体(或称为包围盒),每个视锥体覆盖一个分片。
2.阴影贴图生成
深度图渲染:
对于每个光源的视锥体分片,从光源的视角渲染场景深度,生成一个深度图(或阴影贴图)。
这个深度图记录了从光源到场景中每个可见片段的最近距离。
纹理存储:
生成的深度图被存储在纹理中,这些纹理稍后在渲染过程中用于阴影查找。
3.阴影查找与渲染
片段转换:
在实际渲染场景时,对于每个片段(即场景中的一个像素或一组像素),首先将其从视图空间转换到世界空间,然后再转换到光源空间(或称为阴影空间)。
深度比对:
使用转换后的片段位置,在相应的阴影贴图中查找对应位置的深度值。
将片段在光源空间中的深度值与阴影贴图中记录的深度值进行比较。
如果片段的深度值大于阴影贴图中的深度值,则片段被其他物体遮挡,处于阴影中;否则,片段处于光照中。
阴影应用:
根据深度比对的结果,对片段应用相应的阴影效果。
这通常涉及调整片段的颜色、亮度或其他视觉属性,以模拟阴影的存在。
4.优化与改进
级联权重:
为了在不同区域下得到精度不同的阴影,CSM通常使用不同的权重来决定采样哪部分阴影贴图。
这些权重可以根据片段到观察者的距离、光源的类型或其他因素进行动态调整。
抗锯齿技术:
为了减少阴影边缘的锯齿状失真,可以使用百分比渐进过滤(PCF)或其他抗锯齿技术。
性能优化:
通过优化渲染过程、减少不必要的计算量或使用更高效的算法,可以进一步提高CSM的性能。
3.2.Three.js怎样实现
在Three.js的Examples/jsm/csm中已经实现了CSM组件了,直接调用就行,主要是对CSM的参数要有比较深入的理解才能实现不错的效果。
主要参数及方法如下:
settings:包含CSM设置的对象。
camera:当前使用的THREE.PerspectiveCamera实例。
parent:包含所有方向光源的THREE.Object3D实例。
cascades:阴影级联的数量。
maxCascades:允许的最大级联数,应大于等于cascades。对于运行时更改级联数量很重要。
maxFar:远剪裁平面距离,即超出此距离的阴影不可见。
mode:分割方案定义(如何分割大视野)。可以是线性(uniform)、对数(logarithmic)、实用(practical)或自定义(custom)。
更多详细设置包括:shadowMapSize、shadowBias、lightIntensity、lightColor、lightDirection等。
方法
更新传递的材质的定义和统一变量,适用于需要使用CSMs的所有材质。
update():更新世界空间中的视锥体分割位置,每次渲染前调用。
updateFrustums():重新计算阴影级联的视锥体,当改变相机投影矩阵、分割模式、maxFar或shadowBias后调用。
updateCascades(cascades:number):更新阴影级联的数量,会自动重编译之前通过setupMaterial()处理的所有材质。
updateShadowMapSize(size:number):更新所有使用CSM实例的方向光的阴影贴图大小。
dispose():移除并释放CSM实例使用的所有方向光源。
具体代码片段如下,定义参数
3.3.项目使用效果
1.远景效果
2.近景效果
四.总结
不同的阴影贴图技术各有优缺点,我们可以根据具体的场景需求和性能要求选择合适的技术。在选择时,可以考虑以下因素:
1.场景的复杂性和规模:对于简单场景,可以选择实现简单且性能较高的阴影映射;对于复杂场景,可能需要考虑使用更高级的阴影技术;对于规模比较大且复杂的场景,需要采用CSM进行场景分割再应用高级阴影技术。
2.阴影效果的逼真度:如果需要高度逼真的阴影效果,可以考虑使用基于光线的阴影或VSM等技术。
3.实时性能要求:如果场景需要实时渲染,可以选择性能较高的阴影映射或PCF阴影等技术;如果实时性能要求不高,可以考虑使用计算成本较高的技术以获得更好的阴影效果。
当然阴影贴图也不是完美的方案,主要存在以下几方面的不足:
1.阴影边缘的锯齿问题:由于阴影贴图的分辨率有限,当对阴影贴图进行采样时,多个不同的顶点可能会对应到同一个像素,从而导致阴影边缘出现锯齿;虽然应用PCF等技术可以消除大部分的锯齿,但仔细看仍然会有一些锯齿存在。
2.深度比较时的偏差问题(DepthBias):在进行深度比较时,由于深度的数值精度和阴影贴图分辨率都有限,可能会出现Z-fighting的现象。为了解决这个问题,通常需要添加偏差(DepthBias),但人为设定的偏差可能会出现过小或过大的情况,分别导致Z-fighting和PeterPan的现象(即阴影不完全或偏移)。
3.阴影贴图的分辨率和深度浪费:阴影贴图的分辨率和深度设置可能过大,导致内存负载增加,同时仍然存在采样和重采样的问题。此外,如果Light视锥体设置不当,可能会导致阴影贴图的分辨率和深度在xy方向和z方向上的浪费。
综上所述,阴影贴图技术仍需不断地完善改进、推陈出新或者引入其他新型的阴影实时渲染技术,才能更加完美地模拟光照阴影,实现更加逼真的虚拟现实场景。
作者:国研数字研发中心黄伏奇