Emscripten の OpenGL API には 3 つの動作モードがあります。
(1) defaut (WebGL-friendly subset of OpenGL)
(2) -s FULL_ES2=1 (OpenGL ES 2.0 emulation)
(3) -s LEGACY_GL_EMULATION=1 (OpenGL emulation of older desktop and mobile versions)
(1) は WebGL 命令をほぼそのまま OpenGL ES 2.0 API にコンバートしたものです。
(2) は (1) に加えて OpenGL ES 2.0 の足りない機能を補っています。
WebGL は VertexBuffer を経由しない描画をサポートしていないためです。
(3) は WebGL 上で OpenGL 1.x の固定パイプラインをエミュレートしています。
各種レンダーステートにより、動的にシェーダーの生成も行っているようです。
通常は (1) のままで十分ですが、もし正しく描画されない要素がある場合は
(2) を試すことが可能です。
具体的には glVertexAttribPointer() や glDrawElements() の最後の引数に、
直接データのポインタを渡している場合が相当します。
もともと GPU Hardware 的にも望ましくない機能であること、
また Emscripten でのエミュレーションもオーバーヘッドが生じるため
Client Side Arrays は出来る限り使わないことが推奨されています。
● GPU/Browser 毎の Extension
前回のデータを Android 端末含めてさらに集めてみました。
詳細は下記ページへ
・WebGL Extensions (Emscripten)
テクスチャ
TS RTS CTex Depth ANI Float Half
W8 Intel HD G 4000 Firefox 29 8K 8K DXT Y Y Y-L Y
W8 Intel HD G 4000 Chrome 35 8K 8K DXT Y Y Y-L Y-L
W8 Intel HD G 4000 IE 11 16K 16K DXT N Y Y-L N
W8 RADEON HD 6750M Firefox 29 16K 16K DXT Y Y Y-L Y
W8 RADEON HD 6750M Chrome 35 16K 16K DXT Y Y Y-L Y-L
W8 RADEON HD 6750M IE 11 16K 16K DXT N N Y-L N
W7 GeForce GTX650 Firefox 29 16K 16K DXT Y Y Y-L Y
W7 GeForce GTX650 Chrome 35 16K 16K DXT Y Y Y-L Y-L
W7 GeForce GTX650 IE 11 16K 16K DXT N N Y-L N
OSX RADEON HD 6750M Firefox 29 16K 16K DXT Y Y Y-L Y
OSX RADEON HD 6750M Chrome 35 4K 16K DXT Y Y Y-L Y-L
OSX RADEON HD 6750M Safari 7 16K 16K DXT Y Y Y N
OSX Intel HD G 4000 Firefox 29 4K 4K DXT Y Y Y-L Y
OSX Intel HD G 4000 Chrome 35 4K 16K DXT Y Y Y-L Y-L
OSX Intel HD G 4000 Safari 7 16K 16K DXT Y Y Y N
U14 RADEON HD 6750M Firefox 29 16K 16K DXT Y Y Y-L Y
U14 RADEON HD 6750M Chrome 35 16K 16K DXT Y Y Y-L Y-L
U14 RADEON R3 Firefox 29 16K 16K DXT Y Y Y-L Y
U14 RADEON R3 Chrome 35 16K 16K DXT Y Y Y-L Y-L
U14 Intel HD G Firefox 29 8K 8K DXT Y Y Y-L Y
TS RTS CTex Depth ANI Float Half
A42 S80 Adreno 330 Firefox 29 4K 4K ATC Y Y Y Y
A42 S80 Adreno 330 Chrome 35 4K 4K --- N Y Y Y-L
A44 S4P Adreno 320 Firefox 29 4K 4K ATC Y Y Y Y
A44 S4P Adreno 320 Chrome 35 4K 4K --- N Y Y Y-L
A44 T4 ULP GeForce72 Firefox 29 4K 4K DXT N Y N Y
A44 T4 ULP GeForce72 Chrome 35 4K 4K DXT N Y N Y-L
A44 E5 Mali-T604 Firefox 29 8K 8K --- Y N Y-L Y
A41 K3 VivanteGC4000 Firefox 29 8K 8K --- Y Y Y Y
A44 T3 ULP GeForce12 Firefox 29 2K 2K DXT N Y N Y
A44 T3 ULP GeForce12 Chrome 35 2K 2K DXT N Y N Y
A42 OM4 PVR SGX540 Firefox 29 2K 2K PVR Y N Y Y
A41 R66 Mali-400MP4 Firefox 29 4K 4K --- Y N N N
A40 S3 Adreno 220 Firefox 29 4K 4K ATC Y Y Y Y
A23 S2 Adreno 205 Firefox 29 4K 4K ATC Y Y Y Y
TS = GL_MAX_TEXTURE_SIZE
RTS = GL_MAX_RENDERBUFFER_SIZE
CTex = 対応している圧縮テクスチャフォーマット
Depth= WEBGL_depth_texture
ANI = EXT_texture_filter_anisotropic
Float= OES_texture_float (Y-L は OES_texture_float_linear)
Half = OES_texture_half_float (Y-L は OES_texture_half_float_linear)
W8=Windows8.1, W7=Windows7, OSX=10.9, U14=Ubuntu14.04, A44= Android 4.4
圧縮テクスチャは、Desktop では 100% DXT1~DXT5 (S3TC) が利用可能となっています。
Android は通常の OpenGL ES 2.0 と同じく GPU によって DXT/ATC/PVR とばらばら。
Android が共通でサポートしているはずの ETC1 が列挙されていませんが、
本当に使えないのかどうかは未確認。
DXT に対応しているはずの Vivante GC4000 が未対応となっているのは、
ブラウザの WebGL Layer が GL_COMPRESSED_TEXTURE_FORMSTS ではなく、
GL_EXTENSIONS だけチェックしているからではないかと思われます。
テクスチャ以外
Uniform In/Out EInt VAO Ins DB sRGB
W8 Intel HD G 4000 Firefox 29 254/ 221 16/10 Y N N N N
W8 Intel HD G 4000 Chrome 35 254/ 221 16/10 Y Y Y N N
W8 Intel HD G 4000 IE 11 512/ 512 16/14 N N N N N
W8 RADEON HD 6750M Firefox 29 254/ 221 16/10 Y N N N N
W8 RADEON HD 6750M Chrome 35 254/ 221 16/10 Y Y Y N N
W8 RADEON HD 6750M IE 11 512/ 512 16/14 N N N N N
W7 GeForce GTX650 Firefox 29 254/ 221 16/10 Y N N N N
W7 GeForce GTX650 Chrome 35 254/ 221 16/10 Y Y Y N N
W7 GeForce GTX650 IE 11 512/ 512 16/14 N N N N N
OSX RADEON HD 6750M Firefox 29 768/ 768 16/16 Y Y N Y Y
OSX RADEON HD 6750M Chrome 35 768/ 768 16/32 Y Y Y Y N
OSX RADEON HD 6750M Safari 7 768/ 768 16/32 Y Y N N N
OSX Intel HD G 4000 Firefox 29 1024/1024 16/16 Y Y Y Y Y
OSX Intel HD G 4000 Chrome 35 1024/1024 16/15 Y Y Y Y N
OSX Intel HD G 4000 Safari 7 1024/1024 16/15 Y Y N N N
U14 RADEON HD 6750M Firefox 29 4096/4096 29/32 Y Y Y Y Y
U14 RADEON HD 6750M Chrome 35 4096/4096 29/32 Y Y Y Y N
U14 RADEON R3 Firefox 29 256/ 256 29/32 Y Y Y Y Y
U14 RADEON R3 Chrome 35 256/ 256 29/32 Y Y Y Y N
U14 Intel HD Graphics Firefox 29 4096/4096 16/32 Y Y Y Y Y
Uniform In/Out EInt VAO Ins DB sRGB
A42 S80 Adreno 330 Firefox 29 256/ 224 16/16 Y Y N N N
A42 S80 Adreno 330 Chrome 35 256/ 224 16/16 Y Y N N N
A44 S4P Adreno 320 Firefox 29 256/ 224 16/16 Y Y Y Y N
A44 S4P Adreno 320 Chrome 35 256/ 224 16/16 Y Y N N N
A44 T4 ULP GeForce72 Firefox 29 280/1024 16/15 N Y N N N
A44 T4 ULP GeForce72 Chrome 35 280/1024 16/15 N Y N N N
A44 E5 Mali-T604 Firefox 29 1024/1024 16/15 Y Y Y Y N
A41 K3 VivanteGC4000 Firefox 29 568/ 568 16/12 Y N N N N
A44 T3 ULP GeForce12 Firefox 29 256/1024 16/15 N N N N N
A44 T3 ULP GeForce12 Chrome 35 256/1024 16/15 N Y N N N
A42 OM4 PVR SGX540 Firefox 29 128/ 64 8/ 8 Y Y N N N
A41 R66 Mali-400MP4 Firefox 29 256/ 256 16/12 N N N N N
A40 S3 Adreno 220 Firefox 29 251/ 221 16/ 8 Y Y N N N
A23 S2 Adreno 205 Firefox 29 251/ 222 16 8 Y N N N N
Uniform = Vsh/Fsh
In/Out = Attribute/Varying
EInt = OES_element_index_uint (32bit index)
VAO = OES_vertex_array_object
Ins = ANGLE_instanced_array
DB = WEBGL_draw_buffers
sRGB = EXT_sRGB
基本的には GPU に依存しますが、さらにブラウザごとにフィルタがかかっている印象です。
Desktop Native では対応してるはずの機能もブラウザによっては無効となっています。
Mobile GPU はもともとこんな感じだったので、それほど驚きはないでしょう。
対応度のばらつきが大きく、最適化以外ではあまり積極的に利用しない方が良いことがわかります。
OpenGL ES 2.0 の要求レベルが低いためで、WebGL 2.0 が OpenGL ES 3.x
ベースになるならもう少し統一されるのではないでしょうか。
動作は遅いものの Firefox + WebGL は Android 2.3 時代の端末でも動作しました。
関連エントリ
・Emscripten C++/OpenGL ES 2.0 (6) Chrome の速度と IE11/Safari
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (5)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (4)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (3)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (2)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (1)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす 一覧