GLFW无法加载所有GL ES 2.0函数

时间:2016-08-13 19:51:25

标签: 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);

使用 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"));

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

1 个答案:

答案 0 :(得分:1)

由于没有人回答我自己的问题,而且因为我很久以前就已经找到了问题的根源,所以解释如下:

GLFW适用于GLES上下文初始化。问题在于链接的库。在Windows上模拟GLES时,不得与opengl32.lib链接。在我的情况下,我使用PowerVR SDK及其ES2和ES3库。因此,以下库是必需的:

<强> glfw3.lib

<强> libEGL.lib

<强> libGLESv2.lib

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