版本说明
- Mac OS X : 10.12.6
- GLFW : 3.2.1
- GLEW : 2.1.0
工具准备
简述
- OpenGL:(英语:Open Graphics Library)是用于渲染
2D
、3D
矢量图形的跨语言、跨平台(由 Khronos组织 制定并维护)的**规范(Specification)**。 - GLFW:是一个专门针对
OpenGL
的 C 语言库,提供了渲染物体所需的最低限度的接口。其允许用户创建OpenGL
上下文,定义窗口参数以及处理用户输入,把物体渲染到屏幕所需的必要功能。(注意:OpenGL
并不规定窗口创建和管理的部分,这一部分完全交由GLFW
来实现;还有其他类似的:GLUT 和 SDL 等)。 - GLEW:由于
OpenGL
只是一种 标准/规范,并且是由驱动制造上在驱动中予以实现。OpenGL
的大多数函数在编译时(compile-time)是未知状态的,需要在运行时(run-time)来请求。GLEW
的工作就是获取所需的函数的地址,并储存在函数指针中供使用。(还有其他类似的:GLAD)。 - GLAD:是一个开源的库,功能跟
GLEW
类似。GLAD
使用了一个在线服务(在这里能够告诉GLAD
需要定义的OpenGL
版本,并且根据这个版本加载所有相关的OpenGL
函数)。 - SOIL:大多数图形学处理的任务都需要读取图片到内存当中。当前存在着各种各样的图片格式,例如 jpeg, bmp, png 等等;
SOIL
提供了将图片加载到内存当中的功能,避免了因繁杂的图片格式读取问题。 - GLM:提供了大量的矩阵变换,向量变换以及各种针对矩阵和向量的计算操作。
GLFW
编译安装
下载GLFW源码,并解压。
打开CMake,选择 源代码目录 和 目标文件目录。
点击**Configure(设置)**按钮,让CMake读取设置和源代码,然后选择工程的生成器 Unix Makefiles 。
CMake会显示可选的编译选项用来配置最终生成的库。这里使用默认设置,并再次点击Configure(设置)按钮保存设置。
保存之后,点击Generate(生成)按钮,生成的工程文件会在
Build
文件夹中。
打开终端,
cd
进入 Build目录1
$ cd GLFW_Build
执行
make
命令进行编译安装库文件。1
$ make
执行
make install
命令进行安装,一般会安装到/usr/local/include
和/usr/local/lib
中。1
$ make instll
查看一下
/usr/local/include
- 安装前:
- 安装后:
- 安装前:
查看一下
/usr/local/lib
- 安装前:
- 安装后:
- 安装前:
至此,Mac OS X 下的
GLFW
环境已经配置好了
GLEW
编译安装
下载GLEW源码,并解压。
打开终端,
cd
进入 解压目录。1
$ cd GLEW_Source/glew-2.1.0
执行
make
命令进行编译安装库文件。1
$ make
执行
make install
命令进行安装,一般会安装到 /usr/local/include 和 /usr/local/lib 中。1
$ make instll
查看一下
/usr/local/include
- 安装前:
- 安装后:
- 安装前:
查看一下
/usr/local/lib
- 安装前:
- 安装后:
- 安装前:
至此,Mac OS X 下的
GLEW
环境已经配置好了
注意:
glew
头文件 必须在包含glfw
头文件之前,否则回报错:gl.h included before glew.h。
GLAD
配置
打开
GLAD
的在线服务。将语言设置为
C/C++
,在 API 选项中,选择 3.3 及以上的OpenGL
版本。将模式
Profile
设置为 Core ,保证生成加载器Generate a loader
选项是选中的。先暂时忽略拓展
Extensions
中内容。点击生成
Generate
。
下载生成的 zip 包(包含 glad.c、glad.h 和 khrplatform.h),解压后
include
目录下的glad
和KHR
文件夹复制到/usr/local/include
,glad.c
添加到项目中。
测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
return 0;
}
注意:
glad
头文件 必须在包含glfw
头文件之前,否则回报错:OpenGL header already included, remove this include, glad already provides it,而且不能与glew
共同使用,否则也会报错:gl.h included before glew.h(glad
头文件在glew
头文件之前) 或 OpenGL header already included, remove this include, glad already provides it(glad
头文件在glew
头文件之后) 。
使用
要在 Xcode 中调用相应的库函数,需要在 Xcode 工程中添加相应的头文件和库文件,这里有两种方式可以让 OpenGL 工程找到相应的库文件:
将库的
include
和lib
文件夹拷贝到 Xcode 本身的include
和lib
文件夹中(不推荐)。在新建的工程中链接库的
include
和lib
文件。这样做更加清晰也更加易于管理,但是每次新建工程都要重新链接相应的库文件,如下:打开 Xcode 新建一个空工程或者
Command Line Tool
。在工程的 Build Settings 中找到 Header Search Paths,将
/usr/local/include
添加到头文件搜索路径中,记得选上recursive
。在工程的 Build Settings 中找到 Library Search Paths,将
/usr/local/lib
添加进来,记得选上recursive
。在工程的 Build Phases 中的 Link Binary With Libraries 中,添加以下几个库文件:
Cocoa.framework
OpenGL.framwork
GLUT.framework
CoreVideo.framework
IOKit.framework
libglfw3.a
libGLEW.a
注意: libglfw3.a 和 libGLEW.a 可能需要手动去
/usr/local/lib
中寻找添加。
特别注意1:需要将
Build Settings
里的Enable Modules(C and Objective-C)
设为 No,否则 GLEW 头文件会报错:(/usr/local/include/GL/glew.h:16426:17: Declaration of ‘PFNGLCOPYTEXSUBIMAGE3DPROC’ must be imported from module ‘OpenGL.GL3’ before it is required)特别注意2:请确认是在包含
GLFW
的头文件之前包含了GLAD
或GLEW
的头文件。GLAD
/GLEW
的头文件包含了正确的OpenGL头文件(例如GL/gl.h),所以需要在其它依赖于OpenGL
的头文件之前包含GLAD
/GLEW
。
环境测试
打开 Xcode 新建一个
Command Line Tool
的工程。配置环境。
输入以下测试代码:,运行成功将会看到一个三角形。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45#import <Foundation/Foundation.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
void Render(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
{
glColor3f(1.0,0.0,0.0);
glVertex2f(0, .5);
glColor3f(0.0,1.0,0.0);
glVertex2f(-.5,-.5);
glColor3f(0.0, 0.0, 1.0);
glVertex2f(.5, -.5);
}
glEnd();
}
int main(int argc, const char * argv[]) {
GLFWwindow* win;
if(!glfwInit()){
return -1;
}
win = glfwCreateWindow(640, 480, "OpenGL Base Project", NULL, NULL);
if(!win)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
if(!glewInit())
{
return -1;
}
glfwMakeContextCurrent(win);
while(!glfwWindowShouldClose(win)){
Render();
glfwSwapBuffers(win);
glfwPollEvents();
}
glfwTerminate();
exit(EXIT_SUCCESS);
return 0;
}运行结果如下:
Demo