「moreover lwjgl」 6 (古風な)Texture貼り付け(1)
OpenGL1.1(古すぎ!)でも動作するように、Texture(画像)を表示させます。
OpenGL1.1では、テクスチャの長さ(縦と横で違っても良い)は2のべき乗(Power of Two,POT)でなければいけないです。つまり、 16×8 や 256×512 px といったようにしなければいけません。
実際のテクスチャは2のべき乗とは限らないので、一番近い大きさの2のべき乗の大きさを求めて、その大きさに画像を拡大/縮小します。ここが一番苦戦します。(苦戦の理由は後で)
ということで、ソースコードから。今回は、TextureManager.java と Test4_LoadTexture.java の2つになります。2つということは、それだけ長くなっちゃうんですね。Gist表示を縦スクロールもできるようにしたいです。
また、次の画像を次のディレクトリに入れてください。
Texture1.png
Eclipseの場合ですが、
ディレクトリ: プロジェクト/src/GL_Basis/assets/img/
今回のソースコードでは、つぎのサイトの記事を参考にしました。感謝申し上げます。
chocolapod.sakura.ne.jp
stackoverflow.com
[Java] ある整数よりも大きい最小の2のべき乗を計算 | 煩悩の確率論
解説 今回は「OpenGL1.1だけの」ということで、TextureManagerの解説はPOTのところだけにします。
#Test4_LoadTexture.java
24行目 : テクスチャのパスを文字列で指定しています。
97行目 : TextureManagerクラスのテクスチャ生成メソッドを呼び出しています。IDはその場で作成しています。今回は何個も作るわけではないので。
103行目 : "GL_TEXTURE_2D"を使用可能にします。
このGL_TEXTURE_2Dは、テクスチャの種類の一つで、次のようなものが用意されています。(先頭の"GL_"を抜いてあります)
定数名 | 説明 |
---|---|
GL_TEXTURE_1D | 1次元のテクスチャです |
GL_TEXTURE_2D | 2次元のテクスチャです |
GL_TEXTURE_3D | 3次元のテクスチャです |
GL_TEXTURE_CUBE_MAP | キューブマップのテクスチャです |
GL_TEXTURE_2D_MULTISAMPLE | マルチサンプリング(アンチエイリアスをかける)されるテクスチャです |
GL_TEXTURE_RECTANGLE | 短形(2次元?)のテクスチャです |
GL_TEXTURE_BUFFER | テクスチャバッファーオブジェクトです |
3次元とか、マルチサンプリングとか、テクスチャバッファーオブジェクトとか、まだわからないです。調べて記事にしたいです。
最後の2つ以外には、後ろに"_ARRAY"をつけることが出来て、それらの配列であることを示せます。
108行目~ : glTexCoord2f()でテクスチャのUV座標を指定して、次のglVertex3f()の頂点に貼り付けています。いわゆる、テクスチャマッピングです。
UV座標は、テクスチャ画像の座標のことですが、3Dの座標系と違っていて、左上が原点(0,0)になります。
119行目 : GL_TEXTURE_2Dを使用不可にします。一度可能にしたものは、しっかり使用不可にしておいたほうがいいですね。
#TextureManager.java
(フィールドは省略)
定数
29行目 : 画像のカラーモデルです。PNGとかのイメージのモデルです。
32行目 : 画像読み込みのパターンです。None-POTにします。
33行目 : POTで、速さよりクオリティー優先です。
34行目 : POTで、クオリティーより速さ優先です。
ここからメソッド系^∨^
36行目 : 指定されたPathとIDとパターンでテクスチャを作成し、IDにテクスチャを合わせるメソッドです。適当にstaticにしちゃいました。
37行目 : テクスチャを渡されたIDで生成します。
38行目 : テクスチャ(ID)をGL_TEXTURE_2Dにバインドしています。
つまり、このテクスチャをGL_TEXTURE_2Dとして処理するようにします。
ちょっと微妙ですけど、残りは次回にします。