返回

在M1 MacOS上使用Xcode配置OpenGL环境(arm64)

IOS

准备工作

在开始配置OpenGL环境之前,您需要确保您的M1 Mac已安装Xcode 13或更高版本,并已启用Rosetta 2以支持arm64架构。此外,您还需要安装homebrew,这是一个方便的包管理工具,可以帮助您轻松安装各种软件和库。

安装Homebrew

  1. 打开终端,复制并粘贴以下命令:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 按下回车键并输入您的密码以允许安装。

安装CMake

  1. 使用homebrew安装CMake:
brew install cmake
  1. 验证CMake是否已成功安装:
cmake --version

输出应类似于:

cmake version 3.22.1

安装GLEW

  1. 使用homebrew安装GLEW:
brew install glew
  1. 验证GLEW是否已成功安装:
glew-config --version

输出应类似于:

GLEW version 2.1.0

安装GLFW

  1. 使用homebrew安装GLFW:
brew install glfw
  1. 验证GLFW是否已成功安装:
glfw3 --version

输出应类似于:

glfw 3.3.8

安装GLTools

  1. 下载GLTools源文件:
git clone https://github.com/HazimGazov/GLTool.git
  1. 进入GLTools目录:
cd GLTool
  1. 运行CMake来生成Makefile:
cmake -G "Unix Makefiles"
  1. 编译GLTools:
make
  1. 安装GLTools:
sudo make install

配置Xcode

  1. 打开Xcode,创建一个新的Command-Line项目。

  2. 在项目设置中,将目标设备设置为“Apple Silicon (arm64)”。

  3. 在“Build Settings”中,将“Architectures”设置为“arm64”。

  4. 在“Header Search Paths”中,添加以下路径:

/usr/local/include
/opt/local/include
  1. 在“Library Search Paths”中,添加以下路径:
/usr/local/lib
/opt/local/lib
  1. 在“Other Linker Flags”中,添加以下标志:
-framework OpenGL
-lglfw3
-lglew

编写OpenGL程序

现在,您已经成功配置了OpenGL环境,可以开始编写OpenGL程序了。以下是一个简单的示例,展示如何使用OpenGL绘制一个三角形:

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

using namespace std;

int main() {
  // 初始化GLFW
  glfwInit();

  // 创建一个窗口
  GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL三角形", NULL, NULL);

  // 检查窗口是否创建成功
  if (window == NULL) {
    cout << "无法创建窗口!" << endl;
    glfwTerminate();
    return -1;
  }

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

  // 初始化GLEW
  glewExperimental = true;
  if (glewInit() != GLEW_OK) {
    cout << "无法初始化GLEW!" << endl;
    glfwTerminate();
    return -1;
  }

  // 顶点着色器
  const char* vertexShaderSource = 
    "#version 330 core\n"
    "layout (location = 0) in vec3 aPos;\n"
    "void main() {\n"
    "  gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
    "}\n";

  // 片段着色器
  const char* fragmentShaderSource = 
    "#version 330 core\n"
    "out vec4 FragColor;\n"
    "void main() {\n"
    "  FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n"
    "}\n";

  // 编译着色器
  GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
  glCompileShader(vertexShader);

  GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
  glCompileShader(fragmentShader);

  // 创建着色器程序
  GLuint shaderProgram = glCreateProgram();
  glAttachShader(shaderProgram, vertexShader);
  glAttachShader(shaderProgram, fragmentShader);
  glLinkProgram(shaderProgram);

  // 检查着色器程序是否链接成功
  GLint success;
  glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
  if (!success) {
    cout << "无法链接着色器程序!" << endl;
    glfwTerminate();
    return -1;
  }

  // 使用着色器程序
  glUseProgram(shaderProgram);

  // 定义顶点数据
  GLfloat vertices[] = {
    -0.5f, -0.5f, 0.0f,
     0.5f, -0.5f, 0.0f,
     0.0f,  0.5f, 0.0f
  };

  // 创建顶点缓冲对象
  GLuint VBO;
  glGenBuffers(1, &VBO);
  glBindBuffer(GL_ARRAY_BUFFER, VBO);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

  // 创建顶点数组对象
  GLuint VAO;
  glGenVertexArrays(1, &VAO);
  glBindVertexArray(VAO);

  // 配置顶点属性
  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);
  glEnableVertexAttribArray(0);

  // 渲染循环
  while (!glfwWindowShouldClose(window)) {
    // 清除颜色缓冲
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    // 绘制三角形
    glDrawArrays(GL_TRIANGLES, 0, 3);

    // 交换前后缓冲区
    glfwSwapBuffers(window);

    // 处理事件
    glfwPollEvents();
  }

  // 释放资源
  glDeleteVertexArrays(1, &VAO);
  glDeleteBuffers(1, &VBO);
  glDeleteProgram(shaderProgram);
  glDeleteShader(fragmentShader);
  glDeleteShader(vertexShader);

  // 终止GLFW
  glfwTerminate();

  return 0;
}

将以上代码保存为main.cpp,并使用Xcode编译运行,您将看到一个绘制在窗口中的红色三角形。

结语

在本文中,我们介绍了如何在M1 MacOS系统上使用Xcode配置OpenGL环境,并提供了一个简单的OpenGL程序示例。如果您对OpenGL开发感兴趣,可以进一步探索相关文档和教程,并创建更复杂、更有趣的OpenGL应用程序。