Ivan Belyavtsev
10.06.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 raytracer
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