Shadow Volume技术

在前几篇文章里我们介绍了几种阴影渲染的方法,我们也介绍了它们的原理以及如何使用微软提供的Direct X 12 API进行处理实现对应的效果,这篇文章里我们要介绍的是Shadow Volume技术,即阴影体技术。

Shadow Volume技术的基本原理就是根据光源和遮蔽物的位置关系计算出场景中会产生阴影的区域,即阴影锥。然后对所有物体进行检测,以确定其会不会受阴影的影响。ShadowVolume最大的特点在于,它并不是利用“把物体投影到表面”的方式来产生阴影,而是去找出场景中,有哪些像素是在阴影中。

阴影体

阴影体

在Direct3D中,所有模型都是由三角形面组成,根据光源,可以绘制出阴影锥,即ShadowVolume。会和阴影锥有交集的像素,就是(1)+(2)-(3)的那些像素,也就是阴影所在的位置。

阴影体

阴影体

(1)+(2)-(3)的到的区域可以写入到模板缓存中去,将模板缓存区中的值都清除为0,在绘制(1)和(2)时使模板缓存区加一,在绘制(3)时让模板缓存区减一,最后底下三角形的区域模板缓存区都为1,其余的地方模板缓存区都为0;其中不为0的地方即存在阴影,可以把这些地方用Alpha混合绘制出阴影的效果;其中(1)(2)为正面,(3)为背面;

如何判断一个面是正面还是背面?

可以使用两种比较简单的方法,第一种靠深度值来判断,深度值较大则处于背面,第二种通过面的法线与指向光源向量之间的夹角来比较N*V>0则为正面,N*V<0则为背面;在统计是否在阴影内时有两种统计算法;

  1. Z-Pass算法
    • Z-Pass算法,对于Shadow Volume的面对视点一面(frontface),如果深度测试的结果是通过(pass),那么和这个像素对应的模板值加1。如果深度测试的结果是失败(fail),模板值不变。而对于shadowvolume的远离视点的一侧(backface),如果深度测试的结果是失败,模板值减1;如果成功,模板值不变。这种算法很容易理解,但也有缺陷,当摄像机本身处于阴影内时,Z-Pass算法会失效;
    • Z-Pass算法示意图

      Z-Pass算法示意图,紫色的为阴影对象处于模板值为2的位置

      Z-Pass算法示意图

      Z-Pass算法示意图,紫色的为阴影对象处于模板值为0的位置

  2. Z-Fail算法
    • Z-Fail算法,则解决了摄像机处于阴影内的问题,对于它的背面(backface),如果深度测试的结果是失败,模板值加1,如果深度测试的结果成功,模板值不变;对于shadowvolume的正面,如果深度测试的结果是失败,模板值减1,如果深度测试的结果是成功,模板值不变。z-pass算法的深度测试方向是从视点指向物体,而z-fail算法的深度测试方向正好相反。
    • Z-Fail算法示意图

      Z-Fail算法示意图,摄像机在阴影外面时

      Z-Fail算法示意图

      Z-Fail算法示意图,摄像机在阴影里面时

未经允许不得转载:他日重逢 » Shadow Volume技术

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

隐藏
变装