Qt+OpenGL實現簡單的粒子效果(新年qi)

前幾天在學習unity的時候做的一個飛行器的尾焰的粒子效果還不錯,如下圖


於是乎想着能不能自己實現這種效果,查閱相關資料後根據NeHe的教程自己弄了個類似煙花的爆炸小程序,效果還看得過去,但是在最後想加入背景圖的時候出現了一些問題,下面我將展示我的程序效果及主要問題。

一、在沒有添加背景圖的時候,背景被初始化爲黑色,此處截圖只能截取瞬時的畫面,因此看上去很粗糙(看不出爆炸效果)。

程序控制:鼠標左鍵點擊處會在點擊處產生爆炸效果,點擊右鍵會展示金屬質感的字體及粒子;

  上下鍵控制文字的上下翻轉(3D紋理字)以及粒子的運動趨勢;

  Enter鍵進入彩虹模式即粒子顏色隨機/單色模式,進入單色模式後按空格鍵切換粒子顏色。

整體效果還算正常,但在我加入背景圖時由於是二維的顯示需要設置其深度,而每次調用paintGL()函數時需要清除深度緩存和重置當前的模型觀察矩陣,因爲不這樣的話粒子的紋理效果簡直一團糟,結果就是背景圖片不能正確繪製。

二、在網上試了一些方法後感覺這篇文章描述的方法還挺有意思的http://blog.csdn.net/gamesdev/article/details/8496140,於是重新調整了一下代碼結構,不過運行結果如下所示


這個效果我就不評論了,而且3D紋理字也不能顯示了。找了下原因,

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

setAutoBufferSwap( false ); setAutoFillBackground( false );

在用OpenGL繪製三維圖形以及設置OpenGL的時候,如果不是在initializeGL()resizeGL()paintGL()函數內,那麼需要使用makeCurrent()將渲染上下文轉爲OpenGL繪製。此外在初始化OpenGL或者使用OpenGL函數進行渲染的時候,一定要記住設置順時針爲正面。即

glFrontFace( GL_CW );

setAutoBufferSwap(false);這個函數幫助文檔裏粗略解釋爲使用雙緩衝格式,在調用paintgl()函數後背景和前景的緩衝區會自動交換,不知道其到底是如何交換的導致程序有問題,在這裏只能先將問題記錄下來,待進一步學習後再回頭改進。

工程下載地址:http://download.csdn.net/download/did_you/10244544

使用的qt版本爲

Qt 5.2.0 (MSVC 2010, 32 bit) 歡迎各位大佬指出錯誤和不足之處~

好笑的是,在我剛把這篇文章發佈還沒通過審覈的時候像是突然來了靈感一樣,將這個問題完美解決了,而且還發現opengl的深度緩存還能識別二維圖片中的顏色並加以改變,真的是太牛了!下面附上我的靈感之作,哈哈


更新後的工程以及演示視頻下載地址:

http://download.csdn.net/download/did_you/10244603


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