iOS-OpenGLES-入門-多重紋理和混合

這是一篇OpenGlES 系統(tǒng)學(xué)習(xí)教程矿咕,記錄自己的學(xué)習(xí)過(guò)程技羔。
環(huán)境: Xcode10.2.1 + OpenGL ES 3.0
目標(biāo): 多重紋理喷好、混合
代碼已上傳github蚀同,Tutorial-05-多重紋理-混合缅刽,你的star和fork是對(duì)我最好的支持和動(dòng)力。

概述

前面教程我們已經(jīng)看到了一個(gè)簡(jiǎn)單的紋理渲染程序蠢络,可能會(huì)發(fā)現(xiàn)這些例子中的一些遺漏之處衰猛。例如:并沒(méi)有設(shè)置片元著色器里采樣器的取值,這是因?yàn)槲覀冎挥玫揭粋€(gè)紋理刹孔,從而使用了默認(rèn)紋理單元啡省。

紋理單元

紋理單元的主要目的是讓我們?cè)谥髦锌梢允褂枚嘤谝粋€(gè)的紋理。通過(guò)把紋理單元賦值給采樣器髓霞,我們可以一次綁定多個(gè)紋理卦睹,只要我們首先激活對(duì)應(yīng)的紋理單元。就像glBindTexture一樣方库,我們可以使用glActiveTexture激活紋理單元分预,傳入我們需要使用的紋理單元:

glActiveTexture(GLenum(GL_TEXTURE0))            // 激活紋理單元
glBindTexture(GLenum(GL_TEXTURE_2D), tex1)      // 綁定紋理到指定紋理單元
glUniform1i(tex1_loc, 0)                        // 給采樣器分配位置值

激活紋理單元之后,接下來(lái)的glBindTexture函數(shù)調(diào)用會(huì)綁定這個(gè)紋理到當(dāng)前激活的紋理單元薪捍,紋理單元GL_TEXTURE0默認(rèn)總是被激活笼痹,所以我們?cè)谇懊娴睦永锂?dāng)我們使用glBindTexture的時(shí)候配喳,無(wú)需激活任何紋理單元。
事實(shí)上凳干,OpenGL可以同時(shí)支持很多個(gè)紋理晴裹。一個(gè)著色器階段至少支持16個(gè)紋理,如果乘以O(shè)penGL支持的著色器階段的數(shù)量那就是80個(gè)紋理了救赐!而實(shí)際上涧团,OpenGL確實(shí)有80個(gè)紋理單元,它們對(duì)應(yīng)于標(biāo)識(shí)符GL_TEXTURE0 ~ GL_TEXTURE79)经磅。

使用多重紋理時(shí)泌绣,我們需要定義多個(gè)uniform類型的采樣器變量。每個(gè)變量都對(duì)應(yīng)著一個(gè)不同的紋理單元预厌。從應(yīng)用程序的角度來(lái)說(shuō)阿迈, 采樣器uniform和一般的整數(shù)uniform非常類似。它們可以使用通常的glGetActiveUniform()函數(shù)來(lái)進(jìn)行枚舉轧叽,也可以使用glUniformli()函數(shù)來(lái)設(shè)置紋理單元位置值苗沧。
我們需要編輯片段著色器來(lái)接收多個(gè)采樣器。如下:

varying lowp vec2 tex_coord;

uniform sampler2D tex1;
uniform sampler2D tex2;

void main(void)
{
    gl_FragColor = mix(texture2D(tex1,tex_coord),texture2D(tex2,tex_coord), 0.2);
}

最終輸出顏色現(xiàn)在是兩個(gè)紋理的結(jié)合炭晒。GLSL內(nèi)建的mix函數(shù)需要接受兩個(gè)值作為參數(shù)待逞,并對(duì)它們根據(jù)第三個(gè)參數(shù)進(jìn)行線性插值。如果第三個(gè)值是0.0网严,它會(huì)返回第一個(gè)輸入识樱;如果是1.0,會(huì)返回第二個(gè)輸入值震束。0.2會(huì)返回80%的第一個(gè)輸入顏色和20%的第二個(gè)輸入顏色牺荠,即返回兩個(gè)紋理的混合色。

主要是使用glUniform1i設(shè)置每個(gè)采樣器的對(duì)應(yīng)哪個(gè)紋理單元驴一。下面看渲染過(guò)程:

glClearColor(0.0, 1.0, 0.0, 1.0)

glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
glViewport(0, 0, GLsizei(frame.size.width), GLsizei(frame.size.height))

// 第一個(gè)紋理
glActiveTexture(GLenum(GL_TEXTURE0))            // 激活紋理單元
glBindTexture(GLenum(GL_TEXTURE_2D), tex1)      // 綁定紋理到指定紋理單元
glUniform1i(tex1_loc, 0)                        // 給采樣器分配位置值

// 第二個(gè)紋理
glActiveTexture(GLenum(GL_TEXTURE1))
glBindTexture(GLenum(GL_TEXTURE_2D), tex2)
glUniform1i(tex2_loc, 1)

glDrawArrays(GLenum(GL_TRIANGLES), 0, GLsizei(vertCount));
 myContext?.presentRenderbuffer(Int(GL_RENDERBUFFER))

