Eu tenho uma biblioteca de áudio para o Silverlight que precisa de alguma aceleração em máquinas mais lentas. Especificamente, esta biblioteca faz uso extensivo e repetido da transformação FFT como parte de seus algoritmos de cancelamento de eco acústico e redução de ruído, e estou pensando se faria algum sentido usar a GPU para isso (como descrito, por exemplo, aqui: http://www.inf.fu-berlin.de/lehre/SS10/SP-Par/download/fft1.pdf ).
Eu sei que o Silverlight 5 fornece uma porta bastante simples da estrutura XNA da Microsoft, mas, infelizmente, sou um novato em codificação 3D em geral e XNA em particular. Parece-me que deveria ser teoricamente possível usar alguma combinação de vértices e / ou pixel shaders para fazer essa mágica, mas antes de ir muito longe nesse caminho, eu queria obter algumas opiniões de especialistas em algumas perguntas:
(1) A implementação XNA do SL5 lança a saída de seu pipeline em um único "DrawingSurface". Eu estava pensando que era aqui que eu poderia ler os resultados dos cálculos (como você pode usar um WriteableBitmap para ler os resultados dos cálculos de pixel shader no SL4). Mas não consigo descobrir como faria isso: não há método "GetPixels ()" ou algo assim. Em XNA regulares 4.0, o VertexBuffer tem um GetData () método, como fazem os Texture2D e Texture3D classes, mas esses métodos estão em falta na versão SL5 . Alguém sabe alguma maneira de realmente ler os resultados das saídas do shader? Ou a GPU é um dispositivo somente gravação no SL5?
(2) Parece que o verdadeiro problema dos cálculos de GPU é ler os resultados rapidamente . Supondo que eu possa resolver o problema nº 1, alguém sabe se uma FFT seria favorável a esse tipo de solução?
(3) O Silverlight 5 é limitado ao HLSL Nível 2, que possui várias limitações sérias, desde que instruções, registros, funções disponíveis e assim por diante. É razoável esperar ser capaz de portar uma FFT ou parte dela para isso?
Desde já, obrigado.
Respostas:
De acordo com Shawn Hargreaves (do MS), isso não é suportado no Silverlight 5. Seu palpite não oficial sobre o porquê é que (a) seria difícil fazê-lo funcionar consistentemente em todos os drivers de GPU e (b) para todos, exceto uma minúscula classe de problemas no estilo de demonstração, não faria sentido.
Ah bem.
fonte
Eu escrevi um importador de conteúdo personalizado para "GetData" para um Texture2D.
http://www.dustinhorne.com/post/2011/12/28/Getting-Color-Data-for-a-Texture2D-in-Silverlight-5-XNA.aspx
fonte