java - 在 display() JOGL 中调用 glReadPixels

标签 java opengl jogl glreadpixels picking

我正在尝试实现对象拾取。我有代码将对象渲染为纯色、未点亮的颜色,然后读取屏幕缓冲区中的像素。我解释来自 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 名称堆栈,但坦率地说,我发现它不方便且荒谬。

最佳答案

问题是您渲染到后台缓冲区,但您的 glReadPixels() 调用从前台缓冲区读取。如果渲染到双缓冲表面(使用 OpenGL 时几乎总是需要的),默认情况下渲染将​​进入后台缓冲区。您的代码中有此调用:

gl.glReadBuffer(GL_FRONT);

这告诉下面的 glReadPixels() 调用从前端缓冲区读取,这是您绘制到的缓冲区。

您应该能够简单地删除 glReadBuffer() 调用,因为 GL_BACK 是双缓冲默认渲染表面的默认读取缓冲区。

关于java - 在 display() JOGL 中调用 glReadPixels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23586181/

相关文章:

java - 绘制平滑曲线

java - 如何在这个数组操作的Java程序中定义不同的所需方法?

java - 如何旋转由旋转的各个部分聚合而成的形状?

java - 从java应用程序执行.exe文件

java - 如何用特殊字符 `"`初始化字符串?

c++ - 如何根据 Wavefront (.obj) 文件中给定的纹理索引对纹理位置进行排序?

opengl - glClearColor(0.0,0.0,0.0,0.0) 和 glClear(COLOR_BUFFER_BIT) 之间有区别吗?

c++ - glDrawElements 只绘制索引指定的第一个三角形

java - Mac 版 Eclipse 中的 JOGL

java - 旧的 JOGL,转换顺序