Mythma
http://www.cppblog.com/mythma
Email: mythma@163.com
SceneManager负责场景的管理,而渲染则由RenderSysem统一管理。
一、RenderSystem
3D图形的渲染,一般使用Direct3D或OpenGL,OGRE提供了对两者封装,并提供了统一的接口——RenderSystem。RenderSystem本身是个虚基类,提供了与3D API无关的接口和操作。
除了负责渲染外,RenderSystem还负责窗口RenderWindow的管理:
virtual RenderWindow* initialise(bool autoCreateWindow,
const String& windowTitle = "OGRE Render Window"); virtual RenderWindow* createRenderWindow(const String &name, unsigned int width,
unsigned int height, bool fullScreen, const NameValuePairList *miscParams = 0) = 0; virtual void destroyRenderWindow(const String& name);
RenderWindow是属于RenderTarget的子类,并根据不同的平台实现不同的xRenderWindow:
从RenderSystem的数据成员可以发现,各种RenderTarget都是由RenderSystem统一管理的: typedef std::map< String, RenderTarget * > RenderTargetMap; typedef std::multimap<uchar, RenderTarget * > RenderTargetPriorityMap; RenderTargetMap mRenderTargets; RenderTargetPriorityMap mPrioritisedRenderTargets; RenderTarget * mActiveRenderTarget; TextureManager* mTextureManager;
其中,mTextureManager是由具体的RenderSystem创建的。
第 1 页 共 3 页
OGRE 分析之场景渲染------Mythma
二、RenderTarget
RenderTarget用来接收渲染操作的结果,它可以是屏幕上的窗口、离屏面(如texture)等:
FPS信息的统计也是由RenderTarget完成的。在RenderTarget每次更新完成后,将会更新统计信息(封装于FrameStats中)。
除了负责统计帧的信息外,RenderTarget还负责创建维护Viewport(视口): typedef std::map<int, Viewport*, std::less<int> > ViewportList; /// List of viewports, map on Z-order ViewportList mViewportList;
Viewport* RenderTarget::addViewport(Camera* cam, int ZOrder, float left, float top ,float width , float height) { // Check no existing viewport with this Z-order ViewportList::iterator it = mViewportList.find(ZOrder); if (it != mViewportList.end()) { //……………. } // Add viewport to list . Order based on Z-Order Viewport* vp = new Viewport(cam, this, left, top, width, height, ZOrder); mViewportList.insert(ViewportList::value_type(ZOrder, vp)); return vp; }
由上面的代码可以看出,每个Viewport都对应一个Camera和一个RenderTarget。当创建一个Viewport后,它会自动建立与Camera的联系。可以把Camera看作是图像的来源,而RenderTarget是图像渲染的目的地。
一个Viewport只能对应一个Camera和一个RenderTarget,而一个Camera也只能对应一个Viewport,但RenderTarget却可以拥有几个Viewport。
顺便看一下RenderTexture,也是不同的平台有不同的实现:
第 2 页 共 3 页
OGRE 分析之场景渲染------Mythma
三、渲染过程
从OGRE的例子中我们可以发现,在初始化完成之后,OGRE通过调用startRendering进行消息循环,然后调用renderOneFrame,通过RenderSystem的_updateAllRenderTargets方法,更新所有的RenderTarget。RenderTarget通过update方法更新与之关联的Viewport并产生FPS统计信息。而Viewport则调用与之关联的Camera的_renderScene方法进行渲染,Camera此时把“球”踢给SceneManager。进入SceneManager的renderScene成员函数中后,在经过“漫长”的计算后,把需要渲染的场景送给RenderSystem去做真正的渲染(至于怎么渲染暂且放过),此时我们可以看到熟悉的_breginFrame和_endFrame。
整个过程(顺序图更好一点,抽空再画吧):
Root
http://www.cppblog.com/mythma
Email: mythma@163.com
SceneManager负责场景的管理,而渲染则由RenderSysem统一管理。
一、RenderSystem
3D图形的渲染,一般使用Direct3D或OpenGL,OGRE提供了对两者封装,并提供了统一的接口——RenderSystem。RenderSystem本身是个虚基类,提供了与3D API无关的接口和操作。
除了负责渲染外,RenderSystem还负责窗口RenderWindow的管理:
virtual RenderWindow* initialise(bool autoCreateWindow,
const String& windowTitle = "OGRE Render Window"); virtual RenderWindow* createRenderWindow(const String &name, unsigned int width,
unsigned int height, bool fullScreen, const NameValuePairList *miscParams = 0) = 0; virtual void destroyRenderWindow(const String& name);
RenderWindow是属于RenderTarget的子类,并根据不同的平台实现不同的xRenderWindow:
从RenderSystem的数据成员可以发现,各种RenderTarget都是由RenderSystem统一管理的: typedef std::map< String, RenderTarget * > RenderTargetMap; typedef std::multimap<uchar, RenderTarget * > RenderTargetPriorityMap; RenderTargetMap mRenderTargets; RenderTargetPriorityMap mPrioritisedRenderTargets; RenderTarget * mActiveRenderTarget; TextureManager* mTextureManager;
其中,mTextureManager是由具体的RenderSystem创建的。
第 1 页 共 3 页
OGRE 分析之场景渲染------Mythma
二、RenderTarget
RenderTarget用来接收渲染操作的结果,它可以是屏幕上的窗口、离屏面(如texture)等:
FPS信息的统计也是由RenderTarget完成的。在RenderTarget每次更新完成后,将会更新统计信息(封装于FrameStats中)。
除了负责统计帧的信息外,RenderTarget还负责创建维护Viewport(视口): typedef std::map<int, Viewport*, std::less<int> > ViewportList; /// List of viewports, map on Z-order ViewportList mViewportList;
Viewport* RenderTarget::addViewport(Camera* cam, int ZOrder, float left, float top ,float width , float height) { // Check no existing viewport with this Z-order ViewportList::iterator it = mViewportList.find(ZOrder); if (it != mViewportList.end()) { //……………. } // Add viewport to list . Order based on Z-Order Viewport* vp = new Viewport(cam, this, left, top, width, height, ZOrder); mViewportList.insert(ViewportList::value_type(ZOrder, vp)); return vp; }
由上面的代码可以看出,每个Viewport都对应一个Camera和一个RenderTarget。当创建一个Viewport后,它会自动建立与Camera的联系。可以把Camera看作是图像的来源,而RenderTarget是图像渲染的目的地。
一个Viewport只能对应一个Camera和一个RenderTarget,而一个Camera也只能对应一个Viewport,但RenderTarget却可以拥有几个Viewport。
顺便看一下RenderTexture,也是不同的平台有不同的实现:
第 2 页 共 3 页
OGRE 分析之场景渲染------Mythma
三、渲染过程
从OGRE的例子中我们可以发现,在初始化完成之后,OGRE通过调用startRendering进行消息循环,然后调用renderOneFrame,通过RenderSystem的_updateAllRenderTargets方法,更新所有的RenderTarget。RenderTarget通过update方法更新与之关联的Viewport并产生FPS统计信息。而Viewport则调用与之关联的Camera的_renderScene方法进行渲染,Camera此时把“球”踢给SceneManager。进入SceneManager的renderScene成员函数中后,在经过“漫长”的计算后,把需要渲染的场景送给RenderSystem去做真正的渲染(至于怎么渲染暂且放过),此时我们可以看到熟悉的_breginFrame和_endFrame。
整个过程(顺序图更好一点,抽空再画吧):
Root