2013/07/31
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 が割り当てられるかどうかだけだと思うのですが、
きちんと把握していなかったのでこの辺りの挙動はもう少し詳しく調べたいと
思っています。
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 が割り当てられるかどうかだけだと思うのですが、
きちんと把握していなかったのでこの辺りの挙動はもう少し詳しく調べたいと
思っています。
2013/07/26
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) エラーが出るようです。
cdefs_elf.h の _C_LABEL_STRING の定義中 "_" と x の間にスペースを入れると
回避出来ます。
cdefs_elf.h は下記 3箇所にあります。
関連エントリ
・Android 4.3 と OpenGL ES 3.0
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
2013/07/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) で試してみました。
新しい 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
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
2013/07/21
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 なら表示できることが
わかりました。
何か使い方のルールが変わったのかもしれません。
表示されなくなっていたのでしばらく悩みました。
2013 まではそのまま出ていたと思ったのですが、helloWorldCmd などの
サンプルを動かしても何も表示されないようです。
mental ray など Output Window に出力できている plug-in もあるので
API の使い方に問題があったのかもしれません。
いろいろ試したところ、stdout は出ませんが stderr なら表示できることが
わかりました。
何か使い方のルールが変わったのかもしれません。