游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7548|回复: 18

[翻译]了解凹凸映射Bump Map技术的内幕

[复制链接]

96

主题

529

帖子

539

积分

高级会员

Rank: 4

积分
539
发表于 2005-1-2 20:42:00 | 显示全部楼层 |阅读模式
我翻译这篇教程的目的是为了帮助那些对图形渲染技术有兴趣却又苦于找不到免费中文学习资料的人。在我的身边没有任何一位从事计算机专业的前辈,从刚学会WINDOWS的基本操作到现在,我的计算机技术完全都是一步步自学过来的,算算学编程的历史也近5年时间了。我往往要花一半以上的学习时间用来查学习资料(记得我学GIF图像格式时,用了近2个星期时间才编出了解压和显示GIF图片的程序,主要原因就是资料不够,只看一两篇短篇幅的教程来写程序,其中多数时间花在调试代码和猜格式上)。所以我对那些不是从事计算机专业,身边又没有计算机高手的学习者深有同感——查一堆堆资料是自学中最痛苦的过程。这几天我也正在学BUMP MAPPING算法,在看完一篇简单的E文教程后,我觉得自己也确实应该为中国的教程事业做出一点我微薄的贡献。我并不是个3D高手,也只是个初学OpenGL的新手,所以只能先做翻译了。我也希望我的翻译小样能够抛砖引玉,看到中国越来越多的高手能够真正写点自己的东西,拿出来与大家分享。由于本人水平有限,翻译难免有错误和不妥之处,请多加指正。

为了尊重原作者,同时也是为了读者能够对照原文,在此贴出原文地址:

http://freespace.virgin.net/hugo.elias/graphics/x_polybm.htm

                                   凹凸映射Bump Mapping

凹凸映射和纹理映射非常相似。然而,纹理映射是把颜色加到多边形上,而凹凸映射是把粗糙信息加到多边形上。这在多边形的视觉上会产生很吸引人的效果。我们只需要添加一点信息到本来需要使用大量多边形的物体上。需要注意的是这个物体是平的,但是它看起来却是粗糙不平的。让我们来看看左边的那个立方体。如果你很近地观察它时,你会发现它上面的很多细节。它看起来好像是由成千上万个多边形构成的,其实它只是由6个矩形构成。你或许会问:“这和纹理映射有什么不同?”它们的不同之处在于——凹凸映射是一种负责光方向的纹理映射。

(1)凹凸映射背后的原理

让我们来看看一个粗糙的表面。从远处看,你判断这个物体是粗糙的的唯一证据是在它表面上下的亮度有改变。你的大脑能够获得这些亮暗不一的图案信息,然后判断出它们是表面中有凹凸的部位。左边的一幅图就说明了这一点。你可以发现它是一个浮雕式的表面。一些矩型和字母被印入表面,但是它们摸上去就像是一个隐藏的监控器的玻璃。如果这个图像是在适当的位置上,那么它除了改变亮度,不需要再做任何其他的工作。

那么你也许会问:我是怎么知道哪些点要亮,哪些点要暗呢?这不难。绝大多数人生活在这样一种环境下——这个环境的大多数光源来自上方(译者注:比如白天主要的光来自太阳,夜晚主要的光来自天花板上的日光灯)。所以向上倾的地方就会更亮,而向下倾的地方就会更暗。所以这种现象使你的眼睛看到一个物体上亮暗区域时,可以判断出它的凹凸情况。相对亮的块被判断是面向上的,相对暗的块被判断是面向下的。所以我只需要给物体上的线条简单得上色。

如果你想要更多的证据,这里还有一幅几乎相同的图,不同于前的是它旋转了180度。所以它是前一幅图倒转的图像。那些先前看起来是凹进去的区域,现在看起来是凸出来的了。

这个时候你的大脑并没有被完全欺骗,你脑中存留的视觉印象使你仍然有能力判断出这是前一幅图,只是它的光源变了,是从小往上照的你的大脑可能强迫性地判断出它是第一幅图。事实上,你只要始终盯着它,并且努力地想像着光是从右下方向照射的,你就会理解它是凹的(译者注:因为日常生活的习惯,你会很容易把这些图形判断成凸出的图形,但是因为有了上一幅对照图的印象,你可能才会特别注意到这些图块其实还是凹入的,只是判断方法不符合我们日常生活习惯,因为这时大多数光不是从上方照射,而是从下往上照射)。

(2)什么是凹凸图(Bump Map)

凹凸图和纹理图很相似。但是不同的是,凹凸图包含的不是颜色信息,而是凹凸信息。最通常的方法是通过存储高度值实现。我们要用到一个灰色的纹理图,灰色的亮度体现出每个点分别凸出多少(见右图)。这就是一个非常方便的保存凹凸图的方法,而且这种图很容易制作。这副图具体又是怎样被渲染器使用的呢?你接着往下看就会明白了。
当然,你并不一定要把自己局限于这些简单的图形,你可以扩展,用它来做木材,做石头,做脱了漆的墙面,做任何你想做的物体。



(3)那么它是怎么工作的

凹凸映射是补色渲染技术(Phong Shading Technique)的一项扩展,只是在补色渲染里,多边形表面上的法线将被改变,这个向量用来计算该点的亮度。当你加入了凹凸映射,法线向量会略微地改变,怎么改变则基于凹凸图。改变法线向量就会改变多边形的点的颜色值。就这么简单。

现在,有几种方法来达到这个目的(译者注:这个目的指改变法线向量)。我并没有实际编写补色渲染和凹凸映射的程序,但是我在这里将介绍一种我喜欢的方法来实现!

现在我们需要将凹凸图中的高度信息转换成补色渲染用到的法线的调节信息。这个做起来不难,但是解释起来比较费劲。

好的,我们现在将凹凸位图的信息转换成一些小向量——一个向量对应于一个点。请看左边一副放大的凹凸图。相对亮的点比相对暗的点更为凸出。看清楚了吗?现在计算每个点的向量,这些向量表征了每个点的倾斜情况,请看下图的描绘。图中红色小圆点表示向量是向下的:



有很多计算向量的方法,不同的方法精确度不同,但是选择什么方法要取决于你所要求的精确度是个什么层次。最通常的方法是分别计算每个点上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)

有了新法线向量后,你就可以通过补色渲染技术计算出多边形每个点的亮度了。

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20686
发表于 2005-1-2 21:02:00 | 显示全部楼层

Re:[翻译]了解凹凸映射Bump Map技术的内幕

精!感谢楼主!

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2005-1-2 22:05:00 | 显示全部楼层

Re:[翻译]了解凹凸映射Bump Map技术的内幕

good

190

主题

1801

帖子

2096

积分

金牌会员

Rank: 6Rank: 6

积分
2096
QQ
发表于 2005-1-2 22:09:00 | 显示全部楼层

Re:[翻译]了解凹凸映射Bump Map技术的内幕

96

主题

529

帖子

539

积分

高级会员

Rank: 4

积分
539
 楼主| 发表于 2005-1-3 10:57:00 | 显示全部楼层

Re:[翻译]了解凹凸映射Bump Map技术的内幕

谢谢大家的肯定。不过这篇文章比较简单,如果单看这篇文章还不至于能掌握BUMP MAPPING技术,它只不过是起个过渡的作用,告诉大家BUMP MAPPING的基本原理,了解最基本的原理后,再看BUMP MAPPING的拔高教程就更轻松了。

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2005-1-3 16:04:00 | 显示全部楼层

Re:[翻译]了解凹凸映射Bump Map技术的内幕

这个帖子我以前见过

1

主题

130

帖子

135

积分

注册会员

Rank: 2

积分
135
发表于 2005-1-3 16:36:00 | 显示全部楼层

Re: [翻译]了解凹凸映射Bump Map技术的内幕

细节部分不够详细,我来补充下吧

1.为什么需要使用凹凸贴图...
一般的模型只有在每个顶点上带有法线,各点之间的各个象素的法线是按照固定的插值算法生成(clamp或者warp),但这样就没有我们想得到的精确到象素的光影效果,要想得到更细致的图像,使用点面非常多的高模是个办法,另外一个办法就是凹凸贴图.....
2.凹凸贴图里面究竟保存了什么?
一般来说凹凸贴图中保存的是从高模上得到的每点的法线向量...有许多工具可以帮助你自动生成凹凸贴图(normal map),由于保存为图片颜色是0-255(d3d中为0-1),而normalize后的法线向量是-1到1,所以要使用的时候需要把从图片中取出来的法线值乘2再减去1.
3.如何使用.
凹凸贴图已经是perpixel处理的高级应用了,当然是再pixelshader里面用了,具体的可以看看我的那篇 "normalmap在d3d中的使用",里面有比较具体的代码 [em8]

补上链接http://bbs.gameres.com/showthread.asp?threadid=20243

96

主题

529

帖子

539

积分

高级会员

Rank: 4

积分
539
 楼主| 发表于 2005-1-3 16:54:00 | 显示全部楼层

Re: Re:[翻译]了解凹凸映射Bump Map技术的内幕

呵呵,你记错了。这是我昨天刚翻译的。
Jeminai: Re:[翻译]了解凹凸映射Bump Map技术的内幕

这个帖子我以前见过

96

主题

529

帖子

539

积分

高级会员

Rank: 4

积分
539
 楼主| 发表于 2005-1-3 16:55:00 | 显示全部楼层

Re: Re: [翻译]了解凹凸映射Bump Map技术的内幕

非常感谢你的补充!!!
jiacat: Re: [翻译]了解凹凸映射Bump Map技术的内幕

细节部分不够详细,我来补充下吧

1.为什么需要使用凹凸贴图...
一般的模型只有在每个顶点上带有法线,各点...

15

主题

1268

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2005-1-3 18:42:00 | 显示全部楼层

Re:[翻译]了解凹凸映射Bump Map技术的内幕

其实也就是为了弥补模型的不精确性而开发的贴图技术
能够恒号的解决低精度模型的高精度显示问题,]
开发保里面有专门的例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 23:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表