音ゲーの出来ない雑魚のブログ

LWJGLとかのことをいうブログ

「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
f:id:cakkby:20160327162713p:plain

Eclipseの場合ですが、
ディレクトリ: プロジェクト/src/GL_Basis/assets/img/
f:id:cakkby:20160327162635p:plain

今回のソースコードでは、つぎのサイトの記事を参考にしました。感謝申し上げます。

chocolapod.sakura.ne.jp
stackoverflow.com
[Java] ある整数よりも大きい最小の2のべき乗を計算 | 煩悩の確率論

解説 今回は「OpenGL1.1だけの」ということで、TextureManagerの解説はPOTのところだけにします。

#Test4_LoadTexture.java

24行目 : テクスチャのパスを文字列で指定しています。

97行目 : TextureManagerクラスのテクスチャ生成メソッドを呼び出しています。IDはその場で作成しています。今回は何個も作るわけではないので。

103行目 : "GL_TEXTURE_2D"を使用可能にします。

void glEnable(int target)

GL_TEXTURE_2D
2次元(x,y)のテクスチャのことです

このGL_TEXTURE_2Dは、テクスチャの種類の一つで、次のようなものが用意されています。(先頭の"GL_"を抜いてあります)


定数名説明
GL_TEXTURE_1D1次元のテクスチャです
GL_TEXTURE_2D2次元のテクスチャです
GL_TEXTURE_3D3次元のテクスチャです
GL_TEXTURE_CUBE_MAPキューブマップのテクスチャです
GL_TEXTURE_2D_MULTISAMPLEマルチサンプリング(アンチエイリアスをかける)されるテクスチャです
  
GL_TEXTURE_RECTANGLE短形(2次元?)のテクスチャです
GL_TEXTURE_BUFFERテクスチャバッファーオブジェクトです

3次元とか、マルチサンプリングとか、テクスチャバッファーオブジェクトとか、まだわからないです。調べて記事にしたいです。

最後の2つ以外には、後ろに"_ARRAY"をつけることが出来て、それらの配列であることを示せます。


108行目~ : glTexCoord2f()でテクスチャのUV座標を指定して、次のglVertex3f()の頂点に貼り付けています。いわゆる、テクスチャマッピングです。

void glTexCoord2f(float x,float y)

UV座標は、テクスチャ画像の座標のことですが、3Dの座標系と違っていて、左上が原点(0,0)になります。

119行目 : GL_TEXTURE_2Dを使用不可にします。一度可能にしたものは、しっかり使用不可にしておいたほうがいいですね。

void glDisable(int target)

#TextureManager.java

(フィールドは省略)
定数
29行目 : 画像のカラーモデルです。PNGとかのイメージのモデルです。

32行目 : 画像読み込みのパターンです。None-POTにします。
33行目 : POTで、速さよりクオリティー優先です。
34行目 : POTで、クオリティーより速さ優先です。

ここからメソッド系^∨^

36行目 : 指定されたPathとIDとパターンでテクスチャを作成し、IDにテクスチャを合わせるメソッドです。適当にstaticにしちゃいました。

37行目 : テクスチャを渡されたIDで生成します。

int glGenTextures()

38行目 : テクスチャ(ID)をGL_TEXTURE_2Dにバインドしています。

void glBindTexture(int target,int texture)

つまり、このテクスチャをGL_TEXTURE_2Dとして処理するようにします。





ちょっと微妙ですけど、残りは次回にします。