2013-07-01 48 views
5

我想直接對紋理進行渲染。這可能嗎?DirectComposition呈現紋理?

原因是這樣的我希望能夠將gpu加速無窗口透明flash播放器的activex控件渲染到紋理。一些通常不可能的事情,但我希望通過DirectComposition來實現。

+0

[來自MSDN](http://msdn.microsoft.com/en-us/library/windows/desktop/hh437351(v = vs.85).aspx)「DirectComposition不繪製位圖,它只處理位圖已經畫出來了。「這是否會導致問題?據我所知,它只是直接構成HWND。 –

+0

我可以從SwapChain創建一個HWND,然後使用framebuffer? – ronag

+0

任何事情都值得一試 - 但是你只能創建一個HWND目標的事實似乎暗示着這是嵌入操作系統的相當深刻的東西。我真的不知道*,但我強烈懷疑,如果可能的話,解決方案最多隻能是一種黑客攻擊。 –

回答

3

這是不可能的,這是可能的,引用MSDN(重點煤礦)

DirectComposition不提供任何服務的光柵化。應用程序必須使用其他基於軟件或硬件加速的光柵化庫(例如Direct2D或Direct3D)來填充要組成的位圖。 撰寫完成後,DirectComposition將合成的位圖內容傳遞到桌面窗口管理器(DWM)以呈現到屏幕。

據我所知,只有官方API與DWM共享您的離線表面,但沒有API允許您讀取DWM表面。

確實讓DWM什麼是你重定向HWND表面,這樣你就可以窗口上顯示其他HWNDs的表面。這可以通過DirectComposition(通過CreateSurfaceFromHwnd)或DWM API(通過DwmRegisterThumbnail)完成。後者的一個例子是look here

如果你想要去爲您的評論指出的「黑客路線」,還有undocumented APIs看起來像他們可以給你訪問到DWM表面,尤其DwmpDxGetWindowSharedSurface聽起來前途。 Someone else已經做了一些逆向工程,並找出了簽名,但無法讓它工作(紋理工程,但呈現黑色)。 This guy似乎有更多的運氣,並能夠渲染3D窗口紋理。我不明白他的語言,但你似乎不得不使用DwmpDxUpdateWindowSharedSurface(也未記錄)。

但是,您應該意識到使用未公開的函數不是一個好主意,Microsoft可以隨時更改它們(即使在Service Pack發佈中)或完全刪除它們,因爲它們僅由Microsoft自己使用,它們沒有理由維護兼容性。此外,您很可能會錯誤地使用它們(例如,您可能會丟失必要的同步並導致隨機崩潰,或更糟糕)。

但是,由於功能實際上是可用的,因此希望微軟可能會在未來的某些Windows版本中實際打開它以供pupid使用。