+\@writefile{lof}{\contentsline {figure}{\numberline {1.1}{\ignorespaces Overview of contribution photon mapping workflow. Green paths denote inputs (parameters and sensor positions), while red paths denote output. Light source contributions for modifier mod are binned using an $\left \lfloor \sqrt {nbins}\right \rfloor ^2$ Shirley-Chiu disk-to-square mapping, and wavelet compressed for a fraction $\mathit {precomp}$ of photons by \textit {\textbf {mkpmap}}\/. These contributions are saved along with the corresponding photons in separate files for each modifier, grouped in a subdirectory under the parent photon map $\mathit {pmapfile}$. The photons and their precomputed contributions are subsequently paged on demand, uncompressed, and cached by \textit {\textbf {rcontrib}}\/, which passes the contributions to the standard contribution calculation used by \textit {\textbf {rcontrib classic$^\textsf {\tiny TM}$}}\/. \relax }}{5}{figure.caption.2}\protected@file@percent }
+\newlabel{fig:overview}{{1.1}{5}{Overview of contribution photon mapping workflow. Green paths denote inputs (parameters and sensor positions), while red paths denote output. Light source contributions for modifier mod are binned using an $\left \lfloor \sqrt {nbins}\right \rfloor ^2$ Shirley-Chiu disk-to-square mapping, and wavelet compressed for a fraction \var {precomp} of photons by \mkpmap . These contributions are saved along with the corresponding photons in separate files for each modifier, grouped in a subdirectory under the parent photon map \var {pmapfile}. The photons and their precomputed contributions are subsequently paged on demand, uncompressed, and cached by \rcontrib , which passes the contributions to the standard contribution calculation used by \rcClassic . \relax }{figure.caption.2}{}}
+\@writefile{toc}{\contentsline {chapter}{\numberline {2}Proof of Concept}{7}{chapter.2}\protected@file@percent }
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{toc}{\contentsline {section}{\numberline {2.1}Rationale and Prototyping}{7}{section.2.1}\protected@file@percent }
+\citation{Lee2019}
+\@writefile{toc}{\contentsline {section}{\numberline {2.2}Initial Compression Tests with \textit {\textbf {pywavelets}}\/}{8}{section.2.2}\protected@file@percent }
+\newlabel{sec:waveletPoC}{{2.2}{8}{Initial Compression Tests with \cmd {pywavelets}}{section.2.2}{}}
+\citation{ward-RGBE-1994}
+\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Daubechies wavelet transform of Reinhart MF:4 mapped solar contributions (2305 bins) after thresholding 90\% of coefficients. In their original linear ordering (left), the binned contributions exhibit isolated discontinuities (peaks) which are poorly decorrelated by the wavelet transform, resulting in obvious compression artefacts. Ordering the contributions by increasing magnitude (right) imposes corellation and significantly reduces these artefacts. This reordering however complicates the reconstruction of the contributions, and doesn't decorellate the contributions in their original hemispherical domain. \relax }}{9}{figure.caption.3}\protected@file@percent }
+\newlabel{fig:solarcont-mf4}{{2.1}{9}{Daubechies wavelet transform of Reinhart MF:4 mapped solar contributions (2305 bins) after thresholding 90\% of coefficients. In their original linear ordering (left), the binned contributions exhibit isolated discontinuities (peaks) which are poorly decorrelated by the wavelet transform, resulting in obvious compression artefacts. Ordering the contributions by increasing magnitude (right) imposes corellation and significantly reduces these artefacts. This reordering however complicates the reconstruction of the contributions, and doesn't decorellate the contributions in their original hemispherical domain. \relax }{figure.caption.3}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Logarthmic plot of absolute wavelet coefficient magnitudes after normalisation. The coefficients (magenta crosses) are clustered in bands of increasing frequency from left to right, with the number of coefficients doubling in consecutive bands due to the wavelet transform's multiresolution analysis. In this example, the dynamic range of the coefficients is limited to ca. 10 orders of magnitude. It is also evident that the coefficients at the bottom between $10^{-19}$ and $10^{-20}$ are negligible and can be omitted. It follows therefore that it suffices to encode coefficients up to the green line at ca. $4.6^{-10}$; this corresponds to an effective range of $[2^{-31}, 1]$, which can be encoded using a 5-bit binary mantissa. In practice, thresholding the coefficients will further reduce this dynamic range. \relax }}{10}{figure.caption.4}\protected@file@percent }
+\newlabel{fig:coeffRange}{{2.2}{10}{Logarthmic plot of absolute wavelet coefficient magnitudes after normalisation. The coefficients (magenta crosses) are clustered in bands of increasing frequency from left to right, with the number of coefficients doubling in consecutive bands due to the wavelet transform's multiresolution analysis. In this example, the dynamic range of the coefficients is limited to ca. 10 orders of magnitude. It is also evident that the coefficients at the bottom between $10^{-19}$ and $10^{-20}$ are negligible and can be omitted. It follows therefore that it suffices to encode coefficients up to the green line at ca. $4.6^{-10}$; this corresponds to an effective range of $[2^{-31}, 1]$, which can be encoded using a 5-bit binary mantissa. In practice, thresholding the coefficients will further reduce this dynamic range. \relax }{figure.caption.4}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Logarithmic plot of wavelet coefficient range in figure \ref {fig:coeffRange} (top, detail inset at bottom) with encoded/decoded mRGBE coefficients superimposed as blue circles. Despite the limited precision (4 RGB mantissa bits + 1 sign, 5 exponent bits), the mRGBE encoding correlates well with the original floating point values within the constrained dynamic range $[2^{-31}, 1]$ covered by the exponent. \relax }}{11}{figure.caption.5}\protected@file@percent }
+\newlabel{fig:mrgbeTest}{{2.3}{11}{Logarithmic plot of wavelet coefficient range in figure \ref {fig:coeffRange} (top, detail inset at bottom) with encoded/decoded mRGBE coefficients superimposed as blue circles. Despite the limited precision (4 RGB mantissa bits + 1 sign, 5 exponent bits), the mRGBE encoding correlates well with the original floating point values within the constrained dynamic range $[2^{-31}, 1]$ covered by the exponent. \relax }{figure.caption.5}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.2}Binning of Contributions}{13}{subsection.3.1.2}\protected@file@percent }
+\newlabel{sec:binning}{{3.1.2}{13}{Binning of Contributions}{subsection.3.1.2}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Shirley-Chiu disk-to-square mapping used to bin contribution photon directions. This mapping has the desirable property of preserving adjacency and fractional area. The disk is obtained by projecting the hemisphere of photon directions onto the plane defined by the surface normal $[rNx,\tmspace +\medmuskip {.2222em} rNy,\tmspace +\medmuskip {.2222em} rNz]$. The polar angle origin $\phi = 0$ in the disk is defined by the up vector $[Ux,\tmspace +\medmuskip {.2222em} Uy,\tmspace +\medmuskip {.2222em} Uz]$. \relax }}{14}{figure.caption.6}\protected@file@percent }
+\newlabel{fig:shirleyChiu}{{3.1}{14}{Shirley-Chiu disk-to-square mapping used to bin contribution photon directions. This mapping has the desirable property of preserving adjacency and fractional area. The disk is obtained by projecting the hemisphere of photon directions onto the plane defined by the surface normal $[rNx,\: rNy,\: rNz]$. The polar angle origin $\phi = 0$ in the disk is defined by the up vector $[Ux,\: Uy,\: Uz]$. \relax }{figure.caption.6}{}}
+\newlabel{eq:linearIdx}{{3.1}{14}{Binning of Contributions}{equation.3.1.1}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.3}Precomputation of Contribution Photons}{14}{subsection.3.1.3}\protected@file@percent }
+\newlabel{sec:precomp}{{3.1.3}{14}{Precomputation of Contribution Photons}{subsection.3.1.3}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces Daubechies DB2 ``4-tap'' wavelet function. The scaling function (blue) decorrelates the input signal as approximation coefficients. The wavelet function (red) -- itself orthogonal to the scaling function -- decorrelates the input as detail coefficients. Note the asymmetry of this wavelet family. This wavelet has a support of 4 adjacent samples and balances computational efficiency and boundary effects for poorer decorrelation compared to wavelets with larger supports, but also higher computational expense. \relax }}{17}{figure.caption.7}\protected@file@percent }
+\newlabel{fig:waveletFunc}{{3.2}{17}{Daubechies DB2 ``4-tap'' wavelet function. The scaling function (blue) decorrelates the input signal as approximation coefficients. The wavelet function (red) -- itself orthogonal to the scaling function -- decorrelates the input as detail coefficients. Note the asymmetry of this wavelet family. This wavelet has a support of 4 adjacent samples and balances computational efficiency and boundary effects for poorer decorrelation compared to wavelets with larger supports, but also higher computational expense. \relax }{figure.caption.7}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.3}{\ignorespaces Sample output of wavelet unit test for 16$\times $16 bins, showing the first two resolution levels of the 2D wavelet transform, each consisting of transform steps over the horizontal and vertical axes. The output of each transform step (right of arrows) becomes the input for the next step (left of arrows). Starting with the original input samples $y_{i,j}$, each step generates a set of approximation coefficients $s_{i,j}$ (red arrows) and detail coefficients $d_{i,j}$ (green arrows). To alternate the transform axes, the implementation transposes the output matrix on the fly (note the reversed output coefficient indices), consequently the transform need only be performed along one axis, which simplifies indexing; the original matrix orientation is then restored every two steps. After each iteration (horizontal/vertical transform pair), the approximation coefficients $s(\ldots (s_{i,j})\ldots ) = (s_{i,j})^k$ in the upper left of the output matrix become the input for the next (halved) resolution level. The sizes of the progressively smaller output submatrices (indicated by square brackets) include padding coefficients. Consequently, the output matrix leaves unoccupied cells (indicated by dots) to accommodate these additional coefficients, which accumulate in the upper left of the matrix in subsequent resolution levels. \relax }}{18}{figure.caption.8}\protected@file@percent }
+\newlabel{fig:waveletStep}{{3.3}{18}{Sample output of wavelet unit test for 16$\times $16 bins, showing the first two resolution levels of the 2D wavelet transform, each consisting of transform steps over the horizontal and vertical axes. The output of each transform step (right of arrows) becomes the input for the next step (left of arrows). Starting with the original input samples $y_{i,j}$, each step generates a set of approximation coefficients $s_{i,j}$ (red arrows) and detail coefficients $d_{i,j}$ (green arrows). To alternate the transform axes, the implementation transposes the output matrix on the fly (note the reversed output coefficient indices), consequently the transform need only be performed along one axis, which simplifies indexing; the original matrix orientation is then restored every two steps. After each iteration (horizontal/vertical transform pair), the approximation coefficients $s(\ldots (s_{i,j})\ldots ) = (s_{i,j})^k$ in the upper left of the output matrix become the input for the next (halved) resolution level. The sizes of the progressively smaller output submatrices (indicated by square brackets) include padding coefficients. Consequently, the output matrix leaves unoccupied cells (indicated by dots) to accommodate these additional coefficients, which accumulate in the upper left of the matrix in subsequent resolution levels. \relax }{figure.caption.8}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.4}{\ignorespaces Sample output of wavelet unit test for 16$\times $16 bins, showing the wavelet coefficient matrix after a full transform. The coloured fields identify the coefficient type ( red = approximation $s$, green = detail $d$) and the successive transform steps, from right to left. Each iteration generates coefficients from those of prior iterations at higher resolutions: approximations of prior details $sd$ (lower left), details of prior approximations $ds$ (upper right), details of prior details $dd$ (lower right), approximations of prior approximation $ss$ (upper left). Each subsequent iteration then recurses into the upper left submatrix, using the approximations $ss$ as increasingly coarse representations of the original contributions as input. After the final iteration, the red submatrix in the upper left corner contains the 3$\times $3 coarsest approximations. \relax }}{19}{figure.caption.9}\protected@file@percent }
+\newlabel{fig:waveletCoeffsFull}{{3.4}{19}{Sample output of wavelet unit test for 16$\times $16 bins, showing the wavelet coefficient matrix after a full transform. The coloured fields identify the coefficient type ( red = approximation $s$, green = detail $d$) and the successive transform steps, from right to left. Each iteration generates coefficients from those of prior iterations at higher resolutions: approximations of prior details $sd$ (lower left), details of prior approximations $ds$ (upper right), details of prior details $dd$ (lower right), approximations of prior approximation $ss$ (upper left). Each subsequent iteration then recurses into the upper left submatrix, using the approximations $ss$ as increasingly coarse representations of the original contributions as input. After the final iteration, the red submatrix in the upper left corner contains the 3$\times $3 coarsest approximations. \relax }{figure.caption.9}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.5}{\ignorespaces Example of boundary extension at the right edge of a signal of length $l$, consisting of samples $y_{i,0} \ldots y_{i,l-1}$. Common extension modes include zero (gray), symmetric/reflection (green), constant (red), and 1st order gradient (blue). \relax }}{20}{figure.caption.10}\protected@file@percent }
+\newlabel{fig:boundaryExt}{{3.5}{20}{Example of boundary extension at the right edge of a signal of length $l$, consisting of samples $y_{i,0} \ldots y_{i,l-1}$. Common extension modes include zero (gray), symmetric/reflection (green), constant (red), and 1st order gradient (blue). \relax }{figure.caption.10}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.6}{\ignorespaces The coefficient matrix from figure \ref {fig:waveletCoeffsFull} after thresholding the 75\% coefficients with the lowest absolute value, implicitly setting these to zero (indicated by bracketed dots). For contributions with a low gradient, as is typically the case with sky luminance distributions, the lowest coefficients will mostly be the details in the submatrices highlighted in green. The coarsest approximation coefficients in the upper left submatrix (highlighted in red) are essential for reconstructing the original matrix, and are therefore never thresholded. \relax }}{22}{figure.caption.11}\protected@file@percent }
+\newlabel{fig:waveletCoeffsThresh}{{3.6}{22}{The coefficient matrix from figure \ref {fig:waveletCoeffsFull} after thresholding the 75\% coefficients with the lowest absolute value, implicitly setting these to zero (indicated by bracketed dots). For contributions with a low gradient, as is typically the case with sky luminance distributions, the lowest coefficients will mostly be the details in the submatrices highlighted in green. The coarsest approximation coefficients in the upper left submatrix (highlighted in red) are essential for reconstructing the original matrix, and are therefore never thresholded. \relax }{figure.caption.11}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.7}{\ignorespaces Structure of 32-bit mRGBE encoding for wavelet coefficients. The encoding consists of three mantissae per RGB colour channel. a common exponent (base 2), and an associated payload data field to store the coefficient index (linearised from its 2D matrix indices). The bits can be allocated within the 32-bit envelope at compile-time to trade off precision, encoding range, and payload data range. The default configuration, \textit {\textbf {MANTBITS}}\/ = 6, \textit {\textbf {EXPBITS}}\/ = 5, \textit {\textbf {DATABITS}}\/ = 9 (abbreviated 6:6:6:5:9), balances these confliciting requirements. \relax }}{24}{figure.caption.12}\protected@file@percent }
+\newlabel{fig:mrgbeStruct}{{3.7}{24}{Structure of 32-bit mRGBE encoding for wavelet coefficients. The encoding consists of three mantissae per RGB colour channel. a common exponent (base 2), and an associated payload data field to store the coefficient index (linearised from its 2D matrix indices). The bits can be allocated within the 32-bit envelope at compile-time to trade off precision, encoding range, and payload data range. The default configuration, \cmd {MANTBITS} = 6, \cmd {EXPBITS} = 5, \cmd {DATABITS} = 9 (abbreviated 6:6:6:5:9), balances these confliciting requirements. \relax }{figure.caption.12}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.9}Building and Saving Precomputed Contribution Photon Maps}{25}{subsection.3.1.9}\protected@file@percent }
+\newlabel{sec:buildSave}{{3.1.9}{25}{Building and Saving Precomputed Contribution Photon Maps}{subsection.3.1.9}{}}
+\citation{schregle-techreport-2016}
+\citation{Knuth:1998:ACP:280635}
+\citation{Seyedafsari:2010}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.10}Logarithmic vs. Linear Encoding of Contributions}{27}{subsection.3.1.10}\protected@file@percent }
+\newlabel{sec:logEncoding}{{3.1.10}{27}{Logarithmic vs. Linear Encoding of Contributions}{subsection.3.1.10}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.8}{\ignorespaces Bias caused by sparsely binned contributions. With 64 bins (right, shown for bin 63), an average of 90\% of bins contain nonzero contributions. With 256 bins (left, shown for bin 255), this ratio drops to under 50\%, leading to obvious bias, notably on the left wall and ceiling. See figure section \ref {sec:cpmapTestHDR} for a description of the scene and a composite rendering of all bins. \relax }}{28}{figure.caption.13}\protected@file@percent }
+\newlabel{fig:cpmapTest-emptyBinsHDR}{{3.8}{28}{Bias caused by sparsely binned contributions. With 64 bins (right, shown for bin 63), an average of 90\% of bins contain nonzero contributions. With 256 bins (left, shown for bin 255), this ratio drops to under 50\%, leading to obvious bias, notably on the left wall and ceiling. See figure section \ref {sec:cpmapTestHDR} for a description of the scene and a composite rendering of all bins. \relax }{figure.caption.13}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.9}{\ignorespaces Graph of empty bin ratio (averaged over all precomputed photons) as a function of the number of bins. This ratio rises sharply above 9$\times $9 = 81 bins, indicating the majority of precomputed contributions include unpopulated bins, which in turn manifests itself as visible bias as shown figure \ref {fig:cpmapTest-emptyBinsHDR}. \relax }}{29}{figure.caption.14}\protected@file@percent }
+\newlabel{fig:cpmapTest-emptyBinsPlot}{{3.9}{29}{Graph of empty bin ratio (averaged over all precomputed photons) as a function of the number of bins. This ratio rises sharply above 9$\times $9 = 81 bins, indicating the majority of precomputed contributions include unpopulated bins, which in turn manifests itself as visible bias as shown figure \ref {fig:cpmapTest-emptyBinsHDR}. \relax }{figure.caption.14}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Contribution Binning Unit Test}{30}{subsection.3.2.1}\protected@file@percent }
+\newlabel{sec:pmapcontrib-test}{{3.2.1}{30}{Contribution Binning Unit Test}{subsection.3.2.1}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.10}{\ignorespaces Output of contribution binning unit test for an 8$\times $8 Shirley-Chiu mapping. \relax }}{30}{figure.caption.15}\protected@file@percent }
+\newlabel{fig:pmapcontrib-test}{{3.10}{30}{Output of contribution binning unit test for an 8$\times $8 Shirley-Chiu mapping. \relax }{figure.caption.15}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Wavelet Unit Test}{30}{subsection.3.2.2}\protected@file@percent }
+\newlabel{sec:wavelet3-test}{{3.2.2}{30}{Wavelet Unit Test}{subsection.3.2.2}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.11}{\ignorespaces Output of the wavelet transform unit test for a 5$\times $5 input matrix with thresholding (the mRGBE output is omitted for the sake of brevity). Space for padding coefficients in the matrix is indicated by dots, while thresholded coefficients are indicated by dots surrounded by square brackets. \relax }}{32}{figure.caption.16}\protected@file@percent }
+\newlabel{fig:wavelet3-test}{{3.11}{32}{Output of the wavelet transform unit test for a 5$\times $5 input matrix with thresholding (the mRGBE output is omitted for the sake of brevity). Space for padding coefficients in the matrix is indicated by dots, while thresholded coefficients are indicated by dots surrounded by square brackets. \relax }{figure.caption.16}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}mRGBE Unit Test}{34}{subsection.3.2.3}\protected@file@percent }
+\newlabel{sec:mrgbe-test}{{3.2.3}{34}{mRGBE Unit Test}{subsection.3.2.3}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.12}{\ignorespaces Sample output of mRGBE unit test for a 6:6:6:5:9 mRGBE bit configuration. With 6 bits per mantissa, the RMSE averages around 3\%. \relax }}{34}{figure.caption.17}\protected@file@percent }
+\newlabel{fig:mrgbe-test}{{3.12}{34}{Sample output of mRGBE unit test for a 6:6:6:5:9 mRGBE bit configuration. With 6 bits per mantissa, the RMSE averages around 3\%. \relax }{figure.caption.17}{}}
+\citation{schregle-techreport-2016}
+\@writefile{toc}{\contentsline {section}{\numberline {3.3}Precomputed Contribution Evaluation with \textit {\textbf {rcontrib}}\/}{35}{section.3.3}\protected@file@percent }
+\newlabel{lst:skycontrib-1024.sh}{{4.1}{40}{Script to bin sky contributions with \rcClassic {} using Shirley-Chiu mapping. Note the use of the \opt {-c} option to sample multiple rays per bin and reduce variance. }{lstlisting.4.1}{}}
+\@writefile{lol}{\contentsline {lstlisting}{\numberline {4.1}Script to bin sky contributions with \textit {\textbf {rcontrib classic$^\textsf {\tiny TM}$}}\/{} using Shirley-Chiu mapping. Note the use of the \textbf {-c} option to sample multiple rays per bin and reduce variance. }{40}{lstlisting.4.1}\protected@file@percent }
+\@writefile{lof}{\contentsline {figure}{\numberline {4.1}{\ignorespaces Colourmaps of wavelet coefficient matrix (left) and reconstructed contributions (right) from a CIE sky model for different compression ratios. Black regions in the coefficient matrix indicate unused or thresholded coefficients. The original sky distribution and binned contributions are shown in \ref {fig:skycontrib1024-cie-orig}. \relax }}{41}{figure.caption.19}\protected@file@percent }
+\newlabel{lst:cpmapTestHDR-rc}{{4.2}{44}{Script to generate the per-bin fisheye renderings in figure \ref {fig:cpmapTestHDR-rc} with \rcClassic . }{lstlisting.4.2}{}}
+\@writefile{lol}{\contentsline {lstlisting}{\numberline {4.2}Script to generate the per-bin fisheye renderings in figure \ref {fig:cpmapTestHDR-rc} with \textit {\textbf {rcontrib classic$^\textsf {\tiny TM}$}}\/. }{44}{lstlisting.4.2}\protected@file@percent }
+\newlabel{fig:skycontrib1024-hdr-orig}{{4.2a}{45}{Original: HDR camera capture (left), binned contributions (right). \relax }{figure.caption.22}{}}
+\newlabel{sub@fig:skycontrib1024-hdr-orig}{{a}{45}{Original: HDR camera capture (left), binned contributions (right). \relax }{figure.caption.22}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.2}{\ignorespaces Colourmaps of wavelet coefficient matrix (left) and reconstructed contributions (right) from an HDR sky capture for different compression ratios. Black regions in the coefficient matrix indicate unused or thresholded coefficients. The original sky distribution and binned contributions are shown in \ref {fig:skycontrib1024-hdr-orig}. \relax }}{45}{figure.caption.22}\protected@file@percent }
+\newlabel{lst:cpmapTestHDR-pmap}{{4.3}{48}{Script to generate the per-bin fisheye renderings in figure \ref {fig:cpmapTestHDR-pmap} with \rcontrib {} using precomputed contribution photon mapping. }{lstlisting.4.3}{}}
+\@writefile{lol}{\contentsline {lstlisting}{\numberline {4.3}Script to generate the per-bin fisheye renderings in figure \ref {fig:cpmapTestHDR-pmap} with \textit {\textbf {rcontrib}}\/{} using precomputed contribution photon mapping. }{48}{lstlisting.4.3}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {4.3}Wavelet Compression and Boundary Artefacts}{48}{section.4.3}\protected@file@percent }
+\@writefile{lof}{\contentsline {figure}{\numberline {4.3}{\ignorespaces Falsecolour rendered contributions from \textit {\textbf {rcontrib classic$^\textsf {\tiny TM}$}}\/{} for each of 64 bins in the bilaterally lit test scene containing 3970 solar positions. The sensor is located in to centre of the space on the floor, facing the zenith. The glazings on either side of the space are tinted cyan. This sequence was rendered with up to 4 ambient bounces \textbf {-ab 4}. On 20 cores, the renderings took ca. 1 hour to complete at 256$\times $256 pixels per bin. \relax }}{49}{figure.caption.27}\protected@file@percent }
+\newlabel{fig:cpmapTestHDR-rc}{{4.3}{49}{Falsecolour rendered contributions from \rcClassic {} for each of 64 bins in the bilaterally lit test scene containing 3970 solar positions. The sensor is located in to centre of the space on the floor, facing the zenith. The glazings on either side of the space are tinted cyan. This sequence was rendered with up to 4 ambient bounces \opt {-ab 4}. On 20 cores, the renderings took ca. 1 hour to complete at 256$\times $256 pixels per bin. \relax }{figure.caption.27}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.4}{\ignorespaces The bilaterally lit scene from figure \ref {fig:cpmapTestHDR-rc} rendered with precomputed contribution photons after 80\% wavelet compression. This sequence was rendered with \textbf {-ab -1}, consequently no ambient bounces are performed. This greatly accelerates computation at the expense of some noise: on 20 cores, the entire sequence took just 14 seconds to complete at 256$\times $256 pixels per bin. \relax }}{50}{figure.caption.28}\protected@file@percent }
+\newlabel{fig:cpmapTestHDR-pmap}{{4.4}{50}{The bilaterally lit scene from figure \ref {fig:cpmapTestHDR-rc} rendered with precomputed contribution photons after 80\% wavelet compression. This sequence was rendered with \opt {-ab -1}, consequently no ambient bounces are performed. This greatly accelerates computation at the expense of some noise: on 20 cores, the entire sequence took just 14 seconds to complete at 256$\times $256 pixels per bin. \relax }{figure.caption.28}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.5}{\ignorespaces 3D plots of contributions calculated by \textit {\textbf {rcontrib classic$^\textsf {\tiny TM}$}}\/{} (blue) and photon map (red) in the bilaterally lit scene. The contributions are accumulated in 256 bins for a sensor located in the centre of the floor. The contribution photon map was compressed with ratios of 0.5 to 0.9. In this example, compression artefacts appear at the boundaries (corresponding to the horizon) with 80\% compression and above. This is a known limitation of wavelet compression if the input signal exhibits high gradients at the boundary. \relax }}{51}{figure.caption.29}\protected@file@percent }
+\newlabel{fig:contribCompression}{{4.5}{51}{3D plots of contributions calculated by \rcClassic {} (blue) and photon map (red) in the bilaterally lit scene. The contributions are accumulated in 256 bins for a sensor located in the centre of the floor. The contribution photon map was compressed with ratios of 0.5 to 0.9. In this example, compression artefacts appear at the boundaries (corresponding to the horizon) with 80\% compression and above. This is a known limitation of wavelet compression if the input signal exhibits high gradients at the boundary. \relax }{figure.caption.29}{}}
+\newlabel{lst:codeDefs1}{{A.1}{55}{Source code definitions in \cmd {pmapcontrib.h} relevant to precomputed contribution photons. }{lstlisting.A.1}{}}
+\@writefile{lol}{\contentsline {lstlisting}{\numberline {A.1}Source code definitions in \textit {\textbf {pmapcontrib.h}}\/ relevant to precomputed contribution photons. }{55}{lstlisting.A.1}\protected@file@percent }
+\newlabel{lst:codeDefs2}{{A.2}{56}{Source code definitions in \cmd {wavelet2.h} and \cmd {mrgbe.h} relevant to precomputed contribution photons. }{lstlisting.A.2}{}}
+\@writefile{lol}{\contentsline {lstlisting}{\numberline {A.2}Source code definitions in \textit {\textbf {wavelet2.h}}\/ and \textit {\textbf {mrgbe.h}}\/ relevant to precomputed contribution photons. }{56}{lstlisting.A.2}\protected@file@percent }
+\newlabel{lst:codeDefs3}{{A.3}{57}{Source code definitions in \cmd {pmapdata.h} relevant to precomputed contribution photons. }{lstlisting.A.3}{}}
+\@writefile{lol}{\contentsline {lstlisting}{\numberline {A.3}Source code definitions in \textit {\textbf {pmapdata.h}}\/ relevant to precomputed contribution photons. }{57}{lstlisting.A.3}\protected@file@percent }
+\newlabel{RF1}{{\caption@xref {??}{ on input line 3095}}{59}}
+\@writefile{lof}{\contentsline {figure}{\numberline {B.1}{\ignorespaces Software architecture of precomputed contribution photon map in the context of \textit {\textbf {mkpmap}}\/. Red arrows represent function calls, ordered top-down. \relax }}{59}{figure.caption.35}\protected@file@percent }
+\newlabel{fig:swarch-mkpmap}{{B.1}{59}{Software architecture of precomputed contribution photon map in the context of \cmd {mkpmap}. Red arrows represent function calls, ordered top-down. \relax }{figure.caption.35}{}}
+\newlabel{RF2}{{\caption@xref {??}{ on input line 3107}}{60}}
+\@writefile{lof}{\contentsline {figure}{\numberline {B.2}{\ignorespaces Software architecture of precomputed contribution photon map in the context of \textit {\textbf {rcontrib}}\/. Red Arrows represent function calls, ordered top-down. \relax }}{60}{figure.caption.36}\protected@file@percent }
+\newlabel{fig:swarch-rcontrib}{{B.2}{60}{Software architecture of precomputed contribution photon map in the context of \cmd {rcontrib}. Red Arrows represent function calls, ordered top-down. \relax }{figure.caption.36}{}}