Lights

A light model describes how light is emitted in the different directions of the space. It takes as input the position of a point of an object and it returns two elements:

  • a vector that represents the direction of the light received (as convention the sign is chosen to make the ray pointing toward the light source)
  • the intensity of light received by point for every wavelength

The three basic direct light models are:

  • Direct light
  • Point light
  • Spot light

Direct light

Directional lights are used to model distant sources, so that they uniformly influence the entire scene. The rendering equation reduces to:

Point light

The position and the color characterize a point light.

L\left(x, \omega_r\right)=\sum_l L(l, \overrightarrow{l x}) f_r\left(x, \overrightarrow{l x}, \omega_r\right) \\ L(l, \vec{x})=\boldsymbol{l}\left(\frac{g}{|\boldsymbol{p}-\boldsymbol{x}|}\right)^\beta \end{array}$$ ````glsl vec3 lightDir = lightPos - fragPos; vec3 lightColor = lightColor.rgb * pow(g/length(lightDir), beta); ```` Note that the light direction is normalized to make it an unitary vector: $$\overrightarrow{l x}=\frac{p-x}{|\boldsymbol{p}-\boldsymbol{x}|}$$ Also note that we write $p - x$ because the ray is oriented from the object to the light source, as for the direct light case. So at the end: $$L\left(x, \omega_r\right)=\boldsymbol{l}\left(\frac{g}{|\boldsymbol{p}-\boldsymbol{x}|}\right)^\beta * f_r\left(x, \frac{\boldsymbol{p}-\boldsymbol{x}}{|\boldsymbol{p}-\boldsymbol{x}|}, \omega_r\right)$$ The decay factor $\beta$ is either constant, inverse-linear or inverse-squared. ### Spot light Spot lights are characterized by two angles $\alpha _{IN}$ and $\alpha _{OUT}$ that divide the illuminated area into three zones: constant $\alpha _{IN}$, decay (between $\alpha _{IN}$ and $\alpha _{OUT}$) and absent (outside $\alpha _{OUT}$). Spot lights are implemented by confining other light sources with the dimming term: $$L(l, \overrightarrow{l x})=L_0(l, \overrightarrow{l x}) \cdot \operatorname{clamp}\left(\frac{\frac{\boldsymbol{p}-\boldsymbol{x}}{|\boldsymbol{p}-\boldsymbol{x}|} \cdot \boldsymbol{d}-c_{O U T}}{c_{I N}-c_{O U T}}\right)$$ $$L(l, \overrightarrow{l x})=\boldsymbol{l}\left(\frac{g}{|\boldsymbol{p}-\boldsymbol{x}|}\right)^\beta \cdot \operatorname{clamp}\left(\frac{\frac{\boldsymbol{p}-\boldsymbol{x}}{|\boldsymbol{p}-\boldsymbol{x}|} \cdot \boldsymbol{d}-c_{O U T}}{c_{I N}-c_{O U T}}\right)$$ where $\operatorname{clamp}(y)=\left\{\begin{array}{cc}0 & y<0 \\ y & y \in[0,1] \\ 1 & y>1\end{array}\right.$ ````glsl vec3 lightDir = lightPos - fragPos; float dimmingTerm = clamp(( dot(normalize(lightDir),lightDir) - cosout)/(cosin - cosout), 0.0f, 1.0f); float light = pow(g/length(lightDir), beta); vec3 lightColor = lightColor.rgb * light * dimmingTerm; ```` ### Ambient light Ambient lighting is the simplest approximation for indirect illumination which is caused by lights that bounces from other objects. A slight extension of ambient lighting is the **hemispheric lighting** whcih simulates a "sky/ground" model using two ambient light colors (the “upper” or “sky” color, and the “lower” or “ground” color) and a direction vector. The technique creates an ambient light color factor by “blending” the two colors, with respect to the orientation of the object. ### HDRI maps The "evolution" to the hemispheric lightning is to have a function that return the color received by any point $x_i$ (of any objected). Each point is thus illuminated according the function. These functions can be computed either from specially taken pictures or from high quality off-line rendering of the environment (hdri maps).