为什么我没有获得与GLFW向前兼容的OpenGL上下文
Why am I not getting a forward compatible OpenGL context with GLFW?
我所知,当我在GLFW上设置这些上下文约束时:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
我应该在正在运行的机器上获得最大可用的 OpenGL 上下文,前提是它高于 OpenGL 3.3。但是,通过使用glGetString
来获取OpenGL上下文版本,我发现情况并非如此。每次我向glGetString
查询上下文版本时,我只会得到我用 glfwWindowHint
设置的主要和次要版本,上面没有。请记住,我的GPU支持OpenGL 4.5。
另一件需要注意的事情是,当我不设置任何约束时,我实际上会得到一个 OpenGL 4.5 上下文。
这是完整的源代码,它似乎复制了这个问题:
#define GLEW_STATIC
#include <iostream>
#include <GLglew.h>
#include <GLFWglfw3.h>
#include <glmglm.hpp>
int main(int argc, char argv[])
{
if (!glfwInit())
{
std::cerr << "Failed to initialize GLFW 3.0.4" << std::endl;
getchar();
glfwTerminate();
return -1;
}
std::cout << "Initialized GLFW 3.0.4" << std::endl;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* m_window = glfwCreateWindow(640, 480, "Koala", NULL, NULL);
if (!m_window)
{
std::cerr << "Failed to create OpenGL 3.3+ context" << std::endl;
getchar();
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(m_window);
std::cout << "Created OpenGL 3.3+ context" << std::endl;
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cerr << "Failed to initialize GLEW 1.11.0" << std::endl;
getchar();
glfwTerminate();
return -1;
}
std::cout << "Initialized GLEW 1.11.0" << std::endl;
const GLubyte* renderer = glGetString(GL_RENDERER);
const GLubyte* version = glGetString(GL_VERSION);
std::cout << "GPU: " << renderer << std::endl;
std::cout << "OpenGL Version: " << version << std::endl;
while (!glfwWindowShouldClose(m_window))
{
glfwSwapBuffers(m_window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
这不是我应该在正在运行的机器上获得最大可用的 OpenGL 上下文,前提是它高于 OpenGL 3.3。
它的定义方式。来自 GLFW 文档:
GLFW_CONTEXT_VERSION_MAJOR和GLFW_CONTEXT_VERSION_MINOR提示指定创建的上下文必须兼容的客户端 API 版本。
对于 OpenGL,这些提示不是硬约束,因为它们不必完全匹配,但如果生成的 OpenGL 版本小于请求的版本,glfwCreateWindow 仍将失败。
虽然无法要求驱动程序提供最高受支持版本的上下文,但当您向 GLFW 询问版本 1.0 上下文时,大多数驱动程序都会提供此信息。
因此,"大多数司机"会给您所期望的,但这并不能保证。
典型的用法是指定支持代码使用的所有功能的最低版本。然后你不在乎你是否得到那个版本,或者可能是更高的版本。但是您知道,如果不支持最低版本,则会失败。
如果要动态测试支持哪个版本,最好的办法可能是首先指定可以利用的最高版本,然后测试 glfwCreateWindow()
的返回值。如果失败,只要失败,就降低版本,然后再次调用glfwCreateWindow()
,直到达到可以运行的最低版本。然后,您可以跟踪哪个版本成功,或者glGetString(GL_VERSION)
报告的版本,并使用它来在运行时决定可以使用哪些功能。
您从 glGetString 收到的版本并不意味着该功能以该版本为上限。根据我们的经验,我们收到一个 3.3 上下文,它可以执行来自该驱动程序的任何上下文可以执行的所有操作(我的意思是 4.2+ 版本功能)。您只需要担心驱动程序所需的最低版本。
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL 调试上下文警告 -"将使用视频内存作为缓冲区异议的来源
- 当要求兼容性时,核心OpenGL上下文?
- GTKmm Opengl 上下文未初始化
- E/libEGL:调用没有当前上下文的 OpenGL ES API (每个线程记录一次) - Android/SDL
- 在上下文初始化之前查询支持的最高 OpenGL 版本?
- 如何将 Unity 上下文导入 OpenGL 窗口
- Electron中神秘无效的OpenGL上下文
- 如何在glfw中为OpenGL设置核心配置文件上下文?
- 是多个线程渲染到单个OpenGL上下文线程安全的线程
- 如何为 QtQuick 应用程序选择 OpenGL 上下文
- 加载的 OpenGL 函数是特定于上下文还是特定于线程?(视窗)
- SetPixelFormat() 中的第三个参数对于 OpenGL 上下文创建有什么意义?
- 使用WGL创建现代OpenGL上下文
- 如何为第三方渲染提供空的QML项目的OpenGL上下文
- 用于在许多Qopenglwidget中显示的FBO渲染的全局OpenGL上下文
- 在 Mac OS X 10.9 中使用 GLFW 创建 OpenGL 3.3 上下文
- SDL_net没有创建OpenGL上下文
- 在运行时从OpenGL上下文切换到D3D/DX上下文(或其他上下文)
- Opengl:呈现到 Win32 API 上下文