【问题标题】:reading pixel data from framebuffer从帧缓冲区读取像素数据
【发布时间】:2015-07-02 14:27:15
【问题描述】:

我正在使用 opengl 在 qt 中编写一个界面,并且我有一个 QGLWidget,它在屏幕上绘制了一些顶点。

我正在尝试更改像素数据以使图像更亮,但是 glreadpixels 给出了非常奇怪的结果

我将像素读入一个 3 维数组,以便查看位置和 RGB 值。

这是我的一些代码

GLuint pixels[w][h][3];
glReadPixels( 0, 0, w, h, GL_RGB, GL_INT, pixels)

for(int i = 0; i < w; i++)
     for(int j = 0; j < h; j++)
         cout << pixels[i][j][0] << " ";
         cout << pixels[i][j][1] << " ";
         cout << pixels[i][j][2] << " ";

现在我的目标只是看到打印出来的像素数据,但是我在终端中得到的输出几乎全是 0,但是当我看到 0 以外的东西时,它的值非常大,比如 4294967295。

我知道颜色值的范围是 0-255,所以我不太确定发生了什么。

【问题讨论】:

    标签: c++ qt opengl glreadpixels


    【解决方案1】:

    如果您将每个组件作为单独的元素存储在数组中,则数组的类型应为 GLubyte(范围 0-255)。另外,请求的类型应该是GL_UNSIGNED_BYTE:

    GLubyte pixels[w][h][3];
    glReadPixels( 0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pixels);
    
    for(int i = 0; i < w; i++)
    {
         for(int j = 0; j < h; j++)
         {
             cout << +pixels[i][j][0] << " ";
             cout << +pixels[i][j][1] << " ";
             cout << +pixels[i][j][2] << " ";
         }
    }
    

    【讨论】:

    • 当我尝试时,我只得到我认为是代表 ascii 文本的符号
    • 把一元加号运算符放在前面转换成数字
    • 现在我看到了!所以我想现在我有点难过,我将如何改变这些值?当我尝试直接更改它们时,我得到一个核心转储
    • 您可以使用 glDrawPixels:opengl.org/sdk/docs/man2/xhtml/glDrawPixels.xml 但是这有点与 OpenGL 的工作方式作斗争,因为您正在有效地进行软件渲染。你能改变小部件的渲染让它一开始就变得更亮吗?
    • 我真的不知道从哪里开始考虑这是我正在学习的 gui 课程的另一个项目,我认为 glDrawPixels 只是将信息从内存写回缓冲区?我希望在推回之前更改像素数据
    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多