我将 EGL 与 Xlib 和 OpenGL 一起使用。当我直接在窗户上画画时,一切都很好。现在我试图使用像素图作为 EGL 表面,但 OpenGL 根本没有改变它。
我使用 OpenGL 用蓝色清洁背景。这是我得到的:
这是证明问题的最小示例(绘制这个垃圾)。
更新:我添加了错误检查并发现eglCopyBuffers产生EGL_BAD_NATIVE_PIXMAP. 文档告诉这可能在两种情况下发生:如果实现不支持本机像素图或本机像素图参数无效。他们俩似乎都不太可能。如果我可以毫无错误地创建像素图表面,我相信实现支持本机像素图。如果我可以使用本机方法在像素图上绘制,例如XFillRectangle我相信像素图是有效的。
更新:我在带有 Ubuntu Gnome 的笔记本电脑上运行它。它有两个显卡:Intel HD Graphics 5500(driver=i915) 和 Nvidia GeForce 920m(driver=nvidia)。es2_info 输出的主线(完整版):
EGL_VERSION: 1.4
EGL_VENDOR: NVIDIA
EGL_CLIENT_APIS: OpenGL_ES OpenGL
GL_VERSION: OpenGL ES 3.2 NVIDIA 375.66
GL_RENDERER: GeForce 920M/PCIe/SSE2
Run Code Online (Sandbox Code Playgroud)
代码:
EGL_VERSION: 1.4
EGL_VENDOR: NVIDIA
EGL_CLIENT_APIS: OpenGL_ES OpenGL
GL_VERSION: OpenGL ES 3.2 NVIDIA 375.66
GL_RENDERER: GeForce 920M/PCIe/SSE2
Run Code Online (Sandbox Code Playgroud)
事实证明eglBindApi(EGL_OPENGL_API)这是问题的根源。当你删除一个时,你会得到预期的蓝色方块。
默认情况下,EGL 使用 OpenGL ES 作为渲染 API,它根本无法与 OpenGL 渲染 API 一起使用。我找不到使用 EGL 和 OpenGL 渲染 API 的单个代码示例,但我找到了这个答案。这让我认为 EGL 不应该与 OpenGL 一起工作,即使eglBindApi(EGL_OPENGL_API)不返回EGL_BAD_PARAMETER,也必须根据文档“如果 EGL 实现不支持指定的客户端 API”返回。
所以我不接受这个答案,因为将 OpenGL 设置为渲染 API 会破坏代码的实际原因仍然未知。