MacOSX , Allegro + OpenGL を使うためのメモ。
Allegro GL について
AllegroGL は、 OpenGL を Allegro上で使えるようにする補助ライブラリで、ちょうど、SDL と GLUT( OpenGL UtilityToolkit) を組み合わせて使うのと似ています。
Windows , Linux , OSX対応の AllegroGL 0.4.0RC3 がリリースされました。
こちらから入手できます。
OSX Tiger 10.4.5&Allegro4.2.0 にて、インストール、動作を確認済み。
AllegroGL 0.2.4 は
http://allegrogl.sourceforge.net/ から入手できる。
Windows , MacOSX , UNIX X11環境に対応している。(現時点では、MacOSX へのインストールはちょっと修正が必要です)
AllegroGL 0.2.0 は、OpenGL 1.4対応、AllegroGL 0.4.0 では、OpenGL 2.0に対応しているとの事。
OpenGLを使って描画するする場合、Allegro のスクリーンや、グラフィック描画関連の関数( line や blit ) はほとんど使えなくなってしまうので注意する。
(AllegroGLでは Allegro のグラフィック関数を使う代替手段として、 Direct-mode 2画面モード やOpenGLで描画する Allegroグラフィック関数( allegro_gl_screen_draw_sprite 等 )が一応用意されているが、処理速度はあまり期待しないで、とのこと。)
○
Allegro, AllegroGL , OpenGL の タイムライン
各ライブラリの役割について。
○
AllegroGL と GLUT の比較
まだよくわかっていないな部分もあります。
○
AllegroGL でテクスチャ貼付け
面倒な処理はAllegroGLが引き受ける。
AllegroGL0.4.0RC3インストールメモ
AllegroGL0.4.0RC3を
こちらから入手。
○ コンパイルとインストール:
ターミナルから
cd alleggl
./fix.sh macosx
make
sudo make install
sudo make install DEBUGMODE=1 (デバッグモードをインストールする場合)
サンプルプログラムの実行
cd examp
./tex
(MacOSXでサンプルプログラムを実行する場合はコマンドラインから実行して下さい。サンプルプログラムの中には、GUIからのダブルクリックでは画像ファイルを読み込まないものがあります。(extextur, exalpfnt,exalleg,tex など))
○情報
AllegroGLで利用できる OpenGL拡張機能.:extensions.txt
バグ・リスト: .bugs.txt
クイックスタート:quickstart.txt
良く有る質問, 画面モード ,OS別コンパイルオプション について
○ AllegroGL サンプル
インストールに成功すると、AllegroGL 解凍ディレクトリ 内の examp ディレクトリの中にはコンパイルされたサンプルプログラムが 作成されているので、色々試すことができます。
exext.c (ワイヤーフレームで出来たうねうねする波)
test .c ( 3Dの組合わさった立体をキー入力によって回転できる)
tex.c (テクスチャ画像が貼られた立体)
excamera.c (カメラ視点の移動)
exalpfnt.c (カラーバー描画と、フォントを表示、Hello world )
exmasked.c ( 背景と、疑似透過スプライト。OpenGL で2D表示する。)
extextur.c (ブレンド表示 、テクスチャ表示のデモ)
dialog.c ( GUI による ダイアログで画面モードと色深度を選択してから test .c の立体を表示 )
extext.c ( STAR WARS のオープニング風にテキストが表示される。また、その周りを他のテキストが飛び回わる。 )
exmipmaps.c( ミップマップのテスト。格子状のテクスチャがだまし絵のように動きます。テクスチャが密になっている中央部分に注目。)
exalleg.c (FPS表示、ポリゴンマウスカーソル、アニメーション。)
dumbtest.c(よく分からないデモ, スクリーンショットと変な mysha.bmpを作る?)
AllegroGLサンプルプログラムに関する、MacOSX 注意事項:
(exalleg.c, exalpfnt.c, extext.c,extextur.c , tex.c で、(Error loading `mysha.pcx' 等 のエラーメッセージが出る )
これらは、コマンドラインからコンパイルされた非アプリケーションバンドルなので、コマンドラインから実行して下さい。
GUIからアイコンをダブルクリックしても画像読み込み失敗するものがあります。
これらサンプルをXcode上でコンパイルしたい場合、アプリケーションバンドル外にある画像やdatファイルを正常に読込ませる必要があります。 ソースを修正してmain関数で初期化後の install_allegro_gl(); の後に chdir(".."); を追加すると解決します。 OSX特有の問題参照。
Xcodeでexext.c のコンパイルが失敗するのは、文字コードが原因です。(サンプルの マクロ行のある行末を「¥」から「バックスラッシュ」に変更する)
○ ソース
#include <alleggl.h>
○ Xcode「リンカ設定」に追加するオプション。
-lagl -framework Carbon -framework OpenGL
(allegroGLを 動的ライブラリとしてリンクするなら -lagld),
allegroライブラリは、 -lalleg-main または、`allegro-config --libs` (allegroデバッグモードなら `allegro-config --libs debug`)
○ トラブル
alopgl:0: table of contents for archive: /usr/local/lib/libagl.a is out of date; rerun ranlib(1) (can't load from it)
Xcodeでコンパイルしようとした場合、このようなメッセージが表示されたら
sudo ranlib /usr/local/lib/libagl.a
と、ターミナルから コマンドを打ってlibagl.a をrerun してください。
参考文献:
OpenGL, Mingw32 and Allegro + DirectX
GLUTによる「手抜き」OpenGL入門
AllegroGL bug on OSX with ATI Radeon 9200
Cannot build AllegroGL 0.2.4 on Mac OS 10.3.9
OpenGL, GLUT, Mingw32 and Allegro + DirectX
OrbitalMind Software Obj Loader (OSXで動かすにはいくつか修正の必要がある)
※AllegroGL 0.4.0RC3リリースのため、 AllegroGL0.2.4 インストールに関するメモをタブ化しました。
AllegroGL0.2.4 インストールメモ
(AllegroGLの次のバージョンで改善された場合、この修正情報は役に立たなくなる可能性があります。)
(他には、OpenLayerの OSX 版に収録されている AllegroGL バイナリをそのまま拝借する、という手もあります。)
readme を見ると OSX に対応していると書かれているが、なぜかコンパイル中にエラーが発生。
AllegroGL0.2.4 に収録されている fix.sh と macosx.m には、不具合があるので修正する必要があります。
○fix.sh に間違いがあるので修正。
sh misc/dtou.sh $$f
↓
sh misc/dtou.sh $f
もう一カ所
sh misc/utod.sh $$f;
↓
sh misc/utod.sh $f;
○macosx.m の 不具合を修正
macosx.diff で CVSに対するパッチ
がでています。このパッチをあてると、インストールできるようになりました。まず、Allegro GL の
CVS ツリーから、最新のmacosx.m のソース(1.7)を入手し、AllegroGL0.2.4の src ディレクトリに入っていた macosx.m と 入れ替えてください。
CVS を利用していると、コマンド一発で変更が反映されるみたいですが、自分はよくわからなかったので、 macosx.diff の変更点を 見ながら CVS 1.7 のソースをダウンロードしてきて、テキストエディタで変更を加えました。
(※AllegroGL 0.2.4 に収録されてる macosx.m ではなくて。CVS版の macosx.m のソースを元に変更します。)
○ AllegroGL サンプル
インストールに成功すると、AllegroGL 解凍ディレクトリ 内の example ディレクトリの中にはコンパイルされたサンプルプログラムが できあがってるので、試すことができます。なかなか面白いです。
exext.c (ワイヤーフレームで出来たうねうねする波)
test .c ( 3Dの組合わさった立体をキー入力によって回転できる)
tex.c (テクスチャ画像が貼られた立体)
excamera.c (カメラ視点の移動)
exalpfnt.c (カラーバー描画と、フォントを表示、Hello world )
exmasked.c ( 背景と、疑似透過スプライト。OpenGL で2D表示する。)
extextur.c (ブレンド表示 、テクスチャ表示のデモ)
dialog.c ( GUI による ダイアログで画面モードと色深度を選択してから test .c の立体を表示 )
extext.c ( STAR WARS のオープニング風にテキストが表示される。また、その周りを他のテキストが飛び回わる。 )
(コンソールで動かないものでもXcodeからコンパイルするとうまく動作するものもあります。
また、Xcodeでコンパイルが失敗するものは、サンプルの マクロ行のある行末を「¥」から「バックスラッシュ」に変更すると動くものがあるかもしれない)
○ ソース
#include <alleggl.h>
○ Xcode「リンカ設定」に追加するオプション。
-lagl -framework Carbon -framework OpenGL
○ トラブル
alopgl:0: table of contents for archive: /usr/local/lib/libagl.a is out of date; rerun ranlib(1) (can't load from it)
Xcodeでコンパイルしようとした場合、このようなメッセージが表示されたら
sudo ranlib /usr/local/lib/libagl.a
と、ターミナルから コマンドを打ってlibagl.a をrerun してください。
○ その他
オブジェクトの回転が速すぎて何がなんだか分からければ、キー入力の処理のところに、rest(50); を入れてウェイトをかけてみる。
画像ファイル等が必要なサンプルプログラムをXcodeでコンパイルする場合、プロジェクトディレクトリのbuild ディレクトリ内へ、必要な画像ファイルを入れると読み込むようになる。
( mysha.pcx、running.dat、demofont.dat、lucidia.dat など)
なお、フォントの読み込みは、サンプルプログラムではAllegroのDATAFILE形式 からAGL_FONT_TYPE_TEXTURED のAllegroGL Font に変換する方式しか紹介されてないので。他の種類のフォント形式(アウトラインとか)に変換する方法については、色々試してみるしかない。
○他、役立ちそうなもの。
AllegroGLで利用できる OpenGL拡張機能.:extensions.txt
バグ・リスト: .bugs.txt
良く有る質問, 画面モード ,OS別コンパイルオプション について.....FAQ.txt
○ MaoOSX の OpenGL について。
http://developer.apple.com/graphicsimaging/opengl/ より
OpenGL 1.1 OSX 10.0 以降
OpenGL 1.2.1 OSX 10.0 以降
OpenGL 1.3 OSX 10.1 以降
OpenGL 1.4 OSX 10.2.3 "Jaguar" 以降
それぞれ、対応するグラフィックカードがないと動作しません(最近のは対応してます)。
○ コンパイルとインストール:
ターミナルから
cd alleggl
./fix.sh macosx
make
sudo make install
○ コンパイルログ:
User:~ user$ cd /Desktop/alleggl
User:~/Desktop/alleggl user$ ./fix.sh macosx
Done!
find: -!: unknown expression primary
bugs.txt
extensions.txt
faq.txt
howto.txt
quickstart.txt
readme.txt
todo.txt
changelog
config.log
configure
configure.in
fix.sh
make/makefile.unx
make/makefile.gen
make/makefile.lst
User:~/Desktop/alleggl user$ make
gcc -c src/macosx.m -o obj/macosx/release/macosx.o -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext
ar rs lib/macosx/libagl.a obj/macosx/release/alleggl.o obj/macosx/release/glvtable.o obj/macosx/release/scorer.o obj/macosx/release/scrmode.o obj/macosx/release/math.o obj/macosx/release/aglf.o obj/macosx/release/fontconv.o obj/macosx/release/texture.o obj/macosx/release/glext.o obj/macosx/release/gui.o obj/macosx/release/videovtb.o obj/macosx/release/macosx.o
ar: creating archive lib/macosx/libagl.a
ranlib lib/macosx/libagl.a
gcc examp/test.c -o examp/test -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/tex.c -o examp/tex -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/dumbtest.c -o examp/dumbtest -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/dialog.c -o examp/dialog -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/extext.c -o examp/extext -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/extextur.c -o examp/extextur -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/exmasked.c -o examp/exmasked -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/exalleg.c -o examp/exalleg -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/exalpfnt.c -o examp/exalpfnt -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/excamera.c -o examp/excamera -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/exgui.c -o examp/exgui -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
gcc examp/exext.c -o examp/exext -W -Wall -Wno-unused -O2 -ffast-math -fomit-frame-pointer -fno-common -pipe -Iinclude -Iinclude/allegrogl -Iinclude/allegrogl/GLext lib/macosx/libagl.a `allegro-config --libs` -framework Carbon -framework OpenGL
-
Success!
Now run make install to install AllegroGL.
User:~/Desktop/alleggl user$ sudo make install
参考文献:
OpenGL, Mingw32 and Allegro + DirectX
GLUTによる「手抜き」OpenGL入門
AllegroGL bug on OSX with ATI Radeon 9200
Cannot build AllegroGL 0.2.4 on Mac OS 10.3.9
OpenGL, GLUT, Mingw32 and Allegro + DirectX
OrbitalMind Software Obj Loader (OSXで動かすにはいくつか修正の必要がある)
AllegroGL0.40 API リファレンス日本語私訳
(AllegroGLのマニュアルは少し複雑だったので、主要なところだけ訳したもの, 意訳含む。不正確な部分があるかもしれないので注意してください。)
AllegroGL は、 Allegro と一緒に OpenGLを使用できるようにするための機能を提供します。スクリーンに出力は OpenGL が受け持ち、その他の雑多な仕事…たとえば、入力、タイマー処理、クロスプラットホームの移植性、データ読み込み、テクスチャの描画 をAllegro に任せます。このライブラリはちょうど GLUT(OpneGL Utility Tools) と同じような役目を果たします。
AllegroGL は また、全部ではないけれども、ユーザープログラムが利用可能な OpenGL 拡張機能を自動的に検出、管理します。手動で拡張機能をロードする必要はありません。
システム
AllegroGLグラフィックドライバ
数学 - 行列変換と四元数
文字列描画とフォント
OpenGL 拡張機能
Allegro描画関数互換 (プリミティブ図形描画関数のwrapper、実際はOpenGLで描画する)
ビデオモードの設定 ( allegro_gl_set関数に渡すオプション設定)
AllegroGL GUI (このページでは未説明。 AllegroGUIのwrapper。使い方はAllegroGUIとほぼ同じ。 )
非推奨APIリスト(廃止予定のAPI)
システム
AllegroGL 旧バージョンとの下位互換性 ( backward compatibility )を保つ
allegro_gl_begin(), ;allegro_gl_end();これらは、プログラムに書く必要はありません
#define allegro_gl_begin();
始まり
AllegroGL 0.0.22 以前のバージョンと互換性をとるために記述される定義。記述しても定義されないので、これをプログラムに書く必要はありません。
#define allegro_gl_end();
終わり。
AllegroGL 0.0.22 以前のバージョンと互換性をとるために記述される定義。記述しても定義されないので、これをプログラムに書く必要はありません。
AllegroGLの初期化
int install_allegro_gl(void );
AllegroGL を 有効にする。この関数は、Allegro_init(); や install_allegro();よりも後に呼び出す必要がある。
AllegroGLの終了
void remove_allegro_gl (void );
AllegroGL を 終了する。この関数の呼び出し後に、OpenGL や AllegroGL 関連の関数を呼び出してはいけない。
なお、この関数はプログラムの終了時に自動的に呼ばれるため、明示的に呼び出す必要はない。
スクリーンのフリップ
void allegro_gl_flip(void );
フレームバッファを差し替えて、画面の更新を行う(必須)。
OpenGL の ダブルバッファモードならば、あなたは スクリーンに表示された前面のバッファにアクセスすることができる。
そしてまた、非表示になっている後面のバッファにも同じくアクセスできる。このルーチンは、バッファを交互に入れ替える
OpenGL のバージョンを調べる
float allegro_gl_opengl_version();
OpenGL の バージョンナンバーを返す。
OpenGL の正しい
コンテキストを得るには、 set_gfx_mode(GFX_OPENGL) の前に呼ばない方がよい。
AllegroGL グラフィックドライバ
AllegroGL グラフィックドライバ
AllegroGL をインストール、使用する場合 Allegro の set_gfx_mode 関数で新たに OpenGL 画面用のモードが選択できるようになる 。
set_gfx_mode(モード名 , 幅, 高さ,仮想幅, 仮想高さ)
set_gfx_mode(GFX_OPENGL_WINDOWED, 640, 400, 0, 0)
新たに選択できるようになるのは次の 3つのモード。
GFX_OPENGL
GFX_OPENGL_FULLSCREEN
GFX_OPENGL_WINDOWED
#define GFX_OPENGL_WINDOWED
ウインドウモードで動作する Allegro 用の OpenGL グラフィックドライバを使用する
#define GFX_OPENGL_FULLSCREEN
フルスクリーンモードで動作する Allegro 用の OpenGL グラフィックドライバ を使用する
#define GFX_OPENGL
動作モードを特に指定しない場合。
AllegroGLの詳細設定
allero_gl_set(); allero_gl_set関数で指定できます。指定可能なパラメータの詳細は
フレームバッファを参照して下さい。
allegro_gl_set (AGL_COLOR_DEPTH, xxx)
色深度は、 allegro_gl_set(); 関数で 指定されなければ set_color_depth() の設定が流用される。
GFX_AUTODETECT or GFX_AUTODETECT_WINDOWED を指定した場合、非OpenGL モードか Allegro モードか選択する、
テクスチャサイズのチェック
int allegro_gl_check_texture_ex( int flags,
BITMAP * bmp,
GLint internal_format
)
指定されたビットマップが、テクスチャとして最適かどうかチェックする。 これはテクスチャのサイズをチェックする。
この関数のパラメータの配置は、 allegro_gl_make_texture_ex().関数と 同一である。
重要:このチェックは 大きさのチェックのみで、メモリ残量のチェックはしない。もしメモリ不足なら この関数からTRUEが返ってきたからといって
このテクスチャを張り込めるとは限らない。あなたは、実際にglAreTexturesResident().関数を使ってテクスチャが内在しているか確かめる必要があるかもしれない。
パラメータ:
flags ビットマップコンバージョンのフラグ
bmp コンバートするビットマップ
internal_format 内部フォーマット
返値:
TRUE テクスチャを生成できる
FALSE テクスチャが大きすぎる
テクスチャの生成
iGLuint allegro_gl_make_texture_ex( int flags,
BITMAP * bmp,
GLint internal_format
)
返値:テクスチャID
allegro_gl_make_texture_ex で得られた テクスチャIDを glBindTexture で指定する。
GL のドライバの テクスチャに、Allegro ビットマップ をアップロードする。
このビットマップオブジェクトは メモリビットマップ*1である必要がある。
また,サブビットマップオブジェクト*2 は適さない。
*1 (Allegro の create_bitmap();関数によって生成されたビットマップオブジェクト )
*2( Allegro の create_sub_bitmap(); 関数によって生成された 共有描画領域を司る ビットマップオブジェクト)
allegro_gl_make_texture_ex を呼ぶと、OpenGLのテクスチャデータの並び形式を指定する glPixelStore関数や glTexImage2D関数, glTexParameter関数等の手間がかかる設定 が自動的に済まされるようです。そのため 例えば、allegro_gl_make_texture_ex で biliniear 補完を強制的に行いたい場合は、改めて glTexParameter関数 を呼び出して設定するそうです。
各ビットマップは、ドライバによってロードされ、 single texture object に変換される。
テクスチャとして使えるビットマップのサイズは 必ず 2 の ベキ乗(2 .. 4 .. 16 .. 64 .. 128 .. 256 .. 512)ピクセル で
なければならない。このテクスチャサイズの規則を絶対に破ってはいけない。
single texture object に変化させた場合、オリジナルのビットマップオブジェクトに変更を加えてはいけない。
int flags ビットマップコンバージョンのフラグ
テクスチャ生成をコントロールする設定。これらの設定はOR 集合で 併用することができる。
AGL_TEXTURE_MIPMAP
AGL_TEXTURE_HAS_ALPHA
AGL_TEXTURE_FLIP
AGL_TEXTURE_MASKED
AGL_TEXTURE_RESCALE
テクスチャ設定 フラグ
#define AGL_TEXTURE_MIPMAP 0x01
AllegroGL は、このテクスチャのために ミップマップ(mipmap) を生成している。.
#define AGL_TEXTURE_HAS_ALPHA 0x02
ビットマップにアルファチャンネルがあるということを AllegroGL に知らせる。
#define AGL_TEXTURE_FLIP 0x04
x軸に対して表示を切り替える。
#define AGL_TEXTURE_MASKED 0x08
Allegro の maskcolor (濃いピンク色:RGB 255 0 255)を透過したテクスチャを生成する。
#define AGL_TEXTURE_RESCALE 0x10
ビットマップの拡大倍率を変更したいことを AllegroGL に知らせる。
#define AGL_TEXTURE_ALPHA_ONLY 0x20
AllegroGL に 8bbp アルファ のみの ビットマップデータを使用していることを知らせる。
AllegroGL は決められたTexel *3 フォーマットを伴ったテクスチャを生成する。 Texel フォーマットは、glTexImage2D();関数 で指定可能なフォーマットでなければならない。
その際に、AllegroGL は どんな エラーチェックもしない。もし、あなたがビットマップに基づく フォーマットを自動的に設定して欲しいなら、フォーマットの パラメータに -1 を指定する。
*3 (テクセル:3Dオブジェクトのテクスチャを構成する最小単位。2D描画における最小単位ピクセルに相当)
正しいGL レンダリングコンテキストが確立されれば、あなたは OpenGLモードと同時には set_gfx_mode(); 関数を使うことができないことを意味する。
重要:アルファチャンネルは常に 32bit モードで、表示される。もしアルファチャンネルを必要とするなら、手動によって記述しなければならない。
パラメータ:
flags ビットマップコンバージョンのフラグ。
bmp コンバートするビットマップ
internal_format 内部フォーマット
数学 - 行列変換
スタック行列(待ち行列)。OpenGL では オブジェクトの回転やアニメーションのために、変換行列をいくつもストックすることで管理している。
参考文献:http://miso.ice.ous.ac.jp/~oka/opengl/section04.html
参考文献:http://www.wakhok.ac.jp/~momma/lec2000/Graphics_Programming/6/lecture6.html
Allegro 固定 行列 → OpenGL 浮動 配列
void allegro_gl_MATRIX_to_GLfloat ( MATRIX *m, GLfloat gl[16] )
Allegro の 固定小数点 (fixed-point)型 の行列 を OpenGLの行列操作に適した 浮動小数点(floats)型 の配列 に変換する。
MATRIX m = identity_matrix;
GLfloat gl_m[16];
get_vector_rotation_matrix(&m, itofix(1), 0, itofix(1), ftofix(43.83));
allegro_gl_MATRIX_to_GLfloat(&m, &gl_m);
glLoadMatrixf(&gl_m);
Allegro 固定 行列 → OpenGL 倍精度実数 配列
void allegro_gl_MATRIX_to_GLdouble ( MATRIX *m, GLdouble gl[16] )
Allegro の 固定小数点 (fixed-point)型 の行列 を OpenGLの行列操作に適した倍精度実数(double)型 の配列に変換する。
Allegro 浮動 行列 → OpenGL 浮動 配列
void allegro_gl_MATRIX_f_to_GLfloat( MATRIX_f * m, GLfloat gl[16] )
Allegro 浮動小数点型(float) 型の行列 を OpenGLの行列操作に適した 浮動小数点(floats)型 の配列 に変換する。
Allegro 浮動 行列 → OpenGL 倍精度実数 配列
void allegro_gl_MATRIX_f_to_GLdouble( MATRIX_f * m, GLdouble gl[16] )
Allegro 浮動小数点(float) 型の行列 を OpenGLの行列操作に適した倍精度実数(double)型 の配列に変換する。
OpneGL 浮動 行列 → Allegro 固定 行列
void allegro_gl_GLfloat_to_MATRIX ( GLfloat gl[16], MATRIX *m)
スタック行列から取り出された OpenGL 浮動小数点(floats)型 の行列 を Allegro の 固定小数点 (fixed-point)型 の行列 に変換する。
OpneGL 倍精度浮動 行列 → Allegro 固定 行列
void allegro_gl_GLdouble_to_MATRIX ( GLdouble gl[16], MATRIX *m )
スタック行列から取り出された OpenGL 倍精度 浮動小数点(double precision floating-point)型 の行列 を Allegro の 固定小数点 (fixed-point)型 の行列 に変換する。
OpneGL 浮動 行列 → Allegro 浮動 行列
void allegro_gl_GLfloat_to_MATRIX_f ( GLfloat gl[16], MATRIX_f *m )
スタック行列から取り出された OpenGL 浮動小数点(floats)型 の行列 を Allegroの 浮動小数点(floats)型 の行列 に変換する。
OpneGL 倍精度浮動 行列 → Allegro 単精度浮動 行列
void allegro_gl_GLdouble_to_MATRIX_f ( GLdouble gl[16], MATRIX_f *m )
スタック行列から取り出された OpenGL 倍精度 浮動小数点(double precision floating-point)型 の行列 を Allegroの 単精度 浮動小数点(single-precision floating-point )型 の行列 に変換する。
クオータニオン(Quaternion,四元数)関連
参考:
クオータニオン
,
四元数で回転入門
,
Radiumsoftware 日記 010827 - クオータニオンって?
, 3D-CGプログラマーのための実践クォータニオン入門(工学社, 金谷一朗著)
「Euler Angle(オイラー角)」というのはは回転を表現するのに X軸(Roll),Y軸(Pitch),Z 軸(Yaw) それぞれ どの程度回転するかを指定する。
しかし複雑な回転を行う場合に、きりもみ状態が起きたり、回転軸が迷走して意図しない回転になってしまうという欠点がある。まるで、あばれ馬に乗っかっている感じがする。
「Quaternion(クオータニオン)」は回転を表現するのに、ベクトルを用いて任意の回転軸 を中心に、始点 (a)の姿勢から 終点(b)の姿勢へ、何度回転させるかを4元数で指定する。なお、回転軸のベクトルは、始点 (a)と終点(b)の ベクトルの外積にあたり、(a)と(b)を含む回転面に垂直となる。クオータニオンにはオイラー角にみられる欠点はなく複雑な回転を自由自在に制御することができる。またクオータニオン+線形球面補完 によって球面の2点を通る最短距離をなぞって回転させたり。ひねり回転のような回転が合成したのもできる。
Allegro についてる デモプログラム exquat は 「Euler Angle」 と、「Quaternion」 による3次元空間上の回転をわかりやすく比較するという内容。
※OpenGLのglrotate関数は、 X軸(Roll),Y軸(Pitch),Z 軸(Yaw)の角度をパラメータとして持つ(Euler Angle)ていることに注意する。
Allegroの クォ−タニオンオブジェクト
typedef struct QUAT
float w, x, y, z;
クオータニオン(Quaternion,四元数)回転
void allegro_gl_apply_quat ( QUAT *q )
glRotatef() 関数で設定された 三次元の回転を適用する?
OpenGLにはクオータニオン関係の関数が用意されていないので、
Allegro のクオータニオン関数を使うことになる。
パラメータ:
q 適用したい クオータニオンオブジェクトへのアドレス。
QUAT q = identity_quat;
get_vector_rotation_quat(&q, itofix(1), 0, itofix(1), ftofix(43.83));
glLoadIdentity();
allegro_gl_apply_quat(&q);
クオータニオン→float 型 変数によるglrotate回転へ変換
void allegro_gl_quat_to_glrotatef (QUAT * q,
float * angle,
float * x,
float * y,
float * z
)
パラメータ:
q 変換したい四元数.
angle 回転角度。 単位は 度。
x 回転ベクトルのx軸 成分。
y 回転ベクトルのy軸 成分。
z 回転ベクトルのz軸 成分。
四元数 を ベクトル/角度 の成分で変換する。glRotate*().と同じパラメータ。
QUAT q = identity_quat;
float x, y, z, angle;
allegro_gl_quat_to_glrotatef(&q, &angle, &x, &y, &z);
glRotatef(angle, x, y, z);
クオータニオン→double 型 変数によるglrotate回転
void allegro_gl_quat_to_glrotated (QUAT * q,
double * angle,
double * x,
double * y,
double * z
)
四元数 を ベクトル/角度 の成分で変換する。glRotate*().と同じパラメータ。
パラメータは allegro_gl_quat_to_glrotatef 関数と同じである。
文字列描画とフォント Text drawing and fonts.
AllegroGLは Allegro の独自形式である AllegroFontフォーマットを、OpenGLで利用できるように変換して表示する。
変換されたフォントは、AllegroGL Font と呼ばれ、BITMAP(ビットマップ), OUTLINE(ベクター),TEXTURED(テクスチャ) 形式の3種類存在する。
AllegroFont,AllegroGL Fontどちらも FONT オブジェクトで管理されるので、間違えないようにしたい。
#define AGL_FONT_TYPE_DONT_CARE -1
フォントがどのようにコンバートされるか気にしなくても良いことを示す
AllegroGL が最適な形式を選んでくれる。
#define AGL_FONT_TYPE_BITMAP 0
フォントをビットマップ形式に変換したいことを示す
ビットマップ形式の場合、3Dパイプ処理をいったん停止するため、処理が遅いかもしれない。
#define AGL_FONT_TYPE_OUTLINE 1
フォントをアウトライン形式に変換したいことを示す。
ベクター形式なので、高速に描画、回転、拡大縮小することができる。非推奨。
#define AGL_FONT_TYPE_TEXTURED 2
フォントをテクスチャ形式に変換したいことを示す。 このテクスチャはすべてフォントと同じくある。
ビデオカードによって、必要なときに自動的にメモリにアップロードされる。
#define AGL_FONT_STYLE_BOLD 1
太字( bold )フォントを作成する。(システムフォントのみ)
非推奨:非テクスチャフォントは、AllegroGL からドロップされる。
#define AGL_FONT_STYLE_BLACK 2
極太(strong bold) フォントを作成する。(システムフォントのみ)
非推奨:非テクスチャフォントは、AllegroGL からドロップされる。
#define AGL_FONT_STYLE_ITALIC 4
斜体 (italicized ) フォントを作成する。(システムフォントのみ)
非推奨:非テクスチャフォントは、AllegroGL からドロップされる。
#define AGL_FONT_STYLE_UNDERLINE 8
アンダーラインのついた フォントを作成する。(システムフォントのみ)
非推奨:非テクスチャフォントは、AllegroGL からドロップされる。
#define AGL_FONT_STYLE_STRIKEOUT 16
打ち消し線( striked out ) がついたフォントを作成する。(システムフォントのみ)
非推奨:非テクスチャフォントは、AllegroGL からドロップされる。
#define AGL_FONT_STYLE_ANTI_ALIASED 32
アンチエイリアス(anti-aliased)がかかったフォントを作成する。(システムフォントのみ)
非推奨:非テクスチャフォントは、AllegroGL からドロップされる。
#define AGL_FONT_POLYGONS 1
フォント生成モード (アウトラインフォントを ポリゴンを使って表示) (システムフォントのみ)
非推奨:非テクスチャフォントは、AllegroGL からドロップされる。
#define AGL_FONT_LINES 2
フォント生成モード ( アウトラインフォントをラインを使って表示) (システムフォントのみ)
非推奨:非テクスチャフォントは、AllegroGL からドロップされる。
Printf 書式風にテキスト表示
int allegro_gl_printf ( FONT *f,
float x,
float y,
float z,
int color,
char * format,
...
)
パラメータ:
f 使用するフォントオブジェクト.
x,y,z 左上隅を起点に指定した位置でテキストを表示する。
color 文字色 ( Allegroの makecol()関数 で指定した色 など)
format 書式 ( 詳細は printf() を見てください。)
ビットマップフォントを使う場合は、一旦 2D の x, y 座標が描画位置になる(z座標は無視される)
フォント描画処理が終われば、3D の各種モードや設定は元に戻る。しかし OpenGL の状態は維持されない。
現在設定されている modelview の 行列 は このコードに適用される。 従って、glLoadIdentity(); を事前に使用したいと思うかもしれない。
一方、テクスチャ形式か ベクター(アウトライン)形式のフォントを使う場合は、modelview の 行列 を使用して テキストを変形することができる。
この機能は、 allegro_gl_load_system_font() あるいは allegro_gl_load_system_font_ex() 関数によって読み込まれるか
allegro_gl_convert_allegro_font()関数によって変換されたAllegroGL形式のフォントしか受け付けない。
この関数で表示する 文字にテクスチャを貼り込むには、AGL_FONT_TYPE_TEXTURED が有効になっているフォントを用いなければならない。
それと、テクスチャ表示を有効にするためには、 glEnable(GL_TEXTURE_2D);関数を使う事を覚えておくとよい。
あなたが期待した文字の大きさで表示されないかもしれない。 ビットマップフォントについては、フォントの一部分を変更することができないためである。
テクスチャフォント、ベクターフォント であれば 柔軟性があり、glScale(); 関数を使って文字の大きさを調節することができる。
もしあなたが 黒いバック以外に文字を表示したいなら、
テキストを描画する前に適切な ブレンドモードの設定をすすめる。
たとえば次のようなコードである。
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
もし Allegro の drawing mode を エミュレートしたいなら、代替コードとして次のように書くことができる。
glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND);
glBlendFunc(GL_DST_COLOR, GL_ZERO); allegro_gl_printf();
glBlendFunc(GL_ONE, GL_ONE); allegro_gl_printf(); // Same as the one above!
glEnable(GL_DEPTH_TEST);
これらのテクニックについては、
NeHe's Tutorial の #20 for details on this technique が参考になる。
最も柔軟にフォントを扱う方法は、 アルファ - テクスチャをベースに、グレースケールフォントを使うことだ。
テクスチャフォントを作成する前に、 テクスチャ形式を GL_ALPHA4 or GL_ALPHA8 にセットする。
そうすれば、ブレンドモードに応じた色をセットすることができる。
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
allegro_gl_printf(my_font, x, y, z, makecol(255, 128, 0), "Hi!")
あなたが agl_printf 関数に渡した 文字色の値は、適切な描画設定がなされていれば テクスチャの色 にあわせて調整される。
(描画前に glEnable(GL_COLOR_MATERIAL); を呼び出している場合など)
返値:
表示された文字の数
AllegroFont→AllegroGL Fontへ変換(非推奨)
FONT* allegro_gl_convert_allegro_font ( FONT *f,
int type,
float scale
)
以下の処理と同じ:
allegro_gl_convert_allegro_font_ex(f, type, scale, format_state);
format_stateは、最後に allegro_gl_set_texture_format()関数によって指定された形式でなければなりません。。
allegro_gl_set_texture_format()がそれ以前に呼ばれれいない場合は、AllegroGLは自動的にテクスチャーフォーマットを決定しようとします。
AllegroFont→AllegroGL Fontへ変換
FONT* allegro_gl_convert_allegro_font_ex ( FONT *f,
int type,
float scale,
GLint format
)
3D表示のために AllegroFont形式のフォント を AllegroGL 形式(AGL format)のフォントに変換する。
パラメータ:
f 変換したいAllegro のフォントオブジェクト
type 変換したいフォント形式
(AGL_FONT_TYPE_DONT_CARE, AGL_FONT_TYPE_BITMAP, AGL_FONT_TYPE_TEXTURED を参照)
scale 文字の大きさ、縮尺
format テクスチャ内部形式を使う場合。
type パラメータには 変換したいフォント形式を指定する。
#define AGL_FONT_TYPE_DONT_CARE -1
フォントがどのようにコンバートされるか気にしなくても良いことを示す
AllegroGL が最適な形式を選んでくれる。
#define AGL_FONT_TYPE_BITMAP 0
フォントをビットマップ形式に変換したいことを示す
ビットマップ形式の場合、3Dパイプ処理をいったん停止するため、処理が遅いかもしれない。
#define AGL_FONT_TYPE_OUTLINE 1
フォントをアウトライン形式に変換したいことを示す。
ベクター形式なので、高速に描画、回転、拡大縮小することができる。
#define AGL_FONT_TYPE_TEXTURED 2
フォントをテクスチャ形式に変換したいことを示す。 このテクスチャはすべてフォントと同じくある。
ビデオカードによって、必要なときに自動的にメモリにアップロードされる。
この関数は、ビデオカードに自動的にアップロードされるテクスチャーマップや表示リストを作成するので、あなたはビットマップまたは テクスチャフォントに変換するだけで済みます。
この関数を使ってAllegroFont 形式のフォントを ベクター形式 (AGL_FONT_TYPE_OUTLINE)に変換することはできません。
また、元のフォントを変更してはいけません。
この関数を呼び出すタイミングは、有効なOpenGLモードでset_gfx_mode() 関数呼び出しに成功した後に行うとよいでしょう。
もし、あなたがプログラムを終了する場合は、allegro_gl_destroy_font() 関数を通して フォントを開放しなければなりません。
AGL_FONT_TYPE_TEXTURED フォント のために、フォントのグリフは OpenGL 座標に配置される必要がある。
float scale パラメータ の単位は 1.0 OpenGLである。 なお、AllegroGL 0.0.24 以前でallegro_gl_convert_font(); 関数を動作にさせるために、
あなたは float scale に16.0 以上の値を指定する必要があります。
Alternativaly, you can make all your fonts be 1.0 units high by using:
allegro_gl_convert_allegro_font(f, #AGL_TYPE_TEXTURED, 1.0/font_height(f));
もしあなたが、 1単位/1ピクセル の縮尺で 正射投影法 に基づいてフォントを使おうと考えているならば、 float scale パラメータに 1.0 を渡すべきである。
ただし、AGL_FONT_TYPE_BITMAP のフォントを使う場合、 float scale パラメータは意味をなさないため。上記のような変換を行おうとしても無視されます。
GLint format について
この GLint format パラメータ は AGL_FONT_TYPE_TEXTURED のフォントを使う場合に OpenGLがどの内部テクスチャ形式を使えばよいかをが指定する。
このことは、glTexImage2D(); の internalformatパラメータと同じく、AllegroGL のためにテクスチャ形式を選択するために、-1を指定するとよいかもしれません。
返値:
NULL が返った場合は、エラーが発生した事を示す
AllegroGL フォントの破棄
void allegro_gl_destroy_font ( FONT *f );
ディスプレイリスト(行列, 配列,描画命令のデータを扱う記憶)や、テクスチャオブジェクトに使われるメモリを開放する。
AllegroFont と混同すると、エラーのもとなので気をつけよう。
パラメータ:
f 破棄したい AllegroGLフォントのオブジェクトを指定する。
テクスチャIDをリスト
size_t allegro_gl_list_font_textures ( FONT *f ,
GLuint * ids,
size_t max_num_id
)
フォントのすべての テクスチャIDをリストする。 FONT *f には AllegroGL Font を指定しなければならない。
もし ID が NULLでなければ、フォントに使われるすべてのテクスチャの ID番号が ID に対応する GLuint 配列に書かれる。
この配列のサイズは、max_num_idパラメータによって指定される。この関数は決して、配列の最大サイズ max_num_id をオーバーして書き込みすることはありません。
もし、 f が NULLなら、 この関数は 0 を返す。この時、 ID 配列には変更は加えられません。
fがNULLであるならば、ゼロは返されます、そして、ID配列は決して触れられません。
もしフォントが全くテクスチャを含んでいない時(ビットマップ あるいは アウトラインフォントの場合)も 0 を返す。
この関数の使用例:
int num_ids = allegro_gl_list_font_textures(font, NULL, 0);
GLuint *id = malloc(sizeof(GLuint) * num_ids);
if (!id) { //handle error }
allegro_gl_list_font_textures(font, id, num_ids);
for (i = 0; i < num_ids; i++) { glBindTexture(GL_TEXTURE_2D, id[i]); // Use this texture }
free(id);
GLint id[10]; // Reserve a safe number GLint num_ids = allegro_gl_list_font_textures(font, id, 10);
廃止されたAPI
void allegro_gl_set_font_generation_mode ( int mode );
Note: This function is deprecated and will be removed in a future version.
Deprecated:
この関数は、将来のバージョンでは削除されるので、使ってはいけない。
OpenGL 拡張機能 OpenGL Extensions
AllegroGLで利用可能な OpenGL拡張機能の一覧は、AllegroGLを解凍したディレクトリ内の extensions.txt に書かれています。
OpenGL拡張機能を使うと、テクスチャを重ね張りしたりすることができます。AllegroGL 0.4.0ではOpenGL2.0に対応しているそうです。
Extension Registry
OpenGL拡張機能 ハンドラ補助機能を提供する
#define AGL_DEFINE_PROC_TYPE
ポインタの機能を定める。このマクロは ほとんど typedef と同じである。
一部のプラットホーム固有の機能を見えなくすることで、コードを移植可能にするため、このような補助機能が提供されている。
OpenGL拡張機能の検出
int allegro_gl_is_extension_supported ( AL_CONST char *extension )
この関数は、OpenGL 拡張機能が利用できるかどうか定める補助機能を提供する。
例:
int packedpixels = allegro_gl_is_extension_supported("GL_EXT_packed_pixels");
もし packedpixels の値が TRUE ならば、この packed pixels拡張機能が問題なく使えることを示す。
パラメータ:
extension 必要とする拡張機能の名前
返値:
TRUE 拡張機能が 利用可能である。
FALSE 拡張機能は利用できない。
OpenGL拡張機能 の提供
void* allegro_gl_get_proc_address ( AL_CONST char *name )
OpenGL シンボル のアドレスを取得するための補助機能を提供する。
例:どのように ARB's Multitexture格納機能を提供する glMultiTexCoord3fARB関数を得るか。
// define the type of the function
AGL_DEFINE_PROC_TYPE(void, MULTI_TEX_FUNC,
(GLenum, GLfloat, GLfloat, GLfloat));
// declare the function pointer
MULTI_TEX_FUNC glMultiTexCoord3fARB;
// get the address of the function
glMultiTexCoord3fARB = (MULTI_TEX_FUNC) allegro_gl_get_proc_address(
もし、glMultiTexCoord3fARB が NULL以外の値をとれば、 あたかもそれが OpenGL のコア ライブラリにあるようにそれを使う事ができる。
補足事項:あなたが、他のプラットホームに移植したいと望んでいるなら、AGL_DEFINE_PROC_TYPEマクロの使用が必須になる。
パラメータ:
name リンクしたいと望む、シンボルの名前
返値:
TRUE シンボルへのポインタが 利用可能である。
FALSE シンボルへのポインタは利用できない。.
OpenGL拡張機能のリスト
AGL_EXTENSION_LIST_GL allegro_gl_extensions_GL
AllegroGL でサポートされる OpenGL拡張機能のリスト。 この構造の各エントリは、1 ならば その ホストシステムOS に対応している。0 ならば 非対応であることを示す。
拡張機能の名前は基本となる名前のみ使える。 たとえば、GL_ARB_multitexture を参照すべきならばこのように書ける。
allegro_gl_extensions_GL.ARB_multitexture
WGL 拡張機能 のリスト
AGL_EXT* agl_extension_table = NULL
AllegroGL でサポートされるWGL 拡張機能 のリスト
(WGL は Windows のみ使用可能なグラフィックライブラリです。)
Allegroグラフィック関数互換 Allegro Graphics Driver
OpnGL スクリーンに描画する関数。Allegroのグラフィック描画関数の代替。
通常 OpenGL では、三角形や直線、点といった単純な図形を組み合わせて、複雑な直線やポリゴンを描画する
ので、カラーを設定したり、頂点指定を何行も書く必要がある 例えばglVertex2i(x, y); が10行ずらりと並ぶと、後でソースを見た時には何が
どうなっているのか分からなくなるかもしれない。
OpenGLで記述する負担を軽減するため、これらの関数はAllegroの図形描画風関数を装っている
が、内部では OpenGLの命令を使っている。他にはビットマップ画像を表示するのに、allegro_gl_screen_blit_to_self 関数は
内部で、ビットマップ → テクスチャ → ビデオメモリへ転送 という処理を行っているようだ。
定義
define BITMAP_BLIT_CLIP(source, dest, source_x, source_y, dest_x, dest_y, width, height)
描画関連関数
int __allegro_gl_make_power_of_2 (int x)
void split_color (int color, GLubyte *r, GLubyte *g, GLubyte *b, GLubyte *a, int color_depth)
void allegro_gl_created_sub_bitmap (BITMAP *bmp, BITMAP *parent)
プリミティブ図形
int allegro_gl_screen_getpixel (struct BITMAP *bmp, int x, int y)
void allegro_gl_screen_putpixel (struct BITMAP *bmp, int x, int y, int color)
void allegro_gl_screen_vline (struct BITMAP *bmp, int x, int y1, int y2, int color)
void allegro_gl_screen_hline (struct BITMAP *bmp, int x1, int y, int x2, int color)
void allegro_gl_screen_line (struct BITMAP *bmp, int x1, int y1, int x2, int y2, int color)
void allegro_gl_screen_rectfill (struct BITMAP *bmp, int x1, int y1, int x2, int y2, int color)
int allegro_gl_screen_triangle (struct BITMAP *bmp, int x1, int y1, int x2, int y2, int x3, int y3, int color)
ビットマップデータ転送
void allegro_gl_screen_blit_from_memory (
struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height)
void allegro_gl_screen_blit_to_memory (
struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height)
void allegro_gl_screen_blit_to_self (
struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height)
void upload_and_display_texture (
struct BITMAP *source, int source_x, int source_y, int dest_x, int dest_y, int width, int height, int flip_dir, GLint format, GLint type)
void do_screen_masked_blit_standard (
GLint format, GLint type, struct BITMAP *temp, int source_x, int source_y, int dest_x, int dest_y, int width, int height, int flip_dir, int blit_type)
void screen_masked_blit_standard (
struct BITMAP *source, int source_x, int source_y, int dest_x, int dest_y, int width, int height, int flip_dir, int blit_type)
void __allegro_gl_init_nv_register_combiners (BITMAP *bmp)
void screen_masked_blit_nv_register (
struct BITMAP *source, int source_x, int source_y, int dest_x, int dest_y, int width, int height, int flip_dir, int blit_type)
void __allegro_gl_init_combine_textures (BITMAP *bmp)
void screen_masked_blit_combine_tex (
struct BITMAP *source, int source_x, int source_y, int dest_x, int dest_y, int width, int height, int flip_dir, int blit_type)
void do_masked_blit_screen (
struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height, int flip_dir, int blit_type)
スプライト画像
BITMAP * __allegro_gl_convert_rle_sprite (AL_CONST struct RLE_SPRITE *sprite)
void allegro_gl_screen_draw_rle_sprite (struct BITMAP *bmp, AL_CONST struct RLE_SPRITE *sprite, int x, int y)
void allegro_gl_screen_masked_blit (
struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height)
void allegro_gl_screen_draw_sprite (struct BITMAP *bmp, struct BITMAP *sprite, int x, int y)
void allegro_gl_screen_draw_sprite_v_flip (struct BITMAP *bmp, struct BITMAP *sprite, int x, int y)
void allegro_gl_screen_draw_sprite_h_flip (struct BITMAP *bmp, struct BITMAP *sprite, int x, int y)
void allegro_gl_screen_draw_sprite_vh_flip (struct BITMAP *bmp, struct BITMAP *sprite, int x, int y)
void allegro_gl_screen_draw_sprite_end (void)
void allegro_gl_screen_pivot_scaled_sprite_flip (
struct BITMAP *bmp, struct BITMAP *sprite, fixed x, fixed y, fixed cx, fixed cy, fixed angle, fixed scale, int v_flip)
補助
void allegro_gl_screen_draw_glyph (struct BITMAP *bmp, AL_CONST struct FONT_GLYPH *glyph, int x, int y, int color)
void allegro_gl_screen_draw_color_glyph (struct BITMAP *bmp, struct BITMAP *sprite, int x, int y, int color, int bg)
void allegro_gl_screen_draw_character (struct BITMAP *bmp, struct BITMAP *sprite, int x, int y, int color)
void allegro_gl_screen_draw_256_sprite (struct BITMAP *bmp, struct BITMAP *sprite, int x, int y)
void allegro_gl_screen_clear_to_color (struct BITMAP *bmp, int color)
void __allegro_gl__glvtable_update_vtable (GFX_VTABLE **vtable)
void allegro_gl_memory_blit_between_formats (
struct BITMAP *src, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height)
void dummy_unwrite_bank (void)
行列とvtable
double allegro_gl_projection_matrix [16]
double allegro_gl_modelview_matrix [16]
GFX_VTABLE allegro_gl_screen_vtable
スクリーンのロックと開放
void allegro_gl_screen_acquire ( struct BITMAP * bmp ) [static]
void allegro_gl_screen_release ( struct BITMAP * bmp ) [static]
void allegro_gl_video_acquire ( struct BITMAP * bmp ) [static]
void allegro_gl_video_release ( struct BITMAP * bmp ) [static]
OpenGLコンテキストはロックされる必要がないので、これらの関数は何もしません。
あなたは、これらの機能をプログラムから呼ぶ必要はない。
Allegroスクリーン
BITMAP*allegro_gl_screen
Direct-mode GL用 の screen ビットマップオブジェクト
もしあなたがAllegro のグラフィック関数を使って、このビットマップオブジェクトになにか描けば
描画にOpenGL を使って、スクリーンまたは背景バッファに内容が表示されます。
※allegro_gl_screen_mode関数および、画面更新モード はAllegroGL 0.4.0 では廃止されました。
画面更新モード Screen update modes
allegro_gl_screen_modeおよび関連する定義は、0.4.0では廃止されました。
( その他
AllegroGL スクリーン :allegro_gl_screen_mode(AGL_MODE_DIRECT):用意されている。特殊な使い方をする場合設定する。 )
これらはAllegroGLに特化した画面更新モードなので、本来のOpenGLプログラムではこれらを使う必要はないでしょう。
OpenGL と Allegroグラフィックの2画面を使えることもできるらしい? 残念ながら、デフォルト以外はどれもあまりよく機能しません。
Allegro の古い グラフィック描画関数は、これらのモードでしか使えない?
デフォルト
#define AGL_MODE_DIRECT 0
デフォルトのモード。OpenGL 処理を最も高速に行う。
このモードでは、BITMAP*allegro_gl_screen オブジェクトに、 allegro_gl_screen が ポイントされる。
呼ばれた Allegro グラフィックは、特殊な(非互換な)変数を使った 似たようなOpenGLコールに翻訳される
注意事項:もしあなたが 未実装の vtable エントリを使った関数を呼び出した場合、プログラムは暴走する。
2画面モード
#define AGL_MODE_DUPLEX 1
BITMAP*allegro_gl_screen に作用しているAllegro のグラフィックス呼び出しはメモリバッファで実行される。
そして、呼び出されたあとは 背景が表示される前に OpenGL framebuffer の内容が描画される。
表示は遅いです。
不透明モード
#define AGL_MODE_OPAQUE 2
OpenGL framebufferを満たさないため図形は不透明に描画される、どんなOpenGL描画による図形もはっきり表示される。
表示は遅いです。
Masked モード
#define AGL_MODE_MASKED 3
Allegroグラフィックスで描画された 透明なピクセルが透過するので、下の OpenGL フレームバッファを覆いません。
しhかしこの機能がうまく働くかどうかは疑わしい。
半二重 不透明 モード
#define AGL_MODE_OPAQUE_RT 4
Opaque realtime mode.
OPAQUE に似た 半二重モード。未実装。
半二重 Masked モード
#define AGL_MODE_MASKED_RT 5
Masked realtime mode.
Masked モードに似た 半二重モード。未実装。
画面更新モードをセット
int allegro_gl_screen_mode ( int newmode )
パラメータ:
name ここに画面更新モードをセットする。
返値:
0 成功
0以外 失敗
ビデオモードの設定 Frame Buffer Settings
ビデオモードの設定をセットする
void allegro_gl_set ( int option, int value)
OpenGLにはビデオモードに関する複数のオプションがあり、AllegroGLはその設定が必須かどうか判断する機能をもっています。
設定に迷いそうですが、サンプルコードの例を参考にするとよいかと思います。
オプションをセットするには、allegro_gl_set() 関数を用います。
この関数には2つの指定方法があります、
- オプション int option と、オプションに対する値 int value (整数値)を設定する。
- オプションに対して、優先度を設定する。
ここで、値をセットするだけでは設定が有効にならないという事を注意して下さい。
実際にオプションが有効になるかどうかは、AllegroGL に対する3段階の優先度に基づいて決定されます。
設定に優先度を与えるには、AGL_REQUIRE、AGL_SUGGEST または AGL_DONTCARE の3つのフラグのいずれかを 含めてください。
オプション設定の優先度に関するオプション
#define AGL_DONTCARE 0 Ignore these settings.
#define AGL_SUGGEST -1 Prefer the assigned values for these settings.
#define AGL_REQUIRE -2 Reject other values for these settings.
AGL_DONTCARE: 設定無視。この設定は無視される。.
AGL_SUGGEST:サジェスト設定。この設定は、選択されるが、必須というわけではない。
AGL_REQUIRE: 必須設定。この設定は 最優先に適用され、 欠くことができない。
通常、オプションの設定は次のように記述される。
例:
allegro_gl_set(AGL_COLOR_DEPTH, 16); //色深度(AGL_COLOR_DEPTH) を16に設定
allegro_gl_set(AGL_REQUIRE, AGL_COLOR_DEPTH); //色深度(AGL_COLOR_DEPTH)を必須設定(AGL_REQUIRE)で設定。
複数の設定に対し、まとめて優先度を与える場合は、設定を OR集合「 | 」で区切る
例:
//オプション AGL_COLOR_DEPTHと AGL_DOUBLEBUFFERに対して、
//優先度 を必須設定(AGL_REQUIRE)としてセットします。
allegro_gl_set(AGL_REQUIRE, AGL_COLOR_DEPTH | AGL_DOUBLEBUFFER);
パラメータに何も設定しない、デフォルトでは、 allegro_gl_set (AGL_COLOR_DEPTH, 16)が指定されます。
ビデオモードの設定を得る
void allegro_gl_get ( int option )
int option には、allegro_gl_setのオプションを渡す。
返値:
選択されたオプションのパラメータを返す。
もし-1が返ってきたらそのオプションは無効になっている。
ビデオモードの設定をクリア
void allegro_gl_clear_settings ( void )
ビデオモードの設定をクリアする。
コンフィグファイル出入力
コンフィグファイル(.ini )についてはAllegroのマニュアル等に詳細が書かれています。
void allegro_gl_load_settings ()
ini ファイルの [OpenGL] セクションから、OpenGLに関する設定をロードします。
void allegro_gl_save_settings ()
ini ファイルの [OpenGL] セクションに、OpenGLに関する設定をセーブします。
フレームバッファ設定オプション
(allegro_gl_set() 関数でセット可能なオプション)
#define AGL_ALLEGRO_FORMAT
Allegro互換のフレームバッファを使うこの定義は、廃止された、
各色成分とアルファチャンネル成分のフレームバッファを 選択
#define AGL_RED_DEPTH
#define AGL_BLUE_DEPTH
#define AGL_ALPHA_DEPTH
すべてのRGB色成分とアルファチャンネルに対して
#define AGL_COLOR_DEPTH
アキュムレータバッファ(高速バッファ)を各色成分とアルファチャンネルそれぞれ選択する場合
#define AGL_ACC_RED_DEPTH
#define AGL_ACC_GREEN_DEPTH
#define AGL_ACC_BLUE_DEPTH
#define AGL_ACC_ALPHA_DEPTH
Driverは適切なモードを見つけるかもしれませんが、 多くのビデオカードでは対応せず、アキュムレータバッファが高速化されない事に注意してください。
#define AGL_DOUBLEBUFFER
pageの書き換えにドライバ設定に依存したダブルバッファモードを作成しセットします。OpenGL自身はバッファリングモードを選択することはできません。
#define AGL_STEREO
左右別々の映像を表示します。これは 特殊な装置(メガネ)を使用した場合に有効です。表示は特別なハードウェアなしで大いに揺らめくように見えます。ステレオ表示するには 値 を TRUEに指定する。
#define AGL_AUX_BUFFERS
追加補助のバッファを作成します。 これによって複数のレンダリングコンテキストを持つ事が可能です。しかしこの機能はわずかなビデオカードしか対応してません。
#define AGL_Z_DEPTH
奥行きに関する情報 を記憶する Z-バッファ深度を指定。 初期値は16です。
#define AGL_STENCIL_DEPTH ステンシルバッファ(per-pixel testing (like the z-buffer))を有効にします
最新のカードは対応していますが、古いカード(TNT2s、Voodoos、ATI Rage)はサポートしてません。
#define AGL_WINDOW_X
指定されたピクセルに位置にウインドウの配置するよう要求可能にします。 ドライバによっては、この要求に応じないものが有るかもしれません 。
#define AGL_RENDERMETHOD
AllegroGL に、ハードウェアアクセラレーションが対応しているかどうかを調べて欲しいなら設定します。
しかし、OpenGL処理による加速は保証されないため注意して下さい。むしろ、ソフトウェアレンダラーの代わりに、ビデオカード側のドライバを使うことを要求します。もし必要ならビデオカードドライバは、ソフトウェアレンダリングモードに自由に戻すこともできます。
なお、この設定はXで効果がありません。
#define AGL_FULLSCREEN
フルスクリーンモードを選択する。 プラットフォームによっては非対応かもしれない。
#define AGL_WINDOWED
ウインドウモードを選択する。 プラットフォームによっては非対応かもしれない。
#define AGL_VIDEO_MEMORY_POLICY
ビデオメモリ使用量に関してAllegroGLの方針を定義してください。デフォルト値はAGL_KEEPになっています。
値:
AGL_RELEASE : 内部テクスチャデータは、ビデオメモリの解放に従って解放されます。
AGL_KEEP : 内部テクスチャデータはビデオメモリに保存されたままにします。
AGL_KEEPは、一般的にallegro_gl_set_allegro_mode() や allegro_gl_unset_allegro_mode()が呼ばれる時にグラフィックス処理を加速します。
ビデオメモリが少ないシステム環境では、AGL_RELEASEを使用するべきです。その他の場合は、内部テクスチャを生成を許可されるので、AGL_KEEPを使うべきです。
#define AGL_SAMPLE_BUFFERS
複数のGL_ARB_multisampleとよばれる 、GLプリミティブ(線、点、ポリゴン、ビットマップ)にアンチエイリアスを施すOpenGL ICD機能拡張のパラメータを定義します。
multisample をサポートするAllegroGL モードを得るために、それぞれ AGL_SAMPLE_BUFFERS を 1 に、AGL_SAMPLES には必要なサンプル数を指定します。
しかし、この機能は複数の拡張機能(GL_ARB_multisample 、 GLX_ARB_multisample または WGL_ARB_multisample)に依存するため、AllegroGLがグラフィックスが multisample をサポートするかどうかを判断することは保証されない事に注意して下さい。 GeForce 2 のような古いビデオカードではこれらをサポートしません。
従って、多くのプラットフォームとハードウェアでOpenGLプログラムを実行したいと望むなら、このオプションを指定するべきではありません。
非推奨API
Deprecated List
AllegdGL/docs/deprecated.html にリストされています。
様々な理由で、あまり使ってほしくないAPIのこと。将来的には廃止となったり、削除される予定のAPIです。
スクリーンアップデートに関する allegro_gl_screen_mode関数および定義は、
AllegroGL 0.4.0 のソースから既に削除されました。
AGL_MODE_DIRECT
AGL_MODE_OPAQUE
AGL_MODE_DUPLEX
各種設定
0.4.0では、アルファチャンネルを、有効に切り替えなくても良くなったのかもしれない。
int allegro_gl_use_alpha_channel() は非推奨APIです。
int allegro_gl_flip_texture() は非推奨APIです。
int allegro_gl_use_mipmapping () は非推奨APIです。
テクスチャ生成
allegro_gl_make_texture() は非推奨APIです。代わりに allegro_gl_make_texture_ex() を使います。
allegro_gl_check_texture () は非推奨APIです。代わりに allegro_gl_check_texture_ex () を使います。
allegro_gl_set_texture_format() は非推奨APIです。 allegro_gl_make_texture_ex() から自動的に呼ばれ、使わない。
allegro_gl_get_texture_format ()
allegro_gl_set_font_generation_mode これは今後のバージョンで削除される予定。
AGL_ALLEGRO_FORMAT この定義も無効になっている。
フォント関連は、読み込んだAllegrofont をビットマップテクスチャとして変換する手順を踏む
allegro_gl_convert_allegro_font() は非推奨なので、代わりに allegro_gl_convert_allegro_font_ex を使います。
残念ながらフォントのアウトライン化は非推奨とされています。
#define AGL_FONT_TYPE_OUTLINE 1
アウトラインフォント化の使用 は非推奨。 それに伴い各定数
AGL_FONT_STYLE_BOLD
AGL_FONT_STYLE_BLACK
AGL_FONT_STYLE_ITALIC
AGL_FONT_STYLE_UNDERLINE
AGL_FONT_STYLE_STRIKEOUT
AGL_FONT_STYLE_ANTI_ALIASED
AGL_FONT_POLYGONS
AGL_FONT_LINES
も非推奨になっています。
allegro_gl_load_system_font
allegro_gl_load_system_font_ex
ドキュメントの allegro_gl_load_system_font_exの項目にアウトラインフォントの実装関連の説明が載っている。Allegro font は、 vector font に変換できないため、システムフォントを直接読んでアウトラインフォントとして変換するためのAPIが作られたのかもしれない。
環境によってはwidth、height指定が効かないそうです。これらは今後のバージョンでで削除される予定らしい。
Last modified 2006.04.03 AllegroGL 0.4.0RC3リリースされたので、AllegroGL0.2.4 インストールメモをタブ化。
Tsukubado