opengl - 如何从帧缓冲区翻转数据

标签 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];
 }

最佳答案

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

关于opengl - 如何从帧缓冲区翻转数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58538915/

相关文章:

opengl - 组织 VBO 并优化对 glDrawArrays() 的调用

OpenGL 3.+ glsl 兼容性一团糟?

opengl - 编译顶点着色器程序失败

opengl-es - OpenGL 着色器编译器可以优化制服上的表达式吗?

c++ - glVertexAttribPointer GL_INVALID_OPERATION 无效的 vao vbo 指针使用

c++ - OpenGL Loader Generator 对 gl::BindBuffer 等的 undefined reference (OpenGL 函数)

c++ - 带有立方体贴图数组的 glTextureStorage3D 上的 GL_INVALID_VALUE

c++ - 使用 GLUT 使 OpenGL 窗口居中

javascript - 如何在 webgl 中使用 uv 纹理包裹空间以制作黑洞

c++ - GLSL : uniform buffer object example