• 【计算机图形学/实时渲染】 阴影(GAMES202)


    阴影

    对于静态的物体,可以使用Lightmap烘焙的方法来获取物体的影子(静态阴影),而对于动态的物体,一般采用的是Shadowmap的技术。

    光照贴图(Lightmap)

    (1)原理:从光源的方向去烘培(离线渲染)一个物体,把结果存一张贴图里,因为离线渲染的时候,如果光线和物体之间有东西被遮挡,那么物体上该点处就会存在阴影,那么在Lightmap上就是一个阴影的值(较暗的像素)**,**然后渲染的时候直接对该物体从光照贴图里面采样即可

    (2)缺点:Lightmap只能存diffuse分量(漫反射),不能存specular分量(镜面反射),且没办法做动态阴影,只适用于固定在场景中的静态物体。

    优点:使用lightmap的物体不参与实时光照计算,减少了大量的开销。

    阴影贴图(Shadowmap)

    基本原理:该技术其实是一种渲染到纹理的技术,我们得到的这张贴图一般称作阴影贴图。Shadowmap的原理非常简单,首先是从光源的位置(视角)渲染一遍场景,将得到的深度信息写入到贴图中,然后再一次正常的渲染场景,利用我们得到的shadowmap来判断哪些着色点落在了阴影中(确定visibility)。当场景发生变化时,每一帧都需要生成一遍ShadowMap

    a. Self occlusion(自遮挡):

    在这里插入图片描述

    一个像素对应的实际场景中的点可能有多个,只会记录最近的深度值,而其他点并未被遮挡,只是因为共用一个像素变成了阴影。shadowmap记录的深度值是离散的不是连续的。

    光源与地面的夹角越小,越接近grazing angle(掠射角)的时候此问题越严重

    可以通过偏移技术来解决,增加一个bias来比较片段深度,在bias之内的不判定遮挡。

    使用这种方法可能会导致出现detached shadow(不接触阴影),本来应该遮挡的物体没有被计算

    还有更好的一种方式是使用一种自适应偏移的方案,基于斜率去计算当前深度要加的bias;

    Second-depth shadow mapping

    同时记录最小的第二小的深度

    SM中记录两个深度的平均值

    b. Aliasing 阴影锯齿

    原因是阴影贴图的分辨率低,在对阴影贴图采样时,多个不同的顶点对同一个像素采样,导致生成锯齿。

    1.百分比渐进过滤(Percentage Closer Filter,PCF)技术

    :从深度贴图中多次采样,每次采样坐标都稍有些不同,比如上下左右各取9个点进行采样(即一个九宫格),最后加权平均处理,就可以得到柔和的阴影。标准PCF算法采样点的位置比较规则,最后呈现的阴影还是会看出一块一块的Pattern(图块),可以采用一些随机的样本位置,比如Poisson Disk来改善PCF的效果。后面会详细阐述该方法的过程

    2.级联阴影贴图(CSM):

    使用多张阴影贴图,离相机近的地方使用精细的阴影贴图,离相机远的地方使用粗糙的阴影贴图,这样不仅优化了阴影效果,还保证了渲染效率

    使用 Parallel-Split Shadow Maps(PSSM) 平行分片阴影贴图法,

    将视锥体切割成不同和投影平面平行的深度层,并为每个深度层都生成阴影贴图,如下图所示。原理是物体距离不同,阴影贴图的采样密度也不同。生成不同的阴影贴图可以提高采样频率从而减少走样问题

    c. 采样Shadowmap的时候,需要将标准设备坐标系的坐标范围由[-1,1]修正到[0,1],否则贴图的坐标范围是[0,1],会采样错误。

    Percentage Closer Soft Shadows (PCSS)

    先详细介绍
    Percentage Closer Filter(PCF)

    本身是为了抗锯齿用的,后来发现PCF还可以用来生成软阴影。

    在记录深度的时候进行。not filtering the shadow map

    一个着色点对应了SM上的一个像素(在该像素的内部),现在我们取

    取SM上周围的NxN个像素获得深度,进行NxN次深度比较(用该着色点的深度和这NxN个SM上记录的深度值比较,如果可见就为1,不可见就为0),获得比较结果NxN的矩阵(9个非0即1的值),最后做平均得到该像素的visibility,比如0.667,再代入到实时渲染的渲染方程中进行计算。

    渲染方程如下:
    在这里插入图片描述

    当Filtering Size越大,阴影就会越软。

    PCSS的做法是,在不同位置使用不同大小的Filter,因为阴影接受物距离阴影投射物越近,阴影就越硬,距离越远就越软(因为存在半影区),见下图:
    在这里插入图片描述
    在这里插入图片描述

    而深度图记录的就是d(Blocker),光源到投射物的距离.

    此时深度图正是用点光源代替实际的面光源生成的shadow map

    一个着色点连向点光源(面光源中心),取得一定区域内多个blocker的平均距离,即该着色点对应的shadow map上的像素周围的若干像素(NxN)矩阵的平均值

    这里取得范围可以根据着色点连接面光源在shadow map上的“投影”大小,具体可以看下面的图:
    在这里插入图片描述
    然后使用这个平均值来设置合适的Filtering Size进行PCF的操作

  • 相关阅读:
    Cartographer构建多分辨率栅格地图的原理
    ssm及springboot整合shiro
    Command SwiftCompile failed with a nonzero exit code
    MySQL限制登陆失败次数配置
    idea未知的解决方案
    富豪父亲的用心良苦
    OpenCV学习资源
    Maven了解&运用配置
    猿创征文|计算机专业硕博研究生提高效率的10款科研工具
    docker应用部署---Tomcat的部署配置
  • 原文地址:https://blog.csdn.net/qq_42885747/article/details/125629696