转自:http://blog.csdn.net/pizi0475/article/details/5373378
1. 用顶点数组在创建Bezier Patch的步骤
1) 调用硬件缓存管理器创建顶点声明, 查看需要哪些元素
HardwareBufferManager::getSingleton().createVertexDeclaration();
而后用addElement方法添加元素
2) 填充一段内存的数据用于硬件缓存, 注意数据紧密贴近, VC编译器用#pragma pack实现
3) MeshManager类的createBezierPatch方法使用了硬件缓存中的内容。
2. 用于设置Bezier图片的很重要的类 PatchMeshPtr
PatchMesh为Mesh的派生类, 手工创建后可被Entity使用, 由MeshManager::createBezierPatch创建
所使用的重要方法为 setSubdivision, 参数为因子, 为Bezier Mesh的细分度, 范围为 0.0 - 1.0 。
3. 类 VertexDeclaration 公有继承自VertexDataAlloc, 可用于产生Bezier Mesh, 用硬件缓存来创建
该类声明了一系列顶点输入的格式, 渲染API通过RenderOperation处理这些输入数据
VertexDeclaration的次序与结构对于旧显卡的DirectX非常重要, 如果你想要保证所有渲染系统和所有显卡的最大性能, 你需要注意以下规则:
1) VertexElements 应当按如下顺序添加, 共享缓存内的元素次序也应当如下:
位置, 混合权重, 发现, 散射颜色, 镜面颜色, 纹理坐标(按次序,中间无空白处-对齐产生的缺漏)
2) 不要缺少任何元素
3) 元素之间不要重叠
4. frameRenderingQueued方法用于替代frameStarted和frameEnded, 这个方法可以和GPU同步运行, 计算的结果下一帧才渲染, 可以提高效率
5. 手工创建材质, MaterialManager的create方法可以创建材质, 然后调用getTechnique(0)->getPass(0)来设置第一个通道的材质内容
用全局pass指针在监听器中动态修改材质, 另Pass可调用setPolygonMode方法设置多边形模式
6. 在destroyScene方法里, 注意SharedPtr指针要调用方法setNull来清除对象, 否则退出程序会产生中断错误。
7. 以下格式创建的结构体是所有成员大小之和, 不会产生对齐方式生成的多余大小
#if OGRE_COMPILER == OGRE_COMPILER_MSVC
#pragma pack(push)
#pragma pack(1)
#endif
......
#if OGRE_COMPILER == OGRE_COMPILER_MSVC
#pragma pack(pop)
#endif
8. 本程序设置的项目配置选项
输出目录: ../bin/$(ConfigurationName)
中间目录: ../obj/$(ConfigurationName)
字符集: 多字节
附加包含目录: $(OGRE_HOME)/include;$(OGRE_HOME)/Dependencies/include
输出文件: $(OutDir)/Example_BezierPatch.exe
附加库目录: $(OGRE_HOME)/lib;$(OGRE_HOME)/Dependencies/lib/$(ConfigurationName)
依赖项: OgreMain_d.lib OIS_d.lib
9. 源代码初始框架:
2 extern " C " {
3 #endif
4
5 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
6 #define WIN32_LEAN_AND_MEAN
7 #include " windows.h "
8
9 INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
10 #else
11 int main( int argc, char ** argv)
12 #endif
13 {
14 try {
15
16 } catch ( Ogre::Exception & e ) {
17 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
18 MessageBox( NULL, e.getFullDescription().c_str(), " An exception has occured! " , MB_OK | MB_ICONERROR | MB_TASKMODAL );
19 #else
20 std::cerr << " An exception has occured: " << e.getFullDescription();
21 #endif
22 }
23 return 0 ;
24 }
25
26 #ifdef __cplusplus
27 }
28 #endif