forked from godotengine/godot-docs
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
290 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,279 @@ | ||
.. _doc_physical_light_and_camera_units: | ||
|
||
Physical light and camera units | ||
=============================== | ||
|
||
Why use physical light and camera units? | ||
---------------------------------------- | ||
|
||
Godot uses arbitrary units for many physical properties that apply to light like | ||
color, energy, camera field of view, and exposure. By default, these properties | ||
use arbitrary units, because using accurate physical units comes with a few | ||
tradeoffs that aren't worth it for many games. As Godot favors ease of use by | ||
default, physical light units are disabled by default. | ||
|
||
Advantages of physical units | ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
If you aim for photorealism in your project, using real world units as a basis | ||
can help make things easier to adjust. References for real world materials, | ||
lights and scene brightness are wildly available on websites such as | ||
`Physically Based <https://physicallybased.info/>`__. | ||
|
||
Using real world units in Godot can also be useful when porting a scene from | ||
other 3D software that uses physical light units (such as Blender). | ||
|
||
Disadvantages of physical units | ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
The biggest disadvantage of using physical light units is you will have to pay | ||
close attention to the dynamic range in use at a given time. You can run into | ||
floating point precision errors when mixing very high light intensities with | ||
very low light intensities. | ||
|
||
In practice, this means that you will have to manually manage your exposure | ||
settings to ensure that you aren't over-exposing or under-exposing your scene | ||
too much. Auto-exposure can help you balance the light in a scene to bring it | ||
into a normal range, but it can't recover lost precision from a dynamic range | ||
that is too high. | ||
|
||
Using physical light and camera units will not automatically make your project | ||
look *better*. Sometimes, moving away from realism can actually make a scene | ||
look better to the human eye. Also, using physical units requires a greater | ||
amount of rigor compared to non-physical units. Most benefits of physical units | ||
can only be obtained if the units are correctly set to match real world | ||
reference. | ||
|
||
.. note:: | ||
|
||
Physical light units are only available in 3D rendering, not 2D. | ||
|
||
Setting up physical light units | ||
------------------------------- | ||
|
||
Physical light units can be enabled separately from physical camera units. | ||
|
||
To enable physical light units correctly, there are 4 steps required: | ||
|
||
1. Enable the project setting. | ||
2. Configure the camera. | ||
3. Configure the environment. | ||
4. Configure Light3D nodes. | ||
|
||
Since physical light and camera units only require a handful of calculations to | ||
handle unit conversion, enabling them doesn't have any noticeable performance | ||
impact on the CPU. However, on the GPU side, physical camera units currently | ||
enforce depth of field. This has a moderate performance impact. To alleviate | ||
this performance impact, depth of field quality can be decreased in the advanced | ||
Project Settings. | ||
|
||
Enable the project setting | ||
^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
Open the Project Settings, enable the **Advanced** toggle then enable | ||
**Rendering > Lights And Shadows > Use Physical Light Units**. Restart the editor. | ||
|
||
Configure the camera | ||
^^^^^^^^^^^^^^^^^^^^ | ||
|
||
.. warning:: | ||
|
||
When physical light units are enabled and if you have a WorldEnvironment | ||
node in your scene (i.e. the editor Environment is disabled), you **must** | ||
have a :ref:`class_CameraAttributes` resource assigned to the | ||
WorldEnvironment node. Otherwise, the 3D editor viewport will appear | ||
extremely bright if you have a visible DirectionalLight3D node. | ||
|
||
On the Camera3D node, you can add a :ref:`class_CameraAttributes` | ||
resource to its **Attributes** property. This resource is used to control the | ||
camera's depth of field and exposure. When using | ||
:ref:`class_CameraAttributesPhysical`, its focal length property is also used to | ||
adjust the camera's field of view. | ||
|
||
When physical light units are enabled, the following additional properties | ||
become available in CameraAttributesPhysical's **Exposure** section: | ||
|
||
- **Aperture:** The size of the aperture of the camera, measured in f-stops. An | ||
f-stop is a unitless ratio between the focal length of the camera and the | ||
diameter of the aperture. A high aperture setting will result in a smaller | ||
aperture which leads to a dimmer image and sharper focus. A low aperture | ||
results in a wide aperture which lets in more light resulting in a brighter, | ||
less-focused image. | ||
- **Shutter Speed:** The time for shutter to open and close, measured in | ||
*inverse seconds* (``1/N``). A lower value will let in more light leading to a | ||
brighter image, while a higher value will let in less light leading to a | ||
darker image. *When getting or setting this property with a script, the unit | ||
is in seconds instead of inverse seconds.* | ||
- **Sensitivity:** The sensitivity of camera sensors, measured in ISO. A higher | ||
sensitivity results in a brighter image. When auto exposure is enabled, this | ||
can be used as a method of exposure compensation. Doubling the value will | ||
increase the exposure value (measured in EV100) by 1 stop. | ||
- **Multiplier:** A *non-physical* exposure multiplier. Higher values will | ||
increase the scene's brightness. This can be used for post-processing | ||
adjustments or for animation purposes. | ||
|
||
The default **Aperture** value of 16 f-stops is appropriate for outdoors at | ||
daytime (i.e. for use with a default DirectionalLight3D). For indoor lighting, a | ||
value between 2 and 4 is more appropriate. | ||
|
||
Typical shutter speed used in photography and movie production is 1/50 (0.02 | ||
seconds). Night-time photography generally uses a shutter around 1/10 (0.1 | ||
seconds), while sports photography uses a shutter speed between 1/250 (0.004 | ||
seconds) and 1/1000 (0.001 seconds) to reduce motion blur. | ||
|
||
In real life, sensitivity is usually set between 50 ISO and 400 ISO for daytime | ||
outdoor photography depending on weather conditions. Higher values are used for | ||
indoor or night-time photography. | ||
|
||
.. note:: | ||
|
||
Unlike real life cameras, the adverse effects of increasing ISO sensitivity | ||
or decreasing shutter speed (such as visible grain or light trails) are not | ||
simulated in Godot. | ||
|
||
See :ref:`doc_physical_light_and_camera_units_setting_up_physical_camera_units` | ||
for a description of CameraAttributesPhysical properties that are also available when | ||
**not** using physical light units. | ||
|
||
Configure the environment | ||
^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
.. warning:: | ||
|
||
The default configuration is designed for daytime outdoor scenes. Night-time | ||
and indoor scenes will need adjustments to the DirectionalLight3D and | ||
WorldEnvironment background intensity to look correct. Otherwise, positional | ||
lights will be barely visible at their default intensity. | ||
|
||
If you haven't added a :ref:`class_WorldEnvironment` and :ref:`class_Camera3D` | ||
node to the current scene yet, do so now by clicking the 3 vertical dots at the | ||
top of the 3D editor viewport. Click **Add Sun to Scene**, open the dialog again | ||
then click **Add Environment to Scene**. | ||
|
||
After enabling physical light units, a new property becomes available to edit in | ||
the :ref:`class_Environment` resource: | ||
|
||
- **Background Intensity:** The background sky's intensity in | ||
`nits <https://en.wikipedia.org/wiki/Candela_per_square_metre>`__ | ||
(candelas per square meter). This also affects ambient and reflected light if | ||
their respective modes are set to **Background**. If a custom **Background Energy** | ||
is set, this energy is multiplied by the intensity. | ||
|
||
Configure the light nodes | ||
^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
After enabling physical light units, 2 new properties become available in Light3D nodes: | ||
|
||
- **Intensity:** The light's intensity in `lux | ||
<https://en.wikipedia.org/wiki/Lux>`__ (DirectionalLight3D) or | ||
`lumens <https://en.wikipedia.org/wiki/Lumen_(unit)>`__ (OmniLight3D/SpotLight3D). | ||
If a custom **Energy** is set, this energy is multiplied by the intensity. | ||
- **Temperature:** The light's *color temperature* defined in Kelvin. | ||
If a custom **Color** is set, this color is multiplied by the color temperature. | ||
|
||
**OmniLight3D/SpotLight3D intensity** | ||
|
||
Lumens are a measure of luminous flux, which is the total amount of visible | ||
light emitted by a light source per unit of time. | ||
|
||
For SpotLight3Ds, we assume that the area outside the visible cone is surrounded | ||
by a perfect light absorbing material. Accordingly, the apparent brightness of | ||
the cone area does *not* change as the cone increases and decreases in size. | ||
|
||
A typical household lightbulb can range from around 600 lumens to 1200 lumens. | ||
A candle is about 13 lumens, while a streetlight can be approximately 60000 lumens. | ||
|
||
**DirectionalLight3D intensity** | ||
|
||
Lux is a measure pf luminous flux per unit area, it is equal to one lumen per | ||
square metre. Lux is the measure of how much light hits a surface at a given | ||
time. | ||
|
||
With DirectionalLight3D, on a clear sunny day, a surface in direct sunlight may | ||
receive approximately 100000 lux. A typical room in a home may receive | ||
approximately 50 lux, while the moonlit ground may receive approximately 0.1 | ||
lux. | ||
|
||
**Color temperature** | ||
|
||
6500 Kelvin is white. Higher values result in colder (bluer) colors, while lower | ||
values result in warmer (more orange) colors. | ||
|
||
The sun on a cloudy day is approximately 6500 Kelvin. On a clear day, the sun is | ||
between 5500 to 6000 Kelvin. On a clear day at sunrise or sunset, the sun ranges | ||
to around 1850 Kelvin. | ||
|
||
.. figure:: img/physical_light_units_color_temperature_chart.webp | ||
:align: center | ||
:alt: Color temperature chart from 1,000 Kelvin (left) to 12,500 Kelvin (right) | ||
|
||
Color temperature chart from 1,000 Kelvin (left) to 12,500 Kelvin (right) | ||
|
||
Other Light3D properties such as **Energy** and **Color** remain editable for | ||
animation purposes, and when you occasionally need to create lights with | ||
non-realistic properties. | ||
|
||
.. _doc_physical_light_and_camera_units_setting_up_physical_camera_units: | ||
|
||
Setting up physical camera units | ||
-------------------------------- | ||
|
||
Physical camera units can be enabled separately from physical light units. | ||
|
||
After adding a :ref:`class_CameraAttributesPhysical` resource to the **Camera | ||
Attributes** property of a Camera3D nodes, some properties such as **FOV** will | ||
no longer be editable. Instead, these properties are now governed by the | ||
CameraAttributesPhysical's properties, such as focal length and aperture. | ||
|
||
CameraAttributesPhysical offers the following properties in its **Frustum** section: | ||
|
||
- **Focus Distance:** Distance from camera of object that will be in focus, | ||
measured in meters. Internally, this will be clamped to be at least 1 | ||
millimeter larger than the **Focal Length**. | ||
- **Focal Length:** Distance between camera lens and camera aperture, measured | ||
in millimeters. Controls field of view and depth of field. A larger focal | ||
length will result in a smaller field of view and a narrower depth of field | ||
meaning fewer objects will be in focus. A smaller focal length will result in | ||
a wider field of view and a larger depth of field, which means more objects will be | ||
in focus. This property overrides the Camera3D's **FOV** and **Keep Aspect** | ||
properties, making them read-only in the inspector. | ||
- **Near/Far:** The near and far clip distances in meters. These behave the same | ||
as the Camera3D properties of the same name. Lower **Near** values allow the | ||
camera to display objects that are very close, at the cost of potential | ||
precision (Z-fighting) issues in the distance. Higher **Far** values allow the | ||
camera to see further away, also at the cost of potential precision | ||
(Z-fighting) issues in the distance. | ||
|
||
The default focal length of 35 mm corresponds to a wide angle lens. It still | ||
results in a field of view that is noticeably narrower compared to the default | ||
"practical" vertical FOV of 75 degrees. This is because non-gaming use cases | ||
such as filmmaking and photography favor using a narrower field of view for a | ||
more cinematic appearance. | ||
|
||
Common focal length values used in filmmaking and photography are: | ||
|
||
- **Fisheye (ultrawide angle):** Below 15 mm. Nearly no depth of field visible. | ||
- **Wide angle:** Between 15 mm and 50 mm. Reduced depth of field. | ||
- **Standard:** Between 50 mm and 100 mm. Standard depth of field. | ||
- **Telephoto:** Greater than 100 mm. Increased depth of field. | ||
|
||
Like when using the **Keep Height** aspect mode, the effective field of view | ||
depends on the viewport's aspect ratio, with wider aspect ratios automatically | ||
resulting in a wider *horizontal* field of view. | ||
|
||
Automatic exposure adjustment based on the camera's average brightness level can | ||
also be enabled in the **Auto Exposure** section, with the following properties: | ||
|
||
- **Min Sensitivity:** The darkest brightness the camera is allowed to get to, | ||
measured in EV100. | ||
- **Max Sensitivity:** The brightest the camera is allowed to get to, measured in EV100. | ||
- **Speed:** The speed of the auto exposure effect. Affects the time needed for | ||
the camera to perform auto exposure. Higher values allow for faster | ||
transitions, but the resulting adjustments may look distracting depending on | ||
the scene. | ||
- **Scale:** The scale of the auto exposure effect. Affects the intensity of | ||
auto exposure. | ||
|
||
EV100 is an exposure value (EV) measured at an ISO sensitivity of 100. See | ||
`this table <https://en.wikipedia.org/wiki/Exposure_value#Tabulated_exposure_values>`__ | ||
for common EV100 values found in real life. |