当用户单击它时,我试图在 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 方法中工作,或者我是否必须存储选定的像素,以及一个 bool 值来指示选择(这样我就不会每帧都调用 glReadPixels)并在显示中进行选择方法?

附言(x,y) coords = (10,10) 只是为了确保选择确实在我的窗口内(确实如此,因为像素颜色在显示方法中正确显示)。

最佳答案

OpenGL 上下文一次只能在一个线程中处于事件状态,如果您对鼠标按下的事件处理发生在不同的线程上,那么您将无法正确地从 OpenGL 查询信息。一般来说,我会在读取显示功能中的像素值方面犯错。如果您想避免每帧读取像素,您可以跟踪您读取的最后一个位置,并且仅在读取位置发生变化时才调用 glReadPixels

正如 datenwolf 所提到的,如果需要,可以停用和激活您的上下文以跨多个线程访问它。

关于opengl - mousePressed 中的 glReadPixels,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8329663/

10-13 00:06