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. 源代码初始框架:
#include "Bezier.h"
#ifdef __cplusplus
extern "C" {
#endif
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
BezierApplication app;
try {
app.go();
} catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL );
#else
std::cerr << "An exception has occured: " << e.getFullDescription();
#endif
}
return 0;
}
#ifdef __cplusplus
}
#endif