ParallaxOcclusionMapping(后面成为POM)是一个不错的高级技术,在我看来它是至今让我印象最深刻的技术。与其说是视差,不如说准确的视线与高度图交点算法。在《Real-time Rendering》中也见过他的前身-ParallaxMapping,但是POM的精确度更高,对于斜视效果也很不错,这将让它在未来的重要技术中占有一席之地。闲话少说,还是重在实质技术。
在DX9的samples中,由ATI提高的POM案例,确实是一个不错的实践机会。看过2006的Dynamic Parallax Mapping with Soft Shadows的技术文档,也不如实际看到代码时透彻。
总体可将POM分为两部分。
在切空间中,从给定的像素位置出发,沿着视向量,找到与高程图的交点,也称为置换点。
在切空间中,从置换点出发,沿着光照方向,采集定量高程图样本,对这样本进行分析求值,得到软阴影因子。
下面细致说明两个过程,如果想要原版的技术说明文档,请到我的上传的资源中下载Dynamic Parallax Mapping with Soft Shadows的技术文档。
1. 我们需要先对我们的模型计算每个顶点的切空间基础向量(DX中带有相应接口去做,其计算方法可以google了解一下),然后用这些基础向量,可以构建从世界空间到切空间的转换矩阵。这样通过建立三角形的插值操作,在给定的单个像素中,我们能够得到这个像素的切空间矩阵,并能得到相应的在这个切空间中视向量(眼睛到该像素的向量)和光照向量。首先我们需要认识一点,在POM技术中,用到了高度图,高度图记录着该像素距离底部的最大高度。如何理解呢?假如一个平面要用POM技术,那么平面本身所在的平面是最大高度,为1.0f。然后我们给出在单位高度范围内,每个像素的高度。用单位高度范围是为了可能将高度所以伸缩。如图

对高度图有认识后,我们就可以从给定像素出发,沿着视向量,找到与高度图的交点。如图
如何沿着视向量去找交点呢,我们采用从给点像素位置出发,沿着视向量采取相应高度图的样点,然后在样点的高度和相应在视向量的高度进行比较,直到第一次发现视向量的高度低于样点高度,我们就知道在上次采样和本次采样之间发生了相交,然后我们用直线将上次样点和本次样点连接起来,就能找到与视向量的交点。这是一种近似方法,但是效果已经不错了。过程如下图:
2. 继续在刚找到的交点处,实施软阴影。如何实现软阴影,其实我们只需要一个暗化因子就可以将处于阴影区域的像素暗化,运用于整个平面就能呈现对应的软阴影!这里采用一种探索性求值的方法来计算软阴影因素。这样实现,从得到的交点处出发,朝着光源方向发出一条射线,然后在这条射线上固定采取10个样点,如果这10个样点比规定的高度要高,那么我们就会计算得到一个有效的阴影因子。对每个样点求阴影因子,然后用其中最大的因子作为该像素点的暗化因子。
如图
这样,在理论上我们已经知道怎么实施POM技术了。现在让我们实地去考查一下真实的实现方法。
在POM案例中的shader我只提其中的重点,难点出进行中文注释。
最后一句话,看的再多不如实际自己重新编写一遍体会的深!继续加油!