月別アーカイブ: 2011年9月

Desktop の OpenGL ES 2.0 実行環境

Mobile 向け 3D API は OpenGL ES 2.0 で完全に統一されました。
今では WebGL や NaCl など Desktop PC でも使う機会が増えています。

もともと機能の確認やポータビリティのチェックのために情報を集めていましたが、
これらの OpenGL ES 2.0 実行環境をまとめてみました。
WGL_EXT_create_context_es2_profile

詳しくはこちら
 ・Desktop 向け OpenGL ES 2.0 実行環境

以下抜粋

Adreno SDK                    GPU Emu      EGL+ES2  ATITC/ETC1
PVRVFrame                     GPU Emu      EGL+ES2  PVRTC/ETC1
Mali OpenGL ES Emulator       GPU Emu      EGL+ES2  ETC1
Tegra OpenGL ES 2.0 Emulator  GPU Emu      EGL+ES2  S3TC(DXT)
ANGLE Project                 Application  EGL+ES2  S3TC(DXT)
RADEON OpenGL ES 2.0 API      Application  EGL+ES2
OpenGL 4.1 ES2 Compatibility  Application      ES2

● GPU Emulation 系

開発用なので目的が異なりますが、比較のために同じリストに入れています。
基本的には libEGL, libGLESv2 を呼び出すだけで EGL と OpenGL ES 2.0 の
API が使えます。固有の extension を使わなければ khronos の汎用ヘッダのまま
共有可能です。

ただし Tegra だけは別で、呼び出し規約が異なるため付属のヘッダフィルを
用いる必要があります。具体的には KHR/khrplatform.h の KHRONOS_APIENTRY
が違います。

● ANGLE Project

angleproject

多くの Emulator が OpenGL 2.x に変換しているのに対して、このライブラリは
DirectX (Direct3D 9) を使用します。
そのため Windows 上で OpenGL ドライバが提供されていない GPU でも動作します。

具体的には Atom Z シリーズの GMA500 (600) や、ノート PC 等でメーカー独自
のドライバ以外受け付けない場合に役に立ちそうです。

実際に VAIO Type P (Atom Z540 + GMA500, Windows 7 x86) 上できちんと
動作することを確認しました。

使い方は GPU Emulator 系と全く同じで libEGL/libGLSLv2 を呼び出すだけです。
CPU が低速なのでコンパイルに時間がかかりますが、Atom Z 系ネットブックでも
OpenGL アプリの開発ができるようになりました。

● RADEON OpenGL ES 2.0 API

Desktop 向け RADEON のドライバには EGL と OpenGL ES 2.0 API が
含まれています。

GeForce/RADEON で OpenGL ES 2.0 を動かす

RADEON 限定ですが安定して動作します。
import lib さえ用意すれば他の実行環境とほとんど同じ使い方が可能です。
ただし gl API は GetProceAddress() ではなく eglGetProcAddress() を使います。

GL_VERSION: OpenGL ES 2.0 10428 Release
GL_RENDERER: AMD Radeon HD 6750M
GL_VENDOR: Advanced Micro Devices, Inc.
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.0.17

● OpenGL 4.1 ES2 Compatibility

OpenGL 4.1 以上で OpenGL ES 2.0 の API 呼び出しができます。
比較的新しい GPU + ドライバの組み合わせが必要ですが、今後は対応ハードが
増えていくものと思われます。

(2011/09/26 追記以下は RADEON の場合)

Context 生成時は Core Profile Context (WGL_CONTEXT_CORE_PROFILE_BIT_ARB)
ではなく Compatibility Profile Context
(WGL_CONTEXT_COMPATIBILITY_PROFILE_ARB) を指定します。
WGL_EXT_create_context_es2_profile が無ければ
WGL_CONTEXT_ES2_PROFILE_BIT_EXT は特に必要無いようです。

関数のエントリさえ準備できればあとは GLES2/gl2.h でコンパイルが通ります。
EGL は無いので WGL をそのまま使用します。

シェーダーは #version 100 が利用可能でこの場合 GLSL ES と見なします。
GLSL 内の GL_ES の定義は自分で行う必要があるようです。

(2011/09/26 追記場合)

GeForce の場合は WGL_EXT_create_context_es2_profile があるので
WGL_CONTEXT_ES2_PROFILE_BIT_EXT で Context を作り直します。
具体的な方法について詳しくは こちら を参照してください。

GL_VERSION: OpenGL ES 2.0 280.26
GL_RENDERER: GeForce GTX 460/PCI/SSE2
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00

関連エントリ
GeForce/RADEON で OpenGL ES 2.0 を動かす
OpenGL ES 2.0 Emulator

OpenGL ES 2.0 shader の演算精度

OpenGL ES 2.0 の GLSL では演算精度の宣言ができます。

宣言       fp精度        vsh     fsh
---------------------------------------
highp      24bit 以上    必須    option
mediump    16bit 以上            必須
lowp       10bit 以上

それぞれ最低限の演算精度が決まっていますが上限はありません。
GPU によっては lowp 宣言しても常に highp とみなされることもあります。
検証プログラムを作って調べてみました。

                         vertex shader         fragment shader
------------------------------------------------------------------
Adreno 200/205           highp                 highp
PowerVR SGX 535/540      highp/mediump/lowp    highp/mediump/lowp  
Tegra 250 (ULP GeForce)  highp/mediump/lowp    highp/mediump/lowp
Mali-400MP               highp                 mediump

変数宣言時の精度修飾子によって演算結果と動作速度が変わるのは
PowerVR と Tegra2 です。

精度を下げると速度が向上する理由としては

・純粋に演算ユニットの能力が不足していたため
・テンポラリレジスタの消費が減ってスレッド並列性が上がるため

の 2つが考えられます。

precision 宣言の影響が全く無いのは Adreno と Mail-400 です。
特に Adreno は Unified shader であり fragment も vertex 同様
highp で演算が行われています。

同じように Mali-400 も固定精度ですが fragment の演算精度は mediump
相当でした。

こちらにまとめています
Mobile GPU の比較

本当は仮数部の bit 数まで厳密に求めようとしたのですがコンパイラの違いか
最適化のためかうまくいきませんでした。

関連エントリ
Android Galaxy S2 ARM Mali-400 MP
iPad2 A5 と浮動小数点演算 VFP/NEON
Android OpenGL ES 2.0 の圧縮テクスチャ
Tegra2 Cortex-A9 と浮動小数点演算
Snapdragon と浮動小数点演算速度