关于阴影的感悟
首先是阴影产生的原因,产生阴影是由于光照不到物体,所以产生了阴影;
两种阴影
光照不到物体可以分为两种情况:
- 物体背向光,对于一个实体物体,其背向光的那一部分是接收不到直接光照的,这就是物体背面暗的原因;在计算过程中也就是使用saturate(dot(L, N))来进行计算,背面的该值为0;
- 物体与光源之间有遮挡物,遮挡物遮挡了光线的传输,导致物体接受不了直接光照,这是我们通常看到的实时阴影所计算的那一部分;在游戏领域一般采用shadow map以及shadow volume来进行实时阴影的计算,篇幅较长,先占坑,以后再补(图+代码);
第二种阴影所涉及的问题(只谈论shadow map)
shadow map最主要的问题就是精度问题:
- shadow acne是最常见的自阴影问题,通常可采用depth bias以及normal bias来解决;此时你可能觉得引入bias就解决了自阴影问题,实际上,该问题并没有解决,只是将shadow acne隐藏了,对于平面这种与光照方向成统一角度的情况,其shadow acne是真的解决了;对于球体这种与光照方向成变化角度的情况,其shadow acne实际上是隐藏到了第一种阴影中,一般情况下不会表现出来,特殊情况下可能会表现出来;
- 软阴影是使用shadow map所需要考虑的第二种问题,常使用的方法有PCF、VSM、ESM、PCSS等(也先不展开);
- cascade shadow map是大场景中使用shadow map所要经常使用的技术(原理知道,没具体实现过,也先不展开);
特殊情况下的shadow acne问题
掐表难免说过shadow acne实际上是隐藏到了第一种阴影中,那么什么特殊情况会暴露出来呢?答案就是第一种阴影被照亮的情况;
理论上每个光源都会产生自己的阴影,但是在手机平台上可能会使用多个光源,但使用上只有主平行光才投射阴影;倘若想要使用这个阴影去影响其他光照(比如边缘光,或者将第一种阴影照亮的光),这是典型的错误用法,但为了美术效果有时候确实需要这么使用,此时隐藏的shadow acne问题就会暴露出来(等再次整理这篇文章时放图);