这段时间在搭好自己的框架后,就开始马不停蹄地研究阴影映射的内容了,说起阴影映射,倒不如说shadow map更容易被专业人士所接受。shadow map是我进阶图形学的第一课,以后的图形学内容,会变得非常复杂,每写一个例子,都要牵涉到非常多的算法以及代码。但是我不得不这么做,因为只有这样才能成为计算机图形学的高手。
蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/44628427。欢迎同行前来探讨。
shadow map简单地说,就是让通过计算机图形的模拟,在3D场景中产生阴影的效果。这个算法可以说很久之前就已经存在了,而随着硬件性能的提升,我们可以从帧缓存中提取阴影,然后在让其作用在我们想要产生阴影的表面上,非常简单。本例呢,就是将FBO与shadowmap结合起来,渲染一个带有阴影的场景。
要生成含有shadow map的场景,我们要进行至少两遍的渲染。要知道,阴影的形成是要有光源的。但是除了ADS(Ambient、Diffuse、Specular)渲染之外,我们只用到光源的位置以及视向(lookAt)。但是这是一个很重要的信息:我们正在创建阴影!
下面是我将FBO与shadow map结合的一些实践。
1、 FBO绑定,开始渲染到FBO;
2、 视点转移到光源位置,利用position以及lookAt生成viewMatrix;
3、 将着色器中渲染light space shadow map的深度图(有关深度图生成的shader,参照这里);
4、 FBO解除绑定,开始渲染到default render target;
5、 视点转移到摄像机,准备普通的渲染;
6、 在着色器中普通地渲染场景,同时,在需要添加阴影映射的地方使用我们的深度图作为纹理贴上去即可。
需要说明的是,这只是一个不完全的演示效果,因为只是生硬地将深度FBO纹理贴在了下面的平面上,所以深度的颜色效果还是看得出来的,并且这个程序没有做ADS光照效果,更没有做遮挡的深度比较,所以接下来需要将这个例子深入,以后添加上多纹理混合,这样效果会更好一些。最后是这个程序在Android以及Windows Phone上面的运行情况。
原文:http://blog.csdn.net/gamesdev/article/details/44628427