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

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

「moreover lwjgl」 5 VAOとVBOで表示(2)

この前の続きです。

補足:OpenGL3.0に対応していないと出来ないと言いましたが、ARB Extensionの「GL_ARB_vertex_array_object」に対応していれば、使えます。Extension(拡張機能)については、今度やります。

では、またコードから…





解説

displayメソッドから

121行目 : 指定したIDのVAOにバインドしています。つまり、初期設定で保存したVAOのデータをまた使えるようにします。

122行目 : 現在のVAO内の、指定した番号の頂点属性を使用可能にします

void glEnableVertexAttribArray(int index)

ここでは、「0 : 頂点の座標」を使用可能にします。

124行目 : 現在のVAOを使って、中にあるVBOの頂点(使用可能な属性なども反映して)を描画します。

void glDrawArrays(int mode,int first,int count)

 第1引数 - 描画する際の描画モード。glBegin(int mode)のmodeと同じ。
 第2引数 - VBOないで一番最初に読み取る(描画する)データの番号。0で一番最初からになる。
 第3引数 - 描画する頂点の個数。modeの個数に従わないと、正しく表示されない。

下の図は、glDrawArraysを様々な引数でやった時です。

f:id:cakkby:20160316150912p:plain

このように、ちゃんとした値を入れなければ、表示がおかしくなるのが分かると思います。

126行目 : 描画し終わったので、頂点属性”0(=座標)”を使用不可にします。

void glDisableVertexAttribArray(int index)

127行目 : 現在のVAOを0にします。描画が終わって戻していないと、間違えてVAOの設定などを書き換えるかもしれないので、すぐに頂点属性やVAOは、元に戻すようにしましょう。

描画メソッド終了 ここからfinish(終了時)メソッド

131行目 : 今回はありませんが、描画メソッドの後にまた頂点属性を変えること(シェーダとか)もあり、また、ウィンドウを閉めるときがVAO使用中でもいいように、最後にもう一回頂点属性”0”を使用不可にします。

132行目 : 指定したIDのVBOを頂点配列から外します。

133行目 : 指定したIDのVBOをメモリから消します。

void glDeleteBuffers(int buffer)

134行目 : 現在のVAOをもう一度0にします。理由は、頂点属性の時と同じです。

135行目 : 指定したIDのVAOをメモリから消します。

void glDeleteVertexArrays(int array)




実行結果がこちら

f:id:cakkby:20160319023050j:plain





VAOとVBOは、glVertexに比べれば、圧倒的にコードの量が多いですが、VAOのほうが、様々な事ができ、またOpenGLの更新にともなってglVertex系は削除されてしまうというので、VAOをちゃんと使えるようにしたいですね…

追記:とんでもない勘違いで、OpenGL3.2まで使えないと言っていました。すみません…