OpenGL紋理映射總結


1.紋理對象:

使用紋理對象來存儲紋理數據的步驟:

1) 生成紋理對象名稱
2) 將紋理對象綁定到紋理數據(包括圖像數據數組和紋理屬性), 即創建紋理對象.
3)
如果OpenGL實現高性能紋理工作集, 應檢查是否有足夠的空間來存儲所有的紋理對象. 如沒有足夠空間, 應設置每個紋理對象的優先級,
以確保最常用的紋理留在工作集中
4) 綁定和重新綁定紋理對象, 以便可以將其中的紋理映射到物體上.

2.生成紋理對象名稱:

void glGenTextures(GLsizei n, GLint* textureNames);

功能: 通過數組textureNames返回n個未用的紋理對象名, 返回的名稱不必是相鄰的整數.

GLboolean glIsTexture(GLint textureName);

功能: 如textureName是已被綁定的紋理對象名, 且沒有被刪除, 則返回GL_TRUE, 如textureName為0, 或非0,
但不是已有紋理對象的名稱, 返回GL_FALSE。

注:若glGenTextures()返回, 但未使用glBindTextures()綁定, 仍返回GL_FALSE

3.創建和使用紋理對象:

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*()將不同的圖像加載到已有的紋理對象中,與刪除並重新創建紋理對象相比, 這樣做的效率可能更高

void glPrioritiesTextures(GLsizei n, const GLuint *textureNames, const
GLclampf *priorities);

功能: 將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.

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM