Welche Werte habe ich nach Transformation mit ProjectionMatrix



  • Hi,

    ich habe mit D3DXMatrixPerspectiveFovLH(..) eine Prjectionmatrix erstellt. Meine Fragen:

    1. Welche Werte haben die Vertices, wenn ich sie mit der WorldViewProjection-Matrix transformiere?? Sind die zwischen [-1,1] oder zwischen der Anzahl Pixel (width und height des Fensters)??

    2. Wie erzeuge ich eine Projection-Matrix, mit der es möglich ist, die Vertices nach [0,1] zu transformieren? Mit D3DXMatrixPerspectiveOffCenterLH(..)???

    Ich möchte folgendes machen: Ich habe das Fenster des vorherigen Frames als Textur und möchte daraus im Pixelshader auslesen. Dazu müsste ich wissen, wie ich im Vertexshader die Position transformieren muss, um die richtige Texturkoordinate zu bekommen. Muss ich also von der Fensterbreite / -höhe auf die Texturkoordinaten ([0,1]) mappen oder irgendwie anders?



  • zu 1) Du solltest das garnicht rechnen. Das Ergebnis muss in keinem bestimmten Breich liegen.

    zu 2) Das machen diese Matrizen eigentlich alle, zumindest für die z-Achse. Für x und y ist das aber nicht erstrebenswert.

    Wenn du in eine Textur renderst (egal wie gross), so kannst du diese anschliessend wie jede andere Textur adressieren (egal wie genau die Einstellungen beim Rendern dieser waren). Ausserhalb des 0-1 Bereichs tritt immer der aktuelle clamping oder wrapping Modus ein.

    Bye, TGGC



  • Hi,

    danke für die Antwort. Aber ich fürchte, ich muss das Problem erklären. Es ist nämlich etwas komplizierter. Aber ich glaube nicht, dass das Ergebnis nicht bestimmt ist (sei es [0,1], [-1,1], pixelbreite/höhe oder Viewport). Und ich kann leider nicht clamping oder wrapping einsetzten. Ich muss ein genaues Pixel treffen. Aber ließ dazu meine Erklärung, vielleicht stellt sie das Problem einigermaßen dar.

    Stell Dir vor, Du bist in einem Raum voll Wasser. Oben an der Decke sammelt sich eine Luftblase. Das Gazne ist in First-Person. Du hast eine Art Stange, mit der Du natürlich auch durch die Blase stechen kannst. Und hier liegt das Problem.

    1. Die Blase ist halb-transparent, d.h., Du siehst die Stange auch dahinter.

    2. Die Blase bricht das Licht, d.h., die Stange wird abgeknickt (das ist hier wirklich wichtig).

    3. Wenn zuerst die Stange gerendert wird (was sie wird), existiert sie schon dort, wo ja eigentlich die Blase sie eigentlich abknickt. Aber sie ist natürlich gerade.

    Daraus resultiert folgendes (so, wie ich es mir erdacht habe):

    Die Blase darf nicht transparent sein, nur so aussehen. Denn sie wird als letztes gerendert und muss alles, was an Gegenständen dahinter ist (z.B. die Stange), überdecken und neu, aber geknickt, zeichnen.

    Realisieren wollte ich das Ganze wie folgt:

    1. Dei Applikation rendert alles, ausser die Blase. Der Screen wird danach in einer Textur gespeichert und dann dem Shader für die Luftblase gegeben.

    2. Im Vertexshader wollte ich die Vertexposition transformieren und dem Pixelshader über ein TEXCOORD geben.

    3. Im Pixelshader will ich dann mit dieser Position das korrekte Pixel in der Textur auslesen.

    Und dafür wollte ich wissen, welchen Wertebereich die Vertices nach der Transformation mit der WorldViewProjection-Matrix haben. Oder wie ich eine Matrix erzeuge, die gleich die Position korrekt in einem Beriehc zwischen 0 und 1 transformiert.

    Ich hoffe, es war nicht zuu viel und einigermaßen verständlich. Verstehst Du vielleicht, warum ich es nicht sofort erklären wollte???



  • Ja.

    Bye, TGGC



  • was heißt denn "ja"??



  • FelixManke schrieb:

    was heißt denn "ja"??

    Er versteht, warum Du es nicht sofort erklären wolltest... 🤡 :p



  • Na, dann ist das "ja" aber nicht gerade hilfreich.... Ich weiß, dass das ein recht kompliziertes und spezielles Problem ist, aber "ja" hilft wirklich nicht sehr viel weiter.



  • FelixManke schrieb:

    Na, dann ist das "ja" aber nicht gerade hilfreich.... Ich weiß, dass das ein recht kompliziertes und spezielles Problem ist, aber "ja" hilft wirklich nicht sehr viel weiter.

    Aber es ist das Einzige, was Du gefragt hast... 😉

    Hätte er GAR KEIN Feedback mehr gegeben, wärst Du auch eingeschnappt, oder?! 🤡



  • naja, ich freue mich ja, dass es eine Reaktion gab. Aber ich habe doch oben Fragen gestelt und nachdem ich feststellte, dass die ganze Sache doch nicht soo einfach ist, nochmal alles drumrum erklärt. Und da kann man glaube ich ne Menge zu diskutieren. Muss man natürlich nicht, aber kann man. Und auch mehr als nur "ja". Wenigstens "ja, da kann ich Dir auch nicht helfen", oder "ja, wie wäre es mit..." oder sowas.

    Aber ich will gar nicht soo sehr rummeckern. Bin icht eingeschnappt oder so. Aber hat dennoch jemand eine Idee, die über "ja" hinaus geht?? Ich habe versucht, in der DirectX-Doku was rauszufinden. Da stand was, dass die Projection Matrix zunächst in den Viewport transformiert, da dann das Clipping in der Pipeline kommt. Aber schlau draus bin ich auch nicht geworden.



  • Aha, scheinbar würdest du jetzt doch auch andere Vorschläge in Betracht ziehen? Wie wäre es, wenn du eine Stencil Mirror Technik an der Wasseroberfläche benutzt? Allerdings invertierst du die Matrix nicht einfach, sonder drehst sie nur entsprechend den Gesetzen der Optik.

    Bye, TGGC



  • Öhh, könntest du das etwas ausführen? Was meinst du denn mit den "Gesetzen der Optik"?? Ich will ja nicht spiegeln, sondern brechen. Halt, wie ein Löffel im Glas oder ein Fisch im Wasser. Die sind ja auch woanders, als man sie sieht.

    Naja, ich hätte da eine weitere Frage, die mich vielleicht weiter bringt. Werden Werte noch zwischen Vertex- und Pixelshader verändert ( transformiert, wenn ich im Vertex-Shader einen Wert (hier die Position) über ein Textur-Register ausgebe. Der Vertexshader ist ja, vergleichen mit der Fixed-Function-Pipeline, bis zur Pjejection-Transformation (einschließlich). Danach kommt das Clipping und das Transformieren in den Viewport. Dann der Rasterizer. Nun frage ich mich, ob auch Texturkoordinaten noch irgendwie transformiert werden. Und wenn ja, wie dann???



  • FelixManke schrieb:

    Öhh, könntest du das etwas ausführen? Was meinst du denn mit den "Gesetzen der Optik"?? Ich will ja nicht spiegeln, sondern brechen. Halt, wie ein Löffel im Glas oder ein Fisch im Wasser. Die sind ja auch woanders, als man sie sieht.

    Achso! Sorry, wusste micht, das man Brechung gar nicht mit den Gesetzen der Optik berechnet. Wie berechnest du die denn?



  • Ok, ich denke, wir können diesen Thread getrost bleiben lassen. Erstens ist der Unterton nicht der tollste. Ich dachte eigentlich, dass Foren dafür da sind, Fragen zu klären und zu helfen. Zweitens habe ich die Antwort bereits gefunden.

    Um einen Vertex so zu transformieren, dass er im "Screen-Space" ist (keine Ahnung, ob der so heißt. Ich meine nach der Projection-Transformation), muss man ihn mit der WorldViewProjection-Matrix transformieren UND DANN noch die xyz-Komponenten durch w teilen.

    Also:
    P' = P * matWorldViewPjoj;
    P'.x /= P'.w;
    P'.y /= P'.w;
    P'.z /= P'.w;

    Falls jemand etwas ähnliches braucht, kann er so hoffentlich etwas voran kommen.



  • War mir auch eine Freude zu helfen. Beantworte immer gern die Fragen, die da stehen.


Anmelden zum Antworten