日別アーカイブ: 2014年3月18日

OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応

OpenGL ES 3.1 の仕様が公開されました。
バージョン番号は 3 のままですが、内容は OpenGL 4.x の機能を
取り込んだ大幅なアップデートとなっています。
最近のハイエンド Mobile GPU は、Windows Tablet を想定して Direct3D 11
API も積極的にサポートしつつあります。
OpenGL ES 3.1 にはこれらの GPU の進化がそのまま反映されていると言えます。

Khronos OpenGL ES Registry

世代毎の 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

より詳しい表はこちら↓

GLSL Version

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