CMake 下使用 GLFW

之前介绍的 GLUT 只是很多不错的 OpenGL 库之一,另一个很好的OpenGL库是 GLFW.

在OS X中,GLUT库已经很久不更新了,而Apple更是从OS X 10.9就把GLUT的函数标记为deprecated了.比如你使用一个glutSwapBuffers(),你会收到一个warning

xxx.cc:72:5: warning: 'glutSwapBuffers' is deprecated: first deprecated in OS X 10.9 [-Wdeprecated-declarations]
glutSwapBuffers();
^
/System/Library/Frameworks/Glut.framework/Headers/glut.h:448:22: note: 'glutSwapBuffers' has been explicitly marked deprecated here
extern void APIENTRY glutSwapBuffers(void) OPENGL_DEPRECATED(10_0, 10_9);
^

当然,我们可以设置参数隐藏掉这些 warning, 但心中还是很不爽不是 .通过寻找, 我发现 GLFW 也是一个很不错的库.

GLFW 的可以参考官方的文档 quick start, 使用 cmake 的方法也被写得很清楚.

我同样也写了个 demo, 若有兴趣可以围观一下.

OS X 默认并没有安装 GLFW, 若打算用 GLFW, 我们可能要动手安装下.

brew install glfw

然后 find package

FIND_PACKAGE(OpenGL REQUIRED)
INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})

PKG_SEARCH_MODULE(GLFW REQUIRED glfw3)
INCLUDE_DIRECTORIES(${GLFW_INCLUDE_DIRS})
MESSAGE(STATUS "FIND GLFW_INCLUDE_DIRS " ${GLFW_INCLUDE_DIRS})

顺便一句, findGLFW.cmake 貌似要自己找个. 我使用的是这个版本.

调用可以参考这儿 有个例子.

简单说如下:

// 头文件
#ifdef __APPLE__
#include
//#elif defined(_WIN32) || defined(_WIN64)
//#include //I DON'T KNOW... NOT TESTED
#else // for linux : yum install glfw* :)
#include
#endif

int main(int argc, char* argv[]) {
GLFWwindow* window; // 声明window的描述符

if (!glfwInit()) { // 初始化
fprintf(stderr, "GLFW init failed\n");
return -1;
}

window = glfwCreateWindow(640, 480, "Hello, OpenGL!", NULL, NULL); // 初始化window
if (!window) {
glfwTerminate();
return -1;
}

// Make the window's context current
// http://www.glfw.org/docs/latest/group__context.html#ga1c04dc242268f827290fe40aa1c91157
glfwMakeContextCurrent(window);

// http://www.glfw.org/docs/latest/group__context.html#ga6d4e0cdf151b5e579bd67f13202994ed
glfwSwapInterval(1);

// 以上一堆各种callback的设置

// Loop until the user closes the window
// http://www.glfw.org/docs/latest/group__window.html#ga24e02fbfefbb81fc45320989f8140ab5
while (!glfwWindowShouldClose(window)) { // 自己玩主循环
int rsec = (int)glfwGetTime(); // 可以获得当前时间

// 对画面进行各种处理

// Swap front and back buffers
// http://www.glfw.org/docs/latest/group__window.html#ga15a5a1ee5b3c2ca6b15ca209a12efd14
glfwSwapBuffers(window);

// Poll for and process events
// http://www.glfw.org/docs/latest/group__window.html#ga37bd57223967b4211d60ca1a0bf3c832
glfwPollEvents();
}
printf("jump out of the loop\n");

// http://www.glfw.org/docs/latest/group__window.html#gacdf43e51376051d2c091662e9fe3d7b2
glfwDestroyWindow(window); // 关闭窗口

// http://www.glfw.org/docs/latest/group__init.html#gaaae48c0a18607ea4a4ba951d939f0901
glfwTerminate();
return 0;
}

以上就是基本调用,然后完了 cmake 中 include 下 OpenGL 的 library 和 GLFW 的 Library 即可.