现在的位置: 首页 > 综合 > 正文

对Embossed Bump Mapping的一点浅见[ZT]

2012年08月22日 ⁄ 综合 ⁄ 共 4561字 ⁄ 字号 评论关闭

http://blog.csdn.net/xukunn1226/archive/2006/04/03/649387.aspx

(对Bump Mapping的理解http://vcg.isti.cnr.it/activities/geometryegraphics/bumpmapping.html

 

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有几种表现形式,之一为elevationheight map,存储了每个象素的高度变量,通常以grayscale格式存储;之二为normal map,存储了纹理图每个象素的normal vector.此种情况下常把RGB值作为normal vector3D坐标.
简而概之:Bump mapped rendered surface = Base_texture + Bump_mapped texture
关于Bump mapping的原理和算法nehe lesson22Emboss 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, Normal vector, Tangent vector, Binormal vector),如下图所示:

 

T平行纹理U方向,B同时垂直于TN.首先在已知纹理坐标U,V的前提下,object space计算所有verticestangent space.

 

反转图的偏移方向由[LrelX     0     LrelZ]确定,对应纹理坐标方向U,V.
如果用multiTexture处理H0invertH1,需硬件支持并对每个纹理单元进行相应的纹理信息设置(纹理图象,过滤器,环境,坐标及矩阵)
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_ADDOpenGL 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 MappingBump Mapping中最简单的一种,缺乏实用性,只能用于diffuse lighting,但不失为了解Bump MappingPrimer technique.还有三种Bump Mapping技术,有待以后进一步挖掘(前进的动力啊,sigh),现把四种相关技术列表如下:
  • Embossed Bump Mapping
  • Perturbed UV Bump Mapping
  • Perturbed Normals Bump Mapping
  • Dot Product Bump Mapping
 
see also:

反转图的偏移方向由[LrelX     0     LrelZ]确定,对应纹理坐标方向U,V.
如果用multiTexture处理H0invertH1,需硬件支持并对每个纹理单元进行相应的纹理信息设置(纹理图象,过滤器,环境,坐标及矩阵)
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_ADDOpenGL 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 MappingBump Mapping中最简单的一种,缺乏实用性,只能用于diffuse lighting,但不失为了解Bump MappingPrimer technique.还有三种Bump Mapping技术,有待以后进一步挖掘(前进的动力啊,sigh),现把四种相关技术列表如下:
  • Embossed Bump Mapping
  • Perturbed UV Bump Mapping
  • Perturbed Normals Bump Mapping
  • Dot Product Bump Mapping
 
see also:

 

结合上面所述,我们就可计算light vector(已从world space转换到object space)在每个vertextangent space中的分量: 

 

抱歉!评论已关闭.