macOS CLion 上搭建 GLFW + GLAD OpenGL开发环境

1. 构建并安装GLFW

  1. 下载GLFW源码 GLFW官网
  2. 构建并安装GLFW
# 切换至下载解压后的GLFW源码目录
cd glfw-3.3.6
# 创建 build 文件夹,用于存放配置和编译后的文件
mkdir build
# 切换至 build 目录
cd build
# 用 cmake 生成相关构建文件(请确保你的 Mac 已经安装了 CommandLineTool 和 CMake)
# 如果安装 CMake 后执行下方命令后依旧出现 “zsh: command not found: cmake” ,请先执行下面这条命令后重试
# sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install
cmake ..
# 构建并安装GLFW
make && sudo make install

2. 下载GLAD

进入 GLAD在线服务

3. 配置 CLion 项目

1.创建新项目

  1. 添加GLAD相关文件
# 1.在项目根目录下创建 include 文件夹
# 2.将下载下来的 GLAD源码 中的 include/KHR 和 include/glad 文件夹拷贝进项目中的 include 文件夹
# 3.将 GLAD源码 中的 src/glad.c 拷贝进项目根目录下(与 main.cpp 处于同一目录下!!!)

  1. 配置项目 CMakeList.txt
# 配置 CMake 版本(一般CLion会在创建项目时自动配置此选项,这里可以无需和笔者一致,默认即可)
cmake_minimum_required(VERSION 3.19)
# 生成项目(默认即可)
project(LearnOpenGL)
# 配置C++版本(默认即可)
set(CMAKE_CXX_STANDARD 14)# 头文件路径配置
include_directories(./include) # 这里的路径指向项目目录下的 include 文件夹
include_directories(/usr/local/include) # 此处的路径指向的是系统安装GLFW头文件的位置,通常为通过 make install 安装的头文件为此路径# 设置库文件所在目录
link_directories(/usr/local/lib) # 安装GLFW时默认安装库文件位置
# 链接编译需要的系统框架
link_libraries("-framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo")
# 添加源文件(这里的 main.cpp 是你的C++源码文件)
add_executable(LearnOpenGL glad.c main.cpp) # glad.c 一定要填进去!
# 链接 GLFW 库
target_link_libraries(LearnOpenGL glfw3)

4.测试环境

这里测试 LearnOpenGL 的三角形 Example

#include <glad/glad.h>
#include <GLFW/glfw3.h>#include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;const char *vertexShaderSource = "#version 330 core\n""layout (location = 0) in vec3 aPos;\n""void main()\n""{\n""   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n""}\0";
const char *fragmentShaderSource = "#version 330 core\n""out vec4 FragColor;\n""void main()\n""{\n""   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n""}\n\0";int main()
{// glfw: initialize and configure// ------------------------------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// glfw window creation// --------------------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);// glad: load all OpenGL function pointers// ---------------------------------------if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// build and compile our shader program// ------------------------------------// vertex shaderunsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);// check for shader compile errorsint success;char infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}// fragment shaderunsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);// check for shader compile errorsglGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;}// link shadersunsigned int shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// check for linking errorsglGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;}glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// set up vertex data (and buffer(s)) and configure vertex attributes// ------------------------------------------------------------------float vertices[] = {-0.5f, -0.5f, 0.0f, // left0.5f, -0.5f, 0.0f, // right0.0f,  0.5f, 0.0f  // top};unsigned int VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);// bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// note that this is allowed, the call to glVertexAttribPointer registered VBO as the vertex attribute's bound vertex buffer object so afterwards we can safely unbindglBindBuffer(GL_ARRAY_BUFFER, 0);// You can unbind the VAO afterwards so other VAO calls won't accidentally modify this VAO, but this rarely happens. Modifying other// VAOs requires a call to glBindVertexArray anyways so we generally don't unbind VAOs (nor VBOs) when it's not directly necessary.glBindVertexArray(0);// uncomment this call to draw in wireframe polygons.//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);// render loop// -----------while (!glfwWindowShouldClose(window)){// input// -----processInput(window);// render// ------glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// draw our first triangleglUseProgram(shaderProgram);glBindVertexArray(VAO); // seeing as we only have a single VAO there's no need to bind it every time, but we'll do so to keep things a bit more organizedglDrawArrays(GL_TRIANGLES, 0, 3);// glBindVertexArray(0); // no need to unbind it every time// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)// -------------------------------------------------------------------------------glfwSwapBuffers(window);glfwPollEvents();}// optional: de-allocate all resources once they've outlived their purpose:// ------------------------------------------------------------------------glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteProgram(shaderProgram);// glfw: terminate, clearing all previously allocated GLFW resources.// ------------------------------------------------------------------glfwTerminate();return 0;
}// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// make sure the viewport matches the new window dimensions; note that width and// height will be significantly larger than specified on retina displays.glViewport(0, 0, width, height);
}

最后

至此,macOS CLion GLFW + GLAD 的 OpenGL 环境配置完毕!

参考

LearnOpenGL CN

