Cube Mapping

1.传统的2D纹理映射是将物体表面的某个点和一个2维坐标系中某个点对应的一种映射。环境映射(Environment Mapping)是将物体表面的某个点和一个3维空间中的某个向量对应的一种映射。 
2.Cube Mapping是一种环境映射,其他的环境映射还有Sphere Mapping和Dual Daraboloid Mapping。

Sphere Mapping在OpenGL可以通过指定纹理坐标生成模式为GL_SPHERE_MAP来实现,具体的代码如下: 
  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);   
  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);


Dual Daraboloid Mapping需要以下两个条件: 
         two texture units;   //这个可以通过texture object来实现 
或者   two texture passes;  //这个可以通过multitexture来实现 
同时还需要指定问题坐标生成模式为GL_REFLECTION_MAP,具体代码如下: 
  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP);   
  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP);


3.Cube Mapping在OpenGL中是以EXT_texture_cube_map扩展的形式存在的,最早出现在OpenGL 1.3中。 
4.Cube Mapping其他的用途包括:Stable Specular Highlights,Skylight Illumination,Dynamic Cube Map Reflections,Fancy Per-Pixel Lighting.在Per-Pixel Lighting中,Cube Mapping主要目的是用来归一化向量的,下面是具体的步骤


   设一个立方体(Cube)表面上的任意点的坐标是(x,y,z),则从立方体原点到此点的向量是V=(x,y,z),将此向量归一化后,设归一化后的向量是V'=(x',y',z'),其中-1<=x',y',z'<=1,在用颜色信息表示这个单位向量的过程中,需要做特殊的处理,将x',y',z'的大小转化到[0,255]这个范围内,具体的转换公式是: 
  V''=( V'+(1,1,1) )/2.0*255; 
然后用同样的方法将立方体表面上的每个点赋给一个象素值。这样实际上就是为任意向量建立了单位向量查询表,任意方向,任意长度的向量都可以在立方体的表面上对应一个象素值,此象素值的颜色信息就是此向量对应的单位向量。

下面是我写的一个完整的Cube Mapping代码:


  
  
  1. static GLenum faceTarget[6] = {  
  2.  GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,  
  3.  GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,  
  4.  GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,  
  5.  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,  
  6.  GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,  
  7.  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT  
  8. };  
  9. /* Pre-generated cube map images. */  
  10. char *faceFile[6] = { "cm_left.bmp""cm_right.bmp""cm_top.bmp""cm_bottom.bmp",   
  11.      "cm_back.bmp""cm_front.bmp" };  
  12.   
  13. void makeCubemap()  
  14. {  
  15.  glEnable(GL_TEXTURE_CUBE_MAP_EXT);  
  16.  forint i=0; i<6; i++ )  
  17.  {  
  18.   LoadBMPff(faceFile[i],faceTarget[i]);  
  19.  }  
  20.  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  
  21.  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  
  22.   
  23.  glEnable(GL_TEXTURE_GEN_S);  
  24.  glEnable(GL_TEXTURE_GEN_T);  
  25.  glEnable(GL_TEXTURE_GEN_R);  
  26.  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);  
  27.  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);  
  28.  glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);  
  29.  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);  
  30.  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);  
  31.  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);  
  32. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值