【问题标题】:How to glReadPixels properly to write the data into QImage in Linux如何在 Linux 中正确 glReadPixels 将数据写入 QImage
【发布时间】:2019-08-05 21:22:41
【问题描述】:

总结

我想通过 glReadPixels 将 opengl 像素(GL_RGB)写入 QImage。这呈现正确,但是当我调整窗口大小时,它会奇怪地缩放并扭曲我的形状(三角形)。

我尝试了什么

我试过(QImage)img.scale(width(),height(),Qt::KeepAspectRatio) 但它并没有解决问题。

玩过我如何将像素缓冲区从glReadPixels 写入QImage,但没有。没用。

我应该读取三个缓冲区中的像素(GLubyte *rpixel,*gpixel,*bpixel)还是一个(GLubyte **pixels)?哪个最简单,因为当我调整窗口大小时我会调整数组大小(所以我想要动态数组)。

一些代码

我已经上传了一个最小的代码来重新创建 github 中的错误奇怪行为。下载并使用 Qt Creator 进行编译。 https://github.com/rivenblades/GlReadPixelsQT/tree/master

图片

这就是我想要的(不调整大小时它可以工作)

这是调整大小后(奇怪的行为)

如您所见,在调整大小时,图像在右侧被分割,在左侧可能在另一行继续。所以我猜图像的大小是错误的(需要更多宽度?)。

【问题讨论】:

    标签: qt opengl glfw glew glreadpixels


    【解决方案1】:

    默认情况下,假定图像的每一行的开头对齐到 4 个字节。这是因为GL_PACK_ALIGNMENTGL_UNPACK_ALIGNMENT参数默认为4,见glPixelStore
    glReadPixels 读取帧缓冲区时,会考虑GL_PACK_ALIGNMENT 参数。

    如果您想在紧凑的内存中读取图像,并且在每行的开头不对齐,那么您必须在读取帧缓冲区的颜色平面之前将 GL_PACK_ALIGNMENT 参数更改为 1:

    glPixelStorei(GL_PACK_ALIGNMENT, 1);
    
    glReadPixels(0,0,unchangable_w, unchangable_h, GL_RED, GL_UNSIGNED_BYTE, tga.rpic);
    glReadPixels(0,0,unchangable_w, unchangable_h, GL_GREEN, GL_UNSIGNED_BYTE, tga.gpic);
    glReadPixels(0,0,unchangable_w, unchangable_h, GL_BLUE, GL_UNSIGNED_BYTE, tga.bpic); 
    

    如果错过了这一点,则会在图像的每一行产生移位效果,除非图像的一行长度(以字节为单位)可以被 4 整除。

    【讨论】:

    • 我添加了 glPixelStorei(GL_PACK_ALIGNMENT,1);并且当我调整大小时它可以正常工作。但是,如果我调整太多,它会切割三角形,如果我以这种方式调整大小,它会水平切割,如果以另一种方式调整,它会垂直切割。请检查我在 github 上的代码以查看问题。 [链接] (github.com/rivenblades/GlReadPixelsQT/blob/master/README.md)
    • 好吧,我想通了。我需要调用 glfwSetWindowSize(GLFWwindow*,m_width,m_height);在 Qt 的 resizeEvent 中。另外我需要在小部件中传递 GLFWwindow* 实例来做前面的事情。
    猜你喜欢
    • 2019-07-20
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2011-10-26
    • 1970-01-01
    • 2022-10-14
    • 2014-12-14
    相关资源
    最近更新 更多