阴影

如何实现阴影 实现阴影的基本思想是:太阳看不见阴影。如果在光源处放置一位观察者,其视线方向与光线一致,那么观察者也看不到阴影。 他看到的每一处都在光的照射下,而那些背后的,他没有看到的物体则处在阴影中。 这里,我们需要用到光源与物体之间的距离(实际上也就是物体在光源坐标系下的深度z值)来决定物体是否可见。

如图10.21 所示,

同一条光线上有两个点P1和P2,由于P2的z值大于PI,所以P2在阴影中。

20220308_9ghxXW

我们需要使用两对着色器以实现阴影:

  1. 一对着色器用来计算光源到物体的距离
  2. 另一对着色器根据(1)中计算出的距离绘制场景。

使用一张纹理图像把(1)的结果传入(2)中,这张纹理图像就被称为阴影贴图(shadow map), 而通过阴影贴图实现阴影的方法就被称为阴影映射(shadow mapping)

阴影映射的过程包括以下两步:

  1. 将视点移到光源的位置处,并运行(1)中的着色器。这时,那些“将要被绘出'的片元都是被光照射到的,即落在这个像素上的各个片元中最前面的。 我们并不实际地绘制出片元的颜色,而是将片元的z值写入到阴影贴图中
  2. 将视点移回原来的位置,运行(2)中的着色器绘制场景。此时,我们计算出每个 片元在光源坐标系(即(1)中的视点坐标系)下的坐标,并与阴影贴图中记录的 z值比较,如果前者大于后者,就说明当前片元处在阴影之中,用较深暗的颜色 绘制。

20220308_JmXrua

上下左右调整视角