2014年2月6日木曜日

oFサンプル解読 blendingExample

openFrameworksのサンプルを少しずつ読み解くシリーズ

examples/graphics/blendingExample



重なった色の混色方法のサンプルです。
ofEnableBlendMode() を利用し、()内に
OF_BLENDMODE_ALPHA
OF_BLENDMODE_ADD
OF_BLENDMODE_MULTIPLY
OF_BLENDMODE_SUBTRACT
OF_BLENDMODE_SCREEN
のいずれかを入れて指定します

一つ気になったのが、testApp.hで宣言したalphaとcounterをどこにも使っていない事。
私の見落としなのか、もしくはコードの使い回しの名残なのか...



#pragma once

#include "ofMain.h"

class testApp : public ofBaseApp{
 
 public:
  
  void setup();
  void update();
  void draw();
  
  void keyPressed(int key);
  void keyReleased(int key);
  void mouseMoved(int x, int y );
  void mouseDragged(int x, int y, int button);
  void mousePressed(int x, int y, int button);
  void mouseReleased(int x, int y, int button);
  void windowResized(int w, int h);
  void dragEvent(ofDragInfo dragInfo);
  void gotMessage(ofMessage msg);  
  
    
  ofBlendMode blendMode;
  ofImage rainbow; //イメージの宣言
  float           alpha;
  float    counter;
  ofTrueTypeFont  vagRounded; //Truetypefont"vagRounded"の宣言
  char eventString[255]; //文字型変数の配列evenStringの宣言
  char timeString[255]; //文字型変数の配列timeStringの宣言
};




#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup(){  
    alpha = 0;
 counter = 0;

    sprintf(eventString, "Alpha"); //変数evenStringに文字データを代入

 vagRounded.loadFont("vag.ttf", 32); //("読み込むフォントのファイル名",サイズ)
 ofBackground(50,50,50);
    
    rainbow.allocate(256, 256, OF_IMAGE_COLOR_ALPHA);//画像rainbowに対する(幅の設定,高さの設定,混色方法の設定)
    rainbow.loadImage("rainbow.tiff");//画像の読み込み
}


//--------------------------------------------------------------
void testApp::update(){
 counter = counter + 0.033f;

    alpha += 0.01; //1フレームごとに値を0.01ずつ増やす
   
    alpha = (alpha > 1.0) ? 1.0 : alpha; //条件演算子 alphaの値が1.0を超えたらalpha=1.0
}

//--------------------------------------------------------------
void testApp::draw(){
 
    sprintf(timeString, "Press 1 - 5 to switch blend modes"); //変数timeStringに文字データを代入
 
    ofEnableBlendMode(OF_BLENDMODE_ALPHA); //混色法の設定
    
 ofSetHexColor(0xffffff);
 vagRounded.drawString(eventString, 98,198); //フォント名.drawString(記入内容, x位置, y位置)で文字入力
 
 ofSetColor(255,122,220);
 vagRounded.drawString(eventString, 100,200);
 
 ofSetHexColor(0xffffff);
 vagRounded.drawString(timeString, 98,98);
 
 ofSetColor(255,122,220);
 vagRounded.drawString(timeString, 100,100);

    ofSetColor(255, 255, 255,255);
    
    
    ofEnableBlendMode(blendMode); //混色の方法をblendModeの指定に合わせる
    
    rainbow.draw(mouseX, mouseY); //画像の位置をカーソルに合わせる
    
    ofDisableBlendMode(); //混色の無効化
}


//--------------------------------------------------------------
void testApp::keyPressed  (int key){ 

    //スイッチ文
    switch (key) {
        case 49: //1のキーコード
            blendMode = OF_BLENDMODE_ALPHA; //混色をアルファに
            sprintf(eventString, "Alpha"); 
            break;
        case 50: //2のキーコード
            blendMode = OF_BLENDMODE_ADD; //混色を加算に
            sprintf(eventString, "Add"); 
            break;
        case 51: //3のキーコード
            blendMode = OF_BLENDMODE_MULTIPLY; //混色を乗算に
            sprintf(eventString, "Multiply"); 
            break;
        case 52: //4のキーコード
            blendMode = OF_BLENDMODE_SUBTRACT; //混色を減算に
            sprintf(eventString, "Subtract");
            break;
        case 53: //5のキーコード
            blendMode = OF_BLENDMODE_SCREEN; //混色をスクリーンに
            sprintf(eventString, "Screen"); 
            break;
        default:
            break;
    }
} 

0 件のコメント:

コメントを投稿