您当前的位置: 首页 > 

果冻喜之郎

暂无认证

  • 6浏览

    0关注

    79博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

实施阴影介绍

果冻喜之郎 发布时间:2022-07-01 14:13:09 ,浏览量:6

平面投影阴影

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

数学原理:相似三角形

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

投影阴影

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

在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解决重采样的问题,并且产生软阴影的效果。

教程地址 

关注
打赏
1655963140
查看更多评论
立即登录/注册

微信扫码登录

0.1071s