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

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

#OpenGL 0から見る行列変換の仕組み

「0から」と言っていますが、「三角関数(三角比)」と「ベクトル」についてなんとなーく知っていないと、難しいと思います。

OpenGLで物体に変化(例えば、回転、変形など)を起こすには、行列というものを使わなければいけません。行列は、物体の変化だけではなく、カメラや視界の変更にも使われているので、CGに必須の技術です。(高校数学では、数Cの内容です)

まず行列とは、数字を""と""に沿って四角に並べたものです。は行列の「横」の並び、は行列の「縦」の並びです。行列の一つ一つの数字を成分と言います。

続きを読む

「moreover lwjgl」 10 現代的なテクスチャ表示(2) ~stbを使って~

「現代的な」テクスチャ表示の続きです。

シェーダの説明を主にします。

どうでもいいですが、STBという名前は、作者 Sean T. Barrett 氏の名前の頭文字から取ったそうです。どうでもよかったですね。

ということで、ソースコード(シェーダのみ)

続きを読む

「moreover lwjgl」 9 現代的なテクスチャ表示(1) ~stbを使って~

「現代的(Modern)」というのは「OpenGL3.2以降の機能を使った」ということです。それは、OpenGL3.2以降からは固定機能を廃止して、プログラマーが自分でシェーダなどを用意しなければいけなくなったからです。*1

ということで、現代的なやり方?に必要なのが…

  • VEO(頂点エレメントオブジェクト)… 頂点を、指標を使って描画する方法。VAOをより効率よくした感じ
  • シェーダ … この前の通り

  • サンプラーオブジェクトとテクスチャオブジェクト … テクスチャを、テクスチャ画像自体と、それを描画するときの処理に分ける

こんな感じでしょうか?

また今回、LWJGL3に乗り込んできた、STB(シンプルなファイル(画像など)読み込みライブラリー)を使って画像を読み込むことにします。自作のTextureManagerクラスよりも数百倍簡単に読み込めます。

*1:コアプロファイルの場合です。互換性ブロファイルだったらOpenGLのどのバージョンでも使えます。

続きを読む

「moreover lejgl」8 プログラマブルシェーダ

現代的な方法でテクスチャを表示するには、「プログラマブルシェーダ」という物が必要になるので、それをやってからにします。

元々OpenGLはプログラムの内部に「シェーダ(陰影処理、グラデーションとか)」という物があって、それらはOpenGLが決めた「固定機能(マテリアル、ライトとか)」を組み合わせたりして、物を描画するようにしていました。

しかし、3DCGでもっと複雑なことをしたいというユーザーのニーズに応えるために、KHRONOS Group固定機能を廃止する方針にして、「プログラマブルシェーダ(プログラミングできるシェーダ)」を推奨するようになりました。

そうして、OpenGL3.2からは完全に固定機能を廃止しておりプログラマブルシェーダ以外に描画する方法がなくなりました。

続きを読む

「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表示を縦スクロールもできるようにしたいです。

続きを読む