commit 3bf7412198e20d2cabde5b206d848ebe3ea0a458
parent 8fcb44f90c85ca5cd59d895e6c32157bce5c3509
Author: Paule Lapeyre <paule.lapeyre@yahoo.fr>
Date: Wed, 30 Nov 2022 17:00:04 +0100
Termine l'écriture de la section Monte-Carlo
Nous avons rédigé une dernière sous section dans laquelle sont déclarées
les variables locales de la fonction de réalisation et la macro
TRACE_RAY qui encapsule l'appel à la fonction de lancer de rayon pour en
simplifier la lecture. Nous avons par ailleurs annoncé la prochaine
section qui contiendra les résultats issus du code. Mais pour cela nous
devrons avoir une mise en oeuvre complète et fonctionnelle de notre
programme.
Nous avons enfin commencé à nettoyer le code et à basculer certaines
parties en annexe.
Diffstat:
1 file changed, 142 insertions(+), 93 deletions(-)
diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw
@@ -348,26 +348,20 @@ construction du chemin; son poids étant mis à jour si nécessaire à chacune d
ces étapes.
<<réalisation>>=
-
-/* TODO move me */
-struct sgs_scene {
- struct sgs_geometry* geom;
- /* TODO décrire le récepteur */
-};
-
static res_T
realisation
(struct rng* rng,
const struct sgs_scene* scene,
double* w)
{
- <<variables locales>>
+ <<données locales à la fonction>>
res_T res = RES_OK;
<<échantillonner un chemin du problème couplé>>
<<calcul du poids>>
exit:
+ <<nettoyer les données locales de la fonction>>
<<renvoyer le poids>>
return res;
error:
@@ -424,7 +418,7 @@ sensibilité par $S_r$.
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]].
+la variable [[hit0]].
<<échantillonner un chemin de sensibilité>>=
/* Sample the cosine weighted sampling of the emissive direction */
@@ -484,7 +478,16 @@ source radiative, à savoir la paroi de droite.
\paragraph{}
En conséquence, dans la suite de la fonction, nous pouvons assumer que nous
n'aurons à calculer le poids que des seuls chemin couplés dont la contribution
-est non nulle.
+est non nulle. [[hit1]] représente donc une intersection sur la source
+radiative. On stocke dans [[normal_e]] la normale de la paroi correspondante
+dont on aura besoin pour le calcul du poids. De même, on initialise la variable
+[[dir_spec_e]] à $-\vec{\omega}_s$, cette direction nous sera également utile
+pour évaluer la source de dérivée spatiale.
+
+<<échantillonner un chemin de dérivée spatiale>>=
+ d3_normalize(normal_e, hit1.normal);
+ d3_minus(dir_spec_e, dir_spec_s);
+@
\paragraph{}
Dans le problème couplé la contribution du chemin (poids MC) va s'exprimer à
@@ -533,7 +536,6 @@ position d'émission [[pos_emit_s]], et d'interroger les données associées à
position ainsi transformée ([[pos_emit_s_2d]]).
<<récupérer le gradient surfacique de $\rho$>>=
-
/* Transform pos_emit_s in XY plane */
pos_emit_s_2d[0] = pos_emit_s[X];
pos_emit_s_2d[1] = pos_emit_s[Y];
@@ -646,102 +648,91 @@ $S_r$ et l'hémisphère $\PI$ échantillonnées.
w[0] = sensib;
@
-\paragraph{TODO} Décaller le calcul suivant en annexe. Renommer [[weight]] car
-on ne calcule pas vraiment une luminance mais la seule partie de la luminance
-qui dépend de $\PI$, dit autrement la seule partie de la luminance qui compte
-pour la sensibilité. Elle pourra donc être utilisé pour vérification par
-différences finies.
-
-<<calcul du poids>>=
- weight = Sb * rho * PI * get_Sr_area(scn);
-@
-
-<<renvoyer le poids>>=
- w[1] = weight;
-@
-
-\subsection{Optimisation \& co}
+\subsection{Variables locales et macro}
\paragraph{}
-Décrire [[TRACE_RAY]] dans un moment plus info
-<<???>>=
- /* Helper macro used as syntactic sugar */
+Lors de l'échantillonnage des chemins (section~\ref{subsec:chemin}) nous nous
+sommes appuyé sur la fonction [[TRACE_RAY]] nous permettant de lancer un rayon
+dans la scène. Cette fonction est en réalité un macro, locale à la fonction,
+qui encapsule l'appel à la fonction qui lance le rayon. En plus de l'origine et
+de la direction du rayon, cette fonction nécessite en entrée une plage des
+distances d'intersection possible ([[range]]), dans notre cas toujours définie
+à $[0, \infty]$. À noter également le paramètre d'entrée [[StartFrom]] qui
+stocke le triangle sur lequel se trouve l'origine du rayon, une donnée d'entrée
+utilisé pour éviter une auto-intersection, c'est à dire l'intersection du
+rayon avec le triangle dont il est issu.
+
+<<données locales à la fonction>>=
+ /* Macro utilisée comme sucre syntaxique */
#define TRACE_RAY(Org, Dir, StartFrom, Hit) { \
- const double range[2] = {0, DBL_MAX}; \
+ double range[2]; \
+ range[0] = 0; \
+ range[1] = INF; \
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;
+<<nettoyer les données locales de la fonction>>=
+ #undef TRACE_RAY
@
\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;
+Enfin, nous déclarons ci-après l'ensemble des variables locales nécessaires à
+la réalisation que nous venons d'écrire:
+
+<<données locales à la fonction>>=
+ /* Variables de la source de sensibilité */
+ double dir_emit_s[3];
+ double pos_emit_s[3];
+ double normal_s[3];
+ double dir_spec_s[3];
+ double pos_emit_s_2d[2];
+ enum sgs_surface_type surf_emit_s;
+ struct sgs_fragment frag; /* Position échantillonnée */
+
+ /* Variables de la source radiative */
+ double pos_emit_e[3];
+ double normal_e[3];
+ double dir_spec_e[3];
+ double pos_emit_e_2d[2];
+
+ /* Propriétés radiatives des surfaces et leur dérivée */
+ double rho;
+ double d_rho;
+ double grad_rho_2d[2];
+ double Sb;
+ double d_u_e_Sb;
+ double d_u_cs_Sb;
+ double grad_Sb_2d[2];
+
+ /* Vecteurs des déformations et variables de projection */
+ double chi[3];
+ double u_2d[2];
+ double u_e_2d[2];
+ double u_cs_2d[2];
+ struct projection proj_chi_s;
+ struct projection proj_chi_e;
+ struct projection proj_u_e;
+
+ /* Pour le calcul du poids */
+ double Sb_sensib;
+ double sensib;
+
+ /* Intersections avec la géométrie */
+ struct s3d_hit hit0;
+ struct s3d_hit hit1;
@
+\paragraph{TODO} Les variables du systèmes sont pi et hateur et largeur de la
+géométrie
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Résultats
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Résultats}
+\label{sec:results}
-% TODO mettre le schéma
-
-<<sgs\_compute\_sensitivity\_translation.c>>=
- <<copyright>>
- <<licence>>
-
- <<liste des inclusions>>
-
- <<constantes du système>>
-
- <<boucle d'intégration>>
- <<fonction de réalisation>>
-@
-
-\paragraph{}
-La [[boucle d'intégration]] n'est pas l'objet principal de ce texte et sera
-traité plus tard pour s'intéresser en priorité à la [[fonction de réalisation]].
-
-<<fonction de réalisation>>=
-static res_T
-realisation
- (void* weight,
- struct ssp_rng* rng, /* Random Number Generator */
- const unsigned ithread, /* Thread identifier */
- void* ctx) /* User data */
-{
- <<liste de variables locales>>
- double w = 0; /* Monte-Carlo weight */
- res_T res = RES_OK;
-
- <<récupérer la description de la scène>>
- <<échantilloner un chemin de sensibilité>>
- <<evaluer le poids Monte-Carlo de sensiblité>>
-
-exit:
- SMC_DOUBLE(weight) = w;
- return res;
-error:
- <<traiter l'erreur>>
- goto exit;
-}
-@
-
-% TODO travailler le référencement des blocs de code dans le Latex
+\paragraph{TODO} À écrire qd on aura le programme fonctionnel.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Les données
@@ -749,6 +740,8 @@ error:
\section{Récupérer les données de la scène}
\label{sec:get-scene-data}
+\paragraph{TODO} à mettre en annexe ou pas...
+
\paragraph{}
Algo Monte-Carlo fortement lié à la scène. Pas d'orthogonalité
données/traitement~:
@@ -932,6 +925,62 @@ L(\vec{x},\vec{\omega}_{spec},\PI) \\
-------------------------------- DÉBUT ANNEXE 2 --------------------------------- \\
+\paragraph{TODO} Décaller le calcul suivant en annexe. Renommer [[weight]] car
+on ne calcule pas vraiment une luminance mais la seule partie de la luminance
+qui dépend de $\PI$, dit autrement la seule partie de la luminance qui compte
+pour la sensibilité. Elle pourra donc être utilisé pour vérification par
+différences finies.
+
+
+<<calcul du poids>>=
+ weight = Sb * rho * PI * get_Sr_area(scn);
+@
+
+<<renvoyer le poids>>=
+ w[1] = weight;
+@
+
+<<sgs\_compute\_sensitivity\_translation.c>>=
+ <<copyright>>
+ <<licence>>
+
+ <<liste des inclusions>>
+
+ <<constantes du système>>
+
+ <<boucle d'intégration>>
+ <<fonction de réalisation>>
+@
+
+
+<<???>>=
+/* TODO move me */
+struct sgs_scene {
+ struct sgs_geometry* geom;
+ /* TODO décrire le récepteur */
+};
+
+static int
+hit_receiver
+ (struct sgs_scene* scn,
+ const double pos_emit_s[3],
+ const double dir_emit_s[3],
+ const struct s3d_hit* hit)
+{
+ /* TODO */
+}
+
+static int
+hit_source
+ (struct sgs_scene* scn,
+ const double pos_emit_s[3],
+ const double dir_emit_s[3],
+ const struct s3d_hit* hit)
+{
+ /* TODO */
+}
+@
+
<<decomposition>>=
struct projection {
double alpha;