效果如下:


多重紋理.png

混合

為了渲染出不同的透明度級(jí)別休雌,我們需要開啟混合(Blending)
OpenGLES 混合的方式:


混合方式.png

例如:我把綠色物體渲染到紅色物體上,那么此時(shí)目標(biāo)顏色是紅色肝断,源顏色是綠色杈曲。至于因子,先設(shè)置源因子就是源向量的Alpha值胸懈,然后目標(biāo)因子是1.0-源因子担扑。

void glBlendFunc(GLenum sfactor, GLenum dfactor)接收兩個(gè)參數(shù)用來(lái)設(shè)置源(source)和目標(biāo)(destination)因子。其中參數(shù)選項(xiàng)如下:

混合因子.png

由于開啟混合我們只需要一個(gè)紋理單位趣钱,前后兩次繪制涌献。片段著色器如下:

varying lowp vec2 tex_coord;

uniform sampler2D tex1;

void main(void)
{
    gl_FragColor = texture2D(tex1,tex_coord);
}

渲染過(guò)程如下:

glClearColor(0.0, 1.0, 0.0, 1.0)

glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
glViewport(0, 0, GLsizei(frame.size.width), GLsizei(frame.size.height))

// 關(guān)閉第一個(gè)紋理混合
glDisable(GLenum(GL_BLEND))

glActiveTexture(GLenum(GL_TEXTURE0))
glBindTexture(GLenum(GL_TEXTURE_2D), tex1)
glUniform1i(tex1_loc, 0)

// 繪制第一個(gè)紋理
glDrawArrays(GLenum(GL_TRIANGLES), 0, GLsizei(vertCount));


// 開啟第二個(gè)紋理混合
glEnable(GLenum(GL_BLEND));
// 設(shè)置混合因子
glBlendFunc(GLenum(GL_ONE), GLenum(GL_ONE));

glActiveTexture(GLenum(GL_TEXTURE1))
glBindTexture(GLenum(GL_TEXTURE_2D), tex2)
glUniform1i(tex1_loc, 1)

// 繪制第二個(gè)紋理
glDrawArrays(GLenum(GL_TRIANGLES), 0, GLsizei(vertCount));

 myContext?.presentRenderbuffer(Int(GL_RENDERBUFFER))

效果如下:


混合效果圖.png

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市首有,隨后出現(xiàn)的幾起案子燕垃,更是在濱河造成了極大的恐慌枢劝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卜壕,死亡現(xiàn)場(chǎng)離奇詭異您旁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)轴捎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鹤盒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人侦副,你說(shuō)我怎么就攤上這事侦锯。” “怎么了秦驯?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵尺碰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汇竭,道長(zhǎng)葱蝗,這世上最難降的妖魔是什么穴张? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任细燎,我火速辦了婚禮,結(jié)果婚禮上皂甘,老公的妹妹穿的比我還像新娘玻驻。我一直安慰自己,他們只是感情好偿枕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布璧瞬。 她就那樣靜靜地躺著,像睡著了一般渐夸。 火紅的嫁衣襯著肌膚如雪嗤锉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天墓塌,我揣著相機(jī)與錄音瘟忱,去河邊找鬼。 笑死苫幢,一個(gè)胖子當(dāng)著我的面吹牛访诱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播韩肝,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼触菜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哀峻?” 一聲冷哼從身側(cè)響起涡相,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哲泊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后漾峡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攻旦,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年生逸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牢屋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡槽袄,死狀恐怖烙无,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遍尺,我是刑警寧澤截酷,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站乾戏,受9級(jí)特大地震影響迂苛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鼓择,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一三幻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呐能,春花似錦念搬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至偎漫,卻和暖如春爷恳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背象踊。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工温亲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人通危。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓铸豁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親菊碟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子节芥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 本文首發(fā)于個(gè)人博客:Lam's Blog - 【OpenGL-ES】二維紋理,文章由MarkDown語(yǔ)法編寫,可能...
    格子林ll閱讀 3,742評(píng)論 0 9
  • 1 紋理基礎(chǔ) 紋理是一種結(jié)構(gòu)化的存儲(chǔ)形式(Textures are a structured form of st...
    RichardJieChen閱讀 15,674評(píng)論 0 9
  • 紋理(Textures) 我們已經(jīng)了解到头镊,我們可以為每個(gè)頂點(diǎn)使用顏色來(lái)增加圖形的細(xì)節(jié)蚣驼,從而創(chuàng)建出有趣的圖像。但是通...
    IceMJ閱讀 5,621評(píng)論 2 13
  • 1相艇、概述 前面幾篇文章OpenGL ES 3.0(一)綜述 颖杏、OpenGL ES 3.0(二)GLSL與著色器 討...
    高丕基閱讀 2,969評(píng)論 0 7
  • 版本記錄 前言 OpenGL 圖形庫(kù)項(xiàng)目中一直也沒(méi)用過(guò),最近也想學(xué)著使用這個(gè)圖形庫(kù)坛芽,感覺(jué)還是很有意思留储,也就自然想著...
    刀客傳奇閱讀 8,785評(píng)論 0 8