zoukankan      html  css  js  c++  java
  • OGRE

    编译 OGRE C#

    1、官网下载 OGRE 源码。

    2、打开CMake,指定好OGRE目录,以及生成目标目录。

    3、将 CMake/Modules 目录下的 FindSwig.cmake 中的 find_program(swig NAMES ) 加上本地 PATH。如:

      

      注意 swig 版本选择。在 ogre/components/csharp/CMakeList.txt 文件的第一行,指定了希望的版本,当前是 3.0.8,如果使用了更新的版本,可能导致错误。

      

    4、依次点击  configure、generate、open project 即可生成并打开工程。

      

    5、libOgre 即是 C# binding 工程,编译此项目。结果是编译错误,将 CSharp_new_Node_DebugRenderable 函数注释掉即可。

    6、成功生成 libOgre.dll。

    OGRE

    1、Ogre::Root

      在调用OGRE任何功能之前,首先要实例化一个Root类,该Root实例将直接或间接指向所有其他类的实例。一个OGRE程序有且只有一个Root对象,因此Root类使用Singleton设计模式(单例模式,继承自Singleton<Root>)。

    Root (const String &pluginFileName="plugins"OGRE_BUILD_SUFFIX".cfg",
        const String &configFileName="ogre.cfg", const String &logFileName="Ogre.log")

    mRoot = new Ogre::Root("plugins.cfg","ogre.cfg","Ogre.log");

      logFileName文件是OGRE程序的日志文件,在OGRE程序可以插入写日志的代码,日志文件方便对OGRE程序的调试。向日志文件写入信息的代码的一个例子如下:

    Ogre::LogManager::getSingleton().logMessage(">>Rendering");

    2、设定 RenderSystem,初始化

      RenderSystem类对渲染系统(底层的OpenGL或Direct3D)进行抽象,它相当于是执行渲染的设备。给 Root 添加一个RenderSystem实例的最简单方式是调用Ogre::Root:: showConfigDialog方法,运行时系统将弹出如下对话框,让用户选择要使用的图形驱动,以及相应的参数:

    if(!mRoot->showConfigDialog()) return false;

      

      我们在这个对话框所做的设置被记录在ogre.cfg文件中(见上面第2节)。也可以不用对话框,而在程序中设置,也就是说在程序中设置我们在对话框所选的项:

    Ogre::RenderSystem *rs = mRoot->getRenderSystemByName("OpenGL Rendering Subsystem");
    mRoot->setRenderSystem(rs);
    rs->setConfigOption("Full Screen", "No");
    rs->setConfigOption("Video Mode", "800x600 @ 32-bit colour");

      “启动代码”使用的是后者,代码在第24-27行。

      如果不想每次都弹出对话框选择渲染系统,可以用如下代码:

    if( !(mRoot->restoreConfig() || mRoot->showConfigDialog()) )
        return false;

      RenderSystem对象创建后需要初始化,Ogre::Root::initialise(bool, const String, const String)方法就是初始化root的RenderSystem的,如果第一个bool参数为true,将自动创建窗口

    mRoot->initialise(false);

       

    3、创建 RenderWindow

      RenderWindow是对窗口的抽象,该窗口用来显示渲染结果(对于离线渲染或渲染到纹理则不需要窗口)。创建窗口最简单的方法是在调用Ogre::Root::initialise方法时传入true作为第一个参数:

    mWindow = mRoot->initialise(true, "Win Ogre");

      也可以使用手动创建RenderWindow的方法:

    int hWnd = 0;
    Ogre::NameValuePairList misc;
    misc["externalWindowHandle"] = Ogre::StringConverter::toString((int)hWnd);
    mWindow = mRoot->createRenderWindow("Win Ogre", 800, 600, false, &misc);

    4、SceneManager类管理OGRE的场景图形(Scene Graph),《Ogre 3D 1.7 Beginner's Guide》的Chapter 6中将SceneManager的功能总结为两个方面:

    1. 管理Camera, SceneNode, Entity, Light等场景中的对象,作为Factory提供create方法如createEntity(), createLight()(也负责释放它们);
    2. 管理场景图形,包括维护场景树的可用性,计算节点的Transform信息,隐藏面剔除(Culling)。

      SceneManager不是Singleton,可以从Root创建一个(或多个)SceneManager,“启动代码”的第41行创建了一个普通类型的SceneManager:

    mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC);

    5、Camera

      Camera是场景到窗口输出的媒介,负责将3D场景映射到2D窗口,这个映射涉及到另一个类Viewport,Viewport将Camera对场景的“拍摄”结果“贴”到窗口的全部可绘制区域的一个矩形部分。一个Root可以有多个SceneManager,一个SceneManager中也可以有多个Camera,但每个Camera都需要一个Viewport对应到窗口的一个矩形区域。

    mCamera = mSceneMgr->createCamera("PlayerCam");
    mCamera->setNearClipDistance(5);
    // Create one viewport, entire window
    Ogre::Viewport* vp = mWindow->addViewport(mCamera);
    vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
    // Alter the camera aspect ratio to match the viewport
    mCamera->setAspectRatio(
        Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));

    6、加载资源

      1)用ResourceGroupManager::addResourceLocation方法添加资源文件所在目录;

      2)用ResourceGroupManager::declareResource方法声明(declare)资源,可选的;

      3)用ResourceGroupManager::initialiseResourceGroup或ResourceGroupManager::initialiseAllResourceGroups方法初始化所添加目录中的资源文件脚本;

      4)默认下,资源文件的数据直到该资源使用时才被加载,如一个纹理的图片并不是在纹理定义时加载,而是在纹理被首次使用时加载至内存,也可以手动调用ResourceGroupManager::loadResourceGroup加载。

    Ogre::ConfigFile cf; cf.load("resources.cfg");
    Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
    Ogre::String secName, typeName, archName;
    while( seci.hasMoreElements() ){
        secName = seci.peekNextKey();
        Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
        Ogre::ConfigFile::SettingsMultiMap::iterator i;
        for( i=settings->begin(); i!=settings->end(); ++i ){
            typeName = i->first;
            archName = i->second;
            Ogre::ResourceGroupManager::getSingleton().
                addResourceLocation(archName, typeName, secName);
        }
    }
    Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

    7、渲染循环

      调用Root::startRendering方法进入渲染循环,渲染结束释放Root:

    Ogre::LogManager::getSingleton().logMessage(">>Rendering");
    mRoot->startRendering();
    
    // 释放资源,目前只需释放Root
    delete mRoot;

    8、

    9、

    参考:

    1、https://www.cnblogs.com/liangliangh/p/3577239.html

  • 相关阅读:
    包装类型
    int 和 Integer 有什么区别
    final finally finalize区别
    java关键字final 有什么用?
    String和StringBuffer、StringBuilder的区别是什么?
    String 类的常用方法都有那些?
    Vue官网教程-计算属性和监听器
    Vue官网教程-模板语法
    Vue官网教程-实例
    Vue官网教程-介绍
  • 原文地址:https://www.cnblogs.com/tekkaman/p/10272031.html
Copyright © 2011-2022 走看看