凹凸贴图(bump mapping)概念

无论是程序员还是美工人员,几乎每个游戏开发者都知道一些3D图形学的知识,因此每个人都或多或少了解 一点bump mapping。Bump mapping是在像素级别扰动物体表面法向量的一种光照技术,它一般采用纹理映射作为输入表示扰动的大小。在光照 计算时考虑到扰动的法向量,不需要增加额外的几何信息就可以增强被渲染物体的表面细节。

[原文链接] 
1. 浮雕贴图(Emboss bump mapping)
这种处理方式不用 lighting models,而直接使用贴图明暗度来产生凸凹效果.
玩过photoshop的都知道可以使用alpha通道对RGB图像进 行混合,这种透明度直接
混合出来的明暗看起来象平的,为了使用图像随灯光看起来有立体感的明暗度,
一种简单的办法就是使用 Emboss bumpmapping.

实现如下:
就是将原alpha通道值一分为二,一个是原alpha通道的亮度减 半, 另一个是反转alpha
通道并将uv偏移灯光一点点,最后将两个alpha通道加起来再与原RGB图像进行混合,
这样看起来明 暗度偏离灯光使看起来立体感较强.
另外这样的处理方式还可混合顶点色.

优缺点:
CPU使用较多,计算uv偏移 值,可以直接用固定管道实现. 完全用贴图渲染,只实现了diffuse.

参考:
dx8 sdk中的emboss源码

2. 環境凹凸貼圖(EMBM: Environment-mapped bump mapping)
这种贴图保存了du和dv两个偏差值,最常见的是用在水的反射渲染中对反射图进行干挠.
使水面看起来产生涟漪的效果. 就是说dv和dv将会加到顶点对应反射图的uv中. dx中可
以设置bump矩阵对它调整得以实时变化.

优缺点:
CPU占用少,可以使用固定管道实现.效率问题主要是在反射图(也就是Environment map)的
渲染占用上,当然也可以采用假的静态反射图.

参见:
dx8 sdk中的BumpWaves源码

以及我的文章:
使用固定管道渲染反射和折射:
http://blog.csdn.net/flipcode/archive/2008/03/03/2143788.aspx

dx9反射图计算参见:
http://flipcode.spaces.live.com/blog/cns%218E578E7901A88369%21363.entry

3. 法线图(Normal mapping)
这种是比较流行的实时凹凸贴图方法,原理很简单,就是多边形上每一象素点如果用不同的
法向量进行光照模型运算,那么就可得到不同的凹凸明暗度. 

实现方法:
就是将多边形的法线保存在高位图的RGB中.然后程序读取来在ps中取出RGB作为法线
进行光照模型的计算即可.

法线图中的法线值一般是以贴图空间(也就是切线空间,U为tangent向量,V为binormal向量, n为normal向量)
来存放的,所以灯光到顶点的向量要先转到切线空间后再与法线进行光照运算即可.

优缺点:
CPU使用不多,用点光源效果较好, 需要硬件支持DotProduct, 光照实时变化.

参见:
dx8 sdk中的DotProduct3源码,使用固定管道来实现:
// Store the light vector, so it can be referenced in D3DTA_TFACTOR
DWORD dwFactor = VectortoRGBA( &m_vLight, 0.0f ); 
m_pd3dDevice->SetRenderState( D3DRS_TEXTUREFACTOR, dwFactor );

// Modulate the texture (the normal map) with the light vector (stored
// above in the texture factor)
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_DOTPRODUCT3 );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );

或者这里也有DotProduct3同上dx8的例子:
http://www.two-kings.de/tutorials/dxgraphics/dxgraphics16.html

切线空间的计算参见:
计算切线空间:
http://blog.csdn.net/flipcode/archive/2008/03/03/2143483.aspx

提示, NormalMap制作:
法线图制作的几种方法: 
1. 直接使用高位图(Height map), 再通过D3DXComputeNormalMap函数得到.
2. 使用PhotoShop加载高位图,然后再用NV的photoshop插件进行生成Normal Map图像, 详细
作法可参 见<怎样用PhotoShop创建Bump Map图像>:
http://phoenixzz.blogbus.com/logs/1597471.html
3. 通过高模表面采样得到(polybump),可以使用ATI的3DS Max插 件,参见:
<Normal Mapping Primer>by Gary Pate. http://www.ionization.net/tutsnorm2.htm

4. 置换贴图(Displacement mapping)
这种需要硬件支持,在vs中真正改变几何顶点的位置, 由此引起的几何细分需要处
理大量的多边形,一般不能实时应用到.

5. 自阴影(Self-shadowing bump maps)
法线图可以实现阴影动态变化,但实现不了自阴影,也就是说如果有凸块 遮挡了光线,它不能实现遮挡产生的阴影.

一种叫horizon map的技术可以实现自阴影.
这是一种从特定点向各方向记录可见水平高度(the elevation of the visible horizon)的纹理。
光源如果低于这个水平高度,就不会照亮对应的特定点。这可在切线空间对光源向量执行这种可见性检查,
就可以产生自阴影bump maps.

优缺点:
实现自阴影,占用过多纹理内存,计算量很大。

6. 视差映射(Parallax mapping)
Parallax mapping也被称为"offset mapping"或"virtual displacement mapping"
这种处理是将纹理的坐标向眼睛方向偏移一定的距离来实现立体视角感.

从渲染点出发到眼睛的斜射线上找到表面垂直距离等于渲染点对应的Parallax mapping高度值时,
那么眼睛斜射线上到表面垂直相交的那点就是要偏移到的地方.(可参见前面所附链接中的图示)

