Skip to content

Ozone Absorption

The effects of Ozone Absorption in a Single Atmospheric Scattering model. Made with C++ and Vulkan.

Overview

The aim of this research is to investigate how incorporating an additional physical effect, such as ozone absorption, influences the perceived colour of the sky (as well as perceived realism), and how using different phase function approximations affects both the visual result and the computational performance of real-time rendering models.

More specifically, how does this additional physical effect influence the perceived color of the sky in a Single-Scattering Atmospheric Scattering Model. So in short, the question I sought out to answer was:

How does a single-scattering atmospheric scattering model compare visually and computationally when extended with ozone absorption and alternative phase function approximations?

Performance differences can be measured directly through profiling. Evaluating visual differences, however, is inherently subjective. To address this, a pairwise comparison survey was conducted where participants selected the more realistic image without knowing which model was used.

Process

The project is built on a physically-based single scattering model, implemented from scratch using Vulkan. Unlike many real-time approaches, this implementation avoids lookup tables and instead evaluates the scattering integrals directly in the shader using numerical integration.

Model

Rayleigh and Mie scattering are evaluated separately using numerical integration.

Ozone

Added as an absorption term, subtly shifting sky colour without scattering.

Integration

Midpoint sampling along the view ray, sample count controls quality vs cost.

Shader Flow

Vertex Shader

Performs numerical integration along the view ray & outputs accumulated Rayleigh and Mie scattering.

Fragment Shader

Applies phase functions & computes final colour contribution.

Post Processing

HDR rendering with exposure tone mapping.

Pairwise Comparison

Ozone
No Ozone
Ozone
No Ozone
Ozone
No Ozone

Results

Survey Findings

Blind pairwise comparison (44 participants)
- High sun: ozone preferred
- Low sun: non-ozone preferred

Performance

Ozone absorption and phase function selection introduce negligible overhead.
- Ozone absorption: minimal cost
- Phase function: negligible impact

Controls

Adjust Sample Count

Use the '+' and '-' keys to increase or decrease the sample count along the scattering ray. The default value is 16 samples.

Scattering parameter g

Use the '3' key to increase the scattering parameter g. Use 'L-Shift + 3' to decrease it. The default value is -0.990.

Sun Intensity

Use the '4' key to increase the sun's intensity. Use 'L-Shift + 4' to decrease it. The default value is 20.

Exposure

Use the '8' key to increase the exposure value. Use 'L-Shift + 8' to decrease it. The default value is 2.0.

Speed

Use the 'R-Shift' key with any of the aforementioned settings to speed up the rate of change.

Light Preset

Use the '9' key to go to the next set sun angle. Use 'L-Shift + 9' to go to the previous one. The set angles are low, medium and high. The default value is at a low sun angle.

Ozone Toggle

Use the 'O' key to toggle Ozone Absorption on and off. The default value is on.

Phase Function Toggle

Use the 'F' key to toggle between the following phase functions: Henyey-Greenstein, Cornette-Shanks, and Double Henyey-Greenstein. The default value is Henyey-Greenstein.

HDR

use the 'Tab' key to toggle HDR Rendering on or off. The default value is on.

Movement

Use the 'WASD' keys to move forwards, left, backward, and right. Use the 'QE' keys to move down and up.

Rotation

Use 'LMB + Drag' to rotate the camera.

Select an item

Hover or tap a feature to see its description.

Images of Results

Sunset with Ozone
Sunset with Ozone
Late Morning with Ozone
Late Morning with Ozone
High Noon with Ozone
High Noon with Ozone
Sunset without Ozone
Sunset without Ozone
Late Morning without Ozone
Late Morning without Ozone
High Noon without Ozone
High Noon without Ozone

Read More