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

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

「moreover lwjgl」 2  基本Windowの表示(2)

Window表示の解説の続きです。

もう一度ソースコードを貼ります。



解説の続き(GLFW系はOpenGL系はオレンジ

37行目 : WindowのHintをデフォルトにします。Hintとは、Windowの特性のことです。

void glfwDefaultWindowHints()

38,39行目 : Hintを設定します。

void glfwWindowHint(int hint,int value)

Hintは色々あります。使いそうなものを出しておきます。(注:簡略にするために大文字の英字は最初の"GLFW_"を抜いています)


Hint名説明設定できる値デフォルト値
RESIZABLEサイズが変更可能かTRUE/FALSETRUE
VISIBLE可視状態かTRUE/FALSETRUE
DECORATEDWindowに装飾をつけるか*1TRUE/FALSETRUE
FLOATINGフローティングウィンドウかTRUE/FALSETRUE
SAMPLESマルチサンプリングのサンプル数INT0
REFRESH_RATE(フルスクリーンの時)画面の更新度INTDONT_CARE
CONTEXT_VERSION_MAJOROpenGLのバージョンの主要な方(2.~や3.~)INT1
CONTEXT_VERSION_MINOROpenGLのバージョンの細かい方(~.1や~.3)INT0
CLIENT_APIGLFWが作成するAPIOPENGL_API/OPENGL_ES_APIOPENGL_API
OPENGL_PROFILEOpenGLのコンテキストの種類OPENGL_CORE_PROFILE/OPENGL_COMPAT_PROFILE/OPENGL_ANY_PROFILEOPENGL_ANY_PROFILE
OPENGL_DEBUG_CONTEXTOpenGLデバッグ用かどうかTRUE/FALSEFALSE/td>
(更新:2016/06/27)

41行目 : Windowを生成します。

long glfwCreateWindow( . . . )

Windowを生成する前にかならずHintを指定しましょう。
引数 : (横の長さ , 縦の長さ , タイトル , モニター , シェア)
モニター(monitor)は、ウィンドウモードの時はMemoryUtil.NULL(=0)に。フルスクリーンならモニターを指定します
シェア(share)は、コンテキスト(制御情報)やリソースを共有するウィンドウの指定です。NULLなら共有しません

43~45行目 : Windowが生成されなければ、エラーを出します。ウインドウのハンドルの値がMemoryUtil.NULLであれば生成されていないことになります。

47,48行目 : Windowの位置をモニターの中央にします。51行目では、Video Mode(画面サイズのこと)をPrimary Monitar(初期モニター)から取得しています。そして、その縦と横からWindowの縦と横を引いた値をモニターの位置としています。
これは、JavaのSwingの"JFrame"でいうと

void setLocationRelativeTo(null)

メソッドと同じような結果になります。

51行目 : WindowをOpenGLの描画の対象にします。

void glfwMakeContextCurrent(long window)

52行目 : ダブルバッファリングでの、バッファーの入れ替えのタイミング(V-sync)を指定します。ダブルバッファリングは、簡単に言うと、描画を表示する前に終わらせるバッファー(緩衝物)を用意して、そのバッファーの処理が終わったら、描画するところに貼り付けていくというものです。これによって、病が途中のものが見えたり、ちらついたりしなくなります。基本的に値は1にしましょう。

53行目 : 初期処理の最後に、WindowをShow(可視化)します。

void glfwShowWindow(long window)


56行目 : render(描画)メソッドを開始します。


57行目 : Capabilitiesを作成します。Capablititiesとは、Windowなどが必要とするOpenGLの機能を指定するものです。これがないと、サポートされていないOpenGLの機能は実行されなくなります。

59行目 : Windowの背景を指定した色(r,g,b,a)で塗りつぶすように指定します。

void glClearColor(float r,float g,falot b,float a)

61行目 : while文の中は、Windowが閉じられていない時を指定しています。

boolean glfwWindowShouldClose(long window)

67行目 : 指定したバッファーを塗りつぶします。GL_COLOR_BUFFER_BITを指定したら、glClearColorで指定した色合いで塗りつぶします。

void glClear(int mask)

GL_COLOR_BUFFER_BIT
RGBのバッファーのビットを指します。OpenGLではR/G/B(カラー)のそれぞれ、そして深さをバッファーとしています。描画するときはそれぞれを新しい物にすり替えないと、前のデータを上書きする形となって汚くなります。

66行目 : Windowのカラーバッファーを描画したものに移し替えます。これをしないと、描画が更新されません。

void glfwSwapBuffers(long window)

67行目 : イベントが行われるたら、それを記録します。

void glfwPollEvents()

プログラムを止めるわけではないので、常に動くアニメーションなどに使います。それ以外では、glfwWaitEventsを使います。

void glfwWaitEvents()




以上で説明は終わりです。OpenGL系は使ったことがある人ならすぐ分かるはずですが…

P.S. > (もう一回いいますが、)質問はあまり答えられません…すみません(;_;…

*1:装飾とは、例えば、Windowの枠や、CloseボタンのようなWindowに付属したもののことです。