百人计划(图形部分)Bump Mapping(凹凸贴图映射技术)

https://space.bilibili.com/7398208

 BumpMapping介绍

物体的细节尺度

宏观尺度:

  • 特征覆盖很多像素;
  • 由顶点,三角形或者其他几何图元来表示
  • 宏观尺度上建模的例子如创造三维角色时的四肢或头部;

中观尺度:

  • 特征只覆盖几个像素;
  • 描述介于微观尺度与宏观尺度间特征,包含细节较复杂,无法使用单个三角形进行渲染;
  • 但细节又较大,能够让观察者看到几个像素以上的表面曲率变换;
  • 如:人脸皱纹,肌肉细节,衣服褶皱

微观尺度:

  • 特征小于一个像素;
  • 微观尺度在着色模型中工作,着色模型通常在像素着色器中实现,使用纹理贴图作为参数;
  • 着色模型模拟物体表面微观几何形状的相互作用;
  • 如:有光泽物体在微观尺度下光滑,漫反射物体表面在微观尺度下粗糙;
     

凹凸映射(Bump Mapping) 

就是模拟中观尺度的常用方法之一,能够让观察者感觉到比几何模型尺度更小的细节

基本概念

纹理中把尺度细节相关的信息编码进去,着色过程中用稍微受到干扰的表面代替真实表面,使表面看起来具有小尺度的细节。

原理

 Bump Mapping分类

 上图自左往右分别是只加颜色贴图,加入法线贴图(法线映射),加入高度图(视差映射)

 Normal Mapping 法线映射

基础概念

  • 法线贴图是一张存有物体局部表面发现信息的贴图
  • 计算光照时,程序读取法线图,并获取到当前像素点的法线信息,结合光线信息进行光照计算,从而让物体表现更丰富的细节,随光照方向变换出现实时的变化;
  • 使用法线贴图来计算光照,可以让物体表现出更多丰富的细节,且随着光照方向的变化而变化,这是普通的贴图做不到的。
  • 法线贴图一般由高模映射到对应的低模上来生成。对于金属、木头这类细节丰富的物体,可以借助程序化的软件,如PS、SD来生成

法线的存储,一般会放到模型的切线空间中

切线空间

切线空间是以物体表面的切线、副切线和法线组成的空间

 在计算光照时,需要把相关的向量放在统一的坐标系下进行运算。此时就需要不同空间坐标的转换矩阵(世界空间转切线空间/切线空间转世界空间)

