連載
» 2010年01月08日 00時00分 公開

はじめよう3D描画、BREWでOpenGL ESプログラミング“BREW”アプリケーション開発入門(6)(3/3 ページ)

[末永貴一(エイチアイ),@IT MONOist]
前のページへ 1|2|3       

EGLインターフェイスのクリーンアップ

 以上、EGLインターフェイスのセットアップについて紹介しました。それでは、EGLインターフェイスのクリーンアップを実装しましょう。

 クリーンアップ処理は、セットアップとは逆の手順で行うため、以下のようになります。

  1. カレントコンテキストをクリア 
    ・IEGL_eglMakeCurrent(IEGL, Display, draw, read, context)
  2. EGLコンテキストの解放 
    ・IEGL_eglDestroyContext(IEGL, Display, context)
  3. EGLサーフェイスの解放 
    ・IEGL_eglDestroySurface (IEGL, Display, surface)
  4. EGLディスプレイの解放 
    ・IEGL_eglTerminate(IEGL)

 以上の手順に従って、BREW環境でのEGLクリーンアップを記述すると、以下のようになります。

void cleanup(oes3d* pMe){
        // 1. カレントコンテキストをクリア
        IEGL_eglMakeCurrent (pMe->m_pIEGL, EGL_NO_DISPLAY,
                             EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
        // 2. EGLコンテキストの解放
        IEGL_eglDestroyContext (pMe->m_pIEGL, pMe->m_eglDisplay, pMe->m_eglContext);
        pMe->m_eglContext = NULL;
        // 3. EGLサーフェイスの解放
        IEGL_eglDestroySurface (pMe->m_pIEGL, pMe->m_eglDisplay, pMe->m_eglSurface);
        pMe->m_eglSurface = NULL;
        // 4. EGLディスプレイの解放
        IEGL_eglTerminate (pMe->m_pIEGL, pMe->m_eglDisplay);
        pMe->m_eglDisplay = NULL;
        // IEGL の解放
        IEGL_Release (pMe->m_pIEGL);
        pMe->m_pIEGL = NULL;
        // IGL の解放
        IGL_Release (pMe->m_pIGL);
        pMe->m_pIGL = NULL;
}
ソース2 EGLクリーンアップの記述

 BREW環境では、「IEGL」「IGL」の解放も必要になります。以上のセットアップ、クリーンアップの処理により、EGLの設定部分は完了です。

固定小数点(Fixed point)の変換

 3Dグラフィックスでは、小数点を扱うことになりますが、前述したように今回の環境はCommon Lite Profileになるため、固定小数点を使う必要があります。そのため、浮動小数点を固定小数点に変換する機能を別途実装する必要があります。

 以下では、単純に浮動小数を固定少数に変換する機能としてfloat値を16bitシフトした値をint型(32bit)に格納するマクロを実装しています。

#define f16(X)                ((int32) ((X) * 65535)) 

OpenGL ESでの三角形描画

 それでは、OpenGL ESを使った描画について見ていきましょう。

 今回は、3Dの導入として、背景の塗りつぶしと簡単な三角形の描画を実装したいと思います。なお、OpenGL ESは、描画データである頂点情報を頂点配列という形で送る実装を行います。

※注4:基本的にOpenGL ESには、OpenGLのような「イミディエイトモード(即時実行)」のプログラミングスタイルではないので、「glBegin()」「glEnd()」のような記述は行いません。


void drawGL(oes3d* pMe){
        // 頂点配列
        GLfixed pfVertices[] = { f16(-.4f), f16(-.4f), f16(0),
                                 f16(0.4f), f16(-.4f), f16(0),
                                 f16(0), f16(0.4f), f16(0) };
        // カラー配列
        GLfixed pfColors[] = { f16(1.0f), f16(1.0f), f16(0.66f), f16(1.0f),
                               f16(1.0f), f16(1.0f), f16(0.66f), f16(1.0f),
                               f16(1.0f), f16(1.0f), f16(0.66f), f16(1.0f) };
        // 背景の塗りつぶし
        IGL_glClearColorx(pMe->m_pIGL, f16(0.6f), f16(0.8f), f16(1.0f), f16(1.0f));
        IGL_glClear(pMe->m_pIGL, GL_COLOR_BUFFER_BIT);
        // 頂点配列の設定
        IGL_glEnableClientState(pMe->m_pIGL, GL_VERTEX_ARRAY);
        IGL_glVertexPointer(pMe->m_pIGL, 3, GL_FIXED, 0, pfVertices);
        // カラー配列の設定
        IGL_glEnableClientState(pMe->m_pIGL, GL_COLOR_ARRAY);
        IGL_glColorPointer(pMe->m_pIGL, 4, GL_FIXED, 0, pfColors);
        // 三角形の描画(glDrawArrays(プリミティブの種類、スタート地点、必要な頂点の数) )
        IGL_glDrawArrays(pMe->m_pIGL, GL_TRIANGLES, 0, 3);
        // 画面更新
        IEGL_eglSwapBuffers(pMe->m_pIEGL, pMe->m_eglDisplay, pMe->m_eglSurface);
} 
ソース3 簡単な三角形の描画

 関数宣言と「EVT_APP_START」などの適当なイベント部分に、セットアップ、描画、クリーンアップの関数をそれぞれ実装しておきます。

void drawGL(oes3d* pMe); 
     case EVT_APP_START:                        
        if(setup(pMe) == TRUE){
            drawGL(pMe);
        }
        cleanup(pMe); 
実行結果 図4 実行結果

 最初の頂点配列とカラー配列は、描画する三角形の頂点情報と色情報になります。基本的に、これらの情報は小数点で表現されるのですが、これを前述のマクロで固定小数点に変換し、「GLfixed」の配列に格納しています。

 「IGL_glClearColorx()」「IGL_glClear()」で指定した背景色による塗りつぶしを行い、次に、「IGL_glEnableClientState()」でOpenGL ESのステートを「GL_VERTEX_ARRAY」に変更します。この部分が、前述したステートマシンといわれる部分になります。このように、状態(ステート)を変更しながら描画処理を記述していくのが、OpenGL ESプログラミングの特徴だといえます。ステートを頂点配列に変更したら、「IGL_glVertexPointer()」で頂点配列を渡します。同様に、カラー配列もステートを「GL_COLOR_ARRAY」に変更し、「IGL_glColorPointer()」で渡すことによってデータがセットされます。

 最後に、「IGL_glDrawArrays()」に対し、「GL_TRIANGLES」で三角形描画を指定します。そして、最終的には、「IEGL_eglSwapBuffers()」でネイティブ描画ターゲットに対して描画が行われます。



 今回は、OpenGL ESプログラミングを行うための準備とEGLインターフェイスの設定、そして、簡単なOpenGL ESでの3D描画を行いました。「えっ、あの三角形が3D?」という声が聞こえてきそうなので、次回はもう少しOpenGL ESについて解説し、3Dらしい描画にチャレンジしたいと思います。ご期待ください!(次回に続く)

補足:通常のOpenGL ESの関数を使いたい場合

 今回は、BREW上で直接OpenGL ESプログラミングを行いましたが、今回のような使い方だと、関数の前に「IGL_」や「IEGL_」が付いてしまったり、関数の第1引数に「IGL」「IEGL」インターフェイスを設定しなければならないなど、標準のOpenGL ESとは違った部分が存在してしまいます。

 実は、こうした異なる部分を省略して、標準のOpenGL ESのプログラミングができるツールが「BREW OpenGL ES Extension」に用意されています。

 ただし、ツールといっても、ラッパー関数とヘッダーが用意されているだけですので、それらをプロジェクトに入れれば準備完了です。

 具体的には、OpenGL ES Extensionをインストールした後であれば、%BREW_SDK%\sdk\srcにある「GL.c」と%BREW_SDK%\sdk\incにある「IGL.h」をプロジェクトに任意に追加して、「IGL」「IEGL」インターフェイスのインスタンス生成を行い、そのポインタを「IGL_Init()」「IEGL_Init()」で初期化するだけです。

#include "IGL.h"
(中略)
ISHELL_CreateInstance (pMe->a.m_pIShell, AEECLSID_GL, (void **)&pMe->m_pIGL);
IGL_Init (pMe->m_pIGL);
ISHELL_CreateInstance( pMe->a.m_pIShell, AEECLSID_EGL, (void **)&pMe->m_pIEGL) ;
IEGL_Init( pMe->m_pIEGL ); 

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.