# Universe En proceduriell 3D-universumsgenerator för Windows med C#/.NET 10, Silk.NET och OpenGL 3.3. ## Starta ```powershell dotnet run --configuration Release --project src/Universe.App/Universe.App.csproj ``` Appen börjar framför **Jorden (`earth`)** i vårt solsystem i cell `(0,0,0)`. Startmål och vy väljs i [config.json](config.json). Solen och de åtta planeterna definieras i [KnownSolarSystem/solar-systems.json](KnownSolarSystem/solar-systems.json). Där finns även Jordens måne, Saturnus ringar, planeternas axellutning, atmosfärer och material. Jordens färg- och höjdkartor ligger i `KnownSolarSystem/Textures/`. Se [katalogens dokumentation](KnownSolarSystem/README.md) för fler solsystem och för kombinationen heightmap + noise. [Content/README.md](Content/README.md) beskriver markmaterialen och den regionala höjdrutan för Alperna. Materialkatalogen och varje planets `materials`-inställningar är redigerbara i JSON. | Kontroll | Funktion | | --- | --- | | WASD + mus | Fri flygning och riktning | | P | Öppna/stäng menyn. Välj Play, Free Camera, Debug, Benchmark Earth, Benchmark Unknown eller Quit med musen eller piltangenter och Enter | | Space / Ctrl | Upp / ner relativt kameran | | Mushjul | Logaritmisk hastighet, 0,1 m/s till 1 000 000 c | | Q | Mjuk flygning till närmaste planet | | 1–9 | Flyg till planeten på motsvarande plats i `startup.planetHotkeys` i `config.json` | | F2 | Mjuk flygning till en bergsvy nära ytan; hastigheten sänks till 1 200 m/s | | F3 | Närbild av närmaste stjärna | | F4 | Mjuk flygning till närmaste ringsystem; lokala isstenar och låg flyghastighet | | F1 | Släpp / fånga muspekaren | | F5 | Ladda om shaders; Debug läser direkt från shaderfilerna | | F6 | Flyg till en solbelyst havsvy nära vattenytan; hastigheten sänks till 10 m/s | | F7 | Flyg till en vy ovanför närmaste molnlager; hastigheten sänks till 100 m/s | | Esc | Stäng pausmenyn, eller avsluta när menyn är stängd | **Play** växlar till förstapersonsläge. WASD går längs marken, musen ser sig omkring, Space hoppar och Ctrl hukar. Spelaren dras mot närmaste fasta planet och orienteras efter dess lokala gravitation. Från stora avstånd används en snabbare inflygning för att landningen ska vara spelbar. **Free Camera** återställer fri flygning. Pausmenyn stoppar rörelsen medan den är öppen. Gasjättar har ingen fast mark och väljs därför inte som landningsmål. **Benchmark Earth** kör en fast 72-sekunders kameraresa vid Jorden: rymdvy, inflygning och separat mjuk bromsning sista 10 km mot Alpernas Copernicus-terrängdata, följt av en långsam promenadslinga med kameran 1,8 m över marken. **Benchmark Unknown** kör samma resa på den största tillgängliga proceduriella stenplaneten bland närliggande system som är större än Jorden; dess högre terrängamplitud ger kraftigare proceduriell relief. Blicken sveper runt under promenaden. När testet är klart återgår kameran till sin ursprungliga vy mot Jorden. Panelen uppe till höger visar målplanet och FPS över tid, medelvärde, lägsta bildfrekvens och 1 %-låg. Tryck P eller Esc för att avbryta och öppna menyn. Benchmarken återställer Debug-läget så debug-prober inte påverkar mätningen. Välj **Debug** i P-menyn för en panel till vänster med asynkron GPU-tid för separata renderpass och varje ritad planet, CPU-tid för renderingsanropet, FPS och terrängens LOD/chunkstatus. En gång var åttonde bildruta gör debugläget dessutom en osynlig extrarendering av den dyraste planeten med en effekt avstängd. Panelen visar tidsvinsten jämfört med normalrenderingen för material, molnskuggor, bergsskuggor, planet-/ringskuggor och ytdetalj-noise. Varje effekt mäts separat, och skillnaden medelvärdesbildas över de senaste matchande mätningarna. Proberna är asynkrona och påverkar FPS något när debugläget är på; GPU FRAME visar den vanliga bildrenderingen utan probe-drawen. Skuggorna ingår också i planetens ordinarie tid eftersom de räknas i samma terrängshader. ## Värld och grafik - Kända system från JSON ersätter proceduriell generering i sina tilldelade celler. Övriga 100 AU-celler bestäms av global seed och `SectorCoordinate(long X, long Y, long Z)`. Positionerna behåller dubbelprecision och konverteras till kamerarelativa GPU-koordinater. - Systemens centrum förskjuts med 3D-noise. Stjärnor, lutade elliptiska planetbanor och månar får olika seedade riktningar, faser och avstånd. Alla himlakroppar hålls inom sina celler. - Berg består av domain-warped ridged multifractal-noise. Samma höjdfält används för kollisionsytan, CPU-meshar och GPU-skuggning. - Terrängen är en adaptiv cube-sphere med quadtree-chunks. Rutor utanför synfältet och bakom horisonten sorteras bort med konservativa gränser för berg, dalar och skarvar. Närmaste terräng förfinas först, med högre detalj nära kameran och grövre geometri på avstånd. Föräldrachunken visas tills synliga barn är klara. Chunks förankras i dubbelprecision så närflygning behåller precisionen. - Material varierar med höjd, lutning, mineral-noise och geologiska lager. Terrängnormaler beräknas från höjdfältet vid meshgenerering, kompletteras med finare normaldetaljer och används tillsammans med höjdfältet för bergsskuggor. Alla systemets stjärnor bidrar med ljus och planetförmörkelser. - Atmosfären integrerar Rayleigh- och Mie-spridning längs både kamera- och solljusstrålar. Djupbufferten begränsar integrationen framför marken. Det ger blå himmel, färgade horisonter, dis mellan berg och en atmosfärsrand från rymden. - Stjärnorna har långsamt animerad plasma, filament, aktiva områden, granulation och kantförmörkning. Korona, HDR-bloom, ACES-tonmappning, kantutjämning och dithering behandlas i separata pass. - Bakgrunden består av ett seedat stjärnfält och stjärnorna i granncellerna. Atmosfär och dagsljus dämpar stjärnfältet nära marken. - Gas- och isjättar renderas som ljussatta, tillplattade gasvolymer med band, polarfärger och dimma vid inflygning. De har ingen terrängmesh eller fast kollisionsyta. - Ringarnas optiska profil innehåller oregelbundna band och separata luckor. Samma täthet styr skuggor och lokal generering av isstenar. Nära ringarna ersätts ringmaterialet gradvis av instanser med detaljbyte mellan punktpartiklar och oregelbundna 3D-stenar. Inställningar finns i planetens `gas` och `rings` i JSON; se katalogens dokumentation. - Ringstenar får upp till 81 920 trianglar på riktigt nära håll, med gradientnoise, individuella proportioner, kratrar och finare ytstruktur. `rings.rocks.asteroid` styr geometrins LOD och detaljbudget. - Varje sol har avståndsdämpade HDR-strålar, halo och färgade linsreflexer. Glöden förblir synlig långt ut i systemet och kontrolleras mot framförliggande objekt. Solens `glow`-block styr effekten. - Jorden har ett separat sfäriskt hav med animerade vågor, Fresnelreflektion, solljusglitter, skum, refraktion och djupberoende ljusabsorption. Havsbotten och kustmasken används av både terrängen och kollisionen. `ocean` i planetens JSON styr vattenmaterialet; F6 visar havet nära ytan. - Sfäriska 3D-moln använder fraktal noise och Worley-noise, vind, självskuggning och ljus från systemets solar. Valfria equirektangulära gråskalekartor styr den geografiska täckningen; jordens `Content/Clouds/earth-clouds.png` används i solsystemets JSON, där vitt betyder moln och svart klart. Molnen skuggar mark och hav, dämpar solglöden och speglas i vattnet. `clouds` i planetens JSON styr karta, utseende och kvalitet. Detta är en visuell realtidsprototyp. Banorna är statiska och terrängen använder proceduriell relief; ingen hydrologisk erosionssimulering eller atmosfär med multipel spridning beräknas. ## Projekt - `src/Universe.Core`: koordinater, systemgenerering, noise, terräng, streaming och svept kollision. - `src/Universe.App`: fönster, kamera och OpenGL. Shaderkoden finns under `Graphics/Shaders/` och bäddas in i bygget. - `tests/Universe.Tests`: koordinater, determinism, cellgränser, terrängkanter, normaler och FTL-kollision. ## Bygg och verifiera ```powershell dotnet build Universe.sln --configuration Release -m:1 dotnet test tests/Universe.Tests/Universe.Tests.csproj --configuration Release ``` Kontrollera även den faktiska GPU-höjdfunktionen mot CPU/kollision med: ```powershell dotnet run --configuration Release --project src/Universe.App/Universe.App.csproj -- --validate-graphics ``` Kontrollen läser ett separat numeriskt GPU-testfält och stoppar appen om höjdfälten skiljer sig för mycket. Även Jordens heightmap, axellutning och extra noise jämförs med CPU/kollision. Den vanliga renderingens färgbuffert använder 16-bitars flyttal; testfältet använder 32-bitars flyttal. En marknära terrängvy med ruttider och diagnostiska, synkroniserade mätningar per renderingspass kan köras med `dotnet run -c Release --project src/Universe.App -- --terrain-perf-report`. Resultaten varierar med vy, upplösning, laddade rutor och maskin; synkroniseringen i rapporten påverkar också tiderna. Atmosfärens integrationsmodell bygger på principerna i [GPU Gems 2, Accurate Atmospheric Scattering](https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-16-accurate-atmospheric-scattering). ## Skärmbilder Bilder direkt från Release-appens OpenGL-rendering: ![Jorden som startmål med de bifogade kartorna](artifacts/earth-start.jpg) ![Jordens animerade hav med reflektioner och solglitter](artifacts/earth-ocean.png) ![Berg, atmosfär och måne](artifacts/surface-panorama.jpg) ![Stjärnans plasma och glöd](artifacts/star-view.jpg) Även standardvyn för tangent 2 finns sparad i `artifacts/surface-view.jpg`. Närbild och avståndsdämpad solglöd, sparade från den riktiga renderingskedjan: ![Asteroid med kratrar i Saturnus ringar](artifacts/asteroid-in-rings.png) ![Solen med synlig glöd från 30 AU](artifacts/sun-from-30au.png) Automatiska GPU-kontroller och nya bilder kan genereras med `--graphics-report` respektive `--scene-report`. Se katalogens dokumentation för kommandon och JSON-inställningar.