• 【TA-霜狼_may-《百人计划》】图形4.3 实时阴影介绍


    4.3.1 基于图片实时阴影技术

    其中的图片意为:将阴影渲染成图片

    平面投影阴影

    • 根据光的方向,把物体的每个顶点投影到平面地面上。
    • 数学原理:相似三角形
    • 缺点:
      • 只能投影到平面;
      • 投影物体必须在光线和平面之间;
        在这里插入图片描述

    投影阴影

    • 为每个阴影投影体设置一个相机
    • 把阴影投影体渲染到阴影纹理中
    • 渲染阴影接收者,并且与阴影纹理进行混合
      在这里插入图片描述

    Unity中的实现

    • Projector组件:
      • 可以设置它的参数生成一个视锥体
      • Projector会使用提供给它的材质,绘制所有在视锥体内的物体
    • 使用Render Texture生成阴影映射图,把阴影投影体绘制到阴影纹理中
    • 给Project设置物体和阴影映射图混合的材质

    阴影映射

    在这里插入图片描述
    右侧即深度图,黑色为靠近,白色为原理
    在这里插入图片描述

    1. 首先获得光照位置的深度图
    2. 在视角位置对每个像素点进行处理
    3. 将当前位置的坐标转换到由光照位置得到的深度图中并比较大小
    4. 若比之前的深度值更大,说明距离光源越远,说明被遮挡,从而形成阴影在这里插入图片描述
      第三步就是上述说到的对比比较的过程;

    4.3.2 实时阴影优化

    阴影映射问题 – 自阴影

    由于阴影映射的分辨率有限,离散的采样点以及数值上的偏差可能造成不正确的阴影效果。这就是自阴影,也被称为Z-Fighting或者阴影粉刺(Surface Acne)
    在这里插入图片描述

    解决方法:当比较深度时,为了避免表面自阴影,需要设置容错阈值:
    - 深度偏移(Depth Bias)
    - 法线偏移(Normal Bias)
    但是如果深度便宜设置过大时,会导致漏光现象。即阴影与投影者之间发生脱节,也叫做Peter Panning问题。
    在这里插入图片描述

    偏移优化

    下图左半边解释的很详细,
    采样过程中选取的点可能是红色的点,作为阴影映射中的纹素深度,但是在View采样时的深蓝色点明明对应的是同一段线段,但是相较而言深度更深了,所以会被当做阴影。解决办法就是施加一个偏移,尽量正确的反应前后关系。
    在这里插入图片描述

    Unity中的偏移优化

    • Shadow Caster 阶段基于顶点的Normal Bias;
    • 在Shadow Caster阶段, 让遮蔽物进行反向偏移;
      优点:性能高
      在这里插入图片描述

    阴影映射问题 ——走样

    从信号重建的过程来审视阴影映射:

    1. 初始采样:渲染阴影映射;
    2. 重采样:从摄像机视角对采样信号(阴影映射)重采样;

    两个阶段都会发生走样问题。

    • 阴影映射在世界空间均匀分配;
    • 视锥体内物体经过透视投影后,近大远小,近平面和远平面的像素一样;
    • 靠近观察者的元素所用到的采样点明显变少;
    • 这种误差被称为透视走样;

    在这里插入图片描述

    级联阴影映射(Cascaded Shadow Map)

    透视走样最有效的解决方案;
    把视锥体分割为多个子视锥体;
    为每个子视锥体计算独立的相等大小的阴影映射;
    在这里插入图片描述
    其中的shadow distance自定义了产生阴影的范围(原本是从近平面到远平面),减少了部分开销;

    重采样误差

    • 映射纹理是一张动态生成的纹理;

    • 滤波 —— 纹理采样误差的解决方案;

    • 滤波

      • 图像处理中,通过滤波强调一些特征或者去除图像中一些不需要的部分;
      • 滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最后在那个的输出值;
    • 阴影的滤波

      • 使用一部分阴影映射采样点来计算某个指定View采样点的最终阴影结果的方法。

    PCF滤波

    1. 从光方向生成阴影映射;
    2. 从摄像机视角进行深度测试;
    3. 当该着色点通过深度测试时,取该像素周围指定大小(滤波核)的范围。计算他们的可见平均值作为输出。在这里插入图片描述
      blocked代表周围像素不可见有42个,visible代表周围像素可见有7个,最终计算得到其阴影值

    PCF滤波的不同实现

    • 采样数K
      • 规则滤波,33 或者 55;
      • 采用Poisson Disk的形式来分布一定数量的采样点。
    • 滤波核哈数
      • 高斯函数作为滤波函数等;

    作业

    实时阴影的优化方案

    1. 针对自阴影问题利用深度偏移或者法线偏移进行调整;
    2. 针对走样问题利用级联映射方法对结果进行优化;
    3. 针对采样问题利用PCF滤波进行优化,达到更好的软阴影效果;
    4. 利用PCSS(Percetage closer soft shadows)进行软阴影实现;
    5. 针对PCSS又有了优化的VSSM(Variance Soft Shadow Mapping)
    6. 由于VSSM假设约束条件太多,出现了MSM(Moment shadow mapping 矩阵阴影映射)

    还有好多好多好多好多要学呢!Games101后半部分+202,继续加油吧!

    [1] games202:二,实时阴影Real-Time Shadows + 作业1

  • 相关阅读:
    【口罩识别】基于matlab GUI RGB滤波+YCbCr+肤色标定口罩识别【含Matlab源码 1895期】
    新手如何入门Web3?
    Linux基础命令大全
    分享35个ASP源码,总有一款适合您
    Spring Cloud Alibaba微服务第7章之负载均衡Ribbon
    React报错之Type ‘() => JSX.Element[]‘ is not assignable to type FunctionComponent
    Maven仓库的下载安装流程
    ElasticSearch快速入门实战
    portainer忘记密码之修改密码
    亚马逊收到CPSC查验通知后卖家需要怎么弄?ASTM F963标准测试 ,CPC认证
  • 原文地址:https://blog.csdn.net/weixin_42221907/article/details/126160580