Wie wird Nebel des Krieges in RTS-Spielen wie StarCraft II oder Age of Empires implementiert ? Ich mache ein RTS und plane, dass jede Einheit auf dem Feld eine Kreissicht bis zu einem bestimmten Radius hat.
Mein erster Gedanke war, eine Maske zu haben, die für jeden Punkt schwarz ist, außer für Punkte in der Nähe von Einheiten, wo sie transparent ist. Der Maskierungsvorgang selbst ist in den meisten Grafik-APIs schnell (z. B. einfach einen Shader aufrufenmix
). Der schwierige Teil besteht darin, herauszufinden, welche Maske verwendet werden soll und wie sie aktualisiert werden soll: Die Aktualisierung, wenn sich eine Einheit bewegt, ist sehr prozessorlastig.
Gibt es eine einfachere Möglichkeit, diese Art von Kriegsnebel zu bewältigen?
quelle
Die folgende Antwort basiert auf eigenen RTS-Erfahrungen, die visuell mit Age Of Empires und anderen RTS-Spielen übereinstimmen
Heutzutage gibt es nicht einen, sondern 2 Fog Of Wars (FOW)
Static FOW ist einfacher (einmal aufgedeckt, bleibt offen):
Der erste FOW wird auf der CPU berechnet und für die Spielelogik verwendet, um zu testen, welche Einheiten im Spiel "sehen" und was nicht. Für ein RTS muss es zu 100% zwischen allen Maschinen und Grafikeinstellungen des Players identisch und zu 100% wiederholbar sein, vorausgesetzt, dass RTS traditionell den Mehrspielermodus mit Sperrschritt verwendet. Um eine zusätzliche CPU-Auslastung zu vermeiden, muss diese detaillierter sein - z. B. 1 Beispiel pro Plättchen pro 5 Ticks der Spielelogik (oder Sie können optimieren, indem Sie die Sicht der Einheiten nur aktualisieren, wenn sie auf einem neuen Plättchen ankommen).
Der zweite FOW wird auf der GPU gerendert und ist dynamischer / detaillierter. Diesen FOW sieht der Spieler . Die GPU kann jedes Bild mit einer viel höheren Auflösung rendern / aktualisieren, die die CPU verarbeiten kann (z. B. 4096 * 4096 Pixel), um glatte Sichtkreise zu erzeugen. Da der FOW viel genauer ist, kann die Spiellogik leicht vom FOW abweichen, was in Ordnung ist, da typische Fehlanpassungen am FOW-Rand auftreten, wo die genaue Beurteilung vage ist.
Warum nicht GPU FOW sowohl für Logik als auch für Grafik verwenden? Das Streamen von Texturdaten von der GPU zurück zur CPU nimmt viel Zeit in Anspruch. Das Rendern von GPUs kann nicht als vertrauenswürdig eingestuft werden. Es kann sich stark zwischen den Konfigurationen / Treibern / Einstellungen der Player unterscheiden.
Für statische FOW können Sie mit einer Art "additiven" Updates davonkommen - jedes Mal für jede FOW-Probe - wählen Sie die hellste aus und behalten Sie sie.
Herstellung FOW dynamisch ist ein weiteres komplexes Problem. Im einfachsten Fall kann dynamisches FOW 5 Zustände annehmen: vollständig abgedeckt, halb erforscht, erforscht, halb aufgedeckt, vollständig aufgedeckt. Sie können diese Zustände auf 0, 1-49, 50, 51-99, 100-255 abbilden. Wenn die Einheit Nebel aufdeckt, zeigt sie ihn auf 255. Jedes Häkchen, das Sie "halb aufgedeckt" und "vollständig aufgedeckt" um 10 verringern, bedeutet, dass beim Verlassen der Einheit der FOW 15 Zecken "vollständig aufgedeckt" bleibt, bevor Sie beginnen verblassen bis halb enthüllt und dann weitere 5 Ticks, bevor Sie bei "erkundet" anhalten.
quelle
Mit Unity können Sie einer Lichtquelle ein "Cookie" hinzufügen, das das Licht basierend auf einer Bildtextur maskiert. Sie können es aktualisieren, indem Sie eine RenderTexture für diese Textur verwenden und diese dann mit Ihrem Kriegsnebel aktualisieren.
Ich würde vorschlagen, den rohen Nebel der Kriegsdaten im Hauptspeicher zu behalten und zu aktualisieren und dann einmal pro Frame alles, was Sie für Ihre Nebel des Krieges benötigen, in die RenderTexture zu übertragen.
quelle