基于阴影图的阴影算法总结笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/himilong/article/details/52141329

在当前研究的基于阴影图的实时阴影绘制方法中,针对经典阴影图方法阴影应用于场景 绘制中阴影走样问题的研究方法,主要分为两大类。第一大类是以Perspective Shadow Maps (PSM)为基础,这类方法都是通过对阴影图重新参数化来进行反走样。另外一类方法是以 Adaptive Shadow Maps (ASM)为基础,这类方法的基本思想是提高阴影图的分辨率,来达到反走样的目的。

1.透视走样

   透视走样是由阴影图采样和屏幕图像采样不匹配引起的。对于3D图形的透视投影,在近平面容易出现一个阴影纹素对应多个屏幕像素的情况,使得近平面处阴影的边界有严重的锯齿现象。如下图所示,对于ds × ds 的像素,即阴影图的最小分辨率,所对应的视平面区域 dp 包含多个像素点,那么这些像素点就都会取相同的值,这样就产生了锯齿状的阴影边界。

                                                    

 由上图,根据三角关系dz = (Zf - Zn) ds  ,  dy = (dz * cosa) / cosB  , dp = Zn /z dy   所以  dp/ ds = (Zn * dz * cosa)/ (Z * ds * cosB) ;其中(Zn *dz)/(z* ds)称为透视走样,cosa / cosB 称为投影走样; 对于一般的阴影图, dz/ds是个常数,误差和Z成反比,所以当Z变小时误差变大,即近平面容易出现走样。

   由于透视走样与场景中的具体物体无关,所以比较容易处理;而投影走样涉及到面的法向量,与物体形状有关,处理起来比较困难。一般的阴影图只处理透视走样


2. PSM 算法

   该算法的主要思想是在透视投影后的空间中生成阴影图,从而减少走样。传统的阴影图算法是在生成了阴影图之后再进行透视变换。而PSM则先对场景在照相机视图空间进行透视变换,将场景转化为一个规则的正方体,然后再透视变换后的场景上生成阴影图,其他部分和传统的阴影图算法一致,此时近平面行静相对于远平面的场景变大,相当于增加了近平面的采样率。

                                 


2.1 光源变换

     对于平行光:

     最左边,光在场景后面的时候,变为点光源;

     图中间,光在场景前面的时候,变为反转的点光源,即深度检测的时候采取和正常情况相反的方法;

     平行光和视线平行的时候,变为视线和观察者平行的点光源;


     对于点光源:前面两种情况和上述比较类似,注意最后一种情况,变为平行光

              

                                   点光源                                                                                                                    平行光                         

   2.2  使用虚拟相机包含所有的场景物件

        如下图所示,S表示场景物体的包围盒,L表示光源的椎体,V 表示视椎体。M为L  和 V 的交集,表示可以进入视线的所有光线。H 为 M,S ,L的共同交集,表示场景中可以被看到物体;

                   

     通常投影变换会将照相机背面的物体投影到场景的无穷远处,但是有时光源在相机背后,虽然有些物体不在视线范围中,但是它的阴影却可能出现在视椎体中。

                  

      2.3  PSM算法缺点以及后续的改进算法:

       在上述2.2 中,使用虚拟相机,虽然改进了部分物件不在场景中的问题,但是也降低了阴影质量,因为视点的移动降低了阴影图的分辨率。

       PSM 的另外一个问题是阴影图的质量依赖于光源的位置

       LisPSM(light space perspective shadow maps) : 透视变换是在以光源为视点,光源方向为观察方向的空间进行的这种变换的最大优势是不改变光源的方向;

      LogPSM(logarithmic perspective shadow maps):  将对数化和透视投影相结合的方法,首先对场景进行普通的透视投影,然后对透视投后的场景沿阴影图的Y方向进行对数变换,使得阴影图沿Y方向的采样间距呈线性变化。

     该算法简单的在阴影图上施加一个修正,称为分辨率的再分配,使得最终的阴影图在2个方向具有近似相等的分辨率。

    

    2.4 存储消耗

      普通阴影图存储消耗为O((f/n) * (f/n)),  PSM为 O(f/n),  使用LogPSM 后 O(log(f/n))


3. ASM 算法思想

     ASM 通过逐层划分一张普通的阴影图,并在场景细节丰富的区域,特别是阴影边界生成新的、具有更高分辨率的子阴影图,来提高阴影质量。一般是将ASM组织为树状结构,树的每个节点为一个固定的分辨率的阴影图,对应场景中的一块区域(根节点对应整个场景)。当某个区域的阴影图无法达到误差要求时,继续细分场景,直至一个约定的状态。ASM可以使用mip-mapping 技术实现,主要有三个特点:

    1) ASM 由视点驱动,即这种树状结构随视点变化不断的更新;

    2) ASM 的内存消耗可以有效控制;

    3) ASM 是一种增量式的算法,可以动态的增加树的层数以增强阴影效果。


4. 阴影图的存储内容以及滤波处理

    根据阴影图算法,阴影图中应该存储光源到场景中物体的最近深度值,其存储精度有限。有些阴影图算法在阴影图中存放其他值,或者对阴影图进行一些处理,主要是滤波处理,达到减少锯齿。有些半透物体仅用单个深度值无法有效生成,需要存储其他内容。


Refference:

perspective shadow maps 

light space perspective shadow maps 

logarithmic perspective shadow maps

基于阴影图的阴影生成算法研究现状

一种视野驱动的实时阴影方法 


       

猜你喜欢

转载自blog.csdn.net/himilong/article/details/52141329