文章参考(翻译?):https://www.pluralsight.com/blog/film-games/bump-normal-and-displacement-mapshttps://cgcookie.com/articles/normal-vs-displacement-mapping-why-games-use-normals

许多人分不清bump、normal和displacement贴图的区别,它们看起来都是做同样的事,但是问题就在于“似乎”。每种贴图看起来都可以给几何体表面创建更多的细节,有些细节是真的,有些则是假的。

Bump贴图

Bump贴图在今天看来已经是一个很古老的贴图类型了。首先要知道的是,Bump贴图创建的细节是假的。

Bump贴图使用一种非常简单的光影把戏来创建模型表面的深度错觉。Bump贴图是一个8bit的灰度图,这个灰度图里只能包含256种不同的黑白灰。这些数值会告诉3D软件两件事:凸起和凹陷。50%灰时模型表面不会有凹凸,大于50%偏向白色时会凸起,反之会凹陷。

但是要记得,Bump贴图只包含高度信息。

Bump贴图在创建毛孔或者皮肤褶皱等地方时非常有用,而且因为它只是一个灰度图,我们可以很轻松的在2D软件里去编辑,比如PhotoShop.

但是有一个缺点,因为是假的凹凸,所以当摄像机对准模型的菱角的时候会穿帮。模型的轮廓边缘是不受Bump贴图影响的。

Normal贴图

相对于Bump的劣势,Normal给出了新答案。

首先,Normal和Bump一样,创建出来的细节都是假的。Normal也是创建模型表面的深度错觉,但是和Bump不同。Bump是使用灰度图提供凹凸信息,而Normal使用RGB信息直接标记3D空间中相对应的X、Y、Z轴。这个RGB信息告诉3D软件每一个Polygon的表面法线方向。表面法线的方向,通常直接叫做法线,告诉3D软件Polygon应该怎样去渲染。

Normal贴图有三种完全不同的类型,这三种类型在2D空间中查看时也是完全不一样的。

用的最多的叫做TangentSpace法线贴图,就像它的名字一样,TangentSpace法线是基于每个面的切线方向。

它主要由三种颜色组合而成:

  • 蓝色表示法线方向的斜率
  • 红色表示左右切线方向的斜率
  • 绿色表示切线方向的上或下斜率,但是OpenGL版本中表示上,DirectX版本中表示下

所以在使用SubstancePainter导出法线时,要注意刚开始选择的法线模式,我记得在OC中要使用OpenGL版本,否则法线会出现光源在左边时是向上,在右边时向下的问题。

TangentSpace法线贴图适用于动画时会变形的物体,比如说角色动画。

ObjectSpace法线贴图是基于整个对象的,这个模式可以稍微提高显卡的计算速度,但是它也有很明显的缺点。

因为右面和左边是用不同颜色表示的,UV不能对称显示,这意味着在对称模型上会造成极大的材质空间浪费,因为即便是对称模型你也得完全的显示左右两面的UV材质。而且如果模型发生了扭曲,渲染会出错。

这里其实我没太懂,因为在我看来法线贴图是直接根据UV贴合到模型上的,不管模型怎么变化面是不会变的,那么贴图也不会变,怎么会出错呢?而且文章中提到的扭曲是twists,会出错指的是shading will appear flipped。我不太理解扭曲是怎么个扭曲法,flipped是法线方向反转还是左右反转。

我之前遇到过人物模型贴图贴上后,腹肌凸起是用法线做的,其他部分都好,但是腹肌本应该鼓起,但是渲染时候却是凹陷。当时以为是OpenGL和DirectX版本的问题,现在看来似乎还和法线模式有关系。

WorldSpace法线贴图算是最灵活的一种,因为它是基于世界坐标的,模型不能有一点点旋转,否则贴图就会出错。这么看来上面的twists应该就指的是旋转了。这种类型的贴图只适用于大型的、静态的、非对称的模型,比如环境。或者在SubstancePainter等贴图软件中临时使用,用来计算风化效果。

可以看出有别于Bump贴图,法线贴图很难在2D软件中处理。一般情况下是烘焙高模法线用于低模中,当然SubstancePainter中可以利用高度图去转为法线图,但是要注意高度图不等于法线图。

相比较下法线贴图不仅可以提高凹凸,还可以影响模型的轮廓边缘,从而创建出倒角的效果。这个听起来似乎没有什么厉害之处,但是在渲染时有无道教会对画面产生非常大的影响。我们知道真实生活中是没有完全锋利的边的,当然刀之类的除外,虽然刀再锋利也肯定不是纯粹的一条线。

那么有倒角不仅让我们的渲染更真实,而且还能产生轮廓光,非常的漂亮。

 Displacement贴图

给低模添加货真价实的细节的时候,displacement毫无疑问是王者,它会添加真实的面凹凸,通常模型的面必须细分的足够多才可以得到很好的效果。

didplacement不但可以使用高模烘焙,同样也可以使用手去绘制。和Bump图一样,它也是一个灰度图,但是不仅可以使用8-bit图,同样可以使用16-bit甚至32-bit的图,当然,使用16-bit的效果要比8-bit得到的效果要好很多。

它的缺点就是实时的创建真实面凹凸很困难,这个主要与电脑性能相关。而且极大的拖慢渲染时间。所以到底要不要使用displacement贴图要做一些判断来决定了。

总结

在一些情况下,需要合理的同时使用Bump或者Normal混合Displacement去完成一个场景。最好的方式是使用Dispalcement创建比较打的模型面,比如使用山的置换贴图,使用一个细分的平面去创建山。而利用Bump或者Norma创建细节。

总之不管用什么贴图,理解每一种贴图的优劣,然后根据情况自己去判断去怎么用就好了。

(完)

4 Comments

Leave a Reply