托管的Silverlight控件复制内容

6

编辑:由于我的问题是由我的错误造成的,因此我将重新表述这个问题。

我在基于这里找到的代码的C++应用程序中,在窗口内托管了一个Silverlight。现在,我想将控件的内容复制到内存中,以便在自己的渲染器中使用该内容。我的问题是,当我将“EnableGPUAcceleration”设置为true时,BitBlt停止工作,我只得到黑色。

我觉得理论上应该有一种方法可以复制具有alpha通道的GPU加速的Silverlight控件的内容,例如使用glReadPixels之类的东西。

有人知道如何复制非无窗口gpu加速的Silverlight控件的带alpha的内容吗?

另一个问题是,窗口必须可见,没有其他窗口可以重叠它,否则我就得不到正确的内容。我希望托管窗口是不可见的。

可以在这里找到工作示例代码(尽管没有我正在努力让其工作的实际BitBlt)。


2
你有一个演示你的alpha问题的样例代码吗?因为CodeProject托管的Silverlight控件可以通过BitBlt成功复制,对吧?或者我漏掉了什么? - Simon Mourier
@Simon:你说得对。我的测试代码是错误的。 - ronag
2个回答

2

我将开始研究这个问题,我有一个想法,可以使用OpenCL或者由于您正在使用Silverlight,DirectCompute可能能够设置上下文,从而使您拥有更多的灵活性。

一种方法是在其中一种语言中进行所有GPU加速。同时,我会尝试找出您是否可以使用其中一种语言来获取所需的信息或其他技术。

此链接似乎验证了您需要在所有交互成员上启用GPU加速。

编辑:

我认为那篇文章可能会对您的问题提供一些帮助。本质上,它将涉及访问缓存并确保您正在使用缓存。任何设置为缓存模式的内容都将暂时存储在显卡上。

这篇文章也阐述了一些问题。当它谈到硬件渲染时,重要的是要注意哪些操作会影响缓存。

我必须承认我对Silverlight一点也不熟悉,但这些类型的问题很常见。我正在尽力理解您代码的情况。


-1

很遗憾,我认为你做不到。

如果启用加速,则所有视频处理都在GPU中完成,并使用硬件叠加缓冲区输出到屏幕。因此无法访问。

对于Windows上的打印屏幕功能也是如此。除非您可以访问GPU并提取像素,否则会有麻烦。

在这里查看屏幕截图部分... http://en.wikipedia.org/wiki/Hardware_overlay

我是Silverlight的新手,因此不知道有什么可用的,但您能在呈现数据之前提取数据吗?虽然这可能会严重减慢应用程序。 GPU加速旨在消除CPU和带宽限制,因此任何进入路径的东西都会减慢它。您还可能触发倾斜位(DRM),从而禁用所有内容。

DC


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接