1

我正在开发一个涉及 OpenGLES (3.1) 的跨平台项目。Windows虽然代码在我和Ubuntu机器上完美执行。在 Raspberry PI 4 上运行相同的代码会导致一个奇怪的问题,在使用glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, 0)调用成功初始化纹理后,稍后在请求相同 FrameBuffer 的可用读取类型的代码中glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, ...)返回 GL_GRBA。对于上下文创建,我将 GLFW 与 GLAD 一起使用。下面是纹理初始化的完整代码:

...
GLuint pix_buf;
glGenFramebuffers(1, &pix_buf);
glBindFramebuffer(GL_FRAMEBUFFER, pix_buf);
GLuint text;
glGenTextures(1, &text);
glBindTexture(GL_TEXTURE_2D, text);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, text, 0);

GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
    std::cout << "Frame buffer was not initialized" << std::endl;
    return;
}

GLint read_format, read_type;
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &read_format);
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &read_type);
...
  • read_format值等于GL_RGBA哪个应该GL_RGB
  • read_type值等于GL_UNSIGNED_BYTE预期

因此,在渲染调用尝试读取纹理到本地back_buf数组后,使用:glReadPixels(0, 0, 16, 256, GL_RGB, GL_UNSIGNED_BYTE, back_buf)导致GL_INVALID_OPERATIONwith glReadPixels(invalid format GL_RGB and/or GL_UNSIGNED_BYTE). 将读取类型从更改GL_RGBGL_RGBA修复错误,但我的程序无法使用生成的数据格式(我严格寻找 GL_RGB 格式)。

我的问题是我做错了什么还是 Raspberry PI 4 OpenGLES 驱动程序有问题?

4

0 回答 0