使用glReadPixels()

时间:2017-03-06 07:19:05

标签: c++ qt opengl-es

我知道有很多关于使用glReadPixels()从缓冲区中读取浮点数的问题。但我仍然没有找到问题的答案。 我想把这个程序运行到我的iPhone上。我正在使用QT并首先在计算机上测试应用程序,从缓冲区读取浮点值没有问题。但现在使用OpenGL ES我不被允许。我的结果是随意的。

我想改变的是。我用glReadPixels()读取缓冲区中的GLubyte并将这些结果转换为浮点数。 现在我的问题,为什么我仍然得到任意结果?我不知道如果我以某种方式读取缓冲区错误或者我无法将GLubyte转换为浮动。

据我所知,GLubyte是一个简单的unsigned char,据我所知,它实际上对于一个浮点数的类型转换没有问题。

    glViewport(0, 0, _frameSize, _frameSize);
    glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
    glClearColor(1.0,0.0,0.0, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    program.bind();

    glBindBuffer(GL_ARRAY_BUFFER, _vbo);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, (GLvoid*)0);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glUniform1i(glGetUniformLocation(program.programId(), "texture"), 0);

    //glDrawArrays(GL_TRIANGLES, 0, 6);
    glDisableVertexAttribArray(0);

这是我对Framebuffer' _fbo'的抽签。我们可以看到我推荐了实际的绘制调用,我只想清除缓冲区并希望只读出值(1,0,0)。

    GLubyte* pixels = new GLubyte[_frameSize* _frameSize*3];
    float* pixels_f = new float[_frameSize* _frameSize*3];
    glReadPixels(0, 0, _frameSize, _frameSize, GL_RGB, GL_UNSIGNED_BYTE, pixels);

我正在分配ne存储空间,我现在想要读取存储在缓冲区中的像素值。 之后我只想复制存储在'像素'中的值。至' pixels_f'把它们扔到浮子上。

我的结果真的是随意的我不知道是不是因为从GLubyte到float的转换不起作用,或者我现在通过读取缓冲区做错了。因为当我在计算机上使用OpenGL并使用GL_Float读取缓冲区时,我没有遇到任何问题。

经过一些调试后我发现,glReadPixels()收到错误:1280。但是只能在OpenGL ES上运行而不是在OpenGL上运行。

当我使用OpenGL运行程序时,我有版本:GL_SHADING_LANGUAGE_VERSION:1.20

使用OpenGL ES: GL_SHADING_LANGUAGE_VERSION:OpenGL ES GLSL ES 3.00

我不知道为什么,实际上两者都应该是1.2。我现在不知道该版本是否有任何问题。

1 个答案:

答案 0 :(得分:0)

好的我解决了这个问题。我只允许使用GL_RGBA加载GL_UNSIGNED_BYTE类型。所以:

glReadPixels(0, 0, _frameSize, _frameSize, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

现在有效。