多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 在Unity中使用Direct2D

在Unity中使用Direct2D

來源:程序員人生   發布時間:2014-09-26 16:08:21 閱讀次數:5410次

在Unity中可能需要在紋理上面繪制文字、圖像等。比如游戲中的顯示器,手機等等等等等。太多了。

Unity的Textute2D類提供了設置像素的操作,但是這效率實在不敢恭維。


漢字數量巨大,全部貼在一張圖上既耗空間,不方便改變字體樣式。

使用FreeType2等CPU計算的文字庫一幀又畫不了多少,畢竟還要提交到顯存


于是瞄準了Direct2D,當初學習這圖像接口時就被微軟說的“能與Direct3D進行完美交互”所吸引。

好在Unity支持DX11了,我們能夠在Unity上面使用Direct2D了。所以只能在支持DX11的機器上面運行。


首先得說一下授權許可,畢竟Unity是一款商業軟件。

Unity明確指出:Unity Pro才能使用Plug-in,即插件。Unity Free版本是不可以使用的。

但是,它說的是“插件”,而不是“本地代碼”。

有童鞋肯定就會說我這是咬文嚼字了。非也非也,“插件”是指遵循當前環境并按照其對接口的相關規定寫的代碼。


那么,Unity插件有什么規定呢?

需要提供UnitySetGraphicsDevice與UnityRenderEvent

前者獲取圖形設備信息與圖像設備相關事件,后者提供渲染事件。這兩個接口是Unity自動調用的(或者也算半自動),

不能顯式調用――因為沒意義.....


你的本地代碼提供了這兩個接口就算插件,否則就是普通的本地代碼庫。

作為本地代碼庫不能放在plugin文件夾內,不能調用,因為Unity會認為是個插件,而應該直接放在工廠目錄下。


再者,假設你寫了個插件卻放在這個目錄下,那么那兩個接口不能自動被調用。



好了,就這樣可以創建Direct2D了,那個版本的?1.0?1.1?甚至1.2?隨意啦!


但是,我建議這樣做:

