OpenGL ES學習筆記4:混合和多重紋理

<h5>一合蔽、先上效果圖</h5>

混合.png

<h5>二、混合 的 主要代碼</h5>

- (void)setupTextureInfo{

    CGImageRef imageRef0 = [[UIImage imageNamed:@"leaves.gif"] CGImage];
    self.textureInfo0 = [GLKTextureLoader textureWithCGImage:imageRef0 options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],GLKTextureLoaderOriginBottomLeft, nil] error:nil];

    CGImageRef imageRef1 = [[UIImage imageNamed:@"beetle.png"] CGImage];
    self.textureInfo1 = [GLKTextureLoader textureWithCGImage:imageRef1 options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],GLKTextureLoaderOriginBottomLeft, nil] error:nil];

    self.baseEffect = [[GLKBaseEffect alloc] init];

    glEnable(GL_BLEND);  //開啟混合
    //表示把渲染的圖像融合到目標區(qū)域蝇裤。也就是說源的每一個像素的alpha都等于自己的alpha悄蕾,
    //目標的每一個像素的alpha等于1減去該位置源像素的alpha拣凹。 因此不論疊加多少次,亮度是不變的督函。
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{

    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);

   self.baseEffect.texture2d0.name = self.textureInfo0.name;
    self.baseEffect.texture2d0.target = self.textureInfo0.target;
    [self.baseEffect prepareToDraw];
    glDrawArrays(GL_TRIANGLES, 0, 6);

    self.baseEffect.texture2d0.name = self.textureInfo1.name;
    self.baseEffect.texture2d0.target = self.textureInfo1.target;
    [self.baseEffect prepareToDraw];
    glDrawArrays(GL_TRIANGLES, 0, 6);
}

<h6>代碼說明</h6>

  • 通過glEnable (GL_BLEND) 函數(shù)來開啟混合嘀粱,
  • 通過glBlendFunc (GLenum sfactor, GLenum dfactor)設置混合函數(shù),告訴OpenGL它該如何混合辰狡。sfactor參數(shù)是源因子锋叨,dfactor參數(shù)是目標因子。
混合方程.png
  • 目標跟繪制的順序有關宛篇,先繪制的是目標娃磺,隨后繪制的是。假設先紅色些己,再在紅色上繪制綠色豌鸡,此時紅色先進,假設我們希望在紅色方塊上繪制綠色方塊段标。紅色方塊會成為目標顏色(因為它會先進入顏色緩沖)涯冠,綠色就是源顏色。
  • glBlendFunc可使用的混合參數(shù)如下:
混合參數(shù) 描述
GL_ZERO 使用0.0作為因子逼庞,實際上相當于不使用這種顏色參與混合運算
GL_ONE 使用1.0作為因子蛇更,實際上相當于完全的使用了這種顏色參與混合運算
GL_SRC_ALPHA 表示使用源顏色的alpha值來作為因子
GL_DST_ALPHA 表示使用目標顏色的alpha值來作為因子
GL_ONE_MINUS_SRC_ALPHA 表示用1.0減去源顏色的alpha值來作為因子

<h5>三、多重紋理</h5>

  • 我們發(fā)現(xiàn)赛糟,在每次更新顯示的時候派任,調用2次glDrawArrays,混合函數(shù)需要從像素顏色渲染緩存讀取顏色數(shù)據(jù)以便和片元顏色混合璧南,然后結果被寫回幀緩存掌逛。
  • 當帶有透明度的多個紋理層疊時,每個紋理的像素顏色渲染緩存會被再次讀取司倚、混合豆混、重寫篓像。這種通過多次讀寫像素顏色渲染緩存來創(chuàng)建一個最終的渲染像素的過程叫“多通道渲染”。因為內存訪問限制了性能,多通道渲染是次優(yōu)的。
  • 多重紋理可以避免多通道渲染導致的內存訪問限制性能情況痛悯。
  • 現(xiàn)代GPU都能夠同時從至少兩個紋理緩存中取樣紋素。而GLKit的GLKBaseEffect同時支持兩種紋理奠滑。
  • 多重紋理引入了另一個組合配置選項。iOS中的GLKit的GLKEffectPropertyTexture類操作了3種常見的多重紋理模式妒穴,如下:
