【计算机图形学/实时渲染】 阴影(GAMES202)

阴影

对于静态的物体,可以使用Lightmap烘焙的方法来获取物体的影子(静态阴影),而对于动态的物体,一般采用的是Shadowmap的技术。

光照贴图(Lightmap)

(1)原理:从光源的方向去烘培(离线渲染)一个物体,把结果存一张贴图里,因为离线渲染的时候,如果光线和物体之间有东西被遮挡,那么物体上该点处就会存在阴影,那么在Lightmap上就是一个阴影的值(较暗的像素)**,**然后渲染的时候直接对该物体从光照贴图里面采样即可

(2)缺点:Lightmap只能存diffuse分量(漫反射),不能存specular分量(镜面反射),且没办法做动态阴影,只适用于固定在场景中的静态物体。

优点:使用lightmap的物体不参与实时光照计算,减少了大量的开销。

阴影贴图(Shadowmap)

基本原理:该技术其实是一种渲染到纹理的技术,我们得到的这张贴图一般称作阴影贴图。Shadowmap的原理非常简单,首先是从光源的位置(视角)渲染一遍场景,将得到的深度信息写入到贴图中,然后再一次正常的渲染场景,利用我们得到的shadowmap来判断哪些着色点落在了阴影中(确定visibility)。当场景发生变化时,每一帧都需要生成一遍ShadowMap

a. Self occlusion(自遮挡):

在这里插入图片描述

一个像素对应的实际场景中的点可能有多个,只会记录最近的深度值,而其他点并未被遮挡,只是因为共用一个像素变成了阴影。shadowmap记录的深度值是离散的不是连续的。

光源与地面的夹角越小,越接近grazing angle(掠射角)的时候此问题越严重

可以通过偏移技术来解决,增加一个bias来比较片段深度,在bias之内的不判定遮挡。

使用这种方法可能会导致出现detached shadow(不接触阴影),本来应该遮挡的物体没有被计算

还有更好的一种方式是使用一种自适应偏移的方案,基于斜率去计算当前深度要加的bias;

Second-depth shadow mapping

同时记录最小的第二小的深度

SM中记录两个深度的平均值

b. Aliasing 阴影锯齿

原因是阴影贴图的分辨率低,在对阴影贴图采样时,多个不同的顶点对同一个像素采样,导致生成锯齿。

1.百分比渐进过滤(Percentage Closer Filter,PCF)技术

:从深度贴图中多次采样,每次采样坐标都稍有些不同,比如上下左右各取9个点进行采样(即一个九宫格),最后加权平均处理,就可以得到柔和的阴影。标准PCF算法采样点的位置比较规则,最后呈现的阴影还是会看出一块一块的Pattern(图块),可以采用一些随机的样本位置,比如Poisson Disk来改善PCF的效果。后面会详细阐述该方法的过程

2.级联阴影贴图(CSM):

使用多张阴影贴图,离相机近的地方使用精细的阴影贴图,离相机远的地方使用粗糙的阴影贴图,这样不仅优化了阴影效果,还保证了渲染效率

使用 Parallel-Split Shadow Maps(PSSM) 平行分片阴影贴图法,

将视锥体切割成不同和投影平面平行的深度层,并为每个深度层都生成阴影贴图,如下图所示。原理是物体距离不同,阴影贴图的采样密度也不同。生成不同的阴影贴图可以提高采样频率从而减少走样问题

c. 采样Shadowmap的时候,需要将标准设备坐标系的坐标范围由[-1,1]修正到[0,1],否则贴图的坐标范围是[0,1],会采样错误。

Percentage Closer Soft Shadows (PCSS)

先详细介绍
Percentage Closer Filter(PCF)

本身是为了抗锯齿用的,后来发现PCF还可以用来生成软阴影。

在记录深度的时候进行。not filtering the shadow map

一个着色点对应了SM上的一个像素(在该像素的内部),现在我们取

取SM上周围的NxN个像素获得深度,进行NxN次深度比较(用该着色点的深度和这NxN个SM上记录的深度值比较,如果可见就为1,不可见就为0),获得比较结果NxN的矩阵(9个非0即1的值),最后做平均得到该像素的visibility,比如0.667,再代入到实时渲染的渲染方程中进行计算。

渲染方程如下:
在这里插入图片描述

当Filtering Size越大,阴影就会越软。

PCSS的做法是,在不同位置使用不同大小的Filter,因为阴影接受物距离阴影投射物越近,阴影就越硬,距离越远就越软(因为存在半影区),见下图:
在这里插入图片描述
在这里插入图片描述

而深度图记录的就是d(Blocker),光源到投射物的距离.

此时深度图正是用点光源代替实际的面光源生成的shadow map

一个着色点连向点光源(面光源中心),取得一定区域内多个blocker的平均距离,即该着色点对应的shadow map上的像素周围的若干像素(NxN)矩阵的平均值

这里取得范围可以根据着色点连接面光源在shadow map上的“投影”大小,具体可以看下面的图:
在这里插入图片描述
然后使用这个平均值来设置合适的Filtering Size进行PCF的操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值