ogre 学习笔记 - Day 12
回过神来,发现,分析的有点太深入了。看了看流程图,SceneManager::renderScene,从更新场景,到渲染场景,流程都有了。OK,不再深入了。
整理一下。
- 从Application开始,先创建了一个FileSystem,获取环境变量,设置配置路径。
- 初始化app,加载 pluginf.cfg,创建root,root里创建了一堆的manager,加载plugin;创建overlaysystem。
- 设置rendersystem,root初始化,创建窗口;定位资源;初始化RTShaderSystem;加载资源;
- 开始渲染:初始化RenderTarget;帧循环:更新场景,渲染。
从流程上看,很容易懂,一条线。只是没想到,ogre 会把场景更新放在了 RenderSystem::_updateAllRenderTargets 里。场景更新与渲染应该是独立的两个阶段,把场景更新阶段归为渲染阶段,有点不合理,因为渲染需要依赖 图形API。 也不太多顾虑是否合理。存在即合理。
既然ogre是一个流程走完核心部分,那么Listener暂时就不需要分析了。
回过头,再看 FirstScene,运行。发现,在控制台输出了很多log。由于分析过流程,知道log是哪里输出的。
看看log,发现一条 '.../oa_rpg3dm2.pk3' of type 'Zip',pk3竟然是zip格式的。
再次分析 BasicTutorial1::setup()
SceneManager* scnMgr = root->createSceneManager();
通过root创建一个场景
RTShader::ShaderGenerator* shadergen = RTShader::ShaderGenerator::getSingletonPtr();
shadergen->addSceneManager(scnMgr);
在RTSS里注册当前场景,RTSS按照名称 RTShaderSystem 是运行时Shader系统,负责渲染。暂时不关注渲染。
scnMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
设置环境光
Light* light = scnMgr->createLight("MainLight");
SceneNode* lightNode = scnMgr->getRootSceneNode()->createChildSceneNode();
lightNode->attachObject(light);
创建灯光
Camera* cam = scnMgr->createCamera("myCam");
创建相机
getRenderWindow()->addViewport(cam);
设置视口
Entity* ogreEntity = scnMgr->createEntity("ogrehead.mesh");
创建实体
在FirstScene里涉及到 SceneManager, SceneNode, Light, Camera, Viewport, Entity。
viewport 视口,相机产生的图形的显示区域
重点关注 Entity,SceneManger:::creatEntity, ogrehead.mesh是一个资源,使用一个资源创建一个实体,资源的实例化,它是用SceneManager创建的,场景可以同时存在多个,通过场景创建的,那么是不是只能在该场景内使用呢?
class _OgreExport Entity: public MovableObject, public Resource::Listener
class _OgreExport MovableObject : public ShadowCaster, public AnimableObject, public MovableAlloc
Entity的定义是 离散的,可移动的,较小的物体。需要依附在SceneNode上定义其位置。(自身没有位置还成为可移动的?)
看看 CreateEntity都做了什么,只是加载资源,新建了一个 Entity,在MoableObject里持有了 SceneManager,那么,Entity是只能在该场景使用。再从之前的,RTSS添加场景,Entity是需要被渲染出来的,也可以看出,Entity与场景绑定。
接下来就是加载资源了,从之前的学习得知,加载mesh时也会加载材质以及纹理,这里就涉及到材质了。接下来,就应该重点分析资源系统 / 材质系统。