一、Bump Mapping介绍
凹凸贴图映射技术是对物体表面贴图进行变化然后进行光计算的一种技术。例如给法线分量添加噪音,或者在一个保护扰动值的纹理图中进行查找。这是一个提升物理真实感的有效方法,但却不需要额外的提升物体的几何复杂度。这种法式在提升物体表面的细节或者表面的不规则性方面有显著效果。
Bump Mapping分类
法线映射、视差映射、浮雕映射。这几种方法或者贴图。都是广泛的被使用,来增加模型的细节效果,或者用来做特殊的画面表现效果。
最常用的是法线映射,一般的增加法线贴图后,会对局部的物体表面进行法线扰动,进而改变明暗关系,从而达到增加表面细节的效果。
albedo normal height
二、Normal Mapping(法线映射)
Normal Map是一张存在有物体局部表面法线信息的一张贴图。再计算光照的时候,程序会读取法线图,并获取到当前像素点的法线信息,结合光线信息进行光照计算。使用法线贴图计算光照,可以让物体表现出更加丰富的细节,并随着光照方向的变换实时变化。这是普通纹理贴图不能表现出的。
法线贴图一般由高模映射到对应的低模上来生成。但像金属、木头等这些细节丰富的物体,可借助程序化的软件:PhotoShop,Substance Designer等生成对应法线贴图。
1.切线空间
法线的存储,一般会放到模型的切线空间中。切线口空间是以物体表面的切线,副切线和法线组成的几何空间。
当我们计算光照时,需要把光照运算的响亮放到统一坐标系下。读取切线空间法线,需要世界坐标转切线空间的转换矩阵或切线空间住按世界空间的转换矩阵,将向量统一到同一坐标系后再进行光照操作。
2.世界和切线空间转换
将世界坐标系下的定点发现(Normal)和切线(Tangent)以及副切线(Bitangent)作为切线空间坐标系的正交基。并用这三个向量的标准正交基来构建转换矩阵。对应关系为法线作为Z轴,切线作为X轴,副切线作为Y轴。
构建一个3*3的矩阵来做空间向量的坐标系转换。一般的叫该矩阵为TBN矩阵。其逆矩阵就是从切线空间到世界空间的转换矩阵机位TBN-1,因为TBN为正交矩阵,所以其你矩阵为TBN的
3.Unity中法线贴图的压缩格式
在Unity中,非移动平台上,Unity会把法线贴图转换成DXRT5nm格式。这种格式只有两个有效通道GA通道,这样可以节省空间,而移动平台Unity使用传统的RGB通道。在DXRT5nm格式中,GA存储对应法线的x、y分量,z分量只需要通过一个简单的运算求得。
三、Parallax Mapping(视差映射)
法线映射虽然能展示较为逼真的模型表面细节,但毕竟法线映射只能改变法线进而改变光照,并不能让模型表面产生让人信服的遮挡效果。所以我们引入视差映射。
Parallax Mapping是一种类似于法线映射的技术,但是原理不同,类似法线贴图,它是用以提高模型表面细节并赋予其遮挡关系的技术。并可以和法线贴图一起使用提供令人信服的逼真的效果。
视差映射同样引进一张新的贴图——高度图,高度图一般是座位顶点位移来使用的,但模型要包涵大量的三角形才能活得比较不错的效果,否则看起来会成块状。所以如何在有限的三角面上表示逼真的令人信服的效果,这就是视差映射技术。
视差映射技术的核心是改变纹理坐标,需要一张存储模型信息的高度图,利用模型表面高度信息来对纹理进行偏移。
视差映射主要是让平面看起来立体,和法线贴图一样是欺骗眼睛的做法。
我们制作的模型在一个三角面即切线空间系啊,所有点都位于切线和副切线组成的平面内(下图水平0.0点),但实际物体要有更多的丰富细节。如右图当计算我们当前视角的片元A时,真正应该计算的是视线与物体表面的实际交点,即B点。
如何计算B点,计算B点,我们就需要知道A、B两点在平面上uv偏差。这个其实是不太好计算的。不过可以近似的求解,并可以通过一个缩放值(scale)来控制。
d=v.xy * Ha * scale / v.z
四、Steep Parallax Mapping(陡峭视差映射)
视差映射往往是近似值,所及计算结果不是准确的。再次基础上想获得更加准确的结果就需要都切视差映射,陡峭时差也是一个近似的解,但相比于普通的视差映射要精确的多,效果表现上也更好。并且会对纹理坐标偏移进行合理性检查。
陡峭视差映射的基本思想是将深度分为等距的若干层,然后从最顶端开始采样,并且每次沿着视角方向偏移一定的值,若当前层的深度大雨采样出的深度,则等值检查并返回最后的结果。
五、Relief Mapping(浮雕映射)
浮雕映射,对比与视差映射,想要有更好更准确的表现效果,视差映射是不够的,使用更大的uv偏移,视差映射就会导致失真。于是引入浮雕映射,浮雕映射更容易提供更多的深度,还可以做自阴影以及闭塞效果。
浮雕映射一般采用射线步进,和二分查找来决定uv偏移量。
第一种使用射线步进来查找可能的交点,为什么不直接用二分查找。因为直接用二分查找可能会漏掉较薄的区域导致结果不准确。所以第一步,使用射线步进来确定交点位于哪个步进内。之后在该步进内使用二分查找,快速确定交点位置。最后返回结果,偏移贴图。
六、视差遮蔽映射(Parallax Occlusion Mapping, POM)
视差遮蔽映射(POM)是陡峭视差映射的另一个改进版本。浮雕视差映射用了二分搜索法来提升结果精度,但是搜索降低程序性能。视差遮蔽映射旨在比浮雕视差映射更好的性能下得到比陡峭视差映射更好的效果。但是POM的效果要比浮雕视差映射差一些。
视差遮蔽映射简单的对陡峭视差映射的结果进行插值。
视差遮蔽映射可以使用相对较少的采样次数产生很好的结果。但视差遮蔽映射比浮雕视差映射更容易跳过高度图中的小细节,也更容易在高度图数据产生大幅度的变化时得到错误的结果。
作业
只有法线
基于Blinn-Phong下的POM
冰块
水面
云