您好,登錄后才能下訂單哦!
雖然Qt不以效率著稱,但是事實(shí)上有足夠的優(yōu)化,最最典型的就是默認(rèn)的圖形雙緩沖,按照Windows下的編程慣例是需要手動(dòng)開啟,并通過額外的接口調(diào)用才能使用的,這一點(diǎn)在以前簡單圖形編程學(xué)習(xí)時(shí)比較過Qt,Win32 GDI時(shí)感受特別深刻,在沒有額外處理的時(shí)候,Win32動(dòng)畫程序那個(gè)閃阿,而Qt程序非常穩(wěn)定。事實(shí)上,我想,Qt的其他問題比效率嚴(yán)重多了,比如個(gè)人感覺Qt程序在Windows下刷新的感知明顯沒有Windows原生程序快,這點(diǎn)倒是值得改進(jìn)。
OpenGL只處理與3D圖形的繪制,基本上不提供創(chuàng)建用戶界面的功能,所以為OpenGL應(yīng)用程序創(chuàng)建用戶界面必須使用其它的圖形工其包(如Motif、MFC等)。而Qt的OpenGL模塊很好的解決了這個(gè)問題,它提供了一個(gè)繼承自Qwidget的OpenGL部件類QGLWidget,使得該部件類能夠像Qt其它部件那樣使用,還可以在繪制窗口部件時(shí)直接使用OpenGL的API接口。在Qt中為OpenGL提供支持的類主要有以下幾個(gè):
QGLWidget:用于渲染OpenGL場(chǎng)景的易于使用的Qt部件。
QGLColormap:用于在QGLWidget中安裝用戶自定義的顏×××。
QGLContext:封裝了用于OpenGL渲染的場(chǎng)景。
QGLFormat:指定OpenGL演染場(chǎng)景的顯示模式。
QGLFrameBufferObject和QGLPixelBuffer分別提供了對(duì)GL幀緩沖對(duì)象和GL像素緩沖的支持。
QGLPaintEngine:QPaintEngine的派生類,為QPainter提供了OpenGL繪圖引擎。
initializeGL() 注冊(cè)函數(shù),在此設(shè)置GL的渲染繪制屬性、定義顯示列表、載入固定紋理等初始化工作。在initializeGL()在調(diào)用paintGL()之前只被調(diào)用一次,之后不再調(diào)用。
paintGL() 繪制函數(shù),在此使用OpenGL中的接口進(jìn)行場(chǎng)景繪制,QGLWidget的paintEvent( QPaintEvent* )將會(huì)自動(dòng)調(diào)用 paintGL()進(jìn)行部件的顯示繪制。也可在需要重繪時(shí)通過updateGL()時(shí)調(diào)用paintGL()。
resizeGL() 該函數(shù)用于處理當(dāng)部件大小發(fā)生改變時(shí),對(duì)OpenGL繪圖管線各矩陣需要進(jìn)行的操作。該函數(shù)paintGL()第一次調(diào)用之前,initializeGL()調(diào)用之后被第一次被調(diào)用, 之后每當(dāng)QGLWidget的不見大小發(fā)生改變時(shí),都將調(diào)用該函數(shù)來對(duì)視圖、投影矩陣等進(jìn)行相應(yīng)的設(shè)置。
學(xué)習(xí)OpenGL很久了,也是時(shí)候在Qt的框架下感受一下OpenGL了,這也是學(xué)習(xí)OpenGL的好處,學(xué)習(xí)D3D的話就沒有這么Happy了,事實(shí)上這也導(dǎo)致我老實(shí)東學(xué)西學(xué)-_-!真不知是好是壞。。。只是作為程序員的感覺,要是世界只剩下Windows,那么實(shí)在失去了太多的色彩。
這樣就完成了一個(gè)利用OpenGL繪制矩形的任務(wù),paintGL中調(diào)用的完全是普通的OpenGL函數(shù),一如我們學(xué)過的普通OpenGL函數(shù),沒有區(qū)別。其中最主要的代碼就在OpenGL::paintGL()中,這一點(diǎn)需要額外注意,那就是此處與普通的Qt程序是不同的,普通的Qt程序?qū)⒅乩L的工作放在paintEvent中進(jìn)行,但是,可以想像的是,其實(shí)paintGL不過是QGLWidget中paintEvent中調(diào)用的一個(gè)虛接口,Qt可以在外面做好足夠的OpenGL準(zhǔn)備工作。initializeGL,resizeGL,paintGL 3個(gè)額外的虛接口就構(gòu)成了一個(gè)簡單但是強(qiáng)大的OpenGL框架,一如GLUT抽象出的框架及我在Win32 OpenGL學(xué)習(xí)時(shí)建立的框架一樣,知道這些以后,可以將OpenGL在Qt中的編程分成兩個(gè)部分,一個(gè)部分就是由initializeGL,resizeGL,paintGL三個(gè)虛接口構(gòu)成的OpenGL的領(lǐng)域,我們可以在其中進(jìn)行我們習(xí)慣的OpenGL操作,而程序的輸入等其他GUI相關(guān)的處理則還是交由Qt原來的框架去完成。
OpenGL從Win32到Qt
實(shí)際上,在進(jìn)行二維圖形的繪制中,完全可以不使用OpenGL的原生接口而使用更為方便的QPainter。QPainter只是個(gè)API,實(shí)際的渲染是由QPaintEngine來執(zhí)行的。Qt自帶有QGLPaintEngine,為QPainter提供了OpenGL后臺(tái)。在QGLWidget基礎(chǔ)上創(chuàng)建的QPainter,自動(dòng)將QGLPaintEngine作為繪畫引擎。這樣,任何使用此QPainter類型繪制的2D圖形都會(huì)自動(dòng)解析至OpenGL,間接以GL的原生接口來實(shí)現(xiàn)二維圖形的繪制。使用QPainter而不是OpenGL命令的優(yōu)勢(shì)是可輕易將渲染在平臺(tái)默認(rèn)引擎和OpenGL之間切換。這樣不僅可以充分利用二者各自的優(yōu)勢(shì),同時(shí)還可以直接使用Qt二維繪圖系統(tǒng)所提供的眾多高級(jí)功能。
Qt 提供了QtOpenGL模塊來支持三維圖形功能的OpenGL模塊。在使用QtOpengl模塊時(shí),必須在對(duì)應(yīng)的工程文件(*.pro)中加入:
QT += opengl
來聲明使用QtOpengl模塊,以便 qmake 在利用*.pro生成編譯器所需的makefile時(shí)添加所需的opengl庫。
在Qt下使用創(chuàng)建Opengl繪圖組件主要通過繼承QGLWidget并重現(xiàn)相關(guān)繪制函數(shù)來實(shí)現(xiàn),QGLWidget派生自QWidget,故絕大多數(shù)情況下QGLWidget可以像QWidget一樣使用,只是使用OpenGL的函數(shù)替代QPainter實(shí)現(xiàn)繪制。通常通過子類化QGLWidget來實(shí)現(xiàn)OpenGL的使用,QGLWidget提供了三個(gè)虛函數(shù)用以重載來實(shí)現(xiàn)OpenGL的繪制:
可在任何需要刷新場(chǎng)景繪制的地方通過調(diào)用updateGL()來通知OpenGL進(jìn)行重繪,但updateGL()自身不用實(shí)現(xiàn)。與QWidget相同,鼠標(biāo)和鍵盤事件是通過mousePressEvent()和keyPressEvent()等事件處理函數(shù)進(jìn)行處理的。要?jiǎng)?chuàng)建動(dòng)畫,只需啟動(dòng)QTimer,然后調(diào)用updateGL()。但應(yīng)注意,如果需要在QGLWidget派生類之外的其他函數(shù)中進(jìn)行paintGL()相同功能的繪制,需要先使用makeCurrent()接口將后面繪制的上下文對(duì)象(Context)標(biāo)記為當(dāng)前上下文對(duì)象(Current Context)。
如果本地OpenGL支持疊置繪制(Overlay Paint)(windows的WGL和X11的GLX都支持)QGLWidget還可以通過與前述類似的initializeOverlayGL()、resizeOverlayGL()、 paintOverlayGL()和updateOverlayGL()進(jìn)行疊置層的繪制。makeoverlayCurrent()函數(shù)可以用于將疊置標(biāo)記為當(dāng)前上下文對(duì)象.
除了對(duì)OpenGL原生接口的支持,QGLWidget還為OpenGL在多個(gè)操作系統(tǒng)平臺(tái)上的應(yīng)用進(jìn)行了淺層封裝。Qt提供加載圖像并將其與紋理綁定的使用功能??墒褂?nbsp;GLuint bindTexture(Qp_w_picpath&, GLenum target, GLint format, QGLContext::BindOptions)等接口將圖像與所申請(qǐng)的OpenGL紋理索引進(jìn)行綁定,并使用 deleteTexture ( GLuint id )來刪除已申請(qǐng)的紋理索引。Qt在內(nèi)部對(duì)己與紋理綁定的像素圖/圖像進(jìn)行跟蹤,這樣就可在使用相同的圖像文件或像素圖時(shí)重新使用紋理。由于QImage是獨(dú)立于硬件的,因此可以在另一個(gè)線程中對(duì)紋理圖片進(jìn)行繪制,在繪制完成之后再載入OpenGL中作為紋理,而不需要OpenGL渲染線程中處理,因此可以很大幅度提高OpenGL繪圖部件的響應(yīng)速度。
Qt還提供了在OpenGL三維繪圖場(chǎng)景中任意三維位置處按照給定的QFont字體格式繪制任意字符(包漢字等非ASCII碼字符),大大簡化了在三維場(chǎng)景中繪制字符的操作
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。