探索未知種族之osg類生物---器官初始化三

探索未知種族之osg類生物---器官初始化三
當判斷到viewer中沒有一個graphicContext可用時,osg就會默認的進行一次對viewer的實現操作,這樣可以保證osg以後可以安心的在屏幕上進行作畫。那我們就來看看這個osgViewer::Viewer::realize()函數到底具備什麼樣神奇的功能。

osgViewer::Viewer::realize()
osgViewer::Viewer::realize()的最要作用可以總結爲激活設置窗口以及初始化關聯線程。Viewer::getContexts()上一節以及進行了詳細的介紹,就是得到所有相機上關聯的圖形設備器。當contexts爲空時就代表不存在一個窗口set up,所以osg開啓默認一個的視圖。讀取環境變量OSG_CONFIG_FILE,如果設置了OSG_CONFIG_FILE指向一個.view後綴的文件,可以創建該文件描述的窗口,格式如下:(在openscenegraph-data目錄中的configuration目錄下有.view類型的文件)

osgViewer::Viewer
{
setUpViewInWindow 100 200 600 400 0
}

如果設置了OSG_CONFIG_FILE環境變量,但是環境變量所對應的文件解析有錯,那麼整個程序就會退出。

如果沒有設置OSG_CONFIG_FILE環境變量,那麼程序會檢查 OSG_SCREEN和OSG_WINDOW這兩個環境變量的值,OSG_SCREEN對應窗口的個數(值是一個整型數)OSG_WINDOW對應窗口的大小和位置,格式是(x, y, w, h) 分別是窗口左上角點座標(x, y)以及窗口的長和寬(w, h),具體來說是以下情況:

探索未知種族之osg類生物---器官初始化三

當窗口設置完成之後,osg會再次調用getContexts(contexts) 蒐集目前可用的設備渲染上下文,如果這時候還沒有窗口產生,也就是說設置窗口的各種方式都失敗了,那麼程序就會退出,如果成功,那麼會針對已經常見的窗口進行一些設置,完成後續的操作

接下來我們先簡單的介紹一個表格中三個函數
探索未知種族之osg類生物---器官初始化三

這些函數調用了osgViewer命名空間中的三個窗口配置類,它們的關係如下圖所示:

探索未知種族之osg類生物---器官初始化三

基類osgViewer::ViewConfig提供了一個虛函數 virtual void configure (osgViewer::View &) const,在子類中通過實現該函數來配置渲染的窗口大小和位置。

這裏我們只對一個類的configure函數進行講解,其他兩個請大家自行了解。

AcrossAllScreens::configure(osgViewer::View& view)函數,首先調用osg::GraphicsContext的靜態函數getWindowSystemInterface用於獲得系統的api接口,至於這個api接口是怎麼被創建的,我們需要在src/osg/GraphicsContext.cpp中找到setWindowSytemInterface函數,這裏就是進行系統api的設置,他的作用是指定操作平臺所使用的視窗 API 接口,也就是在特定的系統平臺上創建圖形窗口的時候,將會使用到哪些本地 API 函數。當然,Windows 系統要使用 Win32 API,而Linux 系統要使用 X11 API,Apple 系統則使用 Carbon。由於現在實在ubuntu16.04系統上,所以cmake只會把GraphicsWindowX11.cpp進行編譯,所以想知道怎麼指定的系統api接口在GraphicsContext中,我們需要進入GraphicsWindowX11.cpp的2136行的WindowingSystemInterface 結構體,這個結構體在初始化的時候就會調用。用於設置系統api接口。還 有 注 意 那 個 緊 跟 着 結 構 體 的 全 局 變 量(GraphicsWindowX11.cpp,2159 行),這就是osg設置系統api的基本流程,如果想深入瞭解,請自行查看。

回到AcrossAllScreens::configure(osgViewer::View& view)函數

osg::DisplaySettings
我們得到了系統api的指針,然後將嘗試獲取osg::DisplaySettings的指針,它保存了 OSG 目前用到的,與圖形顯示,尤其是立體顯示有關的所有信息,

主要包括:

_displayType:顯示器類型,默認爲 MONITOR(監視器),此外還支持 POWERWALL(威力牆),REALITY_CENTER(虛擬實境中心)和 HEAD_MOUNTED_DISPLAY(頭盔顯示器)。

_stereoMode : 立 體 顯 示 模 式 , 默 認 爲 ANAGLYPHIC ( 互 補 色 ), 此 外 還 支 持QUAD_BUFFER (四方體緩衝), HORIZONTAL_SPLIT (水平分割), VERTICAL_SPLIT (垂直分割),LEFT_EYE(左眼用),RIGHT_EYE(右眼用),HORIZONTAL_INTERLACE(水平交錯),VERTICAL_INTERLACE(垂直交錯),CHECKERBOARD(棋盤式交錯,用於DLP 顯示器)。

_eyeSeparation:雙眼的物理距離,默認爲 0.05。

_screenWidth,_screenHeight:屏幕的實際寬度和高度,分別默認設置爲 0.325 和 0.26,

目前它們影響的僅僅是視圖採用透視投影時的寬高比。

_screenDistance:人眼到屏幕的距離,默認爲 0.5。

_splitStereoHorizontalEyeMapping:默認爲 LEFT_EYE_LEFT_VIEWPORT(左眼渲染左視口),也可設爲 LEFT_EYE_RIGHT_VIEWPORT(左眼渲染右視口)。

_splitStereoHorizontalSeparation:左視口和右視口之間的距離(像素數),默認爲 0。

_splitStereoVerticalEyeMapping:默認爲 LEFT_EYE_TOP_VIEWPORT(左眼渲染頂視口),也可設爲 LEFT_EYE_BOTTOM_VIEWPORT(左眼渲染底視口)。

_splitStereoVerticalSeparation:頂視口和底視口之間的距離(像素數),默認爲 0。

_splitStereoAutoAdjustAspectRatio:默認爲 true,用於屏幕分割之後對其寬高比進行補償。

_maxNumOfGraphicsContexts:用戶程序中最多可用的 GraphicsContext(圖形設備上下文)數目,默認爲 32 個。

_numMultiSamples:多重採樣的子像素樣本數,默認爲 0。如果顯示卡支持的話,打開多重採樣可以大幅改善反走樣(anti-aliasing)的效果。此外還有很多可以設置的類變量,如_minimumNumberStencilBits(模板緩存的最小位數)等,其默認設置均在 osg::DisplaySettings::setDefaults 函數中完成,其中有些變量可能還沒有作用。要注意的是,DisplaySettings 的作用僅僅是保存所有可能在系統顯示中用到的數據,這個類本身並不會據此改變任何系統設置和渲染方式。

歡迎大家來我的新家看一看 http://www.3wwang.cn

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