[cpp] view plaincopyprint?
  1. #include "windows.h" 
  2.  
  3. HMODULE WINAPI LoadLibraryWrapA(char* file_name){ 
  4.     return LoadLibraryA(file_name); 
  5.  
  6. HMODULE WINAPI LoadLibraryWrapW(wchar_t* file_name){ 
  7.     return LoadLibraryW(file_name); 
  8.  
  9. BOOL WINAPI FreeLibraryWrap(HMODULE hLibModule){ 
  10.     return FreeLibrary(hLibModule); 
  11.  
  12. FARPROC WINAPI GetProcAddressWrap(HMODULE hModule, char* lpProcName){ 
  13.     return GetProcAddress(hModule, lpProcName); 
#include "windows.h" HMODULE WINAPI LoadLibraryWrapA(char* file_name){ return LoadLibraryA(file_name); } HMODULE WINAPI LoadLibraryWrapW(wchar_t* file_name){ return LoadLibraryW(file_name); } BOOL WINAPI FreeLibraryWrap(HMODULE hLibModule){ return FreeLibrary(hLibModule); } FARPROC WINAPI GetProcAddressWrap(HMODULE hModule, char* lpProcName){ return GetProcAddress(hModule, lpProcName); }


面的代碼封裝成dll文件,這樣像C++一樣顯式調用dll文件。

好處如下:

1. 方便: 不知道是不是Unity的原因,反正假設你想一般dll一樣使用Unity C#中的DllImport,

使用后除非關閉Unity,否則不能再次修改dll文件。這簡直蛋疼,修改一行代碼就需要:

關閉Unity -> 復制dll -> 打開Unity

2. 方便調試,在VS Express 2013 for Windows Desktop中,選擇


工具――附加到進程,選擇Unity進程


就能直接調試dll文件了,很方便。


使用GetProcAddressWrap獲取函數指針之后使用C#中的

Marshal.GetDelegateForFunctionPointer

就能將函數指針換成C#中的托管方法。


比如先定義:

[csharp] view plaincopyprint?
  1. // 初始化 D2D 管理器 
  2. public delegate System.UInt32 D2DManagerInit(); 
  3. public D2DManagerInit m_D2DManagerInit; 
// 初始化 D2D 管理器 public delegate System.UInt32 D2DManagerInit(); public D2DManagerInit m_D2DManagerInit;

使用:

[csharp] view plaincopyprint?
  1. proc = GetProcAddressWrap(m_unityd2ddll, "D2DManagerInit"); 
  2. m_D2DManagerInit = (D2DManagerInit)Marshal.GetDelegateForFunctionPointer(proc, typeof(D2DManagerInit)); 
proc = GetProcAddressWrap(m_unityd2ddll, "D2DManagerInit"); m_D2DManagerInit = (D2DManagerInit)Marshal.GetDelegateForFunctionPointer(proc, typeof(D2DManagerInit));

之后使用m_D2DManagerInit()就能調用dll文件中的D2DManagerInit函數了。


最后在OnApplicationQuit里面釋放即可。




創建 D2D 1.0 的 流程:


首先創建一個公共的  D2D工廠  ,畢竟可能創建多個


Unity中 Texture2D::GetNativeTextureID在DX11環境下就能獲取一個ID3D11Texture2D的指針


這個指針能獲取     D3D11設備  ,D3D11設備 能獲取當前    D3D11設備上下文。


D3D與D2D交互要D3D設備有D3D11_CREATE_DEVICE_BGRA_SUPPORT(D3D11環境下)




D3D11設備   -------> 創建Texture2D,D3D11_TEXTURE2D_DESC參考如下:

[cpp] view plaincopyprint?
  1. sharedTextureDesc.Width = 512; 
  2. sharedTextureDesc.Height = 512; 
  3. sharedTextureDesc.MipLevels = 1; 
  4. sharedTextureDesc.ArraySize = 1; 
  5. sharedTextureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
  6. sharedTextureDesc.SampleDesc.Count = 1; 
  7. sharedTextureDesc.Usage = D3D11_USAGE_DEFAULT; 
  8. sharedTextureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; 
sharedTextureDesc.Width = 512; sharedTextureDesc.Height = 512; sharedTextureDesc.MipLevels = 1; sharedTextureDesc.ArraySize = 1; sharedTextureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sharedTextureDesc.SampleDesc.Count = 1; sharedTextureDesc.Usage = D3D11_USAGE_DEFAULT; sharedTextureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;

必須有D3D11_BIND_RENDER_TARGET,否則不能創建渲染目標呈現器。記得保留這個指針。



然后對 D3D11Textue2D 使用QueryInterface獲取 Dxgi表面

使用這個Dxgi表面利用D2D工廠CreateDxgiSurfaceRenderTarget創建RT

就好了,記得釋放這個Dxgi表面:



渲染D2D

如同一般那樣,不過由于變成了dll,可能一些習慣要改成C語言那樣。


呈現D2D

渲染完成后,使用

D3D11設備上下文的CopyResource方法就能拷貝渲染結果到目標紋理了:


DirectWrite簡直不錯:




稍微寫點代碼就能模仿某游戲那樣的效果:


嗯,看來還不夠完善,再加油吧:


話說自帶的Sprite著色器很不錯,簡直贊


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产一区二区免费福利片 | 成人影院vs一区二区 | 国产系列 视频二区 | 99re66热这里只有精品17 | 国产成人高清一区二区私人 | 国产精品第一区第27页 | 91精品国产高清久久久久 | 亚洲春色小说 | 国产成人一区二区在线不卡 | 91刘亦菲精品福利在线 | 日本欧美小视频 | 亚洲欧洲第一页 | 欧美亚洲综合另类在线观看 | 免费黄色网址网站 | 一级做a爰片性色毛片黄书 一级做a爰片性色毛片男 | 日韩大片免费观看 | 国产香蕉97碰碰久久人人 | 日韩亚洲国产欧美精品 | 亚洲另类春色小说 | 在线亚洲精品视频 | 女人18一级毛片免费观看 | 欧美久久超级碰碰碰二区三区 | 亚洲精品成人一区二区 | 免费h视频在线观看 | 最近中文字幕视频 | 欧美特黄a级高清免费看片 欧美特黄一级aa毛片 | 乱码中文在线观看 | 一级作爱视频免费观看 | 黄色的免费网站 | 日韩手机在线视频 | 午夜看片网站 | 中国漂亮护士一级毛片 | 91精品福利观看 | 校园春色亚洲激情 | 欧美freesex10一13 | 日韩福利在线 | 亚洲最大黄色网址 | 国产免费一区二区三区在线观看 | 日本一级黄色毛片 | 另类亚洲小说 | 亚洲欧美日本韩国 |