一文詳解?OpenGL?ES?紋理顏色混合的方法
在OpenGL中繪制的時(shí)候,有時(shí)候想使新畫(huà)的顏色和已經(jīng)有的顏色按照一定的方式進(jìn)行混合。例如:想使物體擁有半透明的效果,或者繪制疊加光亮的效果,這時(shí)候就需要用到OpenGLES混合
。
如上圖所示,為石頭墻、綠色矩形、藍(lán)色云彩 三個(gè)矩形混合后的展示效果。三個(gè)矩形(Z軸深度由深到淺)分別為,石頭墻、綠色矩形、藍(lán)色云彩。
一、混合API
在OpenGLES中若使用混合,需要用到API函數(shù)方法(Java):
void glBlendFunc( int srcfactor, int destfactor );
(1) 其OpenGL函數(shù)原型為:
void glBlendFunc(GLenum srcfactor, GLenum destfactor);
(2) 其功能為:
控制新畫(huà)上來(lái)的顏色 (source values, RGBA)
和 已經(jīng)在幀緩沖區(qū)中的顏色 (destination values, RGBA)
的混合時(shí)源與目標(biāo) 在最終顏色通道中所占的比例
。
(3) 方法參數(shù)
srcfactor:代表源因子,即新畫(huà)上來(lái)的顏色。
該參數(shù)由九個(gè)枚舉型被接受使用:
GL_ZERO,
GL_ONE,
GL_DST_COLOR,
GL_ONE_MINUS_DST_COLOR,
GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA,
GL_DST_ALPHA,
GL_ONE_MINUS_DST_ALPHA,
GL_SRC_ALPHA_SATURATE.
destfactor:代表的是目標(biāo)因子,即已經(jīng)在幀緩沖區(qū)中的顏色。
該參數(shù)由八個(gè)枚舉型被接受使用:
GL_ZERO,
GL_ONE,
GL_SRC_COLOR,
GL_ONE_MINUS_SRC_COLOR,
GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA,
GL_DST_ALPHA,
GL_ONE_MINUS_DST_ALPHA
二、參數(shù)含義
- 舉個(gè)栗子
- 參數(shù)含義
2.1 舉個(gè)栗子
我們先看一個(gè)常用混合參數(shù)搭配:
// 最常用的混合因子搭配方式 // 即源因子為 GL_SRC_ALPHA 目標(biāo)因子為 GL_ONE_MINUS_SRC_ALPHA glBlendFunc(GL30.GL_SRC_ALPHA, GL30.GL_ONE_MINUS_SRC_ALPHA);
以上參數(shù)搭配方式假設(shè):
(Sr, Sg, Sb, Sa)
代表源顏色src(要繪制的顏色)
;(Dr, Dg, Db, Da)
代表目標(biāo)顏色Dest(緩沖區(qū)中顏色)
如果源因子的不透明度為0.2(透明度0.8),alpha值的最大值為1,那么源與目標(biāo)混合后的最終顏色值
為:
// 最終顏色值為:0.2*S+0.8*D // OpenGL ES 最終顏色計(jì)算結(jié)果如下: (0.2*Sr+(1-0.2)*Dr , 0.2*Sg+(1-0.2)*Dg , 0.2*Sb+(1-0.2)*Db,0.2*Sa+(1-0.2)*Da)
啟用混合與紋理矩形繪制順序代碼舉例:
// 開(kāi)啟混合 gl.glEnable(GL10.GL_BLEND); // 指定混合比例 gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); // 繪制石頭墻紋理矩形 gl.glPushMatrix(); gl.glTranslatef(-0.8f, -0.8f, -0.02f); wallRect.drawSelf(gl, tex_wall); gl.glPopMatrix(); // 繪制綠色紋理矩形 gl.glPushMatrix(); gl.glTranslatef(0, 0, -0.01f); greenRect.drawSelf(gl, tex_green); gl.glPopMatrix(); // 繪制藍(lán)色云彩紋理矩形 gl.glPushMatrix(); gl.glTranslatef(0.8f, 0.8f, 0f); cloudRect.drawSelf(gl, tex_cloud); gl.glPopMatrix();`
2.2 參數(shù)含義
有了上邊的例子,我們?cè)倩貋?lái)看各個(gè)參數(shù)因子。
假設(shè):
(Sr, Sg, Sb, Sa)
代表源顏色src(要繪制的顏色)
;(Dr, Dg, Db, Da)
代表目標(biāo)顏色Dest(緩沖區(qū)中顏色)
;(Kr, Kg, Kb, Ka)
代表緩沖區(qū)中各個(gè)通道R, G, B, A的最大值。
那么各個(gè)參數(shù)因子所代表的值如下表所示:
混合因子 | 各顏色通道色彩比例值 |
---|---|
GL_ZERO | (0,0,0,0) |
GL_ONE | (1,1,1,1) |
GL_SRC_COLOR | (Sr/Kr, Sg/Kg, Sb/Kb, Sa/Ka) |
GL_DST_COLOR | (Dr/Kr, Dg/Kg, Db/Kb, Da/Ka) |
GL_ONE_MINUS_SRC_COLOR | (1,1,1,1) - (Sr/Kr,Sg/Kg,Sb/Kb,Sa/Ka) |
GL_ONE_MINUS_DST_COLOR | (1,1,1,1) - (Dr/Kr,Dg/Kg,Db/Kb,Da/Ka) |
GL_SRC_ALPHA | ( Sa/Ka, Sa/Ka, Sa/Ka, Sa/Ka ) |
GL_ONE_MINUS_SRC_ALPHA | (1,1,1,1) - (Sa/Ka,Sa/Ka,Sa/Ka,Sa/Ka) |
GL_DST_ALPHA | ( Da/Ka, Da/Ka, Da/Ka, Da/Ka ) |
GL_ONE_MINUS_DST_ALPHA | (1,1,1,1) - (Da/Ka,Da/Ka,Da/Ka,Da/Ka) |
GL_SRC_ALPHA_SATURATE | (min(Sa, Ka, Da)/Ka,min(Sa, Ka, Da)/Ka,min(Sa, Ka, Da)/Ka,1) |
三、 幾種常用混合方式效果
下邊以三張紋理圖片在不同混合因子設(shè)置下的效果圖,對(duì)幾種常見(jiàn)的混合效果進(jìn)行舉例說(shuō)明。
- 其中
離攝像機(jī)最遠(yuǎn)
的為一張Alpha=1.0
的石頭墻
紋理圖; - 其次 為一張
Alpha=0.6
的藍(lán)色云彩
紋理圖; - 最后
離攝像機(jī)最近
的為一張Alpha=0.4
的綠色紋理圖。
3.1 混合(GL_ONE, GL_ZERO)
源顏色(最后繪制的綠色矩形)參數(shù)因子為GL_ONE,目標(biāo)色(緩沖區(qū)中顏色)參數(shù)因子為GL_ZERO。
這種參數(shù)因子組合混合比例 (1.0, 0.0)
:
- 源顏色(最后繪制的綠色矩形)覆蓋目標(biāo)色(緩沖區(qū)中顏色);
- 目標(biāo)色(緩沖區(qū)中顏色)不起作用,
其運(yùn)行效果如下圖所示:
3.2 混合(GL_ONE, GL_ONE)
源顏色(最后繪制的綠色矩形)與 目標(biāo)色(緩沖區(qū)中顏色)均為GL_ONE。
這種參數(shù)因子組合混合比例 (1.0, 1.0)
:
源顏色(最后繪制的綠色矩形)
與目標(biāo)色(緩沖區(qū)中顏色)
在混合時(shí),源與目標(biāo)的色彩通道顏色所占的比例相同
。
其運(yùn)行效果如下圖所示:
仔細(xì)觀察以上效果圖,可以看到三張圖片疊加部分,幾乎為白色。
3.3 混合(GL_ONE, GL_ONE_MINUS_DST_ALPHA)
源顏色(最后繪制的綠色矩形)參數(shù)因子為 GL_ONE,目標(biāo)色(緩沖區(qū)中顏色)參數(shù)因子為 GL_ONE_MINUS_DST_ALPHA。
這種參數(shù)因子組合混合比例 (1.0, 1.0-Da/Ka)
:
源顏色(最后繪制的綠色矩形)
與目標(biāo)色(緩沖區(qū)中顏色)
,在混合時(shí)取源顏色
與(1- Da/Ka)比例
進(jìn)行混合。
其運(yùn)行效果如下圖所示:
觀察以上效果圖:可以看到最上邊綠色矩形占最終混合顏色的比例較高。
三張紋理繪制時(shí):
- 前兩張紋理混合時(shí):源顏色為
藍(lán)色云彩紋理矩形
,目標(biāo)顏色為石頭墻紋理矩形
。 - 由于混合比例為 (1.0, 1.0-Da/Ka),混合后的最終顏色只顯示
藍(lán)色云彩紋理矩形
(石頭墻紋理的ALPHA=1.0,最終石頭墻顏色所占的比例 1.0-1.0=0.0,比例為0)。 - 其次
綠色紋理矩形
與緩沖區(qū)中顏色
進(jìn)行混合:源顏色為綠色紋理矩形
,目標(biāo)顏色為緩沖區(qū)中顏色
。
混合后的最終顏色基本只顯示綠色紋理矩形
(藍(lán)色云彩紋理矩形的ALPHA=0.6,(1-0.6)云紋理與綠色矩形混合后,幾乎看不到云紋理的顏色)。
3.4 混合 (GL_SRC_ALPHA, GL_ONE)
源顏色(最后繪制的綠色矩形)參數(shù)因子為 GL_SRC_ALPHA,目標(biāo)色(緩沖區(qū)中顏色)參數(shù)因子為 GL_ONE。
這種參數(shù)因子組合混合比例 (Sa/Ka, 1.0)
:
源顏色(最后繪制的綠色矩形)
與目標(biāo)色(緩沖區(qū)中顏色)
,在混合時(shí)以源顏色值乘以Sa/Ka與目標(biāo)顏色值相加。
其運(yùn)行效果如下圖所示:
觀察以上效果圖,可以看出目標(biāo)墻面與云紋理混合后墻面紋理顏色值所占比例較高,三個(gè)紋理圖片疊加部分有些像素點(diǎn)為白色。
3.5 混合 (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
這種方式是最常用的混合方式,源顏色(最后繪制的綠色矩形)參數(shù)因子為 GL_SRC_ALPHA,目標(biāo)色(緩沖區(qū)中顏色)參數(shù)因子為 GL_ONE_MINUS_SRC_ALPHA。
這種參數(shù)因子組合混合比例 (Sa/Ka, 1.0-Sa/Ka)
:
源顏色(最后繪制的綠色矩形)
與目標(biāo)色(緩沖區(qū)中顏色)
在混合時(shí),取源顏色的 (Sa/Ka) 與目標(biāo)顏色 (1.0-Sa/Ka) 相加計(jì)算最終的顏色值。
其運(yùn)行效果如下圖所示:
附案例代碼
案例源碼下載地址:
https://download.csdn.net/download/aiwusheng/64038379
到此這篇關(guān)于一文詳解?OpenGL?ES?紋理顏色混合的文章就介紹到這了,更多相關(guān)OpenGL?ES?紋理顏色混合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Trie樹(shù)_字典樹(shù)(字符串排序)簡(jiǎn)介及實(shí)現(xiàn)
有時(shí),我們會(huì)碰到對(duì)字符串的排序,若采用一些經(jīng)典的排序算法,則時(shí)間復(fù)雜度一般為O(n*lgn),但若采用Trie樹(shù),則時(shí)間復(fù)雜度僅為O(n)2014-03-03盤(pán)點(diǎn)網(wǎng)絡(luò)編程必須要知道的基礎(chǔ)知識(shí)
這篇文章主要介紹了盤(pán)點(diǎn)網(wǎng)絡(luò)編程必須要知道的基礎(chǔ)知識(shí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-07-07基于Jupyter notebook搭建Spark集群開(kāi)發(fā)環(huán)境的詳細(xì)過(guò)程
Jupyter Notebook是一個(gè)開(kāi)源并且使用很廣泛項(xiàng)目,本文介紹如何基于Jupyter notebook搭建Spark集群開(kāi)發(fā)環(huán)境,通過(guò)實(shí)例截圖相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-10-10測(cè)試框架JUnit VS TestNG對(duì)比分析
這篇文章主要為大家介紹了測(cè)試框架JUnit VS TestNG對(duì)比分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07MobaXterm快速入門(mén)、高級(jí)使用技巧圖文詳解
MobaXterm 提供豐富的自定義選項(xiàng),以滿足個(gè)人偏好和需求,您可以自定義外觀、鍵盤(pán)快捷鍵、字體、顏色方案等,這篇文章主要介紹了MobaXterm快速入門(mén)、高級(jí)使用技巧,需要的朋友可以參考下2023-06-06win10環(huán)境下使用Hyper-V進(jìn)行虛擬機(jī)創(chuàng)建的教程(圖解)
這篇文章主要介紹了win10環(huán)境下使用Hyper-V進(jìn)行虛擬機(jī)創(chuàng)建的教程,本文圖文詳解給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11C/S和B/S兩種架構(gòu)的概念、區(qū)別和聯(lián)系
這篇文章主要介紹了C/S和B/S兩種架構(gòu)的概念、區(qū)別和聯(lián)系,本位還同時(shí)講解了主流的Web程序應(yīng)用平臺(tái)、Web工作原理等內(nèi)容,需要的朋友可以參考下2014-09-09ol7.7安裝部署4節(jié)點(diǎn)spark3.0.0分布式集群的詳細(xì)教程
這篇文章主要介紹了安裝部署4節(jié)點(diǎn)spark3.0.0分布式集群,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07