Rendering und Effekte
Wie eine 2D-Szene gezeichnet wird, Bloom und Monitor angewendet werden und Ansichten sowie Partikel funktionieren.
Auf dieser Seite
Eine Szene, eine Zwischentextur
RenderManager bietet Draw(const sf::Drawable&) zum Zeichnen der SFML-Objekte einer Szene an. Intern leitet er sie an target_ weiter, eine mit der konfigurierten Größe erzeugte sf::RenderTexture.
Zu Beginn des Frames leert BeginDrawing das Ziel und zeichnet den Hintergrund. FinishDrawing stellt die Textur bereit, wendet die Effekte an und gibt die Textur zurück, die Engine im Fenster anzeigt. Szenen müssen das Fenster nicht direkt verwalten.
Nachbearbeitungskette
Dies ist die Effektauswahl im Referenzcode:
// Post Process Effects
effects_.emplace_back(std::make_unique<EffectBloom>());
effects_.emplace_back(std::make_unique<EffectMonitor>());
// effects_.emplace_back(std::make_unique<EffectGlitch>());
Bloom und Monitor werden nur hinzugefügt, wenn Shader verfügbar sind. Um mehrere Effekte anzuwenden, wechselt FinishDrawing zwischen zwei Zielen: Die Ausgabe eines Durchlaufs wird zur Eingabe des nächsten.
| Effekt | Status | Funktion |
|---|---|---|
| Bloom | Implementiert und aktiv | Zeichnet das Bild mit halber Auflösung weich und addiert das Ergebnis zum Originalbild. |
| Monitor | Implementiert und aktiv | Wendet den Monitor-Shader mit Auflösung und Zeit als Parametern an. |
| Glitch | Experimentell; deaktiviert | Klasse und Shader existieren, die Einbindung in die Pipeline ist jedoch auskommentiert. |
| Invertierung | Experimentell; nicht verbunden | Klasse und Shader existieren; RenderManager fügt den Effekt nicht zur Kette hinzu. |
Die Bezeichnung experimentell beschreibt die aktuelle Einbindung. Sie sagt keinen geplanten Aktivierungstermin aus.
Die vier Bloom-Schritte
Szenenbild
↓
1. Downsample → Textur A, halbe Breite und Höhe
↓
2. Blur (vertikal) → Textur B
↓
3. Blur (horizontal) → Textur A
↓
4. Additive Komposition: Original + Textur A
EffectBloom lädt Default.vert, Downsample.frag, Blur.frag und Additive.frag aus Content/Shaders. Die Zwischentexturen erhalten ihre Größe beim Erstellen des Effekts.
Dieser Aufbau erlaubt es, die vorhandenen Durchläufe zu beschreiben; veröffentlichte Messungen für eine prozentuale Leistungssteigerung gibt es nicht.
Ansichten und Koordinaten
Der Manager bietet zwei einfache Operationen an:
void RenderManager::SetView(const sf::View &view) {
target_.setView(view);
}
void RenderManager::ResetView() {
SetView(target_.getDefaultView());
}
Damit wird auf die 2D-Ansichten von SFML zugegriffen. Es gibt weder einen CameraManager, eine 3D-Kamera noch eine automatische Verfolgung. CursorManager erlaubt die Abfrage der in eine sf::View umgerechneten Cursorposition.
Die Methode für Größenänderungen in Engine protokolliert die neue Fenstergröße, erstellt die Renderziele aber nicht neu. Das ist keine vollständige Unterstützung dynamischer Auflösung.
Partikel
ParticleManager verwaltet Partikel mit Position, Geschwindigkeit, Beschleunigung, Lebensdauer, Größe und Farbe. Update bewegt sie weiter und entfernt abgelaufene Partikel; Render zeichnet Quadrate, deren Deckkraft mit der Zeit abnimmt.
Die Standardgrenze beträgt 128 Partikel. Der Vektor reserviert diese Kapazität, und Emit verwirft neue Partikel bei Platzmangel oder ungültiger Lebensdauer. Die Grenze ist eine Implementierungseinstellung, keine Messung der maximalen Engine-Kapazität.
Die Szene entscheidet, wann die Partikel aktualisiert und gezeichnet werden. Engine entfernt sie beim Szenenwechsel. Runner verwendet das System für Bewegungsstaub.