关于ShadowMap的各种问题

ShadowMap

Shadow Map, Shadow Acne, Normal Offset, Depth Offset, Face Culling, Gaussian Blur, EVSM

FinalImg

1. Introduction

绘制ShadowMap的时候,容易产生一些比较常见的问题,对于如何绘制出比较平滑的,较为美观的阴影效果,这里总结了一些较为常见的问题以及解决方案。

首先介绍绘制ShadowMap的基本流程,以DirectionalLight为例,在平行光的投射下,从简单的物理层面来看,不考虑二次反射等效果,被光线直接照射的部分为亮部,而光线照不到的地方就是阴影,那么在CG渲染流程中,首先,以DirectionalLight为视角,对视野范围内的所有物体进行绘制,并将深度信息储存在FrameBuffer的各通道中,类似以下效果:

depthInfo
然后再在Camera视角中,将物体的每个可见像素点转换到DirectionalLight视角的坐标系下,与刚才上图所绘制的深度信息进行比较,如果这个点的DirectionalLight视角下的深度小于FrameBuffer中的深度,说明这个点被它前面的点给挡住了,也就是说,这个点应该处于阴影中。

2. Shadow Acne

如果严格按照以上介绍内容来做的话,会得到类似于以下效果的深度比较信息(亮部为灰色,阴影部为黑色):
shadowDepth
从这张图可以预见到我们之后产生的阴影效果肯定是不堪入目的,单纯的深度比较只能从原理的角度上解决掉阴影绘制的理论问题,但不能解决实际应用层面上的一些细节问题,例如下面的这个球体,理论上它应该半面全部被照亮,半面全部在阴影之中,然而在深度比较的时候,应该被照亮的那一面上,出现了很多的网格状的表现,从像素层面分析,也就是这个表面的深度比较非常的接近,如果不加threshold几乎不能区分是否应该将这个面分为阴影部分还是照亮部分。
shadowAcne
这个现象被称作为Shadow Acne,产生Shadow Acne的原因如下图所示:
shadowAcne
图中黄色箭头表示平行光的入射方向,红色箭头为相机方向,垂直于物体表面,黄色的锯齿表示LightSpace下的深度分布,与光线垂直的部分表示在这段线上的所有点的depthLightSpace是相同的,而从positionLightSpace转换到positionCameraSpace,并进行深度测试比较的时候,就会产生上述所说的Acne现象,从像素层面来解释,就是光线产生的depthMap的分辨率不够大,导致相机视角下,物体的多个点对应到了灯光视角下的同一个点的深度,于是理论上来说,一个平面将会有一半的像素处于阴影下,一半的像素被判定为被照亮,就产生了上图所示的锯齿感。

解决Shadow Acne的方法也有很多,一般常用的方式有:Depth Bias, Normal Bias, Face Culling Trick等。

DepthBias & NormalBias

添加Bias的方法很简单,一句话概括就是将产生Shadow的Occluder与接受Shadow的Receiver人为的添加一个偏差值,下图可以很清楚的解释Bias的作用方式
ShadowBias
这个方法的核心点就是如何添加一个合理的Bias以规避Acne并且也要避免出现PeterPanning(Bias过大导致阴影与物体位置偏离太多,物体好像浮在空中一样,被称作PeterPanning),常见的取Bias方法,有根据LightDirection和物体表面的Normal来计算需要偏离多少;或者是直接将产生阴影的表面沿着物体表面的Normal方向偏移一小段距离。

Face Culling Trick

使用Face Culling Trick来解决PeterPanning的思想为:利用gl中绘制方式进行Occluder和Receiver的区分,在绘制Shadow时,Occluder使用FrontFace的绘制方式,而Receiver使用BackFace的绘制方式。

FACECULLING

下图为使用Normal Offset的方式对深度测试进行了改进,可以看出显然比没有做过修正的深度比较结果要好很多了
ShadowDepth

http://www.dissidentlogic.com/old/images/NormalOffsetShadows/GDC_Poster_NormalOffset.png

https://digitalrune.github.io/DigitalRune-Documentation/html/3f4d959e-9c98-4a97-8d85-7a73c26145d7.html

https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping

https://developer.download.nvidia.cn/presentations/2008/GDC/GDC08_SoftShadowMapping.pdf

https://mynameismjp.wordpress.com/2013/09/10/shadow-maps/

https://doc.babylonjs.com/babylon101/shadows

http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/#result---shadow-acne

https://developer.download.nvidia.cn/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf

https://docs.microsoft.com/zh-cn/windows/desktop/DxTechArts/common-techniques-to-improve-shadow-depth-maps#Moving_the_Light_Texel-Sized_Increments

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值