Tutorial 20 – Procedural Galaxy Rendering (Stars, 3D Nebulae, Lens Flares)

Tutorial 20 richtet sich ebenso wie Tutorial 19 speziell an die Entwickler von Weltraum-Spielen. Während wir uns das letzte Mal mit der Simulation von einzelnen Sonnensystemen befasst haben, behandeln wir heute die prozedurale Erzeugung und Darstellung von Galaxien (sowohl von Kugelgalaxien als auch von Spiralgalaxien).
Nicht minder interessant als die Erzeugung ist die Darstellung der einzelnen Sterne und 3D-Nebelobjekte, denn es müssen mehrere tausend Objekte mit möglichst großer Performance gerendert werden. Möglich ist dies nur mithilfe von Geometry Instancing in Kombination mit Texture-Buffer-Objekten zum Speichern der für das Rendering benötigen Daten (Position, Skalierung, Textur-ID, etc.). Zur Vermeidung von Texturwechseln kommen anstelle einzelner Texturen zudem Texture-Array-Objekte zum Einsatz.



Rendering:

Galaxy->Render_Galaxy(PostProcessingEffects->
        SceneCameraSpacePosAndDepthTexture);

NebulaSystem->Render_NebulaObjects(&g_CameraPosition,
              &g_CameraViewDirection, &g_ViewProjectionMatrix,
              PostProcessingEffects->SceneCameraSpacePosAndDepthTexture);

LensFlares->Update_ViewDirection(&g_matView);
LensFlares->Prepare_Rendering_LensFlares_MultipleLightSources(
            PostProcessingEffects->SceneCameraSpacePosAndDepthTexture);

long SunID;

for(i = 0; i < Galaxy->NumOfSunsInsideLocalGroup; i++)
{
    SunID = Galaxy->SunTextureID[Galaxy->IDOfSunsNearTheCamera[i]];

    LensFlares->Render_LensFlares_MultipleLightSources(
            &g_ViewProjectionMatrix, &g_LensFlareColor[SunID],
            &Galaxy->CameraSpacePosition[Galaxy->IDOfSunsNearTheCamera[i]],
            g_LensFlareCameraDistanceValue, g_LightScaleFactorX[SunID],
            g_LightScaleFactorY[SunID], g_LensFlareScaleFactor[SunID],
            g_LensFlareIntensityDecrease);
}

LensFlares->Stop_Rendering_LensFlares_MultipleLightSources();



Hinweise zum Erstellen eines neuen Projekts:

  • Kopieren Sie den Ordner GraphicsAndPhysicsFrameworkImports ins Projektverzeichnis
  • Kopieren sie alle dll-Dateien sowie die Konfigurationsdatei ResolutionAndRendering.txt aus besagtem Ordner ins gleiche Verzeichnis, in dem sich auch die exe-Datei befindet (in unseren Programmbeispielen ist dies das Bin-Verzeichnis)
  • Binden Sie die folgenden Dateien in Ihr Projekt ein: GraphicsAndPhysics_Framework_Imports.h, GraphicsAndPhysics_Framework_Imports.lib, glew32.lib, glew32s.lib, glut32.lib. Die Glew- und Glut-Bibliotheken ermöglichen die Nutzung der aktuellen OpenGL-Spezifikationen unabhängig vom Framework.

GraphicsAndPhysicsFrameworkDemo20.zip