1.紋理對象:數組
使用紋理對象來存儲紋理數據的步驟:函數
1) 生成紋理對象名稱
2) 將紋理對象綁定到紋理數據(包括圖像數據數組和紋理屬性), 即建立紋理對象.
3)
若是OpenGL實現高性能紋理工做集, 應檢查是否有足夠的空間來存儲全部的紋理對象. 如沒有足夠空間, 應設置每一個紋理對象的優先級,
以確保最經常使用的紋理留在工做集中
4) 綁定和從新綁定紋理對象, 以即可以將其中的紋理映射到物體上.性能
2.生成紋理對象名稱:ui
void glGenTextures(GLsizei n, GLint* textureNames); spa
功能: 經過數組textureNames返回n個未用的紋理對象名, 返回的名稱沒必要是相鄰的整數.指針
GLboolean glIsTexture(GLint textureName);對象
功能: 如textureName是已被綁定的紋理對象名, 且沒有被刪除, 則返回GL_TRUE, 如textureName爲0, 或非0,
但不是已有紋理對象的名稱, 返回GL_FALSE。get
注:若glGenTextures()返回, 但未使用glBindTextures()綁定, 仍返回GL_FALSEit
3.建立和使用紋理對象:io
void glBindTexture(GLenum target, GLuint textureName);
功能: 完成下面幾項工做.
1) 如textureName爲非零無符號整數, 首次被使用, 則建立一新的紋理對象, 並將其名稱設置爲參數textureName的值.
2) 綁定一個已建立的紋理對象時, 該紋理對象將進入活動狀態
3) 如textureName爲0, OpenGL將中止使用紋理對象, 返回到未命名的默認紋理
4) 首次被建立時, target指定了維數, 其取值爲GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D 或
GL_TEXTURE_CUBE_MAP.
5) 首次被建立時, 諸如縮小濾波方法, 放大濾波方法, 環繞模式, 邊框顏色, 紋理優先級等紋理屬性被設置爲默認值.
若是有多個使用週期較短且大小相同的紋理, 能夠調用函數glTexSubImage*()將不一樣的圖像加載到已有的紋理對象中,與刪除並從新建立紋理對象相比, 這樣作的效率可能更高
功能: 將n個紋理對象的優先級設置爲指定的值, 數組textureNames指定了這些紋理對象的名稱, 數組priorities指定了優先級.
priorities: 指定了優先級, 將其值截取到[0.0, 1.0], 0對應的優先級最低, 1對應的優先級最高
函數glPrioritiesTextures()步要求textureNames中指定的紋理對象被綁定過.
函數glTexParameter*()也可用於設置單個紋理對象的優先級. 但僅限於當前綁定的紋理對象.
4.紋理函數:
void glTexEnv(if)(GLenum target, GLenum pname, TYPE param);
void glTexEnv(if)v(GLenum target, GLenum pname, TYPE* param);
功能: 設置當前的紋理映射方式.
target: 必須爲GL_TEXTURE_FILTER_CONTROL或GL_TEXTURE_ENV
pname: 如target爲GL_TEXTURE_FILTER_CONTROL, pname必須爲GL_TEXTURE_LOD_BIAS.
如target爲GL_TEXTURE_ENV, pname可爲GL_TEXTURE_ENV_MODE,
GL_TEXTURE_ENV_COLOR
param: 如pname爲GL_TEXTURE_LOD_BIAS, param是一個浮點數, 用於指定GL_TEXTURE_LOD_BIAS的值.
如pname爲GL_TEXTURE_ENV_MODE,param的取值爲GL_DECAL,GL_REPLACE,GL_MODULATE,GL_BLEND,
GL_ADD或GL_COMBINE. 指定了如何將紋理值和片元的顏色值合併起來.
如pname爲GL_TEXTURE_ENV_COLOR, 則參數pname是一個包含4個浮點數的數組, 這4個元素分別是R, G, B, A份量,
指定了一種用於GL_BLEND操做的顏色.
紋理映射方式和基本內部結構一塊兒決定了如何應用紋素數據的各個份量
紋理映射方式做用於被選擇的紋素數據份量和片元的顏色值.
5.指定紋理座標:
紋理座標可包含1-4個份量, 這些份量一般被稱爲s, t, r和q座標.
一維紋理, 使用s座標. 二維紋理, 使用s和t座標, 三維紋理, 使用s,
t和r座標. q座標一般被設置爲1, 用於建立齊次座標.
void glTexCoord[1234][sifd](TYPE
coords);
void glTexCoord[1234][sifd]v(TYPE* coords);
功能: 設置當前的紋理座標(s,t,r,q),
計算合適的紋理座標
因爲映射的格式與紋理格式不符,容易形成扭曲的狀況,此次要選擇恰當的紋理座標來映射
紋理的重複和截取
紋理座標被指定爲範圍[0, 1]以外的值時, 將截取紋理座標或重複紋理圖像
也可使用環繞模式"鏡像(mirrored)"重複, 重複時翻轉紋理圖像
例如: 在紋理座標範圍[0,1]內,俺原來順序使用紋理數據, [1, 2]則相反順序使用紋理數據, [2, 3]又按原來的順序使用, 依次類推
另外一種環繞模式是截取紋理座標: 將大於1.0的座標設置爲1.0, 將小於0.0的座標設置爲0.0.
如何使用紋理邊框顏色:
1) 若是環繞模式爲GL_REPEAT, 老是忽略邊框. 從對側選擇一個2X2紋素陣列來計算加權平均.
2) 若是環繞模式爲GL_CLAMP, 將邊框紋素(或GL_TEXTURE_BORDER_COLOR的值)用於計算2X2加權平均
3) 若是環繞模式爲GL_CLAMP_TO_EDGE, 老是忽略邊框. 使用紋理邊緣或靠近紋理邊緣的紋素被用於紋理計算, 但不使用邊框上的紋素.
4) 若是環繞模式爲GL_CLAMP_TO_BORDER, 紋理座標超出了範圍[0, 1], 則只使用邊框紋素(若是沒有邊框,
使用邊框常量顏色)來計算紋理映射.
6.自動生成紋理座標:
void glTexGen[ifd](GLenum coord, GLenum pname, TYPE param);
void glTexGen[ifd]v(GLenum coord, GLenum pname, TYPE *param);
功能: 指定用於自動生成紋理座標的函數(function).
coord: 必須是GL_S, GL_T, GL_R, GL_Q. 指出生成s, t, r仍是q紋理座標
pname: 爲GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, GL_EYE_PLANE
param: 如pname爲GL_TEXTURE_GEN_MODE, param爲一個整數, 取值爲GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP, GL_REFLECTION_MAP, GL_NORMAL_MAP
pname爲其餘值, param是一個指向數組的指針(向量版本), 數組中包含提供給紋理生成函數的參數值.
紋理圖像映射到固體物體上, 使用物體座標指定參考較合適. GL_OBJECT_LINEAR.
移動的物體上生成動態的等高線時, 使用眼座標GL_EYE_LINEAR較合適.
球形環境映射用GL_SPHERE_MAP較合適.
立方圖用GL_NORMAL_MAP.