Extensible 3D (X3D)
Part 1: Architecture and base components
17 Lighting component
The name of this component is "Lighting". This name shall be used when referring to this component in the COMPONENT statement (see 7.2.5.4 Component statement).
This clause describes the Lighting component of this part of ISO/IEC 19775. This includes how light sources are defined and positioned as well as how lights effect the rendered image. Table 17.1 provides links to the major topics in this clause.
Shape nodes are illuminated by the sum of all of the lights in the world that affect them. This includes the contribution of both the direct and ambient illumination from light sources. Ambient illumination results from the scattering and reflection of light originally emitted directly by light sources. The amount of ambient light is associated with the individual lights in the scene. This is a gross approximation to how ambient reflection actually occurs in nature.
Any node used as a source of illumination is derived
from X3DLightNode.
All light sources contain an intensity,
a color, and an ambientIntensity
field. The intensity field specifies the brightness of the direct emission
from the light, and the ambientIntensity specifies the intensity of the
ambient emission from the light. Light intensity may range from 0.0 (no light
emission) to 1.0 (full intensity). The color field specifies the spectral
colour properties of both the direct and ambient light emission as an RGB value.
The on field specifies whether the light is enabled or disabled. If the value
is FALSE
, the light is disabled and will
not affect any nodes in the scene. If the value is TRUE
,
the light will affect other nodes according to
the 17.2.1.2 Scoping of lights.
The following node types are light source nodes:
PointLight and SpotLight illuminate all objects in the world that fall within their volume of lighting influence regardless of location within the transformation hierarchy. PointLight defines this volume of influence as a sphere centred at the light (defined by a radius). SpotLight defines the volume of influence as a solid angle defined by a radius and a cut-off angle. DirectionalLight nodes illuminate only the objects descended from the light's parent grouping node, including any descendent children of the parent grouping nodes.
Each light type defines a global field that determines whether the light is global or scoped. Global lights illuminate all objects that fall within their volume of lighting influence. Scoped lights only illuminate objects that are in the same transformation hierarchy as the light; i.e., only the children and descendants of its enclosing parent group are illuminated. This allows the creation of realistic effects such as lights that illuminate a single room.
The X3D lighting model provides detailed equations that specify the colours to apply to each geometric object. For each object, the values of the Material, color, and/or texture currently being applied to the object are combined with the lights illuminating the object and the currently bound X3DFogObject (if specified). These equations are designed to simulate the physical properties of light striking a surface.
If a programmable shader is defined for an Appearance node, the lighting model shall be disabled and replaced by the functionality implemented by the shader program. See 31 Programmable shaders component for more information.
A Shape node is unlit if either of the following is true:
NOTE Geometry nodes that represent lines or points do not support lighting.
If the shape is unlit, the colour (Irgb) and alpha (A, 1−transparency) of the shape at each point on the shape's geometry is specified in Table 17.2.
Table 17.2 — Unlit colour and alpha mapping
Texture type | Colour per-vertex or per-face |
Colour NULL |
---|---|---|
No texture | Irgb= ICrgb A = 1 |
Irgb= (1, 1, 1) A = 1 |
Intensity (one-component) |
Irgb= IT
× ICrgb A = 1 |
Irgb = (IT,IT,IT
) A = 1 |
Intensity+Alpha (two-component) |
Irgb= I T
× ICrgb A = AT |
Irgb= (IT,IT,IT
) A = AT |
RGB (three-component) |
Irgb= ITrgb A = 1 |
Irgb= ITrgb A = 1 |
RGBA (four-component) |
Irgb= ITrgb A = AT |
Irgb= ITrgb A = AT |
where:
AT = normalized [0, 1] alpha value from 2 or
4 component texture image
ICrgb = interpolated per-vertex
colour, or per-face colour, from Color node
IT = normalized [0, 1] intensity from 1 or 2
component texture image
ITrgb= colour from 3-4
component texture image
If the Shape node is lit (i.e., a Material and an Appearance node are specified for the Shape), the Material and Texture nodes determine the diffuse colour for the lighting equation as specified in Table 17.3.
The Material's diffuseColor field modulates the color in the texture. Hence, a diffuseColor of white will result in the pure color of the texture, while a diffuseColor of black will result in a black diffuse factor regardless of the texture.
The Material's transparency field modulates the alpha in the texture. Hence, a transparency of 0 will result in an alpha equal to that of the texture. A transparency of 1 will result in an alpha of 0 regardless of the value in the texture.
Table 17.3 — Lit colour and alpha mapping
Texture type | Colour per-vertex or per-face |
Color node NULL |
No texture | ODrgb
= ICrgb A = 1-TM |
ODrgb
= IDrgb A = 1-TM |
Intensity texture (one-component) |
ODrgb
= IT × ICrgb A = 1-TM |
ODrgb
= IT × IDrgb A = 1-TM |
Intensity+Alpha texture (two-component) |
ODrgb
= IT × ICrgb A = AT |
ODrgb
= IT × IDrgb A = AT |
RGB texture (three-component) |
ODrgb
= ITrgb A = 1-TM |
ODrgb
= ITrgb A = 1-TM |
RGBA texture (four-component) |
ODrgb
= ITrgb A = AT |
ODrgb
= ITrgb A = AT |
where:
IDrgb = material diffuseColor
ODrgb = diffuse factor,
used in lighting equations below
TM = material transparency
All other terms are as defined in 17.2.2.2 Lighting off.
An ideal X3D implementation will evaluate the following lighting equation at each point on a lit surface. RGB intensities at each point on a geometry (Irgb) are given by:
Irgb = IFrgb × (1 -f0)
+ f0
× (OE
rgb + SUM( oni
× attenuationi
× spoti × ILrgb
× (ambienti + diffusei
+ specular i)))
where:
attenuationi = 1 / max(c1
+ c2 × dL
+ c3 × dL²
, 1 )
ambienti = Iia
× ODrgb × Oa
diffusei = Ii
× ODrgb × (
N · L
)
specular i = Ii
× OSrgb × (
N · ((L
+ V) / |L + V|))shininess
× 128
and:
Table 17.4 — Calculation of the spotlight factor
Condition (in order) | spoti = |
---|---|
lighti is PointLight or DirectionalLight | 1 |
spotAngle ≥ spotCO | 0 |
spotAngle ≤ spotBW | 1 |
spotBW < spotAngle < spot CO | (spotAngle - spotCO ) / (spotBW - spotCO) |
Table 17.5 — Calculation of the fog interpolant
Condition | f0 = |
---|---|
no fog | 1 |
fogType "LINEAR", dV < fogVisibility | (fogVisibility-dV) / fogVisibility |
fogType "LINEAR", dV > fogVisibility | 0 |
fogType "EXPONENTIAL", dV < fogVisibility | exp(-dV / (fogVisibility-dV ) ) |
fogType "EXPONENTIAL", dV > fogVisibility | 0 |
The X3D lighting equations are based on the simple illumination equations given in [FOLEY] and [OPENGL].
X3DLightNode : X3DChildNode { SFFloat [in,out] ambientIntensity 0 [0,1] SFColor [in,out] color 1 1 1 [0,1] SFBool [in,out] global FALSE SFFloat [in,out] intensity 1 [0,1] SFNode [in,out] metadata NULL [X3DMetadataObject] SFBool [in,out] on TRUE }
The X3DLightNode abstract node type is the base type from which all node types that serve as light sources are derived. A description of the ambientIntensity, color, intensity, and on fields is in 17.2.1 Light source semantics. A description of the global field is in 17.2.1.2 Scoping of lights.
DirectionalLight : X3DLightNode { SFFloat [in,out] ambientIntensity 0 [0,1] SFColor [in,out] color 1 1 1 [0,1] SFVec3f [in,out] direction 0 0 -1 (-∞,∞) SFBool [in,out] global FALSE SFFloat [in,out] intensity 1 [0,1] SFNode [in,out] metadata NULL [X3DMetadataObject] SFBool [in,out] on TRUE }
The DirectionalLight node defines a directional light source that illuminates along rays parallel to a given 3-dimensional vector. A description of the ambientIntensity, color, intensity, and on fields is in 17.2.1 Light source semantics. A description of the global field is in 17.2.1.2 Scoping of lights.
The direction field specifies the direction vector of the illumination emanating from the light source in the local coordinate system. Light is emitted along parallel rays from an infinite distance away. A directional light source illuminates only the objects in its enclosing parent group. The light may illuminate everything within this coordinate system, including all children and descendants of its parent group. The accumulated transformations of the parent nodes affect the light.
DirectionalLight nodes do not attenuate with distance. A precise description of X3D's lighting equations is contained in 17.2.2 Lighting model.
PointLight : X3DLightNode { SFFloat [in,out] ambientIntensity 0 [0,1] SFVec3f [in,out] attenuation 1 0 0 [0,∞) SFColor [in,out] color 1 1 1 [0,1] SFBool [in,out] global TRUE SFFloat [in,out] intensity 1 [0,1] SFVec3f [in,out] location 0 0 0 (-∞,∞) SFNode [in,out] metadata NULL [X3DMetadataObject] SFBool [in,out] on TRUE SFFloat [in,out] radius 100 [0,∞) }
The PointLight node specifies a point light source at a 3D location in the local coordinate system. A point light source emits light equally in all directions; that is, it is omnidirectional. PointLight nodes are specified in the local coordinate system and are affected by ancestor transformations. A description of the global field is in 17.2.1.2 Scoping of lights.
Subclause 17.2.1 Light source semantics, contains a detailed description of the ambientIntensity, color, and intensity fields.
A PointLight node illuminates geometry within radius length base units of its location. Both radius and location are affected by ancestors' transformations (scales affect radius and transformations affect location). The radius field shall be greater than or equal to zero.
PointLight node's illumination falls off with distance as specified by three attenuation coefficients. The attenuation factor is:
1/max(attenuation[0] + attenuation[1] × r + attenuation[2] × r2, 1)
where r is the distance from the light to the surface being illuminated. The default is no attenuation. An attenuation value of (0, 0, 0) is identical to (1, 0, 0). Attenuation values shall be greater than or equal to zero. A detailed description of X3D's lighting equations is contained in 17.2.2 Lighting model.
SpotLight : X3DLightNode { SFFloat [in,out] ambientIntensity 0 [0,1] SFVec3f [in,out] attenuation 1 0 0 [0,∞) SFFloat [in,out] beamWidth π/4 (0,π/2] SFColor [in,out] color 1 1 1 [0,1] SFFloat [in,out] cutOffAngle π/2 (0,π/2] SFVec3f [in,out] direction 0 0 -1 (-∞,∞) SFBool [in,out] global TRUE SFFloat [in,out] intensity 1 [0,1] SFVec3f [in,out] location 0 0 0 (-∞,∞) SFNode [in,out] metadata NULL [X3DMetadataObject] SFBool [in,out] on TRUE SFFloat [in,out] radius 100 [0,∞) }
The SpotLight node defines a light source that emits light from a specific point along a specific direction vector and constrained within a solid angle. Spotlights may illuminate geometry nodes that respond to light sources and intersect the solid angle defined by the SpotLight. Spotlight nodes are specified in the local coordinate system and are affected by ancestors' transformations. A description of the global field is in 17.2.1.2 Scoping of lights.
A detailed description of ambientIntensity, color, intensity, and the lighting equations of X3D is provided in 17.2.1 Light source semantics. More information on lighting concepts can be found in 17.2.2 Lighting model, including a detailed description of the X3D lighting equations.
The location field specifies a translation offset of the centre point of the light source from the light's local coordinate system origin. This point is the apex of the solid angle which bounds light emission from the given light source. The direction field specifies the direction vector of the light's central axis defined in the local coordinate system.
The on field specifies whether the light source emits light. If on is TRUE, the light source is emitting light and may illuminate geometry in the scene. If on is FALSE, the light source does not emit light and does not illuminate any geometry.
The radius field specifies the radial extent of the solid angle and the maximum distance from location that may be illuminated by the light source. The light source does not emit light outside this radius. The radius shall be greater than or equal to zero.
Both radius and location are affected by ancestors' transformations (scales affect radius and transformations affect location).
The cutOffAngle field specifies the outer bound of the solid angle. The light source does not emit light outside of this solid angle. The beamWidth field specifies an inner solid angle in which the light source emits light at uniform full intensity. The light source's emission intensity drops off from the inner solid angle (beamWidth) to the outer solid angle (cutOffAngle) as described in the following equations:
angle = the angle between the Spotlight's direction vector and the vector from the Spotlight location to the point to be illuminated if (angle ≥ cutOffAngle): multiplier = 0 else if (angle ≤ beamWidth): multiplier = 1 else: multiplier = (angle - cutOffAngle) / (beamWidth - cutOffAngle) intensity(angle) = SpotLight.intensity × multiplier
If the beamWidth is greater than the cutOffAngle, beamWidth is defined to be equal to the cutOffAngle and the light source emits full intensity within the entire solid angle defined by cutOffAngle. Both beamWidth and cutOffAngle shall be greater than 0.0 and less than or equal to π/2. Figure 17.1 depicts the beamWidth, cutOffAngle, direction, location, and radius fields of the SpotLight node.
SpotLight illumination falls off with distance as specified by three attenuation coefficients. The attenuation factor is:
1/max(attenuation[0] + attenuation[1] × r + attenuation[2] × r2 , 1)
where r is the distance from the light to the surface being illuminated. The default is no attenuation. An attenuation value of (0, 0, 0) is identical to (1, 0, 0). Attenuation values shall be greater than or equal to zero. A detailed description of X3D's lighting equations is contained in 17.2.2 Lighting model.
The Lighting component provides three levels of support as specified in Table 17.6.
Table 17.6 — Lighting component support levels
Level | Prerequisites | Nodes/Features | Support |
---|---|---|---|
1 | Core 1 Shape 1 |
||
X3DLightNode (abstract) | n/a | ||
DirectionalLight | Not scoped by parent Group or Transform. | ||
2 | Core 1 Shape 1 |
||
All Level 1 Lighting nodes | All fields as supported in Level 1. | ||
PointLight | radius optionally supported. Linear attenuation. | ||
SpotLight | beamWidth optionally supported. radius optionally supported. Linear attenuation. | ||
3 | Core 1 Shape 1 |
||
All Level 2 Lighting nodes | All fields fully supported. |