「moreover lwjgl」 5 VAOとVBOで表示(2)
この前の続きです。
補足:OpenGL3.0に対応していないと出来ないと言いましたが、ARB Extensionの「GL_ARB_vertex_array_object」に対応していれば、使えます。Extension(拡張機能)については、今度やります。
では、またコードから…
解説
displayメソッドから
121行目 : 指定したIDのVAOにバインドしています。つまり、初期設定で保存したVAOのデータをまた使えるようにします。
122行目 : 現在のVAO内の、指定した番号の頂点属性を使用可能にします。
ここでは、「0 : 頂点の座標」を使用可能にします。
124行目 : 現在のVAOを使って、中にあるVBOの頂点(使用可能な属性なども反映して)を描画します。
第1引数 - 描画する際の描画モード。glBegin(int mode)のmodeと同じ。
第2引数 - VBOないで一番最初に読み取る(描画する)データの番号。0で一番最初からになる。
第3引数 - 描画する頂点の個数。modeの個数に従わないと、正しく表示されない。
下の図は、glDrawArraysを様々な引数でやった時です。
このように、ちゃんとした値を入れなければ、表示がおかしくなるのが分かると思います。
126行目 : 描画し終わったので、頂点属性”0(=座標)”を使用不可にします。
127行目 : 現在のVAOを0にします。描画が終わって戻していないと、間違えてVAOの設定などを書き換えるかもしれないので、すぐに頂点属性やVAOは、元に戻すようにしましょう。
描画メソッド終了 ここからfinish(終了時)メソッド
131行目 : 今回はありませんが、描画メソッドの後にまた頂点属性を変えること(シェーダとか)もあり、また、ウィンドウを閉めるときがVAO使用中でもいいように、最後にもう一回頂点属性”0”を使用不可にします。
132行目 : 指定したIDのVBOを頂点配列から外します。
133行目 : 指定したIDのVBOをメモリから消します。
134行目 : 現在のVAOをもう一度0にします。理由は、頂点属性の時と同じです。
135行目 : 指定したIDのVAOをメモリから消します。
実行結果がこちら
VAOとVBOは、glVertexに比べれば、圧倒的にコードの量が多いですが、VAOのほうが、様々な事ができ、またOpenGLの更新にともなってglVertex系は削除されてしまうというので、VAOをちゃんと使えるようにしたいですね…
追記:とんでもない勘違いで、OpenGL3.2まで使えないと言っていました。すみません…