Ivan Belyavtsev
05.02.2022
\[\scriptsize{L_o(X, \vec{\omega_o}) = L_e(X, \vec{\omega_o}) + \int_S L_i(X, \vec{\omega_i}) f_{X,\vec{n}}(\vec{\omega_i}, \vec{\omega_o}) |\vec{\omega_i} \cdot \vec{n} | d{\omega_i}} \]
where \(X\) is a position on the object or surface,
\(\vec{\omega_o}\) is a direction toward the eye or camera,
\(L_o(X, \vec{\omega_o})\) is all outgoing light from the position,
\(L_e(X, \vec{\omega_o})\) is emitted light [1]
\[\scriptsize{L_o(X, \vec{\omega_o}) = L_e(X, \vec{\omega_o}) + \int_S L_i(X, \vec{\omega_i}) f_{X,\vec{n}}(\vec{\omega_i}, \vec{\omega_o}) |\vec{\omega_i} \cdot \vec{n} | d{\omega_i}} \]
where \(\vec{n}\) is normal to surface at \(X\) position,
\(S\) is a unit hemisphere among \(\vec{n}\) with center in \(X\),
\(L_i(X, \vec{\omega_i})\) is a light coming from \(\vec{\omega_i}\) direction,
\(f_{X,\vec{n}}(\vec{\omega_i}, \vec{\omega_o})\) is the bidirectional reflectance distribution function (BRDF) [1]
\[\small{L(\vec{P}) = Ka + \sum_{lights}{[Kd\vec{N} \cdot \vec{L} + Ks(\vec{V} \cdot \vec{R})^{Ns}]}}\]
where \(\small{\vec{R} = 2(\vec{N} \cdot \vec{L})\vec{N}−\vec{L}}\) [3]
\[L_d = k_dI\max(0, \vec{n}\cdot\vec{l})\]
where \(L_d\) - diffusely reflected light,
\(k_d\) - material’s diffuse coefficient,
\(\vec{n}\) - surface normal,
\(\vec{l}\) - direction toward the light [4]
lights
array of ray_tracing_renderer
closest_hit_shader
of raytracer
to implement Lambertian shading modelBefore adding the light source to the final point on the point \(X\), we should cast a ray from the point \(X\) towards the light source. If any object occludes the shadow ray, the point \(X\) is on shadow and the light should not be added the light source
trace_ray
method of trace_ray
to use any_hit_shader
shadow_raytracer
in ray_tracing_renderer
any_hit_shader
and miss_shader
for shadow_raytracer
closest_hit_shader
of raytracer
to cast shadows rays and to ignore occluded lights