Ein Planet in C++17 und Vulkan, von Hand. 1000 km Radius, eine Welteinheit gleich ein Meter, durchgehend befliegbar vom Orbit bis auf Submeter-Detail, ohne Ladebildschirm. Kein UE5, kein Godot, keine Engine.
Eigenes Fenster, eigene Mathematik, eigener Bildlader, eigener Font-Atlas. Eine Engine hätte jedes Problem darin für mich gelöst und dabei alles mitgenommen, was ich daran gelernt habe.
Was schon da ist
Gelände
Würfelkugel mit Quadtree-LOD pro Fläche, Frustum-Culling und Geomorphing. Das Höhenfeld ist zweibandig: ein Kontinentalband mit fest acht Oktaven, damit sich die Küstenlinie nie bewegt, plus ein Detailband, dessen Oktavzahl mit der LOD-Stufe wächst. Der Normalisierer bleibt fest, sonst würde eine zusätzliche Oktave die vorhandenen umskalieren.
Plattentektonik
Die Wahrzeichen kommen nicht aus Rauschen. Zehn Fibonacci-verteilte Plattenkeime, und von rund 24 Grenzen tragen vier ein Gebirge. Ausgewählt nach ihrer Landlänge, nicht per Hash, denn per Hash lag eine Kette vollständig im Meer und eine weitere zu 93 Prozent. Jede Kette ist ein Gürtel aus einem bis drei parallelen Graten, 62 bis 118 km breit.
Material und Atmosphäre
Sechs triplanar projizierte Bodentexturen in einem Sampler-Array, gemischt über acht Vertex-Gewichte à ein Byte. Die Auswahl folgt den Klimazonen aus Höhe, Neigung, Breite und Feuchte, damit Materialgrenze und Farbgrenze dieselbe Linie sind. Dazu HDR-Offscreen mit Tonemapping, Rayleigh-Streuung mit Luftperspektive und Reversed-Z mit unendlicher Fernebene.
Schiff und Editor
Flugmodell mit Flugassistent, Cockpit mit Schaltern, Fahrwerk, Landung und Quantum-Antrieb zu sechs Außenposten. Im Kreativmodus ein Werkzeug-UI für alle Laufzeitparameter mit Live-Neuaufbau. Planeten sind Textdateien, und eine Tabelle speist Editor, Schreiber und Leser, damit die drei nicht auseinanderlaufen.
Gemessen, nicht geschätzt
| Messgröße | Wert |
|---|---|
| Landhöhe | p50 537 m, p90 1485 m, max 6478 m |
| Relief über 2 km Radius | p50 261 m, p90 1030 m, max 3619 m |
| Neigung | p50 6,8°, p90 27,0° |
| Gebirgsgürtel | 5,1 % der Landfläche |
| Feinste LOD-Stufe | 18, Zellen von etwa 0,48 m |
| Bildraten ohne Validierungsschicht | 104 bis 252 fps |
| Zusicherungen im kopflosen Test | 463 |
Zum Vergleich für das Relief: die Alpen liegen bei etwa 800 m, der Himalaya bei etwa 1500 m.
Was ich daran gelernt habe
Entscheidungen gehören in Vulkan-freie Header. Alles, was das Gelände bestimmt, steht in Headern ohne eine einzige Vulkan-Abhängigkeit. Deshalb kann ein kopfloses Testbinary sie festnageln, und deshalb lässt sich eine Behauptung über den Planeten messen statt nur anschauen.
Jede Schwelle sitzt auf einem gemessenen Quantil. Nie auf dem, was auf einer Skala von null bis eins vernünftig aussieht. Das ist die Regel, die ich am häufigsten verletzt und am teuersten bezahlt habe. Ein fBm mit Gain 0,38 füllt den Bereich nicht aus, es stapelt sich um die Mitte. Ein Band, das auf dem Papier sinnvoll wirkt, gibt einer Variante 99 Prozent der Fläche und macht die andere unerreichbar.
Ein Test, der auf acht Stichproben bestehen kann, misst nicht, was er behauptet. Drei meiner eigenen Tests waren so gebaut. Der Kammwanderungs-Test lief 64 km auf einer 1287 km langen Kette und erfüllte damit sein Toleranzband. Jetzt ist die gelaufene Länge Teil der Zusicherung.