日別アーカイブ: 2013年7月31日

OpenGL ES 3.0 と Vertex Array Object

OpenGL ES 3.0 は OpenGL 3.x に相当します。
DirectX でいえば Direct3D 10 相当で、この時期に API も GPU 機能も大きな
仕様変更がありました。

Direct3D 11 は今でこそ Mobile 向けの用途もあって、Direct3D 9 相当の GPU
でも使えるよう API が拡張されています。
ですが Vista と共にリリースされた Direct3D 10.0 は GPU も API も
下位互換性が無く D3D10 対応 GPU 以外では使えませんでした。

GPU 年表

Direct3D 10 から少々遅れて OpenGL 3.x でも大きな変更が入っています。
Direct3D ほど極端ではありませんが、徐々にレガシー機能を排除して API の
古い仕様が置き換えられていきました。
従来のアプリは互換性用の Compatible Profile を選択することで対応可能と
なっています。

両者ともに Desktop 向け GPU では互換性より新機能を重視していたのですが、
その後 Mobile 向けの用途が広がったことで方向性が変わってきたようです。
Direct3D 11 では制限付きながら FeatureLevel で下位互換性が復活しています。

OpenGL ES 3.0 では今回、OpenGL 3.0 で捨てたはずの互換性が維持されたままの
上位互換となっています。
そのため OpenGL 2.x (GLES 2.0) 世代の命令が OpenGL 3.0 ではエラーに
なるが、OpenGL ES 3.0 ではエラーにならないことがあるようです。

その一つが Vertex Array Object (VAO) です。
OpenGL 3.0 では VAO を Bind していない (default object == 0) 場合の
glVertexAttributePointer() がエラーに
なりますが OpenGL ES 3.0 では OpenGL ES 2.0 と同じように通ります。

OpenGL でも GPU の Driver によっては Core Profile でもレガシー API を
混在できるものがあるので、エラー判定の範囲が違うだけなのかもしれません。

0 の時に default object が割り当てられるかどうかだけだと思うのですが、
きちんと把握していなかったのでこの辺りの挙動はもう少し詳しく調べたいと
思っています。