顯示渲染-OSG框架解析

1.背景介紹

1.1 OSG介紹

OSG的全稱:OpenSceneGraph,它是一個開放源碼,跨平臺的圖形開發包,它為諸如飛行器仿真,游戲,虛擬現實,科學計算可視化這樣的高性能圖形應用程序開發而設計。

它基于場景圖的概念,它提供一個在OpenGL之上的面向對象的框架,從而能把開發者從實現和優化底層圖形的調用中解脫出來,并且它為圖形應用程序的快速開發提供很多附加的實用工具。


基于OSG的典型應用:Delta3D(美國海軍研究院開發的全功能游戲與仿真引擎)、osgEarth(三維數字地球引擎庫)

1.2 LOD介紹

是指根據物體模型的結點在顯示環境中所處的位置和重要度,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。在OSG的場景結點組織結構中,專門提供了場景結點osg::LOD來表達不同的細節層次模型。其中,osg::LOD結點作為父節點,每個子節點作為一個細節層次,設置不同的視域,在不同的視域下顯示相應的子節點。

主要3個過程: 生成,切換,選擇。
最主要的問題:如何實現平滑過渡。

實現方式:最差的方式是后臺準備多個模型,根據距離直接切換,缺點是切換時感覺突兀。
(1)線性混合方式:對兩個離散層級的模型進行混合,缺點是加大系統內存和計算開銷
(2)透明度混合:在臨切時,一個逐步透明,另一個逐步顯示,淡入淡出。
(3)最優方式:實時算法,將相鄰頂點或邊進行合并,靠算法進行模型數據坍處理,逐步坍塌頂點,離得越遠,模型越小。
一般LOD都是根據距離來做切換過渡的,少數基于時間和投影面積等其他特定需求的.

2.渲染框架

2.1 幀渲染機制
  • ?Update 更新 Cull 篩選? Draw 繪制
  • 渲染幀:每一次場景更新,篩選,繪制的過程。
  • advance():一幀經歷的時間、幀數以及棄用對象的刪除,獲取幀率及顯示狀態信息等;
  • eventTraversal():執行用戶設置的EventCallback,為所有的用戶交互和系統事件提供一個響應的機制; 它必須在每一幀的仿真過程中,取出已經發生的所有事件,摒棄那些對場景不會有助益的(例如,在視口以外發生的鼠標移動事件和胡亂點擊),依次交付給各個事件處理器 ( EventVistor事件遍歷器),最后清空現有的事件隊列eventQueue ,等待下一幀的到來。
  • updateTraversal():處理用戶的更新回調對象之外,還要負責更新攝像機的位置,并且更新分頁數據庫DatabasePager 和圖像庫ImagePager 的內容。
  • 更新回調與事件回調最大的不同在于:每當一個用戶交互或系統事件產生時,每一個節點(以及Drawable 對象)的事件回調都會被調用一次;而節點(以及Drawable 對象)的更新回調只會在每幀中被調用一次( NodeVistor 節點遍歷器)。這一區別決定了我們應當在什么時候使用事件回調,以及在什么時候使用更新回調。
  • renderingTraversals():場景的渲染遍歷工作。
2.2 更新機制

2.3 視景管理

2.4 數據分頁管理

分為DatabasePager管理和ImagePager管理。

在三維場景中可以采用數據分頁的方式進行動態調度。這里“分頁”的意思是隨著視口范圍的變化,場景只加載和渲染當前視口范圍內數據,并將離開視口范圍內的數據清除內存(可以設定不同的數據卸載策略),不再渲染。保證內存中只有有限的數據量,場景的每一幀也只有有限的數據被送到圖形渲染管道,從而提高渲染性能。

執行時機

在每一幀刷新的節點更新回調中處理

動態調度

OSG源代碼中提供PagedLOD來進行模型的動態調度。在不同的視域下,PagedLOD動態讀取不同細節層次的結點模型,實現了分頁LOD顯示。OSG內部采用osgDB::DatabasePager類來管理場景結點的動態調度,場景循環每一幀的時候,會將一段時間內不在當前視圖范圍內的場景子樹卸載掉,并加載新進入到當前視圖范圍的新場景子樹。OSG采用了多線程的方式來完成上述工作。

