QT +QPainter +opengl 混合編程

C++GUI Programming with Qt 4, secondedition編程

這本書介紹了OpenGL三我也能夠實現一個相似的功能吧?結果測試了晚上和一上午,才弄懂例子的原理。緩存

書上介紹Qt的繪圖引擎能夠和OpenGL渲染器混合在一個繪圖上下文(RenderContext)的,可是須要注意的是,若是使用了這樣的混合,那麼咱們就須要注意正確地切換渲染上下文。雖然書上有了相關的介紹,但我以爲仍是有些疏忽——稍微介紹一下就完了,咱們還不知道若是不這麼作會顯示不了圖形。ide

首先要明確一個問題。製做這樣混合的程序到底是使用便利的initializeGL()、resizeGL()、paintGL()函數仍是使用QWidget基類的構造函數、paintEvent()函數和resizeEvent()函數?我實驗了下,以爲混合着用是最好的。若是你們以前學過了用glut構建OpenGL程序的方式,那麼我想你會贊成個人。函數

在構造QGLWidget子類的時候,個人作法是在相關初始化的代碼既能夠寫入構造函數中,又能夠寫入initializeGL()函數中。隨後繪製的部分我認爲既然是混合OpenGL和QPainter的應用程序,那麼必定要使用paintEvent()函數。由於若是使用paintGL()函數,那麼只能繪製OpenGL圖形了不是嗎。而須要重繪的時候,既可使用resizeGL()也能夠重寫resizeEvent(),取決你的需求,可是按照glut的思惟,仍是重寫resizeGL()比較好。不過相信你們的實力仍是本身能夠寫一個resizeGL()函數出來的。測試

隨後爲了讓這OpenGL和QPainter都將圖形繪製在一個渲染上下文中,須要手動關閉一些開關。下面兩句代碼意思就是關閉自動填充背景圖片和自動交換緩存(緩衝區)。spa

setAutoBufferSwap( false );setAutoFillBackground( false );

隨後注意的是在用QPainter繪製二維圖形的時候,必定要用QPainterbegin()end()成員函數包裹(QPainter在構造的時候隱式調用了begin()函數),這樣保證了二維圖形繪製的完整性(其實Windows編程的GDIDirectXOpenGL都是這麼作的)。在用OpenGL繪製三維圖形以及設置OpenGL的時候,若是不是在initializeGL()resizeGL()paintGL()函數內,那麼須要使用makeCurrent()將渲染上下文轉爲OpenGL繪製。此外在初始化OpenGL或者使用OpenGL函數進行渲染的時候,必定要記住設置順時針爲正面。即orm

glFrontFace( GL_CW );

或者在進行OpenGL渲染的時候,將OpenGL的全部位都壓入堆棧,繪製完畢後彈出堆棧(例子程序VowelCube就是這麼作的),使用下面兩條語句包裹:圖片

glPushAttrib( GL_ALL_ATTRIB_BITS );glPopAttrib( );

若是不這麼作的話,那麼用QPainter繪製的二維圖形是沒法顯示的。在之前的glut編程時沒有遇到這個問題的我在這裏折騰了好久。因此之後但願不要再這樣出錯了。get

有了這些規則,我開始研究怎樣製做豐富多樣的QtOpenGL程序了。it

維繪圖引擎QPainter混合例子:VowelCube。讓我暗自高興,

相關文章
相關標籤/搜索