hellomyprogram 发表于 2023-10-11 22:24:29

MinGW OpenGL版本过低

我在按照网上的 OpenGL 教程编代码的时候,遇到了这样的问题: glCreateShader 函数不存在。
结果我发现这是我的 MinGW 提供的 OpenGL 版本过低导致的,我获取了 OpenGL 的版本,发现:
Warning: The created OpenGL context does not fully meet the settings that were requested
Requested: version = 1.1 ; depth bits = 32 ; stencil bits = 0 ; AA level = 0 ; core = false ; debug = false ; sRGB = false
Created: version = 4.6 ; depth bits = 24 ; stencil bits = 8 ; AA level = 0 ; core = false ; debug = false ; sRGB = false
4.6.0 - Build 31.0.101.3959
这说明我的设备最高支持 4.6 的 OpenGL ,但是 MinGW 提供的版本只有 1.1 。
我尝试升级 MinGW 版本,但是在最新版的 MinGW 中,也不提供 glCreateShader 类似的函数。
我希望能够升级我的 OpenGL ,以使用到更新的功能,而不是像是网上的教程一样一味下载新的第三方库。

isdkz 发表于 2023-10-11 22:24:43

MinGW的OpenGL版本过低,可以尝试使用GLEW或GLAD等第三方库来解决。这些库可以在运行时动态加载OpenGL函数,从而使得我们能够使用最新的OpenGL功能。

以下是使用GLEW的步骤:

1. 下载GLEW库,可以从官网上下载:http://glew.sourceforge.net/
2. 解压下载的GLEW库,将其中的glew.h和glew.c文件拷贝到你的项目中。
3. 在你的代码中包含glew.h头文件,并在你的代码中调用glewInit()函数,该函数会初始化GLEW库并加载OpenGL函数。
4. 在调用OpenGL函数之前,需要检查函数是否已经成功加载,可以使用glewIsSupported()函数来检查。

下面是一个使用GLEW的例子:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main()
{
    // 初始化GLFW库
    if (!glfwInit())
    {
      std::cerr << "Failed to initialize GLFW" << std::endl;
      return -1;
    }

    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL", NULL, NULL);
    if (!window)
    {
      std::cerr << "Failed to create GLFW window" << std::endl;
      glfwTerminate();
      return -1;
    }

    // 设置当前上下文
    glfwMakeContextCurrent(window);

    // 初始化GLEW库
    if (glewInit() != GLEW_OK)
    {
      std::cerr << "Failed to initialize GLEW" << std::endl;
      glfwTerminate();
      return -1;
    }

    // 检查OpenGL版本
    std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;

    // 检查glCreateShader函数是否已经成功加载
    if (!glewIsSupported("GL_ARB_vertex_shader GL_ARB_fragment_shader GL_ARB_shader_objects GL_ARB_shading_language_100"))
    {
      std::cerr << "Failed to load OpenGL functions" << std::endl;
      glfwTerminate();
      return -1;
    }

    // 使用OpenGL函数
    GLuint shader = glCreateShader(GL_VERTEX_SHADER);

    // 清理资源
    glfwTerminate();
    return 0;
}

Mike_python小 发表于 2023-10-11 22:24:50

在使用 MinGW 进行 OpenGL 开发时,可能会遇到这样的问题。MinGW 的默认 OpenGL 版本较低,因此需要进行一些额外的配置和步骤来升级 OpenGL 版本。以下是一些可能的解决方法:

1. 使用 GLEW 或 GLAD:下载并配置 GLEW(OpenGL Extension Wrangler)或 GLAD(OpenGL Loader-Generator),它们是开源库,用于管理 OpenGL 函数指针的加载。通过使用其中一个库,你可以使用最新版本的 OpenGL 函数,无论 MinGW 提供的 OpenGL 版本如何。

2. 手动加载 OpenGL 函数指针:如果你不想使用额外的库,可以手动加载所需的 OpenGL 函数指针。这需要使用平台特定的函数,如 Windows 中的 wglGetProcAddress。你可以查找每个函数的地址并将其分配给函数指针变量,以便在代码中使用。

下面是一个示例代码片段,演示如何手动加载 glCreateShader 函数:


#include <windows.h>
#include <GL/gl.h>

typedef void (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
PFNGLCREATESHADERPROC glCreateShader = NULL;

int main() {
    HINSTANCE hInstance = LoadLibrary("opengl32.dll");
    glCreateShader = (PFNGLCREATESHADERPROC)GetProcAddress(hInstance, "glCreateShader");

    if (glCreateShader == NULL) {
      // 加载失败,处理错误
      return 1;
    }

    // 使用 glCreateShader 函数进行后续操作
    // ...

    return 0;
}


通过手动加载函数指针,你可以使用所需的 OpenGL 函数,而不必依赖于 MinGW 提供的版本。但是需要注意的是,这种方法需要仔细处理函数指针的加载和错误处理。

希望以上解决方法对你有所帮助,让你能够升级并使用更新的 OpenGL 功能。如果你需要更多帮助,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: MinGW OpenGL版本过低