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.
Teilchen, deren Durchmesser in etwa den Wellenlängen des sichtbaren Lichts entsprechen (Wassertröpchen/Nebel, Staubteilchen und Rauch), streuen das einfallende Licht unabhängig von seiner Farbe auf gleiche Weise. Dieses als Mie-Streuung bekannte Phänomen ist für den grauen Himmel bei Smog oder an einem regnerischen Tag verantwortlich.
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