2011-07-23 27 views
2

我試圖檢測光標下的opengl對象...我讀過 它被稱爲picking。這裏是我的代碼:如何在android中使用glreadpixels - 通常會得到零

public int makeBuffer(GL10 gl, int x, int y) { 

    ByteBuffer PixelBuffer = ByteBuffer.allocateDirect(4); 
    PixelBuffer.order(ByteOrder.nativeOrder()); 
    PixelBuffer.position(0); 
    int mTemp = 0; 
    gl.glReadPixels((int)x, (int) y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, PixelBuffer); 
    Log.e("Picking", " xy: x" + x + " y"+ y); 
    byte b [] = new byte[4]; 
    PixelBuffer.get(b); 
    Log.e("Picking", " rgba: r"+ PixelBuffer.get(0) + " g" + PixelBuffer.get(1) + " b" + 
      PixelBuffer.get(2) + " a" + PixelBuffer.get(3)); 
    Log.e("Picking", " rgba: r"+ b[0] + " g" + b[1] + " b" + 
      b[2] + " a" + b[3]); 

    //mTemp = PixelBuffer.get(0); 
    mTemp = b[0]; 

    Log.e("Picking", "result:" + mTemp); 

    return mTemp; 
} 

看到上面的大部分代碼是logcat語句。我的代碼在r,g和b的屏幕上打印 零。對於alpha,它打印'-1',即 可翻譯爲255(無符號)爲'完整字母'。我試圖在給定的x/y位置上檢測屏幕上的 顏色。我會很高興 紅色值在1到15之間,因爲這是 應該低於觸摸的顏色。我希望如果我這樣做的話 完全錯誤,我會得到所有的零,但我必須做到這一點,至少 部分正確,因爲我越來越alpha。我還包含了 中的行,我的清單告訴手機我使用 '表面拋光條'和'讀取幀緩衝區'的權限。我不知道這些 線路是否正常工作。

<uses-permission 
android:name="android.permission.ACCESS_SURFACE_FLINGER" /> 
<uses-permission android:name="android.permission.READ_FRAME_BUFFER"/

任何幫助,將不勝感激。

+0

我相信我的麻煩是我把錯誤的y值傳遞給函數。事實證明,opengl期望值從底部增加,android提供了從頂部增加的值。 –

+1

所以...這實際上有效嗎?它只是Y倒置,你正在獲得像素顏色? – goger

+0

嗨!我在這裏有同樣的問題:http://stackoverflow.com/questions/7488197/picking-objects-in-android-opengl-es-using-colors-does-not-retrieve-correct-color。看起來我和你一樣,但是我一直得到紅色的-1值(而不是128-130之間的數字),如果你能通過該線程來看看我的代碼,我將非常感激。我沒有看到任何區別,你說現在你有它的工作。提前致謝! – Pedriyoo

回答

2

在android上創建openGL ES應用程序時,我也遇到了類似的問題。

我到目前爲止的解決方法是將應用程序從RGB565更改爲RGBA8888。設置渲染器之前插入這些行:

getHolder().setFormat(PixelFormat.RGBA_8888); 
setEGLConfigChooser(8, 8, 8, 8, 0, 0); 

你必須意識到,這種解決方案只能在支持RGBA8888的設備。

+0

我不確定第一行是什麼。但是setEGLConfigChooser(8,8,8,8,0,0);足以爲我解決這個問題。 – Michel

+0

'setEGLConfigChooser(8,8,8,8,16,0); ()。setFormat(PixelFormat.RGBA_8888);' –

+0

我在我的GLSurfaceView的構造函數中使用了兩行。據我所知,這確保了GL上下文和視圖表面對像素使用相同的表示(RGB8888而不是RGB565,這是默認設置)。如果兩者不一樣,您會注意到您繪製的值和從glreadpixels中讀取的值之間的細微差異。同樣重要的是要注意,setEGLConfigChoose嘗試根據您的請求選擇最接近的配置。實際的配置將取決於你的硬件。 –

1

這些權限僅適用於簽名應用程序。編譯Android ROM時簽署的應用程序。所以他們對常規應用程序無能爲力。

android:name="android.permission.ACCESS_SURFACE_FLINGER" 
android:name="android.permission.READ_FRAME_BUFFER"