Parallax Mapping

请勿转载.

clayman
Blog:http://blog.csdn.net/soilwork
[email protected]  

  

   作为实现bump map的技术之一,Parallax Mapping(视差映射)的目的同样也是让平坦表面实现凹凸效果。和Normal Mapping相比,Parallax Mapping能实现更加真实和强烈的凹凸感。

 

Parallax Mapping的思想:

       对真正高度起伏不同的凹凸表面来说,当观察它时会出现视差效果,但用平坦面表来模拟这种凹凸效果时,这种视差效果就消失了。上图中,点A对应的像素元为Ta,点B对应的为Tb。假设我们从上图所示的eye位置观察表明,对普通的纹理映射来说,应为观察矢量穿过了像素元Ta,所以我们应该看到A点。可是,观察矢量同样穿过了真实表面的B点。在实际生活中,我们观察的结果应该是看到点B,也就是看到像素元Tb。因此,对平坦表明来说,为了正确的显示点B,我们必须对Ta处的纹理坐标进行偏移,使它等于Tb。如果我们对多边形中的每个像素都进行这样的计算,视差效果也就出现了。

 

需要的数据:

       除了渲染表面所需的纹理,法线等贴图之外,为了计算像素的纹理坐标偏移值,还需要表面的高度图。当然,还需要从每个象素指向观察点的矢量。由于最终的结果是用来修改纹理坐标,所以所有的计算都在切线空间下计算。这里,需要把世界坐标下的观察矢量变换到切空间下,因此对每个顶点来说都要一个切空间坐标变换矩阵。

 

算法:

       在一般的纹理映射中,每个顶点都包含一对纹理坐标。在parallax mapping中,我们将用纹理坐标对高度图进行查找,根据所得结果对自身进行修改,最后再进行普通的纹理查找。如上图所示,纹理坐标偏移值等于点A到观察矢量的距离offset。由于从点A到观察矢量的射线和观察矢量的交点不一定在真正的几何体凹凸表面,所以parallax mapping上只是一种近似实现视差的方法。当然,可以使用其它方法获得更精确的偏移值,但这通常需要许多额外的计算,实际上在大多数情况下,这种近似已经足够好了。为了计算偏移,先要对切空间下的观察矢量进行标准化(normalized)。在切空间下,xy轴都位于切平面上V{x,y}z轴于切平面正交V{z}。接下来需要对高度图中的值进行缩放和偏移。高度图中的值在[01]之间,一般来说,需要把这个值映射到一个合适的范围内。比如对边长为 2m 的砖墙来说,假设表面水泥的厚度为 0.02m ,那么相应的缩放值应该为 0.02 / 2 = 0.01。此外,偏移值为0,那么水泥看起来是凸起的,如果为-0.01,则看起来是凹陷的。用以下公式来计算高度:

Hsb = h * s+ b

       最终,修改之后的纹理坐标就为:

Tb = Ta + V{x,y} * Hsb/ V{z}

      

    上面的公式虽然看起来是很合理的,但却有一些重要缺陷。当观察矢量和平面间的角度趋近于0时,Vz也趋近于0,结果将导致坐标偏移变的无限大,让parallax mapping方法崩溃。为了避免这种效果,只需要丢弃公式中的Vz项就可以了。当然,这同样会在精度上带来一些损失,不过实际情况下,一般不容易察觉出这些效果。

Tb = Ta + (V{x,y} * Hsb)

 

你可能感兴趣的:(算法,生活,Blog)