3D图形编程

学无止尽

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  4 Posts :: 46 Stories :: 2 Comments :: 0 Trackbacks

常用链接

留言簿(2)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

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

posted on 2011-12-08 10:03 Nightsky 阅读(585) 评论(0)  编辑 收藏 引用 所属分类: OgreDEMO

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理