保姆级教学!Xcode 配置 OpenGL 环境

文章目录

  • GLFW
    • 获取 GLFW
  • GLAD
    • 获取 GLAD
  • 在 Xcode 中配置下载好的 GLFW 和 GLAD
    • 配置流程
    • 检测是否配置成功
  • 无关配置的题外话——Xcode 下安全的删除移动操作


GLFW

Graphics Library Framework(图形库框架),可以让我们通过其封装好的 通用API 来正确创建 OpenGL context(上下文) 并显示出一个简单的 窗口

如果没有这个跨平台工具,那么我们在 windows 上创建 OpenGL窗口 时需要调用显卡中提供的 windows 使用的 API,而在 Mac 上创建窗口时需要 MacOS 的 API。

获取 GLFW

从官网上下载GLFW macOS下64位二进制文件

请添加图片描述


GLAD

因为 OpenGL 只是一个标准/规范,驱动开发商针对不同显卡有不同的具体实现,导致 OpenGL 驱动版本过于庞杂,大多数函数的位置都无法在编译时确定下来,需要在运行时查询。 因此开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。

这里来看一个 LearnOpenGL CN 中所举的 Windows 下获取函数地址的例子:

// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);

对于开发人员而言,每使用一个函数就要经历这样的寻址过程无疑是极其痛苦的,因此需要通过 GLAD 库加载所有OpenGL函数指针,来简化使用函数的流程。

获取 GLAD

打开 GLAD 的在线服务:

  • Language 设置为 C/C++
  • API 选项中,选择 3.3 以上的 OpenGL(gl)版本(更新的版本也能用);
  • 之后将 模式(Profile) 设置为Core
    • Compatibility 兼容旧版本,包含低版本中的 API 。
    • Core 只包含当前版本必须支持的 API ,不考虑向下兼容旧版本,更为轻巧。
  • 选中 生成加载器(Generate a loader) 选项。
  • 可以先(暂时)忽略 扩展(Extensions) 中的内容。
  • 点击 生成(Generate) 按钮来生成库文件。

请添加图片描述

下载得到一个 zip 压缩文件,包含两个头文件目录,里面分别放着一个和目录同名的 .h 文件,和一个放着 glad.c 文件的 src 目录:
在这里插入图片描述


在 Xcode 中配置下载好的 GLFW 和 GLAD

配置流程

  1. 新建项目。

请添加图片描述

  1. 选择 Command Line Tool

请添加图片描述

  1. 项目名称随便起,这里我起名为 OpenGL

请添加图片描述

  1. 项目所在位置自己选择,不影响后续配置。

请添加图片描述

  1. 接下来通过如图所示流程配置 Header Search Paths(头文件搜索路径)。【当然,初次配置时 Header Search Paths 对应的路径为空,图中路径不为空是因为我配置好了】:

在这里插入图片描述

  1. 双击红框中标注的地方,从访达中拖拽下载好的 glad/include文件夹glfw-3.3.7.bin.MACOS/include文件夹 到弹出的方框中(对于这两个文件夹在访达中的所在位置,你可能与我不一样,因此按照你自己放置的路径来配置即可),配置头文件搜索路径:

在这里插入图片描述
拖动添加:
在这里插入图片描述

  1. main.cpp 文件中添加以下代码,注意添加时两个 include 语句的顺序不能改变
#include <glad/glad.h>
#include <GLFW/glfw3.h>

请确认是在包含 GLFW 的头文件之前包含了 GLAD 的头文件。GLAD 的头文件包含了正确的 OpenGL 头文件(例如GL/gl.h),所以需要在其它依赖于 OpenGL 的头文件之前包含 GLAD。

  1. 点击运行按钮(红框标注),提示构建成功,则表明头文件搜索路径添加成功,已经可以使用 GLFW 和 GLAD 的头文件:

在这里插入图片描述

  1. 根据下图顺序查看三个文件是否分别被添加进黄框所示部分,即可核验是否成功链接(Link)添加的文件 libglfw3.alibglfw3.dylib(静态库、动态库两者添加其一即可),以及 glad.c 是否参与编译:
    在这里插入图片描述
  2. 最好加上这两个框架,Xcode有可能会报框架缺失的错误,点“+”搜索名字添加即可:
    在这里插入图片描述

检测是否配置成功

将下面的代码复制到 main.cpp 中并运行,如果能弹出一个墨绿色的窗口即证明配置成功。

