我根据找到的代码here在我的C ++应用程序内的窗口中托管Silverlight。
现在我想将控件的内容复制到内存中,以便使用我自己的渲染器中的内容。我遇到的问题是,当我将“EnableGPUAcceleration”设置为true时,BitBlt会停止工作,我得到的只是黑度。
我觉得理论上应该有一种方法来复制GPU加速的Silverlight控件的内容及其alpha,例如:像glReadPixels这样的东西。
任何人都知道如何使用非无窗口的gpu加速Silverlight控件的alpha复制内容?
另一个问题是窗口必须是可见的,没有其他窗口可能会重叠,否则我得不到合适的内容。我希望托管窗口不可见。
可以找到工作示例代码here(虽然没有实际的BitBlt“ting”,我正试图开始工作)。
答案 0 :(得分:2)
我将开始研究这个问题,我知道OpenCL或者也许是因为你使用Silverlight,DirectCompute可能能够设置一个你可以拥有更多灵活性的上下文。
一种方法是简单地使用其中一种语言进行所有GPU加速。同时我会试着找出你是否可以使用其中一个来获取你需要的信息或其他技术。
This link似乎验证您需要在任何互动成员中启用GPU加速。
编辑:
我认为该文章可能会为您的问题提供一些其他帮助。本质上,它将是访问缓存并确保您使用缓存。设置为缓存模式的任何内容都将临时存储在图形卡上。
This article也对这些问题有所了解。如果它谈到硬件渲染,重要的是要注意哪些操作会导致缓存问题。
我必须承认我并不熟悉Silverlight,但这些类型的问题都很熟悉。尽我所能了解您的代码情况。
答案 1 :(得分:-1)
可悲的是你不能(恕我直言)。
如果启用加速,则所有视频处理都在gpu中完成,并使用硬件覆盖缓冲区输出到屏幕。因此无法进入。
Windows上的打印屏幕功能也是如此。除非您可以访问gpu并提取您遇到麻烦的像素。
请点击此处的屏幕截图部分... http://en.wikipedia.org/wiki/Hardware_overlay
我是silverlight的新手,因此不知道什么是可用的,但是你可以在渲染之前提取数据。这可能会大大减慢应用程序的速度。 gpu acceleration旨在消除cpu和带宽限制,因此进入路径的任何内容都会降低它的速度。您也可以触发倾斜位(DRM)禁用所有内容。
DC