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_rendererclosest_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_shadershadow_raytracer in
ray_tracing_rendererany_hit_shader and miss_shader for
shadow_raytracerclosest_hit_shader of raytracer to
cast shadows rays and to ignore occluded lights