我使用JOGL处理OpenGL,但我无法获得像素颜色。方法glReadPixels()总是返回一个全零的数组。
这就是我使用它的方式:
private static GL2 gl;
static Color getPixel(final int x, final int y) {
ByteBuffer buffer = ByteBuffer.allocate(4);
gl.glReadBuffer(GL.GL_FRONT);
gl.glReadPixels(x, y, 1, 1, GL2.GL_RGB, GL2.GL_UNSIGNED_BYTE, buffer);
byte[] rgb = buffer.array();
return new Color(rgb[0], rgb[1], rgb[2]);
}
在重绘时(在display()
方法中)我用灰色填充窗口,然后在用户点击窗口中的任何位置时测试结果:
@Override
public void mouseClicked(MouseEvent e) {
// On mouse click..
for (int j = 0; j < this.getWidth(); ++j)
for (int i = 0; i < this.getHeight(); ++i) {
// ..I iterate through all pixels..
Color pxl = Algorithm.getPixel(j, i); //! pxl should be GRAY, but it is BLACK (0,0,0)
if (pxl.getRGB() != Color.BLACK.getRGB())
// ..and print to console only if a point color differs from BLACK
System.out.println("r:" + pxl.getRed() + " g:" + pxl.getGreen() + " b:" + pxl.getBlue());
}
}
但是控制台中没有输出。我已经在离散和集成显卡上进行了测试。结果是一样的。
告诉我我做错了什么。或者分享一个工作示例,如果你有一个使用JOGL和方法glReadPixel()的任何程序。
答案 0 :(得分:0)
问题在于我在getPixel()
中呼叫mouseClicked()
(即来自另一个线程)。 OpenGL上下文一次只能在一个线程中激活。讨论了解决方案here。
例如,在此方法中使用OpenGL上下文更为正确:
/**
* Called back by the animator to perform per-frame rendering.
*/
@Override
public void display(GLAutoDrawable glAutoDrawable) {
GL2 gl = glAutoDrawable.getGL().getGL2(); // get the OpenGL 2 graphics context
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // clear background
gl.glLoadIdentity(); // reset the model-view matrix
// Rendering code
/* There you can fill the whole window with a color,
or draw something more beautiful... */
gl.glFlush();
/* Here goes testing cycle from mouseClicked(); and it works! */
}