2011年11月27日日曜日

テクスチャのあれこれ

メモです。

openFrameworksのofImageで読み込んだ画像をopenGLのテクスチャで使用する方法

ofTextureの使い方がようわからんのと、時間が無いというのを理由に無理矢理やります。基本的に自分の備忘録なので、自分が分かればよいというのを大前提で書きます。


【.hファイル】

#define IMAGE_NUM 10 // とりあえず10枚画像を読み込む事にする


ofImage image[IMAGE_NUM];

// テクスチャ用
unsigned char *(Data[IMAGE_NUM]);
GLuint texture[IMAGE_NUM];
GLdouble float_Data[IMAGE_W * IMAGE_H * 3];
ofColor color_Data;



【.cppファイル】

// 画像の読み込み
for( int i = 0; i < IMAGE_NUM; i++)
{
        image[i].loadImage( "../bin/data/Image/Model_0.jpg");

        // テクスチャ初期化
        // テクスチャ読み込み配列を定義
Data[i] = new unsigned char[IMAGE_W * IMAGE_H * 3];
        //初期化
memset(Data[i], 0, sizeof(unsigned char) * IMAGE_W * IMAGE_H * 3);

        //ここでカラー設定
for(int loopY = 0; loopY < IMAGE_H; loopY++)
{
for(int loopX = 0;loopX < IMAGE_W; loopX++)
{
//unsigned char* getPixels =  texIMG_3D[i].getPixels();
int imgW = (int)ofMap( loopX, 0, IMAGE_W, 0, imageW[i]);
int imgH = (int)ofMap( loopY, 0, IMAGE_H, 0, imageH[i]);
color_Data = image[i].getColor( imgW, imgH);
float_Data[loopY * (IMAGE_W*3) + loopX*3 + 0] = color_Data.r;
float_Data[loopY * (IMAGE_W*3) + loopX*3 + 1] = color_Data.g;
float_Data[loopY * (IMAGE_W*3) + loopX*3 + 2] = color_Data.b;
Data[i][loopY * (IMAGE_W*3) + loopX*3+0] = static_cast<unsigned char>( float_Data[loopY * (IMAGE_W*3) + loopX*3 + 0] );//r
Data[i][loopY * (IMAGE_W*3) + loopX*3+1] = static_cast<unsigned char>( float_Data[loopY * (IMAGE_W*3) + loopX*3 + 1] );//g
Data[i][loopY * (IMAGE_W*3) + loopX*3+2] = static_cast<unsigned char>( float_Data[loopY * (IMAGE_W*3) + loopX*3 + 2] );//b
//Data[i][loopY * (IMAGE_W*3) + loopX*3+0] = static_cast<unsigned char>((255/IMAGE_W)*loopX);//r
//Data[i][loopY * (IMAGE_W*3) + loopX*3+1] = static_cast<unsigned char>((255/IMAGE_H)*loopY);//g
//Data[i][loopY * (IMAGE_W*3) + loopX*3+2] = static_cast<unsigned char>((255/IMAGE_NUM)*i);//b
}
       }
}
// ピクセルを自由に使える処理?

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
//数を知らせる
glGenTextures(IMAGE_NUM, &texture[0]);
for( int i = 0; i < IMAGE_NUM; i++)
{
glBindTexture(GL_TEXTURE_2D, texture[i]); //1枚目をバインド(設定する)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);// 拡大フィルタ
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);// 縮小フィルタ
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_W, IMAGE_H, 0, GL_RGB, GL_UNSIGNED_BYTE, Data[i]);
delete Data[i];
}

/*------------------------------------------------
以下の2行が無いと、アルファ抜きはできてもテクスチャ同士のアルファ抜きはできない
------------------------------------------------*/
/* テクスチャ環境 */
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
/* アルファテストの比較関数 */
glAlphaFunc(GL_GREATER, 0.f);


//----------------------------------------------
こんな感じでセットアップ完了

あとは使いたいところで
//----------------------------------------------

glBindTexture(GL_TEXTURE_2D, texture[imageID]);
/**** アルファテスト開始 ****/
glEnable(GL_ALPHA_TEST);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 1.0); glVertex3d(-500, 500, 0.f);
glTexCoord2d(0.0, 0.0); glVertex3d(-500,-500, 0.f);
glTexCoord2d(1.0, 0.0); glVertex3d( 500,-500, 0.f);
glTexCoord2d(1.0, 1.0); glVertex3d( 500, 500, 0.f);
glEnd();
glDisable(GL_TEXTURE_2D);
/**** アルファテスト終了 ****/
glDisable(GL_ALPHA_TEST);

//----------------------------------------------
みたいに使えばOK


流れとしてはofImageからカラー情報を取り出して、Data配列にぶち込んで、textureに値を渡すというなんとも回りくどいやり方をやっている。
我流にもほどがあるだろ。

openGLの知識が要るのは、glGenTextures(IMAGE_NUM, &texture[0]);以下の設定の所かな。
ここでテクスチャの基本設定を行っているっぽい。

3Dテクスチャもこれと同じ作り方してたんだなー。結構汎用性があっていいかも。
unsigned char型のDataを扱っているところあたりがかなりプリミティブな処理をしているから、コードから原理がわかる。

memo

田所先生のブログ?
色々tipsが載ってます。
http://yoppa.org/ma2_10/2214.html


WindowsLiveMeshについての記事
http://www.atmarkit.co.jp/fwin2k/win2ktips/1359livemesh/livemesh.html

http://sodakeblog.wordpress.com/2011/01/16/live-mesh-2011%E3%81%A7%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E5%90%8C%E6%9C%9F/

DigitalBoutique_01

今もらっているお仕事(?)お遊び(?)のお話。

