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
}
#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(),以在视点坐标空间下顶点的反射向量为纹理坐标采样立方体纹理得到纹理颜色。