2012-11-12 53 views
1

我很困擾從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和它工作正常,除了位圖導入。

我會很感激任何幫助。

在此先感謝。

回答

0
glReadPixels(0, 0, 400, 400, GL_RGB, GL_UNSIGNED_BYTE, &pixs); 

PIX& PIX:(沒有 「&」 - 否則它被局部變量的地址不是一個指針到像素數據)

glReadPixels(0, 0, 400, 400, GL_RGB, GL_UNSIGNED_BYTE, pixs);