仮想ブティックを映像で作りプロジェクターで空間そのものを作り出してしまおうという計画。

単純に、芸能事務所のCM作りなのだが、自分のやりたいようにやらせてもらう。

【作業メモ】
Cortexのキャリブレーションデータ保存ディレクトリ
D:\kawabata\20111127_Noir\2320

Cortex情報
【バージョン】
Cortex-64 2.0.2.917
【手順】
1、立ち上げて、connect to cameras→Raptar,Eagle両方使った
2、保存ディレクトリを決める
3、静的キャリブレーション
4、動的キャリブレーション→なんとなく成功した
5、MiscのIPアドレス"10.1.1.250"
6、VisualC++のプロジェクトのCortexのセットアップのコードで
if(RC_Okay != Cortex_Initialize(const_cast<char*>("10.1.1.250"),const_cast<char*>("10.1.1.250"))){
とMiscのIPアドレスをコピペ
7、D:\kawabata\of_preRelease_v0061_vs2008_FAT\apps\myApps\oscSenderFromCortex_v04
のOFのプロジェクトを実行すると、送られてきたマーカー数と座標(テンプレートなし)を確認できる


今回は隣のPCを立ち上げることなく、C++でマーカー情報を取得することができた。
今までは、隣のPCに接続して隣のPCのIPアドレスをMiscとCortexセットアップの所に書かなければならなかった。

配線は全くいじっていないので原状復帰は楽にできそうだ

いつもはCortexのセットアップだけで時間がとられてしまうので、スムーズにいったのが逆に怖い。
本番動かないとかになりかねない。


ofxSimpleGuiTooをOFのver007以降で使おうとすると、
ofGraphicsのofSetColor(int gray)でエラーが出るので、
これをコメントアウトしてofSetColor(const ofColor & color)の方だけを使うようにすると通る。

2011年11月18日金曜日

回顧録_01

今までの自分を振り返った。好きなことに没頭する人生だったと思う。

勉強にしろ部活にしろ恋愛にしろ制作にしろ、全部「好きこそ物の上手なれ」だった。

没頭している間は、圧倒的な時間と労力を割くことができるが、
没頭できる事や環境がないと堕落してしまう性分なのだなとつくづく感じた。


後は「他人と自分は違う」という線引きをよくしている。それがプラスに働く時とマイナスに働く時の差が非常に激しい。ここが自分の最大の短所であり長所だと思う。
「自分は他人よりも劣るから頑張ろう」と思っている時は、凄まじい努力をするが、
「どうせ自分は低レベルな人間だから、高レベルなことはできない」と思い始めたらとことん堕落する。
極力後者は考えないようにはしているが、頭の片隅にいつも暗い雲のように居座っている事は確か。


非常に大雑把にまとめると以上の2点に尽きる人生だったなと笑

後は、弟の事もあり、個を大切にできる性格でもあるとは思う。個性を大切にする人間なのかなと。



大学生活は、「デザインを勉強している」という意識が全く欠けていた。漠然と「デザインって何なんだろう」と思っていただけだ。これが今までの自分に足らない最大の要素。「デザインとは...」そこから出直した方がよさそうだ。
ただ、自分の軸は見失ってはいけないので、心の核にどんどん塊を粘土のように付け足していくようなイメージを心がける。

デザインのプロセスとして、立案・設計・作成という3つの機軸を今まで経験してきたわけであるが、大学生活において「作成」の部分の閉占める割合が圧倒的に多かった。これからは「立案/設計/作成」の3つのフェーズをちゃんと意識した制作を心がけようと思う。

2011年11月15日火曜日

ofxAddonsあれこれ
http://ofxaddons.com/

nikki_20111114

当面の方針を決めようと思う。

今週はかなりだらけてしまった。つくづく自己管理ができない人間なのだなと再認識した。
目標がないと何もできない、というか何もしない。目標すらたてない。だから終始憔悴した一週間だった。
自分で課題を設定して、それに合致する解答を提示する。問題発見能力と問題解決能力の基礎的なトレーニング。

・球面波グラフィック
・3Dモデルの大量の頂点を使ったグラフィック
・BPコンテンツのプロトタイプのアイデア

こんな感じかな。

2011年11月9日水曜日

20111109_nikki

一つ大きな仕事が終わった。

単なるVJなのだが、今回はできるだけプログラミングだけで映像を生成する事を心掛けた。今回の課題としては、映像のテーマ性の欠如とインターフェースの不十分さが挙げられる。

テーマ性に欠けるので、全て思いつきの映像の断片の集合という様相を呈してしまった。これからはテーマを持ってその文脈に沿った映像を作り、一つの作品とまではいかないにしても何か一貫性と統一性を持った映像にしたい。そうする事で演出に個性が出てきて、観客に経験として記憶に残るような演出ができると思う。
それとインタラクションの種類を増やしたい。今の所、音、Kinectしか使っていない。他にも使えそうなものはガンガン使ってやりたい。

あとパターンが少なすぎた。使い回しが多くて雑に見えてしまう。まぁ今回は時間が無かったと言ってしまえばそれまでだが、効率化とアイデアを形にするスピード感が必須。

インターフェースに関しては、まずUIを別ウィンドウで制御できるようにしたい。OSCでやるのではなく他のやり方がないかちょっと調べてみたい。
個々の値の制御を全てUIでやれるようにしたのはよかったがとは思うが、不必要な値が多すぎてUI自体が煩雑になってしまった。

必要な機能とそうでない機能の見極めっていうのはかなり難しいし、経験に由来する部分が圧倒的に大きい。今回のフィードバックをきっちり行って次に臨みたい。


これからやる事といえば、
・webを一人で構築できるようになる(Dormitoryのサイト、Labのサイト)
・Ramaコンテンツ
・CGのバイト

こんなもんかな。