关于 Demo_Ocean 例子的分析

来源:互联网 发布:鹏业软件视频教程 编辑:程序博客网 时间:2024/06/05 19:02

关于 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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 率土之滨没地了怎么办 老公有外遇怎么办他还舍不得小三 11选5输了6万 怎么办 k宝密码忘了怎么办5次 k宝密码输错5次怎么办 上火了牙疼怎么办怎样快速止疼 身体不吸收营养胖不起来怎么办 突然牙疼怎么办教你立刻止疼 蛀牙疼怎么办教你立刻止疼 做了牙套的牙疼怎么办 牙疼怎么办教你立刻止疼 七个月宝宝便秘拉不出来怎么办 喝酒脸上起了很多小红疙瘩怎么办 我的脸又痒又红怎么办 脸又红又痒又烫怎么办 满脸痘痘怎么办全部都是红的 身上起大片扁疙瘩很痒怎么办 我急用钱借钱又借不到怎么办 小孩蛀牙牙疼怎么办教你立刻止疼 牙齿里面长了个小牙齿怎么办 2岁宝宝又吐又拉怎么办 u盘坏了怎么办没反应了 怀孕了不知道孩子是谁的怎么办 怀孕八个月耻骨疼的厉害怎么办 没感情了这段婚姻该怎么办 1岁半宝宝o型腿怎么办 4s店没按时交车怎么办 几天几夜睡不着觉没有睡意怎么办 辣的吃多了胃疼怎么办 喉咙痛怎么办有最好即简单好得快 减肥过后皮肤留下的肥胖纹怎么办 用了完美玛丽艳脸上长痘痘怎么办 腰疼怎么办8方法解决腰疼 红米3x开不了机怎么办 苹果手机忘记了锁屏密码怎么办 小米5的4g网速慢怎么办 红米4a卡机了怎么办 信而富逾期3个月怎么办 苹果6锁屏密码忘了怎么办 孕8个月咳嗽有痰怎么办 微信红包输了6万怎么办