使用ogre引擎很久了,对于渲染过程基本了解,但是没有详细到一定程度。终于有时间整理一下了,顺便达到一个秘密的目的。
版本ogre 1.8.1.
ogre 从流程上分为初始化、场景渲染、渲染结束(关闭场景)。
初始化从root创建开始。
#ifdef _DEBUG
mRoot = new Root("plugins_d.cfg");
#else
mRoot= new Ogre::Root("plugins.cfg");
#endif
这种新建方式直接调用了dll的加载。
new Root中,ogre做了什么?
Root::Root(const String& pluginFileName, const String& configFileName,
const String& logFileName)
: mLogManager(0)
, mRenderSystemCapabilitiesManager(0)
, mNextFrame(0)
, mFrameSmoothingTime(0.0f)
, mRemoveQueueStructuresOnClear(false)
, mDefaultMinPixelSize(0)
, mNextMovableObjectTypeFlag(1)
, mIsInitialised(false)
, mIsBlendIndicesGpuRedundant(true)
, mIsBlendWeightsGpuRedundant(true)
{
// superclass will do singleton checking
String msg;
// Init
mActiveRenderer = 0;
mVersion = StringConverter::toString(OGRE_VERSION_MAJOR) + "." +
StringConverter::toString(OGRE_VERSION_MINOR) + "." +
StringConverter::toString(OGRE_VERSION_PATCH) +
OGRE_VERSION_SUFFIX + " " +
"(" + OGRE_VERSION_NAME + ")";
mConfigFileName = configFileName;
**// 创建日志**
if(LogManager::getSingletonPtr() == 0)
{
'''
***mLogManager = OGRE_NEW LogManager();
mLogManager->createLog(logFileName, true, true);***
'''
}
// 创建动态库管理器
mDynLibManager = OGRE_NEW DynLibManager();
//文件管理器
mArchiveManager = OGRE_NEW ArchiveManager();
// 资源管理器
mResourceGroupManager = OGRE_NEW ResourceGroupManager();
//工作队列的创建、设置
// WorkQueue (note: users can replace this if they want)
DefaultWorkQueue* defaultQ = OGRE_NEW DefaultWorkQueue("Root");
// never process responses in main thread for longer than 10ms by default
defaultQ->setResponseProcessingTimeLimit(10);
// match threads to hardware
#if OGRE_THREAD_SUPPORT
//多线程支持的设置,要想支持多线程先声明OGRE_THREAD_SUPPORT
unsigned threadCount = OGRE_THREAD_HARDWARE_CONCURRENCY;
if (!threadCount)
threadCount = 1;
defaultQ->setWorkerThreadCount(threadCount);
#endif
// only allow workers to access rendersystem if threadsupport is 1
#if OGRE_THREAD_SUPPORT == 1
defaultQ->setWorkersCanAccessRenderSystem(true);
#else
defaultQ->setWorkersCanAccessRenderSystem(false);
#endif
mWorkQueue = defaultQ;
//后台资源队列
// ResourceBackgroundQueue
mResourceBackgroundQueue = OGRE_NEW ResourceBackgroundQueue();
// Create SceneManager enumerator (note - will be managed by singleton)
mSceneManagerEnum = OGRE_NEW SceneManagerEnumerator();
//阴影纹理管理器
mShadowTextureManager = OGRE_NEW ShadowTextureManager();
//渲染系统能力管理器,用于获取有些功能渲染系统能否实现的信息及驱动信息等
mRenderSystemCapabilitiesManager = OGRE_NEW RenderSystemCapabilitiesManager();
//材质管理器
// ..material manager
mMaterialManager = OGRE_NEW MaterialManager();
// Mesh(模型) manager
mMeshManager = OGRE_NEW MeshManager();
// Skeleton (骨骼)manager
mSkeletonManager = OGRE_NEW SkeletonManager();
// ..particle system(粒子系统) manager
mParticleManager = OGRE_NEW ParticleSystemManager();
//时间管理
mTimer = OGRE_NEW Timer();
//ogre中2d界面管理器初始化并且注册面板、文字
// Overlay manager
mOverlayManager = OGRE_NEW OverlayManager();
mPanelFactory = OGRE_NEW PanelOverlayElementFactory();
mOverlayManager->addOverlayElementFactory(mPanelFactory);
mBorderPanelFactory = OGRE_NEW BorderPanelOverlayElementFactory();
mOverlayManager->addOverlayElementFactory(mBorderPanelFactory);
mTextAreaFactory = OGRE_NEW TextAreaOverlayElementFactory();
mOverlayManager->addOverlayElementFactory(mTextAreaFactory);
// Font manager
mFontManager = OGRE_NEW FontManager();
// Lod strategy manager(层次细节策略)
mLodStrategyManager = OGRE_NEW LodStrategyManager();
#if OGRE_PROFILING
// Profiler
mProfiler = OGRE_NEW Profiler();
Profiler::getSingleton().setTimer(mTimer);
#endif
//文件注册
mFileSystemArchiveFactory = OGRE_NEW FileSystemArchiveFactory();
ArchiveManager::getSingleton().addArchiveFactory( mFileSystemArchiveFactory );
#if OGRE_NO_ZIP_ARCHIVE == 0
//压缩包文件管理注册
mZipArchiveFactory = OGRE_NEW ZipArchiveFactory();
ArchiveManager::getSingleton().addArchiveFactory( mZipArchiveFactory );
mEmbeddedZipArchiveFactory = OGRE_NEW EmbeddedZipArchiveFactory();
ArchiveManager::getSingleton().addArchiveFactory( mEmbeddedZipArchiveFactory );
#endif
#if OGRE_NO_DDS_CODEC == 0
// Register image codecs
//dds图片解码器注册
DDSCodec::startup();
#endif
#if OGRE_NO_FREEIMAGE == 0
// Register image codecs(一般图片的)
FreeImageCodec::startup();
#endif
#if OGRE_NO_PVRTC_CODEC == 0
//这种没用过
PVRTCCodec::startup();
#endif
//高级gpu语言编译器
mHighLevelGpuProgramManager = OGRE_NEW HighLevelGpuProgramManager();
//外部纹理资源管理器
mExternalTextureSourceManager = OGRE_NEW ExternalTextureSourceManager();
//混合管理器
mCompositorManager = OGRE_NEW CompositorManager();
//脚本编译
mCompilerManager = OGRE_NEW ScriptCompilerManager();
// Auto window
mAutoWindow = 0;
//注册渲染物的“工厂”,用于以后创建这些“渲染物”
// instantiate and register base movable factories
mEntityFactory = OGRE_NEW EntityFactory();
addMovableObjectFactory(mEntityFactory);
mLightFactory = OGRE_NEW LightFactory();
addMovableObjectFactory(mLightFactory);
mBillboardSetFactory = OGRE_NEW BillboardSetFactory();
addMovableObjectFactory(mBillboardSetFactory);
mManualObjectFactory = OGRE_NEW ManualObjectFactory();
addMovableObjectFactory(mManualObjectFactory);
mBillboardChainFactory = OGRE_NEW BillboardChainFactory();
addMovableObjectFactory(mBillboardChainFactory);
mRibbonTrailFactory = OGRE_NEW RibbonTrailFactory();
addMovableObjectFactory(mRibbonTrailFactory);
//加载插件dll
// Load plugins
if (!pluginFileName.empty())
loadPlugins(pluginFileName);
LogManager::getSingleton().logMessage("*-*-* OGRE Initialising");
msg = "*-*-* Version " + mVersion;
LogManager::getSingleton().logMessage(msg);
// Can't create managers until initialised
mControllerManager = 0;
mFirstTimePostWindowInit = false;
}
总结新建root时操作就是,创建了各种管理器用于以后的日志、动态库、文件(普通文件、压缩包)、资源管理、工作队列、阴影纹理、材质、mesh、骨骼、粒子、时间、2d界面、层次细节、图片解码、高级gpu语言编程、纹理、脚本、compositor、渲染物体注册等。
东西很多,不着急,先从动态库dll加载开始解析
先看下“plugins_d.cfg”中的内容
PluginFolder=.
Plugin=RenderSystem_Direct3D9_d
# Plugin=RenderSystem_Direct3D11_d(ogre 1.8.1不支持)
Plugin=RenderSystem_GL_d
# Plugin=RenderSystem_GLES_d(手机上用)
# Plugin=RenderSystem_GLES2_d(手机上用)
Plugin=Plugin_ParticleFX_d
Plugin=Plugin_BSPSceneManager_d
Plugin=Plugin_CgProgramManager_d
Plugin=Plugin_PCZSceneManager_d
Plugin=Plugin_OctreeZone_d
Plugin=Plugin_OctreeSceneManager_d
上面的dll如果不用的可以直接用‘#’号注释掉。比如Plugin_OctreeSceneManager_d、Plugin_OctreeZone_d、Plugin_PCZSceneManager_d、Plugin_BSPSceneManager_d
不常用可以不加载。
dx9和gl、cg是必须要加载的。cg用在gpu 的shader程序,gl和dx是渲染底层。
加载 dll的核心代码:
void Root::loadPlugin(const String& pluginName)
{
#if OGRE_PLATFORM != OGRE_PLATFORM_NACL
// Load plugin library,底层用的是LoadLibraryEx的形式,一般动态加载dll都用这种形式。
DynLib* lib = DynLibManager::getSingleton().load( pluginName );
// Store for later unload
// Check for existence, because if called 2+ times DynLibManager returns existing entry
if (std::find(mPluginLibs.begin(), mPluginLibs.end(), lib) == mPluginLibs.end())
{
mPluginLibs.push_back(lib);
// Call startup function,获取入口函数
DLL_START_PLUGIN pFunc = (DLL_START_PLUGIN)lib->getSymbol("dllStartPlugin");
if (!pFunc)
OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Cannot find symbol dllStartPlugin in library " + pluginName,
"Root::loadPlugin");
// This must call installPlugin
pFunc();
}
#endif
}
这种dll的加载方式需要被加载的dll继承自ogre::Plugin,并且一定重写dllStartPlugin、dllStopPlugin、install等虚函数。
如dx 的:
D3D9Plugin* plugin;
extern "C" void _OgreD3D9Export dllStartPlugin(void) throw()
{
plugin = OGRE_NEW D3D9Plugin();
Root::getSingleton().installPlugin(plugin);
}
extern "C" void _OgreD3D9Export dllStopPlugin(void)
{
Root::getSingleton().uninstallPlugin(plugin);
OGRE_DELETE plugin;
}
dx 中install的代码
void D3D9Plugin::install()
{
#ifdef OGRE_STATIC_LIB
HINSTANCE hInst = GetModuleHandle( NULL );
#else
# if OGRE_DEBUG_MODE == 1
//看到这儿就熟悉了吧,就是普通的动态加载dll
HINSTANCE hInst = GetModuleHandle( "RenderSystem_Direct3D9_d.dll" );
# else
HINSTANCE hInst = GetModuleHandle( "RenderSystem_Direct3D9.dll" );
# endif
#endif
mRenderSystem = OGRE_NEW D3D9RenderSystem( hInst );
// Register the render system
Root::getSingleton().addRenderSystem( mRenderSystem );
}
当然加载的过程中,dx也顺便做了dx的资源管理器的初始化、dx配置的初始化。D3D9RenderSystem有时间的话再深究吧,反正是底层调用dx就对了。
到这儿才发现,我的天呐,才建一个root的操作竟然地下做了这么多东西了。
下一章到了渲染系统设置,root初始化。资源加载、相机啥的等等再说。