Übergang Land<->Unterwasser

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Übergang Land<->Unterwasser

Beitrag von Niki »

In Artifical Mind's Upvoid Thread hatte ich eine Frage zu Übergangseffekten für Über-/Unterwasser gestellt. Da ich seinen Projekt-Thread damit nicht belasten will, würde ich das Thema hier gerne fortsetzen. Ist nichts dringendes für mich, aber das Interesse ist groß da das Thema doch bald auf mich zu kommt.

Die Frage: Ich befinde mich in einem Open-World-Spiel in dem man sowohl über Land laufen als auch Unterwasser tauchen kann. Wie kann ich einen Übergang von Überwasser nach Unterwasser realisieren? Unter Wasser ist die Beleuchtung ja schon sehr anders.

In Oblivion viel mir auf, dass es scheinbar nicht möglich ist, dass sich die Wasserlinie in der Mitte des Bildschirms befindet. Stattdessen scheint die Wasserlinie zum oberen oder unteren Frustum-Rand hinzuspringen. Wie machen die das? Verschieben die einfach die Wasserebene vertikal oder ist es komplizierter? Noch schöner wäre natürlich zu wissen, wie man das Problem mit Wasserlinie in der Mitte des Bildschirm lösen kann. Heutzutage ist das ja wegen der Wellen keine einfache Linie mehr.
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Übergang Land<->Unterwasser

Beitrag von Krishty »

Ohne es je gesehen zu haben würde ich schätzen, dass die Entwickler von Oblivion die Problematik einer Wasserlinie auf dem Bildschirm von vornherein umgehen wollten, und der Renderer deshalb nur zwei Zustände kennt:
  • Über dem Wasser (erst alles unter Wasser mit Färbung und starkem Nebel zeichnen; dann alles darüber normal)
  • Unterwasser (erst alles draußen normal zeichnen; dann die Unterwasserwelt mit Färbung und starkem Nebel)
Die Entscheidung, welches von beidem, wäre dann der stupide Test, ob sich der Betrachter (der ja immernoch ein Punkt ist!) über der Wasserebene befindet oder drauf/drunter.

Beides gleichzeitig möchte man üblicherweise nicht, weil bestimmte Effekte wie Verzerrungen und Kaustik möglichweise mit Bildschirmkoordinaten statt Weltkoordinaten arbeiten, und eine Wasserlinie damit je nach Implementierung sehr schwer realisierbar wäre. (Man müsste z.B. aufpassen, dass die Verzerrungen der Wasseroberfläche nur für den Teil des Bildschirms gelten, der unterwasser ist.)

Das kann man gut kaschieren, wenn man beim Verlassen des Wassers Unschärfe und über den Bildschirm laufendes Wasser einbaut.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Übergang Land<->Unterwasser

Beitrag von Niki »

Danke, Krishty.

Oblivion habe ich mir heute morgen deswegen nochmal angesehen. Das snappt nicht, sondern hat sehr hässliche "Grafikfehler" im Übergang. Ich habe da irgendwie die Spiele durcheinander gebracht. Vielleicht war's Skyrim, aber das kann ich nicht mal eben ausprobieren ohne ein neues Spiel zu starten.

Ich habe nach dem ganzen Thema auch mal gegoogelt. Da findet man fast gar nichts zu. Auf gamedev.net fand ich einen Thread mit nur einer einzigen Antwort.

Dann habe ich mir noch die Island11 Demo im nVidia SDK angesehen. Die haben da zwar keine Unterwassereinfärbung, aber wenn man die Wasserlinie mal in die Mitte des Bildschirms bringt, dann sieht man das da noch ganz andere Problem bestehen, wie zum Beispiel falsche Reflektionen und Löcher in der Wasseroberfläche (hervorgerufen durch Backface Culling). Ich glaube mittlerweile das Thema ist problematischer als man denken sollte.
NytroX
Establishment
Beiträge: 367
Registriert: 03.10.2003, 12:47

Re: Übergang Land<->Unterwasser

Beitrag von NytroX »

