This is the documentation for Enlighten.

How Enlighten works


The Enlighten SDK provides tools and libraries you can integrate with your engine to build the Enlighten lighting pipeline. Enlighten integrates with common methods of authoring a scene for a real-time renderer.

A typical renderer based on a hardware-accelerated API operates on a scene containing geometry in the form of triangle meshes. The definition of a mesh generally corresponds to the smallest unit of geometry that can be drawn with a single API call. Meshes can be composed together to form more complex objects or pieces of scenery. Some meshes are static, and others can move at runtime. Some meshes are rigid; others can be deformed by skeletal animations.

The Enlighten pipeline

The two key components of the Enlighten pipeline are the Enlighten precompute and the Enlighten runtime.

The Enlighten precompute takes your scene geometry as input, then computes and outputs optimized runtime data.

The Enlighten runtime takes the precomputed Enlighten runtime data as input, along with the lighting configuration and material colour information provided by the engine. The Enlighten runtime solves radiosity and produces three types of output: lightmaps, probes and cubemaps. These Enlighten outputs contain only diffuse indirect illumination, consisting of multiple bounces from many light sources. Your renderer samples these outputs to provide indirect lighting for each mesh.

Enlighten outputs use widely supported data formats that can be used with any renderer or graphics API. 

Geometry and material coloursDirect illumination onlyBoth direct and indirect illumination

Radiosity

Enlighten uses a version of the radiosity algorithm to compute indirect lighting. The Enlighten precompute divides surfaces of the scene into chunks, called clusters, and then computes visibility form factors between all pairs of clusters. The Enlighten runtime progressively solves the radiosity equation, with one bounce per iteration for an unlimited number of iterations.

Smaller cluster sizes provide greater accuracy in the indirect lighting, but increase the computation required in the precompute. For real-time rendering, relatively large clusters provide sufficient accuracy with minimal computation time.

Surfaces divided into clustersResult of radiosity computationIndirect lighting output

Asynchronous updates

The Enlighten runtime runs entirely asynchronously on the CPU alongside the main renderer, without blocking rendering. It's generally not necessary to update the indirect lighting at the full frame rate. Decoupling Enlighten updates from the rendering means you can tune performance by trading processing time for latency in the lighting. This is particularly useful when the renderer is already pushing the GPU to its limit to hit a fixed framerate target, such as 60FPS on consoles, or even 90FPS in VR/AR applications.

Fast iteration

Though Enlighten offers complete control over all aspects of scene configuration, in practice, much of the configuration process should be automated. Before running the Enlighten precompute, you can change the lightmap resolution, light probe density and the location of cubemaps used for reflections. After the precompute, the lighting artist can iterate on the lighting setup with instant feedback on their changes. The artist can then tweak and experiment with the lighting until they get the result they want.

Enlighten lightmaps

Your renderer can sample Enlighten lightmaps to provide diffuse indirect lighting for both static and rigid meshes. Enlighten can generate lightmap UV coordinates automatically, and provides tools to help produce efficient UV layouts. This means that, instead of specifying a fixed-size lightmap for each mesh, the artist can specify the size of a lightmap pixel in world units and the UV layout is automatically adjusted.

Enlighten lightmaps contain only low-frequency indirect lighting and require much lower resolution than traditional, baked lightmaps. A typical scene might use a resolution of one pixel per meter. The runtime cost of Enlighten lightmaps increases in proportion with the number of pixels updated. You can adjust the pixel size to find a good balance between cost and quality.

The image above shows how Enlighten maps lightmaps to surfaces. Areas of a given colour are continuous areas of the lightmap UV space, known as charts. For example, the blue wall in the image is one chart.

There's usually a hard edge in the Enlighten lighting where two charts meet. The Enlighten lightmap resolution is much lower than static lightmap baking typically requires, but is more than enough for high-quality indirect lighting.

Enlighten probes

Enlighten probes are sampled to provide diffuse indirect lighting both for static and rigid meshes, and meshes that move or deform at runtime.

It can be difficult to produce efficient lightmap UVs for meshes with complex organic shapes or many small parts; these meshes might be more efficiently lit using light probes.

Enlighten light probes provide lighting for a volume of space, encoded using the spherical harmonic basis functions. The Enlighten runtime determines the nearby probes to sample from based on the location of each mesh.

Enlighten provides tools to automate the placement of probes in the scene. The artist only needs to specify the desired probe spacing for each area of the scene using simple tools.

The image above shows the results of the automatic probe placement. There is a lower density of probes in the middle of the room, because the frequency of the variation of the lighting generally reduces as the distance from a surface increases.

You may also choose to use your own solution for placing and interpolating between probes.

Enlighten cubemaps

Enlighten cubemaps capture the scene from a given location. They're used to create reflections in glossy surfaces. This technique is known as local image-based lighting.

The artist places each enlighten cubemap in the scene, and defines a volume (typically a box or sphere) within which reflections from the cubemap are applied to surfaces.

Cubemap reflections are effective for materials with medium roughness, but cannot produce accurate mirror reflections.