最近我們團隊參加乙個軟體大賽,命題為基於語音識別技術的3d智慧型導遊員。在識別使用者語音做出應答的同時驅動模型的口型,動作的匹配。在技術的選用方面優先選擇了開源的ogre作為3d渲染引擎,但經過權衡放棄了cegui、flash做的ui,最終決定將ogre渲染到mfc框架中來實現本系統的功能。
總體實現並不是非常困難,實現如下:
1、利用ogre將3d模型及場景渲染在view類中,初始化時手動載入ogre需要的配置檔案及資源。並在ondraw中持續呼叫mwindow->update();在重新整理畫面時採
用ontimer來控制持續重新整理,防止出現頻閃。如果需要在view中加入控制項則需要雙緩衝技術來實現。
2、ui層對話方塊採用整體透明,僅留下控制項ui,首先生成位置正好覆蓋單文件視窗,重寫onerasebkgnd(cdc* pdc)函式,將背景色設為一種不常用顏色,再利用setlayeredwindowattributes實現透明。
3、在mainframe的onmove中控制ui層隨mainframe移動。
之後新增ogre的監聽函式,可以採用全域性變數來實現相應控制。由此產生的效果就是採用mfc的ui來控制ogre的3d渲染。
在將ogre渲染到mfc框架當中時容易出現的幾個問題:
1、mfc和ogre結合時記憶體洩露問題。
在生成debug時,所有的new關鍵字將被替換為debug_new,但在ogre中會引起記憶體洩露,應該在所有引用ogre**的地方刪掉如下**就正常了。
#ifdef _debug
#define new debug_new
#endif
2、使用setlayeredwindowattributes在xp下出現被ogre畫面覆蓋的現象。在win7下一切正常,在xp環境下由於ontimer持續控制渲染,ui層就會被view的3d
影象覆蓋,但是控制項ui依然在頂層可以接受響應。只需要放棄使用通透色就可以解決。不過ui層對話方塊需要進一步改進。
3、afxpostquitmessage(0)失效的問題。在持續渲染中首先要中斷ogre的持續監聽,否則函式停止的只是ogre。可以設全域性同步訊號來解決這個問題,待渲染停止後關閉。
4、盡量在全部初始化完畢後再startrendering。否則很容易因為持續的渲染打斷其他初始化工作,例如我們的語音引擎如果在ogre渲染後初始化就會失敗。
將ogre 嵌入到 Qt中
我用的環境是vs2008 qt 2,新增幾個檔案如下 fogrewidget.h include 如果為假就返回 ifndef false return define false return h,r if h return r endif ifndef degug define degug end...
Ogre中的批次渲染技術 Batching
不管在什麼引擎中渲染操作都是乙個非常耗費系統資源的過程,乙個物體要渲染到螢幕上就必須要經過一次渲染操作,假如場景中有幾萬棵相同的樹,那麼系統也會執行幾萬次的渲染操作,這樣程式效率會非常慢,如果能將這些具有相同渲染狀態的樹,用一次渲染操作都畫出來,那麼效率就會提公升好幾倍。ogre引擎所提供的ogre...
Ogre中的批次渲染技術 Batching
不管在什麼引擎中 渲染操作都是乙個非常耗費系統資源的過程,乙個物體要渲染到螢幕上就必須要經過一次渲染操作,假如場景中有幾萬棵相同的樹,那麼系統也會執行幾萬次的渲染操作,這樣程式效率會非常慢,如果能將這些具有相同渲染狀態的樹,用一次渲染操作都畫出來,那麼效率就會提公升好幾倍。ogre 引擎所提供的 o...