【问题标题】:Using glReadPixels for reading pixel data of a texture image使用 glReadPixels 读取纹理图像的像素数据
【发布时间】:2012-09-28 14:24:54
【问题描述】:

您可以使用 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 从帧缓冲区读取数据?

【问题讨论】:

    标签: java opengl jogl


    【解决方案1】:

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

    【讨论】:

      【解决方案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 );
      

      【讨论】:

        猜你喜欢
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 2012-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多