<h5>一合蔽、先上效果圖</h5>
<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ù)是目標因子。
- 源和目標跟繪制的順序有關宛篇,先繪制的是目標娃磺,隨后繪制的是源。假設先紅色些己,再在紅色上繪制綠色豌鸡,此時紅色先進,假設我們希望在紅色方塊上繪制綠色方塊段标。紅色方塊會成為目標顏色(因為它會先進入顏色緩沖)涯冠,綠色就是源顏色。
- 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ù)下一主題(光線)的學習耸彪。