我想我会发回我迄今为止发现的东西。简短的回答是不,我不认为 Silverlight 5 上的 3D 管道可以用于此类事情。一方面,据我所知,作为管道一部分的像素着色器和顶点着色器实际上是在 GPU 上执行的(不像 Silverlight 4 中的 2D 着色器,它们是在 CPU 上执行的) .
但这说:
(1) 我读过的所有内容都说,将数据输入 GPU 非常快,但对于大多数机器来说,从 GPU 取出数据要慢得多,大约为毫秒。这使得我们不可能,比如说,用执行 FFT 所需的数据加载 GPU,执行 FFT,然后将数据拉回比我们在 CPU 上执行的速度更快。
(2) Silverlight 5 可以在 GPU 上执行的指令集非常有限。具体来说,它仅限于HLSL Level 2,可用的指令和寄存器数量有限。我怀疑是否有可能——充其量是非常困难和非常缓慢的——在这些有限的指令中对 FFT 或 DCT 进行建模。
(3) 但是,即使我们可以绕过这两个限制,据我所知,Silverlight 也无法读取 GPU 正在执行的计算结果。普通 XNA(Silverlight 的 3D 功能所基于的框架)具有各种 GetData() 或 GetTexture() 方法,我认为您可以使用它们来读取一组计算的结果。但是它们的 Silverlight 5 版本中缺少这些等效方法。据我所知,在 Silverlight 5 中,GPU 是只写设备。您将着色器加载到它上面,加载数据,扣动扳机,然后挥手告别。您的代码将永远不会再看到这些字节。
如果事实证明我错了,我会回到这里更新这个答案。但至少目前看来,这似乎是一条死胡同。
[编辑 2011 年 10 月 10 日 - 根据 MS 的Shawn Hargreaves的说法,Silverlight 5 不支持这一点。他对原因的猜测是(a)很难让它在所有 GPU 驱动程序中始终如一地工作,并且( b) 对于除了一小部分演示软件风格的问题之外的所有问题,它没有任何意义。那好吧。]