OpenGL之環境映射

OpenGL之環境映射

環境映射即在表面『映射』其它物體,如湖面上『映射』出『樹、雲、天、人』,而OpenGL並不是真正地對環境進行反射獲得的效果.演示函式下載:

  1. 創建物體表面的紋理圖
  2. 使用OpenGL自動生成相應的紋理座標,可以使用GL_SPHERE_MAP(球體映射)和GL_REFLECTION_MAP(反射光映射)
  3. 移動鏡頭到物體並指向視點
  4. 隨著物體的移動而生成新的紋理座標,使得環境反射效果隨著物體移動而變化,使用glCopyTexImage2D()和glCopyTexSubImage2D()從屏幕上拷貝並生成紋理
  5. 如果要填充多邊形顏色,你要禁用紋理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);

評論