Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在display()JOGL中调用glReadPixels_Java_Opengl_Jogl_Glreadpixels_Picking - Fatal编程技术网

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本身无法控制这一点。然而,在双缓冲或三缓冲像素格式中,前缓冲通常至少为一帧。