OpenGL紋理詳解(下)

紋理的加載

當我們設置好紋理對象后暴匠,就可以加載我們的紋理數(shù)據(jù)了孙咪。下面這個例子演示了如何加載一幅2*2像素的紋理:

加載一幅2*2的紋理?

這個函數(shù)非常重要沃饶,下面我們來看一下每個參數(shù)所表示的意義:

第一個參數(shù)很簡單先紫,表示綁定紋理對象的種類骗绕,這里我們依然以GL_TEXTURE_2D的紋理為例。

第二個參數(shù)表示該紋理對應的mipmaps的等級蹲嚣,0表示沒有進行縮小的原始圖片等級递瑰。

第三個參數(shù)表示了紋理所采用的內部格式,內部格式是我們的像素數(shù)據(jù)在顯卡中存儲的格式隙畜,這里的GL_RGB顯然就表示紋理中像素的顏色值是以RGB的格式存儲的抖部。

第四個和第五個參數(shù)表示了紋理的寬和高,這里我們采用的是2*2像素寬度的紋理议惰,因此這兩個參數(shù)都是2慎颗。

第六個參數(shù)通常為0.

第七和第八個參數(shù)描述了像素在內存中的存儲格式和數(shù)據(jù)類型。

第九個參數(shù)是存放紋理數(shù)據(jù)的指針。

不過問題又來了俯萎,我們如何生成一個含有紋理數(shù)據(jù)的數(shù)組呢傲宜?在實際工作中,我們通常需要使用一張JPG和PNG等格式的圖片文件作為模型的紋理夫啊,而OpenGL中并沒有提供相關API用于將這些圖片文件轉換成我們所需要的數(shù)組函卒。因此我們需要使用第三方庫來解決這一難題,目前使用得最廣泛的應該是SOIL庫撇眯,下面我們將以它為例來介紹如何將圖片文件轉換成紋理數(shù)據(jù)报嵌。

SOIL

SOIL(Simple OpenGL Image Library)是一個簡單易用的圖片加載庫,它提供的API可以將指定的任意格式圖片文件加載并生成紋理數(shù)據(jù):

SOIL庫加載圖片生成紋理

這里熊榛,我們將一個名為“img.png”的圖片文件加載進內存锚国,最終將存儲紋理數(shù)據(jù)的指針image返回給我們,并且這個API還同時可以獲取圖片的寬度width和高度height玄坦,也可以指定內部格式為RGB血筑。

紋理數(shù)據(jù)使用完畢后釋放的工作也可以交給它完成:

SOIL庫釋放紋理數(shù)據(jù)?

正如上一篇中所提到的,OpenGL中紋理坐標系是以紋理左下角為坐標原點的煎楣,而圖片中像素的存儲順序是從左上到右下的豺总,因此我們需要對我們的坐標系進行一次Y軸的“翻轉”。我們以后的教程中的0,0坐標將會假設為是紋理的左上角而不再是左下角转质,這樣講解起來會更加直觀一些园欣。

使用紋理

我們知道紋理是采用紋理坐標進行采樣的,我們在使用紋理時休蟹,需要將頂點對應的紋理坐標輸入OpenGL沸枯。這里我們創(chuàng)建一個矩形區(qū)域的頂點數(shù)組,數(shù)組里每個頂點所包含的數(shù)據(jù)除位置赂弓、顏色外绑榴,還有紋理坐標的s和t值。

包含紋理坐標的頂點數(shù)組

頂點著色器中將紋理坐標Texcoord接收并傳入片段著色器:

頂點著色器

和其他頂點屬性一樣盈魁,將紋理坐標以AttribPointer的形式輸入著色器:

添加紋理坐標屬性

現(xiàn)在只剩下最后一件事情要處理翔怎,那就是在片段著色器中進行真正的紋理采樣。采樣方式很簡單杨耙,首先在著色器中聲明一個sapler2D類型的采樣器tex赤套,然后調用texture函數(shù)進行采樣。texture函數(shù)第一個參數(shù)是采樣器珊膜,第二個參數(shù)就是我們由頂點著色器傳入的紋理坐標容握。在這里我們對采集后的紋理與我們頂點的顏色進行一個混合,混合的方式就是對兩者做一個笛卡爾積车柠。

