本讲分为两个部分
一:原理
二:实现
一:原理
(1)眼睛与光
让我们来看看一个粗糙的表面。
从远处看,你判断这个物体是粗糙的的唯一证据是在它表面上下的亮度有改变。你的大脑能够获得这些亮暗不一的图案信息,然后判断出它们是表面中有凹凸的部位。左边的一幅图就说明了这一点。你可以发现它是一个浮雕式的表面。一些矩型和字母被印入表面,但是它们摸上去就像是一个隐藏的监控器的玻璃。如果这个图像是在适当的位置上,那么它除了改变亮度,不需要再做任何其他的工作。
那么你也许会问:我是怎么知道哪些点要亮,哪些点要暗呢?这不难。绝大多数人生活在这样一种环境下——这个环境的大多数光源来自上方(译者注:比如白天主要的光来自太阳,夜晚主要的光来自天花板上的日光灯)。所以向上倾的地方就会更亮,而向下倾的地方就会更暗。所以这种现象使你的眼睛看到一个物体上亮暗区域时,可以判断出它的凹凸情况。相对亮的块被判断是面向上的,相对暗的块被判断是面向下的。所以我只需要给物体上的线条简单得上色。
如果你想要更多的证据,这里还有一幅几乎相同的图,不同于前的是它旋转了180度。所以它是前一幅图倒转的图像。那些先前看起来是凹进去的区域,现在看起来是凸出来的了。
这个时候你的大脑并没有被完全欺骗,你脑中存留的视觉印象使你仍然有能力判断出这是前一幅图,只是它的光源变了,是从小往上照的你的大脑可能强迫性地判断出它是第一幅图。事实上,你只要始终盯着它,并且努力地想像着光是从右下方向照射的,你就会理解它是凹的(译者注:因为日常生活的习惯,你会很容易把这些图形判断成凸出的图形,但是因为有了上一幅对照图的印象,你可能才会特别注意到这些图块其实还是凹入的,只是判断方法不符合我们日常生活习惯,因为这时大多数光不是从上方照射,而是从下往上照射)。
(2)法线
之前15讲提到过,法线对光的反射很重要。而一般来说 一个三角形上某点的法线就等于垂直整个三角型的法线。但是我们可以通过灰度图或者从法线贴图取得法线,达到更真实的画面效果。
二:实现
(1)与灰度图叠加
这种方式也叫fake bump mapping,假凹凸贴图。因为并没有改变物体表面点的位置或者法线。仅仅是把Bump Map叠加在已经渲染好的表面上,造成亮度上的扰动,从而让眼睛以为是凹凸的。计算复杂度是基本加减法。缺点是并不会随着光方向的改变而改变明暗区域。
(2)生成法线
由于(1)的方法有不能对光进行反应的硬伤。于是有了更逼真的方法:用高度计算法线。
高度计算法线的方法比较多,这里主要介绍的是CG里广泛采用的一种。
方法:
在对灰度图上的点采样的时候,不单取该点的高度Hg,而且取该点之右的点Hr和该点之上的点Ha
以这三个点作2个向量:第一个向量V1是(1,0,Hr - Hg) 第二个V2是(0,1,Ha - Hg)
法线为 单位化后的 v1与v2的向量积。
如果把结果储存在一张图上,那么就生成了法线贴图了。Unity3d能替我们做这些,将灰度图转换为法线贴图。就是下面的(3)
(3)Unity里高度图转法线贴图
具体步骤:
1)导入heightmap
2)选中之后将Texture Type改为Normal map
3)勾选Create from Grayscale
4)Apply
之后就看到unity里该图直接变成了呈蓝色的法线贴图。
PS:
Unity3D里自带的Bump Map Shader,即Bumped Diffuse等Shader是法线贴图的方式。也就是用的是RGB的法线贴图,一般呈蓝色。Unity自带的Shader是没有直接使用灰度图的,而提供能是灰度图转法线贴图的功能。
本文部分内容出自
http://freespace.virgin.net/hugo.elias/graphics/x_polybm.htm