UnityEffects(1)之shadowMap(阴影映射)
工程放在:https://github.com/aceyan/UnityEffects 使用unity5.4
场景是Scene/(1)ShadowMap
shadowMap是一种常用的阴影技术,在各大引擎中被广泛使用,Unity中自带的阴影效果也是基于shadowMap的。
为了理解这个常用技术,我们今天来造一个方形的轮子,手动在unity中实现一下shadowMap来模拟一个方向光的阴影。
一、原理:
阴影映射是一个双过程的技术:
1、 首先,场景以光源的位置为视点被渲染。每个渲染图像的像素的深度被记录在一个“深度纹理”中(这个纹理通常被称为阴影贴图)。
2、 然后,场景从眼睛的位置渲染,但是用标准的阴影纹理把阴影贴图从灯的位置投影到场景中。在每个像素,深度采样(从被投影的阴影贴图纹理)与片段到灯的距离进行比较。如果后者大,该像素就不是最靠近灯源的表面。这意味着这个片段是阴影,它在着色过程中不应该接受光照。
-------------------摘自《Cg教程_可编程实时图形权威指南》
二、实现和细节
这一段话其实已经非常简明清晰的描述了shadowMap的实现原理(Cg教程是本好书^_^),那么接下来我们就把两个过程分解开来一步一步的在unity中实现:
1、以光源位置为视点渲染深度图
1)首先创建一个camera(这里叫做LightCamera)定义光的方向,我们要使用它来将我们需要产生阴影接受阴影的物体的深度渲染到一张纹理中(下面称作depthMap),因为是我要模拟的是平行光阴影,那么LightCamera使用正交投影。
那么问题来了!有了光的方向,这个相机的位置和视锥(后面称为光锥)相关的属性怎么确定呢?
举个栗子:试想一下,现在有一个场景一个plane上面有一个cube,现在我们要进行阴影映射的第二部,也就是从视点渲染这个场景,那么需要LightCamera渲染的深度图,查询当前要渲染像素对应的深度来完成渲染。如果这时LightCamera放歪了,没有渲