凹凸映射和纹理映射很是类似。然而,纹理映射是把颜色加到多边形上,而凹凸映射是把表面的凹凸信息加到多边形上。这会在多边形对象的视觉上会产生很吸引人的效果。咱们只须要添加一点信息到原本须要使用大量多边形的物体上。须要注意的是这个物体是平的,可是它看起来倒是粗糙不平的。让咱们来看看上边的那个立方体。若是你很近地观察它时,你会发现它上面的不少细节。它看起来好像是由成千上万个多边形构成的,其实它只是由6个矩形构成。你或许会问:“这和纹理映射有什么不一样?” 它们的不一样之处在于——凹凸映射是一种根据光线方向作出响应的纹理映射。html
让咱们来看看一个粗糙的表面。网络
从远处看,你判断这个物体是粗糙的的惟一证据是在它表面上下的亮度有改变。你的大脑可以得到这些亮暗不一的图案信息,而后判断出它们是表面中有凹凸的部位。上边的一幅图就说明了这一点。你能够发现它是一个浮雕式的表面。一些矩型和字母被印入表面,可是它们摸上去就像是一个隐藏的监控器的玻璃。若是这个图 像是在适当的位置上,那么它除了改变亮度,不须要再作任何其余的工做。app
那么你也许会问:我是怎么知道哪些点要亮,哪些点要暗呢?这不难。绝大多数人生活在这样一种环境下——这个环境的大多数光源来自上方(译者注:好比白天主 要的光来自太阳,夜晚主要的光来自天花板上的日光灯)。因此向上倾的地方就会更亮,而向下倾的地方就会更暗。因此这种现象使你的眼睛看到一个物体上亮暗区域时,能够判断出它的凹凸状况。相对亮的块被判断是面向上的,相对暗的块被判断是面向下的。因此我只须要给物体上的线条简单得上色。spa
若是你想要更多的证据,这里还有一幅几乎相同的图,不一样于前的是它旋转了180度。因此它是前一幅图倒转的图像。那些先前看起来是凹进去的区域,如今看起来是凸出来的了。.net
这时候你的大脑并无被彻底欺骗,你脑中存留的视觉印象使你仍有能力判断出这是前一幅图,只是它的光源变了,是从下往上照的,你的大脑可能强迫性地判断出它是第一幅图。事实上,你只要始终盯着它,而且努力地想像着光是从右下方向照射的,你就会理解它是凹的(译者注:由于平常生活的习惯,你会很容易把这些图 形判断成凸出的图形,可是由于有了上一幅对照图的印象,你可能才会特别注意到这些图块其实仍是凹入的,只是判断方法不符合咱们平常生活习惯,由于这时大多数光不是从上方照射,而是从下往上照射)。翻译
凹凸图和纹理图很类似。可是不一样的是,凹凸图包含的不是颜色信息,而是凹凸信息。最一般的方法是经过存储高度值实现。咱们要用到一个灰色的纹理图,灰色的亮度体现出每一个点分别凸出多少(见上图)。这就是一个很是方便的保存凹凸图的方法,并且这种图很容易制做。这副图具体又是怎样被着色器使用的呢?你接着往 下看就会明白了。code
固然,你并不必定要把本身局限于这些简单的图形,你能够扩展,用它来作木材,作石头,作脱了漆的墙面,作任何你想作的物体。orm
凹凸映射是补色渲染技术(Phong Shading Technique)的一项扩展,只是在补色渲染里,多边形表面上的法线将被改变,这个向量用来计算该点的亮度。当你加入了凹凸映射,法线向量会略微地改变,怎么改变则基于凹凸图。改变法线向量就会改变多边形的点的颜色值。就这么简单。htm
如今,有几种方法来达到这个目的(译者注:这个目的指改变法线向量)。我并无实际编写补色渲染和凹凸映射的程序,可是我在这里将介绍一种我喜欢的方法来实现!对象
如今咱们须要将凹凸图中的高度信息转换成补色渲染用到的法线的调节信息。这个作起来不难,可是解释起来比较费劲。
好的,咱们如今将凹凸位图的信息转换成一些小向量——一个向量对应于一个点。请看下边一副放大的凹凸图。相对亮的点比相对暗的点更为凸出。看清楚了吗?
如今计算每一个点的向量,这些向量表征了每一个点的倾斜状况,请看下图的描绘,图中红色小圆点表示向量是向下的。
有不少计算向量的方法,不一样的方法精确度不一样,可是选择什么方法要取决于你所要求的精确度是个什么层次。最一般的方法是分别计算每一个点上X和Y的倾斜度:
x_gradient = pixel(x-1, y) - pixel(x+1, y) y_gradient = pixel(x, y-1) - pixel(x, y+1)
在得出了这两个倾斜度后,你就能够计算多边形点的法线了。
这里有一个多边形,图上绘出了它的一条法线向量——n。除此,还有两条向量,它们将用来调节该点法线向量。
这两条向量必须与当前被渲染的多边形的凹凸图对齐,换句话说,它们要与凹凸图使用同一种坐标轴。下边的图分别是凹凸图和多边形,两副图都显示了U、V两条向量(译者注:也就是平面2D坐标的两条轴):
如今你能够看到被调节后的新法线向量了。这个调节公式很简单:
New_Normal = Normal + (U * x_gradient) + (V * y_gradient)
有了新法线向量后,你就能够经过补色渲染技术计算出多边形每一个点的亮度了。
Bump Mapping [翻译]了解凹凸映射(BUMP MAPPING)技术 凹凸贴图(Bump Map)实现原理以及与法线贴图(Normal Map)的区别