以下代码源于 LearnOpenGL CN的创建窗口 ,代码中注释不够细致,如果不懂可以阅读文档了解更多。

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>// 对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用。
// 参数:window - 被改变大小的窗口,width、height-窗口的新维度。
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// 改变视口大小的函数glViewport(0, 0, width, height);
}// 实现输入控制的函数
void processInput(GLFWwindow *window)
{// glfwGetKey两个参数:窗口,按键// 没有被按下返回 GLFW_PRESSstd::cout << "是否点击ESC?" << std::endl;std::cout << glfwGetKey(window, GLFW_KEY_ESCAPE) << std::endl;if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)// 被按下则将 WindowShouldClose 属性置为 true// 以便于关闭 渲染循环glfwSetWindowShouldClose(window, true);
}int main()
{glfwInit(); // 初始化GLFW// glfwWindowHint函数的第一个参数代表选项的名称// 第二个参数接受一个整型,用来设置这个选项的值// 将主版本号(Major)和次版本号(Minor)都设为3glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// 使用的是核心模式(Core-profile)glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);// 参数依次为:宽、高、窗口的名称,显示器用于全屏模式,设为NULL是为窗口// 窗口的上下文为共享资源,NULL为不共享资源GLFWwindow* window = glfwCreateWindow(800, 600, "FirstWindow", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;// 释放空间,防止内存溢出glfwTerminate();return -1;}// 创建完毕之后,需要让window的context成为当前线程的current contextglfwMakeContextCurrent(window);// glfwGetProcAddress是glfw提供的用来加载 系统相关的OpenGL函数指针地址 的函数// 用gladLoadGLLoader函数根据使用者的系统定义了正确的函数if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 告诉OpenGL渲染窗口的尺寸大小,即视口(Viewport)// 这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标// 调用glViewport函数来设置窗口的维度(Dimension)// 前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)glViewport(0, 0, 800, 600);// 窗口大小改变时视口也要随之改变,这通过对窗口注册 framebuffer_size_callback 实现。// 它会在每次窗口大小被调整时调用glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);/* 渲染循环(Render Loop) */// glfwWindowShouldClose 检查一次GLFW是否被要求退出// 为true时渲染循环结束while(!glfwWindowShouldClose(window)){// 监测键盘输入processInput(window);/* 渲染 */// 状态设置函数,设置清空屏幕所用的颜色glClearColor(0.2f, 0.3f, 0.3f, 1.0f);// 状态使用函数,使用设定好的颜色来清除旧的颜色缓冲glClear(GL_COLOR_BUFFER_BIT);// 上面两种函数起到的作用也可以用 glClearBufferfv 来现实/*GLfloat color[] = {0.2, 0.3, 0.3, 1.0};glClearBufferfv(GL_COLOR, 0, color);*/// glfwSwapBuffers 交换颜色缓冲,用来绘制并作为输出显示在屏幕glfwSwapBuffers(window);// glfwPollEvents 检查是否有触发事件glfwPollEvents();}glfwTerminate();return 0;
}

运行结果:
在这里插入图片描述


无关配置的题外话——Xcode 下安全的删除移动操作

接下来要讲的一点与配置关系不大,但是也给初使用 Xcode 的我带来了不小的麻烦。不同于 Windows 下的操作习惯,在 macOS 中尽量在访达中对文件进行移动、删除等操作,而非直接拖拽到 Xcode 的树形目录中进行移动,亦或直接在树形目录中进行删除。举个例子:

  1. 比如在当前项目(OpenGL)的同级目录下我新建了一个 test 文件夹,并且其中有文件 test.sh

请添加图片描述
请添加图片描述

  1. 而后我将它通过访达拖拽移动到 OpenGL 目录下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 此时如果通过 Xcode 树形目录进行删除:

在这里插入图片描述

  1. 会询问删除方式,两种方式的区别详见本篇文章:

在这里插入图片描述

  • Move to Trash删除文件内容到废纸篓(此时的文件内容不在工程中,但是文件夹还是会在工程中):

删除前:
在这里插入图片描述

删除后:
在这里插入图片描述

  • Reremove reference移除文件的引用(只是删除引用,文件内容都还在工程中),后续如果添加相同文件会弹出“要添加的文件已存在”的报错提示,需要在访达中将上次仅删除引用的文件完全删除。

删除前同上。
删除后:
在这里插入图片描述

  • 不论是 Reremove reference 还是 Move to Trash 他们的文件夹都会在工程中(如果没有清除,下次添加重名的工程文件会弹出警告)。

