GAMES202 作业1实时阴影

前言

正确的阴影对于渲染质量的提升起着举足轻重的作用。

本文作为GAMES202作业1的笔记,记录学习内容和作业完成过程。

阴影映射(Shadow Mapping)

实时阴影有两大类别,一是硬阴影,采用经典Two Pass Shadow Map方法,二是软阴影,采用PCF(Percentage Closer Filter)和PCSS(Percentage Closer Soft Shadow)两种方法。

Two Pass Shadow Map

image-20220814180740316

采用Two Pass Shadow Map方法实现硬阴影, 也就是两趟绘制阴影Shadow Map,第一遍将相机挪到光源的位置观测,
视线能看到的各最小深度就是光源能直接照射到的物体深度,如上图中浅黄色线所示;第二趟绘制时需要将相机挪到眼睛的位置再观测,得到视线与物体交点,再将该点的深度,如上图中深黄色所示,与第一趟绘制得到的该点的深度比较,如果此次得到的深度更深(或者说值更大),则判断为阴影,如果相比更浅(或者说值更小或相等),则判断为非阴影可直接着色。如下图所示,分别是两种视角下的深度图。

如下图所示,根据上述方法得到结果只有阴影和非阴影两种,实现的是轮廓分明的硬阴影。

阴影映射中存在的问题

这里的阴影映射主要存在两个问题

  • 自遮挡
  • 锯齿

自遮挡

如下图所示,在非阴影部分的平面存在一圈圈纹路,这就是由自遮挡引起。

自遮挡的原因我们可以用下面这幅图解释,我们在第一趟绘制光源视角下的深度图时,视线其实是从光源到一个个像素点的连线再延长到物体上,这就导致从不同像素射出的视线其实是离散的,投射到物体表面上并不连续,从物体表面上看表现出的就是一个个与视线垂直的区域内的深度都是一个固定值。

现在我们看下面的蓝线,我们在绘制Shadow Map时需要进行比较,先取第一趟绘制得到的深度,也就是左半边的蓝线,但由于第一次绘制的深度图离散的原因,实际我们取到的是黄色截线上面部分的那段,实际上少了黄色截线下的一小部分,这样我们在与第二趟绘制得到的着色点深度比较的时候就会发现,第二趟映射的深度是要比第一趟长的,所以我们应该将该点作为阴影处理。显然这是不对,下图中的这点是可以被光源直接照到的,并不是阴影。这就是自遮挡产生的原因。

自遮挡问题产生的直接原因还是两个深度作比较的时候,第一趟从光源绘制的深度图由于其离散性,实际上取到的值是要小于该着色点的深度。比较简单粗暴的,既然小了,那我们直接给这个值再加上一个偏移值bias就可以了。在比较的时候,将光源深度图+bais与着色点深度比较,这样就可以一定程度上解决自遮挡问题了。

关于这个bias值的选取,我们可以根据光源的倾斜角度选取。当光线垂直于物体表面时,前面说到的离散型就会消失,深度都是贴近于物体表明的没有误差,而当光线倾斜角越大时,这个离散性也就会越大,因此bias的取值可以与光线倾斜角度相关作为一个可变变量。

除此之外还有另外一种理解方式。如下图所示,黄色部分是离散后的场景,蓝色是不被误判的部分,红色是被误判为在阴影的部分,这样就会产生一道一道的黑色阴影。

img

定义bias后,相当于相机击中的点不再位于真实平面上,而是把着色点向着光源的方向平移了一段bias距离。

  • 对于误判部分: 假如我们从右上角看向这个场景,位于红色误判部分的某个着色点p,因为在做判断时要向光源方向移动bias距离,因此相当于它到光源的距离变短了,短到比shadow map上记录的最小深度还要小,那么这个就不会再被阻挡
  • 非误判部分: 上图蓝色部分,被判断不在阴影里,其中着色点往光源处移动一段距离,它的深度更小了 依旧小于shadow map上记录的最小深度,所以它依然不在阴影中
    这样之后,入射角不大的情况下几乎不会产生自遮挡现象,但是掠射角度下依然会轻微的自遮挡

利用bias进行偏移,这样看似找到了一个好办法,但其实并没有从根源解决问题,一定程度上减弱自遮挡但也产生了其他问题。运用bias方法后得到的效果如上图所示,可以看到没有一圈圈自遮挡现象,但是角色脚部的阴影却缺失了,这就是bias导致的问题,因为这个值是简单地加在比较式上,在角色脚部部分,与阴影平面本身的距离比较小,所以有可能出现bias值太大的现象,导致阴影判断错误,出现上图这样的情况。

锯齿

上图中可以看到,这个忍者的阴影边缘由明显锯齿。锯齿产生的根本原因与自遮挡类似,由光源视线射出绘制的深度图有离散性,导致多个片段对应一个纹理像素,也就会得到同一个阴影产生锯齿。工业界的解决办法是,不同位置采用不同分辨率的shadow map,或者是动态分辨率之类的技术,也可以直接用PCF生成软阴影。

Percentage Closer Soft Shadow

PCSS可以根据阴影与遮挡物之间的距离大小,实现自适应的软阴影,如下图所示,笔尖部分的阴影硬,笔杆部分的阴影就比较软。

数学基础

在数学中有很多积分不等式,但在RTR中我们更关注下面这种近似的形式。
∫ Ω f ( x ) g ( x ) d x ≈ ∫ Ω f ( x ) d x ∫ Ω d x ⋅ ∫ Ω g ( x ) d x \int_{\Omega}{f(x)g(x)}dx \approx \frac{\int_{\Omega}{f(x)dx}}{\int_{\Omega}dx} \cdot \int_{\Omega}{g(x)}dx Ωf(x)g(x)dxΩdxΩf(x)dxΩg(x)dx
上述积分近似在下面这些情况下比较准确

  • 积分域 Ω \Omega Ω比较小
  • 函数 g ( x ) g(x) g(x)比较光滑,或者说max和min差别不大

我们将上述近似方程运用到渲染方程中

image-20220814214557653

可以得到下面这个近似结果

image-20220814214628433

这个式子可以作为两部分理解,左边红色部分用于判断光线是否可见,右边部分就是不考虑是否可见的所有方向的光线积分。

同样,我们需要考虑在什么情况下该近似是比较准确的,对于渲染方程下的数学结果,我们考虑下面两种情况

  • 点光源,或者是方向光源
  • diffuse bsdf / constant radiance area lighting

PCF

PCF(Percentage Closer Filtering)本身是作为反走样的一种方法,将阴影结果进行过滤(Flitering),或者说卷积(Convolution)。注意这里并不是对shadow map卷积,因为如果对深度卷积后,首先得到的是模糊的shadow map,之后还要与着色点深

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值