Spiegelungen [OpenGL]
-
Hallo!
Ich würde gerne Wasser(und somit Spiegelungen) in mein Spiel einbauen, allerdings habe ich das Problem, dass ich bei den Spiegelungen die Kameraposition nicht korrekt ermitteln kann.Erst habe ich einfach den StencilBuffer für die Spiegelungen verwendet, allerdings ist das nicht so praktikabel und somit bin ich auf RenderToTexture umgestiegen.
Sprich aus negativer Sicht der Kamera rendern und das Bild als Textur auf die Wasseroberfläche aufbringen.Also z.B. so:
c o M ______________wwww__N__ cs c...Kamera cs..KameraFürSpiegelung w...Wasser oMN.Figur _...Ebene an der gespiegelt wird
Das Problem das sich dabei ergibt ist Folgendes:
Wenn ich über cs rendere wird der gesamte Bildausschnitt von unten gezeichnet und auf die Textur aufgebracht - somit ist die eigentliche Figur oMN sehr klein und in keinem Verhältnis mehr zu der eigentlichen Figur. Oder anders gesagt. Das Spiegelbild ist x mal kleiner als die eigentliche Figur, dazu noch an falscher Position usw...Ich nehme an es kann über die Distanz zwischen cs und oMN gelöst werden, jedoch ist das eher raten als wirkliches berechnen und funktioniert nur für sehr kleine Wasserfelder.
Mittelfristig habe ich es so gelöst dass ich cs ein wenig unter wwww positioniere und senkrecht nach oben blicken lasse. Was aber natürlich eine falsche Perspektive ist, die Figur im Spiegelbild staucht und die Kamerabewegung hat somit auch keinen Einfluss auf die Spiegelung. Also nicht optimal.Daher meine Frage:
Gibt es eine Methode die Kamera perfekt zu positionieren? Oder muss man einen Teil des von cs aus gerenderten Bilds ausschneiden? (Kann ich mir ja nicht vorstellen)MfG Gorkosh
-
vielleicht hilft dir:
http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node160.html
ansonsten sind deine stichwoerter: stencil reflection
-
Den Stencilbuffer habe ich schon dafür verwendet, allerdings tritt (wie oben beschrieben) dabei das Problem auf, dass ich damit nur um eine Achse spiegeln und die Spiegelung nicht als Textur aufbringen kann. Ich habe eine Wellensimulation eingebaut auf die ich die Textur gerne aufbringen möchte. Der optische Effekt ist nett anzusehen allerdings ist die verzerrte Spiegelung nicht wirklich schön, wenn die Wasseroberfläche ruhig ist.
Mit dem Stencilbuffer bräuchte es wiederum eine andere Art der Oberlächenverzerrung, weil ich es wie gesagt ja nicht einfach als Textur aufbringen kann.
Zusätzlich interessiere ich mich für die Lösung des Problems und will nicht einfach nur ne Spiegelung hinzaubern
-
Kannst du denn nicht einfach die Landschaft, am Wasser gespiegelt in die Textur rendern?
Zuerst so (natürlich ohne Wasser):
c - - - - - N M O c...Kamera w...Wasser oMN.Figur _...Ebene an der gespiegelt wird
Und dann das aufgenommene Bild auf das Wasser zeichnen.
Dazu zuerst die Landschaft "richtig rum" zeichnen.
Dann das Wasser (auch in den Stancil Buffer). Damit hast du die passende Schablone. Dann die erzeugte Textur (mit der umgedrehten Landschaft) zeichnen (mit der Schablone).
z.B. im Orthogonalmodus pixelgenau ganz über den "Bildschirm". Dann hast du mit der Schablone des Wassers im Stencil Buffer genau das Passende der Textur ausgeschnitten. (Hierbei eventuel Transparenz verwenden, damit das wasser halb durchsichtig wirkt.)
-
Ich hab jetzt nur ungefähr eine Ahnung was du genau meinst, aber wäre die Textur dann nicht nur aus sicht der Kamera richtig? Dann müsste ich erst wieder ausrechnen wie ich den ausgeschnittenen Teil auf die Wasseroberfläche aufbringen kann...
Und sollte ich nicht erst nur die Landschaft ohne das Wasser zeichnen um die richtige Schablone zu erhalten?
Sorry aber könntest du das vlt nochmal genauer beschreiben?
-
1.Du zeichnest dier Landschaft an der Wasseroberfläche gespiegelt. (Also falsch rum). Dies nimmst du mit der Kamera aus der Richtung aus, wie es später sein soll.
Dies renderst du nur eine Textur. (Nicht auf den Bildschirm)2. Du zeichnest die Landschaft richtig rum.
3. Du zeichnest das Wasser auch aus der Kameraposition so wie sie sein soll. Den Stencil Buffer so einstellen, dass die Schablone erzeugt wird. Diese ist jetzt richtig, da nur da wo das Wasser gezeichnet wird die Schablone erzeugt wird. Der andere Teil ist ja wie es sein soll von der Landschaft verdeckt.
(Hinweis: Die Kamera in Punkt 1 und 3 steht an der gleichen Stelle.
Also an der, von der aus man die Szene sehen will)4. Nun die im Punkt 1 erzeugte Textur komplett über den ganzen Bildschirm zeichnen. z.B. im Orthogonalmodues und mit Hilfe der Schablone.
Somit sieht man an der Stelle wo das Wasser ist, die Landschaft die verkehrt herum ist (also gespiegelt an der Wasseroberfläche). Das wirkt als spiegele sich die Landschaft im Wasser.
-
Also meinst du ganz normale Stencilreflections...?
Das habe ich ja schon ausprobiert, allerdings ist die Reflektion dann ja "nur" zweidimensional - also am Bildschirm im OrthoMode, sprich dann braucht es eine andere Art der Verzerrung, wenn sich die Wellen über das Wasser bewegen.
Wenn ich die Textur aber auf die Wasseroberfläche aufbringe und sich die Wellen ausbreiten, wird die Spiegelung direkt mitverzerrt.
Wie wird das generell in Spielen gelöst?
Ich dachte die Spiegelung in die Wellentextur zu rendern wäre ganz praktikabel, aber anscheinend löst man das besser anders?
-
Das machst Du darüber, dass Du beim texturieren der Wellenoberfläche nicht einfach die Textur draufklebst, sondern (zum Beispiel mit einem Shader) die Stelle an der Du aus der Textur liest von der Normale Deiner Oberfläche abhängig machst.
-
normalerweise rendert man auch in die spiegelungs-texture mit der normalen kameraverzerrung. die spiegelung wird durch eine einfach spiegelungsmatrix erreicht die man auf die view transformation draufrechnet. sonst aendert sich eigentlich nichts.
die finale worldview(mirror)projection matrix die man verwendet, wird dann als projektionsmatrix fuer die texture auf die wasserebene verwendet.simpler kann es nicht sein
-
Habt ihr vlt nen Link zu ner guten Seite bzgl. dieses Themas?
Nach ein paar Stunden Google hab ich immer noch nichts gefunden das mir dabei helfen könnte.