我知道有很多关于使用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。我现在不知道该版本是否有任何问题。
答案 0 :(得分:0)
好的我解决了这个问题。我只允许使用GL_RGBA加载GL_UNSIGNED_BYTE类型。所以:
glReadPixels(0, 0, _frameSize, _frameSize, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
现在有效。