使用glReadPixels读取纹理图像的像素数据

时间:2012-09-28 14:24:55

标签: java opengl jogl

您可以使用glReadPixels读取纹理图像中的像素数据吗?

我生成纹理图像的代码是:

gl.glTexImage2D( GL2.GL_TEXTURE_2D, 0, GL2.GL_RGBA, width, height, 0, GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, ByteBuffer.wrap( pixels ) );

可变像素包含图像的像素值。然后我使用glReadPixels尝试读取刚刚创建的纹理图像的像素数据。 我使用glReadPixels的代码是:

    FloatBuffer buffer = FloatBuffer.allocate( 4 );
    for ( int row = 0, col; row < height; row++ ) {
        for ( col = 0; col < width; col++ ) {
            gl.glReadPixels( col, row, 0, 0, GL2.GL_RGBA, GL2.GL_FLOAT, buffer );
            System.out.print( buffer.get( 0 ) );
        }
        System.out.println();
    }

问题是我一直得到0.0的值, 我想知道纹理图像是否存储在帧缓冲区中,因为glReadPixels从帧缓冲区读取数据?

2 个答案:

答案 0 :(得分:5)

glReadPixels从默认的帧缓冲区读取(GL_BACK用于dbl缓冲),是的。 要读取纹理,您可能需要使用带附加纹理颜色缓冲的FBO。 然后将FBO设置为活动状态,您可以使用glReadPixels。 因为FBO驯服很复杂而且你正在使用JOGL, 我将您链接到使用GLFBODrawable / FBObject的offscreen unit test 在内部并使用glReadPixels来执行快照。 Ofc ..你需要走一段代码,这是新的API。

答案 1 :(得分:2)

我认为这一行的错误。

gl.glReadPixels( col, row, 0, 0, GL2.GL_RGBA, GL2.GL_FLOAT, buffer );

请尝试以下

gl.glReadPixels( col, row, 1, 1, GL2.GL_RGBA, GL2.GL_FLOAT, buffer );

同时最好同时阅读整个图像。不要忘记分配所需的缓冲区大小。

gl.glReadPixels( col, row, width, height, GL2.GL_RGBA, GL2.GL_FLOAT, buffer );