mac下Opengl环境配置

1,894 阅读2分钟

mac下Opengl环境配置

第一次学习opengl时老是会遇到很多环境配置的问题,这里记录一下相关配置,少踩坑。 使用的电脑是M1版本mac,其他版本配置略有不同,需要自行更改。

方案

这里使用glfw+glad的方案

  • glfw 是配合 OpenGL 使用的轻量级工具程序库,缩写自 Graphics Library Framework(图形库框架)。GLFW 的主要功能是创建并管理窗口和 OpenGL 上下文,同时还提供了处理手柄、键盘、鼠标输入的功能。
  • 因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。为了解决这个问题这里使用glad。

安装glfw

这里使用homebrew进行安装,没有homebrew的需要先安装

brew install glfw3

下载配置glad

打开glad网页,将语言(Language)设置为C/C++,在API选项中,选择4.1的OpenGL(gl)版本(根据自己电脑的配置选择)。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。现在可以先(暂时)忽略拓展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。下载zip文件

解压后将include下的glad和KHR目录复制到系统环境的inclue中,我的是m1款mac路径为/opt/homebrew/include/,需要根据自己的环境进行更改

xcode配置

image.png

image.png liblfw.3.3.dylib在glfw安装目录下可以找到

glad压缩包src目录下的glad.c文件拷贝到工程中,这里会有一些glad和KHR头文件导入的错误,修改层正确的路径后即可(我的环境下,将目录删除,直接引用文件名即可)

测试代码

下面的测试代码会显示出一个窗口,正常显示的话配置就没问题了。

⚠️需要注意的是glad.h的头文件要在glfw3.h之前,否则会报错

//必须在glfw前面
#include <glad.h>
#include <iostream>
#include <GLFW/glfw3.h>

int main(int argc, const char * argv[]) {
    
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    
#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
    
    GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
    if (window == nullptr){
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }
    
    int width, height;
    glfwGetFramebufferSize(window, &width, &height);
    
    glViewport(0, 0, width, height);
    
    while(!glfwWindowShouldClose(window)){
        //游戏循环
        glfwPollEvents();
        glfwSwapBuffers(window);
    }
    return 0;
}

参考

learnopengl-cn