[英]OpenGL ES glReadPixels returns wrong values
首先第一次來這里,大家好。 在網上搜尋了包括該站點在內的幾天后,我未能克服此問題:
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity(); //load identity
GLU.gluLookAt(gl, 0, -5, -25, 0, 0, 0, 0, 2, 0); //set camera
if (fingerInput.isClicking()){
/* Color Picking 4 START */
gl.glDisable(GL10.GL_TEXTURE_2D); //turn off texturing, lighting and fog
gl.glDisable(GL10.GL_FOG);
gl.glDisable(GL10.GL_LIGHTING);
while (i<squares.size()){ //draw picking colors
squares.get(i).pickingDraw(gl); //note: picking is the same as draw() only with id colors and not textures
i++;
}
i=0;
gl.glReadPixels(fingerInput.getStart().x, screen_height-fingerInput.getStart().y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixels); //read what was the color id pressed, store it in 'pixels' (a 4 slots array buffer)
Log.d("tlog","at coords: ("+(screen_height-fingerInput.getStart().x)+", "+(screen_height-fingerInput.getStart().y)+")");
for (j=0; j<4; j++){
RGBA[j] = (int)(pixels.get(j) & 0xff);
if (RGBA[j] < 0) RGBA[j]+=256; //correcting error caused by java using unsigned bytes and opengl singed bytes
}
無論如何,出於拾取目的,每個正方形都以唯一的顏色繪制(當前繪制3個正方形,其顏色分別為99,96和93紅色,藍綠色alpha為0)glReadPixels單擊(99,0,0)或返回(91,0,0)。
如果該框是彩色的(x,0,0,255),它將返回一個值,就好像它具有一個可能的值列表,它們之間有8個空格。 (91,99,107 ..)將每種讀取的顏色值“舍入”到最接近的“可能”值。
幾個月前,我遇到了一個類似的問題,但是我將Bitmap
類與getPixel
方法一起使用來讀取各個像素的顏色。 作為測試,我使用了全黑的黑色圖像,因此所有像素都應具有值0
,但是getPixel
方法返回的值為0,6,0,6,0,6 ... etc。
如果您在Android SDK的Google代碼頁上查看此鏈接,則其他人會遇到與我相同的問題: Bitmap.getPixel錯誤不幸的是尚未修復。
我不確定它是否與Android上的OpenGL有關,但是根據我的經驗,以后的SDK版本有時會以某種方式弄亂顏色值。 那天唯一有效的方法是使用較低的SDK版本。
在1.4或1.5上嘗試您的代碼,如果問題消失了,請等待更高版本的SDK上的修復。 如果問題仍然存在,那就是另一個問題。
PS:如果您在以后的SDK中找到解決方案,請告訴我。
正如我在這里所說的:
Java沒有帶符號的字節,此實現要求glReadPixels提供“ GL10.GL_UNSIGNED_BYTE”答案。 轉換會損害返回的數據。 (例如95紅色將返回為91或99)。
由於Java無法處理此轉換問題,因此我為該問題提供了兩種解決方案:1)在每兩個可能值(對於一種顏色)和新的絕對值之間建立轉換映射。
2)使用NDK可能會立即給出精確的顏色值。 請記住,我還沒有對其進行測試,因此決定將NDK與OpenGL配合使用時,並不總是比Java提供更好的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.