讓Ogre使用外部渲染窗口

    就是讓Ogre不自己創建渲染窗口,而由第三方來創建。比如C#寫界面、Qt等等。

Ogre::NameValuePairList params;
                params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)mWndHandle);

			    mRoot->initialise(false);           
				mWindow = mRoot->createRenderWindow("SampleBrowser", mWidth, mHeight, false, ¶ms);

對Ogre的例子瀏覽器SampleBrowser.h的setup函數做了如下修改。

/*-----------------------------------------------------------------------------
         | Extends setup to create dummy scene and tray interface.
         -----------------------------------------------------------------------------*/
		virtual void setup()
		{
			if(mWndHandle > 0){
				Ogre::NameValuePairList params;
                params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)mWndHandle);

			    mRoot->initialise(false);           
				mWindow = mRoot->createRenderWindow("SampleBrowser", mWidth, mHeight, false, ¶ms);
			}
			else
            if(mWindow == NULL)
                mWindow = createWindow();
            
			setupInput(mNoGrabInput);
			locateResources();
                        //...............................
               }
另外增加兩個函數以在外部設置窗口大小,傳遞外部窗口句柄。

//! 設置外部窗口句柄
		void SetWindowHandle(int handle)
		{
			mWndHandle = handle;
		}
		
		//! 設置外部窗口大小
		void SetWindowSize(int width, int height)
		{
			mWidth = width;
			mHeight = height;
		}
這樣只需要在setup()調用前,通過SetWindowHandle設置有效的外部窗口句柄,就可以了。

但是爲了混合,我使用了DLL的方式,把SampleBrowser輸出爲了DLL,然後再通過一個全局函數導出。

關鍵代碼就第一段,你想往哪輸出渲染就往哪。在Windows下DLL是一定被支持的,如果你將它弄成組件形式,那就更方便,但會增加易理解性。
C#端,用Kernel32.dll內的

LoadLibrary   GetProcAddress  來動態加載DLL內的導出函數。

注意,C#內的委託,相當於函數指針。

public delegate void BrowserMainEx(IntPtr handle, int width, int height);
handle就是窗口句柄了,width,height是寬高。
發佈了24 篇原創文章 · 獲贊 12 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章