【发布时间】:2015-07-29 22:51:39
【问题描述】:
我在 OpenGL 中设置了一个片段着色器来计算 YUV 数据,并将其输出到自定义的 Framebuffer 对象。渲染后,我使用 glReadPixels() 将 YUV 数据读回我的应用程序。
当我将 YUV 读回为 GL_FLOAT 时,我得到 V 分量的负值。但是,当我读回与 GL_INT 相同的内容时,我只会得到正值。 GL_INT 不应该给我带符号的整数值吗?有谁知道如何从 glReadPixels() 获取签名整数?
我正在使用带有 GLFW 和 GLEW 的 OpenGL 3.3。
更新:我还尝试使用 GL_SHORT 回读,我能够获得 signed 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
);
渲染循环:
// 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"
【问题讨论】:
标签: opengl-3