OpenGL學(xué)習(xí)之紋理

紋理只是一種能夠應(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)繞方式


    環(huán)繞方式
環(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ù)提取的壓縮紋理格式


glGetTexLevelParameter函數(shù)提取的壓縮紋理格式

GL_EXT_texture_compression_s3tc壓縮格式


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)蒂培,即紋理圖片的右上角

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末再愈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子护戳,更是在濱河造成了極大的恐慌翎冲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媳荒,死亡現(xiàn)場離奇詭異抗悍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钳枕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門缴渊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鱼炒,你說我怎么就攤上這事衔沼。” “怎么了昔瞧?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵俐巴,是天一觀的道長。 經(jīng)常有香客問我硬爆,道長欣舵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任缀磕,我火速辦了婚禮缘圈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袜蚕。我一直安慰自己糟把,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布牲剃。 她就那樣靜靜地躺著遣疯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凿傅。 梳的紋絲不亂的頭發(fā)上缠犀,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天数苫,我揣著相機(jī)與錄音,去河邊找鬼辨液。 笑死虐急,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滔迈。 我是一名探鬼主播止吁,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼燎悍!你這毒婦竟也來了敬惦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤谈山,失蹤者是張志新(化名)和其女友劉穎仁热,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勾哩,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年举哟,在試婚紗的時候發(fā)現(xiàn)自己被綠了思劳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡妨猩,死狀恐怖潜叛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壶硅,我是刑警寧澤威兜,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站庐椒,受9級特大地震影響椒舵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜约谈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一笔宿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棱诱,春花似錦泼橘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戚揭。三九已至扭倾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佛吓。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崇渗,地道東北人旋廷。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像狈网,于是被迫代替她去往敵國和親宙搬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容