我正在尝试设置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上下文创建。
答案 0 :(得分:1)
由于没有人回答我自己的问题,而且因为我很久以前就已经找到了问题的根源,所以解释如下:
GLFW适用于GLES上下文初始化。问题在于链接的库。在Windows上模拟GLES时,不得与opengl32.lib链接。在我的情况下,我使用PowerVR SDK及其ES2和ES3库。因此,以下库是必需的:
<强> glfw3.lib 强>
<强> libEGL.lib 强>
<强> libGLESv2.lib 强>
在我的链接器中,因为默认情况下我使用的是桌面OpenGL,我还使用 opengl32.lib 链接,它可能优先于其他GL库。确保在运行时排除它桌面平台上的GLES。