OPenGL紋理的載入

1. 位圖

像素?cái)?shù)據(jù)由位圖(一系列表示像素值開啟和關(guān)閉0夜畴,1)來表示的。每個(gè)內(nèi)存中存儲(chǔ)的位圖數(shù)據(jù)和像素開啟和關(guān)閉是一一對(duì)應(yīng)的。

2. 像素包裝

像素?cái)?shù)據(jù)的字節(jié)以特定方式與地址對(duì)齊的方式。比如說很多計(jì)算機(jī)CPU每四個(gè)字節(jié)從緩沖區(qū)讀取數(shù)據(jù)醉途,而以每四個(gè)字節(jié)與地址對(duì)齊的方式,可以提高其讀寫效率砖茸。

3. 像素圖

像素圖屬于位圖隘擎,像素圖的位數(shù)比較多,一般為8位凉夯,16位和32位货葬,可以顯示的顏色為2的位數(shù)次方,此外像素圖還有一個(gè)附加位劲够,用來表示屏幕的兩度或者顏色值的強(qiáng)度震桶。OpenGL中無法將像素?cái)?shù)據(jù)寫入到顏色緩沖區(qū),但是可以指定顏色緩沖區(qū)內(nèi)容征绎,也就是我們用一種形式表示圖像數(shù)據(jù)蹲姐,通過直接讀取顏色緩沖區(qū)的數(shù)據(jù)而間接的提取出相關(guān)的像素?cái)?shù)據(jù)。比如說可以通過這個(gè)函數(shù)進(jìn)行提取人柿。

void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);

x, y為矩形窗口在窗口左下角坐標(biāo)淤堵,width和height為矩形寬和高,矩形為對(duì)應(yīng)圖像數(shù)據(jù)的區(qū)域顷扩。pixels指針為圖像數(shù)據(jù)在內(nèi)存中的地址。format為pixels指向的顏色緩沖區(qū)存取數(shù)據(jù)元素的顏色布局慰毅。type為pixels指向顏色緩沖區(qū)存取的數(shù)據(jù)類型隘截。
需要注意的,glReadPixelds從圖形硬件中復(fù)制數(shù)據(jù),通常通過總線傳輸?shù)絻?nèi)存,這種情況下應(yīng)用程序會(huì)被阻塞,直到內(nèi)存?zhèn)鬏斖瓿?而且指定一個(gè)與本地圖形硬件不同的像素布局,也會(huì)帶來額外的開銷.

4. 包裝的像素格式

如果一個(gè)字節(jié)等于8位,通常我們用八位表示三原色的一個(gè)分量,那么顯示一種顏色需要三個(gè)字節(jié),但是經(jīng)過包裝后,比如說我們可以用八位就可以表示一種顏色,比如說從高位到低位,沒三位表示三原色的一種分量,后一位表示一種三原色的分量,這樣對(duì)圖像數(shù)據(jù)進(jìn)行包裝,可以節(jié)省大量的內(nèi)存的空間.或者更快的進(jìn)行操作.

5. 載入紋理

將紋理數(shù)據(jù)載入到內(nèi)存中汹胃,在OpenGL一般我們通過下面三個(gè)函數(shù)

void glTexImage1d(GLenum target, GLint level, GLint internalformat , GLseizei width, GLint border , GLenum format, GLenum type, void *data)
void glTexImage2d(GLenum target, GLint level, GLint internalformat , GLseizei width, GLseizei height, GLint border , GLenum format, GLenum type, void *data)
void glTexImage3d(GLenum target, GLint level, GLint internalformat , GLseizei width, GLseizei height,  GLseizei depth, GLint border , GLenum format, GLenum type, void *data)

target參數(shù)為載入紋理單元的模式婶芭,level為mip的層次,internalformat為每個(gè)紋理單元存儲(chǔ)的顏色成分着饥,如果指定顏色組成的特定方式犀农,也可作為壓縮紋理數(shù)據(jù)的參數(shù),width,height,depth指定了被加載紋理數(shù)據(jù)的范圍, border為每個(gè)紋理單元額外的邊界宰掉。format為紋理數(shù)據(jù)的顏色布局呵哨,type為存儲(chǔ)到內(nèi)存中的紋理數(shù)據(jù)類型,data為紋理數(shù)據(jù)對(duì)應(yīng)的地址指針轨奄。

6.從顏色顏色緩存區(qū)讀取紋理數(shù)據(jù)

可以使用下面兩個(gè)函數(shù)

void glCopyTexImage1d(GLenum target, GLint level, GLint internalformat , GLint x, GLseizei width, GLint border)
void glCopyTexImage2d(GLenum target, GLint level, GLint internalformat , GLint x, GLint y, GLseizei width, GLseizei height, GLint border)

其中x,y為指定內(nèi)存中要加載紋理的位置孟害,需要注意的是顏色緩沖區(qū)沒有深度的概念,故不能加載三維的紋理數(shù)據(jù)挪拟。

7. 更新紋理

頻繁的載入紋理數(shù)據(jù)挨务,實(shí)際上是對(duì)內(nèi)存的寫操作,內(nèi)存的寫操作是很耗性能的,當(dāng)我們不在需要這段紋理時(shí)谎柄,這時(shí)候我們可以在這段紋理的內(nèi)存上進(jìn)行紋理的替換或者部分替換丁侄,而避免再次重新寫入新的紋理數(shù)據(jù)。下面幾個(gè)函數(shù)可以完成紋理更新

