无论是程序员还是美工人员,几乎每个游戏开发者都知道一些3D图形学的知识,因此每个人都或多或少了解一点bump mapping。Bump mapping是在像素级别扰动物体表面法向量的一种光照技术,它一般采用纹理映射作为输入表示扰动的大小。在光照计算时考虑到扰动的法向量,不需要增加额外的几何信息就可以增强被渲染物体的表面细节。
2.
Bump mapping最初由Jim Blinn在1978年发明,他发表了一篇名为“Simulation of WrinkledSurfaces”的论文。Blinn使用了一种灰度高度图(grayscale height map)来建模物体表面法向的扰动,扰动法向量的大小用某些表面参数(典型的为纹理坐标)的偏微分和高度图来计算。这些微分表示了某些潜在值的变化率,因此,如果高度的微分值很大,则表示高度图中该点坡度很陡。
正如上面所说的,这些扰动的法向量需要加入光照模型中进行计算,这就暗示说所采用的光照模型必须是像素级的("Phong shading"),而不能是顶点级的("Gouraud shading")。这里必须指出"Phong shading"和"Phong's lighting model"是不同的概念,尽管鲜见有人作出区分。Phong shading意思是插值顶点法向量在片元(fragment)级别计算光照公式,而Gouraud shading意思是逐顶点计算光照公式,最后再插值颜色。Phong光照模型(Phong's lighting model)只是一种特定的计算光照的公式,可以在顶点级别也可以在片元级别进行计算。例如OpenGL的标准光照是基于Phong光照模型但使用Gouraud shading。因此,bump mapping可以看作为Phong shading的扩展(使用bump map来扰动法向量),但并不是说你必须用Phong光照模型。
3.
下面的几段将讨论bump mapping实现的不同方法,我们从最简单的开始逐渐过渡到最复杂的技术。
3.1
Emboss bump mapping也是采用一张height map,就像Blinn的最初方法,但它不是计算逐像素扰动的法向量,而是直接计算光照密度。因此,与Blinn的bump mapping技术不同,不能随意选择光照模型。
3.2
环境影射bump mapping最初由Bitboys开发,但实际将这种技术带入市场的显卡是Matrox G400。EMBM扰动纹理坐标而不是法向量,其输入纹理是一个二维的DU/DV图像:其中的纹理像素表示应用到U/V纹理坐标上的偏移量。换句话说,存取特定图元的纹理坐标是(U + DU, V + DV),其中U和V分别表示逐顶点插值的纹理坐标,DU和DV则是从bump map中获得。
很明显,EMBM也可以应用于环境反射(环境映射的典型用法),这意味着你可以用它来仿真凹凸反射物体。这向着实现真实的bump mapping效果前进了一大步,但是你仍然没有存取扰动的表面法向量,因此从环境图中提取的信息量限制了可以选择的光照模型。
3.3
Normal mapping是当前最通用的实时bump mapping技术,该技术最初来源于Peercy等人的论文"Efficient Bump MappingHardware"。输入纹理是一个normal map,在其不同的颜色通道中记录了扰动的表面法向量。像DU/DV maps一样,normal maps典型地产生于一个高度场,高度值的偏微分可以用于计算扰动表面的坡度,因此也可以用于计算扰动的法向量。法向量的XYZ分量可以被编码进纹理的RGB通道来产生最终的normal map。
3.4
最新的显卡支持片元级别的偏微分运算,可以并行地运算四个或更多的fragments blocks(运用多片元管线),因此可以方便地计算相邻像素之间值的变化率。你可以实时地应用这个功能动态转化height map为normal map,这可以解决离线计算normal maps的麻烦,更方便美工人员制作bump map。
实时转化尽管增加了运算负载,但你可以在pixel shader中用height map进行其他目的的计算,不过至少在目前离线计算normal maps仍是明智的选择。
4.
4.1
Displacement mapping相对于bump mapping来说也使用height map来表示表面的扰动,不同的是displacement mapping实际修改表面的几何信息,而bump mapping只影响表面法向量。换句话说,displacement mapping增加了模型的几何细节,硬件加速的displacement mapping技术目前还很不成熟。
你可以在vertex shader中使用displacement mapping偏移顶点使之沿着法线方向偏移,即使你的显卡足够劲可以同时处理大量的顶点,你仍然需要调整真实顶点的位置。在没有某种自适应tessellation策略的情况下,取得较好可视结果需要处理的面片数目大的惊人,除非displacement map本身也可以实时产生。除此以外,displacement技术一般是不能实时应用的。
4.2
经常有人抱怨说“bump mapping使真实的物体看上去像塑料”,尽管有证据支持这种说法(某些游戏应用了bump mapping技术),但不是bump mapping技术使物体看上去像塑料,是光照模型的原因。许多游戏使用了Blinn/Phong光照模型,如果加上镜面光照,看上去确实像塑料,可是如果应用同样的模型而不使用bump mapping,场景仍然看上去像塑料,这有可能更多的是美工的问题。
5.
5.1
当讨论normal mapping的时候,我们注意到normal maps一般从一个height map生成,然而,采用将表面法向量渲染到纹理的方法,从模型也可以产生normal maps。“细节保留”技术采用了这种方法来实现模型简化,一个高模和一个低模作为输入,将高模的细节保存到一个纹理中,并将这个纹理贴到低模上。这种“细节”可以是任意的表面属性,包括颜色和法向量,如果你采用细节保留技术产生一个normal map,你就可以使用高LOD版本(high-LOD version)的光照信息渲染低LOD版本(low-LOD)的模型。
5.2
Bump mapping靠扰动表面法向量来影响光照,但扰动的法向量不会影响任何形式的阴影。因此,一个凸块(bump)将不会在另一个凸块上产生阴影。可是现在已经有方法允许bump maps产生自阴影,其中的一种技术叫做“horizon mapping”。一个horizon map是一种从特定点向各方向记录可见水平高度(the elevation of the visiblehorizon)的纹理。如果另外的一个点判断低于这个水平高度,可以认为该点相对于特定点不可见,与之相似的是,光源如果低于这个水平高度,就不会照亮对应的特定点。
5.3
尽管bump mapping可以极大地增强场景渲染的真实感,但其仍然只是一种基于纹理的技术,这意味着绘制表面始终仍为“平(flat)”的。Displacement mapping技术靠修改实际几何表面来解决这个问题,但是如前所述,在实时绘制系统中目前并不是最实用的技术。视差映射(Parallax mapping)是一种先进的bump mapping技术,在一定程度上可以弥补以上缺陷而不需要displacement mapping那么复杂的运算。摄像机在物体表面平移时,视差映射可以给你一种合适的视差效果,不必修改实际的几何信息。因此,当你低于一定的角度观察一个平面时,虽然可能仍感到它是平的但物体的轮廓不会收到影响。
5.4
如果你想进一步提高渲染效果以实现displacement mapping那样的效果,你就需要使用Pixel Shader来修改渲染图元的Z值,除了使用一个height map作为输入外,必须向着视线方向偏移Z值。这种技术仍然不会改变场景的实际几何信息,但当两个物体接触或相交时,相交处会随着表面的凹凸情况发生变化而不仅仅表示为一条直线。
Z-correct bump mapping有一个很大的缺陷,在pixel shader中修改Z值会禁止图形硬件的早期深度测试优化。早期深度测试优化可以在pixel shader执行前去除深度测试失败的图元,这可以极大地增进性能,如果shader修改了深度值,早期深度测试优化将不会执行。
逐像素的光照计算在处理独立光源之前,通常要计算环境光部分(Z+ambient pass),这部分计算正需要用到早期深度测试优化。因此,禁止深度测试优化可能极大地影响绘制效率,其不利影响甚至超过几条pixel shader指令带来的优化效果。
6.
Bumpmapping背后的基本技术就是扰动用于光照计算的表面法向量。Blinn的原始方法需要计算height map的坡度来产生扰动的法向量,这种方法近年来才被用于实时系统。我们还讨论了一些更加实用的bump mapping方法,首先的两种技术是emboss bump mapping和 EMBM,它们都不是真正计算扰动的法向量,因此这使它们并不灵活,可能不值得大量应用。
我们讨论的第三种技术是normal mapping,它是当前使用的标准方法,normal mapping真正地扰动表面法向量,这意味着理论上其可以应用于任何光照模型。实际上,采用的光照模型受限于显卡的硬件性能与片元处理能力,早期的显卡实现normal mapping相当受限制,仅仅计算散射光照部分,你不得不对每个光源都采取多遍渲染,而更新的显卡可以实现更加专业的光照模型。
A.参考文献
Furtherreading:
- Simulation Of Wrinkled Surfaces, Jim Blinn(not freely available online to my knowledge)
- Efficient Bump MappingHardware, Mark Peercy, John Airey and BrianCabral
- Bump Mapping,Anders Hast
- Interactive HorizonMapping, Peter-Pike Sloan and Michael F.Cohen
- Parallax Mapping with OffsetLimiting: A Per-Pixel Approximation of UnevenSurfaces, Terry Welsh
- Preserving Attribute ValuesOn Simplified Meshes By Resampling Detail Textures, P.Cignoni, C. Montani, C. Rocchini, R. Scopigno and M.Tarini
- All The Polygons You Can Eat:Without The Fat, Doug Rogers (includes some goodinformation on detail preservation)
- Tangent Space Calculation, Eric Lengyel (example codefor calculating tangent frames)
Usefultools:
- ATI developer tools,including a normal map generator and a detail preservationtool
- NVidia texturetools, including a normal map generator
- NVidia Melody, amesh simplification and detail preservation tool
- Open RenderBump, adetail preservation tool
Bump mapping demos onDelphi3D:
- Emboss bump mapping.
- EMBM for fake refraction (NVidia only).
- The "Hello world" of normal mapping.
- Per-pixel lighting using normal maps. Different codepaths for different hardware generations (NVidia only).
- Portal renderer with shadowmapping and per-pixel lighting using normal maps.
- Horizon mapping.
- A combination of horizon mapping, parallax mapping andz-correct bump mapping.
- A simple mesh-based normal map generator for generating tilednormal maps.
http://blog.sina.com.cn/s/blog_53828e460100mv06.html