您的位置:首页 > 其它

关于 Demo_Ocean 例子的分析

2016-12-29 16:35 411 查看

关于 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: