折腾了一天基本搞定, 其实也挺容易, 关键要注意几个地方
1)因为不在使用OGRE默认的配置窗口来初始化RenderSystem,现在这一步必须自己来做。首先设置配置文件路径,然后轮询可用的RenderSystem。这里默认使用Direct3D9 Render System。 // 和原来一样设置插件、资源路径,设置过后就可以轮讯可用的RenderSystem了 setupResources(); // 指定使用Direct3D9 Render System渲染子系统。 RenderSystemList *rl = Root::getSingleton().getAvailableRenderers(); RenderSystemList::iterator it = rl->begin(); D3D9RenderSystem *mRSys = NULL; while( it != rl->end() ) { if( -1 != ( *it )->getName().find( "3D9" ) ) { mRSys = ( D3D9RenderSystem* )( *it ); break; } it++; }
// 配置框中的选项需要手动设置。 mRSys->initConfigOptions(); mRSys->setConfigOption( "Anti aliasing", "None" ); mRSys->setConfigOption( "Floating-point mode", "Fastest" ); mRSys->setConfigOption( "Full Screen", "No" ); mRSys->setConfigOption( "Rendering Device", "NVIDIA GeForce2 MX/MX 400" ); mRSys->setConfigOption( "VSync", "No" ); mRSys->setConfigOption( "Video Mode", "640 x 480 @ 32-bit colour" );
// 起用 mRoot->setRenderSystem( mRSys );
2)剩下的初始化过程和ExampleApplication基本一致,只不过现在不需要由OGRE自动创建窗体,应该将MFC视图的句柄传过去初始化。 // 初始化,传入false表示不需要OGRE自动创建窗口 mRoot->initialise( false ); // 手动创建渲染窗口,在这里我们将MFC视图的句柄传入 NamevaluePairList miscParams; miscParams["externalWindowHandle"] = StringConverter::toString( ( size_t )mWnd ); mWindow = mRoot->createRenderWindow( "View", 640, 480, false, &miscParams );
到次初始化过程已经完毕,这时候运行程序就得到一个漆黑的MFC窗口。
3)因为现在使用是视图的WndProc,我们必须自己处理更新和触发FrameStart事件. // 触发FrameStart, FrameEnd事件 void update( void ) { mRoot->_fireFrameStarted(); mWindow->update(); mRoot->_fireFrameEnded(); }
//在视图的OnDraw时间里,调用update void CMFCRenderView::OnDraw(CDC* /*pDC*/) { CMFCRenderDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return;
// TODO: 在此处为本机数据添加绘制代码 update(); } 这样还不够,WM_PAINT事件并不由我们控制,当窗体静静的趟在那的时候是不会触发的,因此我们通过设置一个timer来模拟没帧的更新, // 20ms触发一次 SetTimer( 100, 20, 0 ); void CMFCRenderView::OnTimer(UINT nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 update();
__super::OnTimer(nIDEvent); }
|