現在地 >> メニュー >> サンプルコード::OpenGL >> OpenGL::テクスチャのはりかた
現在地 >> メニュー >> 基本編06 >> OpenGL::テクスチャのはりかた

テクスチャのはりかた


OpenGLでテクスチャをはるときの手順は以下の通り。
  1. 「画像」を読み込んで、「色データ」を抽出。
  2. 「色データ」から「テクスチャ」を作成。
  3. 「テクスチャ」をはる。

1.「画像」を読み込んで、「色データ」を抽出


「OpenGL」では、基本的に画像を読み込む「関数」がない。
          ↓
  • 自作する
  • ライブラリを利用する -(AUXライブラリ、SDL、OpenCV、などなど)

といった手段を用いる。


以下、
「色データ」は「char * 型」に格納したものと仮定する。
(「OpenCV」や「AUXライブラリ」なら「char*型」に格納されるはず)

例:RGBの3色をchar 型で格納した場合


配列の並びは例えば以下のようになる。

char[0] => Redデータ
char[1] => Greenデータ
char[2] => Blueデータ

char[3] => Redデータ
char[4] => Greenデータ
char[5] => Blueデータ
 ・
 ・
 ・

2.「色データ」から「テクスチャ」を作成


テクスチャを作成するのに基本的に必要なのは、
  1. 「OpenGL」に「テクスチャの数」をしらせる。
  2. 「テクスチャ」を「バインド」する。
  3. 「テクスチャ」を「拡大・縮小」したときの「処理方法」の指定。
  4. 「テクスチャ」をメモリ上に作成。

である。


[例]:「テクスチャ」を作成

/*****[テクスチャ用変数]*****/
GLuint texture[2];

/******* テクスチャ作成 ****************/
glGenTextures(2, &texture[0]);          //数を知らせる
glBindTexture(GL_TEXTURE_2D, texture[0]);   //1枚目をバインド(設定する)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//拡大・縮小についての設定
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

gluBuild2DMipmaps(GL_TEXTURE_2D, 3,image1->width,image1->height,GL_RGB,GL_UNSIGNED_BYTE,image1->imageData);
//メモリ上にテクスチャ作成
 ・
 ・
 ・


この場合、作成する「テクスチャの数」は2枚。
そのうち、1枚目の「texture[0]」に対し、設定をしている。


2枚目を設定するには、
 glBindTexture(GL_TEXTURE_2D, texture[1]);
としてその下に設定を書いてゆく。


「gluBuild2DMipmaps()関数」を使うことで、
「画像のサイズ」が「2のn乗でなければならない」という制限がなくなる。


※なお、「GL_ARB_texture_non_power_of_two」という拡張があると、
「glTexImage2D()関数」で「2のn乗以外」が使用可能。(OpenGL 2.0では標準機能)

3.「テクスチャ」をはる


一般に「テクスチャ」は「2次元の画像」である。

「画像の左下を原点」とする「s-t座標」を考え、
その「座標」と「ポリゴンの頂点」とを対応させればテクスチャがはれる。
(※s-t座標はx-y座標でいうと、
  s → x (横軸),
  t → y (縦軸) 
  というように対応。
 )




[例]:四角形にテクスチャをはる

glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);

glTexCoord2d(0.0, 1.0);   glVertex2d(-1,1);
glTexCoord2d(0.0, 0.0);   glVertex2d(-1,-1);
glTexCoord2d(1.0, 0.0);   glVertex2d(1,-1);
glTexCoord2d(1.0, 1.0);   glVertex2d(1,1);

glEnd();

glDisable(GL_TEXTURE_2D);


この場合、画像の左上から、反時計まわりで頂点と対応付けをしてはっている。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます