glReadPixels in mousePressed - PullRequest
       7

glReadPixels in mousePressed

3 голосов
/ 30 ноября 2011

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

FloatBuffer buffer = FloatBuffer.allocate(4);

gl.glReadBuffer(GL3.GL_FRONT);
gl.glReadPixels(10, 10, 1, 1, GL3.GL_RGBA, GL3.GL_FLOAT, buffer);
float[] pixels = new float[3];
pixels = buffer.array();
float red = pixels[0];
float green = pixels[1];
float blue = pixels[2];
System.out.println(red + ", " + green + ", " + blue);

Однако, если я помещаю свой код в метод mousePressed, при проверке на успешное выполнение я получаю ошибку недопустимой операции, и цвет возвращается черным (0, 0, 0).

Есть ли способ заставить это работать в моем методе mousePressed, или мне придется сохранить выбранный пиксель вместе с логическим значением для обозначения выделения (чтобы я не вызывал glReadPixels для каждого кадра) и делал выбор? в методе отображения?

P.s. координаты (x, y) = (10,10) просто для того, чтобы убедиться, что выделение действительно внутри моего окна (что и есть, поскольку цвет пикселя правильно отображается в методе отображения).

1 Ответ

2 голосов
/ 30 ноября 2011

Контекст OpenGL может быть активным только в одном потоке за раз, если ваша обработка событий для нажатий мыши происходит в другом потоке, вы не сможете должным образом запрашивать информацию из OpenGL в это время. Вообще говоря, я бы ошибался при чтении значения пикселя в функции отображения. Если вы хотите избежать чтения пикселей в каждом кадре, вы можете отслеживать последнее местоположение, с которого вы читали, и вызывать glReadPixels, только если позиция для чтения изменилась.

Как упоминает datenwolf, можно деактивировать и активировать ваш контекст для доступа к нему через несколько потоков, если вам нужно это сделать.

...