具有GL_INT类型的glReadPixels不返回负值

时间:2015-07-29 22:51:39

标签: opengl-3

我在OpenGL中设置片段着色器来计算YUV数据,并将其输出到自定义Framebuffer对象。渲染后,我使用glReadPixels()将YUV数据读回我的应用程序。

当我将YUV读回GL_FLOAT时,我得到V分量的负值。然而,当我读回与GL_INT相同的东西时,我只得到正值。不应该GL_INT给我带符号的整数值吗?有谁知道如何从glReadPixels()获得签名的内容?

我使用OpenGL 3.3,使用GLFW和GLEW。

更新:我也尝试使用GL_SHORT回读,并且我能够获得签名 16位值。也许这是我系统上的GL实现错误。如果其他人可以重现这一点,那将会感兴趣。

初始化代码:

// Color Buffer
glGenRenderbuffers(1, &rbYUV);
glBindRenderbuffer(GL_RENDERBUFFER, rbYUV);
glRenderbufferStorage
    (GL_RENDERBUFFER
    ,GL_RGBA32F
    ,width
    ,height
    );

// Depth Buffer
glGenRenderbuffers(1, &rbDepth);
glBindRenderbuffer(GL_RENDERBUFFER, rbDepth);
glRenderbufferStorage
    (GL_RENDERBUFFER
    ,GL_DEPTH_COMPONENT24
    ,width
    ,height
    );

glGenFramebuffers(1, &framebufferObj);
glBindFramebuffer(GL_FRAMEBUFFER, framebufferObj);

// Bind Color and Depth Renderbuffers to the Framebuffer object
glFramebufferRenderbuffer
    (GL_FRAMEBUFFER
    ,GL_COLOR_ATTACHMENT0
    ,GL_RENDERBUFFER
    ,rbYUV
    );
glFramebufferRenderbuffer
    (GL_FRAMEBUFFER
    ,GL_DEPTH_ATTACHMENT
    ,GL_RENDERBUFFER
    ,rbDepth
    );

RENDER LOOP:

// Set up stuff to be rendered...
glDrawArrays(...);
glFlush();

glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels
    (0, 0
    ,width
    ,height
    ,GL_RGBA
    ,GL_FLOAT
    ,p_YUV_float_out
    );
// p_YUV_float_out looks fine
// e.g. "0.49769023  0.085087359  -0.071942836  1.0000000"


glReadPixels
    (0, 0
    ,width
    ,height
    ,GL_RGBA
    ,GL_INT
    ,p_YUV_int_out
    );
// p_YUV_int_out is ok for Y and U, but V isn't negative
// e.g. "1068793704  182719944  309065418 2147483647"
// hex  "3fb47f68 0ae415c8 126bf6ca 7fffffff"

1 个答案:

答案 0 :(得分:0)

WAG在这里,您可能希望查看http://docs.gl/gl3/glPixelStorehttp://docs.gl/gl3/glReadPixels〜"在将像素数据放入客户端内存之前控制像素数据的处理"