日別アーカイブ: 2012年8月17日

OpenGL ES 3.0 と OpenGL ES 2.0 の互換性

OpenGL ES 3.0 は OpenGL ES 2.0 との上位互換性が保たれています。
まだ GL 4.3 の GL_ARB_ES3_compatibility と Mali/Adreno Emulator で
試しているだけですが、OpenGL ES 3.0 上で今までのソースコードも
シェーダーも 2.0 のまま変更なしに動いています。
OpenGL ES 3.0 は OpenGL ES 2.0 の実行環境の一つとして利用できそうです。

OpenGL ES 3.0 対応のため EGL の初期化は若干変更しています。
EGL_CONTEXT_CLIENT_VERSION に 3 を渡しています。
Mali のドキュメントでは EGL_OPENGL_ES3_BIT を使っていますが、
定義が見つからなかったため EGL_OPENGL_ES2_BIT のまま使用しました。

GLSL のシェーダーバージョン対応は下記のとおりです。

                 GLSL     shader 内の指定
-----------------------------------------------------------
OpenGL ES 2.0    1.0      #version 100
OpenGL 2.0       1.1      #version 110
OpenGL 2.1       1.2      #version 120

OpenGL 3.0       1.3      #version 130
OpenGL 3.1       1.4      #version 140
OpenGL 3.2       1.5      #version 150 [core/compatibility]
OpenGL ES 3.0    3.0      #version 300 es
OpenGL 3.3       3.3      #version 330 [core/compatibility]
OpenGL 4.0       4.0      #version 400 [core/compatibility]
OpenGL 4.1       4.1      #version 410 [core/compatibility]
OpenGL 4.2       4.2      #version 420 [core/compatibility]
OpenGL 4.3       4.3      #version 430 [core/compatibility/es]

番号が重なっていないためバージョンの数値だけでもすべて区別可能です。
shader の 1行目に #version が存在しない場合、OpenGL では 1.1 とみなします。
OpenGL ES では 1.0 とみなすことになっています。

バージョン番号の後に profile を指定できるようになったのは 1.5 からです。
OpenGL 4.3 では core, compatibility の他に es も加えられています。
実際に OpenGL 4.3 の context のまま “#version 300 es” を指定しても
コンパイルは通りました。

OpenGL 3.0 以後と以前でシェーダーの書き方が変わります。
OpenGL ES 3.0 も OpenGL 3.x 以降と同じ記述方法になりました。
共存させるために下記のようなヘッダを用いています。

// Vertex Shader
#ifdef GL_ES
# define LOWP       lowp
# define MEDIUMP    mediump
# define HIGHP      highp
precision HIGHP float;
#else
# define LOWP       
# define MEDIUMP    
# define HIGHP      
#endif

#if __VERSION__ < 130
# define IN         attribute
# define OUT        varying
#else
# define IN         in
# define OUT        out
#endif
// Vertex Shader
#ifdef GL_ES
# define LOWP       lowp
# define MEDIUMP    mediump
# define HIGHP      highp	
precision MEDIUMP float;
#else
# define LOWP
# define MEDIUMP
# define HIGHP
#endif

#if __VERSION__ < 130
# define IN     varying
# define        out_FragColor  gl_FragColor
#else
# define IN     in
out vec4        out_FragColor;
#endif

上記以外に texture のサンプリング命令も変わります。