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對象。