优缺点: 
视差映射跟EMBM一样也是调整贴图uv坐标的,不过它有两个约束条件:一是对应视差映射中的高度值
二是到眼睛的射线. 从而随视角变化而变化,效果效率都很好. 而EMBM一般用正/余弦波来改变du/dv
后再去影响贴图坐标从而达到水的涟渏效果(这在前面有说)

7. Z-correct bump mapping
这种是在ps中根据视线方向偏移Z值,使物体相交处会随着表面的凹凸情况发生变化而不仅仅表示为一条直线。

优缺点:
物体相交处通过z偏移表现凹凸变化,在pixel shader中修改Z值会禁止图形硬件的早期深度测试优化.

注意: 
本文参考了以下文章:
An Overview Of Bump Mapping Techniques
英文版:
http://www.delphi3d.net/articles/viewarticle.php?article=bumpmapping.htm
翻译版:
http://phoenixzz.blogbus.com/logs/1332892.html
如 果看不懂就看原文吧

另外还可参考:
http://snowwin.bokee.com/4148760.html

(转)各种纹理贴图技术相关推荐

  1. OpenGL曲面纹理贴图技术--波浪的模拟(转 作者 Y_Y)

    学过OpenGL的人都很容易的把图片贴到四边形和三角行上,但将纹理贴到一般的曲面上认为很困难,其实 通过本文的简单分析,其实很简单.本文以波浪模拟为例,来介绍一般纹理贴图技术,大家很容易举一反三来 模 ...

  2. 基于VC++的3D地形绘制与纹理贴图

    前言 随着地理信息系统产业的发展,三维产品也在生活中处处吸引着我们的眼球.作为数字城市的核心内容,城市模型的构建成为了目前研究的热点.OpenGL是独立于操作系统和硬件环境的三维图形库,其为实现逼真的 ...

  3. D3D中的纹理贴图(1)

    D3D中的纹理贴图(1) 提示: 阅读本文需要一定的3D图形学和DirectX9基础,如果你发现阅读困难,请参阅 D3D中基本三角形面的绘制. 本文用到的坐标系统变换函数请参阅 DirectX 9的坐 ...

  4. OpenGL:纹理贴图

    纹理贴图是在栅格化的模型表面上覆盖图像的技术.它是为渲染场景添加真实感的最基本和最重要的方法之一.硬件也为纹理贴图提供了硬件支持,使得它具备实现实时的照片级真实感的超高性能.纹理单元是专为纹理设计的硬 ...

  5. 【转载】【《Real-Time Rendering 3rd》 提炼总结】(五) 第六章 · 纹理贴图及相关技术 The Texturing

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/73718109 在计算机图形学中,纹理 ...

  6. 实时渲染学习(四)纹理贴图及相关技术

    参考博文:[<Real-Time Rendering 3rd> 提炼总结](五) 第六章 · 纹理贴图及相关技术 概念导览: 纹理管线 The Texturing Pipeline 投影函 ...

  7. GPU Gems1 - 25 用纹理贴图进行快速过滤宽度的计算

    这章介绍在片元shader中计算导数近似值的技术.这个技术把特别的值载入纹理mipmap的每个级别,以特殊的方式使用纹理映射硬件,计算出导数的结果,给出在屏幕上的像素间某个量的变化率. Cg标准程序库 ...

  8. Shadow Map阴影贴图技术之探 【转】

    这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本 ...

  9. Windows 8 Directx 开发学习笔记(十)纹理贴图实现旋转的木箱

    纹理贴图映射(texturemapping)是可以显著提高场景细节和真实感的一种技术,基本原理是将图像数据映射到3D三角形表面(之前的文章提到过,三维模型其实是由很多个三角形拼接而成).当使用纹理资源 ...

最新文章

  1. 构建之法阅读笔记01
  2. WEB前端笔试题(4)
  3. 查看IE浏览器安装的插件
  4. vector notes
  5. python mp3操作
  6. php 获取实例的类名,PHP类名获取方式及单例模式实现
  7. linux nginx完全卸载
  8. php 系统环境变量引用,PHP 系统变量 环境变量
  9. 2021年Q2服饰行业季度洞察报告
  10. mysql基本介绍和优化技巧
  11. deeplink唤醒app测试软件,DeepLink唤醒App的简单实现方法
  12. JQuery与springmvc实现多个文件上传操作
  13. 电子表程序c语言,单片机c语言编程实例:电子表
  14. 深度学习阅读导航 | 02 Faster R-CNN:基于RPN的实时目标检测
  15. 依赖注入:语法糖胜于功能组合
  16. Python超详细学员管理系统【面向对象实现】
  17. vue.js 回显textarea入的空格和换行
  18. MAL-PEG-NH2,马来酰亚胺-PEG-胺|mal修饰Fe3O4活化磁珠200-300nm|mal修饰SiO2@Fe3O4磁珠200-300nm齐岳生物供应
  19. SICP读书笔记 3.1
  20. 88w8686 wifi模块的linux设备驱动的测试

热门文章

  1. 2021年5月软考准考证打印时间
  2. 读债务危机0804:美国债务危机与调整(2007到2011)-泡沫出现
  3. 离散制造业的数据采集之路
  4. Winform中实现新增和更新共用一个页面的示例流程
  5. Input中onbeforepaste的作用
  6. Jquery中使用Validate插件使表单验证更加简单
  7. linux服务器上部署项目,还报路径错误,切记分隔符注意点
  8. Java 网络 socket 编程
  9. 用户故事地图对应到Epic及其缺点
  10. flutter pub get错误pub get failed和Downloading CanvasKit问题