999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

OpensSceneGraph程序設計的應用

2020-11-26 17:16:22黃聰
電子技術與軟件工程 2020年15期

黃聰

(咸寧職業技術學院 湖北省咸寧市 437100)

1 引言

OpensSceneGraph(OSG)是一個跨平臺開源場景圖形程序開發接口。它作為中間件為應用軟件提供了各種高級渲染特性,IO,以及空間結構組織函數。它封裝并提供許多提升程序運行性能的算法,利用顯示列表、OpenGL 狀態排序、著色語言、LOD 等方法提高效率,提供了絕大多數主流數據格式的直接數據接口(包括圖片、三維模型,以及字體等),同時支持腳本語言系統Python、Tcl、Lua 等。

2 程序設計分析

2.1 內存管理

當應用程序不再使用場景圖形時,OSG 使用內存引用計數器(referencecounted memory)來自動釋放場景圖形節點,OSG的內存管理機制將在最后一個指向根節點的指針被釋放時,釋放整個場景圖形。這種內存引用計數機制包含以下兩個組件:基類osg::Referenced 和智能指針模板類ref_ptr<>。當創建任何繼承自Referenced 的節點時,程序切不可直接釋放其內存空間,也不要用標準C++指針變量長時間保存繼承自Referenced 類的對象指針,否則編譯時會提示錯誤信息。在osg::Reference 類成員函數中,有兩個成員函數ref()和unref(),二者主要用來控制內存計數,程序不要隨意改變內存計數器的值。運算符dynamic_cast 的主要作用是將基類的指針或者引用安全地轉換為派生類的指針或者引用,然后用派生類的指針或者引用調用非虛函數,需要注意的是,在類層次間進行轉換時,基類型至少含有虛函數才能進行這種轉換。開發者在編寫代碼時為避免出現內存泄漏和指針懸掛問題,應編寫清潔的代碼。

2.2 場景管理

場景管理是OSG 渲染引擎的核心部分,OSG 利用包圍體層次包圍體層次(Bounding Volume Hierarchy,BVH)來實現場景圖形的管理。通過綜合使用包圍球(Bounding Sphere)和包圍盒(Bounding Box)這兩種形式來盡可能達到最佳的場景組織和訪問性能。當有節點樹中某節點發生變化時,需要重新計算該節點包圍球的大小和位置,一直遞歸到根節點,從而維護整個BVH 樹。場景圖形采用一種自頂向下的、分層的樹狀數據結構來組織空間數據集,場景圖形樹的頂部是一個根節點,從根節點向下延伸,各個組節點中包含幾何信息和渲染狀態信息,各個葉節點包含了構成場景中物體的實際幾何信息。場景樹包含的不同類型節點可以執行各種不同的功能,如開關節點可設置子節點是否可用;細節層次節點可根據觀察者的距離調用不同的子節點;變換節點可改變子節點幾何體的坐標變換狀態。簡單的場景可能只有一個Camera,復雜的場景可能有多個Camera,不同的Camara 從不同的角度看向同一個場景時,可能看到不同的場景,在渲染的時候,通過遍歷Camera,已完成渲染。不同的節點實現不同的功能,開發者應根據需要靈活應用,同時選擇合適的角度以觀察主場景。

2.3 訪問器機制

OSG 中的osg::NodeVisitor 是對訪問器模式思想的具體實現,訪問器的設計允許應用程序將某個特定節點的指定函數應用到場景中的所有節點。通常的做法是繼承自osg::NodeVisitor 這個虛基類,重載apply()方法以獲取各個節點的屬性或者修改節點的屬性,在程序中調用accept()方法關聯需要訪問的節點,并啟動訪問器進行遍歷。這種做法主要適用于一個對象結構包含很多類對象,這些類對象有不同的接口,而想對它們實施一些依賴于其具體類的操作。如果對象結構類經常改變,那么可能在類中定義這些新的操作比較好。根據功能需要,可設置頂點訪問器,紋理訪問器,節點訪問器,編寫的訪問器重載基類的apply()函數以實現相應功能,例如要查找指定的節點時,判斷某個節點名稱是否與要查找的節點名稱一樣,將找到的節點添加到自己的節點列表或者從節點列表刪除。

2.4 渲染管理

