Pic 1: Time-lapse of a full cycle achieved in CRYENGINE
In this tutorial we will be going over the process of creating a day-night cycle using the Environment Editor inside CRYENGINE, which will serve as a good basis for most Earth like lighting scenarios. This will cover setting up a few different times of day as well as the transitions between them, while also staying within the boundaries of physically accurate lighting.
Before we get into the details please keep in mind that all of the parameters in the Environment Editor contribute to the final look of your level and they are all affecting each other. The influence of some of them only becomes apparent when certain conditions are met so creating a polished lighting scenario requires quite a lot of back and forward between different elements. This tutorial is not a step by step workflow, it’s aimed at giving you a better understanding of the system and the things you can achieve by controlling the parameters made available by it.
It is important to note that CRYENGINE uses two distinct fog models to create atmospheric effects. For high quality results we are using a voxel-based volumetric fog model designed to accurately interact with all entities in your level. Keep in mind that this has a noticeable impact on performance, so as an alternative for the lower end we provide the option to use regular fog. In a nutshell, Volumetric Fog allows lights, cubemaps, and shadow to interact with the global/local atmosphere, whereas regular fog does not. We will be covering both of these options in this tutorial.
As mentioned in the beginning it is important to stay within physically accurate illuminance values when setting up any lighting scenario in order to get the most out of our PBS pipeline, so depending on the result you are trying to achieve, some research might be in order as to what your illuminance values should be. At the same time getting the desired look for your environment is always the highest priority so it takes some fine tuning to achieve something that looks good but still follows real world values.
To open the Environment Editor go to Tools on the main toolbar and select the Environment Editor from the list. The layout of this tool incorporates a number of different elements. On the left side we have the Presets list, under it there are the Sun orientation/angle settings and next to these there’s the list of customizable parameters. On the right side you can find the curve editing tools, the timeline at the top, a visual representation of the selected property under it and at the bottom we have the Start/Current/End time values as well as controls for playing the cycle.
Pic 2: Environment Editor Layout
To change the time of day simply drag the triangle in the timeline to either side. You cannot go beyond the 0 and 1 values since they represent a full 24 hour cycle.
The Environment Editor contains a wide number of advanced parameters that would allow you to fully customize the lighting in your level as well as the appearance of the sky. These parameters are split into logical groups that each control different aspects of your environment.
The curve editor is used to control the transition between different values of the same parameter throughout the day. It will automatically create a key for you at the current time once you change the value.
We won’t be going over all of these parameters as some of them don’t require any changes for the generic earth like scenario we’re aiming for. We will however cover the sections that we are changing to get a better idea of what they control. We will also go through the process of creating smooth transitions as the time of day changes by using the curve editor.
In this example our goal is to achieve a generic day-night cycle at 45° latitude.
We will begin by opening up our example level day-night_cycle.cry. As you probably noticed the scene is already set up with the cycle, to start from scratch we will have to create a new environment preset. To do that right click on the left side under Presets/File view - > Add -> New and save it as day-night_cycle.xml. To open up an existing preset you will have to select Add -> Existing. Presets are saved in the \gamesdk\libs\environmentpresets folder.
Next we need to set up the Sun direction and the latitude. These values are located under the preset list on the left side of the editor. Set the Sun Direction to 180° so it rises in front of the camera. For the latitude we have to change the NortPole..Equator..Southpole value to 45. These two values are not stored in the environment preset file so you can use the same preset with different settings for orientation and latitude.
The first thing that we need to do before we start setting up our cycle is change the Film Curve Whitepoint to 4 ( default is 1 ). This can be found under the HDR group in the Environment Editor. We will also be using the new and improved Eye Adaptation mode, to do this open up the console and simply type in r_HDREyeAdaptationMode 1. These 2 values dramatically change the sensitivity to light so they need to be set up properly before changing any of the other parameters.
Pic 3: Location of the Film Curve Whitepoint setting.
Now we are ready to start creating our day-night cycle.
Setting up the Sun
The Sun category contains the settings that affect the color and the intensity of the direct sun light.
Sun Color :
We start off by setting the current time to 12:00 and giving it a slightly yellow tint ( 240, 225, 210 ). This will create a key at that time and update the preview to represent the change we just made. Select the newly created key and set the In/Out tangent to linear.
This value needs to remain constant throughout the day so we will create another key at 09:00 and assign it the same color. For this one set the In tangent to Zero and the Out to linear. Mirror the result at 15:00.
As it nears Dusk/Dawn the sun color transitions into a saturated orange, to set this up change the current time to 06:00 and assign it the appropriate color ( 170, 84, 0 ) and set both In/out tangents to Zero. Mirror this newly created key at the 18:00 time.
At this point it is worth noting that the Sun parameters are also used to control the Color/Intensity of the light coming from the moon, although the moon doesn’t move throughout the night.
To set this up we create a key at 05:56 and give it a blue tint ( 140, 160, 176 ). To keep this constant over the whole night we need additional keys with the same value at 00:00, 18:04 and 23:59 respectively. Change the In/Out tangents for all of these keys to linear.
If you set this up correctly your preview and curves should look like this:
Pic 4: Screenshot of the Sun Color gradient preview and curves.
Sun intensity ( lux ) :
This property controls the illuminance of the sun and as mentioned previously it is important to keep this close to the physically based value. A quick search on the internet comes up with an average illuminance value of 100000 lux for bright sunlight.
Pic 5: Screenshot from the Wikipedia page containing the Illuminance values chart.
Change the current time to 12:00 and create a key with the value set to 120000. The reason why this is higher than real world values is some of the light gets absorbed by the materials giving them a final lux value that’s considerably smaller than the source. We will get back to this once we set up our Sky Light later on.
Now that we have the basis for our Sun Intensity laid out we can go ahead and set up the rest of the keys for this value.
The intensity of the sun diminishes as it gets closer to the horizon so to achieve that we need to set up a few more keys. Change the time to 08:00 and set the intensity down to 110000, do the same on the opposite side at 16:00.
As we get closer to sunset/sunrise the intensity drops very low. We will now create a key at 06:00 with the value set to 5 and mirror the value at 18:00.
Real world measurements read <1 lux values for moonlight, this number is way too small for the engine to still accurately render shadows coming from the moon, so we will stick with the same constant value of 5 for night time. For that we need to set up keys at 00:00 and 23:59.
Making sure the transitions between your keys are smooth your gradient and curves should look like this:
Pic 6: Screenshot of the Sun Intensity (lux) gradient preview and curves.
Sun Specular multiplier :
As you might have guessed this controls the specular contribution of the sunlight. For any realistic lighting scenario this value should always be kept at 1.
You’re probably wondering why we skipped all the way to sky light. The reason is a lot of the settings in the environment editor affect each other. It’s good practice to get the sun/sky settings nailed down before you go into setting up your fog.
Parameters in this section are solely used to compute the sun light scattering through the atmosphere effectively controlling the appearance of the sun disk as well as the hue of your sky. They do not directly affect the rendering of objects in the world (for example, lighting colors and intensities). They do however affect the overall illuminance of your scene through the use of Environment Probes as mentioned earlier.
Sun Intensity Multiplier
Change the time to 12:00 and set the intensity to 50. At 05:45 and 18:15 drop this value to 1. Create two more keys at 00:00 and 23:59 and set the value to 0. The transition from 0 to 1 gives us the effect of the sky brightening in the area where the sun is just about to set.
To get an accurate reading of the illuminance in your level you need to measure it on a surface that’s perpendicular to the sun. We already have a couple of planes set up for this purpose so all you need to do is set r_HDRdebug 1 in the console and simply look at the surface. Keep in mind that turning this on brightens the whole scene so don’t forget to turn it off once you’re done measuring your illuminance.
Pic 8: Planes facing the sun used for measuring full sunlight/shadow illuminance.
By looking directly at the surface we’re getting a reading of approximately 80000 lux. At this point the only source for our illuminance is the sun light so to refine this further we will have to enable the sky light to contribute to it as well.
In order to do that we will need to set up an Environment Probe. This handles indirect lighting effectively acting as ambient lighting that you would normally get from the sky. We won’t get into specifics about Environment Probes ( for that check the dedicated page Environment Probes ) but for now go to your Create Objects tab and under Misc there’s the Environment probe entity. Drag that into your scene, change its size to encompass your whole terrain, make it active and generate cubemap. Keep in mind that any changes that you do to your time of day will require regenerating the cubemap ( It’s recommended to do that with the entity turned off so it doesn’t pick up any lighting information from a previously generated cubemap ).
By doing this we are now getting blue tinted shadows as opposed to pure black and our lux value also jumped up to about 100000 while keeping the shadow illuminance at around 20000. A 1/5 ratio between fully lit/shadow areas is close to real world values.
Pic 9: Top - Fully lit area lux reading, Bottom - Shadow area lux reading
This controls how much the sun light is scattered by the atmosphere. Set this to 1 for the whole timeline.
The parameters that control the hue of the atmosphere are the Wavelength (R/G/B) values. We only need to set these once for the whole cycle.
Taken from the Wikipedia page on Diffuse Sky Radiation ( also known as Skylight ) we set these values at 650 (R), 550 (G), 450 (B).