Mac 下用 QT 开发 OpenGL 3.3 以上程序

转载请注明出处。

本科期间就用过 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,同时介绍了两个简单的例子,希望可以抛砖引玉。

另外文中如果有错误之处,请各位不吝赐教;如果有疑问,欢迎留言,但我希望你已经对这个疑问有了一定的查询。

猜你喜欢

转载自blog.csdn.net/qq_29639589/article/details/84443808