Java 在display()JOGL中调用glReadPixels
我正在尝试实现对象拾取。我有代码将对象渲染为纯色、无光颜色,然后读取屏幕缓冲区中的像素。我解释Java 在display()JOGL中调用glReadPixels,java,opengl,jogl,glreadpixels,picking,Java,Opengl,Jogl,Glreadpixels,Picking,我正在尝试实现对象拾取。我有代码将对象渲染为纯色、无光颜色,然后读取屏幕缓冲区中的像素。我解释glReadPixels()中的读数,以确定光标当前所在的对象。最后,我重新渲染所有有灯光、纹理和颜色的对象 gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL_MODELVIEW); gl.glLoadIdentity(); gl.glPushMatrix(); /
glReadPixels()
中的读数,以确定光标当前所在的对象。最后,我重新渲染所有有灯光、纹理和颜色的对象
gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();
//Picking render goes here...
gl.glPopMatrix();
//The following code reads the current pixel color at the center of the screen
FloatBuffer buffer = FloatBuffer.allocate(4);
gl.glReadBuffer(GL_FRONT);
gl.glReadPixels(drawable.getWidth() / 2, drawable.getHeight() / 2, 1, 1, GL_RGBA, 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);
gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();
//Final render goes here...
gl.glPopMatrix();
问题是调用glReadPixels()
会返回最终渲染的像素颜色,而不是拾取渲染。如果您能解释一下如何读取拾取的渲染像素,我将不胜感激
我知道我可以使用OpenGL名称堆栈,但坦率地说,我觉得它既不方便又可笑。问题是渲染到后缓冲区,但调用从前缓冲区读取。如果渲染到双缓冲曲面(使用OpenGL时几乎总是需要),则默认情况下渲染将转到后缓冲区。您的代码中有此调用:
gl.glReadBuffer(GL_FRONT);
这将告诉下面的glReadPixels()
调用从前缓冲区读取,前缓冲区是您正在绘制的缓冲区
您应该能够简单地删除
glReadBuffer()
调用,因为GL\u BACK
是双缓冲默认渲染曲面的默认读取缓冲区。是否使用单缓冲曲面?glReadBuffer(GL\u-FRONT)
调用似乎不寻常。你在往前缓冲区拉吗?@Reto Koradi谢谢你!我从某个网站复制/粘贴了readPixels代码。我不知道那个电话是怎么回事。我将其更改为gl.glReadBuffer(gl\u BACK)代码>从后台缓冲区读取(事后看来这是有意义的)。现在可以了,谢谢!请将此作为答案发布@乔希:一些窗口系统甚至使前端缓冲区的读取未定义。使用的交换技术(例如复制、交换和丢弃)将决定您是否通过读取前端缓冲区获得任何有意义的内容,但GL本身无法控制这一点。然而,在双缓冲或三缓冲像素格式中,前缓冲通常至少为一帧。