深入了解OpenGL——顏色混合

其實顏色混合用到的場合很多,比如多張圖片的合成,動畫游戲中的一些畫面特效等都可以通過顏色混合進行實現。最常用的混合方式就是實現物體與背 景的半透明效果。另外,在制作2D游戲時顏色混合可以用來通過制作目標物體的蒙板實現移動。通過蒙板來消除舊位置的物體對象可以不必重繪當前整幀內容,而 僅僅是發生變化的那些物體。

 

為了各位從事iPhone開發的考慮。后面的代碼例子對OpenGL API的使用都會用OpenGL2.1與OpenGL ES1.1相互兼容的接口。

 

首先介紹一下OpenGL對源對象和目標對象進行顏色混合的實現。

這里,源對象是指你將要繪制的對 象;目標對象是指已在幀緩存中的顏色。比如調用glClear(GL_COLOR_BUFFER_BIT);后留在幀緩存中的顏色。

在進行計算 時,源和目標的混合都是在繪制源對象時進行計算的,在繪制對象以外的幀緩存像素不會受任何影響。

 

為了方便顏色混合,我們往往采用RGBA 這種顏色模式。其中RGB表示色彩分量,而A就是混合因子(blend factor)。A,我們在圖形、圖像處理中常常表示為:alpha,它在圖像處理中常用作為透明系數。

我們指定了源和目標的混合因子 后,OpenGL會對繪制對象的最終顏色做如下計算:

設:源對象的某個頂點的顏色為(Rs, Gs, Bs, As)

       目的對象對應此源對象頂點的顏色為(Rd, Gd, Bd, Ad)

       源混合因子為:(Sr, Sg, Sb, Sa)

      目 的混合因子為:(Dr, Dg, Db, Da)

那么,該頂點最終目標顏色為:

(Rs * Sr   Rd * Dr,  Gs * Sg   Gd * Dg,  Bs * Sb   Bd * Db,  As * Sa   Ad * Da)

其中,可以是加法(+),減法(-), 逆向減法,最小值,最大值或按位邏輯操作,并且其優先級小于乘法(*)。

 

下面,我們介紹相關的OpenGL接口。

首先是開啟混 合,使用glEnable(GL_BLEND);即可。

 

然后我們使用glBlendEquation()來指定混合操作,參數可以 是:GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN, GL_MAX。

但這里要注意的是,OpenGL ES1.1沒有glBlendEquation接口,因此只能做加法操作。

 

glBlendFunc() 接口用于指定源混合因子與目標混合因子。

參數請參考紅寶石書中文版的第140頁,表6-1。

 

下面給出示例代碼:

//

//  MyView.m

//  OpenGLTest

//

//  Created by Zenny Chen on 4/25/10.

//  Copyright 2010 GreenGames Studio. All rights reserved.

//  P44

 

#import "MyView.h"

 

#include

#include

 

 

@implementation MyView

 

- (id)initWithFrame:(NSRect)frame {

    self = [super initWithFrame:frame];

    if (self) {

        // Initialization code here.

    }

    return self;

}

 

// Destination: a rectangle

static const struct VertexInfo

{

    GLfloat vertices[3];

}vertexList[] = {

    {-0.5f, 0.5f, -1.0f},

    {-0.5f, -0.5f, -1.0f},

    {0.5f, 0.5f, -1.0f},

    {0.5f, -0.5f, -1.0f}

};

 

- (void)prepareOpenGL

{

    glEnable(GL_CULL_FACE);

    glEnable(GL_BLEND);

    

    glEnableClientState(GL_VERTEX_ARRAY);

    

    glVertexPointer(3, GL_FLOAT, 0, vertexList);

    

    glFrontFace(GL_CCW);

    glCullFace(GL_BACK);

    

    glShadeModel(GL_SMOOTH);

    

    // Set Background color(frame buffer color)

    glClearColor(1.0, 0.0, 0.0, 1.0);

    

    glViewport(0, 0, 320, 320);

    

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, 5.0);

    

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    

    // destination color

    glColor4f(1.0f, 1.0f, 1.0f, 0.3f);

    

    glBlendEquation(GL_FUNC_ADD);

    

    glBlendFunc(GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA);

}

 

- (void)drawRect:(NSRect)dirtyRect {

    

    // Drawing code here.

    glClear(GL_COLOR_BUFFER_BIT);

    

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    

    glFlush();

}

 

@end


上一篇: Obj-C大量圖片構成動畫的實現

下一篇: 關于TableView中圖片的延時加載

分享到: 更多
旺彩电脑版 双色球机选表 10_10_彩票买大小有什么技巧 11选5任8追号必中组合 21点游戏推荐 pk10五码二期必中技巧 彩票网上投注平台pk10 重庆时时开奖直播软件 快三有什么规律 重庆时时开奖软件 11选5免费手机计划软件破解版 时时彩三星走势图彩经网 北京pk10详细走势图 彩票店利润有多大 为什么黑客不去网赌 3个骰子赌大小怎么稳赢