XCODE搭建OpenGL开发环境

752 阅读2分钟

下载GLFW

GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。

WX20220213-170942@2x.png

下载GLAD

因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。
GLAD是一个开源的库,它能解决我们上面提到的那个繁琐的问题。

  • 点击下载页
  • 选择OpenGL版本,设置模式为Core,并且保证生成加载器(Generate a loader)的选项是选中的。
  • 点击生成(Generate)按钮来生成库文件

WX20220213-172623@2x.png

  • 下载生成的文件

WX20220213-172745@2x.png

解压文件

  • 解压下载好的GLFW和GLAD文件

WX20220213-173104@2x.png

  • 在用户目录下面新建OpenGL文件夹,并在文件夹里面新建include文件夹 用户目录\OpenGL\include
  • 在刚创建的 OpenGL文件夹里面新建libs文件夹
  • glfw-3.3.6.bin.MACOS\include下面的所有文件复制到用户目录\OpenGL\include里面
  • glfw-3.3.6.bin.MACOS\lib-x86_64里面的所有文件复制到 用户目录\OpenGL\libs里面
  • glad\include文件夹里面的所有文件复制到用户目录\OpenGL\include文件里面
  • glad文件夹里面的src文件夹,复制到用户目录\OpenGL里面

新建项目

  • 打开xcode,点击新建项目

WX20220213-174148@2x.png

  • 选择命令行项目

WX20220213-174239@2x.png

  • 输入项目名称,项目语言选择C++

WX20220213-174329@2x.png

  • 链接GLFW和GLAD头文件

WX20220213-175317@2x.png

  • 双击 Header Search Paths,把用户目录\OpenGL\include全路径复制到窗口中

WX20220213-180034@2x.png

  • 关闭窗口
  • 添加静态库和动态库文件

image.png

  • 点击 New Group 命名为 libs
  • 找到 用户目录\OpenGL\libs中的libglfw.3.dyliblibglfw3.a,拖进项目中的libs文件夹中
  • 找到用户目录\OpenGL\src中的glad.c文件,拖进项目中的libs文件夹中

image.png

  • 添加 IOKit.framework,AppKit.framework,CoreFoundation.framework 这三个文件

image.png

image.png

  • main.cpp文件中编写代码
#include <glad/glad.h>
#include <GLFW/glfw3.h>

#include <iostream>

void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);

const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

int main()
{
    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);
#endif

    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }    


    while (!glfwWindowShouldClose(window))
    {

        processInput(window);

        // render
        // ------
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}


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)
{
    glViewport(0, 0, width, height);
}
  • 编译并运行代码 image.png