2009-09-04 7 views
0

Pendant l'expérimentation de pixel shaders dans WPF I a décidé d'élaborer des pixels sur une image plein écran à travers bitmaps inscriptibles sur la base de l'échantillon MSDN
http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.aspxWPF pixelshader sur bitmap inscriptible

I utilisé un nuanceur de flou dans l'image. Pour avoir un effet continu, j'ai retiré l'image du shader et l'ai utilisée comme entrée sur le bitmap inscriptible.

 RenderTargetBitmap rtb = new RenderTargetBitmap((int)width, (int)height, 96, 96.0, PixelFormats.Pbgra32); 
     rtb.Render(imgBackground); 

     wb = new WriteableBitmap(rtb); 
     imgBackground.Source = wb; 

Le code ci-dessus est vraiment lent. J'ai besoin de quelque chose pour le rendre plus rapide ou un moyen d'appliquer le pixel shader au backbuffer bitmap inscriptible au lieu de l'image.

Thx à l'avance. Stuck à ce problème depuis un certain temps maintenant ..

Répondre

1

RenderTargetBitmap.Render (...) est toujours rendu dans le logiciel sur le thread de l'interface utilisateur, de sorte que votre pixel shader est même exécuté dans le logiciel.

Je ne suis pas sûr que « l'effet » que vous essayez d'atteindre, mais peut-être que vous pouvez juste définir l'effet de flou sur le imgBackground (c.-à-imgBackground.Effect = new BlurEffect())

+0

Jérémie, merci pour vous répondre . J'essaie d'utiliser une image générée par le shader comme nouvelle entrée. Le réglage de l'effet en C# ne fait donc aucune différence. Je dois trouver un moyen de définir l'effet sur le bitmap inscriptible. – Kris

+0

Malheureusement, WPF ne vous laissera pas faire cela efficacement (comme vous l'avez découvert). Même si c'était le cas, tirer la surface du GPU vers la mémoire du système est également lent (pas aussi lent que RTB). Vous devrez peut-être faire preuve de créativité pour obtenir un effet similaire. Peut-être soit en créant votre propre pixel shader, qui n'est peut-être pas capable parce que les limitations avec les shaders pixel WPF (ie, ne supportant pas plusieurs passes) ou un shader personnalisé n'est pas la bonne solution;). Une autre option consiste à écrire votre propre algorithme de flou et à effectuer tout l'effet de flou sur le WriteableBitmap. –

+0

Merci d'avoir éclairci cela! Je ne résous pas mon problème mais maintenant je sais dans quelle direction je dois chercher. THX – Kris

Questions connexes