作者:i_dovelemon
日期:2017/04/19
来源:优快云
主题:Shadow Map, PSSM
引言
在GLB渲染库中早就集成了Shadow Map的功能,只是在较大的场景中,阴影的效果会很差。所以,我使用了在
GPU Gem 3中提到的Parallel Split Shadow Map的方法来改进。这篇文章将不会详细的讲解算法的每一个细节,主要讲述我在实现的过程中遇到的一些问题。
算法概述
PSSM的算法思路十分的简单。由于我们在渲染的时候,对于较大的场景,仅靠一张Shadow Map保存阴影信息,将会丢失很多的细节。PSSM通过将视域体划分为N个不同的部分,对每一个部分单独的生成一张Shadow Map,这样就能够比较好的保存阴影的信息。所以算法的核心是如何对视域体进行划分。PSSM的划分算法是根据Shadow Map走样的原因提出的,主要分为如下两个部分:
Cs = a Clog + (1 - a)Cuni (0 < a < 1)
其中Clog和Cunim分别是两种不同的划分机制,它们各有优缺点,PSSM将他们按比例进行组合,从而得出更佳有效的划分机制。它们的机制分别如下:
Clog = n(f/n)^(i/m) (i 表示划分区域的第几个部分, m表示总共划分的数目)
Cuni = n + (f - n) * (i / m) (i, m 同上)
当我们确定好了划分的区域之后,我们就可以为每一个区域分别渲染出一张Shadow Map,渲染Shadow Map的过程和基本Shadow Map的渲染过程一样。当我们准备好了Shadow Map之后,在实际渲染场景的时候,我们计算像素的深度,从而得出应该使用哪一张Shadow Map。