環境映射即在表面『映射』其它物體,如湖面上『映射』出『樹、雲、天、人』,而OpenGL並不是真正地對環境進行反射獲得的效果.演示函式下載:
- 創建物體表面的紋理圖
- 使用OpenGL自動生成相應的紋理座標,可以使用GL_SPHERE_MAP(球體映射)和GL_REFLECTION_MAP(反射光映射)
- 移動鏡頭到物體並指向視點
- 隨著物體的移動而生成新的紋理座標,使得環境反射效果隨著物體移動而變化,使用glCopyTexImage2D()和glCopyTexSubImage2D()從屏幕上拷貝並生成紋理
- 如果要填充多邊形顏色,你要禁用紋理glDisable(GL_TEXTURE_2D);才能正確渲染.
紋理座標生成函式:
void glTexGenf(GLenum coord,GLenum pname, GLenum param)
glTexGenf()函式coord: | 簡介 |
GL_S | s紋理坐標 |
GL_T | t紋理坐標 |
GL_R | r紋理坐標 |
GL_Q | q紋理坐標 |
glTexGenf()函式pname: | param簡介 |
GL_TEXTURE_GEN_MODE | GL_SPHERE_MAP
GL_REFLECTION_MAP GL_OBJECT_LINEAR GL_EYE_LINEAR GL_NORMAL_MAP |
GL_OBJECT_PLANE | Param指向生成紋理坐標所需的4個元素,配合GL_OBJECT_LINEAR使用 |
GL_EYE_PLANE | Param指向生成紋理坐標所需的4個元素,配合GL_EYE_LINEAR使用 |
生成環境映射紋理代碼
glGenTextures(1, &texture.ID);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture.ID);
設定紋理參數代碼
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
將紋理坐標生成模式設置為環境映射(反射光)函式
glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGenf(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
移動鏡頭到物體並指向視點,設置屏幕以匹配環境映射的大小
glViewport(0, 0, 256,256);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
設置90度視口
gluPerspective(90, 1, 0.1, 500);
glMatrixMode(GL_MODELVIEW);
glClear(GL_DEPTH_BUFFER_BIT);
載入單位矩陣
glLoadIdentity();
設定相機
gluLookAt(0.0, 0.0, 0.0,posx,posy,posz,neggx,negy,negz);
通過glCopyTexImage2D()和glCopyTexSubImage2D()從屏幕上拷貝並生成環鏡映射紋理
從緩衝區中拷貝像素創建紋理函式
typedef void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
從緩衝區中拷貝部分像素創建紋理函式
typedef void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
渲染環鏡映射代碼
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
使用立方體映射
glEnable(GL_TEXTURE_CUBE_MAP);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture.ID);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
gluSphere(quadric, 1.0, 64, 64);// 繪畫大球球體
glDisable(GL_TEXTURE_CUBE_MAP);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);