补充:为什么一定要用切线空间?(https://www.zhihu.com/question/23706933/answer/161968056

实际上,法线本身存储在哪个坐标系中都是可以的,例如存储在世界空间、或者模型空间、或者切线空间中。

但问题是,我们并不是单纯的想要得到法线,后续的光照计算才是我们的目的。不管使用哪个坐标系,都面临着一个选择,就是最后光照计算使用的坐标系究竟是哪个。

对于切线空间,我们需要把视线方向、光照方向在顶点着色器中转换到切线空间中,然后在片元着色器对法线纹理采样后,直接进行光照计算。

世界空间和切线空间的转换

将世界坐标系下顶点的法线(Normal)、切线(Tangent)、副切线(Bitangent)作为切线空间坐标系的正交基。用这三个向量的标准正交基构建转换矩阵。对应关系为:法线方向作为z轴,切线方向作为x轴,副切线方向作为y轴

由于需要转换的都是方向向量,所以只需要构建一个3×3的旋转矩阵来进行世界空间到切线空间的转换,称为TBN矩阵

切线空间到世界空间的转换矩阵为上述TBN矩阵的逆矩阵,因为是正交矩阵,所以逆矩阵就是它的转置矩阵

切线空间的优点

  • 自由度高,若法线记录在模型空间下,则它为相对于模型的绝对法线信息,如球体的法线信息无法传递给环形物体;而切线空间下的是相对法线信息,是对当前物体法线的扰动;
  • 方便UV动画:它对现有法线扰动,当UV在模型上进行偏移时可以实现物体表面凹凸效果偏移从而实现UV动画;
  • 法线贴图重用:如立方体六个面可以使用一张法线贴图;
  • 便于压缩:由于切线空间中,其法线始终垂直于表面向外,在归一化的法线向量里,其法线值始终处于0和1之间;故而可以使用(1-T2 -B2 )1/2推导出法线的值;而模型空间里,理论上法线的值可以为负,即可以从-1到1之间,就不能只通过B和T两个值来推导法线值,必须存储三个值,从而无法实现图像压缩;
     

法线贴图在Unity中的压缩格式

在非移动平台上,会把法线贴图转化为DXRT5nm格式

这个格式只有两个有效GA通道(就是上边说的只存xy,推出z) ,分别对应法线的x、y分量可以节省空间。

在移动平台上,使用传统RGB通道。

 因为模型空间下切线的范围是-1 ~ 1,而法线纹理的通道范围是0 ~ 1,所以进行了一次映射pixel=(normal+1)/2,于是切线空间的法线值(0,0,1)对应了法线纹理中的RGB值(0.5,0.5,1),这就是法线纹理主要为蓝色的原因

在解码时会进行反向操作,先乘2再减1把映射范围从0 ~ 1变回-1 ~ 1

 视差映射 Parallax Mapping

基础概念

 视差映射主要为了赋予模型表面遮挡关系的细节。引入了一张高度图和法线贴图一起使用,来产生一些真实的效果;高度图一般视为顶点位移来使用,此时需要三角形足够多,模型足够精细,否则看起来会有块状;如果在有限的三角形面的情况下就可以使用视差映射技术。

视差映射技术

利用模型表面高度信息来对纹理进行偏移(例如:低位置的信息被高位置的信息遮挡掉了,所以会采样更高的信息)

image.png

 视差映射的实现

只改变纹路,不增加三角形

如下图,蓝色水平线为我们的模型表面,我们要让人眼看见底下凹凸不平的效果。随着视线方向看去,在模型表面A点所表现的纹理应该是在B点深度下的采样效果。

知道A的uv值的情况下,知道AB两者的偏移量即可算出B的uv值

image.png

 在获得b点坐标后,我们在采样时就不会采样A而是b,由于深度大高度小的A很容易失去被采样的机会,失去表现机会故而产生遮挡;

 陡峭视差映射

也是近似解,但比视差映射精确

基本思想是将深度等距分为若干层,从最顶层开始采样,直到当前层的深度大于采样出的深度,则返回此结果

陡视差映射的问题在于分层机制:

  • 分层多,步进次数增多,性能开销会比较大
  • 分层少,渲染出来会有比较明显的锯齿

浮雕映射

相比于视差映射,浮雕映射能够更精确地计算UV偏移量,可以提供更多的深度,还可以做自阴影和闭塞效果

下图中上边两个使用视差贴图,下边两个使用浮雕贴图

 原理

浮雕映射采用射线步进和二分查找来决定UV偏移量,射线步进和视差映射一样,通过视差步进找到近似的位置之后,再通过二分查找找到精确的偏移值

Parallax Occlusion Mapping 视差闭塞贴图

相对于浮雕贴图,不用之处在于最后一步,浮雕贴图是在确认最后步进之后进行二分查找;

视差闭塞贴图是在最后步进的两端uv值进行采样,采样之后再对这两个结果进行插值,插值的结果作为P点最终的偏移值

image.png

  • POM比起浮雕映射性能更好,同时比起视差映射也拥有更好的精确度,是一种性价比较高的选择
  • 因为POM最后一步操作是插值,相对比较平滑和连续,在非常起伏凸起的表面可能没法得到正确的结果

作业

 加法线贴图和不加的对比图

 float3 NormalMap = UnpackNormal(tex2D(_NormalMap, i.uv));
                float3x3 TBN = float3x3(i.tDirWS,i.bDirWS,i.nDirWS); 
                float3 nDir = normalize(lerp(i.nDirWS,mul(NormalMap,TBN),_UseNormal)); //lerp这样就可以调整法线强度

视差映射代码:https://zhuanlan.zhihu.com/p/164754522

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值