2016-06-21 103 views
2

大家好〜我想讓屏幕顯示我們觸摸的像素是什麼顏色,然後我使用GLES20.glReadPixels如下。如logcat所示,無論我點擊哪個位置,它總是讀取0 0 0 0。我也根據屏幕的寬度和高度更改了索引,但仍然全部爲零。我知道這應該很容易,但我真的不知道如何解決它。有人可以幫我一把嗎?非常感謝!GLES20.glReadPixels在android中得到全零位

public String getFace(float angleX, float angleY, float positionX, float positionY){ 
    String toast = "other"; 
    int tempX = Math.round(positionX); 
    int tempY = Math.round(positionY); 
    ByteBuffer ss = ByteBuffer.allocate(4); 
    ss.order(ByteOrder.nativeOrder()); 
    GLES20.glFlush(); 

    //Get Screen's width and height 
    DisplayMetrics displaymetrics = new DisplayMetrics(); 
    ((Activity) getContext()).getWindowManager() 
      .getDefaultDisplay() 
      .getMetrics(displaymetrics); 
    int height = displaymetrics.heightPixels; 
    int width = displaymetrics.widthPixels; 
    int X = tempX; 
    int Y = height-tempY; 

    //Here it's 
    GLES20.glReadPixels(X, Y, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ss); 
    byte b[] = new byte[4]; 
    ss.get(b); 
    String key = "" + b[0] + " " + b[1] + " " + b[2] + " " + b[3]; 
    Log.d("Color: ", key); 
    ss.rewind(); 
    Log.d("DEBUG", "X:"+ X + " Y:" + Y); 
    Log.d("DEBUG", "w:"+ width + " h:" + height); 
     if (key = ' 1 0 0 1') { 
      toast = "Face Red"; 
     } else { 
      toast = "other"; 
     } 

    return toast; 
} 

回答

1

現在,我知道問題在哪裏了!因爲我有一個MyRenderer.java,它是當前的OpenGL上下文。而glReadPixels()只有當前有OpenGL上下文時才能使用!上面的代碼位於我的MyGLSurfaceView.java中,它處理輔助線程,所以這就是爲什麼glReadPixels()不讀取任何內容。

解決方案使用GLSurfaceView.queueEvent()轉發到呈現線程。我們現在可以在Renderer.java中寫入glReadPixels(),並從中讀取結果。

這是稱爲enter link description here

class MyGLSurfaceView extends GLSurfaceView { 

private MyRenderer mMyRenderer; 

public void start() { 
    mMyRenderer = ...; 
    setRenderer(mMyRenderer); 
} 

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { 
     queueEvent(new Runnable() { 
      // This method will be called on the rendering 
      // thread: 
      public void run() { 
       mMyRenderer.handleDpadCenter(); 
      }}); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
} 
一個例子