紋理只是一種能夠應(yīng)用到場景中的三角形上的圖像數(shù)據(jù)渊鞋。它經(jīng)過過濾的紋理單元(texel绰更,相當(dāng)于基于紋理的像素)填充到實(shí)心區(qū)域瞧挤。
簡單的說就是加載圖片,底層是使用紋理實(shí)現(xiàn)的
一儡湾、紋理 常用API 解析
紋理對象
紋理對象允許我們一次加載一個以上紋理狀態(tài)(包含紋理圖像)特恬。以及在它們之間進(jìn)行快速切換。紋理狀態(tài)是由當(dāng)前綁定的紋理對象維護(hù)的徐钠。而紋理對象時一個無符號整數(shù)標(biāo)識的癌刽。
//使用函數(shù)分配紋理對象
//指定紋理對象的數(shù)量 和 指針 (指針指向一個無符號整形數(shù)組,有紋理對象標(biāo)識符填充)
void glGenTextures(GLsizei n, GLunint * textTures);
//綁定紋理狀態(tài)
//參數(shù)target:GL_TEXTURE_1D尝丐、GL_TEXTURE_3D显拜、GL_TEXTURE_3D
//參數(shù)texture:需要綁定的紋理對象
void glBindTexture(GLenum target, GLunit texture)
//刪除綁定紋理對象
//紋理對象 以及 紋理對象指針 (指針指向一個無符號整形數(shù)組,有紋理對象標(biāo)識符填充)
void glDeleteTextures(GLsizei n, GLunit *textures);
//測試紋理對象是否有效
//如果texture是一個已經(jīng)分配空間的紋理對象爹袁,那么這個函數(shù)會返回GL_TRUE,否則會返回GL_FALSE远荠。
GLboolean glIsTexture(GLunit texture);
讀取TGA 紋理
//讀取TGA 紋理
//參數(shù)1: 紋理文件名稱
//參數(shù)2: 文件寬度地址
//參數(shù)3:文件高度地址
//參數(shù)4:文件組件地址
//參數(shù)5:文件格式地址
//返回值:pBits,指向圖像數(shù)據(jù)的指針
GLbyte *gltReadTGABits(const char *szFileName, GLint *iWidth, GLint *iHeight, GLint *iComponents, GLenum *eFormat);
讀取像素圖
//參數(shù)1: x,矩陣左下角的窗口坐標(biāo)
//參數(shù)2:y失息,矩陣左下角的窗口坐標(biāo)
//參數(shù)3:width譬淳,矩陣的寬,像素為單位
//參數(shù)4:height根时,矩陣的高瘦赫,像素為單位
//參數(shù)5:format,OpenGL的像素格式蛤迎,
//參數(shù)6:type确虱,解釋參數(shù)pixels指向的數(shù)據(jù),告訴OpenGL使用緩存區(qū)中的什么數(shù)據(jù)類型來存儲顏色分量替裆,像素數(shù)據(jù)的數(shù)據(jù)類型
//參數(shù)7:pixels校辩,指向圖形數(shù)據(jù)的指針
void glReadPixels(GLint x, GLint y, GLSizei width, GLSizei height, GLenum format, GLenum type, const void * pixels);
glReadBuffers(mode); ->指定讀取的緩存
glWriteBuffers(mode); ->指定寫入的緩存
紋理參數(shù)設(shè)置
//參數(shù)1:target,指定這些參數(shù)將要應(yīng)用在那個紋理模式上,比如GL_TEXTURE_1D辆童、GL_TEXTURE_2D宜咒、GL_TEXTURE_3D。
//參數(shù)2:pname,指定需要設(shè)置那個紋理參數(shù)
//參數(shù)3:param,設(shè)定特定的紋理參數(shù)的值
glTexParameterf(GLenum target,GLenum pname,GLFloat param);
glTexParameteri(GLenum target,GLenum pname,GLint param);
glTexParameterfv(GLenum target,GLenum pname,GLFloat *param);
glTexParameteriv(GLenum target,GLenum pname,GLint *param);
- 放大/縮小過濾方式
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
例子:
///紋理縮小時把鉴,使用鄰近過濾
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
///紋理放大時故黑,使用線性過濾
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
可以使用的幾種情況
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
-
S/T軸環(huán)繞方式
參數(shù)1:GL_TEXTURE_1D、GL_TEXTURE_2D庭砍、GL_TEXTURE_3D
參數(shù)2:GL_TEXTURE_WRAP_S场晶、GL_TEXTURE_T、GL_TEXTURE_R,針對s,t,r坐標(biāo)
參數(shù)3:GL_REPEAT怠缸、GL_CLAMP诗轻、GL_CLAMP_TO_EDGE、GL_CLAMP_TO_BORDER
GL_REPEAT:OpenGL 在紋理坐標(biāo)超過1.0的?向上對紋理進(jìn)?重復(fù);
GL_CLAMP:所需的紋理單元取自紋理邊界或TEXTURE_BORDER_COLOR. GL_CLAMP_TO_EDGE環(huán)繞模式強(qiáng)制對范圍之外的紋理坐標(biāo)沿著合法的紋理單元的最后一行或者最后一
列來進(jìn)行采樣揭北。
GL_CLAMP_TO_BORDER:在紋理坐標(biāo)在0.0到1.0范圍之外的只使?用邊界紋理單元扳炬。邊界紋理單元是作為圍繞基本圖像的額外的行和列吏颖,并與基本紋理圖像一起加載的。
glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_S,GL_CLAMP_TO_EDGE);
glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_T,GL_CLAMP_TO_EDGE);
載入紋理
//target:GL_TEXTURE_1D恨樟、GL_TEXTURE_2D半醉、GL_TEXTURE_3D 。
//Level :指定所加載的mip貼圖層次劝术。一般我們都把這個參數(shù)設(shè)置為0奉呛。
//internalformat:每個紋理單元中存儲多少顏色成分。
//width夯尽、height、depth 參數(shù):指加載紋理的寬度登馒、高度匙握、深度。
//border參數(shù):允許為紋理貼圖指定一個邊界寬度陈轿。
//format參數(shù):gltReadTGABits函數(shù)中,通過 eFormat 參數(shù)返回圖片的顏色格式
//type參數(shù):OpenGL 數(shù)據(jù)存儲方式,一般使用 GL_UNSIGNED_BYTE
//data參數(shù):圖片數(shù)據(jù)指針
void glTexImage1D(GLenum target,GLint level,GLint internalformat,GLsizei width,GLint border,GLenum format,GLenum type,void *data);
void glTexImage2D(GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,void * data);
void glTexImage3D(GLenum target,GLint level,GLint internalformat,GLSizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,void *data);
更新紋理
void glTexSubImage1D(GLenum target, GLint level, GLint xOffset, GLsizei width, GLenum format, GLenum type, const GLvoid *data);
void glTexSubImage2D(GLenum target, GLint level, GLint xOffset, GLsizei width, GLenum format, GLenum type, const GLvoid *data);
void glTexSubImage3D(GLenum target, GLint level, GLint xOffset, GLsizei width, GLenum format, GLenum type, const GLvoid *data);
插入替換紋理
void glCopyTexSubImage1D(GLenum target, GLint level, GLint xOffset, GLint x, GLint y, GLsize width);
void glCopyTexSubImage2D(GLenum target, GLint level, GLint xOffset, GLint x, GLint y, GLsize width);
void glCopyTexSubImage3D(GLenum target, GLint level, GLint xOffset, GLint x, GLint y, GLsize width);
壓縮方式
- 判斷壓縮 與 選擇壓縮方式
GLint comFlag;
//判斷紋理是否被成功壓縮 glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_COMPRESSED,&comFlag);
//根據(jù)選擇的壓縮紋理格式圈纺,選擇最快、最優(yōu)麦射、?行選擇的算法方式選擇壓縮格式蛾娶。
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_FASTEST);
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_NICEST);
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_DONT_CARE);
- 加載壓縮紋理
void glCompressedTexImage1D(GLenum target,GLint level,GLenum internalFormat,GLsizei width,GLint border,GLsizei imageSize,void *data);
void glCompressedTexImage2D(GLenum target,GLint level,GLenum internalFormat,GLsizei width,GLint heigth,GLint border,GLsizei imageSize,void *data);
void glCompressedTexImage3D(GLenum target,GLint level,GLenum internalFormat,GLsizei width,GLsizei heigth,GLsizei depth,GLint border,GLsizei imageSize,void *data);
target:`GL_TEXTURE_1D`、`GL_TEXTURE_2D`潜秋、`GL_TEXTURE_3D`蛔琅。
Level:指定所加載的mip貼圖層次。?一般我們都把這個參數(shù)設(shè)置為0峻呛。 internalformat:每個紋理理單元中存儲多少顏色成分罗售。
width、height钩述、depth參數(shù):指加載紋理理的寬度寨躁、?度、深度牙勘。==注意!==這些值必須是2的整數(shù)次?职恳。(這是因?yàn)镺penGL舊版本上的遺留下的一個要求。當(dāng)然現(xiàn)在已經(jīng)可以?持不是2的整數(shù)次方方面。但是開發(fā)者們還是習(xí)慣使用以2的整數(shù)次方去設(shè)置參數(shù)放钦。)
border參數(shù):允許為紋理貼圖指定?個邊界寬度。
format葡幸、type最筒、data參數(shù):與我們在講glDrawPixels 函數(shù)對于的參數(shù)相同
glGetTexLevelParameter函數(shù)提取的壓縮紋理格式
GL_EXT_texture_compression_s3tc壓縮格式
二、紋理坐標(biāo)解析
為了能夠把紋理映射(Map)到三角形上蔚叨,我們需要指定三角形的每個頂點(diǎn)各自對應(yīng)紋理的哪個部分床蜘。這樣每個頂點(diǎn)就會關(guān)聯(lián)著一個紋理坐標(biāo)(Texture Coordinate)辙培,用來標(biāo)明該從紋理圖像的哪個部分采樣(采樣:采集片段顏色)。之后在圖形的其它片段上進(jìn)行片段插值(Fragment Interpolation)邢锯。
2D紋理坐標(biāo)在x和y軸上扬蕊,范圍為0到1之間。使用紋理坐標(biāo)獲取紋理顏色叫做采樣(Sampling)丹擎。紋理坐標(biāo)起始于(0, 0)尾抑,也就是紋理圖片的左下角,終始于(1, 1)蒂培,即紋理圖片的右上角