首先我們通過如下代碼構建兩個圖層,它們的顔色和透明度分别為紅色、0.6和藍色、0.6,并且讓它們的部分區域重疊在一起。
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(20, 100, 150, 100)];
redView.backgroundColor = [UIColor redColor];
redView.alpha = 0.6;
[self.view addSubview:redView];
UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 100)];
blueView.backgroundColor = [UIColor blueColor];
blueView.alpha = 0.6;
[self.view addSubview:blueView];
效果如下:
C 音視頻開發學習資料:點擊領取→音視頻開發(資料文檔 視頻教程 面試題)(FFmpeg WebRTC RTMP RTSP HLS RTP)
顔色混合我們發現在redView和blueView重疊的部分,顔色發生了變化,顯示的顔色即不是紅色也不是藍色,而是紅色和藍色混合後的顔色。這種現象我們稱之為“顔色混合”。
那麼在OpenGL中如何實現顔色混合呢?
調用如下代碼,打開顔色混合狀态:
gl_Enable(GLBLEND);
調用如下代碼,設置顔色混合因子:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
用完後,記得調用如下函數關閉:
glDisable(BL_BLEND);
通過如上三句代碼我們就能夠在OpenGL中使用顔色混合了。
混合原理目标顔色:已經存儲在顔色緩沖區的顔色值; 源顔色:将要進入顔色緩沖區的顔色值。
OpenGL默認情況下的顔色混合公式
Cf = (Cs * S) (Cd * D);
Cf:混合後的顔色值
Cs:源顔色
Cd:目标顔色
S:源混合因子
D:目标混合因子
其中,Cs和Cd是顔色值,我們無法設置;S和D是對應的混合因子,我們可以通過以下函數設置:
glBlendFunc(GLenum S,GLenum D);
其中S和D的取值如下圖:
表中R、G、B、A分别表示紅、綠、藍、透明度;S、D分别表示源、目标;C表示常量顔色。
C 音視頻開發學習資料:點擊領取→音視頻開發(資料文檔 視頻教程 面試題)(FFmpeg WebRTC RTMP RTSP HLS RTP)
上圖是OpenGL下顔色混合的默認公式的解釋,其實就是簡單的加減乘除運算。在OpenGL下,可以使用函數:
glbBlendEquation(Glenum mode);
可用的混合公式如下:
還有常量混合顔色,默認是黑色(0.0f,0.0f,0.0f,1.0f);但也可以通過下面的公式設置
總結:
void glBlendColor(GLclampf red,GLclampf green,GLclampf blue, GLclampf alpha);
一般我們隻需要使用OpenGL默認的公式就已經足夠了,基本不會去修改混合公式,使用最開始介紹的三個函數開啟顔色混合就能滿足開發中的需求了。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!