OSG 采用狀態機機制osg::StateSet 來跟蹤所用的渲染狀態,被狀態機管理的渲染狀態有:光照lights、材質materials、紋理textures 等,它主要管理渲染屬性和渲染模式。將一個場景圖形關聯到一個實例化的osgViewer::Viewer 對象進行渲染。因為Viewer類的osg::Camera 對象管理模型-視圖矩陣,可通過控制Camera對象來改變每一幀的視口顯示或者設置清屏顏色。在動態修改場景圖形時應避免與揀選及繪制線程發生沖突。OSG 支持絕大部分OpenGL 固定功能管道(fixed function pipeline)渲染,如Alpha 檢驗,剪切平面,深度和模板檢驗,霧效,點和線的光柵化等。在程序中設置osg::StateSet 渲染狀態,但應使關聯到場景圖形的StateSet 最小化,減少一次場景圖形遍歷中所耗費的工作量,從而減少內存的占用。默認情況下,所有的節點渲染狀態都繼承父節點的渲染狀態,除非開發者該表節點的渲染狀態或者繼承模式。OSG 的渲染歸納起來包括三個階段:用戶階段、更新數據階段、場景的管理階段,最終利用renderingTraversals()函數完成場景的揀選和繪制工作。

2.5 紋理映射

紋理映射即紋理貼圖,使用紋理映射可以大大提高三維物體的真實感,達到良好的顯示效果。OSG 全面支持OpenGL 的紋理映射機制,OSG 加載紋理并把紋理送達GUP 的過程中,對紋理進行了縮放和歸一化處理。對紋理的操作主要包括一維紋理、二維紋理、三維紋理、多重紋理、Mipmap 紋理和壓縮紋理等。二維紋理映射中紋理坐標與幾何體的頂點坐標一一對應。多重紋理映射是多個二維紋理映射的疊加,對于不同的紋理屬性對象需要指定不同的紋理單元及紋理坐標,否則不會啟用該紋理單位或者該紋理單元會被覆蓋。Mipmap 紋理映射需要指定各層的紋理圖像數據,用以避免圖像縮放時出現的抖動或者閃爍現象,同時減少不必要的渲染負擔。程序員除了可以使用TextureRectangle 紋理映射,還可以自動生成紋理坐標,以實現使用紋理貼圖生成模型的輪廓線或者光澤模型對任意環境的反射。

2.6 回調機制

OSG 的回調機制主要有如下三種:osg::Node、osg::Drawable、osg::Camera。osg::Node 在OSG 執行更新和揀選遍歷時進行回調;osg::Drawable 在揀選和繪制遍歷時進行回調;osg::Camera在更新遍歷時進行回調。目前經常開發者經常使用節點回調(NodeCallback)和事件回調(EventCallback)。使用節點回調需重載operator()方法,以實現場景的動態更新。當交互事件觸發,如操作鍵盤、鼠標、改變窗口或者點選場景中的某節點,事件回調不僅要重載operator()方法,還需創建事件訪問器并重載handle()方法,將回調實例關聯所需對象,如setUpdateCallback(),setEvent Callback(),setCullCallback(),setReadFileCallback()等。所有的事件均在osgViewer::Viewer::eventTraversal 中進行,它將每個事件都發送到_eventHandlers 中的每個事件處理器中,經過層層過濾,最終的操作由osgGA::GUIEventHandler 進行處理。

2.7 獨立功能

OSG 使用一些工具類來實現一些相互獨立的功能,例如:osgParticle 粒子系統、osgText 文字處理與顯示、osgShadow 陰影、osgFX 擴展庫、osgAL 三維立體聲音等。osgParticle 采用Billboard與色彩融合技術,生成非常真實的粒子效果。osgText 有第三方插件FreeType 支持,用很小的點產生良好的輸出,顯示高質量的文字。osgShadow 用來控制渲染實時陰影,渲染的時候要標記出陰影投影對象和陰影接收對象。osgFX 擴展庫是OSG 的附加庫,它定義了一系列定義好的特殊效果,這些效果可以添加到OSG 的節點中,如異性光照特效、凹凸貼圖特效、卡通渲染特效、刻線特效、立方圖鏡面高光特效等。osgAL 提供三維位置音效,它支持的聲源的最大數量由電腦的顯卡決定,但最多不應超過32 個聲源,否則程序會出錯。

