立方体贴图(cube mapping)

OpenGL实现立方体贴图;所谓立方体贴图,就是用6张纹理来形成一个立方体,当然这个不是为了直接显示的,然后根据物体在的位置,视点,通过反射,与立方体的交点处的颜色值就是该点的纹理了,也就是对现实世界光滑物体反射周围环境的一种模拟。
OpenGL中实现环境映射不止这一种,在Nehe也有提到这个,不过不是用的cube mapping 而是sphere 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;
然后用同样的方法将立方体表面上的每个点赋给一个象素值。这样实际上就是为任意向量建立了单位向量查询表,任意方向,任意长度的向量都可以在立方体的表面上对应一个象素值,此象素值的颜色信息就是此向量对应的单位向量
说得不是太清楚的话看下面一篇文章应该就没有问题了:http://developer.nvidia.com/object/cube_map_ogl_tutorial.html
(最近才发现nv这个宝库。。死罪。。。)
下面是程序中设置环境映射的核心代码:

void CubeMapping::DoCubeMapping()
{
    
char *imgFile[6= { "image/cm_left.tga""image/cm_right.tga""image/cm_top.tga""image/cm_bottom.tga""image/cm_back.tga""image/cm_front.tga" };
    
    
int i=0;
    
for(i=0;i<6;i++)
    {    

        LoadTGA(cubeTextures[i],imgFile[i]);
        gluBuild2DMipmaps(cubeFaces[i],GL_RGB,cubeTextures[i]
->width,cubeTextures[i]->height,GL_RGB,GL_UNSIGNED_BYTE,cubeTextures[i]->imageData);

    }
    glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);
    glEnable(GL_TEXTURE_GEN_R);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT);
    glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT);
    glEnable(GL_TEXTURE_CUBE_MAP_EXT);
    glEnable(GL_TEXTURE_CUBE_MAP_EXT);
    glEnable(GL_NORMALIZE);    

}

提一句,Cube Mapping在OpenGL中是以EXT_texture_cube_map扩展的形式存在的 需要检查是否支持
程序运行效果如下:



源程序下载:/Files/gin_dl/源代码.rar
程序中可以使用 上下左右,w,s,1,2(非小键盘)控制程序
posted @ 2009-08-23 12:40  gin@wzl  阅读(1514)  评论(0编辑  收藏  举报