GLEW:由于
OpenGL
只是一种 标准/规范,并且是由驱动制造上在驱动中予以实现。OpenGL
的大多数函数在编译时(compile-time)是未知状态的,需要在运行时(run-time)来请求。GLEW
的工作就是获取所需的函数的地址,并储存在函数指针中供使用。(还有其他类似的:GLAD)GLFW:是一个专门针对
OpenGL
的 C 语言库,提供了渲染物体所需的最低限度的接口。其允许用户创建OpenGL
上下文,定义窗口参数以及处理用户输入,把物体渲染到屏幕所需的必要功能。(注意:OpenGL
并不规定窗口创建和管理的部分,这一部分完全交由GLFW
来实现;还有其他类似的:GLUT 和 SDL等)GLAD:是一个开源的库,功能跟
GLEW
类似。GLAD
使用了一个在线服务(能够告诉GLAD
需要定义的OpenGL
版本,并且根据这个版本加载所有相关的OpenGL
函数)
- 安装
homebrew
$ gcc --version
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew doctor
$ brew update
- 使用
homebrew
安装glew
和glfw
$ brew install glew
$ brew install glfw3
结果类似于如下
bogon:~ fengfeng$ brew install glew
==> Downloading https://homebrew.bintray.com/bottles/glew-2.1.0.mojave.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/a8/a81e04f8be35080991e136e0b2229448fd237a31991d34d5a
######################################################################## 100.0%
==> Pouring glew-2.1.0.mojave.bottle.tar.gz
🍺 /usr/local/Cellar/glew/2.1.0: 38 files, 3MB
bogon:~ fengfeng$
bogon:~ fengfeng$ brew install glfw3
Updating Homebrew...
==> Downloading https://homebrew.bintray.com/bottles/glfw-3.3.mojave.bottle.tar.gz
######################################################################## 100.0%
==> Pouring glfw-3.3.mojave.bottle.tar.gz
🍺 /usr/local/Cellar/glfw/3.3: 14 files, 497.9KB
bogon:~ fengfeng$
- 配置
glad
glad
的配置与大多数的开源库有些不同
glad
使用 在线服务,https://glad.dav1d.de/,告诉glad
需要定义的OpenGL
版本,会根据这个版本加载所有的相关的函数
将语言(Language
)设置为C/C++,在API
选项中,选择3.3以上的OpenGL(gl)
版本。之后将模式(Profile
)设置为Core,并且保证生成加载器(Generate a loader
)的选项是选中的。现在可以先忽略拓展(Extensions
)中的内容。都选择完之后,点击生成(Generate
)按钮来生成库文件。
glad
会提供一个zip
压缩文件,包含两个头文件目录,和一个glad.c
文件,如下
bogon:~ fengfeng$ tree /Users/fengfeng/Desktop/glad
/Users/fengfeng/Desktop/glad
├── include
│ ├── KHR
│ │ └── khrplatform.h
│ └── glad
│ └── glad.h
└── src
└── glad.c
4 directories, 3 files
bogon:~ fengfeng$
将两个头文件目录(glad
和KHR
)复制到/usr/local/include
,并添加glad.c
到工程中
- 用
Xcode
创建一个C++
的Command Line Tool
的项目 - 设置变量,
command + ,
,如下
Path
可以拖进去
- 修改
Header Search Paths
和Library Search Paths
- 添加三个库
/usr/local/Cellar/glfw/3.3/lib/libglfw.3.3.dylib
- 把
glad.c
添加到项目中
-
glad
要先于glfw
引入,如下
#include <glad/glad.h> // 要选于glfw引入
#include <GLFW/glfw3.h>
- 测试代码
#include <iostream>
#include <glad/glad.h> // 要选于glfw引入
#include <GLFW/glfw3.h>
// 回调函数声明
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
// settings
const unsigned int SCR_WIDTH = 300;
const unsigned int SCR_HEIGHT = 300;
int main(int argc, char * argv[]) {
// 初始化GLFW
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); // uncomment this statement to fix compilation on OS X
#endif
// 创建一个窗口对象
GLFWwindow *window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "opengl_190715", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
// 通知GLFW将我们窗口的上下文设置为当前线程的主上下文
glfwMakeContextCurrent(window);
// 对窗口注册一个回调函数,每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 初始化GLAD用来管理OpenGL的函数指针
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 渲染循环
while(!glfwWindowShouldClose(window)) {
// 输入
processInput(window);
// 渲染指令
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 检查并调用事件,交换缓冲
glfwPollEvents(); // 检查触发事件
glfwSwapBuffers(window); // 交换颜色缓冲
}
// 释放/删除之前的分配的所有资源
glfwTerminate();
return EXIT_SUCCESS;
}
// 输入控制,检查用户是否按下了返回键(Esc)
void processInput(GLFWwindow *window) {
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
// 当用户改变窗口的大小的时候,视口也应该被调整
void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
// 注意:对于视网膜(Retina)显示屏,width和height都会明显比原输入值更高一点。
glViewport(0, 0, width, height);
}
- 效果图如下
- 成功运行即可
不定期更新 不合适的地方 还请指点~ 感激不尽