Lecture3 Real-time Shadows 1

P1 lecture 123:00 开始介绍虚幻引擎5原理 - 顾险峰 - 计算共形几何

从shaow mapping的基本知识上开始说, 然后在games101里面提到shadow mapping基本是怎么做的, 然后会在这节课里, 会多分析它(shadow mapping)的问题, 以及它对应的解决方式, 相当于是把硬阴影的绘制说清楚

然后回顾一下 shadow mapping背后的数学原理, 包括实时渲染, 离线渲染之间的基本的联系

在这里插入图片描述

  • percentage closer soft shadows(软阴影)
    大家问到软阴影怎么做呢, 那么就是PCSS就是上面这段单词

Shadow mapping

从点光源的shadow mapping开始, 要渲染点光源在场景中投射出的阴影, 该怎么做呢, 要用shadow mapping的技术

shadow mapping(介绍)

第1次pass(light pass)

games101里面提到过, 它是一个两趟的算法, 也就是说, 我会渲染这个场景, 渲染两遍, 第1遍渲染场景的时候, 我会认为我是从light所在的地方, 看向这个场景, 并且渲染所在的场景的时候, 输出一个我能看到的最浅的, 最近的深度

有了这个shadow pass以后, 之后的pass都可以用它

第2次pass

真正的从相机的位置出发, 渲染一遍整个场景, 我用这样一种方式渲染整个场景, 再配合light pass得到的shadow mapping, 可以去检测现在相机所看到的任何一个点, 是否在阴影里, 是否能被light所看到

shadow mapping是一个完全在图像空间中的算法, 它的好处就是一旦shadow map已经生成了

A image-space algorithm(完全在图像空间中的算法)

  • 优点: 一旦shadow map已经生成了, 那么shadow map可以作为场景中的一个集合表示, 为了得到阴影, 你只需要shadow map, 而不需要实际的场景的集合
  • 缺点: 1. 自遮挡现象 2.走样(会有锯齿现象)

在这里插入图片描述

步骤

对于light所看到的所有像素, 第1次记录最浅的深度, 然后把它存下来, 然后就得到了一张texture
在这里插入图片描述
第2步, 从眼睛出发, 对场景再渲染一遍, 然后对于这次我渲染的每个像素, 我都要来看, 它是否能被light照到, 如果能被light照到的话, 那它就不在阴影里(比较z的值, z b = = z a z_b == z_a zb==za; 如果它不能被light照到( z b < z a z_b < z_a zb<za), 那么它就在阴影里.

shadow mapping的问题

会发现下面图中shadow mapping后, 地板上会有一圈一圈的纹路, 这个不是采样造成的

原因:
生成了一个shadow map, 那么它肯定会有分辨率, 既然有分辨率, 那么每一个像素, 要记录一个深度, 换句话说, 在一个像素内部, 深度是一个常数,

在这里插入图片描述

渲染的时候, shadow mapping会将绿色框都记录成同一个深度值

当进行第2次渲染的时候, 会发现, 实际记录的是绿色框的深度, 会造成自遮挡现象
仔细一想, 就会觉得不对劲, 不可能存在前面的地板挡住后面的地板的情况
就是因为shadow map记录的深度, 是不连续的, 因此这样就会造成地板的自遮挡现象

问题: 有没有情况下, 不存在自遮挡问题

答: 有, 垂直照射地板的时候

问题: 什么时候自遮挡现象最严重

答: 平行于地板照射的时候, 在任天堂的塞尔达游戏中仍然会有这样的问题

解决方案

不是自己挡自己嘛? 我们避免这种情况就可以了

在进行阴影计算的时候, 不仅需要保证当前的深度比shadow map记录的深度要小, 而且要明显的比当前的深度要小

也就是说, 在黄色区域内 有东西遮挡, 那么都不算遮挡
在这里插入图片描述
在垂直的时候, 不存在自遮挡现象, 在斜着的时候, 会存在自遮挡现象, 因此我们可以在一定的容忍长度 上做点文章

如果垂直地板照射, 可以将容忍长度调整的小一点, 如果light几乎平行照射, 那么会造成深度值误差最大, 因此容忍的长度需要调整的更大

容忍的长度(bias)

引入了这个bias, 会不会产生新的问题呢?

答案: 会
在这里插入图片描述
自遮挡现象没了, 但是劳拉的的右边鞋子, 按理说, 应该是连着的, 怎么会断掉呢?
因为bias调整的太大了, 会丢失一些原本可能造成阴影的物体

工业界去解决这样的问题的方法是没有的!!!, 没有人试图完全100%去解决这个问题, 而是说需要找一个合适的bias, 使得又不会有自遮挡, 又不会有detached shadow(断掉的阴影)

工业界有一些方法, 但是基本没有人用

second-depth shadow mapping

每个像素不仅存最小深度, 而且存次小深度, 取(最小深度+ 次小深度) /2, 存到z-buffer里, 作为比较(注意:这里没有bias什么事情了)

比如极端的情况, 就算平面贴着鞋底
在这里插入图片描述
依然会被第三幅图的mid值遮挡

实际中真的没有人用, 因为对物体本身有一定限制(water tight), 不漏水的

因为记录最小, 次小, 涉及if, else 语句, 会增加计算量

注意: 在实时渲染里, 非常在意算法常数的问题

问题2(走样)

在这里插入图片描述
因为阴影有一定的分辨率, 所以对场景就有了有一定阴影的分辨率的表达方式, 如果在渲染的时候, 分辨率不够大的时候, 有可能会看到锯齿状的东西

解决方法

可以给shadow map不同位置, 不同的分辨率

数学

在这里插入图片描述

∫ Ω d x 是 用 来 对 ∫ Ω f ( x ) d x \int _\Omega dx 是用来对 \int _\Omega f(x)dx ΩdxΩf(x)dx
做归一化的

  1. 这个式子当 g ( x ) 的 g(x)的 g(x)support非常小的时候, 可以认为是近似正确的
  2. g ( x ) g(x) g(x)足够光滑的时候, 是可以的
    满足其中一种, 就会非常准确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值