2014-06-18 124 views
0

我想在Android上的OpenGL ES中通過TouchEvents返回像素顏色。我創建了2個三角形作爲矩形。所以我把它顯示的圖像。黑色區域不是三角形的一部分。Android OpenGL ES - 來自glReadPixels的非常奇怪的像素顏色 - 切換圖像?

enter image description here

如果我點擊黑色區域,它總是給我正確的號碼0 0 0 -1(黑色)。如果我點擊白色區域,它也總是給我正確的數字-1 -1 -1 -1(白色)。但是當我點擊綠色矩形時,它會給我0 0 0 -1(黑色)。之後,我點擊旁邊的黑色矩形,它給了我鄰居的顏色(綠色)。

在 「背景」 的圖像切換,但我不知道這是怎麼可能

使用這種嘖:http://androidblog.reindustries.com/a-real-open-gl-es-2-0-2d-tutorial-part-1/

我對顏色採摘代碼:

public void onDrawFrame(GL10 gl) { 

if (clicked) { 
      gl.glDisable(GL10.GL_TEXTURE_2D); 
      gl.glDisable(GL10.GL_FOG); 
      gl.glDisable(GL10.GL_BLEND); 

      ByteBuffer ss = ByteBuffer.allocate(4); 
      ss.order(ByteOrder.nativeOrder()); 
      gl.glFlush(); 
      gl.glReadPixels(touchXint, touchYint, 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); 
      clicked = false; 
      ss.rewind(); 

      gl.glEnable(GL10.GL_TEXTURE_2D); 
      gl.glEnable(GL10.GL_FOG); 
      gl.glEnable(GL10.GL_BLEND); 


     } 
} 

回答

1

您似乎對座標系有問題。在包括Android在內的許多窗口/ UI系統中,作爲事件一部分收到的座標是相對於窗口的頂部/左側角落。

另一方面,OpenGL用於指定glReadPixels()的像素矩形的窗口座標系的起點位於底部/左角。可以看到,在documentation,其中xy被描述:

指定從幀緩衝器讀出的第一像素的窗口座標。該位置是矩形像素塊的左下角。

爲了適應這些不同的座標系,您必須先反轉觸摸輸入的y座標,然後再將其傳遞到glReadPixels()。而不是touchYint,請使用windowHeight - 1 - touchYint

1

這不是真正的答案,爲什麼你的問題發生,但它看起來像你的X座標倒置。我的意思是,水平0與screenWidth交換。只是爲了確認它,你可以嘗試這樣

gl.glReadPixels(screenWidth - touchXint, touchYint, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ss); 

如果成功,那麼你應該尋找問題獲得你touchXint協調。

編輯:

在這種情況下的屏幕水平定向,所以橫軸是Y.在OpenGL Y軸的方向上的座標系統和Android座標系被反轉。因此,要獲得glReadPixels調用的正確Y座標,需要應用以下變換:y =(screenHeight-touchYint)。

+0

是的,但它確實是倒置的... – csnewb

+0

你是如何得到touchXint的?你確定你知道你的屏幕座標系是什麼嗎?它不需要與OpenGL屏幕空間相同。來自MotionEvent的touchXInt os。 – Elvithari

+0

是的,我猜MotionEvent和OpenGL的座標系是不一樣的。我會檢查這一點。 – csnewb