• 实施阴影介绍


    平面投影阴影

    根据光的方向,把物体的每个顶点投影到平面地面.上。、

    数学原理:相似三角形

    缺点:只能投影到平面,投影物体必须在光线和平面之间

    投影阴影

    为每个阴影投影体设置一 个相机,把阴影投影体渲染到阴影纹理中,渲染阴影接收者,并且与阴影纹理进行混合


    在Unity中实现:

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

    阴影映射

    右侧未深度图,记录每个像素点的深度值,颜色越深表示离摄像机越近,白色区域表示天空盒。

    阴影映射的核心思想:在阴影中的像素不可见,也就是说阴影中的像素深度值大于在阴影映射中像素的深度值。

    流程:首先从关照视角生成阴影映射,再从摄像机视角生成整个场景物体,将摄像机坐标系转换为阴影映射坐标系后,对两张纹理进行深度猜测是,如果摄像机视角中像素深度值大于阴影映射中像素深度值,则该像素属于阴影。

    Unity中的屏幕空间阴影映射

    1.渲染屏幕空间的深度贴图;
    2.从光源的方向渲染阴影映射;
    3.在屏幕空间做一次阴影收集计算(Shadows Collector),这次计算会得到一-张屏幕空间阴影纹理;
    4.在绘制物体的时候,用物体的屏幕坐标uv,采样3中生成的屏幕空间阴影贴图。

    影影映射在一帧中做的工作

    阴影映射的优化

    自阴影问题

    由于阴影映射的分辨率有限,离散的采样点以及数值.上的偏差可能造成不正确的自阴影,也被称为Z- Fighting或者阴影粉剌(Surface Acne)

    当比较深度时,为了避免表面自阴影,需要设置容错阈值
    ●深度偏移(Depth Bias)
    ●法线偏移(Normal Bias)
    但当深度偏移设置过大时,会导致漏光现象。即阴影与投影者之间发生脱节,也叫做Peter Panning问题。

    自阴影
    漏光现象​​​​​

     

    自阴影与阴影瑕疵​​​

    深度偏移:增加深度偏移会使该像素向光源靠近;
    法线偏移:沿表面法线方向向外偏移;
    偏移单位是是阴影映射的纹素;
    在Shadow Receive计算阶段,逐像素进行;
    只会在阴影深度测试使使用,不会影响真实场景。

    Unity中的偏移优化

    在升程文丽阶段做偏移,让遮蔽物进行反向偏移,即减去偏移量,这样性能更高

     

    走样问题

    以信号重建的过程来审视阴影映射:
    ●初始采样:渲染阴影映射;
    ●重采样:从摄像机视角对采样信号(阴影映射)重采样。

    透视走样

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

     解决方案:级联阴影映射

    把视锥体分割为多个子视锥体;为每个子视锥体计算独立的相等大小的阴影映射;

     重采样误差

    阴影映射是一张动态生成的纹理;滤波——纹理采样误差的解决方案

    滤波
    ●图像处理中,通过滤波强调一些特征或者去除图像中一些不需要的部分;
    ●滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最终的输出值。
    阴影的滤波
    ●使用一部分阴影映射采样点来计算某个指定View采样点的最终阴影结果的方法。

     PCF滤波

    1.从光方向生成阴影映射;
    2.从view视角渲染场景,用阴影映射进行深度测试;
    3.当该着色点通过深度测试时,取该像素周围指定大小(滤波核)的范围。计算它们的可见平均值作为输出。

    PCF滤波的不同实现

    采样数K
    ●规则滤波,3*3 或5*5;
    ●采用Poisson Disk的形式来分布一定数量的采样点。
    滤波核函数
    ●高斯函数作为滤波函数。

    Unity阴影映射优化总结

    ●使用深度偏移和法线偏移解决自阴影的问题;
    ●使用级联阴影映射解决透视投影的问题;
    ●使用PCF解决重采样的问题,并且产生软阴影的效果。

    教程地址 

  • 相关阅读:
    操作系统八股文背诵版
    pyhon项目中,使用pip安装第三方插件之后,明明使用pip list可以查到,但是在项目中import时仍然找不到怎么办?
    docker笔记
    java计算机毕业设计ssm+vue招标投标系统
    Nginx监控与告警:确保服务稳定运行
    Yolo v8中的上下文管理器
    lua脚本实现redis分布式锁(脚本解析)
    ubuntu 爬虫任务相关常用命令
    8万字带你入门Rust
    Nexus 私服资源的上传下载
  • 原文地址:https://blog.csdn.net/weixin_51327051/article/details/125555508