OpenGL ES 2.0 は必要な機能のみ用意されているため非常にわかりやすくなっています。
レガシーだけど互換性のために残っている API が、ほとんど無いからです。
定期的に仕様をゼロから作り直す DirectX に似ているといえるかもしれません。
複数の描画方法が残っていると、どれを使えばよいのかわからなくなることがあります。
OpenGLES 2.0 では悩むことが少なくて済みました。
モバイル向けサブセットであり仕様を割り切っていること、ShaderModel 3.0 相当の
シェーダーが利用可能なことから、OpenGL の入門としても参考になりました。
PC 上でも OpenGL ES 2.0 Emulator を使えば全く同じ API を使うことが出来ます。
・AMD Developer Central GPU Tools
・Imagination PowerVR Insider
この両者、初期化がわずかに異なるだけで dll 名も一緒。全く同じように使えるようです。
コードを共有化する場合、NativeWindowType でどちらを使っているか判断できます。
#include#include #include #ifdef NativeWindowType # define USE_GLES20_AMD 1 #else # define USE_GLES20_PVR 1 # include #endif
初期化の違いもこれだけです。
#if USE_GLES20_AMD static const EGLint attrib[]= { EGL_RED_SIZE, 5, EGL_GREEN_SIZE, 6, EGL_BLUE_SIZE, 5, EGL_ALPHA_SIZE, 0, EGL_DEPTH_SIZE, 16, EGL_STENCIL_SIZE, 0, EGL_SAMPLES, 4, EGL_NONE }; egl_Display= eglGetDisplay( EGL_DEFAULT_DISPLAY ); #else // PVR static const EGLint attrib[]= { EGL_LEVEL, 0, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NATIVE_RENDERABLE, EGL_FALSE, EGL_DEPTH_SIZE, EGL_DONT_CARE, EGL_NONE }; hDC= GetDC( hWnd ); egl_Display= eglGetDisplay( hDC ); #endif EGLint majorv= 0; EGLint minorv= 0; eglInitialize( egl_Display, &majorv, &minorv ); EGLint configs= 0; eglGetConfigs( egl_Display, NULL, 0, &configs ); eglChooseConfig( egl_Display, attrib, &egl_Config, 1, &configs ); egl_Surface= eglCreateWindowSurface( egl_Display, egl_Config, hWnd, NULL ); static const EGLint attrlist[]= { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; egl_Context= eglCreateContext( egl_Display, egl_Config, EGL_NO_CONTEXT, attrlist ); eglMakeCurrent( egl_Display, egl_Surface, egl_Surface, egl_Context );
PC では本来の OpenGL が使えるので、3D を描画する目的でわざわざ Emulator を使う
必要はないです。元々 GL ES 自体がサブセットであり OpenGL でほぼ同じ API が使えます。
今回いろいろ試しているのも手持ちの描画エンジンを様々なプラットフォームで
そのまま動くようにしているから。
GLSL に mat4x3 が無いとかバイナリ形式の扱いとか多少機能不足もありますが
その辺は何とでもなります。Direct3D Mobile がなかなか更新されないので、
Mobile 向け API は GL ES 2.0 で統一してくれた方が良いですね。
Direct3D11 (DirectX11) に慣れすぎたせいで、ついリソース生成をサブスレッドで
実行してしまいます。リソースの生成は描画と同じメインスレッドで無いと失敗します。
関連エントリ
・OpenGL ES 2.0
・OpenGLES2.0 DDS テクスチャを読み込む
・OpenGLES2.0 Direct3D とのフォーマット変換
・OpenGLES 2.0 頂点フォーマットの管理
・OpenGLES2.0 の頂点
・OpenGLES2.0 D3D座標系
・OpenGLES2.0 シェーダー管理