GLSL之环境纹理

  之前也看过环境纹理的实现原理,可是理解总不是那么透彻,今天再次看了一遍,以作巩固。

  环境纹理的实现方法有多种,其中典型的方法包括:立方体纹理、球型纹理、抛物线纹理。在这三种方法中,立方体纹理的效果最好。下面简单介绍如何使用立方体纹理。

首先,准备六张在六个方向上的环境纹理图片,分别是在positive_x,negative_x,positive_y,negative_y,positive_z,negative_z六个方向。 加载六张纹理图片代码如下:

for (i=0; i<6; i++) {
  glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT + i,
    0,                  //level
    GL_RGB8,            //internal format
    64,                 //width
    64,                 //height
    0,                  //border
    GL_RGB,             //format
    GL_UNSIGNED_BYTE,   //type
    &face[i][0][0][0]); // pixel data
}

其中GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT的定义为:

#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT  0x8515
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT  0x8516
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT  0x8517
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT  0x8518
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT  0x8519
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT  0x851A  

还要制定纹理坐标,OpenGL中采用了自动生成纹理坐标,有两种纹理生成模式,反射生成模式为:

glTexGenfv(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT);
glTexGenfv(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT);
glTexGenfv(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
 法线生成模式如下:

     glTexGenfv(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);

glTexGenfv(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
glTexGenfv(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
这样就产生了一个环境纹理。

也可以在片元着色器中采样纹理,使用textureCube(),以在视点坐标空间下顶点的反射向量为纹理坐标采样立方体纹理得到纹理颜色。

posted @ 2010-04-09 23:16  Bigcoder  阅读(1642)  评论(0编辑  收藏  举报