OpenGL ES 3.1 の仕様が公開されました。
バージョン番号は 3 のままですが、内容は OpenGL 4.x の機能を
取り込んだ大幅なアップデートとなっています。
最近のハイエンド Mobile GPU は、Windows Tablet を想定して Direct3D 11
API も積極的にサポートしつつあります。
OpenGL ES 3.1 にはこれらの GPU の進化がそのまま反映されていると言えます。
世代毎の API OpenGL ES OpenGL Direct3D ShaderModel ------------------------------------------------------------- OpenGL ES 2.0 OpenGL 2.1 Direct3D9 ShaderModel 3.0 OpenGL ES 3.0 OpenGL 3.3 Direct3D10.1 ShaderModel 4.1 OpenGL ES 3.1 OpenGL 4.4 Direct3D11.2 ShaderModel 5.0
ユニークなのは、OpenGL ES が GeometryShader や Tessellator 等の
組み込みのシェーダーパイプラインを採用しなかったことです。
その代わり柔軟で扱いやすい ComputeShader に仕様を絞り込んでおり、
機能と自由度のバランスを上手く保っている印象です。
機能の比較 Shader Version ------------------------------------------------------------ OpenGL ES 2.0 vsh fsh --- --- --- --- #version 100 OpenGL ES 3.0 vsh fsh --- --- --- --- #version 300 es OpenGL ES 3.1 vsh fsh --- --- --- csh #version 310 es OpenGL 2.1 vsh fsh --- --- --- --- #version 120 OpenGL 3.3 vsh fsh gsh --- --- --- #version 330 OpenGL 4.4 vsh fsh gsh tcsh tesh csh #version 440 Direct3D 9 vsh psh --- --- --- --- 3.0 Direct3D 10 vsh psh gsh --- --- --- 4.0 Direct3D 11 vsh psh gsh hsh dsh csh 5.0
より詳しい表はこちら↓
ComputeShader をサポートしたことで、同時にバッファのランダムアクセスや
読み書き、Atomic なオペレーション命令などもひと通り入りました。
どれも OpenGL 4.x 相当です。Indirect Draw もあります。
Texture Image Load and Store OpenGL 4.2 Atomic Counter Buffer OpenGL 4.2 Shader Storage Buffer OpenGL 4.3 Shared Memory OpenGL 4.3
バッファアクセスについて詳しくは下記のエントリを参照してください。
・OpenGL 3.x/4.x のシェーダー GLSL とメモリアクセス命令
buffer 命令が増えたことで GLSL の layout() 構文も賑やかになりました。
これまで Uniform や Attribute のバインドには、OpenGL API を使って
Location を参照したり値を書き換える必要がありました。
GLES 3.1 (と OpenGL 4.3以降) は GLSL 内に直接数値で宣言できます。
また Direct3D のように実行時にシェーダーのステージを組み合わせられる
ようになります。詳細は下記をどうぞ。
・OpenGL 4.x Program Pipeline Object (Separate Shader Object)
Shader Stage は少ないものの、OpenGL ES 3.1 は OpenGL 4 の特徴を取り入れており
Direct3D との親和性(移植しやすさ) が向上していることがわかります。
OpenGL 4.x とのコード共有もしやすくなるのですが、
Desktop PC では Intel GPU が OpenGL 4.0~4.1 に留まっており、
上記の機能の多くを使うことができません。
OpenGL で ComputeShader を当たり前に使えるようになるには
まだ時間がかかりそうです。
OpenGL ES の GLSL が暗黙の型変換をサポートしないのは 3.1 でも同様で、
仕様となっています。
Uniform Block (Interface Block) の input/output はサポートされませんでした。
GLES3.1 は OpenGL ES 2.0/3.0 との上位互換性を保っています。
Mobile GPU が活発になってからは、バージョンが進むほど下位互換性が復活する
傾向があります。
OpenGL 3~4 もそうですし、Direct3D 10~11 も同様でした。
Mobile GPU が高機能になるにつれて、Desktop GPU 向け API と区別する
必要性はなくなりつつあります。
OpenGL を使う側の立場としても、最終的には統合して欲しい願っています。
ですが、WebGL のように軽量な API として用途が広がる可能性を考えると
ComputeShader に絞った仕様は良い選択かも知れません。
関連エントリ
・iPhone 5s の Apple A7 GPU
・Nexus 7 (2013) の Adreno 320 と OpenGL ES 3.0 (Android 4.3)
・OpenGL 3.x/4.x のシェーダー GLSL とメモリアクセス命令
・OpenGL 4.x Program Pipeline Object (Separate Shader Object)
・OpenGL 4.2/4.3 Shader Resource と Buffer API
・OpenGL ES 3.0/OpenGL 4.x Uniform Block
・OpenGL の各バージョンと GLSL の互換性
・OpenGL のエラー判定と OpenGL 4.3 Debug Output
・OpenGL ES 3.0/OpenGL 4.4 Texture Object と Sampler Object
・OpenGL ES 3.0 と Vertex Array Object