OGRE关于 Demo_Ocean 例子的分析
關于 Demo_Ocean 例子的分析
重要總結:
1. 該例主要類不再繼承自ExampleApplication和ExampleFrameListener, 重寫驅動類和監聽類
2. 如何創建OIS的輸入系統
?? ?1) 創建OIS::ParamList pl;
?? ?2) 調用程序渲染窗口的 getCustomAttribute方法得到窗口WINDOW屬性所代表的窗口句柄
?? ?3) 將該窗口句柄插入pl中
?? ?4) 以pl為參數, 調用OIS::InputManager的createInputSystem方法, 即可創建一個OIS輸入管理器
?? ?5) 該OIS輸入管理器調用createInputObject方法, 可以創建鍵盤和鼠標對象
?? ?6) 通過渲染窗口的getMetrics函數得到窗口高寬, 從而設定鼠標狀態的高寬, 限制鼠標活動范圍.
?? ?7) 如果為緩沖輸入, 調用各個對象的setEventCallback方法, 設置回調
3. CEGUI::System::getSingleton().getRenderer(); 可以得到當前的CEGUI渲染器
4. RenderTarget類的writeContentsToFile方法可以將渲染目標當前內容寫入文件中
5. 在關閉Ogre或者異常發生的時候, 記住要清除共享指針, 否則會出現問題
?? ??? ?mActiveFragmentProgram.setNull();
?? ??? ?mActiveFragmentParameters.setNull();
?? ??? ?mActiveVertexProgram.setNull();
?? ??? ?mActiveVertexParameters.setNull();
?? ??? ?mActiveMaterial.setNull();
6. captureInput函數和releaseInput函數
?? ?表明當捕捉CEGUI窗口的輸入時, 會直接調用該窗口的事件處理函數
?? ?而幀監聽器的事件處理函數是通過注入CEGUI窗口實現的, 并沒有調用CEGUI自身的事件處理函數
7. 本例主要是介紹如何通過CEGUI滾動條或者其他控件迅速改變材質著色程序變量的方法.
??? 函數 handleShaderControl 可以學習如何更改材質中著色程序的某一個變量
??? 函數 configureShaderControls 可以學習如何得到GPU程序參數, 以及物理索引等內容
8. 學會如何用control的腳本實現控制著色程序參數的變化
9. MaterialControls.h, MaterialControls.cpp文件用于控制材質的著色程序變量變化的相關類
10. 具體如何讀取以及修改GPU的參數
?? ?1) Ogre::GpuProgramParametersSharedPtr activeParameters; 為GPU程序參數
?? ?2) activeParameters->getConstantDefinition(ActiveShaderDef.ParamName); 得到常量聲明, ActiveShaderDef.ParamName為需要更改的參數名稱
?? ??? ?其返回值賦值給 const Ogre::GpuConstantDefinition& def
?? ?3) def.physicalIndex 得到該參數的物理索引
?? ?4) activeParameters->getFloatPointer(ActiveShaderDef.PhysicalIndex); 根據該物理索引得到其在內存的指針const float* pFloat
?? ?5) 對于本例中的ElementIndex表示該參數可能為一個數組, 則在該數組中根據ElementIndex取得其元素值
?? ?6) 如果要修改該參數, 可用參數的_writeRawConstant函數
?? ??? ?activeParameters->_writeRawConstant(ActiveShaderDef.PhysicalIndex + ActiveShaderDef.ElementIndex, val);
?? ?簡略的說
?? ?1. 根據參數名在GPU參數中得到常量聲明
?? ?2. 根據聲明得到物理索引
?? ?3. 根據索引得到該參數所在指針
?? ?4. GPU參數的_writeRawConstant方法可用于修改常量
1. OceanDemo 類
?? ?// 重寫的主驅動類
?? ??? ?函數 configure
?? ??? ??? ?配置對話框
?? ??? ?函數 chooseSceneManager
?? ??? ??? ?創建一個ST_GENERI場景管理器
?? ??? ?函數 createCamera
?? ??? ??? ?創建相機
?? ??? ?函數 createViewports
?? ??? ??? ?當前窗口創建視口
?? ??? ?函數 setupResources
?? ??? ??? ?加載資源位置
?? ??? ?函數 loadResources
?? ??? ??? ?初始化所有的資源組
?? ??? ?函數 setupGUI
?? ??? ??? ?創建CEGUI窗口
?? ??? ?函數 createScene
?? ??? ??? ?設置環境光, 天空盒
?? ??? ??? ?創建節點
?? ??? ??? ?創建所有的光, 光節點, 公告板來設置表示光的對象
?? ??? ??? ?設置相機位置
?? ??? ??? ?創建平面表示海洋
?? ??? ??? ??? ?法線 UNIT_Y
?? ??? ??? ??? ?d 為 20
?? ??? ??? ??? ?場景管理器創建平面對象
?? ??? ??? ??? ?創建實體為該平面
?? ??? ??? ??? ?創建節點掛接該實體
?? ??? ?函數 setup
?? ??? ??? ?其他如同以前一樣
?? ??? ??? ?增加兩個函數
?? ??? ??? ?initDemoEventWiring();
?? ??? ??? ?initComboBoxes();
?? ??? ?
?? ??? ?函數 initComboBoxes
?? ??? ??? ?初始化組合框, 給該組合框添加控制腳本所擁有的材質, 并在屏幕上顯示材質名稱
?? ??? ??? ?
?? ??? ?函數 initDemoEventWiring
?? ??? ??? ?給所有的CEGUI窗口增加事件處理函數
?? ??? ??? ??? ?ExitDemoBtn - PushButton::EventClicked - handleQuit
?? ??? ??? ??? ?ModelCombos - Combobox::EventListSelectionAccepted - handleModelComboChanged
?? ??? ??? ??? ?ShaderCombos - Combobox::EventListSelectionAccepted - handleShaderComboChanged
?? ??? ??? ??? ?root
?? ??? ??? ??? ??? ?- EventMouseMove - OceanDemo_FrameListener::handleMouseMove
?? ??? ??? ??? ??? ?- EventMouseButtonUp - OceanDemo_FrameListener::handleMouseButtonUp
?? ??? ??? ??? ??? ?- EventMouseButtonDown - OceanDemo_FrameListener::handleMouseButtonDown
?? ??? ??? ??? ??? ?- EventMouseWheel - OceanDemo_FrameListener::handleMouseWheelEvent
?? ??? ??? ??? ??? ?- EventKeyDown - OceanDemo_FrameListener::handleKeyDownEvent
?? ??? ??? ??? ??? ?- EventKeyUp - OceanDemo_FrameListener::handleKeyUpEvent
?? ??? ??? ??? ?ModelSpinCB - Checkbox::EventCheckStateChanged - OceanDemo_FrameListener::handelModelSpinChange
?? ??? ??? ??? ?LightSpinCB - Checkbox::EventCheckStateChanged - OceanDemo_FrameListener::handelLightSpinChange
?? ??? ??? ??? ?CameraRBtn - RadioButton::EventSelectStateChanged - OceanDemo::handleMovementTypeChange
?? ??? ??? ??? ?ModelRBtn - RadioButton::EventSelectStateChanged - OceanDemo::handleMovementTypeChange
?? ??? ??? ??? ?VerticalScroll - Scrollbar::EventScrollPositionChanged - OceanDemo::handleScrollControlsWindow
?? ??? ?
?? ??? ?函數 handleQuit
?? ??? ??? ?跳用根的queueEndRendering函數直接退出
?? ??? ??? ?
?? ??? ?函數 setShaderControlVal
?? ??? ??? ?設置其中一個著色器控制的值
?? ??? ??? ?
?? ??? ?函數 handleShaderControl
?? ??? ??? ?重要函數, 處理材質的變化, 如散射, 鏡面等等, 最重要的是可以設置材質中著色程序特定變量的值
?? ??? ??? ?
?? ??? ?函數 handleModelComboChanged
?? ??? ??? ?根據選擇的Model選擇正確的實體掛接
?? ??? ?
?? ??? ?函數 handleShaderComboChanged
?? ??? ??? ?根據選擇更改海洋的材質.
?? ??? ??? ?
?? ??? ?函數 handleScrollControlsWindow
?? ??? ??? ?每當 滾動含有著色器選項的垂直滾動條, 其內容的變化
?? ??? ?
?? ??? ?函數 handleMovementTypeChanged
?? ??? ??? ?更改當前移動的物體對象
?? ??? ?
?? ??? ?函數 configureShaderControls
?? ??? ??? ?得到當前活躍材質的GPU程序指針和GPU程序參數指針
?? ??? ??? ?列出當前材質在控制腳本中列出的可以修改的程序參數
?? ??? ??? ?根據參數列表設置著色器控制容器
?? ??? ??? ?以及設置所有參數在CEGUI窗口上實現的子窗口
?? ??? ??? ?另外要得到該參數在GPU程序中的物理索引
?? ??? ??? ?
?? ??? ??? ?
2. OceanDemo_FrameListener 類
?? ?// 重寫的幀監聽器類
?? ?基類: Ogre::FrameListener, OIS::KeyListener, OIS::MouseListener
?? ?
?? ?函數 convertOISButtonToCegui
?? ??? ?// Ogre的按鈕轉換成CEGUI可認的按鈕
?? ?函數 CheckMovementKeys
?? ??? ?// 檢測按鍵, 改變一些變量狀態
?? ?函數 updateStats
?? ??? ?// 更新CEGUI窗口的一些子窗口文本
?? ??? ?
?? ?構造函數
?? ??? ?創建OIS的輸入系統 - OIS::InputManager* mInputManager
?? ??? ??? ?1) 創建OIS::ParamList pl;
?? ??? ??? ?2) 調用程序渲染窗口的 getCustomAttribute方法得到窗口WINDOW屬性所代表的窗口句柄
?? ??? ??? ?3) 將該窗口句柄插入pl中
?? ??? ??? ?4) 以pl為參數, 調用OIS::InputManager的createInputSystem方法, 即可創建一個OIS輸入管理器
?? ??? ??? ?5) 該OIS輸入管理器調用createInputObject方法, 可以創建鍵盤和鼠標對象
?? ??? ??? ?6) 通過渲染窗口的getMetrics函數得到窗口高寬, 從而設定鼠標狀態的高寬, 限制鼠標活動范圍.
?? ??? ??? ?7) 如果為緩沖輸入, 調用各個對象的setEventCallback方法, 設置回調?? ?
?? ??? ?得到CEGUI的渲染器
?? ??? ??? ?mGuiRenderer = CEGUI::System::getSingleton().getRenderer();
?? ??? ??? ?根據窗口名稱, 得到各個子窗口
?? ??? ??? ??? ?CEGUI::WindowManager::getSingleton().getWindow("name");
?? ??? ??? ??? ?
?? ?析構函數
?? ??? ?// 銷毀OIS的輸入對象和管理器
?? ??? ?
?? ?函數 frameRenderingQueued
?? ??? ?抓取鼠標和鍵盤狀態
?? ??? ?根據頻率更新CEGUI的狀態指示
?? ??? ?根據用戶的選擇選中要變換的對象,然后移動和旋轉該對象
?? ??? ?根據用戶選擇旋轉對象和光
?? ??? ?根據用戶選擇進行截屏
?? ??? ?
?? ?函數 handleMouseMove
?? ??? ?處理CEGUI根窗口的鼠標移動
?? ??? ?如按下了左鍵, 右鍵沒有按下, 設置旋轉量
?? ??? ?如按下了右鍵, 左鍵沒有按下, 設置左右的移動量
?? ??? ?兩者同時按下, 則設置前后運動的移動量
?? ??? ?設置mUpdateMovement為真, 則提示下一幀需要處理對象的變化
?? ??? ?
?? ?函數 handleMouseButtonUp
?? ??? ?處理鼠標按鍵彈起事件
?? ??? ??? ?顯示鼠標, 位置設置為上次鼠標隱藏時所處的位置
?? ??? ??? ?其根窗口調用 releaseInput函數, 表示不再從窗口捕捉輸入.
?? ??? ??? ?
?? ?函數 handleMouseButtonDown
?? ??? ?處理鼠標按鍵按下事件
?? ??? ??? ?隱藏鼠標, 保存鼠標位置
?? ??? ??? ?根窗口調用captureInput()函數, 捕捉窗口的輸入
?? ?函數 handleMouseWheelEvent
?? ??? ?處理鼠標滾輪, 設置對象的前后移動
?? ?函數 handleKeyDownEvent, handleKeyUpEvent
?? ??? ?處理按鍵, 判斷是否移動對象
?? ?函數 handelModelSpinChange
?? ??? ?根據選擇設置 mSpinModel變量
?? ?函數 handelLightSpinChange
?? ??? ?設置 mSpinLight
?? ?
?? ?函數 mouseMoved, mousePressed, mouseReleased
?? ??? ?注入CEGUI窗口中
?? ?函數 keyPressed
?? ??? ?設置按鍵消息, 如退出, 截屏, 并注入CEGUI窗口
?? ?函數 keyReleased
?? ??? ?注入CEGUI窗口
???
MaterialControls.h, MaterialControls.cpp文件分析
1. ShaderControl 結構體
?? ?用來保存著色器的控制信息
?? ?三個接口:
?? ??? ?getRange - 得到范圍
?? ??? ?convertParamToScrollPosition - 程序參數轉化為滑動條位置(函數參數減去最小值)
?? ??? ?convertScrollPositionToParam - 滑動條位置轉化為程序參數(函數參數加上最小值)
?? ??? ?
2. ShaderControlsContainer 為 ShaderControl結構體變量的vector容器類型, ShaderControlIterator 為該容器類型的迭代器類型
3. MaterialControls 類
?? ?該類主要用于控制該材質的所有著色器控制對象, 即所有的ShaderControl對象.
?? ?接口:
?? ??? ?getDisplayName - 返回用于顯示的名稱
?? ??? ?getMaterialName - 使用的材質名稱
?? ??? ?getShaderControlCount - 該材質的ShaderControl對象 數
?? ??? ?getShaderControl - 根據索引范圍特定的 ShaderControl對象
?? ??? ?addControl - 添加 ShaderControl對象
?? ??? ?
4. MaterialControlsContainer 為 MaterialControls對象的vector容器, MaterialControlsIterator 為該容器的迭代器類型
5. ShaderControlGUIWidget 結構體
?? ?該結構體用于包含三個成員, 都為CEGUI的窗口, 其中一個為 Scrollbar
?? ?
6. loadMaterialControlsFile, loadAllMaterialControlFiles 函數
?? ?加載.control文件
?? ?每一節如果含有material的設置, 就創建一個新的MaterialControls對象, 然后壓入MaterialControlsContainer容器中
?? ??? ?而后遍歷該節, 如果有control的設置, 該MaterialControls對象就添加新的ShaderControl對象
重要類與函數
Ogre
?? ?RenderTarget 類
?? ??? ?RenderTarget::FrameStats 結構體
?? ??? ?其成員存儲關于FPS的信息
?? ??? ?
?? ??? ?函數 getStatistics
?? ??? ??? ?// 返回 當前渲染性能的細節, 保存于 RenderTarget::FrameStats 結構體中
?? ??? ??? ?備注: 如果使用者的應用程序希望顯示自己的性能信息, 或者用于其他的方面, 這個方法可以返回一些有用的數據
?? ??? ?函數 getCustomAttribute
?? ??? ??? ?// 得到一自定義屬性(該屬性可能是平臺設定的)
?? ??? ??? ?備注: 這個函數可以滿足任意API的需要, 可以查看平臺特定的細節. 渲染窗口的"WINDOW"屬性, 可以得到窗口句柄
?? ??? ?函數 writeContentsToFile
?? ??? ??? ?將渲染目標的當前內容寫入文件中
?? ??? ??? ?
?? ?GpuProgramParametersSharedPtr 類型
?? ??? ?同 SharedPtr<GpuProgramParameters>
?? ??? ?
?? ?SharedPtr<T> 類模板
?? ??? ?關聯計數的共享指針, 用于當需要的時候銷毀指針
?? ??? ?備注: 這是一個標準的共享指針實現, 用于當刪除對象時, 計算出其關聯數.
?? ??? ??? ?如果 OGRE_THREAD_SUPPORT 定義為1, 使用該類是線程安全的.
?? ??? ??? ?
?? ?GpuProgramParameters 類
?? ??? ?將用于GpuProgram的程序參數收集在一起.
?? ??? ?備注: GPU程序狀態包含用于程序的常量參數, 或者引擎根據需要自動將生成的渲染系統狀態綁定到常量上去.
?? ??? ?GpuProgramParameters 對象通過GpuProgram創建, 可能有多個Pass實例共享, 正因為此, 一般使用共享指針來管理這些對象, 以便當沒有任何Pass使用它們的時候自動刪除
?? ??? ?高級程序使用參數(一致變量), 低級程序使用索引常量(indexed constants), 該類支持兩者, 但你可以通過調用hasNamedParameters()得知是否支持命名常量.
?? ??? ?在文檔中, 有位于'logical'和'phsical'索引之下的關聯, 邏輯索引為使用低級程序的索引, 表現為一float4數組. 其中的一部分可能為可設置的, 一部分可能為程序中預定義的常量.
?? ??? ?我們只存儲那些被設置的常量, 在我們的緩存中, 如果使用邏輯索引, 則緩存中可以有間隙,? 而后我們映射這些緩存的邏輯索引至物理索引.
?? ??? ?當使用高級程序時, 邏輯索引不需要存在, 當然, 如果高級程序擁有直接的從參數名稱到邏輯索引的映射, 則也許存在邏輯索引.
?? ??? ?另外, 高級語言也許或也許不將元素的數組打包, 打包的話則將比連續的float4所占空間更小.
?? ??? ?ConstantDefinition 結構體可以保存這些信息, 以便于高級程序語言的需要. 你不必擔心這些, 除非你想要從該結構讀出參數, 而不是設置它們.
?? ??? ?
?? ?TextureFilterOptions 類型
?? ??? ?這是一個枚舉類型, 可以快速設置縮小倍率, 放大倍率和mip過濾器的高級過濾選項.
?? ??? ?枚舉值:
?? ??? ??? ?TFO_NONE?? ??? ??? ?等同于 min = FO_POINT, mag = FO_POINT, mip = FO_NONE
?? ??? ??? ?TFO_BILINEAR?? ??? ?等同于 min = FO_LINEAR, mag = FO_LINEAR, mip = FO_POINT
?? ??? ??? ?TFO_TRILINEAR?? ??? ?等同于 min = FO_LINEAR, mag = FO_LINEAR, mip = FO_LINEAR
?? ??? ??? ?TFO_ANISOTROPIC?? ??? ?等同于 min = FO_ANISOTROPIC, mag = FO_ANISOTROPIC, mip = FO_LINEAR
?? ??? ??? ?
?? ?StringUtil 類
?? ??? ?函數 split
?? ??? ??? ?// 將該字符串根據分隔符分割成數組
?? ??? ?函數 parseInt
?? ??? ??? ?// 將該字符轉換成整數
?? ??? ??? ?
?? ?ResourceGroupManager 類
?? ??? ?函數 findResourceNames
?? ??? ??? ?// 在資源組中查找匹配的所有文件和文件夾
?? ??? ??? ?
CEGUI
?? ?UVector2 類
?? ??? ?一個二維向量類建立統一尺寸. 該類對象常用于表示位置和大小.
?? ?Window 類
?? ??? ?函數 captureInput
?? ??? ??? ?// 捕捉窗口的輸入
?? ?Scrollbar 類
?? ??? ?函數 setDocumentSize
?? ??? ??? ?// 設置文檔或者數據的大小
?? ??? ??? ?這個文檔大小必須看成當滾動時數據的總大小(即一文本文件的行數)
http://www.cppblog.com/summericeyl/archive/2009/11/08/100411.html
總結
以上是生活随笔為你收集整理的OGRE关于 Demo_Ocean 例子的分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太网交换机的工作原理
- 下一篇: hystrix实战--资源隔离技术简介