NormalMap

Unity教程之-再讲NormalMap法线贴图

上一篇文章《Unity教程之-法线贴图技术》我们简单介绍了发现贴图,还没理解的童鞋我们这篇文章继续来学习法线贴图NormalMap

首先要提到的是,什么是法线贴图,如果大家想看更专业的解释可以自行求助搜索引擎,这里我说一下我的个人理解:在游戏中,如果角色或物体模型做的越精细(面数越多),那么渲染后效果也就越好,但很多时候处于对时间成本(据说一个美术做一个高模是要花不少时间的)和游戏性能(面数越多,GPU的运算量就越大)的考虑,我们一般在游戏内使用的是底模(面数较少的模型),而通过其它的一些技术手段来达到相似的效果.而应用的最广泛的可能就要数法线贴图了.在有光照的环境下,如果物体表面是凹凸不平的,那么它在接受光照的时候在不同的区域就会呈现出不同的明暗效果来展现这种凹凸感,上两篇中我们介绍过漫反射和镜面反射的计算中我们都用到了物体表面的法线,正因为物体表面法线的不同才导致了最终光照结果的不同,如果我们能够把整个模型表面各个位置的法线映射到一张二维贴图上,然后在这张贴图上存储上法线的信息,不就可以达到通过底模+二维贴图达到高模效果了么?而这里的二维贴图就是我们所说的法线贴图.

为什么叫它法线贴图呢?它和我们之前一直使用的纹理贴图有何区别呢?纹理贴图中我们存储的是颜色值RGBA,而法线贴图里存储的是物体表面的法线,两类贴图的读取映射方式都是一致的,都是通过顶点自带信息里的texcoord里的uv坐标来读取,不过法线读取之后并不能直接使用,还要经过一些处理,我们会在后面说.

 下面在正式进入代码之前,我们先来了解几个知识点,很重要。

1.切线空间

这个概念并不是十分好理解,但只要仔细想想也是可以弄清楚的。我想大家对本地空间一定不陌生,一般美术做完的模型里面每个顶点的坐标都是本地坐标,也就是说对于模型上的各个部位共用一个一个统一的坐标原点,但有时候这样并不是很方便,比如建了一个人体模型,如果我们只是想以相对手为基准而进行一些动作,而不是坐标原点,这时候原本的本地坐标系便不再适应。我们可以以手臂为基准再建立一个坐标系。综上不难理解,之所以存在不同的坐标系,根本上是为了方便我们只考虑相关的因素,而排除不相关的因素。就像如果我想以手为基准进行一个弯手指的操作是不需要考虑我这个手指在模型空间的位置坐标的,这样有效的降低了问题的复杂度。而切线空间的概念提出也是为了方便使用法线贴图(当然了也许有其他用途)。下面结合图(图片来源CSDN作者BonChoix)来说一下:

  More

Unity教程之-浮雕凹凸贴图BumpMap与法线贴图NormalMap的区别

 

本篇unity3d教程我们来学习下浮雕凹凸贴图BumpMap与法线贴图NormalMap的区别,下面开始!

一种是Emboss Bump Map(浮雕凹凸贴图),它使用的是Height map,原理是在原始图像的基础上,对高度场图像进行复制、轻微平移、差操作。但它存在很多严重的局限性,它只能用于漫反射表面,对于镜面高光来说是不可能的。当光源直接照射在物体表面时,如果没有偏移,那么物体表面就不会出现任何凹凸现象。
DOT3 Bump Map(点乘凹凸贴图),它使用的是Normal Map,这是目前图形硬件中使用的主要方法,它不需要存储高度,只需要将表面的实际法线作为(x,y,z)向量存储在法线图中,然后可以将含有法线的凹凸纹理和经过插值的光源向量在每个象素点结合起来,可以使用点乘。它的一个优点就是可以直接用来计算凹凸块上的镜面高光 
注意在max中,BumpMap用于逐像素光照,在Gamebryo中BumpMap用于模拟顶点高度凹凸,而NormalMap才是逐像素光照。

More