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

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

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

  • 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)按钮来生成库文件。
macOS基于glew、glfw、glad的OpenGL环境配置_第1张图片
Glad 图1

macOS基于glew、glfw、glad的OpenGL环境配置_第2张图片
Glad 图2

macOS基于glew、glfw、glad的OpenGL环境配置_第3张图片
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可以拖进去
macOS基于glew、glfw、glad的OpenGL环境配置_第4张图片
  1. 修改Header Search PathsLibrary Search Paths
Header Search Paths

Library Search Paths
  1. 添加三个库
    /usr/local/Cellar/glfw/3.3/lib/libglfw.3.3.dylib
macOS基于glew、glfw、glad的OpenGL环境配置_第5张图片
  1. glad.c添加到项目中
macOS基于glew、glfw、glad的OpenGL环境配置_第6张图片
  1. glad要先于glfw引入,如下
#include  // 要选于glfw引入
#include 
  1. 测试代码
#include 
#include  // 要选于glfw引入
#include 

// 回调函数声明
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. 效果图如下
macOS基于glew、glfw、glad的OpenGL环境配置_第7张图片
  1. 成功运行即可

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

你可能感兴趣的:(macOS基于glew、glfw、glad的OpenGL环境配置)