我,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,大概是難用所以纔沒人用麼?大概是我菜吧。。

再掙扎兩天,看看能不能成功吧。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章