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