Выбор объектов в Android OpenGL ES с использованием цветов не возвращает правильные цвета - PullRequest
0 голосов
/ 20 сентября 2011

Я очень новичок в OpenGL, и я делаю очень простую программу, чтобы проверить, могу ли я выбирать объекты, отображаемые на экране, рисуя каждый из них с уникальным цветом.До сих пор я рендерил 2 плоских квадрата и один треугольник.

Проблема в том, что когда пользователь касается многоугольников, я получаю цвет, отличный от черного, но цветовой индекс одинаков для трех объектов (когдаон должен быть другим).

Вот мой код:

Метод onDrawFrame (в моем рендерере).Здесь я отображаю полигоны с уникальным цветом, когда пользователь касается экрана.

public void onDrawFrame(GL10 gl) {

    // clear Screen and Depth Buffer
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    // Reset the Modelview Matrix
    gl.glLoadIdentity();

    if (mGLView.isPickingEnabled()) {
         gl.glDisable(GL10.GL_TEXTURE_2D);
         gl.glDisable(GL10.GL_LIGHTING);
         gl.glDisable(GL10.GL_FOG);

         // draw colored objects  and picking pixel color
         pickingDraw(gl);

         mGLView.mPickingY = (int)(mHeight - mGLView.mPickingY);

         gl.glReadPixels((int) mGLView.mPickingX, 
                 (int) mGLView.mPickingY, 1, 1, 
                 GL10.GL_RGBA, 
                 GL10.GL_UNSIGNED_BYTE, 
                 mGLView.m_PickingPixelBuffer);

         Log.i("RA", "RGBA COLORS: " +
                 (int) mGLView.m_PickingPixelBuffer.get(0) + " , " +
                 (int) mGLView.m_PickingPixelBuffer.get(1) + " , " +
                 (int) mGLView.m_PickingPixelBuffer.get(2) + " , " +
                 (int) mGLView.m_PickingPixelBuffer.get(3) );

         mGLView.disablePicking();

         // Clear BACK BUFFER
         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    }

    gl.glLoadIdentity();

    // Drawing
    gl.glTranslatef(0.0f, 0.0f, -25.0f);    // move 5 units INTO the screen
                                            // is the same as moving the camera 5 units away
    square.draw(gl);                        // Draw the triangle

    gl.glTranslatef(0.0f, -5.0f, 0.0f);
    square.draw(gl);

    gl.glTranslatef(4.0f, 10.0f, 0.0f);
    triangle.draw(gl);
}

Метод pickingDraw следующий (также и в моем рендерере):

private void pickingDraw(GL10 gl) {
    // Drawing
    gl.glTranslatef(0.0f, 0.0f, -25.0f);    // move 5 units INTO the screen
    gl.glColor4f(128, 0, 0, 1);
    square.draw(gl);                        // Draw the triangle

    gl.glTranslatef(0.0f, -5.0f, 0.0f);
    gl.glColor4f(129, 0, 0, 1);
    square.draw(gl);

    gl.glTranslatef(4.0f, 10.0f, 0.0f);
    gl.glColor4f(130, 0, 0, 1);
    triangle.draw(gl);
}

Вкл.с другой стороны, я унаследовал GLSurfaceView, чтобы обрабатывать прикосновения пользователя.В этом классе я использую этот метод:

public boolean onTouchEvent(MotionEvent e) {

    float _iX = e.getX();
    float _iY = e.getY();

    int iIndex = -1;
    int iRed;

    m_PickingPixelBuffer = ByteBuffer.allocateDirect(4);
    m_PickingPixelBuffer.order(ByteOrder.nativeOrder());

    // setting globals for Renderer
    mPickingX = _iX;
    mPickingY = _iY;

    mPickingEnabled = true;
    requestRender();

    // wait for picking process (renderer)
    while(mPickingEnabled);

    iRed = m_PickingPixelBuffer.get(0);
    if(iRed < 0)
    {
       iRed += 256;
    }

    Log.i("RA", "Coordinates: (" + mPickingX + ", " + mPickingY + ")");
    Log.i("RA", "Red Color " + iRed);

    return true;
}

Кажется, что он обнаруживает квадраты и треугольник, когда я касаюсь их, но я получаю одинаковый индекс цвета для трех из них.Кроме того, три объекта имеют одинаковый точный цвет (я даже нарисовал каждый со значением красного, зеленого и синего соответственно, и у них был тот же цвет, цвет последнего нарисованного).

Наконец, это вывод, который я получаю, когда касаюсь квадрата, затем пустого пространства и другого квадрата:

01-19 01:34:23.345: INFO/RA(11566): RGBA COLORS: -1 , 0 , 0 , -1
01-19 01:34:23.355: INFO/RA(11566): Coordinates: (247.81186, 391.0)
01-19 01:34:23.355: INFO/RA(11566): Red Color 255
01-19 01:34:23.385: INFO/RA(11566): RGBA COLORS: -1 , 0 , 0 , -1
01-19 01:34:23.385: INFO/RA(11566): Coordinates: (248.52428, 390.0)
01-19 01:34:23.385: INFO/RA(11566): Red Color 255
01-19 01:34:23.405: INFO/RA(11566): RGBA COLORS: -1 , 0 , 0 , -1
01-19 01:34:23.405: INFO/RA(11566): Coordinates: (248.52428, 390.0)
01-19 01:34:23.405: INFO/RA(11566): Red Color 255
01-19 01:34:24.305: INFO/RA(11566): RGBA COLORS: 0 , 0 , 0 , -1
01-19 01:34:24.315: INFO/RA(11566): Coordinates: (119.571884, 577.0)
01-19 01:34:24.315: INFO/RA(11566): Red Color 0
01-19 01:34:24.335: INFO/RA(11566): RGBA COLORS: 0 , 0 , 0 , -1
01-19 01:34:24.335: INFO/RA(11566): Coordinates: (119.33441, 573.0)
01-19 01:34:24.335: INFO/RA(11566): Red Color 0
01-19 01:34:24.355: INFO/RA(11566): RGBA COLORS: 0 , 0 , 0 , -1
01-19 01:34:24.355: INFO/RA(11566): Coordinates: (119.33441, 573.0)
01-19 01:34:24.355: INFO/RA(11566): Red Color 0
01-19 01:34:25.195: INFO/RA(11566): RGBA COLORS: -1 , 0 , 0 , -1
01-19 01:34:25.195: INFO/RA(11566): Coordinates: (259.80466, 395.0)
01-19 01:34:25.195: INFO/RA(11566): Red Color 255
01-19 01:34:25.215: INFO/RA(11566): RGBA COLORS: -1 , 0 , 0 , -1
01-19 01:34:25.215: INFO/RA(11566): Coordinates: (259.44843, 398.0)
01-19 01:34:25.215: INFO/RA(11566): Red Color 255
01-19 01:34:25.245: INFO/RA(11566): RGBA COLORS: -1 , 0 , 0 , -1
01-19 01:34:25.245: INFO/RA(11566): Coordinates: (259.80466, 395.0)
01-19 01:34:25.245: INFO/RA(11566): Red Color 255

Я не знаю, почему значения красного одинаковы для каждого объекта.

Любая помощь будет оценена.Спасибо.

Ответы [ 2 ]

1 голос
/ 12 октября 2011

gl.glColor4f (красный, зеленый, синий, альфа);тип четырех параметров - число с плавающей запятой, и предполагается, что значение должно быть от 0 до 1, что соответствует общему диапазону RGB от 0 до 255, поэтому, если вы установите значения R 128, 129 и 130, фактически, между ними нет никакой разницы,Они все 255 для общего диапазона RGB.

0 голосов
/ 30 июля 2015

Давным-давно, в далекой галактике ...

Хорошо, этот вопрос - история, но если у кого-то когда-либо возникнет такая же проблема, стоит проверить, не отключено ли DITHERING.

Однажды у меня была похожая проблема, и это была проблема для меня.

...