多重紋理混合模式 描述
GLKTextureEnvModeReplace 給第二個紋理設置該模式宋税,只顯示第二個紋理
GLKTextureEnvModeModulate 默認使用,幾乎總是產生最好的結果讼油。它會讓所有的為燈光和其他效果計算出來的顏色與從一個紋理取樣的顏色相混合弃甥。
GLKTextureEnvModeDecal 開啟多重紋理,啟用一個和 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)類似的方程式來混合兩個紋理
  • 使用多重紋理模式汁讼,不需要再開啟混合了(glEnable(GL_BLEND))
  • 多重紋理支持為每個紋理使用不同的紋理坐標。本例中兩個紋理使用相同的紋理坐標阔墩。

<h5>四嘿架、多重紋理 之 主要代碼</h5>

- (void)setupMultipleTexture{

    CGImageRef imageRef0 = [[UIImage imageNamed:@"leaves.gif"] CGImage];
    self.textureInfo0 = [GLKTextureLoader textureWithCGImage:imageRef0 options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],GLKTextureLoaderOriginBottomLeft, nil] error:nil];

    CGImageRef imageRef1 = [[UIImage imageNamed:@"beetle.png"] CGImage];
    self.textureInfo1 = [GLKTextureLoader textureWithCGImage:imageRef1 options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],GLKTextureLoaderOriginBottomLeft, nil] error:nil];

    self.baseEffect = [[GLKBaseEffect alloc] init];

    self.baseEffect.texture2d0.name = self.textureInfo0.name;
   self.baseEffect.texture2d0.target = self.textureInfo0.target;

    self.baseEffect.texture2d1.name = self.textureInfo1.name;
    self.baseEffect.texture2d1.target = self.textureInfo1.target;
    self.baseEffect.texture2d1.envMode = GLKTextureEnvModeDecal;
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{

    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);

    [self.baseEffect prepareToDraw];

    glDrawArrays(GL_TRIANGLES, 0, 6);
}

代碼直通車:QSOpenGLES002_BlendTexture

篇外:紋理后續(xù)部分:關于自定義紋理和紋理壓縮的內容,先填個坑啸箫,繼續(xù)下一主題(光線)的學習耸彪。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忘苛,隨后出現(xiàn)的幾起案子蝉娜,更是在濱河造成了極大的恐慌,老刑警劉巖扎唾,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件召川,死亡現(xiàn)場離奇詭異,居然都是意外死亡胸遇,警方通過查閱死者的電腦和手機荧呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纸镊,“玉大人倍阐,你說我怎么就攤上這事《和” “怎么了峰搪?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凯旭。 經常有香客問我概耻,道長使套,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任咐蚯,我火速辦了婚禮童漩,結果婚禮上,老公的妹妹穿的比我還像新娘春锋。我一直安慰自己矫膨,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布期奔。 她就那樣靜靜地躺著侧馅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呐萌。 梳的紋絲不亂的頭發(fā)上馁痴,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音肺孤,去河邊找鬼罗晕。 笑死,一個胖子當著我的面吹牛赠堵,可吹牛的內容都是我干的小渊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼茫叭,長吁一口氣:“原來是場噩夢啊……” “哼酬屉!你這毒婦竟也來了?” 一聲冷哼從身側響起揍愁,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤呐萨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后莽囤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谬擦,經...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年烁登,在試婚紗的時候發(fā)現(xiàn)自己被綠了怯屉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡饵沧,死狀恐怖锨络,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情狼牺,我是刑警寧澤羡儿,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站是钥,受9級特大地震影響掠归,放射性物質發(fā)生泄漏缅叠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一虏冻、第九天 我趴在偏房一處隱蔽的房頂上張望肤粱。 院中可真熱鬧,春花似錦厨相、人聲如沸领曼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庶骄。三九已至,卻和暖如春践磅,著一層夾襖步出監(jiān)牢的瞬間单刁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工府适, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羔飞,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓檐春,卻偏偏與公主長得像褥傍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子喇聊,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內容