« FLASH+AfterEffects 「じわーっと消える(出てくる)エフェクト」 | トップページ | Processing 「ライブの音と同期させる」 »

2007年8月 9日 (木)

Processing 「ブレンドする方法」

こちらのブログを参考にやってみました。
http://www.flight404.com/blog/?p=71

ProcessingでopenGLを使ってブレンドする方法です。
「オーバーレイ」とか「乗算」とかあのへんのことができるっぽいです。

このブログに書いてあるとおり簡単にできます。
ソース中の、
「gl.glBlendFunc(GL.GL_ONE,GL.GL_ONE);」
でブレンドモードを指定してるようです。
この場合は「加算(ADD)」ですかね。
ここの「GL_ONE」を他のに変えるとブレンドの仕方が変わります。
例えば↓ここに載ってるものに変えてみてください。
http://pyopengl.sourceforge.net/documentation/manual/glBlendFunc.3G.html

ブレンドできるだけでなんかいい感じになってる気がしてしまいます。

以下、簡単に作ってみたものです。
使ってる画像は コチラ 。(Photoshopの逆光です)

import processing.opengl.*;
import javax.media.opengl.*;

PGraphicsOpenGL pgl;
GL gl;

PImage light01;

int oldX,oldY,oldZ;
float rot,ss;
ArrayList aLight01;
int[] cl,dcl;

void setup() {
  size(640,480,OPENGL);
  background(0);
  pgl = (PGraphicsOpenGL) g;
  gl = pgl.gl;
  light01 = loadImage("light.jpg");
  oldX = 0;
  oldY = 0;
  oldZ = 0;
  rot = 0;
  ss = 0;
  aLight01 = new ArrayList();
  for (int i=0;i<=5;i++) {
    aLight01.add(new Light01()); 
  }
  cl = new int[3];
  cl[0] = 0;
  cl[1] = 0;
  cl[2] = 0;
  dcl = new int[3];
  dcl[0] = ceil(random(1,4));
  dcl[1] = ceil(random(1,4));
  dcl[2] = ceil(random(1,4));
}

void draw() {
  translate(width/2,height/2);
  fill(0, 8);
  rect(-width/2, -height/2, width, height);
  
  pgl.beginGL();
  gl.glDisable(GL.GL_DEPTH_TEST);
  gl.glEnable(GL.GL_BLEND);
  gl.glBlendFunc(GL.GL_ONE,GL.GL_ONE);
  pgl.endGL();

  for (int i=0;i<aLight01.size();i++) {
    Light01 lt = (Light01) aLight01.get(i);
    lt.update();
    translate(0,0,lt.getZ());
    tint(cl[0], cl[1], cl[2]);
    image(light01,lt.getX(),lt.getY(),lt.getW(),lt.getW());
    translate(0,0,-lt.getZ());
  }
  for (int i=0;i<3;i++) {
    cl[i]+=dcl[i];
    if (dcl[i]>0&&cl[i]>255) {
      cl[i] = 255;
      dcl[i] = -ceil(random(1,4));
    } else if (dcl[i]<0&&cl[i]<0) {
      cl[i] = 0;
      dcl[i] = ceil(random(1,4));
    }
  }
}


class Light01 {
  int xx,yy,zz,ww,rx,ry,rz;
  float sx,dsx,sy,dsy,sz,dsz;
  Light01() {
    xx = 0;
    yy = 0;
    zz = 0;
    ww = 50;
    rx = ceil(random(150,300));
    ry = ceil(random(150,300));
    rz = ceil(random(150,400));
    sx = 0;
    dsx = PI/random(18,72);
    sy = 0;
    dsy = PI/random(18,72);
    sz = 0;
    dsz = PI/random(18,72);
  }
  void update() {
    xx = ceil(sin(sx)*rx);
    yy = ceil(sin(sy)*ry);
    zz = ceil(sin(sz)*rz);
    sx += dsx;
    sy += dsy;
    sz += dsz;
  }
  int getX() {
   return xx-ww; 
  }
  int getY() {
   return yy-ww; 
  }
  int getZ() {
   return zz; 
  }
  int getW() {
   return ww*2; 
  }
}


なぜかアプレットで書き出すとうまくいきませんでした。。
あと、うちのノートPCだとグラフィックカードがしょぼいせいか、画面がちらついて全然ダメ。。

|

« FLASH+AfterEffects 「じわーっと消える(出てくる)エフェクト」 | トップページ | Processing 「ライブの音と同期させる」 »

コメント

wa-!sugoi-desu.
kirei desune-.
I'll looking forward to get your next Processing again!!

投稿: | 2007年8月10日 (金) 10時14分

実行してみました!
とてもキレイで見とれました。
この表現、勉強します!

投稿: peroon | 2009年8月 2日 (日) 22時22分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: Processing 「ブレンドする方法」:

« FLASH+AfterEffects 「じわーっと消える(出てくる)エフェクト」 | トップページ | Processing 「ライブの音と同期させる」 »