glReadPixel возвращает нули и ошибку 1282 (Android) - PullRequest
2 голосов
/ 25 октября 2011

Вот мой код выбора

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 y, и они кажутся законными, единственное, что мне нужно, это код ошибки 1282.

Кто-нибудь знает, что это может быть?

РЕДАКТИРОВАТЬ:

Правильно, мы знаем, что проблема связана с функцией чтения пикселей, потому что я поставил glGetError () до и после функции, и она вернулась

Before: 0
After: 1282

Избавиться от масштабирования не помогло, но это был длинный выстрел

Я изменил Buffer на FloatBuffer, и теперь я получаю обратно (0,0, 0,0, 0,0) вместо (0, 0, 0) небольшую победу, которую я знаю. Я также заметил, что ошибка теперь 1280 (GL_INVALID_ENUM). Я не знаю, если это шаг вперед. Кто-нибудь знает, как исправить эту ошибку, если не ошибка 1282.

1 Ответ

9 голосов
/ 28 октября 2011

Когда вы получаете GL_INVALID_ENUM, это, вероятно, потому, что вы передаете GL_RGB в качестве параметра формата в glReadPixels.Согласно документации Khronos для glReadPixels , существует только 2 возможные пары значений для формата и типа:

  • GL_RGBA (формат) и GL_UNSIGNED_BYTE (тип)
  • Значения GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES и GL_IMPLEMENTATION_COLOR_READ_TYPE_OES.Вы можете запросить их, используя glGetIntegerv.

Я недавно столкнулся с той же проблемой, и использование GL_RGBA устранило ее для меня.

...