PS:还遇到过删除 OpenGL 目录下的 test 文件夹,结果导致与 OpenGL 同级的 test 文件夹也被删除的情况,但后来无法复现,因此在这里无法贴图证明。总而言之,对 macOS 使用尚不熟练时,尽量使用访达对文件进行移动删除操作(通过拖拽获得文件路径是简单且安全的方法,可以使用),即使是对 Xcode 树形目录进行操作也请尽可能通过 Show in Finder 跳转到访达中,以避免出现不必要的错误与文件损失。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android入门(17)| 百度提供的 Android定位SDK

文章目录配置百度提供的 Android定位SDK用于发布的 SHA1用于测试的 SHA1使用百度定位实例配置百度提供的 Android定位SDK 详情参见官方文档&#xff0c;这里仅对获取 SHA1 做详细介绍&#xff1a; 用于发布的 SHA1 用于测试的 SHA1 使用百度定位实例 public class LocationAc…

ios 不被遮挡 阴影_为何你没见到日环食?你不知道的天象常识原来还有这么多 | 返朴...

关注风云之声提升思维层次导读说好的日环食呢&#xff0c;为什么上周很多人只等到了日偏食?日食月食的时间和种类是怎么预测的?你真的弄懂了各种日食和月食的成因吗&#xff1f;你了解它们有什么区别和联系&#xff0c;又遵循什么样的时间规律吗? 日食和月食发生的频率一样吗…

初识贝塞尔(bezier)曲线

文章目录资料援引贝塞尔曲线的用途一阶贝塞尔&#xff08;bezier&#xff09;曲线二阶贝塞尔&#xff08;bezier&#xff09;曲线三阶贝塞尔&#xff08;bezier&#xff09;曲线高阶贝塞尔&#xff08;bezier&#xff09;曲线三阶贝塞尔曲线求插值&#xff08;Slerp&#xff09…

python代码测试 vim_用 Hypothesis 快速测试你的 Python 代码

点击上方“Python编程时光”&#xff0c;选择“加为星标”第一时间关注Python技术干货&#xff01;介绍无论你使用哪种编程语言或框架&#xff0c;测试都非常重要。Hypothesis是 Python 的一个高级测试库。它允许编写测试用例时参数化&#xff0c;然后生成使测试失败的简单易懂…

Mac 下 CMake 的配置与使用

文章目录安装与配置编译单个源文件编译前的准备开始编译编译多个源文件多个源文件在同一目录下多个源文件在不同目录下math 目录下的 CMakeLists.txt根目录的 CMakeLists.txtoption 选项导入外部库本地导入&#xff08;find_package&#xff09;外部导入&#xff08;FetchConte…

五轴编程_沙井万丰数控数控编程五轴编程那个软件好用

沙井万丰数控数控编程五轴编程那个软件好用设计需要掌握很高很全面的知识和技能&#xff0c;模具做的好&#xff0c;产品质量好&#xff0c;模具结构合理&#xff0c;生产效率高&#xff0c;工厂效益好。正因如此&#xff0c;模具技术工在外打工的工资都非常的高。少则每月几千…

Linux学习:第二章-Linux安装

一虚拟机使用 VMware主要特点&#xff1a; 1、不需要分区或重新开机就能在同一台PC上使用两种以上的操作系统 2、本机系统可以与虚拟机系统网络通信 3、可以设定并且随时修改虚拟机操作系统的硬件环境 二安装方式 图形安装&#xff1a;直接回车 字符安装&#xff1a;linux tex…

keil3如何放大字体_国潮海报不会做?送你国风字体+图案笔刷+PSD素材+包装样机...

有很多朋友都问带鱼&#xff0c;国潮风的海报到底应该怎么做呢&#xff1f;首先你要知道什么是国潮风&#xff1a;国潮风就是现代文化和古代文化的碰撞&#xff0c;是年轻人的态度&#xff01;那么应该如何构图如何设计呢&#xff1f;如何配色如何搭配字体呢&#xff1f;这些方…

Google 开源项目风格指南学习笔记——C++篇

文章目录前言0. 缩写名词解释1. 头文件1.1. Self-contained 头文件1.2. 头文件保护1.3. 前置声明1.4 内联函数1.5. #include 的路径及顺序2. 作用域2.1. 命名空间2.2. 非成员函数、静态成员函数和全局函数2.3. 局部变量2.4. 静态和全局变量3. 类3.1. 构造函数的职责3.2. 隐式类…

hiveserver2启动不起来_给爱车配个充电宝,70迈汽车应急启动电源,让你远离搭电小广告...

说到汽车应急启动其实我有切身的痛&#xff0c;在哈尔滨零下35的严冬&#xff0c;晚上带着女神吃完饭&#xff0c;高高兴兴地吃完以后一上车&#xff0c;发现电瓶被冻没电了&#xff0c;天知道当时有多尴尬。马上叫了保险公司过来给搭电&#xff0c;结果在饭店从晚上8点一直等到…

