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
有几种表现形式
,
之一为
elevation
或
height map,
存储了每个象素的高度变量
,
通常以
grayscale
格式存储
;
之二为
normal map
,
存储了纹理图每个象素的
normal vector.
此种情况下常把
RGB
值作为
normal vector
的
3D
坐标
.
简而概之
:
Bump mapped rendered surface = Base_texture + Bump_mapped texture
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.
反转图的偏移方向由
[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);
在
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:
反转图的偏移方向由
[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);
在
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:
结合上面所述,我们就可计算light vector(已从world space转换到object space)在每个vertex的tangent space中的分量: