Ich suche nach Eingaben zur Simulation von Wasser in 2D gegen ein ziemlich großes (Call it) blockiertes / nicht blockiertes Array (von der Seite gesehen). Ich habe mir folgende Ideen ausgedacht:
Zellautomaten
Führen Sie eine massiv parralel Simulation auf der CPU unter Verwendung von Zell Automaten . Mit so einfachen Regeln wie:
- Wenn eine Zelle nach unten offen ist, gehen Sie dorthin.
- Überprüfen Sie die linke und rechte Zelle, wählen Sie eine zufällige aus den beiden und bewegen Sie sich dorthin.
Vorteile
- Einfach zu implementieren.
- Sinnvoll / deterministisch in einem Mehrspielersystem.
Nachteile
- Wahrscheinlich sehr langsam.
- Nicht überzeugend.
Fluiddynamik auf der GPU
Führen Sie eine grobe Näherung der Fluiddynamik auf der GPU anhand einer Textur wie der folgenden durch:
+------+-----+-----+-------+
|R |G |B |A |
+------+-----+-----+-------+
|vX |vY |NULL |Density|
+------+-----+-----+-------+
Vorteile
- Wahrscheinlich sehr schnell.
- Könnte durchaus überzeugend sein.
- Ein weiterer Pixel-Shader könnte es direkt rendern.
Nachteile
- Schwer zu implementieren.
- Schwer zu optimieren.
- Ich kann keine einzelne Textur der Größe meines Levels zuordnen.
- Ich könnte die Gitterbereiche überlappen, aber dies würde die Komplexität weiter erhöhen.
Teilchen
Verwenden Sie Partikel, um das Wasser zu simulieren. Wenden Sie beim Rendern die additive Überblendung an und wenden Sie dann eine Multiplikationsfunktion auf den Alphakanal an, um dem Wasser scharfe Kanten zu verleihen.
Vorteile
- Wird wahrscheinlich gut aussehen.
- Einfach zu implementieren
- Einfach zu rendern.
- Sinnvoll in einem Multiplayer-System, obwohl die Übertragung eine Menge Bandbreite erfordern würde.
Nachteile
- Interpartikeleffekte werden wahrscheinlich langsam sein (Nachbarschaftssuche).
- Kann dazu führen, dass Wasser durch feste Räume "austritt" (weil der feste Raum klein ist, z. B. 1px).
- Kann je nach Partikelgröße zu seltsamen Löchern im Wasser führen.
- Beides könnte gemildert werden, indem Partikel näher aneinander driften als ihre tatsächliche Größe, dies würde jedoch Probleme mit der Leistung zwischen Partikeln und Partikeln / Landschaften verursachen.
Weitere Ideen?
Hinweis: Dies ist eine Annäherung, ich suche hier nicht das physikalisch korrekte Wasser - nur etwas, das "gut genug" ist (Bonuspunkte für schnell und schmutzig). Das Spiel ist im Mehrspielermodus, daher muss leider das gesamte Level kontinuierlich simuliert werden.