片段著色器

最終我們得到的效果如下:

紋理與頂點顏色混合效果

紋理單元

紋理單元是能夠被著色器采樣的紋理對象的引用剔氏, 紋理通過調用glBindTexture函數(shù)綁定到指定的紋理單元塑猖。由于你沒有明確指定使用哪個紋理單元,所以紋理被默認綁定到了GL_TEXTURE0谈跛,這就是為什么我們在片段著色器中給我們的采樣器對象傳入一個0它依然能夠正常工作的原因羊苟。

那么我們怎么指定當前我們使用的紋理單元呢?OpenGL提供了一個叫做glActiveTexture的API來讓我們選擇用來綁定紋理的紋理單元ID:

指定紋理單元

OpenGL中最大支持的紋理單元數(shù)量根據(jù)顯卡不同而有所區(qū)別感憾,最少支持48個蜡励。不過基本上你同時用完所有紋理單元的幾率為0。下面讓我們通過一個例子來看看怎樣同時使用多個紋理單元來完成多張紋理的混合阻桅,首先我們需要修改一下我們的片段著色器巍虫,讓它同時對兩張紋理進行采樣:

使用著色器同時對兩張紋理進行采樣

colKitten和colPuppy分別對應兩幅紋理中的采樣結果,最終的片段顏色值由mix函數(shù)將兩者進行混合后得到鳍刷。

mix這個函數(shù)是GLSL中一個特殊的線性插值函數(shù),他將前兩個參數(shù)的值基于第三個參數(shù)按照以下公式進行插值:

genType mix (genType x, genType y, float a)

返回線性混合的x和y俯抖,如:x?(1?a)+y?a

現(xiàn)在我們的兩個采樣器對象texKitten和texPuppy已經準備好了输瓜,你需要在應用程序中將兩幅紋理綁定給兩個紋理單元,再將這兩個紋理單元的ID通過glUniform函數(shù)分別賦值給我們的采樣器芬萍,應用程序端代碼如下:

為兩個紋理單元分別綁定紋理

最終兩張紋理混合后得到的效果如下:

兩張紋理混合效果

至此尤揣,如何使用簡單的二維紋理已經介紹完畢了,如果有什么疑問可以進入我們的QQ群:280689979中進行討論柬祠。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末北戏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漫蛔,更是在濱河造成了極大的恐慌嗜愈,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莽龟,死亡現(xiàn)場離奇詭異蠕嫁,居然都是意外死亡,警方通過查閱死者的電腦和手機毯盈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門剃毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搂赋,你說我怎么就攤上這事赘阀。” “怎么了脑奠?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵基公,是天一觀的道長。 經常有香客問我捺信,道長酌媒,這世上最難降的妖魔是什么欠痴? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮秒咨,結果婚禮上喇辽,老公的妹妹穿的比我還像新娘。我一直安慰自己雨席,他們只是感情好菩咨,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陡厘,像睡著了一般抽米。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糙置,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天云茸,我揣著相機與錄音,去河邊找鬼谤饭。 笑死标捺,一個胖子當著我的面吹牛,可吹牛的內容都是我干的揉抵。 我是一名探鬼主播亡容,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冤今!你這毒婦竟也來了闺兢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤戏罢,失蹤者是張志新(化名)和其女友劉穎屋谭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帖汞,經...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡戴而,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翩蘸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片所意。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖催首,靈堂內的尸體忽然破棺而出扶踊,到底是詐尸還是另有隱情,我是刑警寧澤郎任,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布秧耗,位于F島的核電站,受9級特大地震影響舶治,放射性物質發(fā)生泄漏分井。R本人自食惡果不足惜车猬,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尺锚。 院中可真熱鬧珠闰,春花似錦、人聲如沸瘫辩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伐厌。三九已至承绸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挣轨,已是汗流浹背军熏。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卷扮,地道東北人羞迷。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像画饥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浊猾,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內容