star-gs

Literate program for a geometric sensitivity calculation
git clone git://git.meso-star.fr/star-gs.git
Log | Files | Refs | README | LICENSE

commit 945d601f3054d8a7ce501ae61f1cd1155ed1edac
parent 052bcf4adc48169bf6954299e33019faff8ce3fa
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 26 Oct 2022 17:17:13 +0200

Échantillonnange des chemins de sensibilité et dérivée spatiale

Diffstat:
Msrc/sgs_compute_sensitivity_translation.nw | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 90 insertions(+), 4 deletions(-)

diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw @@ -241,6 +241,7 @@ L(\vec{x},\vec{\omega}_{spec},\PI) \quad \quad \quad \vec{x} \in A_h ; & + \partial_{1,\vec{\chi}}L(\vec{x},\vec{\omega}_{spec},\PI) - \beta \partial_{1,\vec{u}} L(\vec{x},\vec{\omega}_{spec},\PI) \end{aligned} +\label{eq:clsensib} \end{equation} \textit{Note}: La dérivée spatiale $\partial_{1,\vec{\gamma}} @@ -332,10 +333,14 @@ par un échantillonnage des sources et des chemins qui les propageront vers le récepteur. \paragraph{} -La présente mise en oeuvre est particulière dans le sens où le chemin (du -problème couplé) est d'abord échantillonné en totalité +La mise en oeuvre proposée est particulière dans le sens où le chemin du +problème couplé est d'abord échantillonné et conservé en totalité (section~\ref{subsec:chemin}). Son poids n'est calculé qu'a posteriori à partir -des données dudit chemin (section~\ref{subsec:poids}). +du chemin ainsi construit (section~\ref{subsec:poids}). Cette proposition +diffère d'une approche plus conventionnelle où la position et la direction +courante du chemin ne sont que des données locales à chaque étape de la +construction du chemin; son poids étant mis à jour si nécessaire à chacune de +ces étapes. \paragraph{} La fonction en charge d'échantillonner un chemin et d'en calculer le poids est @@ -391,7 +396,7 @@ on stocke dans les variables [[pos_emit_s]] et [[normal_s]] sa position et la normale correspondante. On récupère également dans [[surf_emit_s]] l'identifiant de la surface que l'on vient d'échantillonner, dans notre cas la surface supérieure $S_r$ identifié dans le code par la constante -[[SGS_SURFACE_Z_MAX]]. +[[SGS_SURFACE_Z_MAX]] (voir figure~\ref{fig:configuration}). <<échantillonner une position sur la source de sensibilité>>= /* Sample the sensitivity emissive surface */ @@ -401,6 +406,87 @@ surface supérieure $S_r$ identifié dans le code par la constante surf_emit_s = frag.surface; /* must be SGS_SURFACE_Z_MAX */ @ +\paragraph{} +On rappelle que les sources de sensibilité proviennent des paroies perturbées +par une modification du paramètre $\PI$. En toute hypothèse, toute source de +sensibilité incidente à $S_r$ serait réfléchie spéculairement. Or, dans notre cas, +nous n'avons qu'une seule source de sensibilité, la surface $S_r$, et par +conséquent nous n'avons pas à tenir compte de ces sensibilités réfléchies. Ci +après, nous ne construisons donc que le chemin qui propage l'émission de +sensibilité par $S_r$. + +\paragraph{} Pour cela, nous commençons par échantilloner une direction +d'émission lambertienne [[dir_emit_s]] autour de la normale [[normal_s]] de la +surface $S_r$. Nous lançons alors un chemin dans cette direction jusqu'à +rencontré une intersection avec une géométrie, une intersection stockée dans +variable [[hit0]]. + +<<échantillonner un chemin de sensibilité>>= + /* Sample the cosine weighted sampling of the emissive direction */ + ssp_ran_hemisphere_cos(rng, normal_s, dir_emit_s, NULL); + /* Trace the sampled ray */ + TRACE_RAY(pos_emit_s, dir_emit_s, surf_emit_s, &hit0); +@ + +\paragraph{} +La source de sensibilité est donnée dans la condition à la limite décrite par +l'équation~\ref{eq:clsensib}. Elle dépend de la dérivée spatiale selon +$\vec{\chi}$ incidente dans la direction spéculaire $\vec{\omega}_{spec}$ et de +la dérivée spatiale selon $\vec{u}$ incidente à la même direction spéculaire. +Ces contributions à l'émission de sensibilité ne sont pas connues et sont ici +échantillonnées par double \textit{randomization}. Comme ces deux dérivées +spatiales sont incidentes à la même direction $\vec{\omega}_{spec}$ nous +pouvons nous contanter de ne suivre qu'un seul chemin dans cette direction. + +\paragraph{} +Nous calculons $\vec{\omega}_{spec}$ ([[dir_spec_s]]) par réflexion spéculaire +de la direction d'émission $\vec{\omega}$ ([[dir_emit_s]]) avant de suivre un +chemin dans cette direction jusqu'à l'intersection avec une surface stockée +dans [[hit1]]. + +POUET + +<<échantillonner un chemin de dérivée spatiale>>= + /* Compute the specular direction */ + reflect(dir_spec_s, dir_emit_s, normal_s); + /* Trace the specular ray */ + TRACE_RAY(pos_emit_s, dir_spec_s, surf_emit_s, &hit1); +@ + +\paragraph{} +Décrire [[TRACE_RAY]] dans un moment plus info +<<???>>= + /* Helper macro used as syntactic sugar */ + #define TRACE_RAY(Org, Dir, StartFrom, Hit) { \ + const double range[2] = {0, DBL_MAX}; \ + sgs_geometry_trace_ray(sgs->geom, (Org), (Dir), range, (StartFrom), (Hit));\ + if(SGS_HIT_NONE(&hit)) { res = RES_BAD_ARG; goto error; } \ + } (void)0 +@ + +\paragraph{} +À compléter qd on parlera d'optimisation du temps de calcul +<<échantillonner un chemin de sensibilité>>= + /* Does the sensibility path reaches the receiver? */ + if(!hit_receiver(&scn, pos_emit_s, dir_emit_s, &hit, pos_recv)) goto exit; +@ +<<échantillonner un chemin de dérivée spatiale>>= + /* Does the spatial derivative path reaches the emitter? */ + if(!hit_source(&scn, pos_emit_s, dir_spec_s, &hit, pos_emit_e)) goto exit; +@ + +\paragraph{} +TODO + +<<échantillonner un chemin de dérivée spatiale>>= + /* Compute the specular direction */ + reflect(dir_spec_s, dir_emit_s, normal_s); + + /* Trace the specular ray and does it reaches the source? */ + TRACE_RAY(pos_emit_s, dir_spec_s, surf_emit_s, &hit); + if(!hit_source(&scn, pos_emit_s, dir_spec_s, &hit, pos_emit_e)) goto exit; +@ + \subsection{Le poids} \label{subsec:poids}