GLFW 无法加载所有 GL ES 2.0 功能

Mic*_* IV 2 opengl-es glfw egl

我正在尝试设置 GLFW 来创建窗口和 OpenGL ES 2.0 上下文,因为我需要开箱即用的东西来管理输入回调等。问题是这样的,如果我使用以下设置:

    glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
    glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_NATIVE_CONTEXT_API);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);

    glfwindow  = glfwCreateWindow(width, height, "Window Title", NULL, NULL);
    if (!glfwindow)
    {
        glfwTerminate();
        exit(1);
    }

    glfwMakeContextCurrent(glfwindow);
Run Code Online (Sandbox Code Playgroud)

使用GLFW_NATIVE_CONTEXT_API作为 GLFW_CONTEXT_CREATION_API 提示为我提供了有关供应商的以下信息:

GL 版本:OpenGL ES 3.2 NVIDIA 368.69 GL 供应商:NVIDIA Corporation GL 渲染器:GeForce GTX 960M/PCIe/SSE2 GLSL 版本:OpenGL ES GLSL ES 3.20

然后它甚至无法创建着色器(glCreateShader())返回0。

但是,如果我使用GLFW_EGL_CONTEXT_API的提示标志,我就可以成功完成大多数 GL 例程,例如着色器加载、程序编译和链接、GL VBO 设置等。但随后我在 glDrawElements() 上失败。

如果我使用此设置打印供应商信息,我可以看到:

GL 版本:4.5.0 NVIDIA 368.69 GL 供应商:NVIDIA Corporation GL 渲染器:GeForce GTX 960M/PCIe/SSE2 GLSL 版本:4.50 NVIDIA

所以,对我来说很奇怪的是,当 EGL 应该是上下文创建的底层 API 时,我却得到了桌面 OpenGL 设置。

另外,如果我尝试手动检索 glDrawElements 的函数指针,它会返回 null。

PFNGLDRAWELEMENTSPROC func = reinterpret_cast<PFNGLDRAWELEMENTSPROC>
(eglGetProcAddress("glDrawElements"));
Run Code Online (Sandbox Code Playgroud)

我想了解可能出现的问题以及如何以正确的方式使用 GLFW 进行 GL ES 上下文创建。

Mic*_* IV 5

由于没有人回答我自己的问题,并且因为我很早之前就找出了问题的根源,这里是解释:

GLFW 对于 GLES 上下文初始化工作得很好。问题出在链接的库上。在 Windows 上模拟 GLES 时,不得与 opengl32.lib 链接。在我的例子中,我使用 PowerVR SDK 及其 ES2 和 ES3 库。因此,以下库是必须的:

glfw3.lib

libEGL库

libGLESv2.lib

在我的链接器中,因为默认情况下我使用桌面 OpenGL,所以我还链接了opengl32.lib,它可能优先于其他 GL 库。在桌面平台上运行 GLES 时,请确保排除它。