# Implementing Many-Lights Rendering with IES-Based Lights
## 2 State of the Art on Many-Lights Rendering Techniques  
The concept at the basis of Many-Lights techniques is quite straightforward. The rendering process is split into two steps: the first step consists of the generation of a certain amount of VPLs in the scene. This process can follow established approaches for the generation of _light transport paths_, such as in the photon tracing pass in photon mapping [9] or other Monte Carlo methods [2]. In the Many-Lights approach, every time the light ray bounces on a surface in the scene, information related to the intersection point is saved:position \(\mathbf{x}\), normal \(\mathbf{n}\), incident direction \(\omega_{i}\), incoming radiance \(L_{i}(\mathbf{x},\omega_{i})\) (appropriately reduced at each bounce), and bidirectional reflectance distribution function \(f_{\mathbf{r}}(\mathbf{x},\omega_{i},\omega_{0})\). This is the core intuition of Many-Lights techniques: these data are sufficient to compute the irradiance coming from each point of the light path. As a consequence, each point of a light path can be considered as a _virtual_ light source, contributing to the overall illumination of the scene. Thus, the Many-Lights approach _redefines_ the classical concept of light transport paths used by other GI models [2] and enables dealing with GI without using a different technique for each component. In the second step, the irradiance in each pixel is approximated by calculating the sum of the direct illumination contributions from all the light sources in the scene, i.e., the \"actual\" light sources and also the set of generated VPLs. Using as an example the seminal _Instant Radiosity_[10] method, the radiance reflected by a point \(\mathbf{x}_{1}\) towards the camera in \(\mathbf{x}_{0}\) is provided by [7]  
\[\langle L(\mathbf{x}_{1}\rightarrow\mathbf{x}_{0})\rangle=\sum_{k=1}^{M}f_{ \mathbf{r}}(\mathbf{x}_{1})G(\mathbf{x}_{1},\mathbf{x}_{2}^{k})\hat{V}( \mathbf{x}_{1},\mathbf{x}_{2}^{k})\Phi_{\mathrm{k}} \tag{2}\]  
where  
* \(M\) is the number of generated VPLs
* \(\mathbf{x}_{2}^{k}\) is the position of the \(k\)-th VPL
* \(\hat{V}(\mathbf{x}_{1},\mathbf{x}_{2}^{k})\) is the visibility term between the \(k\)-th VPL and the point we are shading
* \(f_{\mathbf{r}}(\mathbf{x}_{1})\) is the BRDFs of point \(\mathbf{x}_{1}\). We use a simplified notation because only diffuse reflection is considered. * \(G(\mathbf{x}_{1},\mathbf{x}_{2}^{k})\) is the geometry term between the \(k\)-th VPL and the point we are shading
* \(\Phi_{\mathrm{k}}\) is the \"flux\" of the \(k\)-th VPL (i.e., the component of radiance \"emitted\" by the \(k\)-th VPL). It is calculated as: \(\Phi_{\mathrm{k}}=f_{\mathbf{r}}(\mathbf{x}_{2}^{k})L_{i}(\mathbf{x}_{2}^{k},\omega_{\mathrm{i}}^{k})(\omega_{\mathrm{i}}^{k}\cdot\mathbf{n}^{k})\). Figure 1 shows a schematic description of the two stages of a standard Many-Lights technique. Figure 1: The two steps of a generic Multi-Lights rendering technique. On the (**left**): generation of VPLs on different surfaces of a scene. On the (**right**): rendering process taking into account the effect of the different VPLs. The image considers multiple light bounces, which are applied only in _offline_ rendering. Many-Lights techniques applied in real-time rendering (like the proposed method) usually consider just a single light bounce (e.g., as in the case of the object in the center of the scene). Original image from [6]. A wide range of deriving algorithms have been devised starting from this idea, each one focused to address different needs with regard to performance or image quality. As an example, some techniques [11; 12; 13] focused on solving bias issues with the original formulation of Instant Radiosity, for example optimizing or redefining the generation process of the VPLs. Many-Lights techniques scale according to the number of VPLs that are considered. A few light sources can roughly approximate the illumination of a scene, producing biased artifact-free images in a short rendering time, as demonstrated in [14; 15].