3 平臺實現

OSG 具有跨平臺的特性,可運行在所有Windows、Linux、IOS、Android 等操作系統平臺,支持嵌入式設備。此外,OSG 可以運行在多核的CPU 和GPU 上,因為它對OpenGL 顯示列表、紋理單元、繪制遍歷等過程實施了保護措施,以實現異構模式下的混合編程,可以通過osgViewer 配置當前OSG 應用程序的線程模型,渲染管線的不同階段可以單獨作為一個線程也可以在一個線程中串行執行。它還支持各種UI,如Qt、MFC、SDL、GLUT、Wxwidget 等,分析研究Qt 的工作原理與信號槽消息機制,可編碼實現基于OSG與Qt 的應用程序。

4 應用領域

OSG 在三維應用程序的開發中扮演著重要的角色,廣泛應用于地理信息系統(GIS),計算機輔助設計(CAD),建模和數字內容創作(DCC),數據庫開發,可視化(飛機、船舶、車輛等仿真)、三維建模、虛擬現實(VR)、教育、動畫和游戲等領域。

5 總結

OpenSceneGraph 作為一種優秀的開源三維程序渲染引擎,它完全是由標準C++程序和OpenGL 編寫,充分利用STL 和設計模式,讓開發者避免復雜的底層圖形實現和優化,為三維圖形應用程序的開發提供了很多方便,同時,它在性能、可擴展性、可移植性等方面具有極大優勢,能更加快速創建高性能、跨平臺的交互式圖形程序,廣泛應用于三維可視化仿真、游戲、虛擬現實等高性能圖形應用程序設計中。

主站蜘蛛池模板: 九九线精品视频在线观看| 伊在人亞洲香蕉精品區| 免费A级毛片无码免费视频| 国产香蕉一区二区在线网站| 欧美精品1区2区| 欧美第九页| 国产无码在线调教| 精品人妻一区无码视频| 五月丁香在线视频| 国产男女XX00免费观看| 午夜天堂视频| 99精品国产电影| 午夜国产大片免费观看| 丁香婷婷激情综合激情| 麻豆精品在线| 青青青草国产| 国产av色站网站| 久草视频精品| v天堂中文在线| a级毛片免费播放| 久久精品视频亚洲| 成人日韩视频| 在线中文字幕日韩| 欧美一级特黄aaaaaa在线看片| 无码电影在线观看| 婷婷色在线视频| 免费毛片网站在线观看| 四虎影视8848永久精品| 婷婷激情亚洲| 一区二区三区四区日韩| 亚洲第一中文字幕| 亚洲精品另类| 日韩精品欧美国产在线| 91美女在线| 国产成+人+综合+亚洲欧美| 午夜啪啪福利| 久久综合丝袜日本网| 超碰免费91| 91色在线观看| 亚洲精品国产首次亮相| 亚洲精品免费网站| 久热中文字幕在线| 国产乱子精品一区二区在线观看| 在线观看亚洲人成网站| 九九视频在线免费观看| 啪啪永久免费av| 国产精品无码一二三视频| 黄色网页在线观看| 色亚洲成人| 不卡无码网| www.日韩三级| 国产xx在线观看| 黄色一级视频欧美| 国产精品尤物铁牛tv| 成人精品在线观看| 欧美在线视频a| 91福利一区二区三区| 午夜视频www| 999国产精品永久免费视频精品久久 | 天天视频在线91频| 91po国产在线精品免费观看| a级高清毛片| 亚洲成综合人影院在院播放| 精品人妻AV区| 三级国产在线观看| 国产成人你懂的在线观看| 亚洲毛片一级带毛片基地| 国产极品粉嫩小泬免费看| 在线观看网站国产| 人妻熟妇日韩AV在线播放| 亚洲欧美不卡| 欧美第一页在线| 国产亚洲美日韩AV中文字幕无码成人| 色偷偷一区二区三区| 国产成人麻豆精品| 国产精品无码AV中文| 亚洲综合亚洲国产尤物| 国产综合精品一区二区| 国产精品妖精视频| 暴力调教一区二区三区| 久久人搡人人玩人妻精品一| 巨熟乳波霸若妻中文观看免费|