本文将从阴影产生的原理去讲解和剖析阴影过程,分享常用的几种阴影产生的方式,以及阴影的几种锯齿解决方法及优化方案。
本章一将做一些阴影效果分享和原理讲解并实现最基本的阴影。
本文分以下几个章节
(一)阴影原理和最基本的阴影实现
(二)阴影的抗锯齿优化
(三)多种阴影的生成方式
一.效果分享
相信大家从这两幅图的阴影效果就可以看出来,图一的阴影是最基本的阴影,图二的阴影是稍微处理过后的阴影 效果就比图一好很多 几乎看不到锯齿效果了。关于为什么会有锯齿以及解决锯齿的多种方案,后续都会一一提出来,下面我们来讲解基本阴影原理。
二.阴影产生的过程和原理
如下图所示,AB是地面,BC是遮挡物,在太阳D的照射下产生了阴影AB,其中光照方向为CD方向。其中我们的眼睛摄像机在位置E处,视觉方向为点到E的方向。
从该图可以分析到阴影的原理很简单,也就是要从太阳光的方向看被墙BC挡住的地方就是有阴影的,换句话说也就是在太阳空间视角下点F到D的距离大于B-C点到D 的距离,那么判定是否处于阴影范围就是通过在太阳空间下对比两者的深度。下面来说下实现的具体步骤:
1.应用阶段在D点生成一个ShadowCamea,选择正交相机,使其方向为太阳光照的方向。需要每帧计算使其方向始终处于光照方向以便动态更新。(我们通常说的光照方向是点到太阳的方向,这儿按图方向描述)
2.使用ShadowCamera渲染场景生成一个生成该camera空间下的深度图,这里要注意ShadowCamera渲染的纹理图大小和相机的可视范围大小,原则上 shadow渲染范围越小,肯定深度信息就越精确,就越不容易产生锯齿,反正如果渲染范围大了,肯定要用阴影抗锯齿算法处理。
3.在E处 也就是我们的maincam