2011-10-25 79 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修复了它。