ImagesDescription
Advanced Procedural Sky System

Natural environment showcasing procedural terrain (bottom-left & top-left) & mountains ― all lit by sky system (UDK).

Advanced Procedural Sky System

Sunrise time-lapse mosaic demonstrating dynamic aesthetic properties of sky shader (UDK).

Advanced Procedural Sky System
 
Advanced Procedural Sky System
 
Advanced Procedural Sky System

Modular hill assets lit by sky system (UDK).

Advanced Procedural Sky System

Modular hill texture sheets.

Advanced Procedural Sky System

Overview of skydome material, depicting procedural cloud generation & cubemap based lighting function (bottom-centre).

Advanced Procedural Sky System

Mosaic depicting lighting variation throughout 24-hour cycle (UDK).

This project consists of a dynamic 24-hour skydome and image-based lighting system providing fake global illumination. As the sun completes its daily cycle, scene assets (including terrain) are dynamically lit by a series of cubemaps in synchronisation to the sky. It was made for Unreal Development Kit prior to the widespread adoption of physically-based rendering and image-based lighting in realtime engines. At the time, this system was quite advanced.

The position of the sun, stars and moon, and the colouration of the clouds, sky and sun are all driven by a single floating-point number indicating time of day. With the standard Phong shader model, a material’s specular and diffuse intensities derive from two dot product calculations containing light, normal, and camera direction vector terms. My UDK material simply replaces the two dot product calculations with cubemap terms: one set for diffuse reflectence and one set for specular reflectence.

Here is the Phong shader model in mathematical notation:

\sum\limits_{m \in \textbf{lights}} \left (k_{d} { \left ( \vec{L_{m}} \cdot \vec{N} \right ) } i_{m,d} + k_s { \left ( \vec{R_{m}} \cdot \vec{V} \right ) ^{\alpha}} i_{m,s} \right )

The expressions \left ( \vec{L_{m}} \cdot \vec{N} \right )   and \left ( \vec{R_{m}} \cdot \vec{V} \right ) ^{\alpha}   are the ones replaced by cubemap terms.