macOS CLion 上搭建 GLFW + GLAD OpenGL开发环境相关推荐

  1. hhvm mysql_Linux_在Ubuntu系统上搭建Nginx+HHVM+MySQL开发环境的教程,貌似最近这个HHVM特别火,其主 - phpStudy...

    在Ubuntu系统上搭建Nginx+HHVM+MySQL开发环境的教程 貌似最近这个HHVM特别火,其主要原因大概要归咎于大的运行效率吧,安装完之后使用探针测试,计算运行的时间都是0.0*的级别,据说 ...

  2. MAC上搭建Windows Phone 8 开发环境——VMware Fusion下Win8 “无法安装Hyper-V, 某个虚拟机监控程序正在运行”问题解决的办法

    最近在试着在mac os上搭建Windows Phone 8的开发调试环境,使用的是VMware Fusion + Win8.1的虚拟环境. 点开VS2013, new 了一个helloWorld, ...

  3. 在Centos7上搭建VSCode C/C++开发环境(拥有VScode的上乘体验)

    1. 选择Clangd的原因 在C/C++的Extensions中,官方提供了C/C++ Extension Pack扩展包,对于不想麻烦的朋友只需要安装官方提供的一套扩展就可以搭建好C/C++的开发 ...

  4. 多个php一个机器,如何利用docker在同一台机器上搭建多套php开发环境?

    首先是一个容器要包含完整的程序加依赖(出去中间件),拿 LNMP 举例子:docker 提供的是 Linux 环境,容器中要包含 Nginx 和 Php,然后再单独部署一个 MySQL 其次,如果多个 ...

  5. Windows上搭建安卓的JAVA开发环境(Eclipse版本)

    工具/原料 下载需要用到的工具: (1)下载JAVA的IDE开发工具– Eclipse 到Eclipse官方网站下载Ecplise For Java EE的最新Windows版本 下载Ecplise ...

  6. hhvm mysql_在Ubuntu系统上搭建Nginx+HHVM+MySQL开发环境的教程

    貌似最近这个HHVM特别火,其主要原因大概要归咎于大的运行效率吧,安装完之后使用探针测试,计算运行的时间都是0.0*的级别,据说在512M的内存下也可以跑的完美,大大大大大大地提高了网站运行效率.目前 ...

  7. 【游戏开发】基于VS2017的OpenGL开发环境搭建

    一.简介 最近,马三买了两本有关于"计算机图形学"的书籍,准备在工作之余鼓捣鼓捣图形学和OpenGL编程,提升自己的价值(奔着学完能涨一波工资去的).俗话说得好,"工欲善 ...

  8. OpenGL 开发环境配置(Windows) - Visual Studio 2017 + GLFW + GLAD 详细图文教程

    OpenGL 开发环境配置(Windows) - Visual Studio 2017 + GLFW + GLAD 详细图文教程 大部分 OpenGL 是直接面向设备商的,如果开发者需要使用 Open ...

  9. 基于MacOS搭建ESP8266 NodeMCU CP2102开发环境

    基于MacOS搭建ESP8266-NodeMCU开发环境 1. 下载.安装驱动 2. Arduino开发环境配置 2.1. 下载.安装Arduino 2.2. 配置Arduino 1. 下载.安装驱动 ...

  10. Windows平台上安装搭建iPhone/iPad的开发环境

    很多朋友希望在体验或学习iphone开发,但是iphone开发环境一般需要 安装在mac计算机下mac os中. 这给许多朋友带来了额外成本投入. 网上已经有各种破解方法,在非苹果电脑上安装iphon ...

最新文章

  1. Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递?
  2. Android Weekly Notes Issue #226
  3. (转)java datetime date 类型
  4. 实现页面内多个表格在滚动时,表头浮动的效果(是同时多个表格哟)
  5. 安全使用网上银行 享受在线购物时尚生活
  6. HDU2066 一个人的旅行【最短路径+Floyd算法】
  7. 手机上有没有学python的软件-哪个手机软件有python题库
  8. python源码中的学习笔记_第10章_面向对象的特征、特殊方法与属性、以及深浅拷贝
  9. 关于浮动-float
  10. 【排序】排序算法之分配排序
  11. PDF阅读器背景设置为护眼豆沙色(福昕)
  12. keeplive使用
  13. 伺服电机编码器与转子磁极相位对齐方法
  14. 硬盘格式化怎么操作?
  15. 左耳朵耗子 | 技术人员的发展之路
  16. [求助]python模拟布丰投针
  17. SLAM notes
  18. Csdn视频第二十期 : 测试工具与流程讨论
  19. AI绘画是什么软件?看完你就知道了
  20. 【Python】Windows下安装Dpark

热门文章

  1. 为什么我的儿子不沉迷游戏?一位游戏策划家长的分享
  2. 2019杭电多校三 C. Yukikaze and Demons (点分治)
  3. Element组件 Drawer 抽屉的关闭问题
  4. deb 中标麒麟_麒麟动态·亿图软件登陆银河麒麟桌面三部曲之——项目管理软件 - 银河麒麟操作系统 麒麟操作系统 中标麒麟 麒麟软件官方网站...
  5. python复数类型及其特点和分布地区_各种气候类型及其特点、分布规律、主要分布地区、数值特征...
  6. 智能家居内网服务器,手把手教你搭建自己的智能家居IOT系统
  7. deepin linux 换回WIN7,deepin ghost win7系统安装方法
  8. 计算机word表格加法公式,如何插入公式以求和Word中表格的一列或一行?
  9. HTTP状态码404、413、500
  10. OpenAccessLibrary 网站简单爬取