几种凹凸贴图(Bump Mapping)的学习记录

凹凸贴图简介

凹凸贴图是纹理的一种应用,它主要用来实现类似砖块、墙体的那种凹凸不平的效果,相较于一般的纹理映射,它并不是通过纹理映射来改变材质本身的颜色,而是改变或扰动其法线的方向,而法线的方向被用在光线模型中,改变法线的方向就可以影响物体表面光照的明暗效果。因此,凹凸贴图实际上是一种欺骗式的手段,它并没有改变顶点的位置,让物体本身的模型变得凹凸不平,而是影响用户的视觉效果,让用户以为模型是凹凸不平的。凹凸贴图的实现只需要2个三角形,而不是用户误以为的复杂的模型。
凹凸贴图(Bump Mapping)的实现方法有多种,这里记录三种实现方法:法线贴图(Normal Mapping)、视差贴图(Parallax Mapping)、浮雕贴图(Relief Mapping)
凹凸贴图的效果

切线空间

在法线贴图中,需要提供两张纹理——材质纹理和法线纹理,而在视差贴图和浮雕贴图中,还需要提供一张高度图纹理。法线纹理的作用是提供一个法线信息,纹理中对应的rgb的颜色值分别代表法线向量的分量,但是,这个向量是在什么空间下的向量?首先可以设想一下,这个向量如果是世界坐标系下的合不合理?很显然,在实际的渲染中,物体是有可能作变换的,如果一个物体进行了旋转变换,那么它的法线也要作相应的变换,法线纹理存的信息就不可以直接使用,要做相应的变换。似乎这种想法并不是最优的,但如果场景中有很多静态的物体也可以考虑使用。还有一种想法是存储在模型空间下的向量,这种想法似乎可行,并且比世界坐标系下的要好很多,但是这种方法太过于依赖模型本身的细节,如果模型发生了形变,这个向量依旧需要做变换,而且复用率不高,一个模型的法线纹理不好用在其他的模型上。
那么一种更好的方式,也是绝大多数凹凸贴图中的实现方式是让法线纹理存储在切线空间下的坐标,切线空间,肯定是跟切线有关的一个空间。对于一个顶点,它的法线方向是已知的,现在需要构造一个坐标系,让这个法线方向为Z轴,再选取两条过该点的切线,作为另外两个轴,其中一条称为Tangent,另一条称为Bit-Tangent,即切线空间的基为TBN,问题是,如何选这两条切线?与法线垂直的直线有无数条,构成了一个切平面,应该选取这个平面上哪两条互相垂直的直线?对于三角网络,可以想到利用纹理坐标(u,v)来构造,关于具体的构造方法我查阅的相关资料似乎都略有不同,具体探讨可见为什么要有切线空间(Tangent Space),它的作用是什么?
使用切线空间的好处:
1.自由度高,独立于模型而存在,可以尝试用在不同的网格模型上
2.可以复用,例如一个正方体的六个面完全可以使用相同的切线坐标
3.纹理可压缩,切线空间下的Z坐标往往都是正值,因此可以在内存中只存储X、Y的坐标值,通过模长为1来计算Z的坐标值
事实上,无论采用哪种空间,只要最终能够让视线向量、光线向量、法线向量统一在一个线性空间下做与光照相关的运算就可以了,因此也没有必要拘泥于到底是哪个空间下好。但这并不意味着最终统一在哪个空间下不重要,注意这里所说的是法线信息存储在哪个空间下并不需要太钻牛角尖,而实际运算中,究竟是要将这三者统一在切线空间还是世界空间下,或者别的空间下是非常重要的。
切线空间

法线贴图原理及实现

如前文所述,法线贴图的原理就是直接指定顶点在切线空间下的法线位置,用在材质纹理下的颜色信息和法线纹理下的法线信息来做光照的相关运算。实际编码最重要的一个环节就是将视线、法线、光线统一到一个空间下。有两种方式:一是将切线空间下的法线变换到世界空间下,然后直接利用世界空间下的光线、视线做运算,这种方法比较简明,但是性能略显不足,注意对于每一个像素的法线信息都是要靠插值求得的,也就是说,这样处理每个像素的法线都要做一次线性变换到世界空间下,它的计算是逐像素的;另一种方法是将世界空间下的视线、光线都变换到切线空间下,这种处理只需要逐顶点计算。
下面我们采用第一种方式来计算,比较好处理:
现在假设我们有了TBN的值,构造了如下矩阵 [ T x B x N x T y B y N y T z B z N z ] \begin{bmatrix} Tx & Bx & Nx \\ Ty & By & Ny \\ Tz & Bz & Nz \end{bmatrix} TxTyTzBxByBzNxNyNz,这是从切线空间到世界空间的过渡矩阵,而由过渡矩阵和坐标变换的关系可知, [ T x B x N x T y B y N y T z B z N z ] ∗ [ X t Y t Z t ] = [ X w Y w

  • 13
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值