版权声明:本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名elloop(包含链接)
前言
OpenGL红宝书第九版已经开始使用glfw作为窗口管理和Context创建工具, 取代了第八版里的freeglut
和glew
。
本文讲解如何使用glfw在macOS上来构建一个OpenGL程序(OpenGL 3.0+)
包括以下步骤:
本机环境:macOS Sierra (10.12) + glfw 3.2.1 + OpenGL 4.1
下载源码
官方代码仓库:
可以使用SourceTree来下载,下载完切换到latest分支,这是最新的stable分支。
官方入门文档:
build glfw
编译
假设你已经熟悉CMake,这里我使用out-of-tree
的构建方式,打开terminal,切换到glfw根目录,比如: ~/codes/glfw/
运行示例
make成功后,在build目录下输入命令(或者在finder中直接打开build/examples/simple.app)
可以看到如下的一个旋转的三角形:
官方编译参考文档:compile glfw
开始写自己的OpenGL项目
正如构建其它的c++程序一样,构建自己的基于glfw的OpenGL项目,无非就两步:第一,包含正确的头文件;第二,链接正确的库文件。
1. 包含正确的头文件
很简单,对于glfw来说,仅仅一个:
需要注意的是,有一些宏可以控制#include<GLFW/glfw3.h>
的具体行为,比如:
GLFW_INCLUDE_GLCOREARB
这个宏使得glfw去包含现代的GL/glcorearb.h
(在macOS上是OpenGL/gl3.h
), 而不是包含普通的OpenGL头文件(如macOS上的OpenGL/gl.h
).
类似的宏还有:GLFW_INCLUDE_ES1
, GLFW_INCLUDE_ES2
, GLFW_INCLUDE_ES3
,GLFW_INCLUDE_VULKAN
,GLFW_INCLUDE_NONE
,GLFW_INCLUDE_GLEXT
,GLFW_INCLUDE_GLU
.
具体含义不多说了,详情参考官方文档, 注意要在包含头文件之前定义宏。
2. 链接正确的库
glfw官方教程提到了如下几个方式:
1. With MinGW or Visual C++ on Windows
2. With CMake and GLFW source
3. With CMake and installed GLFW binaries
4. With makefiles and pkg-config on Unix
5. With Xcode on OS X
6. With command-line on OS X
在mac上有2, 3, 5, 6, 这几种方式,其中最简单当属Xcode了,最原始的方式则是直接command-line, 我习惯于CMake + source的方式。
Xcode的方式请参考这两篇文章,还算比较新,
一个是10.10 + Xcode 6 : OS X 下 OpenGL 4.x 环境配置
一个是10.9.2 + Xcode 5 : Xcode环境下OpenGL C++ GLFW开发环境搭建
下面着重讲解CMake + glfw source 的方式构建
CMake + glfw source 构建OpenGL项目
使用源码的好处是随时可查看、修改、调试源码,轻量,不需关心维护库文件, 不需要安装glfw到系统。
第一步,创建工程目录,编写CMakeLists.txt脚本
假设我在~/codes/下新建一个目录,叫RedBook
第一,因为要使用glfw的源码,所以要拷贝glfw源码到工程目录
第二,添加一个CMake脚本文件,CMakeLists.txt
第三,添加一个src目录,用来存放接下来要编写的OpenGL代码
创建好的目录如下所示:
第四,编写CMake脚本,语法比Makefile简单很多,照着github上别人的工程脚本就可逐渐写出来。一般写过一份之后,新项目拷一份过来改改就好了。
第二步,编写OpenGL代码,运行
现在来补全CMake脚本中提到的main.cpp文件,在src下,新建一个main.cpp:
代码的init()和display()方法跟第四版的红宝书第一个例子几乎没什么区别,不做介绍。
因为暂时不知道使用命令行打包macOS二进制程序怎么把文本等资源文件打进Bundle之中,因此shader源码直接写在cpp代码中了。
编写完毕,回到RedBook根目录,开始编译构建,执行:
可以看到绘制出的三角形和控制台输出core profile下显卡驱动支持的OpenGL版本:
遇到的问题
- NSGL: The targeted version of OS X only supports forward-compatible contexts for OpenGL 3.2 and above, 并且控制台打印的OpenGL版本是2.1.
添加这行代码:glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE)
, 上面的源代码中已经是加完的了。
todo
- shader保存成文件的话,如何打包进可执行程序(bundle), 在CMakeLists里如何编写?
在这里也能看到这篇文章:github博客, CSDN博客, 欢迎访问