对Embossed Bump Mapping的一点浅见

Bump Mapping 是在象素级别扰动物体表面法向量的一种光照技术 , 通过改变光照计算 (light calculation) 模拟物体的 "Bumps".Bump mapping 最初由 Jim Blinn 发表的一篇名为 "Simulation of Wrinkled Surfaces" 的论文 .Blinn 使用了一种灰度高度图 (grayscale height map) 来模拟物体表面法向量的扰动 .
那么何为 bump map? 又如何建立 bump map ?
Bump map 就是包含将应用于 3D model 上的浮雕信息 (relief information) 的一种纹理图 .Relief information 有几种表现形式 , 之一为 elevation height map, 存储了每个象素的高度变量 , 通常以 grayscale 格式存储 ; 之二为 normal map , 存储了纹理图每个象素的 normal vector. 此种情况下常把 RGB 值作为 normal vector 3D 坐标 .
简而概之 : Bump mapped rendered surface = Base_texture + Bump_mapped texture
关于 Bump mapping 的原理和算法在 nehe lesson22 Emboss Bump Mapping by Michael I. Gold, nVidia Corp. [.ppt, 309K] 已有详细讲解 , 不再赘述 . 仅对一些要点及本人学习过程中遇到的一些问题做番解释 .
C = (L·N)*Dl*Dm                                        (1)
  • L is light vector
  • N is normal vector
  • Dl is light diffuse color
  • Dm is material diffuse color
(L·N) = (Fd + (H1-H0))                             (2)
(H1-H0) 即为我们建立的 Bump_mapped texture. 但是公式 2 中的 (H1-H0) 该如何实现呢 ?
nehe 教程中是这么创建的 :
第一张图具有原始 height map 一半的明亮度 (H0 = RGB/2);
第二张图具有原始 height map 反转图一半的明亮度 (invertH1 = (255-RGB)/2);
第一遍绘制时使用 H0, 第二遍绘制时使用 invertH1( 切记 , 需对该纹理坐标朝光源方向做微小的偏移 ), 同时采用 "Additive blending" 纹理混合模式 (glBlendFunc(GL_ONE, GL_ONE), H = H0 + invertH1 * perturbed). 若对 invertH1 不进行偏移 , 混合后为一 (127,127,127) 的灰度图 . 大家不妨一试 . 此二图混合后 , 值大于 0.5 模拟了面向光源的表面 , 小于 0.5 则对应背向光源 .
下一要点是计算 light vector for each vertex
所有的 vectors 必须在同一坐标系下 ,object or world space. 若把成千上万的片元 (fragments) 法向量 (defined in object space) 转换到 world space(light is usually defined in the space), 则需要大量的运算 ,so it is a better choice that transform the light position from world to local space using the inverse transformation matrix.
顺便介绍一下 tangent space.
Tangent space 一般由一组向量定义局部坐标系统 (TBN, N ormal vector, Tangent vector, Binormal vector ), 如下图所示 :
T 平行纹理 U 方向 ,B 同时垂直于 T N. 首先在已知纹理坐标 U,V 的前提下 , object space 计算所有 vertices tangent space.
结合上面所述 , 我们就可计算 light vector( 已从 world space 转换到 object space) 在每个 vertex tangent space 中的分量 :
  
反转图的偏移方向由 [LrelX     0     LrelZ] 确定 , 对应纹理坐标方向 U,V.
如果用 multiTexture 处理 H0 invertH1, 需硬件支持并对每个纹理单元进行相应的纹理信息设置 ( 纹理图象 , 过滤器 , 环境 , 坐标及矩阵 )
GL_TEXTURE0_ARB 指定当前纹理映射功能 :
 glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
 glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_REPLACE); 
GL_TEXTURE1_ARB 指定当前纹理映射功能 :
 glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
 glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_ADD);
GL_COMBINE_EXT, GL_COMBINE_RGB_EXT, GL_ADD OpenGL 1.2 Reference Manual 有解释 http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.doc/libs/openglrf/glTexEnv.htm
multitexture 处理 bump mapping , 有几行代码一直不解 :
 //disable second texture unit
 glActiveTextureARB(GL_TEXTURE1_ARB);
 glDisable(GL_TEXTURE_2D);
 
 //bind base texture to texture unit 0
 glActiveTextureARB(GL_TEXTURE0_ARB);
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, BASETEXTURE);
请大虾们指点一番了
此文是本人学习当中的一些点滴 , 夹杂些许个人对此技术的理解 , 不当之处还望指出 !
切记 , 切记 , 不可全信 ^_^   
 Embossed Bump Mapping Bump Mapping 中最简单的一种 , 缺乏实用性 , 只能用于 diffuse lighting , 但不失为了解 Bump Mapping Primer technique. 还有三种 Bump Mapping 技术 , 有待以后进一步挖掘 ( 前进的动力啊 ,sigh), 现把四种相关技术列表如下 :
  • Embossed Bump Mapping
  • Perturbed UV Bump Mapping
  • Perturbed Normals Bump Mapping
  • Dot Product Bump Mapping
 
see also:
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值