void glTexSubImage1d(GLenum target, GLint level, GLint xOffset, GLseizei width, GLint border , GLenum format, GLenum type, void *data )
void glTexSubImage2d(GLenum target, GLint level, GLint xOffset, GLint yOffset, GLseizei width, GLseizei height, GLint border , GLenum format, GLenum type, void *data)
oid glTexSubImage3d(GLenum target, GLint level , GLint xOffset, GLint yOffset, GLint zOffset, GLseizei width, GLseizei height, GLint border , GLenum format, GLenum type, void *data)

其中xOffset,yOffset,zOffset,為需要更新的紋理在原紋理的坐標(biāo)偏移量朝巫。

8.在顏色顏色緩存區(qū)更新紋理

void glCopyTexSubImage1d(GLenum target, GLint level, GLint xOffset, GLint x, GLint y,   GLseizei width )
void glCopyTexSubImage2d(GLenum target, GLint level, GLint xOffset, GLint yOffset, GLint x, GLint y,  GLseizei width, GLseizei height)
oid glCopyTexSubImage3d(GLenum target, GLint level , GLint xOffset, GLint yOffset, GLint zOffset, GLint x, GLint y, GLseizei width, GLseizei height)

需要注意的地方從顏色緩存區(qū)讀取紋理數(shù)據(jù)是沒有g(shù)lCopyTexImage3d函數(shù)的鸿摇,這是因?yàn)轭伾彌_區(qū)是沒有深度概念的,只可以將2D彩色圖片設(shè)置成2D紋理捍歪,但是我們更新顏色緩沖區(qū)的紋理是可以使用glCopyTexSubImage3d函數(shù)的户辱,因?yàn)榧y理有深度的概念,我們可以用紋理單元平面來設(shè)置一個(gè)二維的紋理糙臼。

9.紋理對(duì)象

當(dāng)載入紋理數(shù)據(jù)后庐镐,這時(shí)候我們是需要管理這些紋理的,如果用到哪個(gè)紋理狀態(tài)就加載哪個(gè)紋理數(shù)據(jù)或者更新哪個(gè)紋理的話变逃,這樣顯然是很耗費(fèi)性能的必逆,紋理對(duì)象允許一次加載多個(gè)紋理,通過一段特定的無符號(hào)整形數(shù)據(jù)一個(gè)指針指向這段紋理內(nèi)存揽乱,這樣我們通過紋理對(duì)象可以方便的進(jìn)行多個(gè)紋理的管理名眉。
首先使用下面這個(gè)函數(shù)進(jìn)行紋理對(duì)象的分配

void glGenTextures(GLSizei n, GLint * textures)

n為紋理對(duì)象的個(gè)數(shù), textures為紋理對(duì)象集合的指針
通過下面的函數(shù)進(jìn)行紋理與紋理對(duì)象的綁定

void glBindTexture(GLEnum target, GLint *texture)

target為紋理數(shù)據(jù)的坐標(biāo)形式凰棉,teture為指向紋理內(nèi)存的指針损拢。
可以使用下面的函數(shù)進(jìn)行紋理對(duì)象的刪除

void glDeleteTextures(GLSizei n, GLint * textures)

n為要?jiǎng)h除的紋理個(gè)數(shù),textures為要?jiǎng)h除的紋理集合
可以使用下面的函數(shù)判斷紋理對(duì)象是否有綁定紋理狀態(tài)

GLboolean GLIsTexture(GLint teure)

teure為要判讀是否存在的紋理對(duì)象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撒犀,一起剝皮案震驚了整個(gè)濱河市福压,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌或舞,老刑警劉巖荆姆,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異映凳,居然都是意外死亡胆筒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門诈豌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仆救,“玉大人,你說我怎么就攤上這事矫渔∨勺” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蚌斩,是天一觀的道長(zhǎng)铆惑。 經(jīng)常有香客問我范嘱,道長(zhǎng),這世上最難降的妖魔是什么员魏? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任丑蛤,我火速辦了婚禮,結(jié)果婚禮上撕阎,老公的妹妹穿的比我還像新娘受裹。我一直安慰自己,他們只是感情好虏束,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布棉饶。 她就那樣靜靜地躺著,像睡著了一般镇匀。 火紅的嫁衣襯著肌膚如雪照藻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天汗侵,我揣著相機(jī)與錄音幸缕,去河邊找鬼。 笑死晰韵,一個(gè)胖子當(dāng)著我的面吹牛发乔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雪猪,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栏尚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了只恨?” 一聲冷哼從身側(cè)響起译仗,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坤次,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斥赋,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缰猴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疤剑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滑绒。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隘膘,靈堂內(nèi)的尸體忽然破棺而出疑故,到底是詐尸還是另有隱情,我是刑警寧澤弯菊,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布纵势,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钦铁。R本人自食惡果不足惜软舌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牛曹。 院中可真熱鬧佛点,春花似錦、人聲如沸黎比。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阅虫。三九已至演闭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間书妻,已是汗流浹背船响。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躲履,地道東北人见间。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像工猜,于是被迫代替她去往敵國(guó)和親米诉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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