目次
Desktop 向け OpenGL ES 2.0 / OpenGL ES 3.0 / OpenGL ES 3.1 (AEP) 実行環境
互換性のチェックや動作確認目的で OpenGL ES 2.0 / 3.0 / 3.1 の実行環境を集めています。まとめてみました。
WebGL や NativeClient (NaCl) など、GPU/OS を問わず OpenGL ES 2.0 が 3D API の標準になりつつあります。 そのため Desktop 上でも OpenGL ES 2.0 を必要とするケースが増えています。
- モバイル向けアプリ開発のための GPU エミュレーション。あくまで開発ツールとして
- Desktop 上で ES 2.0 アプリケーションを走らせるため。
以前の OpenGL ES 2.0 Emulator は GPU のハードウエア Emulation が目的であり 1. のためでしたが、今後は 2. の用途も増えて来ると考えられます。 WebGL のために開発された ANGLE もそのひとつです。
なお OpenGL は下位互換性があるため、 OpenGL ES と OpenGL との差は少なく両方で動作するアプリケーションを書くことは難しくありません。 これらの lib に依存しなくてもアプリケーション側で API 差を吸収することも可能です。
また Linux などの Unix 系環境の場合は、 Mesa 3D により比較的簡単に OpenGL ES 2.0/3.0 API を利用することができるようです。
サイト | 名称 | 用途 | Type | API | win | osx | linux | lib | 圧縮tex |
---|---|---|---|---|---|---|---|---|---|
OpenGL 4.5以降 | OpenGL ES 3.1 Compatibility | Application | Native | ES3.1 (AEP) | 32/64 | – | 32/64 | 無し | ETC2(EAC)/ASTC |
OpenGL 4.3以降 | OpenGL ES 3.0 Compatibility | Application | Native | ES3 | 32/64 | – | 32/64 | 無し | ETC2(EAC)/S3TC(DXT) |
Qualcomm Developer Network | Adreno SDK | GPU Emu | API Tr | EGL+ES3 (ES3.1) | 32/64 | 64 | 32/64 | libEGL, libGLESv2 | ETC2(EAC)/ATITC |
ARM Mali Developer Center | OpenGL ES Emulator | GPU Emu | API Tr | EGL+ES3 | 32/64 | 32/64 | libEGL, libGLESv2 | ETC2(EAC)/ASTC | |
Imagination PowerVR Insider | PVRVFrame | GPU Emu | API Tr | EGL+ES3 (ES3.1) | 32/64 | 64 | 32/64 | libEGL, libGLESv2 | ETC2/EAC)/PVRTC2 |
Mesa 3D Graphics Library | Mesa 3D | Application | Na/Sw | EGL+ES3 | 32/64 | libEGL, libGLESv2 | ETC2(EAC)/S3TC(DXT) | ||
サイト | 名称 | 用途 | Type | API | win | osx | linux | lib | 圧縮tex |
OpenGL 4.1以降 | OpenGL ES 2.0 Compatibility | Application | Native | ES2 | 32/64 | 64 | 32/64 | 無し | S3TC(DXT) |
Qualcomm Developer Network | Adreno SDK | GPU Emu | API Tr | EGL+ES2 | 32/64 | 64 | 32/64 | libEGL, libGLESv2 | ATITC/ETC1 |
ARM Mali Developer Center | OpenGL ES Emulator | GPU Emu | API Tr | EGL+ES2 | 32/64 | ? | 32/64 | libEGL, libGLESv2 | ETC1 |
Imagination PowerVR Insider | PVRVFrame | GPU Emu | API Tr | EGL+ES2 | 32/64 | 64 | 32/64 | libEGL, libGLESv2 | PVRTC/ETC1 |
NVIDIA Developer Zone | x86 Windows OpenGL ES 2.0 Emulator | GPU Emu | API Tr | EGL+ES2 | 32 | – | – | libGLES20 | S3TC(DXT) |
Google angleproject | ANGLE Project | Application | API Tr | EGL+ES2 | 32/64 | – | – | libEGL, libGLESv2 | S3TC(DXT) |
AMD Developer Central | RADEON OpenGL ES 2.0 API | Application | Native | EGL+ES2 | 32/64 | ? | ? | libEGL, libGLESv2 | 無し |
Mesa 3D Graphics Library | Mesa 3D | Application | Na/Sw | EGL+ES2 | 32/64 | libEGL, libGLESv2 | S3TC(DXT) |
GPU Emulation
対象の GPU 機能を再現することが目的です。 そのため対象ハード相当の機能が再現されており、PVRTC や ATITC など固有の専用テクスチャも読み込める点が特徴です。 例えば ASTC 対応 GPU がなかった時代でも Emulator 上では ASTC を使用することができました。
逆に GPU に無い機能は disable されているため、他の OpenGL ES 環境よりも使える機能に制限がかかることがあります。 プロファイラなどの様々なツールとセットで提供されていることも多く、GPU 向けの SDK の一部となっています。
HOST PC 側のビデオカード (GPU) の影響を受けるため、必ずしもどの環境でも安定して動作するとは限りません。 GPU の種類だけでなくドライバのバージョンによって相性問題が生じるので、安定動作を望むならある程度の試行錯誤が必要です。 すべての Emulator が安定して動く環境を探すのは意外に困難です。
開発用なので、アプリケーションにそのまま組み込んで利用することはできません。
Adreno, PowerVR, Mali
それぞれ付属の libEGL.dll, libGLESv2.dll を使用します。 import lib がセットとなっているため、link するだけで OpenGL ES の API が使えるようになります。 ヘッダ類は専用のものが付属していますが、khronos からダウンロードできる最新の OpenGL ES ヘッダで十分使い物になります。
OpenGL ES 3.1 への対応も徐々に行われています。 専用 Context を作らずに ComputeShader が利用できるものもあるので、使い方はそれぞれのライブラリに依存します。 まだドキュメントが揃っていないので、直接サンプルを探したほうが早いかもしれません。
Tegra
Tegra だけ lib 名が異なり関数の呼び出し規約も異なっています。 そのため汎用の GLES2/gl2.h などのヘッダを使えず、必ず付属のヘッダを使う必要があります。 (具体的には khrplatform.h が違う) dll は 1 つだけですが EGL も含まれています。 なぜか GLSL ES Version 1.1 を返す問題あり。
Tegra 2/3/4 は OpenGL ES 3.0 をサポートしないこともあり、更新が止まっているようです。 次の Tegra K1 は OpenGL 4.4 をサポートすると言われており、Emulation する必要がなくなりました。
OpenGL の GL ES Compatibility
- GL_ARB_ES2_compatibility
- GL_ARB_ES3_compatibility
- GL_ARB_ES3_1_compatibility
OpenGL 4.x には OpenGL ES 互換モードが搭載されています。以下各 GPU の対応状況。 (いずれも D3D11 世代の GPU のみ)
GPU | OpenGL API | ES2 Compatibility | ES3 Compatibility | ES3_1 Compatibility | ES3_1 AEP | GPU |
---|---|---|---|---|---|---|
GeForce | OpenGL 4.5 | Y (Context) | Y (Context) | Y (Context) | Y | GeForce 400~ Fermi, Kepler, Maxwell 等 |
RADEON | OpenGL 4.5 | Y | Y | Y | N | RADEON HD 5000~ |
Intel HD Graphics | OpenGL 4.0~4.3 | Y (Context) | Y (Context) | Y (Context) | N | Intel HD Graphics 2500/4000 ~ |
- Context = EXT_create_context_es2_profile 等
EGL ではなく WGL や GLX 等の Native API を使いますがそれ以外の API は共通です。 安定して動くので、Mobile との共通アプリケーションを走らせる場合に有効です。
OpenGL 4.5 以上の ES31 Compatibility (GL_ARB_ES3_1_compatibility)
OpenGL 4.5 以上では OpenGL ES 3.1 の互換性が保たれています。
// Windows static const int opengl_es31[]= { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 1, WGL_CONTEXT_FLAGS_ARB, 0, WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_ES2_PROFILE_BIT_EXT, 0, }; HGLRC hglrc= wglCreateContextAttribsARB( hDC, 0, opengl_es31 );
// X11 static const int opengl_es31[]= { GLX_CONTEXT_MAJOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, 1, GLX_CONTEXT_FLAGS_ARB, 0, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, None, }; GLXContext context= glXCreateContextAttribsARB( display, config, 0, True, opengl_es31 );
厳密にはこの手順が必要なのは EXT_create_context_es2_profile が有効な場合だけです。
// Windows const char* extension_string= wglGetExtensionsStringARB( hDC ); if( strstr( extension_string, "WGL_EXT_create_context_es2_profile" ) != NULL ){ ~ }
// X11 const char* extension_string= glXQueryExtensionsString( display, screen ); if( strstr( extension_string, "GLX_EXT_create_context_es2_profile" ) != NULL ){ ~ }
GL_VERSION: OpenGL ES 3.1 NVIDIA 346.22 GL_RENDERER: GeForce GTX 650/PCIe/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10
- 2015/02 GeForce では必ずしも上記のように VERSION 3.1 を指定する必要がないようです。Android 同様に ES 2.0 Context を作っても ES 3.1 Context を返します。OpenGL 4.5 以上であれば Linux でも OpenGL ES 3.1 を使用できます。
- また GeForce の場合は Android の Tegra K1 同様に、OpenGL ES 3.1 AEP (GL_ANDROID_extension_pack_es31a) に対応しています。
- 2015/06 Intel HD Graphics (Ivy Bridge/BayTrail 世代以上) でも新しいドライバでは ES 3.1 Context の生成が可能です。
OpenGL 4.3 以上の ES3 Compatibility (GL_ARB_ES3_compatibility)
OpenGL 4.3 以上では OpenGL ES 3.0 と互換性があります。 また Intel HD Graphics 4000 も OpenGL 4.0 ながら GL_ARB_ES3_compatibility 対応となっており、Desktop GPU の D3D11 世代ではすべての GPU で OpenGL ES 3.0 も使用できることになります。
具体的な使用方法は OpenGL ES 2.0 の ES2 Compatibility と同じです。
static const int opengl_es30[]= { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, WGL_CONTEXT_FLAGS_ARB, 0, WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_ES2_PROFILE_BIT_EXT, 0, }; HGLRC hglrc= wglCreateContextAttribsARB( hDC, 0, opengl_es30 );
GL_VERSION: OpenGL ES 3.0 305.53 GL_RENDERER: GeForce GTX 560 Ti/PCIe/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00
OpenGL 4.1 以上の ES2 Compatibility (GL_ARB_ES2_compatibility)
OpenGL 4.1 では OpenGL ES 2.0 相当の API を利用することができます。 基本的には OpenGL 4.x の Context のままで、 ES2 互換の API 追加やシンボル定義により差を吸収しています。
関数のエントリさえ準備できればあとは Khronos の汎用 GLES2/gl2.h ヘッダでコンパイルできます。 gl.h 以外の API を取り出すための手順は、Windows 上の通常の GL 命令や Extension と扱いは変わりません。
EGL ではないので、 EGL による機能制限を受けることがない代わりに プラットフォームごとに異なるコードが必要となります Windows なら WGL 、X11 なら glX 等。
RADEON
WGL_EXT_create_context_es2_profile が無いので、通常の OpenGL として context を作成します。 この場合 Core Profile Context ではなく Compatibility Profile Context を指定しておく必要があります。
シェーダーは #version 100 を受け入れるので、この場合 GLSL ES とみなします。 ただし driver が define symbol GL_ES を定義しないので、もし利用しているならばコンパイル時に自分で定義しておく必要があります。
GeForce / Intel HD Graphics
WGL_EXT_create_context_es2_profile なので、自分で context を作り直す必要があります。 具体的には version 2.0 で WGL_CONTEXT_ES2_POROFILE_BIT_EXT を指定します。
static const int opengl_es20[]= { WGL_CONTEXT_MAJOR_VERSION_ARB, 2, WGL_CONTEXT_MINOR_VERSION_ARB, 0, WGL_CONTEXT_FLAGS_ARB, 0, WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_ES2_PROFILE_BIT_EXT, 0, }; HGLRC hglrc= wglCreateContextAttribsARB( hDC, 0, opengl_es20 );
これで context を作りなおすと下記のように OpenGL ES 2.0 になります。
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
define symbol GL_ES が定義されているので、RADEON の方法よりも互換性が高いといえるでしょう。
Angle Project
Windows の Direct3D 9/11 上に OpenGL ES 2.0 を実装したライブラリです。 OpenGL のドライバがなくても動作できることが特徴となります。
例えば 旧 Atom の Z シリーズ (GMA500~ PowerVR SGX 搭載) には OpenGL のドライバがありませんでした。 Angle Project のライブラリを用いることで、OpenGL ES 2.0 用プログラムを実行できるようになります。 (VAIO type P , Windows 7 x86 で確認)
使い方は前述の GPU Emulator と全く同じで、libEGL や libGLESv2 を使うだけです。 lib 名や呼び出し規約が同一なので、他の GPU Emulator と入れ替えて使用できます。
注意: build 時に copy される d3dcompiler_46.dll も必要です。eglInitialize() が失敗する場合は d3dcompiler_46.dll が存在していない可能性があります。
build 手順 (VisualStudio 2010~)
- git でソースを clone
- projects/src/angle.sln を開く
- build
そのままだと D3D9 ベースの 32bit 版が作られます。 64bit ライブラリを build するには下記の手順が必要です。(2014/04/18 VisualStudio 2013 で確認)
- Configuration Manager で platform に x64 を追加する。(win32 を元にして新規に作る)
- libEGL / libGLESv2 の Property を開く
- x64 の Linker → General → Additional Library Directories を開く
- path を「~/Lib/win8/um/x86」から「~/Lib/win8/um/x64」に変更
Direct3D 11 を有効にするにはソース内の define を変更します。
- src/libGLESv2/renderer/Renderer.cpp 内の ANGLE_ENABLE_D3D11 を 1 にする。
この場合 HOST PC が D3D11 対応の場合は D3D11 を利用し、対応していない場合は D3D9 が用いられます。
↓Direct3D 9 で走らせた場合
GL_VERSION: OpenGL ES 2.0 (ANGLE 1.3.d70707b435ef) GL_RENDERER: ANGLE (NVIDIA GeForce GTX 650 Direct3D9Ex vs_3_0 ps_3_0) GL_VENDOR: Google Inc. GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00 (ANGLE 1.3.d70707b435ef)
↓Direct3D 11 の場合
GL_VERSION: OpenGL ES 2.0 (ANGLE 1.3.d70707b435ef) GL_RENDERER: ANGLE (NVIDIA GeForce GTX 650 Direct3D11 vs_5_0 ps_5_0) GL_VENDOR: Google Inc. GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00 (ANGLE 1.3.d70707b435ef)
Direct3D 11 で動作可能になったことで、現在 OpenGL ES 3.0 への対応も進められているようです。
Mesa 3D
Ubuntu の場合の install 方法
$ sudo apt-get install libgl1-mesa-dev libgles2-mesa-dev mesa-utils-extra
OpenGL ES 2.0 / 3.0 API を利用できます。 ES 3.0 が使えるかどうかは HOST GPU/CPU、OS 環境によって異なります。 対応しているバージョンを調べるには、mesa-utils-extra に含まれている es2_info コマンドを使います。 ただし llvmpipe はソフトウエアレンダラ。
// Ubuntu 14.04 : VMware Player EGL_CLIENT_APIS: OpenGL OpenGL_ES OpenGL_ES2 OpenVG GL_VERSION: OpenGL ES 2.0 Mesa 10.1.0 GL_RENDERER: Gallium 0.4 on SVGA3D; build: RELEASE; // Ubuntu 14.04 : RADEON HD 6750M EGL_CLIENT_APIS: OpenGL OpenGL_ES OpenGL_ES2 OpenGL_ES3 GL_VERSION: OpenGL ES 3.0 Mesa 10.1.0 GL_RENDERER: Gallium 0.4 on llvmpipe (LLVM 3.4, 256 bits) // Ubuntu 14.04 : Intel HD 4000 EGL_CLIENT_APIS: OpenGL OpenGL_ES OpenGL_ES2 OpenGL_ES3 GL_VERSION: OpenGL ES 3.0 Mesa 10.1.0 GL_RENDERER: Mesa DRI Intel(R) Ivybridge Mobile GL_EXTENSIONS:
es2_info コマンドは Nexus 7 (2012) 上の Ubuntu 13.04 desktop など、ARM ベースの Linux 上でも使えます。
ライブラリは libEGL / libGLESv2 をリンクします。
FLB_LIBFLAGS= -lm -lEGL -lGLESv2 -lX11
RADEON OpenGL ES 2.0 API
RADEON のドライバに含まれる Native OpenGL ES 2.0 API です。 初期の頃は 64bit でも動く物が少なく貴重な API でした。 OpenGL ES 4.1 で ES Compatibility が登場したため、今となっては EGL が使えること以外は出番がないと思います。
- AMD RADEON の OpenGL ES 2.0 API について詳しくはこちら