Also ich würde auch mal schätzen, dass zumindest die Wellen ein nicht ganz einfaches Problem darstellen.
Aber wäre es nicht relativ einfach, wie von Krishty beschrieben, quasi 2 Renderer zu haben, einen für Überwasser und einen für Unterwasser.
Dann könnte man doch einfach die Szene 2 mal rendern, einmal Überwasser und einmal Unterwasser, jeweils in eine eigene Textur rein.
Also 2 komplett getrennte Bilder erzeugen und dann anschließend übereinander legen, quasi wie beim Splitscreen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Übergang Land<->Unterwasser

Beitrag von Krishty »

Dann braucht man eine Methode um auszuwählen, wo welche der beiden Texturen angezeigt werden soll. Da die Wassergrenze nicht zwingend horizontal oder linear ist, ist das schon wieder nicht-trivial – selbst wenn man Stencil Buffer und Konsorten zur Hilfe nimmt. Meiner Meinung nach ist es den Aufwand nicht wert wenn man nicht gerade ein Spiel schreibt, bei dem der Anwender mehr als ein Millionstel der Spielzeit auf der Grenzfläche verbringt (U-Boot-Simulatoren oder so).
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Übergang Land<->Unterwasser

Beitrag von Niki »

Selbst wenn ich nun irgendwie wissen würde welche Bereiche des Bildschirms unter Wasser sind, dann hätte ich immer noch das Problem mit der planaren Reflektion... es sei denn der Code im Island11 Demo von nVidia wäre falsch, aber das glaube ich eher nicht. Eher wird das Problem sein, dass die Kamera unter die Reflektionsebene rutscht.

An diesem Punkt stimme ich mit Krishty überein, dass es den Aufwand wahrscheinlich nicht wert ist. Aber erst mal fragen und dann entscheiden. Hätte ja auch simpel sein können :)

Also wird's bei mir wohl darauf hinauslaufen, dass ich die Wasserebene snappe. Dann ist das Bild entweder vollständig unter Wasser oder vollständig über Wasser. Und selbst da werde ich noch überlegen müssen wie ich das Snapping möglichst geschickt umsetzen kann.
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Übergang Land<->Unterwasser

Beitrag von Niki »

Also halten wir mal fest...

Generell kann man nur dann etwas unter Wasser sehen, wenn das rechteckige 2D-Sichfenster der Near-Plane entweder die Wasserebene (ohne Wellen) schneidet oder sich das Sichtfenster unterhalb der Wasserebene befindet. Jetzt definiere ich, dass der Normalenvektor der Wasserebene Richtung Himmel zeigt. Der positive Halbraum ist also über Wasser, und der negative Halbraum unter Wasser.

Das Sichtfenster kann nun als 2D OBB dargestellt werden. Da könnte man nun erst mal die vorzeichenbehaftete Distanz von der Ebene zum minimalen Extrempunkt des OBB berechnen (ganz genau so wie beim Frustum-Culling). Von der Distanz wird dann die maximale Wellenamplitude abgezogen. Ist die Ergebnisdistanz D <= 0, dann wird Unterwasser gerendert, ansonsten über Wasser.

Ich hoffe da ist jetzt kein Denkfehler drin. Aber selbst wenn, so sollte das ganze einfach genug zu realisieren sein, denn diese Art der Berechnung haben die Grafikprogrammierer hier schon tausend mal gemacht.

Was nun noch getan werden müsste ist sicherzustellen, dass bei D <= 0 die Wasserebene über dem oberen Bildschirmrand liegt, und bei D > 0 unter dem unteren Bildschirmrand liegt (+/- maximale Wellenamplitude). Die Frage ist nun wie genau man dieses Schnappen zu den Bildschirmrändern hin realisiert. Dieses Schnappen darf natürlich nur dann geschehen, wenn de Wasserebene nicht eh schon über/unter dem Bildschirmrand liegt. Was nun? Einfach die Wasserebene selbst verschieben?

Worüber ich mir momentan übrigens nicht ganz im Klaren bin ist, was passiert wenn die Kamera relativ Steil nach unten auf die wellige Wasserebene schaut. Wahrscheinlich kann man das aber ignorieren falls es da ein Problem geben sollte.

EDIT: Post wurde editiert und der "maximaler Extrempunkt" entfernet. Klar das der "minimale Extrempunkt" immer die kleinere vorzeichenbehaftete Distanz hat. Guten Morgen, Niki!
Antworten