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

OpenGL ES 3.0 と Vertex Array Object

OpenGL ES 3.0 は OpenGL 3.x に相当します。
DirectX でいえば Direct3D 10 相当で、この時期に API も GPU 機能も大きな
仕様変更がありました。

Direct3D 11 は今でこそ Mobile 向けの用途もあって、Direct3D 9 相当の GPU
でも使えるよう API が拡張されています。
ですが Vista と共にリリースされた Direct3D 10.0 は GPU も API も
下位互換性が無く D3D10 対応 GPU 以外では使えませんでした。

GPU 年表

Direct3D 10 から少々遅れて OpenGL 3.x でも大きな変更が入っています。
Direct3D ほど極端ではありませんが、徐々にレガシー機能を排除して API の
古い仕様が置き換えられていきました。
従来のアプリは互換性用の Compatible Profile を選択することで対応可能と
なっています。

両者ともに Desktop 向け GPU では互換性より新機能を重視していたのですが、
その後 Mobile 向けの用途が広がったことで方向性が変わってきたようです。
Direct3D 11 では制限付きながら FeatureLevel で下位互換性が復活しています。

OpenGL ES 3.0 では今回、OpenGL 3.0 で捨てたはずの互換性が維持されたままの
上位互換となっています。
そのため OpenGL 2.x (GLES 2.0) 世代の命令が OpenGL 3.0 ではエラーに
なるが、OpenGL ES 3.0 ではエラーにならないことがあるようです。

その一つが Vertex Array Object (VAO) です。
OpenGL 3.0 では VAO を Bind していない (default object == 0) 場合の
glVertexAttributePointer() がエラーに
なりますが OpenGL ES 3.0 では OpenGL ES 2.0 と同じように通ります。

OpenGL でも GPU の Driver によっては Core Profile でもレガシー API を
混在できるものがあるので、エラー判定の範囲が違うだけなのかもしれません。

0 の時に default object が割り当てられるかどうかだけだと思うのですが、
きちんと把握していなかったのでこの辺りの挙動はもう少し詳しく調べたいと
思っています。

Android 4.3 Android NDK r9

Android NDK r9 がリリースされています。
Android 4.3 (API Level 18) の OpenGL ES 3.0 が使えるようになりました。

toolchain も更新されており、少々問題がありました。
C++11 を有効にしている場合 (-std=c++11) エラーが出るようです。

android-ndk-r9/platforms/android-18/arch-arm/usr/include/sys/cdefs_elf.h:35:28:
error: invalid suffix on literal; C++11 requires a space between literal
and identifier [-Werror=literal-suffix]
 #define _C_LABEL_STRING(x) "_"x
                            ^

cdefs_elf.h の _C_LABEL_STRING の定義中 “_” と x の間にスペースを入れると
回避出来ます。

 #define _C_LABEL_STRING(x) "_" x

cdefs_elf.h は下記 3箇所にあります。

android-ndk-r9/platforms/android-18/arch-arm/usr/include/sys
android-ndk-r9/platforms/android-18/arch-mips/usr/include/sys
android-ndk-r9/platforms/android-18/arch-x86/usr/include/sys

関連エントリ
Android 4.3 と OpenGL ES 3.0

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

Maya 2014 の Output Window と stderr

Maya 2014 (Windows 8 x64) で plug-in のログ出力が Output Window に
表示されなくなっていたのでしばらく悩みました。

2013 まではそのまま出ていたと思ったのですが、helloWorldCmd などの
サンプルを動かしても何も表示されないようです。
mental ray など Output Window に出力できている plug-in もあるので
API の使い方に問題があったのかもしれません。

いろいろ試したところ、stdout は出ませんが stderr なら表示できることが
わかりました。
何か使い方のルールが変わったのかもしれません。