目次
OpenGL ES API
OpenGL ES 2.0
OpenGL 2.1 の Mobile 向け API。
Direct3D 9 世代の GPU をターゲットにしていますが、 固定機能パイプラインを廃して描画には Shader が必須となっています。 そのため OpenGL ES 1.1 や OpenGL 1.x 系とは全く互換性がありません。
Desktop API で固定機能互換性を切り捨てたのは OpenGL 3.x や Direct3D 10 なので、 Mobile では一足早く行われたことになります。
固定機能を削除したため、API は描画に必要な最小限で大変シンプルにまとまっています。 必要な機能があればシェーダーで実装すればよいわけで、重複した機能がなく合理的です。 歴代の 3D API の最も理解しやすいといえるかもしれません。
それ故移植性も高く、ブラウザの JavaScript から使える WebGL など、様々なプラットフォームで利用されています。 おそらく最も多くのプラットフォームで利用できる 3D API であるといえるでしょう。
OpenGL ES 2.0 が使えないプラットフォームを上げた方が早い。(Windows PC, Windows Phone くらいのもの)
入門にもおすすめ。
Direct3D 9 世代には ShaderModel 2.0 と 3.0 の 2種類あります。 OpenGL ES 2.0 対応 GPU は ShaderModel 3.0 から若干機能を削ったものに相当します。
- Direct3D 8 ShaderModel 1.0
- Pixel Shader は 9~12bit の固定小数点演算のみ。(lowp 未満)
- Pixel Shader は Color Combiner を拡張しただけなので、プログラムサイズは 8~16 step + Texture 4~6 step 固定。
- 使用できる Texture 枚数と Fetch 制限が同一。同じテクスチャを複数回読めない。
- プログラム言語は基本的に Shader Assembler
- Direct3D 9 ShaderModel 2.0
- Pixel Shader は 24~32bit 浮動小数点演算をサポート
- Pixel Shader の Program サイズは、Color 64 step + Texture 32 step の合計 96 step のみ
- Texture Fetch 制限が分離 (同じテクスチャを複数読める) ただし上限あり
- Fog / AlphaTest など固定機能を併用する
- 汎用補間 Register (varying) はなく Texcoord0~ を流用する。
- Direct3D 9 ShaderModel 3.0
- Pixel Shader は 32bit 浮動小数点演算をサポート
- Program サイズは 512 step 以上
- Pixel Shader の Color 命令と Texture 命令が統合された
- Texture Fetch 制限がなくなった。同じテクスチャを何度でも読める。
- 汎用補間 Register (varying) により用途はプログラマが決定する。
- 動的分岐に対応
- Shader Program は HLSL (高級言語) を使うことが当たり前となった
- OpenGL ES 2.0 (ShaderModel 3.0-)
- PixelShader は 16bit 浮動小数点演算以上をサポート
- Shader Constant (Uniform) 数は Direct3D 9 3.0 の半分
- Texture Fetch 制限なし
- 24bit depth buffer はオプション
- プログラム言語は GLSL (高級言語) のみサポート
ただし Mobile 向け GPU の多くにとって OpenGL ES 2.0 の最低要件は低すぎだったようで、 Extension により大きく機能拡張されているものがほとんどです。
OpenGL ES 3.0
Mobile 向け GPU の高機能化に伴い、新しい世代の GPU 用に策定された API です。
OpenGL 3.x のモバイル向け API で、DirectX でいえば Direct3D 10 世代に相当します。
Desktop 向けではこの世代から完全に Shader only となり、固定機能や古いシェーダー機能などレガシー API を削除しました。 そのため Shader 言語など、大きく仕様変更されているものがあります。 (OpenGL 3.x/4.x の場合は Compatibility Profile を用いることで、従来の固定機能 API もそのまま利用できます。)
ところが Mobile では Desktop 版 API とは少々異なる事情となっています。
- 一世代前にすでにレガシー固定機能を取り除いてスリム化している
- OpenGL ES 2.0 が事実上の 3D API の標準として、非常に多くの OS やプラットフォームで活用されている
そのため OpenGL ES 3.0 は Desktop API とは逆に、OpenGL ES 2.0 との互換性を強く維持しています。 GL API も Shader もそのままのコードが OpenGL ES 3.0 の上で動きますし、 OpenGL ES 3.0 の機能を必ずしも使わなくて構いません。 Default Uniform block など互換性を保つための仕組みがあるからです。
この流れは Desktop API に逆輸入されており、OpenGL 4.1 では OpenGL ES 2.0 との API 互換 Profile が設けられました。 一旦排除された OpenGL 2.x 世代の API の復活となります。 OpenGL 4.3 でも OpenGL ES 3.0 との互換性が保たれています。
同じように DirectX でも Direct3D11 では、ShaderModel 9/10 などの GPU をサポートすることになりました。 Direct3D 10 で一旦切り捨てた下位 GPU ですが、Mobile 向けに各種 SoC のサポートが必要になったためと考えられます。
機能的には Direct3D10 / OpenGL 3.3 から機能を削減したものに相当します。 削除された機能でわかりやすいのは GeometryShader でしょう。 Direct3D 10 の目玉のひとつでしたが、OpenGL で対応したのは OpenGL 3.2 からです。 OpenGL 3.0/3.1 には GeometryShader がなかったので、OpenGL ES 3.0 によく似ているといえます。
シェーダープログラムの汎用化が進み、 リソースはすべてバッファとして統合されました。
カラーチャンネルも R G B A (x y z w) が等しい扱いとなりました。 D3D9/GL2 世代までは Color と Alpha で差がありました。 1ch Texture は Luminance か Alpha の 2択。D3D10/GL3 世代からは、1ch は基本的に R (x) で統一。
VertexShader , PixelShader の機能的な区別も完全に無くなっています。
ところが Mobile 向け GPU の多くは OpenGL ES 2.0 (ShaderModel 3.0) の時点で Unified Shader 化されたものが多かったので、 それほど目新しさがありません。 MRT 対応化など、最低要件を引き上げたことが重要なポイントといえるでしょう。
OpenGL ES 3.1
バージョン番号は 0.1 とマイナーなアップデートですが、 仕様的には OpenGL ES 3.0 よりもさらに 1世代上に相当します。
OpenGL ES 3.1 は Direct3D 11 / OpenGL 4.x のモバイル向け API です。 最大の特徴は Compute Shader に対応したこと。
ただし Tessellator は存在しておらず、Direct3D 11 の特徴のひとつであった HalShader / DomainShader がありません。 Tessellator は Rasterizer と同じで HW 固定機能のサポートが必要です。 ハードウエアの負担を減らしつつ、効果的な機能を優先したためではないかと考えられます。
また OpenGL ES 3.0 世代の GPU は OpenCL に対応しているものが少なくありません。 すでに ComputeShader を走らせるだけの機能が GPU に備わっていたことも理由のひとつといえるのではないでしょうか。
OpenGL | GLSL |
---|---|
OpenGL ES 2.0 | GLSL 1.0 |
OpenGL 2.0 | GLSL 1.1 |
OpenGL 2.1 | GLSL 1.2 |
OpenGL 3.0 | GLSL 1.3 |
OpenGL 3.1 | GLSL 1.4 |
OpenGL 3.2 | GLSL 1.5 |
OpenGL ES 3.0 | GLSL 3.0 (es) |
OpenGL ES 3.1 | GLSL 3.1 (es) |
OpenGL 3.3 | GLSL 3.3 |
OpenGL 4.0 | GLSL 4.0 |
OpenGL 4.1 | GLSL 4.1 |
OpenGL 4.2 | GLSL 4.2 |
OpenGL 4.3 | GLSL 4.3 |
OpenGL 4.4 | GLSL 4.4 |
OpenGL 4.5 | GLSL 4.5 |
OpenGL ES 3.1 AEP (Android Extension Pack)
OpenGL ES 3.1 に OpenGL 4.x 相当の Extension を追加したものです。 Geometry Shader (gs), Tessellation Control Shader (tcs, hs), Tessellation Evaluation Shader (tes, ds) が含まれています。 ShaderModel は 5.0 (Direct3D11) 世代となり、Desktop GPU との機能面での差はほぼ無くなっています。
Android 5.0 (Lollipop) 及び NVIDIA Tegra K1 が対応しています。