2017-08-14 37 views
0

基本上我想要做的就是迫使其採用了Direct3D9Ex背景(CreateD3D9Ex)但一個簡單的「非恩」設備(IDirect3DDevice9)使用Direct3DDevice9Ex,而不是一個封閉源代碼的應用程序是什麼。 我在應用程序目錄中放置了一個代理dll,它通常工作正常。現在我試圖將CreateDevice的調用重定向到原始dll的CreateDeviceEx,然後返回一個「非ex」指針(以便應用程序在不知道它的情況下使用「Ex」設備)。隊封閉源代碼的應用程序使用Direct3DDevice9Ex代替非防爆設備的

根據我的理解,這應該工作,因爲「Ex」設備實現了「非ex」設備也包含的所有方法 - 但顯然必須有一些差異,因爲只有隱藏的「Ex」設備正在使用的是光標。

問:有人能告訴我我做錯了什麼或給出一些建議嗎?

背景

我使用的是D3D9應用程序,我要複製的深度緩衝。不幸的是,它的格式是D24S8,這意味着直接複製是不可能的。

因此,我決定嘗試創建共享深度/模板1級紋理,然後使用D3D10/D3D11方法訪問此紋理,該方法實際上能夠複製深度/模板表面。然而,只有D3D9Ex設備能夠創建紋理與共享手柄...

附錄

由於這樣的事實Direct3D9Ex不支持管理池是不可能的。謝謝@VuVirt

回答

2

我認爲這個問題主要是由於D3D9Ex設備不支持D3DPOOL_MANAGED資源引起的。這就是爲什麼你在屏幕上看不到任何東西的原因。使用D3DPOOL_MANAGED創建資源實際上會失敗。您也可能想要掛鉤所有資源創建例程,並從呼叫中移除D3DPOOL_MANAGED標誌,如果有人想鎖定它們,可以選擇添加D3DUSAGE_DYNAMIC。然而,這可能會導致另一組問題。在提供的MSDN鏈接中搜索「Direct3D 9和Direct3D 9Ex之間的差異」。

+0

好吧,我沒有想到那一部分。那麼,下一個方法的時間;)無論如何,謝謝。 – Apollo13