Windows 下 VS 配置 OpenGL 环境

文章目录前言获取 GLFW打开 VS前言 感谢B站同学搬运YouTube上的教学视频。 获取 GLFW 从官网上下载GLFW macOS下64位二进制文件 打开 VS 新建解决方案 OpenGL test&#xff0c;并在解决方案中新建文件夹 Dependencies&#xff1a; 从下载好的 glfw 文件夹中找到最新版链接…

ubuntu 网卡双网口 配置_无线网卡m2 ngff keya keye、minipcie接口改转多口有线网卡实现软路...

小型主板及笔记本中的无线网卡m2ngffkeyakeye接口&#xff08;CNVI除外&#xff09;通过m2ngffkeyae转接pcie1x转接板&#xff0c;或者无线网卡的minipcie接口&#xff0c;通过minipcie转接pcie1x转接板可以改装有线网卡板卡&#xff0c;来实现软路由功能。m2ngffkeyae转接pcie…

OpenGL | 通过绘制一个三角形来入门 OpenGL 图形渲染管线

文章目录前言什么是 OpenGl &#xff1f;回顾openGL 的 Object显存结构工作阶段通过顶点缓冲对象将顶点数据初始化至缓冲中标准化设备坐标顶点缓冲对象 VBOglGenBuffersglBindBufferglBufferData建立了一个顶点和一个片段着色器着色器是什么&#xff1f;为什么需要使用着色器&a…

javascript特效_如何在网页添加鼠标点击特效

经常有同学问我怎么做到的&#xff0c;本论坛属于DZ当然用的是插件啦。偶然在网上找到一个关于wordpress的特效代码&#xff0c;分享给大家。WordPress 添加鼠标点击特效实际上这种教程在网上搜索一下有一大堆&#xff0c;已经是各大博主玩烂的东西了。不过既然给自己的博客加上…

android nio debug模式正常 release包crash_Flutter包大小治理上的探索与实践

Flutter作为一种全新的响应式、跨平台、高性能的移动开发框架&#xff0c;在性能、稳定性和多端体验一致上都有着较好的表现&#xff0c;自开源以来&#xff0c;已经受到越来越多开发者的喜爱。但是&#xff0c;Flutter的引入往往带来包体积的增大&#xff0c;给很多研发团队带…

sam格式的结构和意义_各种格式的练字本,对写字真有帮助吗

图片来源于笔势通各种格式的练字本现在越来越多&#xff0c;目的主要是便于学生把握好笔画的位置和布局&#xff0c;从而把整个字的结构处理好&#xff0c;常见的有米字格&#xff0c;回宫格等。这些练字本对于初学者来说肯定是有帮助的&#xff0c;特别是低年级学生。当然随着…

硬件结构图_那曲地表水电子除垢仪结构图

那曲地表水电子除垢仪结构图水处理设备也应断电停止使用&#xff0c;系统长期停止运行或季节性停止运行&#xff0c;在系统停止运行前&#xff0c;在水中投加适量缓蚀剂&#xff0c;并采取满水湿保护的措施&#xff0c;以减小腐蚀&#xff0c;保护系统。开启进水阀检查无误后电…

双屏怎么快速切换鼠标_在笔记本上实现双屏设计,怎么做到的?

如果给你的笔记本电脑安装两个屏幕&#xff0c;你会用来干什么&#xff1f;是上班时间主屏幕放着PPT&#xff0c;副屏幕偷摸玩游戏&#xff1b;还是主屏幕玩游戏&#xff0c;副屏幕刷刷B站视频&#xff1b;亦或是主屏幕P着图&#xff0c;副屏幕在网上找找能用的素材&#xff1f…

信元模式mpls 避免环路_【基础】交换机堆叠模式

堆叠是指将一台以上的交换机组合起来共同工作&#xff0c;以便在有限的空间内提供尽可能多的端口。多台交换机经过堆叠形成一个堆叠单元。可堆叠的交换机性能指标中有一个"最大可堆叠数"的参数&#xff0c;它是指一个堆叠单元中所能堆叠的最大交换机数&#xff0c;代…

为什么叫日上_古雷150万吨乙烯,为啥叫芒果项目?

古雷150万吨乙烯&#xff0c;为啥叫芒果项目&#xff1f;福建石油化工集团有限责任公司9月1日在福州举行的一场新闻通气会上透露&#xff0c;石化基地引进世界化工巨头——沙特基础工业公司(简称SABIC)&#xff0c;合资合作共建中沙古雷乙烯项目。中沙古雷乙烯项目将在福建古雷…