我,OpenGL与Qt的爱恨情仇

为疫情以来自己做的事情做一个简单总结。。

最近想做一个简单的点云显示界面,从零开始学习,考虑了很多东西,譬如有很多设备可以高频率高速的获得点云,那么如何需要快速的刷新显示内容,以显示出设备快速的特性,需要使用新版的OpenGL或者说现代OpenGL来绘制,并完成内存与缓存的快速交互(VBO).

既然是点云显示界面,那么用Qt一定是比较合适的,历经了各种pcl,QOpenGLwidget, QGLwidget等的折磨后,发现了一个好东西libQGLviewer,一个专门用于三维显示的Qt窗口部件。三下五除二便配置好(注意,实在没有办法能够在QtDesigner里直接使用这个部件,如果你可以保证自己编译libQGLviewer和自己的QtCreator使用的是一个编译器的话),我发现libQGLviewer继承自QOpenGLwidget(还好之前踩过坑),于是一个窗口部件类提升就把QGLviewer用上了。效果十分喜人。

但是问题来了,libQGLviewer似乎使用的是本机的OpenGL(它主动包含了本机上OpenGL的两个lib),另外在教程里(那坨翔状物)也推荐使OpenGL的立即渲染模式来绘制图像,诸如glBegin(),glEnd(),glVertex(),之类的东西,实在是和我的初衷不符合,在之前踩了QOpenGLwidget的坑之后,我有一定经验自己配置程序内部的OpenGL版本以及调用一些高级函数了,但是这才是噩梦的开始。。

Qt里自带的ShaderProg类在File编译的情况下不能加入#version命令。。。因为它自己在创建的时候添加了几行字导致#version不在第一行了,直接弹出编译错误。。难不成我还是自己OpenGL里的uint shader?

Bug调起来十分复杂,基本上写几句跑一下看是否有错。。。果然不同版本的OpenGL混杂起来Bug调起来让人头疼。。今天是好不容易花了大半天的时间想添加个3Dpick,老版的glReadPixel()如果不重新渲染到fbo里根本不能用,过去的pick都是用ID或者name去标识每一个物体,在现代OpenGL里这种方式十分低效,需要使用fbo来实现读取,但是渲染fbo的着色器又卡在了不能加入#version上。。。当场崩溃,到底怎么写去哪里找个合适的高级一点的例子啊。。。现在找到的资料基本上都是用老版的写法去写Qt+OpenGL,大概是难用所以才没人用么?大概是我菜吧。。

再挣扎两天,看看能不能成功吧。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值