Allegro + AllegroGL + GlyphKeeper

2005/


ここでは AllegroGLのサンプル tex.c を参考に AllegroGL でテクスチャ表示する時の 各ライブラリの役割を分けてみました。  プログラムは上から下へ向かって進行するとします。Allegroが読める画像はデフォルトでは bmp か pcx 形式しか読めない。 もし、jpeg , gif , png 形式を使用したければ、それぞれ拡張ライブラリを整える必要があると思う。


テクスチャ生成時の、各ライブラリの役割分担
bmp:ビットマップデータ
tex :テクスチャ(番号)のデータ
Allegro でビットマップデータを読む → OpenGL でセットし → allegro_gl_make_texture関数でテクスチャ化 → テクスチャをポリゴンに貼付ける。

 
Allegro文脈
AllegroGL 文脈 OpenGL文脈
 

テクスチャ番号の器を用意
GLuint  tex;
「GLuint」は、OpenGLで使用するデータに用いられる形式。Int なので整数型
画像を用意
ビットマップ画像を用意して、テクスチャを生成する。

 画像ファイルを読み込む 処理は Allegro が面倒みてくれる。 Allegro デフォルトでは  pcx , bmp形式の 画像の読み込みに対応している。

    BITMAP *
bmp;
   
bmp = load_bitmap ("mysha.pcx", 0);
    
    テクスチャ画像のサイズは、縦横それぞれ 「2のn乗ピクセル」であることに注意。
    任意のサイズを使う場合は、 blit_strech 関数 などでサイズを合わせるなどする。
    
    
    この段階で、ビットマップオブジェクト *bmp に対して 文字などを描画した場合 テクスチャにもそれが反映される。
 
 テクスチャの設定を行う
// テクスチャ使用を有効にする
glEnable (GL_TEXTURE_2D);
 
  // テクスチャの透過モードを設定する。
 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
ここでテクスチャ生成
面倒な処理は AllegroGLが肩代わりしてくれる。ここでは、ビットマップオブジェクトからテクスチャ(と関連するデータ)を生成する。
allegro_gl_make_texture関数を使う。

tex = allegro_gl_make_texture (bmp);

ビットマップ画像のメモリを再利用しない場合は、この段階でメモリを開放しても問題ない。
destroy_bitmap (
bmp);


テクスチャ貼付け
  テクスチャをポリゴンに貼付ける
  glEnable (GL_TEXTURE_2D);
 テクスチャを有効にする
 glBindTexture (GL_TEXTURE_2D, tex);
  glBegin(GL_QUAD);

 ポリゴンと テクスチャの 四隅 を関連付け。
glTexCoord2f (0, 0); glVertex3d(0, 3, 0); glTexCoord2f (1, 0); glVertex3d(0, -3 -3);
         :
   glEnd();
 



allegro_gl_make_texture 関数でやっていること


AllegoGL の テクスチャ生成処理は、表から隠されてますが、
気になるのでAllegroGL のソースを調べてみた。
この関数は、特定のビデオカードでも正しく処理できるための対策が施されている。もし互換性重視を目指していて、自前でテクスチャ貼付け処理を作成する場合は注意しておいたほうがいいかもしれない。


     
     GL_TEXTURE_2D_BINDING のパラメータを取得( glGetIntegerv関数 を使用)
     テクスチャのサイズをチェックする
     テクスチャの色数をチェックする
     テクスチャのアルファチャンネルの設定に対応した処理を行う。
     テクスチャ更新時にテクスチャが存在しなければテクスチャオブジェクトを破棄する。
    ↓
     GPUへアップロードする処理
     glGenTextures() 関数で テクスチャオブジェクトを「1個だけ」生成。
    ↓
     glPixelStorei() 関数で ピクセルのフォーマットを設定。ビデオカードの種類によってはRGBの並びを変更する。
       ↓
     glTexImage2D() 関数でテクスチャに、ビットマップ画像データをのっける。
       ↓
     glBindTexture()  関数でビットマップ画像データとテクスチャを関連づける。
    ↓
     tex  テクスチャオブジェクトを返す。
    
のような処理をやっているらしい。
    


Tsukubado