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 のサンプリング命令も変わります。