Jump to content
Unity Insider Forum

Ozean Wellen Höhe ermitteln


Thariel

Recommended Posts

Hi

Ich habe mit Amplify Shader und einem Tutorial ein ziemlich schöner Ozean erstellt.

Jetzt möchte ich die Höhe des Wassers an einer bestimmten Position ermitteln um den Spieler schwimmen und tauchen zu lassen.

Hab dazu schon recherchiert und herausgefunden, dass einige die Wellen mit einer bestimmten Funktion (Sinus/Gerstner) im Shader generieren und mit der selben Funktion einfach das nochmal parallel in einem Script berechnen. Dann müsste die Höhe stimmen.

Aaaaber ich erstelle die Wellen mit zwei Noise Generatoren. Kann mir da jemand erklären, wie ich die Höhe der Wellen ermitteln kann?! Der "Ozean" ist übrigens ein ganz normales Plane.

ys5u7tgo.gif

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja danke trotzdem 😄

Hab jetzt herausgefunden, dass ich parallel zum Shader ein C# Script erstellen muss, indem die Welle auf die selbe weise berechnet wird, um die Höhe zu ermitteln. Da mir das zu schwer ist, generiere ich nun die Wellen direkt in einem Script... also nicht mehr im Shader. Jetzt klappt eigentlich alles, auch die Berechnung der Wellenhöhe, aber die Performance ist einfach katastrophal!

Natürlich brauche ich nicht für einen grossen Ozean jede Welle in jedem Frame neu zu berechnen. Ich suche nun nach Möglichkeiten, das ganze massiv zu beschleunigen. Zum Beispiel habe ich den Ozean in Tiles unterteilt und nur ein Tile berechnet und das Ergebnis auf alle Übertragen. Leider nur mit eher wenig Erfolg. Auch die Übergänge sind sichtbar.

Kennt jemand gute Techniken um die Performance zu verbessern?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zum einen wäre DOTS eine Variante (ECS/Jobs), zum anderen sollte es aber auch möglich sein, dass du statt eines normalen Shaders einen Compute Shader baust, der die Ergebnisse in einen Buffer haut, den die CPU dann wiederum auslesen kann. Ich glaube, ich würde zuerst Variante 2 versuchen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es sollte auch gehen die im Shader berechneten Höhen und Tiefen über eine Rendertexture auszugeben (siehe auch Graphics.SetRenderTarget() und Graphics.DrawMeshNow). Diese Rendertexture würde dann über einen 2. "Spezialshader" erzeugt, der diese Höhendaten dann über die RGBA-Channels ausgibt. Dieser 2. Shader muss natürlich mit den gleichen Eingabedaten wie der Originalshader laufen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...