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:
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}