更新时间:2023-11-21 14:25
实时阴影,即计算机图形系统通过相应的阴影生成算法来实时生成显示阴影,提高图形的真实感及对复杂场景的适应性。
阴影是计算机图形学中一个很重要的部分,无论是在3D动画还是游戏里,正是通过阴影创造出了许多生动甚至奇异的视觉效果。在计算机图形世界中,正是阴影和其它各种光照的相互结合,才使得计算机可以用来为我们塑造出各种精彩异常的人物或场景。阴影的加入使得物体更加具有立体感,也有助于我们理解物体间的相互位置关系和大小。阴影分为两种:硬阴影和软阴影。
在现实世界中,阴影效应因光线被物体遮挡而产生,而在3D环境下同样通过模拟这一机制来创建阴影:将物体沿着光线的方向扩展成一个棱台,该棱台内的所有物体都处于阴影之中,它也被称为“阴影锥”或“阴影体”。GPU通过模板缓冲来判断某个物体是否在这个阴影锥内。模板缓冲好比是蜡染中的蜡层,可以遮罩住3D画面的任意区域,这样,这些区域就暂时不被绘制,之后再对整个画面作光照计算。由于阴影锥内的物体被模板缓冲遮住,光照计算并不会涉及到其中的物体,体现在视觉上就是阴影锥内的物体无法被光线“照到”,阴影效果由此诞生。实时阴影是一种相对高级的技术,在每一帧,场景中的几何体或灯光位置变动时都要计算一个叫做shadow volume 的物体。shadow volume实际是一个三维物体,是投影物体的轮廓,总是从光源方向投出。接下来,shadow volume在模板缓冲区中被渲染两次,开始时仅仅正面面对的多边形被渲染,模板缓冲区每次数值被增加。然后背面面对的多边形被渲染,模板缓冲区值被减小。一般来说,所有增加的值和减少的值将互相抵消,但是,因为场景中已经具有被渲染的正常的图元,当shadow volume被渲染时,一些像素将不能通过zbuffer测试,所有留在模板缓冲区中的值对应的像素处于阴影区。保留的模板缓冲区内容被用做一个模板,作为一个巨大的全包围的黑方块被alpha-blended到场景中,使用模板缓冲区作为模板,仅仅阴影中的像素是暗的。
实时阴影的实现方法有很多种,现在比较流行的主要是shadow mapping和shadow volume(阴影体)。前者实现起来相对简单,可以发挥现在GPU可编程流水线的能力,但是由于先天不足,shadow mapping在处理动态光源/物体的时候开销过大,经常作为一种静态场景中的廉价替代物。而Shadow volume的强项恰恰是shadow mapping的短处。