日別アーカイブ: 2013年7月25日

Android 4.3 と OpenGL ES 3.0

Android 4.3 がリリースされ OpenGL ES 3.0 対応になりました。
OpenGL ES 3.0 は OpenGL 3.x 世代に対応する API セットで、
DirectX では Direct3D 10 に相当します。

GeometryShader はないものの、ES 2.0 世代ではオプションだった多くの
項目が標準となり、PC 向け GPU と比べて機能差が無くなりつつあります。
また D3D10 (ShaderModel 4) 世代の大きな特徴として、データフォーマットの
拡大や GPU リソースの汎用化があげられます。
OpenGL ES 3.0 の登場は、描画以外の GPU 活用につながる
第一歩といえるかもしれません。

実際に Nexus 10 (Android 4.3) で試してみました。

GL_VERSION: OpenGL ES 3.0
GL_RENDERER: Mali-T604
GL_VENDOR: ARM
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00

API=300 Shader=300 (VConst=256 PConst=1024)
pconst=1024 vconst=256 vin=16 vout=15 ptex=16 vtex=16 combotex=32 maxrender=4096 maxtexsize=4096 cubetexsize=4096 viewdims=4096

Extension:
GL_EXT_debug_marker
GL_ARM_rgba8
GL_ARM_mali_shader_binary
GL_OES_depth24
GL_OES_depth_texture
GL_OES_depth_texture_cube_map
GL_OES_packed_depth_stencil
GL_OES_rgb8_rgba8
GL_EXT_read_format_bgra
GL_OES_compressed_paletted_texture
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_standard_derivatives
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_EGL_sync
GL_OES_texture_npot
GL_OES_vertex_half_float
GL_OES_required_internalformat
GL_OES_vertex_array_object
GL_OES_mapbuffer
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_rg
GL_EXT_texture_type_2_10_10_10_REV
GL_OES_fbo_render_mipmap
GL_OES_element_index_uint
GL_EXT_shadow_samplers
GL_KHR_debug
GL_EXT_occlusion_query_boolean
GL_EXT_blend_minmax
GL_EXT_discard_framebuffer
GL_OES_get_program_binary
GL_OES_texture_3D
GL_EXT_texture_storage
GL_EXT_multisampled_render_to_texture
GL_OES_surfaceless_context
GL_ARM_mali_program_binary

Precision:
 0: [15 15] 10
 1: [15 15] 10
 2: [127 127] 23
 3: [15 14] 0
 4: [15 14] 0
 5: [31 30] 0
 6: [15 15] 10
 7: [15 15] 10
 8: [127 127] 23
 9: [15 14] 0
10: [15 14] 0
11: [31 30] 0

TextureFormat
00=8b90  GL_PALETTE4_RGB8_OES
01=8b91  GL_PALETTE4_RGBA8_OES
02=8b92  GL_PALETTE4_R5_G6_B5_OES
03=8b93  GL_PALETTE4_RGBA4_OES
04=8b94  GL_PALETTE4_RGB5_A1_OES
05=8b95  GL_PALETTE8_RGB8_OES
06=8b96  GL_PALETTE8_RGBA8_OES
07=8b97  GL_PALETTE8_R5_G6_B5_OES
08=8b98  GL_PALETTE8_RGBA4_OES
09=8b99  GL_PALETTE8_RGB5_A1_OES
10=8d64  GL_ETC1_RGB8_OES
11=9274  GL_COMPRESSED_RGB8_ETC2
12=9275  GL_COMPRESSED_SRGB8_ETC2
13=9278  GL_COMPRESSED_RGBA8_ETC2_EAC
14=9279  GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
15=9276  GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
16=9276  GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
17=9270  GL_COMPRESSED_R11_EAC
18=9272  GL_COMPRESSED_RG11_EAC
19=9271  GL_COMPRESSED_SIGNED_R11_EAC
20=9273  GL_COMPRESSED_SIGNED_RG11_EAC

新しい Texture format ETC2/EAC が使えるようになっています。
ASTC はありませんでした。
core 機能が大幅に増えているため Extension 自体は控えめです。
下記ページで ES 2.0 と比べることができます。

CPU/GPU OpenGL ES Extension (Mobile GPU)

Android NDK が更新されていないので今のところ Java API のみとなっているようです。
OpenGL ES 3.0 は OpenGL ES 2.0 と互換性があるので 3.0 の context 上でも
ES 2.0 の NDK アプリケーションがそのまま動作しました。

API に互換性はあるものの、GLSL ES 1.0 と GLSL ES 3.0 では shader の書式が
異なっています。
OpenGL ES 2.0 (GLSL ES 1.0) 用であることを明確に宣言するには shader の
先頭に “#version 100” を追加しておきます。

同様に Nexus 7 にも Android 4.3 を入れてみましたが、
Tegra3 なのでやはり OpenGL ES 3.0 は動きませんでした。

おそらく現時点入手で可能な端末に使われていて OpenGL ES 3.0 対応と思われる
GPU は下記の通りです。

・Snapdragon S4 Pro APQ8064 Adreno 320
・Snapdragon 600 APQ8064T Adreno 320
・Exynos 5 Dual (5250) ARM Mali-T604

関連エントリ
VIDIA Tegra4 の OpenGL ES 2.0 Extension
OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
OpenGL ES 3.0 / OpenGL 4.3 ETC2 テクスチャ圧縮の比較
OpenGL ES 3.0 と Shader Model の関係、まとめ wiki の更新
OpenGL ES 3.0 と OpenGL ES 2.0 の互換性
OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
OpenGL ES 2.0/3.0 Emulator
OpenGL 4.3 と GL_ARB_ES3_compatibility