第三章、 系統實作
3.2 混合 CWT-GL 與 3D 繪圖的實作內容議題
3.2 混合 CWT-GL 與 3D 繪圖的實作內容議題
在這一節中,將會討論實作系統時要注意的一些議題。在 3.2.1 中,
會說明如何將 2D 元件放置在畫面最頂端。3.2.2 節中,說明要回復的位 置矩陣參數。3.2.3 節提出一般 3D 繪圖中打光的問題。3.2.4 節則提出 混合兩個繪圖流程要注意的裁切問題。
3.2.1 元件置頂
在 3D 的遊戲畫面中,GUI 不行被遊戲畫面遮住,所以 CWT 的元件必 須繪製在畫面的最上層,也就是要 3D 程式繪製在視窗上面後 CWT 才進 行繪製,為了達到這點,在註冊進 OpenGL 繪圖程序時,CWT 要在 3D 程 式註冊後才註冊,但是最底層的視窗也是 CWT 建置的,若直接在 3D 程 式後才註冊 CWT,那會造成連視窗無法繪出的情況發生,所以本論文的
解髮是,CWT 先註冊繪出視窗,接著 3D 程式要註冊時,先移除 CWT 的註 冊,等 3D 程式註冊完後在註冊回去,如圖 3-12,這樣就可以解決 CWT 要在 3D 程式之後繪製的問題。
這裡還要注意一點就是,當 CWT 在繪製時要關掉深度測試,深度測 試就是指當 OpenGL 在繪製流程時,會依據當時物件所在的 z 軸座標來 呈現上下遠近的關係,即使是後畫元件,因為深度測試發現比 3D 程式 物件的 z 座標要小,也會繪製在 3D 物件之後而被遮住,所以當 CWT 在 繪製時要關掉深度測試,以確保 CWT 元件會繪製在最上方不會被遮蔽。
圖 3-14:3D 圖形混合 2D CWT 元件繪圖流程架構圖-關閉深度測試
3.2.2 位置矩陣參數回復
開發者在繪製 3D 畫面時,會依據需要使用許多 OpenGL 繪圖流程的 參數設定,而輪到要繪製 CWT 時會改用 CWT 的繪圖設定如投影、視點、
視埠等,但是下次繪製 3D 畫面時,如果開發者沒有再次設定要使用的 參數,則 OpenGL 就會用現有最新的也就是使用 CWT 的參數去做繪製, 這 樣畫面就會出錯,而我們為了能讓開發者能夠像使用 AWT 一樣撰寫程式,
以達到增加產能,開發者不需要因為使用 CWT 代替 AWT 而對程式進行修 改,例如:每次要繪圖時都重新設定參數,因為 AWT 並不會影響原來的 3D 繪圖參數設定。
本論文設計使用 PushMatrix 跟 PopMatrix 將 3D 繪圖的參數在要畫 CWT 之前存起來,等 CWT 畫完之後,再將繪圖參數取出設定回 3D 程式,
如圖 3-13。
圖 3-15:3D 圖形混合 2D CWT 元件繪圖流程架構圖-回復 3D 繪圖參數
3.2.3 打光問題
在 3D 繪圖中,常會利用打光來讓物體產生陰影及遠近效果,使畫面
更為逼真,但是 GUI 一定都是清楚顯示在畫面上且為 2D,所以並沒有打 光的機制,如果加上打光,有可能會因為 CWT 元件的座標在光源後面,
因背對光源而造成畫面顯示的不正常,所以在繪製 CWT 前,必須先判斷 3D 應用程式是否有使用打光,如果有,則將打光取消,等 CWT 繪製完畢 後再打開,如圖 3-14。
圖 3-16:3D 圖形混合 2D CWT 元件繪圖流程架構圖-關閉光源設定
3.2.4 裁切問題
裁切(Clip)是在大量繪製圖形中取出所需要部分的重要功能,像是 在繪製 3D 方塊時,會把 3D 方塊以外的部份裁切掉,如 CWT 的 Button,
但是當 CWT 繪製 Button 前要先將原來 3D 程式的裁切設定存起來,然後 重新設定裁切的範圍,等繪製完後再恢復原來 3D 程式的裁切設定,如 圖 3-15。
gluLookAt (0,0,10, 0,0,0, 0,1,0)
PopMatrix
gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);
投 射 PushMatrix
gluPerspective(0, width, height, 0)
PopMatrix
gluOrtho2D(0,width,‐height,0)
視 埠 PushMatrix
glViewport (x, y, width, height)
PopMatrix
glViewport(0,0,width,height);
深 度 測 試 glIsEnabled(GL_Depth_test) glDisable(GL_Depth_test) 光 源 glIsEnabled (GL_LIGHTING) glDisable(GL_LIGHTING) 裁 切 glGetClipPlane glSetClipPlane
表 3-1:3D 圖形混合 2D CWT 元件繪圖參數設定函式表