2011-01-24 55 views
6

編輯:由於我原來的問題是由於我的錯誤,我將重新說明這個問題。複製託管的Silverlight控件的內容

我在C++應用程序的窗口中託管Silverlight,代碼爲here

現在我想將控件的內容複製到內存中,以便在我自己的渲染器中使用內容。我遇到的問題是,當我將EnableGPUAcceleration設置爲true時,BitBlt停止工作,我得到的只是黑色。

我覺得理論上應該有一種方法可以將GPU加速的Silverlight控件的內容與其alpha,像glReadPixels。

任何人有任何想法,如何複製與非窗口gpu加速的Silverlight控件的alpha的內容?

另一個問題是窗口必須是可見的,沒有其他窗口可能會重疊,否則我沒有得到正確的內容。我希望託管窗口是隱形的。

工作示例代碼可以找到here(雖然沒有實際的BitBlt「ting」,我試圖去工作)。

+2

您是否有示例代碼可以真正演示您的alpha問題?因爲CodeProject託管的Silverlight控件可以用BitBlt成功複製,對嗎?或者我錯過了什麼? – 2011-01-27 14:30:33

回答

2

我會開始研究這個,我有一個想法,即OpenCL或者也許因爲您使用Silverlight,DirectCompute可能能夠設置一個上下文,您可以擁有更多的靈活性。

一種方法是簡單地使用其中一種語言進行所有GPU加速。同時,我會試着找出是否可以使用其中一種獲取您需要的信息或其他技術。

This link似乎驗證您將需要跨任何交互式成員啓用GPU加速。

編輯:

我認爲這篇文章可以提供一些其他幫助您的問題。本質上,它將涉及訪問緩存並確保您正在使用緩存。任何設置爲緩存模式的內容都將臨時存儲在顯卡中。

This article也闡明瞭一些問題。在硬件渲染方面,應該注意哪些操作會導致緩存問題。

我必須承認我一點都不流利地使用Silverlight,但這些類型的問題都很熟悉。盡我所能瞭解你的代碼的情況。

-1

可悲的是你不能(恕我直言)。

如果啓用加速,則所有視頻處理都在gpu中完成,並使用硬件覆蓋緩衝區輸出到屏幕。因此不可接受。

窗口上的打印屏幕功能也是如此。除非你可以訪問GPU並提取出有問題的像素。

請看這裏的屏幕截圖部分...http://en.wikipedia.org/wiki/Hardware_overlay

我是silverlight的新手,因此不知道有什麼可用,但是可以在呈現數據之前提取數據。儘管如此,這可能會大大減慢應用程序的速度gpu加速旨在消除cpu和帶寬限制,因此任何進入路徑的內容都會降低速度。您也可能會觸發傾斜位(DRM)禁用所有內容。

DC