Introduction to Precomputed Realtime GI
In Unity, there are two distinct techniques available for precomputing global illumination (GI), or bounced lighting. These are Baked GI and Precomputed Realtime GI. This tutorial focuses on Precomputed Realtime GI.
When working with Precomputed Realtime GI, a lighting precompute is the process of calculating the bounce of light around the static geometry within a Scene in the Unity Editor and storing this data for use at run time. This process reduces the number of lighting calculations that must be performed at run time, allowing realtime bounced lighting while maintaining interactive framerates.
When using Baked GI, traditional lightmap textures are generated offline during the precompute process. These textures then exist as assets within the project and cannot be changed at run time. Precomputed Realtime GI does not create lightmap assets in the same way. Instead, lighting data is saved as a Lighting Data Asset which contains the information needed to generate and update a set of low resolution lightmaps interactively, at run time.
Unless our Scene has been properly prepared and optimized, the time it takes to complete these calculations can become excessive. In this tutorial, we will learn how to optimize a Scene for Enlighten (the backend for Unity’s Precomputed Realtime GI and Baked GI solutions) so that lighting precomputes take minutes rather than hours.
Over the course of the document we will cover:
How to determine an appropriate lighting resolution for our Scenes.
What Charts are and how they affect our precompute times.
How to start the precompute process.
Using probe lighting to reduce the complexity of our lighting solution.
Improving auto-unwrapped UVs generated by Unity’s Precomputed Realtime GI.
What Clusters are and how they are used to generate globally illuminated lighting.
Using Lightmap Parameters to fine-tune our lighting on a per-object basis.
Once we have learned and applied these techniques, we can leverage the benefits of using Precomputed Realtime GI: fast lighting iteration times, the ability to experiment more rapidly during the lighting process and realtime bounced lighting during gameplay.
Reducing precompute times from hours to minutes
In the Lighting Tutorial Scene used for this tutorial, precomputing the lighting with a default, non-optimized setup took around 7.5 hours on our test machine. For a Scene of this complexity, clearly this is unacceptable.
Default Scene: Precompute took 7.5 hours. Optimized Scene: Precompute took 2.25 minutes.
Following around 30 minutes of Scene preparation using the techniques covered in this tutorial, the precompute time was 2.25 minutes for a production-quality result. Considering that we can rapidly iterate on Scene lighting without needing to re-calculate GI and change GI lighting during gameplay, the attractive benefits of this technology are quickly apparent.
Downloading assets for this tutorial
Throughout this tutorial we will be referring to the Lighting Optimisation Tutorial project available from the Unity Asset Store.
In this written tutorial, we will be using the example Scenes contained within the Scenes/Article folder: LightingTutorialOptimal, LightingTutorialNonOptimal and LightingTutorialStart.
LightingTutorialOptimal has been set up according to this tutorial and is intended to represent an example of how production-ready lighting results can be achieved with minimal precompute time using Unity’s Precomputed Realtime GI.
LightingTutorialNonOptimal reflects a lot of the common problems we see in projects that either don’t finish baking, or take an unacceptably long time. This is a good reference for how Scenes should not be configured.
LightingTutorialStart will be the Scene which we are working with throughout this tutorial. As we follow the steps laid out in this tutorial, we will take this Scene to a completed, production-ready result.