OpenTKOpenTKがGitHubで更新されるようになりました。NuGetから手に入れることができるようになりました。Coreに対応する機運があるようです。Object"の略です。VBOと名前が似ていますが、役割は全く異なります。VBOを使った描画では、描画時に場所の指定などをする処理が入るため、どうしても描画時の記述が多くなってしまいます。その一連の処理をカプセル化するのが、VAOの使い方の一つです。頂点の情報に識別番号を付けて管理できるようにもなりますが、今回はそれは使いません。3.0から標準機能になりましたが、同時にシェーダーを自作しないやり方は拡張機能となってしまったので、今回のやり方は来るシェーダーへのつなぎという側面が強いです。VAOの使い方VAOは名前の通りバッファではありません。そのため、VBOやIBOとは関数名や使い方が少し違います。VAOを扱う関数の"例"を以下に示します。objects.上から簡単に、VAOの作成、ひも付け、削除...です。VAOのひも付けがされている中でVBOの設定をすると、その情報がVAOに記憶されるため、描画時にVAOをひも付けするだけでVBOの描画前の設定を全部やってくれます。注意が必要なのは、IBOの全く関係しないというところです。IBOも使う場合は、VAOと一緒にひも付けする必要があります。描画ごとの処理が簡単に見えるトーラスと球を描画ソースコードは、OnLoad関数の処理が多くなってしまいましたが、OnRenderFrame関数の処理が簡単になっています。この書き方だと、素直にクラスを作れという話ですが、描画ごとの処理が簡単になることがよくわかると思います。0);GL.BindVertexArray(0);//VAO1ここまでこのコードの前に、VBOを作成してデータを送り込む処理が必要となります。236行目でVAOを作成し、239行目でVAOをひも付けしています。259行目のように、0を指定することでひも付けを解除できます。ひも付けの中で、GL.EnableClientStateを使ったりGL.VertexPointerなどを使ったりしています。ここでGL.EnableClientStateを使わなければならないのは、OpenGLの設計でサーバー側とクライアント側に分かれているということに関係しているようです。実際、ひも付けの中でGL.EnableClientStateを使わない場合、何も描画してくれません。今回は2つ物体を描画していますが、このコードは1つ分なのでもう1つの物体についても同様に処理を行います。vao2);//VAOを1コ削除GL.DisableClientState(ArrayCap.VertexArray);//VertexArrayを無効化GL.DisableClientState(ArrayCap.NormalArray);//NormalArrayを無効化GL.DisableClientState(ArrayCap.ColorArray);//ColorArrayを無効化GL.DeleteVertexArraysでVAOもしっかり削除します。0);GL.BindVertexArray(0);さて、描画処理ですが、1つの物体の表示は3行の処理で可能になっています。VAOとシェーダーとのつながり今回のプログラムは見栄えもパフォーマンスもよくなるというものではなく、OpenGLの仕様変更の関係で、このままの処理で使うことはまれです。VAOはプログラマブルシェーダーで用いる場合がほとんどです。シェーダー(GPU側)が受ける情報と、プログラム(CPU側)が送る情報をリンクさせるのに使います。VAOの生成やひも付けなどは一緒ですので、ぜひ覚えておいてください。MasuqaT.NET。