日別アーカイブ: 2013年11月26日

Android 4.4 Adreno 320 の OpenGL ES 3.0 と Version 判定

Android 4.3 で OpenGL ES 3.0 が導入されましたが、Adreno 320 では
一部動作に問題がありました。
具体的には Uniform Block を使用すると glLinkProgram でエラーが発生します。
Android 4.4 ではこの問題が直っており、正しく動作することが確認できました。
GPU のドライバが更新されたためだと考えられます。

以前の症状について詳しくは こちら

# Nexus 7 (2013) Android 4.3
GL_VERSION: OpenGL ES 3.0 V@14.0
GL_RENDERER: Adreno (TM) 320
GL_VENDOR: Qualcomm
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00
# Nexus 7 (2013) Android 4.4
GL_VERSION: OpenGL ES 3.0 V@53.0 AU@  (CL@3776187)
GL_RENDERER: Adreno (TM) 320
GL_VENDOR: Qualcomm
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00

他にも glIntergerv() (Query) の値など修正が入っているようです。

CPU/GPU OpenGL ES Extension (Mobile GPU)

OpenGL ES 3.0 が動くデバイスもかなり増えてきました。
Android 4.4 なら Nexus 7 (2013) が使えるので、動作確認は比較的容易に
なったのではないかと思います。

ただ実際のアプリケーションでは、確実に OS が更新されるとわかっている
Nexus 以外で利用するのは正直厳しいと言えます。

他にも OpenGL ES 3.0 が使えるかどうかの判定がうまくいかないことがあります。

OpenGL ES : Checking OpenGL ES Version

GPU によっては 3.0 を渡して Context を作ってもエラーにならず、
OpenGL ES 1.1 の Context を返すものがあります。
(おそらくドライバが 2.0 かそれ以外で判別している)

2番目の Version 番号を使う方法は Android ではうまくいきます。
Nexus 10, Nexus 7 (2013) ともに 2.0 context を作っても GL_VERSION は
3.0 を返すためです。
ただし iOS や PC では作成した context と同じバージョン文字列を返すので
少々不自然な気もします。

関連エントリ
iPhone 5s の Apple A7 GPU
Adreno 320 の OpenGL ES 3.0 と Uniform Block
Nexus 7 (2013) の Adreno 320 と OpenGL ES 3.0 (Android 4.3)