美文网首页OpenGL
macOS基于glew、glfw、glad的OpenGL环境配置

macOS基于glew、glfw、glad的OpenGL环境配置

作者: 申申申申申 | 来源:发表于2019-07-15 14:44 被阅读0次
    • GLEW:由于 OpenGL 只是一种 标准/规范,并且是由驱动制造上在驱动中予以实现。OpenGL 的大多数函数在编译时(compile-time)是未知状态的,需要在运行时(run-time)来请求。GLEW 的工作就是获取所需的函数的地址,并储存在函数指针中供使用。(还有其他类似的:GLAD

    • GLFW:是一个专门针对 OpenGLC 语言库,提供了渲染物体所需的最低限度的接口。其允许用户创建 OpenGL 上下文,定义窗口参数以及处理用户输入,把物体渲染到屏幕所需的必要功能。(注意:OpenGL 并不规定窗口创建和管理的部分,这一部分完全交由 GLFW 来实现;还有其他类似的:GLUTSDL等)

    • GLAD:是一个开源的库,功能跟 GLEW 类似。GLAD 使用了一个在线服务(能够告诉 GLAD 需要定义的 OpenGL 版本,并且根据这个版本加载所有相关的 OpenGL 函数)


    1. 安装homebrew
    $ gcc --version
    $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    $ brew doctor
    $ brew update
    
    1. 使用homebrew安装glewglfw
    $ brew install glew
    $ brew install glfw3
    

    结果类似于如下

    bogon:~ fengfeng$ brew install glew
    ==> Downloading https://homebrew.bintray.com/bottles/glew-2.1.0.mojave.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/a8/a81e04f8be35080991e136e0b2229448fd237a31991d34d5a
    ######################################################################## 100.0%
    ==> Pouring glew-2.1.0.mojave.bottle.tar.gz
    🍺  /usr/local/Cellar/glew/2.1.0: 38 files, 3MB
    bogon:~ fengfeng$ 
    
    bogon:~ fengfeng$ brew install glfw3
    Updating Homebrew...
    ==> Downloading https://homebrew.bintray.com/bottles/glfw-3.3.mojave.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring glfw-3.3.mojave.bottle.tar.gz
    🍺  /usr/local/Cellar/glfw/3.3: 14 files, 497.9KB
    bogon:~ fengfeng$ 
    
    1. 配置glad
      glad的配置与大多数的开源库有些不同
      glad使用 在线服务,https://glad.dav1d.de/,告诉glad需要定义的OpenGL版本,会根据这个版本加载所有的相关的函数
      将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。现在可以先忽略拓展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。
    Glad 图1
    Glad 图2
    Glad 图3

    glad会提供一个zip压缩文件,包含两个头文件目录,和一个glad.c文件,如下

    bogon:~ fengfeng$ tree /Users/fengfeng/Desktop/glad 
    /Users/fengfeng/Desktop/glad
    ├── include
    │   ├── KHR
    │   │   └── khrplatform.h
    │   └── glad
    │       └── glad.h
    └── src
        └── glad.c
    
    4 directories, 3 files
    bogon:~ fengfeng$ 
    

    将两个头文件目录(gladKHR)复制到/usr/local/include,并添加glad.c到工程中

    1. Xcode创建一个C++Command Line Tool的项目
    2. 设置变量,command + ,,如下
      Path可以拖进去
    1. 修改Header Search PathsLibrary Search Paths
    Header Search Paths
    Library Search Paths
    1. 添加三个库
      /usr/local/Cellar/glfw/3.3/lib/libglfw.3.3.dylib
    1. glad.c添加到项目中
    1. glad要先于glfw引入,如下
    #include <glad/glad.h> // 要选于glfw引入
    #include <GLFW/glfw3.h>
    
    1. 测试代码
    #include <iostream>
    #include <glad/glad.h> // 要选于glfw引入
    #include <GLFW/glfw3.h>
    
    // 回调函数声明
    void framebuffer_size_callback(GLFWwindow* window, int width, int height);
    void processInput(GLFWwindow *window);
    
    // settings
    const unsigned int SCR_WIDTH = 300;
    const unsigned int SCR_HEIGHT = 300;
    
    int main(int argc, char * argv[]) {
        // 初始化GLFW
        glfwInit();
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    #ifdef __APPLE__
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
    #endif
        // 创建一个窗口对象
        GLFWwindow *window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "opengl_190715", NULL, NULL);
        if (window == NULL)
        {
            std::cout << "Failed to create GLFW window" << std::endl;
            glfwTerminate();
            return -1;
        }
        // 通知GLFW将我们窗口的上下文设置为当前线程的主上下文
        glfwMakeContextCurrent(window);
        // 对窗口注册一个回调函数,每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理
        glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
        // 初始化GLAD用来管理OpenGL的函数指针
        if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
            std::cout << "Failed to initialize GLAD" << std::endl;
            return -1;
        }
    
        // 渲染循环
        while(!glfwWindowShouldClose(window)) {
            // 输入
            processInput(window);
    
            // 渲染指令
            glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);
    
            // 检查并调用事件,交换缓冲
            glfwPollEvents(); // 检查触发事件
            glfwSwapBuffers(window); // 交换颜色缓冲
        }
    
        // 释放/删除之前的分配的所有资源
        glfwTerminate();
        return EXIT_SUCCESS;
    }
    
    // 输入控制,检查用户是否按下了返回键(Esc)
    void processInput(GLFWwindow *window) {
        if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
            glfwSetWindowShouldClose(window, true);
    }
    
    // 当用户改变窗口的大小的时候,视口也应该被调整
    void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
        // 注意:对于视网膜(Retina)显示屏,width和height都会明显比原输入值更高一点。
        glViewport(0, 0, width, height);
    }
    
    1. 效果图如下
    1. 成功运行即可

    不定期更新 不合适的地方 还请指点~ 感激不尽

    相关文章

      网友评论

        本文标题:macOS基于glew、glfw、glad的OpenGL环境配置

        本文链接:https://www.haomeiwen.com/subject/eavgkctx.html