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