2

这是我的选择代码

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;
    }

即使屏幕上没有黑色空间,我总是会得到黑色值,所以我很确定这不仅仅是一个精度问题。我在那里有一个日志标签,它返回视口值,它们很好,我还检查了我的 xy 坐标,它们看起来是合法的,我唯一需要做的就是 1282 错误代码。

有谁知道这可能是什么?

编辑:

是的,我们知道问题来自读取像素函数,因为我在函数之前和之后放置了 glGetError() 并且它又回来了

Before: 0
After: 1282

摆脱缩放并没有帮助,但这是一个很长的目标

我已将 Buffer 更改为 FloatBuffer,现在我返回 (0.0, 0.0, 0.0) 而不是 (0, 0, 0) 我知道的胜利并不多。我还注意到错误现在是 1280 (GL_INVALID_ENUM)。我不知道这是否是一个进步。如果不是错误 1282,有谁知道如何修复此错误。

4

1 回答 1

9

当您获得 GL_INVALID_ENUM 时,这可能是因为您将 GL_RGB 作为格式参数传递给 glReadPixels。根据glReadPixels 的 Khronos 文档,格式和类型只有 2 对可能的值:

  • GL_RGBA(格式)和 GL_UNSIGNED_BYTE(类型)
  • GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 和 GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 的值。您可以使用 glGetIntegerv 查询这些。

我最近遇到了同样的问题,并使用 GL_RGBA 为我修复了它。

于 2011-10-27T20:29:10.947 回答