当前位置: 首页 > 工具软件 > Ogre-Next > 使用案例 >

ogre-next 学习笔记 - Day 2

司寇羽
2023-12-01

工程编译成功后,就可以开始学习了。

1. 分析文件结构

  • CMake
  • Components 组件
    • Hlms
    • MeshLodGenerator
    • Overlay
    • Paging
    • PlanarReflections
    • Property
    • RTShaderSystem
    • SceneFormat
    • Terrain
    • Volume
  • Docs
  • OgreMain
  • Other
  • PluIns
    • BSPSceenmanager
    • CgProgramMaanger
    • EXRCodec
    • OctreeSceneManager
    • OctreeZone
    • ParticleFX
    • PCZSceneManager
  • RenderSystems
    • Direct3D9
    • Direct3D11
    • GL3Plus
    • GLES2
    • Metal
    • NULL
  • Samples
    • 2.0
      • ApiUsage
      • Common
      • Showcase
      • Tests
      • Tutorails
    • Media
      • 2.0
      • DeferredShadingMedia
      • Hlms
      • ...
  • Scripts
    • BuildScripts
  • SDK
    • Android
    • iOS
    • OSX
    • Win32
  • Tests
    • CapsReport
    • Components
    • Media
    • OgreMain
    • PlayPen
    • src
    • VisualTests
  • Tools
    • 3dsmaxExport
    • BitmapFontBuilderTool
    • ...
  • BuildingOgre.txt
  • NewTips.txt

之前熟悉过ogre1.x 的,对这些文件结构都挺熟悉的。

看看 Docs

        没有太多的有用信息,可以花时间看一看。

BuildingOgre.txt 

        如何在各平台编译Ogre-next

NewTips.txt

        描述了一些与ogre1.x不同的地方。这对之前使用ogre1.x的同学很有用处。

  • 名称不再唯一 ,不再通过name区分对象。改为使用id。
  • 不能将未attach到scenenode的实体可见性设置为true,会引起崩溃。(不起作用就好了,为什么要弄个崩溃呢?)
  • 阴影的改变
  • Camera relative rendering 被移除了。更改为支持修改根场景节点的SceneManager::setRelativeOrigin,...

只是入门ogre,咱也看不懂,咱也不敢说。

由于没有足够的文档,从这里能获取的信息有限。

看看项目解决方案。

大致分为:

  • OgreHlmsxxx
  • OgreMain
  • OgreMeshxxx
  • OgreOverlay
  • Samplesxxx
  • Plugin_xxx
  • RenderSystem_xxx

也没什么有用信息。缺少了分组,不能像ogre1.x一样,区分功能

直接进入Tutorial

运行 Sampel_Tutorial01_Initialization,只有一个带颜色的全屏窗口。因为使用了两个屏幕,运行时它影响到了另一个屏幕。bug!

看看代码,出现了几个类

GameState

MyGraphicsSystem : GraphicsSystem : BaseSystem : MessageQueueSystem

Ogre 1.x 把创建窗口,初始化的功能称为bites,属于compoents。这里改成了GraphicsSystem,传入参数叫做 GameState,图形系统 / 游戏状态?感觉不太匹配啊。还是1.x的Application更合适一点。GraphicsSystem改为 Game 更匹配一点。GraphicsSystem 属于 Sample,从结构上就没有把它区分开。还是1.x 的bites更优秀一点。namespace 是Demo,GraphicsSystem还没有被收编呀。

1. 创建一个MyGameState myGameState;

class MyGameState : public TutorialGameState
 class TutorialGameState : public GameState
    class GameState : public MouseListener, public KeyboardListener, public JoystickListener
    {
    public:
        virtual ~GameState() {}

        virtual void initialize(void) {}
        virtual void deinitialize(void) {}

        virtual void createScene01(void) {}
        virtual void createScene02(void) {}

        virtual void destroyScene(void) {}

        virtual void update( float timeSinceLast ) {}
        virtual void finishFrameParallel(void) {}
        virtual void finishFrame(void) {}
    };

        看看GameState,发现一个奇怪的东西

        createScene01, createScene02

        这种创建场景,还特定标明scene01, scene02,是不可能作为通用基类定义的。

2. 创建graphicsSystem

    GraphicsSystem graphicsSystem( &myGameState );

    myGameState._notifyGraphicsSystem( &graphicsSystem );

    graphicsSystem.initialize( "Tutorial 02: Variable Framerate" );

    if( graphicsSystem.getQuit() )
    {
        graphicsSystem.deinitialize();
        return 0; //User cancelled config
    }

    Ogre::RenderWindow *renderWindow = graphicsSystem.getRenderWindow();

    graphicsSystem.createScene01();
    graphicsSystem.createScene02();

        然后,又发现了在 GraphicSystem里也有 createScene01, createScene02。

        所以可以猜测,GraphicsSystem,GameState只能属于Demo级别了。

        未来可能也会有类似1.x的bites的东西出现。

3. 游戏循环

    while( !graphicsSystem.getQuit() )
    {
        graphicsSystem.beginFrameParallel();
        graphicsSystem.update( static_cast<float>( timeSinceLast ) );
        graphicsSystem.finishFrameParallel();
        graphicsSystem.finishFrame();

        if( !renderWindow->isVisible() )
        {
            //Don't burn CPU cycles unnecessary when we're minimized.
            Ogre::Threads::Sleep( 500 );
        }

        Ogre::uint64 endTime = timer.getMicroseconds();
        timeSinceLast = (endTime - startTime) / 1000000.0;
        timeSinceLast = std::min( 1.0, timeSinceLast ); //Prevent from going haywire.
        startTime = endTime;
    }

beginFrameParallel, update, finishFrameParallel, finishFrame。至少不是像1.x那样,一个startRending包含一切了。

有过1.x的学习经历,2.x轻车熟路,就不再运行分析每一个sample了。

接下来,直接进入无聊又漫长的画流程图的时刻了。

 类似资料: