テクスチャのあれこれ

メモです。

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( float_Data[loopY * (IMAGE_W*3) + loopX*3 + 0] );//r
Data[i][loopY * (IMAGE_W*3) + loopX*3+1] = static_cast( float_Data[loopY * (IMAGE_W*3) + loopX*3 + 1] );//g
Data[i][loopY * (IMAGE_W*3) + loopX*3+2] = static_cast( float_Data[loopY * (IMAGE_W*3) + loopX*3 + 2] );//b
//Data[i][loopY * (IMAGE_W*3) + loopX*3+0] = static_cast((255/IMAGE_W)*loopX);//r
//Data[i][loopY * (IMAGE_W*3) + loopX*3+1] = static_cast((255/IMAGE_H)*loopY);//g
//Data[i][loopY * (IMAGE_W*3) + loopX*3+2] = static_cast((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を扱っているところあたりがかなりプリミティブな処理をしているから、コードから原理がわかる。