Für den blauen Himmel bei Tag sowie für das Morgen- bzw. Abendrot ist physikalisch gesehen die sogenannte Rayleigh-Streuung verantwortlich. Hierbei werden die einfallenden Lichtstrahlen an Teilchen (Luftmolekülen) in der Atmosphäre gestreut, deren Durchmesser deutlich kleiner sind als die Wellenlängen des sichtbaren Lichts. Während rotes Licht die Atmosphäre nahezu ungestört durchqueren kann, wird blaues Licht sehr viel stärker gestreut.
Tutorial 29 demonstriert Ihnen, wie sich besagte Streulichtberechnungen im Rahmen des Post-Processings durchführen lassen. Hierbei werden zwei Methoden unterstützt:
Methode 1: Darstellung einer einzelnen Atmosphäre (sollte für einen Planeten in unmittelbarer Nähe zur Kamera verwendet werden)
Notwendige Vorbereitungen für die Streulichtberechnungen:
PostProcessingEffects->
Begin_InsideAtmosphereCameraSpacePosAndDepthRendering();
AtmosphereRendering->Render_AtmosphereCameraSpacePosAndDepthFromInside(
&g_ViewProjectionMatrix, &g_CameraPosition,
&PlanetTestPosition, AtmosphereScale);
PostProcessingEffects->
Stop_InsideAtmosphereCameraSpacePosAndDepthRendering();
Begin_InsideAtmosphereCameraSpacePosAndDepthRendering();
AtmosphereRendering->Render_AtmosphereCameraSpacePosAndDepthFromInside(
&g_ViewProjectionMatrix, &g_CameraPosition,
&PlanetTestPosition, AtmosphereScale);
PostProcessingEffects->
Stop_InsideAtmosphereCameraSpacePosAndDepthRendering();
Funktionen für die Streulichtberechnungen:
PostProcessingEffects->Calculate_ScreenSpaceAtmosphere_PointLight(
&g_CameraViewDirection, &LightPosCameraSpace,
&LightColor,
&AtmosphereRendering->CameraSpacePosition,
AtmosphereScale, PlanetaryScale,
RayleighScattering_WeightFactor,
MieScattering_WeightFactor);
PostProcessingEffects->Calculate_ScreenSpaceAtmosphere_DirectionalLight(
&g_CameraViewDirection, &NegLightDir, &LightColor,
&AtmosphereRendering->CameraSpacePosition,
AtmosphereScale, PlanetaryScale,
RayleighScattering_WeightFactor,
MieScattering_WeightFactor);
&g_CameraViewDirection, &LightPosCameraSpace,
&LightColor,
&AtmosphereRendering->CameraSpacePosition,
AtmosphereScale, PlanetaryScale,
RayleighScattering_WeightFactor,
MieScattering_WeightFactor);
PostProcessingEffects->Calculate_ScreenSpaceAtmosphere_DirectionalLight(
&g_CameraViewDirection, &NegLightDir, &LightColor,
&AtmosphereRendering->CameraSpacePosition,
AtmosphereScale, PlanetaryScale,
RayleighScattering_WeightFactor,
MieScattering_WeightFactor);
Methode 2: Darstellung mehrerer Atmosphären (sollte verwendet werden, wenn mehrere Planeten in größerem Abstand zur Kamera sichtbar sind)
Notwendige Vorbereitungen für die Streulichtberechnungen:
PostProcessingEffects->Begin_AtmosphereParameterRendering();
AtmosphereRendering->Render_AtmosphereParameter(&g_ViewProjectionMatrix,
&g_CameraPosition, &PlanetTestPosition,
AtmosphereScale, PlanetaryScale,
RayleighScattering_WeightFactor,
MieScattering_WeightFactor);
PostProcessingEffects->Stop_AtmosphereParameterRendering();
AtmosphereRendering->Render_AtmosphereParameter(&g_ViewProjectionMatrix,
&g_CameraPosition, &PlanetTestPosition,
AtmosphereScale, PlanetaryScale,
RayleighScattering_WeightFactor,
MieScattering_WeightFactor);
PostProcessingEffects->Stop_AtmosphereParameterRendering();
Funktionen für die Streulichtberechnungen:
PostProcessingEffects->Calculate_ScreenSpaceMultipleAtmospheres_PointLight(
&g_CameraViewDirection, &LightPosCameraSpace,
&LightColor);
PostProcessingEffects->
Calculate_ScreenSpaceMultipleAtmospheres_DirectionalLight(
&g_CameraViewDirection, &NegLightDir, &LightColor);
&g_CameraViewDirection, &LightPosCameraSpace,
&LightColor);
PostProcessingEffects->
Calculate_ScreenSpaceMultipleAtmospheres_DirectionalLight(
&g_CameraViewDirection, &NegLightDir, &LightColor);
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.
GraphicsAndPhysicsFrameworkDemo29.zip