【OpenGL】如何绘制Shadow

时间:2021-07-11 03:35:56

背景

  Shadow即阴影,它是光线被不透明物体遮挡而产生的黑暗区域,与光源的方向相反。

  在Blender中编辑过程中没有Shadow,只有在经过渲染后才能显示。目前有一个基于Blender的项目,要求在编辑过程中就要显示Shadow。

Shadow算法

  Shadow流行算法是shadow mapping和shadow volumn。

  因为物体和光源之间存在遮挡物,所以物体才会处在阴影中,这是shadow mapping的基本原理。无论视点如何变化,只要光源和物体相互位置不变,Shadow map就可以重复使用。具体步骤如下:

  1. 在光源坐标下对整个场景进行渲染,得到所有物体相对于光源的Depth map,这幅图每个像素值代表场景里离光源最近像素的深度值
  2. 恢复到正常位置渲染整个场景,对每个像素计算它到光源的距离,然后将这个值和Depth map相应的值进行比较,以确定这个像素点是否在阴影中。
  3. 对Shadowed fragment和Lighted fragment分别进行不同的光照计算,这样就可以得到阴影效果了。

  shadow volume基本原理是根据光源和遮挡物的位置关系计算出场景中会产生的阴影区域,然后对所有所有物体进行检测,确定其是否受阴影的影响。

  由于基于Blender的项目是一种静态场景,而且Shadow mapping相对比较简单,因此使用Shadow mapping算法即可。