2011-10-25 67 views
2

這裏是我的採摘代碼glReadPixel返回零和錯誤1282(安卓)

public static void pick(GL11 gl){ 
     int[] viewport = new int[4]; 
     ByteBuffer pixel = ByteBuffer.allocateDirect(3).order(ByteOrder.nativeOrder()); 

     mColourR = BaseObject.getColourR(); 
     mColourG = BaseObject.getColourG(); 
     mColourB = BaseObject.getColourB(); 

     x = MGLSurfaceView.X(); 
     y = MGLSurfaceView.Y(); 

     gl.glGetIntegerv(GL11.GL_VIEWPORT,viewport,0); 

     gl.glReadPixels((int)x, (int)(viewport[3] - y), 1, 1, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixel); 
     Log.d(TAG, String.valueOf(gl.glGetError())); 
     R = pixel.get(0); 
     G = pixel.get(1); 
     B = pixel.get(2); 
     Log.d(TAG, "Colour:" + pixel.get(0) + " " + pixel.get(1) + " " + pixel.get(2)); 
     if (R == mColourR && G == mColourG && B == mColourB){ 
      match = true; 

     }else{ 
      match = false; 
     } 
     Log.d(TAG, String.valueOf(match)); 
     Log.d(TAG, String.valueOf(viewport[0]) + "," + String.valueOf(viewport[1]) + "," + String.valueOf(viewport[2]) + "," + String.valueOf(viewport[3])); 

} 

很抱歉的混亂。無論如何,這個代碼似乎總是返回(0,0,0),無論我點擊的地方。我有一個紅色的方形,綠色,方形和用於測試的藍色背景和這個方法被調用每次的廣場之一繪製時間,屏幕被按下,像這樣

BaseObject.newColour(); 
    mColourR = BaseObject.getColourR(); 
    mColourG = BaseObject.getColourG(); 
    mColourB = BaseObject.getColourB(); 
    gl.glPushMatrix(); 
    gl.glColor4f(mColourR, mColourG, mColourB, 0.0f); 
    gl.glTranslatef(x1, y1, 0); 
    square.draw(gl); 
    gl.glPopMatrix(); 
    ColourPicking.pick((GL11)gl); 
    match = ColourPicking.getMatch(); 
    if (match == true){ 
     x1 = (float) Math.floor(Math.random()*9); 
      y1 = (float) Math.floor(Math.random()*7); 
     match = false; 
    } 

即使沒有屏幕上的黑色空間我總是得到黑色的值,所以我非常肯定它不僅僅是一個精確的問題。我有一個日誌標記,在那裏返回視口值,他們很好,我也檢查了我的x座標,他們似乎合法唯一的事情我必須繼續是1282錯誤代碼。

有沒有人有任何想法這可能是什麼?

編輯:

正確的,我們知道這個問題是從讀像素功能來,因爲我把glGetError()前,後的功能和它回來

Before: 0 
After: 1282 

擺脫縮放沒的沒有幫助,但這是一個遠射

我已經改變了緩衝區到一個FloatBuffer,現在我回來了(0.0,0.0,0.0)而不是(0,0,0)沒有太多的勝利我知道。我還注意到現在的錯誤是1280(GL_INVALID_ENUM)。我不知道這是否是前進的一步。是否有人知道如何解決這個錯誤,如果不是錯誤1282.

+0

還在'glReadPixels'之前調用'glGetError'來清除錯誤標誌並確保這是錯誤真正發生的位置,而不是早期的200次函數調用。 –

+0

是的,我已經做了日誌標記之前返回0和一個後返回1282 – Jack

+0

@Christian Rau對不起,沒有在我最後的評論中標記你,所以我不知道你是否通過了 – Jack

回答

9

當你得到GL_INVALID_ENUM,這可能是因爲你將GL_RGB格式參數傳遞給glReadPixels。根據Khronos documentation for glReadPixels,只有2格式和類型可能對值:

  • GL_RGBA(格式)和GL_UNSIGNED_BYTE(類型)
  • GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES和GL_IMPLEMENTATION_COLOR_READ_TYPE_OES的值。你可以使用glGetIntegerv來查詢這些。

我最近遇到了同樣的問題,並且使用GL_RGBA修復了它。