具體工作步驟:

  • 在每一幀中通過一個UpdateSceneGraph()來進行動態調度。
  • DatabasePager::removeExpiredSubgraphs:用于去除已經過期的場景子樹;
  • DatabasePager::addLoadedDataToSceneGraph:用于向場景圖形中添加新載入的數據。osgDB::DatabasePager 類執行的是這一工作:每一幀的更新遍歷執行到updateSceneGraph 函數時,都會自動將“一段時間之內始終不在當前頁面上”的場景子樹去除,并將“新載入到當前頁面”的場景子樹加入渲染,這里所說的“頁面”往往指的就是用戶的視野范圍。這些分頁和節點管理的工作如果由渲染循環來完成的話,恐怕是費時又費力的,對于場景的顯示速度有較大的影響,因此,DatabasePager 中內置了專用于相關工作處理的DatabaseThread?線程。
2.5 DatabaseThread工作機制

???????????????????????????????? 場景主線程交互邏輯

2.6 渲染消息處理流程

使用EventQueue::TakeEvents函數,把GraphicsWindow圖形窗口對象gw的事件隊列保存到指定的變量 gw_events中。

2.7渲染狀態樹

2.8 渲染流程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43460.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Springboot隨機端口配置

網上所有地方都告訴你的錯誤配置: server: port: ${random.int[6008,6009]} 這才是正確配置: server: port: ${random.int(6008,6009)} 如果能解決你的問題請記得點贊!讓更多人知道!

DNS緩存詳解

目錄 一、緩存分類 1. 客戶端緩存(以瀏覽器緩存為列) 2. 操作系統緩存 3.本地hosts文件靜態映射 二、DNS查找優先順序 1.瀏覽器查找順序 2.cmd ping查找順序(非瀏覽器) 一、緩存分類 在一臺終端上,DNS緩存可以…

Android 12系統源碼_設備設置(一)Settings介紹

前言 Settings 類是一個用于訪問和管理設備設置的關鍵類,而作為系統開發人員,經常需要用這個類來做一些系統設備設置,而Settings里面存在著好幾個處理不同領域的設備設置類,那么如何才能結合自己的業務場景正確選擇使用這些設備設…

微信小程序開發跳轉京東,淘寶小程序

沒有淘寶小程序,所以只能提示他復制鏈接網頁打開 跳轉京東小程序 獲取京東小程序 京東小程序appId:wx91d27dbf599dff74 或者點開京東小程序,查看詳情即可獲取到京東的appid 店鋪頁面路徑 店鋪首頁:pages/shop/index/index?…

《無所不能的JavaScript · prototype 原型鏈》

📢 大家好,我是 【戰神劉玉棟】,有10多年的研發經驗,致力于前后端技術棧的知識沉淀和傳播。 💗 🌻 近期剛轉戰 CSDN,會嚴格把控文章質量,絕不濫竽充數,歡迎多多交流。&am…

OpenWrt入門 (1) - 登錄及ssh命令接入wifi

本文參考自: [OpenWrt 維基]在 OpenWrt 上啟用 Wi-Fi 接入點 --- [OpenWrt Wiki] Enabling a Wi-Fi access point on OpenWrt 需要詳細了解的小伙伴請看原文 基本概念 OpenWrt是適用于嵌入式設備的一個Linux發行版。 相對原廠固件而言,OpenWrt不是一個單一、靜態…

企業如何從無序管理走向精益生產管理?

先來看看企業生產管理無序的弊端有哪些? 數據統計不及時:紙質生產工單,數據難統計,各業務環節問題難定位,影響車間生產效率。生產過程不透明:生產過程數據難監控,生產派工管理混亂,…

【前端】面試八股文——meta標簽

【前端】面試八股文——meta標簽 在HTML文檔中&#xff0c;meta標簽是一個關鍵但常被忽視的元素。它位于文檔的<head>部分&#xff0c;用于提供關于HTML文檔的元數據&#xff08;metadata&#xff09;。這些元數據不會直接顯示在頁面上&#xff0c;但對搜索引擎優化&…

web前端開發——標簽一

今天我來針對web前端開發講解標簽一 Html標簽_標題&段落&換行 注釋標簽&#xff1a;Ctrl/ Ctrl/ &#xff0c;用戶可能會獲取到注釋標簽 注釋的原則: ?和代碼邏輯一致 ?盡量使用中文 ?正能量 標題標簽&#xff1a;<h1></h1> h1-h6 標題標簽有6…

C++線程鎖std::mutex

基本用法 “mutex”是“mutual exclusion”的縮寫&#xff0c;意思是互斥鎖。互斥鎖用于多線程編程中&#xff0c;以確保同一時間只有一個線程能夠訪問某一共享資源&#xff0c;從而避免數據競爭和不一致性。 std::mutex是最基本的互斥鎖&#xff0c;用于保護共享數據。它有兩…

