如何从帧缓冲区翻转数据

时间:2019-10-24 10:03:25

标签: opengl glsl

我将PBO附加到Opengl帧缓冲区,然后使用glMapBuffer()来访问数据。

我正在将数据传递到Bluefish卡以进行SDI输出。

问题在于结果输出看起来是反向的。

如何反转由PBO指针指向的数据的y轴。

glReadBuffer(GL_FRONT);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[writeIndex]);
// copy from framebuffer to PBO asynchronously. it will be ready in the NEXT frame
glReadPixels(0, 0, SCR_WIDTH, SCR_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
// now read other PBO which should be already in CPU memory
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[readIndex]);
// map buffer so we can access it
void* downsampleData = (unsigned char *)glMapBuffer(GL_PIXEL_PACK_BUFFER,GL_READ_ONLY);

这是我在尼科尔(Nicol)的建议下尝试翻转数据的方法,我获得了预期的结果。

 unsigned char OriginalData[width * height * 4];
 unsigned char FlippedData[width * height * 4];
 memcpy( OriginalData , downsampleData , sizeof( OriginalData) );  // copy data from the pointer.

 for( int i = sizeof( OriginalData) - 1; i >= 0 ; i-- )
 {
    Flippeddata[k] = OriginalData[sizeof( OriginalData) - 1 - 1];
 }

1 个答案:

答案 0 :(得分:3)

不能。对于任何图像操作(发送/接收像素块,在着色器中获取纹理样本/图像数据等),OpenGL始终将第一行视为图像数据的底部行。因此,如果要反转获取的数据,则必须手动复制数据。