转载请注明出处。
本科期间就用过 QT 写过界面,很喜欢这种图形化的程序。
现在研究生学图形学方向,电脑是 Mac(后悔啊,买的太早了。。。)。
Window 的好
VS 下配置 OpenGL 的环境实在太方便了,把需要链接的第三方库路径放在一个属性表中,然后直接在新项目中添加属性表就可以了,简直不要太愉悦!!!
而且 Win 下面用 QT 开发也非常方便,具体可以参考这篇帖子
https://blog.csdn.net/chaojiwudixiaofeixia/article/details/77917697
这位大牛用的 QT 封装好的 OpenGL 库,可以在 Win 下直接运行。
MAC 的坑
1: MAC 对 OpenGL 的支持一直不够友好,目前支持的最高版本只有 4.1,虽然现在用不到,但还是让人不开心
2: MAC 下的 QT 有坑,无法像上述的在 Win 平台下直接使用 QT 封装好的 OpenGL 库开发,会报错。我遇到的是“version 330 is not supported",我印象中是这个,正好在 stack Overflow 上也见过类似的问题,但遗憾的是没有好的回答。
3: 最重要的是苹果现在已经在慢慢放弃 OpenGL 了,力推自己的渲染方案,这对我这个新手来讲实在很不友好。
思路:采用第三方库链接到 QT 中
这里我选择的是 glfw,glew/glad。后面的选一个就行,文中都有配置介绍,但是以 glad + glfw 为例来讲两个实现
1: cmake 编译 glfw,glew
下载 glfw 源码GLFW,使用 CMake 编译安装
可以直接在 GLFW 文件夹中建立一个 build 文件夹,Cmake 的目录选择 build
编译生成后,命令行中打开 build 文件夹,然后用下面两条指令编译安装即可,安装后会在 /usr/local/include 以及 /usr/local/lib 中看到含有 glfw 的文件以及文件夹。
make
make install
glew 比较特殊,我之前试过的源码无法用 cmake 编写,后来看了一个帖子说到源码部分有缺失?建议直接下载 glew-2.;0.1.zip。我测试时发现不要进入 build 文件夹,直接在 glew 文件夹中使用下面命令即可
make
sudo make install
make clean
同样是安装在 /usr/local/include 以及 /usr/local/lib 目录下
2: 手动添加 glad
glad 要选择版本(文中3.3),以及 core 模式,下载后可以直接使用。将 include 下的文件夹 复制到 /usr/local/include 中,然后将 src 中的 glad.c 添加到项目中即可。
3: 新建 QT 项目,将配置添加到 .pro 文件中
走到这里我们的库就全部装在电脑上了,现在我们需要把库链接到 QT 项目中。
新建 QT 项目,
文中选择 QWidget 作为基类,类名叫做 GLWidget,
然后我们向 .pro 文件添加下面的内容,位置似不影响,直接添加最后一行即可(qmake 参考 .pro 文件得到 makefile 文件,有了 makefile 文件后就可以编译程序了。)
# include glew/glfw
INCLUDEPATH += /usr/local/include
# lib glew/glfw
LIBS += -L/usr/local/lib -lglfw -lglew
# osx OpenGL framework
QMAKE_LFLAGS += -F/System/Library/Frameworks/
LIBS += -framework OpenGL \
-framework Cocoa \
-framework CoreVideo \
-framework IOKit \
修改后我们就可以开始试着写程序了
4: 一个四边形,shader 渲染
参考:一个很不错的 OpenGL 例子:你好,三角形
我们直接将 main 中实现逻辑转移到项目 main 中,记得将 glad.c 添加到项目中
// 添加头文件
// 函数声明
// 常量声明
// 着色器源码
int main(int argc, char * argv)
{
QApplication a(argc, argv);
// 例子 main 中内容
return a.exec();
}
结果如下:
5: 加入信号与槽后,用按钮控制打开
其实上面的用一个 .cpp 文件就可以实现了,现在我们做的是在主页面中添加一个按钮,点击按钮时弹出这个界面。因此我们需要把渲染逻辑全部添加到一个新类中,然后在现有的 UI 中添加一个 button,在对应的槽函数中实例化这个类,就可以得到我们想要的效果。
项目添加新类 GLSLWidget,将 main.cpp 中的内容分别添加到 glslwidget.h 以及 .cpp 文件中。
.h 文件添加内容如下:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
.cpp 文件添加内容如下:
GLSLWidget::GLSLWidget(){
// main 中代码,去掉 return 语句
}
// 回调函数实现
这样我们的显示窗口类就完成了
接着我们打开 UI,添加一个按钮,右键->转到槽->clicked()->OK,这样就跳转到了槽函数的实现部分
先对 glwidget.h文件修改如下
// 前置声明我们的显示类
class GLSLWidget;
// 添加私有成员变量
private:
GLSLWidget * glWidget;
glwidget.cpp 文件修改如下:
#include “glslwidget.h"
void GLWidget::on_pushButton_clicked()
{
glWidget = new GLSLWidget();
}
最后,main 函数修改为刚创建的情况
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GLWidget w;
w.show();
return a.exec();
}
效果:
总结
本文介绍了 mac 下如何使用 QT 添加第三方库实现现代 OpenGL,同时介绍了两个简单的例子,希望可以抛砖引玉。
另外文中如果有错误之处,请各位不吝赐教;如果有疑问,欢迎留言,但我希望你已经对这个疑问有了一定的查询。