Vue3框架搭建2:axios+typescript封裝

倉庫地址&#xff1a;https://github.com/buguniao5213/LuArch&#xff08;分支代碼未上傳&#xff0c;完整一系列后傳一波&#xff0c;中途有需求可以再傳&#xff09; 1、安裝axios npm install axios2、創建文件 先創建一個文件夾&#xff1a; ├── src/ │ ├── …

51單片機-第二節-數碼管

一、數碼管介紹&#xff1a; 1.什么是數碼管&#xff1f; 多個LED組合成8字顯示器。 2.一位數碼管的引腳&#xff08;只有一個8&#xff09;&#xff1a; 數碼管的引腳為1-10&#xff0c;其中公共極為3,8&#xff0c;其余八位分別對應一個二極管&#xff0c;如下圖&#xff…

Vue2 基礎十Vuex

代碼下載 Vuex 概述 組件之間共享數據的方式&#xff1a; 父組件向子組件傳值&#xff0c;是以屬性的形式綁定值到子組件&#xff08;v-bind&#xff09;&#xff0c;然后子組件用屬性props接收。子組件向父組件傳值&#xff0c;子組件用 $emit() 自定義事件&#xff0c;父組…

JavaScript--local storage存儲的數組不可擴展的問題

數組擴展 問題解析解決辦法總結進一步擴展原因 問題 下列代碼中的points是從本地存儲中獲取到的數據&#xff0c;我想存儲到一個Map并且新增元素的時候報錯 let obj this.objectsManager._objects.get(obstacle.uuid);let points obj.track_points;this.dyObstacleTP.set(ob…

【大模型】大模型相關技術研究—微調

為什么要對大模型進行微調 1.成本效益&#xff1a; o 大模型的參數量非常大&#xff0c;訓練成本非常高&#xff0c;每家公司都去從頭訓練一個自己的大模型&#xff0c;這個事情的性價比非常低。 2.Prompt Engineering 的局限性&#xff1a; o Prompt Engineering 是一種相…

視圖庫對接系列(GA-T 1400)十二、視圖庫對接系列(本級)人員數據推送

背景 人體和非機動車和機動車類似的,只是請求的參數不一樣而已。人員數據推送 接入人員數據推送相對比較簡單,我們只需要實現對應的接口就ok了。 具體如圖: 有增刪改查接口,目前的話 因為我們是做平臺,我們只需要實現添加接口就可以了。 接口實現 service 層 /**** …

軟件工程面向對象 超市管理系統 需求分析 系統設計 課程設計報告

1、引言 系統簡述 超市管理系統的功能主要有前臺管理和后臺管理兩個大塊。其使用對象 有超市管理人員和超市銷售人員兩類。超市管理系統主要為了實現商品輸 入、 輸出管理數據的自動化&#xff0c; 提高商品統計信息的實時性&#xff0c; 減輕人工勞動強 度從而節省人力成本。實…

Perl 語言開發(九):深入探索Perl語言的文件處理

目錄 1. 文件打開與關閉 1.1 打開文件 1.2 關閉文件 2. 讀取文件內容 2.1 逐行讀取 2.2 一次性讀取整個文件 3. 寫入文件內容 3.1 覆蓋寫入 3.2 追加寫入 4. 文件測試操作 4.1 文件測試運算符 5. 文件路徑操作 5.1 文件路徑處理模塊 5.2 獲取文件路徑信息 6. 文…

探索加油小程序開發:便捷出行的科技新篇章

在快節奏的現代生活中&#xff0c;出行已成為人們日常生活中不可或缺的一部分。隨著移動互聯網技術的飛速發展&#xff0c;各類小程序以其輕量、便捷的特點迅速融入人們的日常生活&#xff0c;其中&#xff0c;加油小程序作為智慧出行領域的一股清流&#xff0c;正悄然改變著我…

《簡歷寶典》04 - 簡歷的“個人信息”模塊,要寫性別嗎?要放照片嗎?

平時幫助小伙伴們優化簡歷的時候&#xff0c;我看見他們有人會寫性別&#xff0c;有人不會寫。 目錄 1 招聘團隊的考慮 2 性別是無法改變的&#xff0c;能不寫就不寫 3 什么情況下&#xff0c;需要寫性別呢&#xff1f; 4 簡歷中要加照片嗎&#xff1f; 1 招聘團隊的考慮 …