2011-07-25 80 views
3

我正在使用openGL ES 2.0創建動態壁紙。 該應用程序在我的Nexus One的偉大工程,但它並不沒有表現出一臺Nexus S.Nexus S中的glError 1282但不支持Nexus One

事情到目前爲止,我還測試了什麼:

  • 我已經檢查this question。我的紋理是128x128,所以我想這不是問題。

  • 我在代碼中使用了checkGlError方法,我發現它通過了onSurfaceCreatedonSurfaceChanged沒有問題。如果我在onDrawFrame()方法的第一行中調用它,該方法會拋出異常。

checkGlError代碼如下:

private void checkGlError(String op) { 
    int error; 
    while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) { 
     Log.e(TAG, op + ": glError " + error); 
     throw new RuntimeException(op + ": glError " + error); 
    } 
} 

我注意到,在這兩種設備發生錯誤,但它會在Nexus S的關鍵,而它繪製在Nexus One的罰款。我的猜測是着色器編譯不正確,那裏有一個問題。

你知道鏈接S和鏈接之間的其他不兼容嗎? 有沒有調試着色器代碼的方法?

回答

0

在結束我的問題涉及到this question

從資源中讀取時,Android調整了我的紋理。我解決它從原始文件夾讀取紋理:

public void loadBitmap(int resourceId) { 

     textureId = resourceId; 

     /* Get the texture */ 
     InputStream is = mContext.getResources().openRawResource(textureId); 
     Bitmap bitmap; 

     try { 
      bitmap = BitmapFactory.decodeStream(is); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       // Ignore. 
      } 
     } 

     int width = bitmap.getWidth(); 
     int height = bitmap.getHeight(); 

     Buffer data = ByteBuffer.allocateDirect(width * height * 4); 
     bitmap.copyPixelsToBuffer(data); 
     data.position(0); 

     // Bind the texture object 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures.get(0)); 
     ... 
     // OpenGL stuff 
     ... 
    } 
1

您是否知道nexus S與nexus one之間的其他不兼容性?

不是我所知道的,儘管肯定有OpenGL ES驅動程序不同於電話的可能性。

有沒有調試着色器代碼的方法?

我還沒有嘗試着色器自己,但不過,我可以在我的GLSurfaceView上定期檢查平移,旋轉等,調試

嘗試設置此您GLSurfaceView和檢查,如果你能看到logcat的變化:

mGLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR 
    | GLSurfaceView.DEBUG_LOG_GL_CALLS);