Clippen



  • Hallo,

    ein recht einfaches "Problem":

    wie ist es möglich, ein Rechteck eines Direct3D(8) Devices so zu verriegeln, dass nur noch darin gerendert werden kann?

    Danke für Antworten und so, wie immer halt 😉



  • Ja, sowas ähnliches gibt es, schau dir mal die Funktion SetViewPort an. Du musst aber bedenken dass das kein "ClipRect" ist, sondern einfach nur eine Skalierung des Fensters. D.h wenn du einen kleineren Viewport setzt wird die ganze Szene nur verkleinert gerendert, es wird *nicht* nur ein Ausschnitt angezeigt. Natürlich kannst du mehrere Viewports verwenden.

    Wenn du ClipRects haben möchtest, dann wird die Sache schon was komplizierter, weil du die Primitives noch clippen musst (per Hand). Davon rate ich dir ab, da es recht schwer und recht langsam ist 😉

    Dann gibts noch den Stencil Buffer, geschickt eingesetzt kannst du so bestimmte Bereiche in deiner Szene masken, so dass dort keine Pixel gesetzt werden. Das ist aber ein bissel lahm, umd nicht auf allen Grafikkarten verfügbar.

    Eine andere Alternative ist die ganze Szene in eine Textur zu rendern, und diese Textur dann auf ein Dreieck pappen. So kannst du z.B. Spiegel erzeugen. In einigen Autorennen wird diese Technik verwendet.



  • Erstmal danke für deine rasche Antwort 🙂

    Ich denke, ich werde den vierten Weg gehen und das zuerst in eine Textur rendern. Stellt sich nur die Frage, wie kann man etwas in eine Textur rendern? ;). Muss ich dem Device sagen, dass es in eine Textur rendern soll oder unterstützt sowas die Textur?



  • Probier mal SetRenderTarget aus 🙂
    Ich kann mal schauen ob ich noch was Sourcecode finde, wenn du nicht zurechtkommst...



  • Hm, en bissel Code wär vielleicht wirklich nicht schlecht. In der MSDN steht, dass SetRenderTarget einen IDirect3DSurface8 erwartet... aber ich wills ja auf eine Textur rendern... besteht da eine Möglichkeit, das von einer Surface auf ne Textur zu kriegen oder sowas in der Richtung?





  • Original erstellt von Headhunter:
    Ja, sowas ähnliches gibt es, schau dir mal die Funktion SetViewPort an. Du musst aber bedenken dass das kein "ClipRect" ist, sondern einfach nur eine Skalierung des Fensters. D.h wenn du einen kleineren Viewport setzt wird die ganze Szene nur verkleinert gerendert, es wird *nicht* nur ein Ausschnitt angezeigt.

    Wenn man aber die view matrix noch entsprechend manipuliert, erhält man auch hier das gewünschte Ergebnis! Man brauch dann nichts von Hand machen und hat keine Geschwindigkeitseinbuße.


Anmelden zum Antworten