OpenGLによる描画
2013-11-03


正確にいうと、OpenGL ES 2.0になりますか。
よくあるサンプルですが、三角形ポリゴンを表示してみることにします。

と、その前に
・描画全体の初期化など、共通の処理
・アプリ毎の処理
を区別するために、今のうちにソースを分けておきます。

jni
 ├ sys
 │ ├ common.h         いろいろ共通事項のヘッダ
 │ ├ SysMain.cpp       native側のメイン処理
 │ ├ Renderer.h        描画管理クラスヘッダ
 │ ├ Renderer.cpp     描画管理クラスソース
 ├ def.h                     アプリの定義
 └ AppMain.cpp          アプリのメイン処理

SysMain.cpp

#include "common.h"
#include "Renderer.h"


using namespace sys;


extern "C"
{
JNIEXPORT void JNICALL          Java_sys_BaseActivity_initNative(JNIEnv*, jobject, jint, jint);
JNIEXPORT jboolean JNICALL      Java_sys_BaseActivity_updateNative(JNIEnv*, jobject);
}

void    init_app(void);                 // メイン初期化
Bool    update_app(void);               // メイン稼働

/************
    初期化
 ************/
JNIEXPORT void JNICALL  Java_sys_BaseActivity_initNative(JNIEnv* env, jobject, jint width, jint height)
{
        LOGI("initNative (%d, %d)", width, height);

        Renderer::init(width, height);                          // 描画管理初期化

        init_app();                                                                     // アプリメイン初期化
}

/**********
    稼働
 **********/
JNIEXPORT jboolean JNICALL      Java_sys_BaseActivity_updateNative(JNIEnv*, jobject)
{
        Renderer::update();                                                     // 描画管理稼働

        if ( update_app() ) {                                           // アプリメイン稼働
                return  JNI_TRUE;
        }
        return  JNI_FALSE;                                                      // アプリ終了
}

/**************** End of File *************************************************/

native側のメイン処理、java側から呼ばれる initNativeや updateNativeは、ここに移しました。
見ての通り初期化とフレーム毎の稼働で、描画管理とアプリの処理をそれぞれ呼んでいるだけです。

Renderer.h
#ifndef ___RENDERER_H___
#define ___RENDERER_H___

#include "common.h"

#include &ltGLES2/gl2.h>
#include &ltGLES2/gl2ext.h>


namespace sys
{

/************************
    シェーダプログラム
 ************************/
struct ShaderProgram
{
        GLuint  program;                        // プログラムオブジェクト
        GLint   position;                       // 座標
        GLint   color;                          // カラー
        GLuint  projection;                     // 透視変換

                ShaderProgram(void)                                     // コンストラクタ
                {
                        program = 0;
                }
                ~ShaderProgram()                                        // デストラクタ
                {
                        quit();
                }
        void    init(GLuint, GLuint);                   // 初期化
        void    use(const GLfloat*);                    // 使用
        void    quit(void);                                             // 終了
};

/**************
    描画管理
 **************/
class Renderer
{
private :

        static void             initShader(void);                                       // シェーダ初期化
        static GLuint   loadShader(GLenum, const char*);        // シェーダ作成

public :

        static ShaderProgram*   shader;                                         // シェーダプログラム
        static float                    mat_projection[4*4];            // 透視変換行列

        static void             init(int, int);                                         // 初期化
        static void             quit(void);                                                     // 終了
        static void             update(void);                                           // 稼働
        static ShaderProgram*   use_shader(void);                       // シェーダ使用
};

}

#endif
/********************* End of File ********************************/


続きを読む

[Android プログラミング]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット