Я очень новичок в 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
Я не знаю, почему значения красного одинаковы для каждого объекта.
Любая помощь будет оценена.Спасибо.