正確にいうと、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 <GLES2/gl2.h>
#include <GLES2/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 ********************************/
セコメントをする