sldbtree

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

Bump mapping是凹凸映射技术,这种技术用于显示物体表面的立体感、凹凸感。这种技术用于细节的表现,最新的名称可能叫“Parallax Mapping",Quake4中大量使用,表现场景中的地板和墙的凹凸、沧桑感。本文解释DOT3 Bump Mapping,也是Bump mapping其中的一种方法。


Bump mapping是一种像素级操作(如Phone照明方式,光照是作用到每个像素上的,也就是每个像素都有不同法线值),基本上都用到Tangent Space(切面空间)这个概念。这个空间是3D中继Local Space、World Space、View Space、Screen Space和Texture Space后的又一个空间名词。 跟这些我们很熟悉的空间一样,我们可以通过给这个空间一个相应的矩阵,这样可以把相应的值通过和矩阵的相乘,而转化到切面空间(就像我们把顶点和world space相乘,就把local的顶点坐标转化到了世界空间中一样简单)。


整个Bump Mapping中,最重要的是一张图,这张图片英文称为Normal map,直译就是法线图。顾名思义,这张图中的每个有效值(RGB)其实是对应的一个像素的法线。在基本的光照原理中,我们是对每个顶点都取法线,然后依据Gauroud或者Phone光照模型,对三角形内部进行插值计算。在Bump mapping中,是每个像素都取相应的法线。法线来源就是事先经过美工处理的法线图(normal map)。每张法线图都对应于一张纹理图,纹理图表现物体的表面材质细节,法线图用来凸显表面的凹凸状况。“凹凸”,这也是bump这个词本身的意思。


好,到此我已经引出了两个很重要的概念。下面就解释一下dot3 bump mapping的核心:当光线和拥有bump map的物体表面产生交互的时候,应用程序不会单纯的计算物体表面每个三角形顶点的法线和光线的点乘结果(这是一般的物体表面计算光照效果时候用的);而是会计算光线和每个面中的每个像素上的法线(存在于法线图中)的点乘结果。然后把该结果作为该像素的光照的值。“dot3”是因为在shader的汇编代码中,光线跟法线的计算会用上dot3命令,因此得名。而tangent space登上舞台的原因是,光线在实际运用中,总是以世界坐标来表示的,但normal map中的法线值不是用世界坐标来表示的。理论上,我们可以把normal map的法线都通过local -> world的方式转入世界坐标系,然后跟同坐标空间的光线做dot3运算。实际操作中会有一些问题,我们这样来看这个问题:


前提:法线的数量很多;光线只有一个;转换的过程是要通过矩阵运算。

方法一:法线转入世界坐标。那么程序中,就有循环


FOREACH normal IN normalmap

    normal_world normal worldmatrix;

END


意味着有多少像素,就有多少个矩阵运算;


方法二:光线转入切面空间。那么程序中,有


light_tangent light tangentmatrix;


显然,这里只要一个矩阵乘法。


因此,光线转入tangent space显然具备巨大的优势。这也就是我们开始提出的概念的由来。



在示例代码中,由于用固定流水线(Fixed Pipeline)方式,因此我们只要计算出顶点的tangent matrix,然后把光照转入该顶点的tangent space。除顶点外的那些像素的光照的值,是D3D的采样代码根据我们指示的DOT3命令,根据线性插值产生的。示例中默认没有灯光,请按下L来开启灯光。鼠标左键按下后可以旋转立方体看每个面旋转时的明暗变化。



参考文档:

1、http://www.blacksmith-studios.dk/projects/downloads/tangent_matrix_derivation.php 推导tangent matrix的方法。

 

2、http://zarria.net/nrmphoto/nrmphoto.html 怎么制作一幅自己的normal map,照片到法线图。不是用什么插件之类的。很有意思。

 


附录:

1、示例源代码工程(VC2008工程)

需要说明的是,为了利用到tangent矩阵的计算方式,我把光照值转入了tangent空间,并且把该光照向量压入diffuse分量作为stage 0的光照输入。

 

http://www.163disk.com/fileview_333187.html

posted on 2011-06-28 15:11  sldbtree  阅读(428)  评论(0)    收藏  举报