我很困扰从OpenGL ES 1.0渲染中检索位图。图形渲染在Android NDK中完成,我想在Android Java中显示位图。我知道我必须使用glReadPixels函数。Android NDK OpenGL ES向Java位图呈现图形
我试过将Bitmap对象传递给NDK并对其进行修改,因为它显示在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,它传递给Java和这里从阵列创建位图。现在像素读取不会返回任何异常,但是当尝试将bytearray解析为位图时遇到了麻烦,所以这种方式也失败了。代码是非常mutch一样的,但是没有位图初始化和略有不同的像素阅读部分:
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);
这里是ByteArray的位图Java代码:
Bitmap b = BitmapFactory.decodeByteArray(ch.toString().getBytes(), 0 , ch.toString().getBytes().length);
我的渲染在本机上GLSurfaceView完成与实现C和它工作正常,除了位图导入。
我会很感激任何帮助。
在此先感谢。