Desktop verzerren mit DirectX



  • Hallo zusammen,

    ich bin auf der Suche nach einer Möglichkeit möglichts schnell den aktuellen Bildschirm zu verzerren. Dabei bin ích auf DirektX gekommen. Hier ist es ja möglich den Frontbuffer der Grafikkarte abzugreifen. Den Screenshot habe ich dadurch in einer Surface gespeichert. Nun suche ich eine Möglichkeit diesen Screenshot möglichst ohne großen Rechenaufwand zu verzerren. Damit Ihr euch ein Bild von meiner Vision machen könnt habe ich euch ein Bild angehängt
    http://oi53.tinypic.com/bhewdx.jpg

    Glaubt Ihr ich kann eine solche Verzerrung durch ein Mesh erzeugen? Sprich das Bild vor der Ausgabe auf dieses Mesh rendern. Wenn ja wie erzeuge ich so ein Mesh? und wie rendere ich ein Bild darauf?

    Ich hoffe Ihr könnt mit helfen
    Gruß Patrick



  • könnte man ggfs. auf eine Art Terrain rendern, dein eingefangenes Bild dann als Textur auftragen.

    soll das ein statisches Bild werden? Oder ein Screensaver? Oder gar eine Art Wellenbewegung dargestellt werden?



  • Nein keins von alle dem. Es soll eigentich permanent die Ausgabe des Bildschirms verzerren um mit einem Projektor auf nicht planare Oberflächen zu projezieren.

    Ich hab jetzt auch mal ein bisschen mit Vertex rumgespielt kann man damit eventuell auch eine dementsprechende Verzerrung erzeugen?

    Danke



  • Ich würd wohl ein Fullscreen Quad rendern und die Verzerrung im PixelShader machen (einfach die Texturkoordinaten verzerren).



  • Sprich Pixel für Pixel verzerren??



  • exakt



  • Dann müsste ich aber irgendwo eine Art LookUpTable anlegen, wenn ich diese Verzerrung erreichen möchte müssen ja bestimmte Pixel Ihre Position tauschen.
    Was denkst du wie das vom Rechenaufwand her ist? Ziehl ist eigentlich ein Video mit 1920x1080 Pixel zu verzerren und dabei ca. 40Frames pro Sekunde noch zu erreichen

    Gruß



  • Wie hast du denn die Verzerrung auf deinem Bild da gemacht?

    MB_SLS schrieb:

    Was denkst du wie das vom Rechenaufwand her ist? Ziehl ist eigentlich ein Video mit 1920x1080 Pixel zu verzerren und dabei ca. 40Frames pro Sekunde noch zu erreichen

    Da mach dir mal keine Sorgen. Das richtige Problem wird eher 40 Screenshots pro Sekunde zu erzeugen, das Verzerren an sich wird für eine moderne Grafikkarte dagegen nichtmal ein Grund sein den Mittagsschlaf zu unterbrechen 😉



  • Die Verzerrung ist leider nicht von mir.

    Ok aber mit der LookUpTable lieg ich doch dann da gar nicht so falsch oder
    geht das anders bin eigentlich Directx newbie



  • Naja, wär ne Möglichkeit. Man könnte eine Lookuptable in eine zweite Textur packen...



  • Irgendwoher muss der PixelShader ja wissen wie er die Textur verzerren soll



  • Klar. Aber wenn dus auf ein Mesh packen würdest, dann müsste dein Programm auch irgendwoher wissen, wie die Vertices platziert werden sollen, das Problem hat mit dem PixelShader an sicht nix zu tun 😉
    Ja nachdem was genau du dir unter dieser "Verzerrung" vorstellst, wird natürlich entweder die Mesh oder die PixelShader Variante von Vorteil sein...



  • Die Verzerrung ist eigentlich nichts anderes wie Pixel verschieben. Das mit dem Mesh hab ich mir auch angeschaut aber das hab ich irendwie nicht ganz kappiert. Und zwar brauch ich da ja wieder ein extra Programm richtig so? Oder geht das anderst



  • Wenn du Direct3D verwenden willst, dann solltest du jetzt zuerst sowieso einmal die Grundlagen lernen. Dann klären sich all diese Fragen auch von selbst 😉



  • Hast du mir eventuell ein gutes Tutorial an der Hand womit ich einen schnellen Einsti in Direct3d finde



  • Würdest du den Code für einen Pixel Shader in einem Editorfile schreiben?
    Ich hab mir mal ein solches File erzeugt und damit n paar Farbeffekte auf die Textur angewendet. Ich hänge jetzt aber fest weil ich eben einzelne Pixel bearbeiten will und das bekomme ích nicht hin



  • Meinst du ein Effectfile? Wo genau scheitert's?



  • Es handelt sich um ein PS File. In diesem PS- File kann ich dem Pixel Shader ja z.B sagen mach das Bild schwarz weiß oder sonst irendwelche Effekte. Jetzt will ich hier aber gezielt ein Pixel ansprechen Ich hoffe du verstehst was ich will 😞



  • Ich versteh was du willst. Aber leider wirst du dein Ziel nicht erreichen ohne anständig Direct3D zu lernen.
    Also nochmal: Lern zuerst Direct3D und zwar von Grund auf, dann erübrigen sich auch all deine Fragen...



  • Bin ich damit überhaupt auf dem richtigen Weg? 😞
    Hätte nicht gedacht das sich das ganze so komplex gestaltet




Anmelden zum Antworten