unity法线贴图制作 BUMP图改进BumpMapping介绍Mapping的有效方法

unity法线贴图制作 BUMP图改进BumpMapping介绍Mapping的有效方法

BUMP贴图改进 Bump Mapping介绍

凹凸贴图技术是一种改变物体表面纹理unity法线贴图制作,然后进行光照计算的技术。 示例包括向法线分量添加噪声,或在包含扰动值的纹理贴图中进行查找。 这是在不额外增加对象几何复杂性的情况下增加对象真实感的有效方法。 这种方法在改善物体表面细节或表面不规则性方面有显着效果。

凹凸贴图的主要类型有:法线贴图、视差贴图和浮雕贴图。 这些方法或纹理。 它们广泛用于增加模型的细节效果游戏动态,或制作特殊的画面表现效果。

最常用的是法线贴图。 一般添加法线贴图后,会扰动局部物体表面的法线,进而改变明暗关系,从而达到增加表面细节的效果。 三种贴图都用到的法线贴图也是本次介绍的重点。

法线贴图

法线贴图在pixelshading过程中记录了每个像素的法线信息,用于描述像素级的法线信息,而不是直接使用顶点和表面法线插值得到的像素法线,从而获得更好的细节表现. 法线贴图中存储的法向量是以当前像素为原点。

在计算光照时,程序会读取法线贴图,获取当前像素点的法线信息,结合光照信息进行光照计算。 使用法线贴图计算光照可以让物体表现出更丰富的细节,并随着光照方向的变化实时变化。 这是普通纹理贴图所不能表现的。

法线贴图一般是通过将高模型映射到对应的底层模型来生成的。 而金属、木头等细节丰富的物体,可以借助Photo Shop、Substance Designer等程序化软件生成相应的法线贴图。

unity法线翻转_unity法线贴图制作_法线凹凸贴图

切线空间

法线的存储一般放在模型的切线空间。

切线空间是由物体表面的切线、副切线和法线组成的几何空间。

我们在计算光照的时候,需要把光照操作的向量放到一个统一的坐标系中。 读取切线空间法线需要世界坐标到切线空间的转换矩阵或者切线空间到世界空间的转换矩阵,然后统一到同一个坐标系中再进行光照操作。

unity法线贴图制作_unity法线翻转_法线凹凸贴图

我们称由顶点法线、切线和次切线组成的矩阵为TBN矩阵。 该矩阵可以将切线空间转换为世界空间,其逆TBN-1为世界空间到切线空间。

那么切线空间相对于模型空间有什么优势呢? 为什么我们使用切线空间?

1.切线空间的使用自由度高。 如果是在模型空间,每次换模型都要换,切线空间是相对于这个点的。

2.使用切线空间轻松制作uv动画。

3.易于压缩,法线只会在[0,1]之间。 而你只需要对(1 - 切线的平方 - 短切线的平方)的值开平方,就可以求出法线的值。 模型空间的法线在[-1,1],所以无法通过TB获取。

Unity中法线贴图的压缩格式

在非移动平台上,Unity 会将法线贴图转换为 DDXRT5nm 格式。 这种格式只有两个有效通道GA通道,可以节省空间,而移动平台使用传统的RGB通道。 在DXRT5nm格式中,GA存储了对应的法线X和Y分量,z可以通过sqrt(1-x2-y2)计算。

视差贴图

但是,法线贴图存在问题。 法线贴图虽然可以模拟明暗关系,但是不能模拟遮挡关系。 最多,被遮挡的物体将被视为背光。 所以我们引入了视差贴图,可以完全隐藏后面被遮挡的部分,也可以在一定范围内调整砖块的凹凸程度。 当然,这只是用来模拟视差效果,并不能真正改变模型的表面。

视差贴图技术主要是利用模型表面的高度信息来抵消纹理,低位信息会被高位信息遮挡,所以会利用高位信息进行显示。

unity法线翻转_法线凹凸贴图_unity法线贴图制作

// 计算 uv 的偏移 delta
inline float2 ParallaxUvDelta(v2f i)
{
    // 视差贴图中描述的高度数据
    half h = tex2D(_ParallaxMap, i.uvMain).r;
    // 切线空间中的视线方向
    float3 viewDir = normalize(i.viewDir);
    // 将三维的视线向量投影到二维的 uv 平面,乘以高度数据
    // _ParallaxScale 是一个用户可调节的值,根据效果需要进行调节,防止数值太大造成视觉上的严重错误
    float2 delta = viewDir.xy / viewDir.z * h * _ParallaxScale;
    return delta;
}
float2 uvDelta = ParallaxUvDelta(i);
i.uvMain += uvDelta;
i.uvBump += uvDelta;

这里为什么要除以z分量,因为这里的z分量代表的是法线方向。 法线值越大,视线越垂直于平面,也就是偏移量小,所以需要除以z。 确定偏移量的大小,然后乘以高度效果,高度值越高,偏移量越大。

陡峭的视差贴图

陡峭的视差映射。 因为视差图通常是近似的,所以计算并不精确。 在此基础上,如果想获得更准确的结果,就需要陡峭的视差贴图。 Steep parallax mapping是一种近似解,但是比普通的视差贴图精确很多,效果也更好。 并且将对纹理坐标偏移执行合理性检查。

steep parallax mapping的基本思想是将深度划分为等距的层,然后从顶部开始采样,每次沿观察方向偏移一定的值,如果当前层的深度大于采样深度,然后停止检查并返回最后的结果。 但是效果虽然好,但是层数太多,性能开销大。

法线凹凸贴图_unity法线贴图制作_unity法线翻转

浮雕测绘

Relief mapping,contrast and parallax mapping,如果你想有更好更准确的表现数据报告,parallax mapping是不够的。 如果使用较大的 uv 偏移量,检查贴图会失真,因此我们使用浮雕贴图来表达更多细节。 , relief mapping更容易提供更多的深度unity法线贴图制作,也可以做自阴影和遮挡效果。

unity法线贴图制作_法线凹凸贴图_unity法线翻转

执行:

1.首先ray stepping,这一步和steep parallax是一样的。

2.然后找到二分法。

为什么不直接使用二分查找呢? 因为直接使用二分查找可能会遗漏较细的区域,导致结果不准确。 因此,第一步需要进行射线步进,然后我们可以使用二分查找来重新确认交点的位置。

法线凹凸贴图_unity法线贴图制作_unity法线翻转

参考

【技艺百人计划】Graphics 2.5 BUMP贴图改进

跳回百人合集