2011/06/17

OpenProcessingはじめました

突然ですが、p5info さんに見習われてしまいました。非常に畏れ多いです。


私もたーせるさんを見習うべくブログを建てることにする。
今までコードはる場所なかったのが痛いな。2011年6月17日 10:8 via web


改めてご紹介すると、p5info さんは、Proce55ing.walker (Beta) で Processing 言語の情報提供に尽力されている方です。

当該サイトは日本語で読める貴重な情報源の一つですので、今後ブログが開設されたらぜひ入り浸りたいと思います。



そしてこのたび、ぼくも OpenProcessing に登録しました。よろしくね。

これは Processing で作成されたプログラムの投稿サイトで、見ようによっては昨夜ぼくが欲しいと書いた『アイディアを形にするために必要なものをまとめたレシピ集』そのものであります。

せっかくなので、ぼくもさっそく昨日のプログラムを適当に改造して投稿してみました。


前回は、Processing に標準で入っている blend() メソッドを使ってテクスチャの加算合成を行っていましたが、処理速度がじゃっかん気になったので、今回はこれと等価な処理を自力で実装しました。

メソッド呼び出し等のオーバヘッドが減ったり、アーリーアウトを挟んだりした分、心なしかほんのわずかながら高速化できたような気がしますが、その代償として描画部分のソースコードの分量が増大し、可読性が下がってしまいました。

とはいえ、パフォーマンス維持のためにテクスチャの加算合成を自力で書く機会が再び訪れるかも知れませんので、備忘録も兼ねて当該箇所のソースを載せておきます。

【Before】 blend() 使用版)

  1. // パーティクルの更新  
  2. for(int i = 0; i < NUM_PARTICLES; i++) {  
  3.   if(pos[i].y < height+tex[i].height && pos[i].y>-tex[i].height) {  
  4.     // パーティクル描画 加算合成にするのがポイント  
  5.     blend(tex[i], 00,   
  6.           tex[i].width, tex[i].height,  
  7.           (int)pos[i].x, (int)pos[i].y,  
  8.           tex[i].width, tex[i].height, ADD);  
  9.   }  
  10.   // 位置・速度更新  
  11.   pos[i].x += vel[i].x;  
  12.   pos[i].y += vel[i].y;  
  13.   vel[i].y += ACCELERATION_Y;  
  14. }  
【After】 (自己流版)

  1. // パーティクルの更新  
  2. loadPixels();  
  3. for(int i = 0; i < NUM_PARTICLES; i++) {  
  4.   if(pos[i].y < height+tex[i].height && pos[i].y > -tex[i].height) {  
  5.     // 加算合成を自力で書いた。  
  6.     for(int imgY = 0; imgY < tex[i].height; imgY++) {  
  7.       for(int imgX = 0; imgX < tex[i].width; imgX++) {  
  8.         int pX = (int)pos[i].x + imgX;  
  9.         if(pX < 0 || pX >= width) continue;  
  10.           
  11.         int pY = (int)pos[i].y + imgY;  
  12.         if(pY < 0 || pY >= height) continue;  
  13.           
  14.         int pIndex = pY * width + pX;  
  15.         int bg = pixels[pIndex];  
  16.         if(bg == 0xFFFFFFFFcontinue;  
  17.           
  18.         int fg = tex[i].pixels[imgY * tex[i].width + imgX];  
  19.         if(fg == 0xFF000000continue;  
  20.           
  21.         int fR = 0x00FF0000 & fg;      
  22.         int fG = 0x0000FF00 & fg;    
  23.         int fB = 0x000000FF & fg;  
  24.           
  25.         int bR = 0x00FF0000 & bg;      
  26.         int bG = 0x0000FF00 & bg;    
  27.         int bB = 0x000000FF & bg;  
  28.           
  29.         fR = min(fR + bR, 0x00FF0000);  
  30.         fG = min(fG + bG, 0x0000FF00);  
  31.         fB = min(fB + bB, 0x000000FF);  
  32.           
  33.         fg = 0xFF000000 | fR | fG | fB;  
  34.         pixels[pIndex] = fg;  
  35.       }  
  36.     }  
  37.   }   
  38.   // 位置・速度更新  
  39.   pos[i].x += vel[i].x;  
  40.   pos[i].y += vel[i].y;  
  41.   vel[i].y += ACCELERATION_Y;  
  42. }  
  43. updatePixels();  



【6月25日追記】

p5info さんからご紹介いただきました。


@Carotene 最近だとtercel_sさんがOpenProcessingはじめられたそうですよ http://t.co/3FORMQj ブログにはOpenProcessingから張り付けたアップレットが載ってますね。2011年6月25日 15:0 via web

0 件のコメント:

コメントを投稿

ひとことどうぞφ(・ω・,,)