OGRE通過一個抽象層,實現了API無關性。現在有RenderSystem_Direct3D9和RenderSystem_GL兩個實現。下面主要通過考察RenderSystem_Direct3D9來分析一下API抽象層及其實現。
API抽象層有兩個核心的類:RenderSystem和HardwareBufferManager,另外還有一系列的HardwareVertexBuffer、HardwareIndexBuffer等HardwareBuffer的派生類,RenderWindow、GpuProgram類等等。
RenderSystem是一個3D API的基本功能的抽象,他有兩類接口函數,以“_”開頭的函數都是屬於low level接口。RenderSystem提供的主要接口有:
1. 初始化:initialise(),reinitialise
關閉:shutdown();
2. Draw:_render
3. Transform:_setWorldMatrix, _setViewMatrix, _setProjectionMatrix
4. Light:setAmbientLight, setLightingEnabled, _useLights
5. State:_setTexture, _setTextureCoordSet, _setTextureCoordSet, _setSceneBlending, _setCullingMode, _setDepthBufferParams, _setFog
6. GPU Program:bindGpuProgram, bindGpuProgramParameters, unbindGpuProgram
7. Listener:addListener, removeListener
另外還有RenderTaret, RenderWindow, ClipPlane等等相關的接口。
RenderSystem的實例創建是在“Root::restoreConfig()”-->“Root::getRenderSystemByName()”-->“Root::getAvailableRenderers()”,通過字符串找到指定的RenderSystem實例。所有可用的RenderSystem實例存放在Root:: mRenderers數組中,由“Root::loadPlugin()”-->“dllStartPlugin”負責創建並通知Root對象。
HardwareBufferManager是3D API抽象層的另外一個重要的類。OGRE把HardwareBufferManager和RenderSystem分開是一個很好的設計。它主要負責抽象VertexBuffer,IndexBuffer的創建、銷燬等工作。
D3D9HardwareBufferManager的實例是在D3D9RenderSystem::createRenderWindow()函數中創建的(只有創建Primary Window時才創建)。
HardwareBufferManager提供了releaseDefaultPoolResources()和recreateDefaultPoolResources()接口,用來處理Device Lost,這個兩個操作都是施加於成員數據VertexBufferList mVertexBuffers和IndexBufferList mIndexBuffers之上的。在recreate之後VB,IB中的數據是如何恢復的呢?
D3D9TextureManager從TextureManager派生,用來創建D3D9Texture對象。