欢迎光临散文网 会员登陆 & 注册

【技术美术百人计划】实时阴影渲染

2023-07-22 10:42 作者:柴郡笔记  | 我要投稿

基于图片的实时阴影


平面投影阴影:

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

  • 数学原理:相似三角形

  • 缺点:只能投射到平面上,物体必须在光与平面之间。


投影阴影

  • 为每个阴影投影体设置一个相机

  • 把阴影投影体渲染到阴影纹理中

  • 渲染阴影接收者,与阴影纹理进行混合


投影阴影——unity实现方法

  • Projector组件:

    • 可以设置一个参数生成一个视椎体

    • Projector会使用提供给他的材质,绘制所有在他视椎体内的物体

  • 用RT(RenderTexture)生成阴影映射图,把阴影投影体绘制到阴影纹理

  • 给Projector设置物体和阴影映射图混合的材质



阴影映射:

左侧阴影中的位置,在右侧光照角度一定是不可见的,这就是阴影映射


Unity中的屏幕空间阴影映射:

  1. 渲染屏幕空间的深度贴图

  2. 从光源方向渲染阴影映射

  3. 在屏幕空间做一次阴影收集计算(ShadowCollector),这次计算会得到一张屏幕空间阴影纹理

  4. 在绘制物体时,用物体的屏幕坐标uv,采样3中得到的屏幕空间阴影贴图


阴影映射的优化

  • 阴影映射自阴影问题

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

    解决方法:当比较深度时,为避免表面自阴影,设置一个容错阈值,如:深度偏移(DepthBias)、法线偏移(NormalBias)

    但当深度偏移设置过大,会导致漏光现象,即阴影与投影者发生脱节,也叫作PeterPanning问题。


    深度偏移:增加深度偏移会使该像素向光源靠近

    法线偏移:沿表面法线方向向外偏移

    偏移单位是阴影映射的纹素

    在ShadowReceive计算阶段,逐像素进行

    只会在阴影深度测试时使用,不会影响真实场景



  • 阴影映射走样问题

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

    初始采样:渲染阴影映射

    重采样:从摄像机视角对采样信号(阴影映射)重采样。


  • 透视走样的原因及其解决方案

    阴影映射在世界空间均匀分配

    视椎体内物体经过透视投影后,近大远小,近平面和远平面的像素一样

    靠近观察点的元素所用到采样点明显减少

    这种误差称之为透视走样


  • 级联阴影映射

    透视走样最有效解决方案

    把视椎体分为多个子视椎体

    为每个子视椎体计算独立的相等大小的阴影映射


  • 重采样的原因及其解决方案

    阴影映射是一张动态生成的纹理

    滤波--纹理采样误差的解决方案


    滤波:

    图像处理中,通过滤波强调一些特征或者去除图像中一些不需要的部分

    滤波是一个邻域操作算子,利用给定像素周围的像素值决定此像素最终输出值。

    阴影的滤波:

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


  • PCF滤波

    从光的方向生成阴影映射

    从view视角渲染场景,用阴影映射进行深度测试

    该点通过深度测试,取该像素周围指定大小(滤波核)的范围,计算他们的可见平均值作为输出



【技术美术百人计划】实时阴影渲染的评论 (共 条)

分享到微博请遵守国家法律