OpenGL ES 1.0 レンダリングからのビットマップの取得に問題があります。グラフィックスのレンダリングは Android NDK で行い、ビットマップを Android Java で表示したいと考えています。glReadPixels 関数を使用する必要があることはわかっています。
NDK の bitmap-plasma サンプルに示されているように、Bitmap オブジェクトを NDK に渡して変更しようとしましたが、「GL_INVLID_EXCEPTION」というエラーが発生し、ビットマップはそのままです。ABGR ビットマップと組み合わせてみましたが、成功しませんでした。私のコードがあります:
void Java_com_example_polygonmap_PolygonMapyActivity_ndkOpenGLInit( JNIEnv* env, jobject obj, jobject bitmap ) {
AndroidBitmapInfo info;
int ret;
GLvoid* pixs;
if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {
LOGI("AndroidBitmap_getInfo() failed ! error=%d", ret);
return;
}
if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixs)) < 0) {
LOGI("AndroidBitmap_lockPixels() failed ! error=%d", ret);
}
glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
glShadeModel( GL_FLAT );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
///
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glViewport( 0, 0, 400, 400 );
glOrthof( 0.0f, (float)400, 0.0f, (float)400, -1.0f, 1.0f );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnableClientState( GL_VERTEX_ARRAY );
glDisable( GL_TEXTURE_2D );
///
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glDisable( GL_TEXTURE_2D );
glVertexPointer(2, GL_FLOAT, 0, polygon[0]);
glColor4f(0.0f,0.0f,1.0f,1.0f);
glDrawArrays( GL_LINE_LOOP, 0, 3 );
glDisableClientState(GL_VERTEX_ARRAY);
glReadPixels(0, 0, 400, 400, GL_RGB, GL_UNSIGNED_BYTE, &pixs);
////
AndroidBitmap_unlockPixels(env, bitmap);
glReadPixels を使用して独自の unsigned char 配列を読み取り、それを Java に渡し、ここで配列からビットマップを作成するという別のアプローチを試しました。これでピクセル読み込みで例外が返されなくなりましたが、bytearray を解析してビットマップにしようとしたときに問題が発生したため、その方法も失敗しました。コードはほとんど同じですが、ビットマップの初期化とわずかに異なるピクセル読み取り部分はありません。
jbyteArray Java_com_example_polygonmap_PolygonMapyActivity_ndkOpenGLInit( JNIEnv* env, jobject obj)
{
void* pixs;
unsigned char ch[256*256*4];
glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
glShadeModel( GL_FLAT );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
///
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glViewport( 0, 0, 256, 256 );
glOrthof( 0.0f, (float)256, 0.0f, (float)256, -1.0f, 1.0f );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnableClientState( GL_VERTEX_ARRAY );
glDisable( GL_TEXTURE_2D );
///
glClear( GL_COLOR_BUFFER_BIT);
glDisable( GL_TEXTURE_2D );
glVertexPointer(2, GL_FLOAT, 0, polygon[0]);
glColor4f(1.0f,0.0f,0.0f,1.0f);
glDrawArrays( GL_LINE_LOOP, 0, 3 );
glDisableClientState(GL_VERTEX_ARRAY);
glReadPixels(0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, &pixs);
jcharArray jch = (*env)->NewCharArray(env, 256*256*4);
(*env)->SetCharArrayRegion(env, jch, 0 , 256*256*4, &ch);
ビットマップ Java コードへの bytearray は次のとおりです。
Bitmap b = BitmapFactory.decodeByteArray(ch.toString().getBytes(), 0 , ch.toString().getBytes().length);
私のレンダリングは、ネイティブ c で実装された GLSurfaceView で行われ、ビットマップのインポートを除いて正常に動作しています。
何か助けていただければ幸いです。
前もって感謝します。