1 Introduction

Monte Carlo integration methods for global illumination have shown their elegance and generality when handling physically based light transport. They are able to accurately synthesise a wide range of optical effects and surface materials while maintaining relative simplicity. The cost of this generality is their poor convergence, often requiring thousands of samples per pixel to reduce noise to desirable levels. Techniques for combating noise such as importance sampling and low discrepancy distributions are beneficial, but still provide slow convergence and spiked noise. To accurately estimate the measured radiance through a pixel in a path based Monte Carlo renderer, we must evaluate the radiance from all surface points visible through that pixel:

$$ P_{(i,j)} = \int_{S} \int_{\varOmega} L_{e}(x, \boldsymbol{\omega}) + L_{r}(x, \boldsymbol{\omega})\, \textrm{d}x \,\textrm{d}\boldsymbol{\omega} $$
(1)

where L e and L r are the emission from and radiance arriving at a point on a surface x from the set of all visible surface positions xS and scattered in the direction of the camera ω. To estimate L r , we must further integrate over the hemisphere above x to account for the radiance arriving from all directions ω′:

$$ L_{r}(x, \boldsymbol{\omega}) = \int _{\varOmega} L_{i}\bigl(x,\boldsymbol{\omega}'\bigr) f_{r}\bigl(x,\boldsymbol{\omega},\boldsymbol{\omega}'\bigr) \bigl( \mathbf {n} \cdot\boldsymbol{\omega}'\bigr)\, \textrm{d} \boldsymbol{\omega}' $$
(2)

where L i is the radiance arriving at the surface from ω′, f r and n are the bidirectional scattering distribution function (BSDF) and shading normal at x, respectively. Filtering techniques rely on pixel coherence, providing low bias noise removal in regions where pixel integrals exhibit similarity. For regions where pixel coherence breaks down, low variance sources such as geometry and texture buffers are often employed to help preserve edges. Such methods have been popular due to their fast performance, but often sacrifice quality, resulting in filtering artefacts, loss of high frequency features, or limitations to certain light transport; wherein lies the strength of Monte Carlo methods.

In this work we present a novel framework for the dynamic storage and filtering of Monte Carlo samples that effectively removes noise whilst preserving high frequency features in both texture and incident illumination. We perform per-pixel clustering over the incoming radiance of each path contribution, separated by their path length. This results in a clustering framework of multiple layers that together represent the pixel integral. Treating path tracing as a Poisson process, these clusters allow us to compare the frequency of sample occurrences in a pixel with the occurrence of similar luminance samples in its neighbourhood. From this we gain two advantages. First, we identify and temporarily remove high energy noise in the irradiance, which is otherwise difficult to distribute across the image often leading to splotchy artefacts. Second, we compare clusters of similar luminance across an image-space filter kernel, allowing us to derive filter weights based on similarities in irradiance. Combined with geometric edge detection from depth and normal buffers, we reduce bias across edges from high and low variance sources. Furthermore, complex texture detail is preserved since we filter the incoming radiance, allowing us to maximise kernel bandwidth and pixel correlation across regions with complex textures. The final pixel radiance is reconstructed from our filtered irradiance using texture data from the rendering pass. Our method effectively filters noise from the incident illumination, whilst preserving hard gradients and edges that are otherwise difficult to identify, providing important visual cues and realism for complex materials and light transport. The main contributions of our paper are therefore:

  • Novel layer based clustering, which accurately represents changes in incident illumination.

  • A probabilistic, discontinuity aware image-space filtering algorithm that is sensitive to illumination from multiple overlapping sources.

  • Image based irradiance filtering, enabling the preservation of complex texture detail without the need to store BRDFs.

  • To our knowledge, the introduction of the Poisson probability distribution to noise removal, and a framework that is reliable at low sample counts.

  • High intensity noise removal, tunable post-render and suitable in image-based filtering.

2 Related work

Adaptive sampling

Adaptive rendering techniques that concentrate samples in high variance regions have shown their effectiveness. Hachisuka et al. [6] introduced a multi-dimensional adaptive sampling technique, estimating error in path space, catering for arbitrary lens effects. However their sample storage does not scale well to suit global illumination and sample reconstruction can be costly. Rousselle et al. [12] combine image-based adaptive sampling with filtering, producing good results and a promising avenue for future methods. Many of these adaptive methods can perform poorly for difficult lighting conditions and high frequency features, reducing efficiency. Path space adaptive methods based on Metropolis sampling and Markov Chain mutations [1, 16] are more effective and generally improve convergence, but still suffer from noise early on and in under sampled areas.

High intensity noise removal

DeCoro et al. [3] employ a sample rejection technique based on the local density in a 5D joint image-colour space, delaying the addition of outlying samples that do not conform to the current neighbourhood. Despite effectively removing high intensity noise in well converged areas, for regions with sparse samples it can have detrimental effects due its harsh rejection properties, resulting in significant energy loss and removal of illumination clues. It also does not consider the relative luminance of samples in the same pixel, removing isolated samples that may not be responsible for noise due to the presence of those with higher energy. Pajot et al. [10] also present density estimation to tackle bright spot removal, based on per-pixel 1D luminance distributions of the observed samples to improve performance. Conversely to DeCoro et al., neighbourhood similarities are not accounted for, leading to the rejection of samples representing important illumination features, but are outliers with respect to a single pixel distribution. Both approaches are unsuitable at lower sample counts, and as a pre-process for image based filtering, the focus of our work. Per-pixel luminance-based clustering is an approach we also employ, supplemented by additional data and with the premise of identifying and filtering illumination discontinuities. As Sect. 4.2 will show, our framework is also suited to high intensity noise removal though we use 1D per-pixel distributions and image space neighbourhood density allowing more robust filtering, adjustable during rendering to eliminate remaining noise that can be left behind by existing methods.

Sample-space reconstruction

Recent methods such as [9, 14] rely on identifying statistical relationships between small numbers of Monte Carlo samples, to remove noise. Whilst providing impressive results and handling large dimensional problems, they do not scale well with increased input samples which are often required to capture more difficult lighting phenomenon.

Irradiance filtering

Ward et al. [17] introduced irradiance caching, storing a sparse set of samples at surface locations and interpolating between neighbours to reconstruct the irradiance at a surface point. Kontkanen et al. [7] use image-based irradiance filtering to reduce noise, but rely on high numbers of samples and additional costly ‘feeler’ rays to detect local geometry. Radiance caching and filtering algorithms have also been proposed [5, 8]. However, all these algorithms either rely on low frequency illumination or BRDFs, or are not applicable to general light transport. Additionally, we build upon unbiased Monte Carlo methods, allowing us to trivially revert to the unbiased solution, unlike cache based methods.

Image-based filtering

Suykens and Willems [15] use per-sample adaptive kernel widths to distribute radiance across pixels during progressive rendering. This transforms noise from higher to lower frequencies which are less objectionable, but does not consider geometric or texture edges resulting in blurry features. Dammertz et al. [2] successfully modify the à-trous wavelet transform, adding filter weights derived from geometry buffers and input samples to filter global illumination in real time. Despite largely respecting both geometric and illumination edges, the à-trous filter can lose texture detail, and present noticeable filtering artefacts. The cross-bilateral filter [4, 11], makes use of range buffers to preserve strong image features resulting from low variance sources, restricting filtering to regions of high similarity. This has shown to produce good results for Monte Carlo rendering (recently [13]). We use the principle of the cross-bilateral filter in our work, and provide comparisons in our results. Schwenk et al. [13] use a perception based blending operator, relying on pixel variance to combine path traced input samples with a filtered image, producing an unbiased algorithm in the limit. It further allows them to use a higher quality cross-bilateral filter for fast previews. Illumination edges and glossy reflections, however, become blurred due to the ignorance of illumination features, the main problem addressed in our paper. Their blending approach is orthogonal to our filtering technique and is in the spirit of our high quality filtering, making it of interest for future integration with our work. Whilst in this paper we do not focus on interactive or GPU rendering, we address a difficult problem not effectively tackled by many authors; detecting discontinuities in high variance illumination. By using a high quality filter, we can provide biased but low noise previews without tight restrictions on feature frequency or surface characteristics common to many approaches.

3 Poisson distribution

Our edge detection makes use of the Poisson discrete probability distribution, which expresses the probability that a given number of events will occur within a specified interval, provided they occur with a known average rate and are generated independently of the interval since the last event. Assuming we have observed an average of λ events in a fixed interval and that the process or processes generating such events are random with respect to the frequency of occurrence, the probability of observing exactly k events is given by

$$ P(X = k) = \frac{ \lambda^{k} e^{-\lambda} }{ k! } $$
(3)

Examples of the Poisson distribution for various mean occurrences are shown in Fig. 1. Notice that the Poisson distribution is a skewed distribution, accounting for the absence of probabilities for negative k. As λ moves away from zero, the Poisson distribution becomes symmetric, following the normal distribution with mean λ and standard deviation \(\sqrt{\lambda}\). The Poisson distribution is especially useful when modelling rare events, where a large number of events may be observed as a result of independent processes, but the generation of each event itself is rare, such is the case in Monte Carlo methods. Samples are generated stochastically during rendering, and despite making use of stratification and importance sampling techniques, the generation of a given sample is not influenced by previous samples.

Fig. 1
figure 1

Poisson distribution showing the probability mass function P(X=k) for various mean number of observed events, λ. Notice as λ increases it more closely resembles the binomial and standard normal distributions

4 Our method

4.1 Rendering and sample clustering

In order to describe our filtering technique, we first detail the organisation of our rendered contributions. We use a standard path tracer with next event estimation, and our method is orthogonal to variance reduction techniques such as importance sampling and Russian Roulette. Our renderer treats the radiance accumulated at the first three path vertices as individual contributions, returning a pair of radiance and irradiance values for each vertex. Although complicating the clustering process, this improves sample separation allowing for easier edge detection during filtering. For low variance pixel integrals this has little impact on filtering performance since we can merge clusters that form a continuum. By separating path contributions, we can filter each layer independently, regardless of the illumination features and noise present in the remaining layers. For each path vertex v, we compute the unbiased radiance contribution R v :

(4)

where \(L_{i}(x_{v},\boldsymbol{\omega}'_{v})\) is the radiance arriving at x v from the light source in the direction \(\boldsymbol{\omega}'_{v}\) (see Fig. 2). Additionally we obtain our irradiance contribution I v by scaling \(L_{i}(x_{v},\boldsymbol{\omega}'_{v})\) by the path throughput from the first non-specular vertex d (where d≥1) to v:

(5)

The influence of the BRDF and texture reflectance present at x d , and the path throughput from x 0 to x d−1 are thus ignored in our calculation of I v . This allows us to preserve high frequency detail for each pixel, whilst sharing the lower frequency irradiance information. The influence of the omitted \(f_{r}(x_{d}, \boldsymbol{\omega}_{d}, \boldsymbol{\omega}_{d}')\) term and path throughput up to d can be recovered by dividing R v by I v ; which becomes useful when deriving our final pixel radiance values after filtering (Sect. 5.2). Each cluster stores aggregated statistics for a subset of samples that are contiguous in the 1D luminance domain of a given layer (Fig. 3).

figure a
Fig. 2
figure 2

Geometry illustration for our irradiance contribution calculations in Eqs. (4) and (5). Radiance arriving at each vertex v is scaled by the path throughput from the first diffuse vertex d to v, omitting the BRDF and texture reflectance at x d

Fig. 3
figure 3

Example plot of our layered clustering for a small neighbourhood of pixels in a shadow penumbra (pixel at (x,y) is the cyan point in Fig. 4). The green and red plots are offset on the y-axis for clarity. Lighting discontinuities form separate clusters, while smooth regions are clustered together. We can see both a highly occluded pixel (blue plot), and a pixel lit by all light sources (red plot)

Along with R v and I v , we also store the number of samples in the cluster and its luminance extents, used to add samples and merge existing clusters during rendering. Clusters for each layer are stored in ascending order of luminance to improve clustering and filtering performance. In order to put an upper bound on our memory usage, we constrain the number of clusters stored for any one pixel layer to eight. Such constraints are adequate for many scenes, since we only need enough clusters to distinguish between samples leading to visible edges. This allows us to merge low luminance groups without reducing the capability of our filter. The sign bit of the sample count indicates whether this cluster has been rejected during our high intensity noise removal.

We rely upon two heuristics to update and maintain our clusters; adding to existing clusters as samples are rendered (creating new clusters if necessary) and merging clusters to maintain a compact approximation of the integral. We render samples in batches of four per pixel to reduce cluster operations while maintaining short frame updates. Cluster merging allows us to refine our model in regions of the integrand with rapid luminance changes, where discontinuities are likely, and reducing storage costs for smooth regions. From Fig. 3 we can observe that cluster gradients can indicate the behaviour of the arriving illumination. Sudden changes in luminance caused by occlusion or reflected discontinuities can be recognised as step-like changes in the integral, whilst gradual changes from surface curvature or light falloff appear as shallower gradients. If a new sample lies within the bounds of an existing cluster or its distance from the nearest cluster is within a percentage threshold μ of the sample then we increment the cluster’s sample count, and add the sample’s R v and I v values. If it lies outside the threshold, we assume that our current clusters do not sufficiently represent the integral at that luminance and insert a single element cluster. The parameter μ dictates how sensitive the overall framework is to changes in luminance, and is the minimum percentage change in sample luminance that our framework can differentiate between during filtering. Our algorithm is not overly sensitive to μ and values between 0.1 and 1.0 (±10 % to ±100 %) produce visibly similar results for our test scenes. We use the same μ value of 0.5 for all images rendered in this paper. Increasing μ improves performance since clusters are merged more readily, providing fewer clusters per pixel. Merging existing clusters relies on a heuristic comparing the absolute luminance difference (first derivative), and change in gradient (second derivative) between neighbouring clusters:

(6)

where C Δ is the gradient of the cluster C:

To perform our merging we evaluate S (n,n+1) for each neighbouring cluster pair in the current layer, merging the clusters where S is smallest in order to maintain a minimal cluster set. We use a constant ϕ to weight the influence of gradient change in our heuristic, and have found a value of 0.75 to behave well by experimentation. Favouring gradient change provides a better balance between cluster merging at extreme ends of the luminance range. For low intensity samples the gradient change is comparatively small, so increasing ϕ favours merging between lower energy clusters, where discontinuities have less visible impact. For high luminance samples the opposite is true, and high values of ϕ separate high intensity outliers and discontinuities. It would be desirable to replace S and μ by a perceptual metric, allowing more optimal clustering.

4.2 High intensity sample rejection

Our high intensity noise removal approach builds on recent density estimation methods by DeCoro et al. [3] and Pajot et al. [10] improving on efficiency, robustness and suitability in image-based filtering. In our approach, we filter irradiance from individual path vertices, as opposed to the final radiance contributions of a complete path. This allows us to ignore texture changes as a source of variance, and by using per-vertex contributions we reject a lower percentage of samples since we can isolate noise from multiple sources (Fig. 4). Neither method operates well over low sample densities, resulting in a large proportion of contributions being removed across a region, providing few input samples for an image based filter. We take the view that it is better to filter contributions with a risk of artefacts, than to remove radiance entirely from a region which would provide no indication of the underlying materials or light transport. Algorithm 1 outlines our noise removal strategy. By storing clusters in ascending order of luminance we can process high luminance clusters first and if accepted, enable remaining non-zero clusters in the pixel since we know their lower energies can be handled during the filtering stage. After an initial pass of our algorithm, we make incremental updates when new clusters are created by trivially finding L max, and only running the algorithm again when parameters change or after a set number of frames. Since we use disjoint clusters to represent the sample distribution, as opposed to a sparse set of individual samples, we need to estimate the number of similar samples in the clusters of neighbouring pixels. Our parameter μ is employed again to determine cluster similarity. Treating clusters as sub-integrals of their respective pixel luminance integrals, we compute the difference between the two clusters as a proportion of the neighbouring pixel cluster (denoted C p ). In other words, the intersection of the areas A, of the definite integral for the current cluster and C p as a ratio of C p :

(7)

where C′ is the current pixel cluster extended according to μ. Since we store a complete, compact representation of the rendered samples, we can adjust our noise removal parameters during or post-render, allowing us to clean up a final image, without having to choose parameters in advance. This is useful for removing residual noise in the estimate with minimal bias. Additionally, since we do not rely on a high dimensional domain, we can extend our kernel width σ with minimal performance impact. This improves filtering for large regions of sparse samples such as caustics, whilst still removing high intensity noise in regions corrupted with more general noise.

Fig. 4
figure 4

Example of the layers in our framework. Top: Direct lighting v=1 (left) and single bounce indirect v=2. Bottom: v≥3 (left) and composite image v>0 (right)

Algorithm 1
figure 5

High intensity noise removal. A full search is often unnecessary, once an acceptable high luminance density is found (Lines 10 and 23)

5 Illumination preserving filter

Our method builds upon the principles of the cross-bilateral filter, utilising depth and normal buffers to identify changes in geometry and world space position, and a Gaussian filter to smooth local pixel regions. Our method’s effectiveness is independent of texture features, resulting in more usable samples using the same kernel size. Discontinuities caused by occlusion and high frequency BSDFs provide both strong edges and high variance, and hence do not fit into a cross-bilateral framework. We therefore make use of the discrete Poisson probability distribution to provide additional filter weights that detect high gradient changes not present in range buffers. We operate over each depth layer individually, with attention to only the discontinuities present in the current layer. First, this allows us to filter samples without the corruption of noise from features in the remaining layers, meaning we have more usable samples in our input to smooth noise. Second, our filtering is less restricted since we only constrain our filter to discontinuities that affect the current layer. This allows us to filter indirect lighting across the shadow boundaries of direct lighting. Figure 4 is an example of strong direct lighting boundaries diluted by noise from indirect lighting, and where discontinuities in the indirect lighting layers on the glossy spheres interfere with one another despite both resulting in visible edges in the final render.

5.1 Poisson based filter weights

We use the Poisson probability distribution as a basis to compute luminance similarity weights for each contributing pixel c in our filter kernel, centred around the target pixel p that we are de-noising. In order to identify high frequency changes in luminance across our pixel neighbourhood we combine the per-pixel clusters in our filter kernel using our parameter μ once again as an indicator of luminance change. This process and our filtering is performed per layer for each pixel in the image, and is outlined in Algorithm 2. In the resulting set of kernel clusters, we store the radiance \(\hat{R}\), irradiance \(\hat{I}\) and number of samples N contributed from each filter pixel individually in order to compute our Poisson weights and final radiance. We first assume that the light transport for all filter pixels and the target pixel are the same. For each pixel c in our filter kernel, we take the number of samples N f contributed to the kernel cluster and compute the expected probability of observing N p events; the number of events empirically evaluated in the pixel p that we are de-noising. Using the Poisson equation (Eq. (3)) we obtain a probability W pois for the filter pixel c:

$$ W_{\mathrm{pois}}(c) = \frac{ N_{c}^{N_{p}} e^{-N_{c}} }{ N_{p}! } $$
(8)

obtained from a precomputed lookup table. We normalise these probabilities with respect to the maximum expected probability (with λ=k=N c from Eq. (3)), and interpret them as similarity weightings for each pixel. Performing this for each kernel cluster allows us to de-noise multiple overlapping illumination sources, glossy reflections and high and low frequency features (see Fig. 5). Combined with our per pixel geometry weights W n and Gaussian weights W g , we obtain the overall similarity for this cluster in each filter pixel c with respect to our target pixel:

$$ W(c) = W_{g}(c) \cdot W_{n}(c) \cdot W_{p}(c) $$
(9)

In the majority of cases, pixel neighbourhoods exhibit smooth irradiance, producing a single kernel cluster representative of all samples across the neighbourhood, resulting in equal Poisson weights W pois across our filter pixel. For more complex regions that include illumination edges we obtain multiple kernel clusters, each one representing a distinct band of luminance that are together responsible for illumination edges. Each cluster is filtered independently so that we can deal with overlapping illumination features from multiple sources without interference.

Algorithm 2
figure 6

Incident radiance filtering

Fig. 5
figure 7

A green grid above a white plane lit by three coloured lights of varying size. Top: Path traced reference. Second row: Path traced input with 16 spp. Third row: Our approach filters noise effectively handling overlapping sources, shadow gradients, and colours. Bottom row: cross-bilateral filter

5.2 Pixel radiance computation

Computing our filter weights now allows us to evaluate a weighted radiance contribution from each pixel c using our set of kernel clusters. In physically based rendering, reflectance at a surface \(f_{r}(x_{i},\boldsymbol{\omega}_{i},\boldsymbol{\omega}'_{i})\) can be broken down into a scalar BRDF coefficient \(f_{s}(x_{i},\boldsymbol{\omega}_{i},\boldsymbol{\omega}'_{i})\) and the texture detail f t (i) for a surface location x i . Assume in our framework we wish to obtain a radiance value for a single irradiance contribution I v (recall Eq. (5)). To compute R v the scalar surface reflectance (abbreviated f s ) of the BRDF and the path throughput f t of any preceding specular vertices up to and including d need to be accounted for:

(10)

During path tracing, we account for f t (1) to f t (d) scaled by the specular throughput f s (1) to f s (d−1) for each pixel using a set of texture buffers, one for each layer, accounting for anti-aliasing of textures and detail maps for each pixel. The unknown BRDF scalar coefficient can be obtained by rearranging Eq. (10):

(11)

As described in the previous section, each kernel cluster for pixel p contains an individual \(\hat{R}\) and \(\hat{I}\) value from each contributing pixel c, including values from p itself. We can calculate a representation of f s (d) for all samples in the kernel cluster from each pixel c using Eq. (11) with \(\hat{R}\) and \(\hat{I}\) and the texture buffer for c:

(12)

Using this approach, high frequency detail is encapsulated for a pixel in \(\hat{f}_{t}\) and the lower frequency changes in BRDF are represented by the \(\hat{f}_{s}\) term calculated for each kernel cluster. For glossy surfaces, f s can also change quickly, but in such cases the irradiance filtering becomes more tightly restricted by the Poisson derived filter weights. To remove noise caused by insufficient sampling of the illumination, we need to use the irradiance data \(\hat{I}^{c}\) and \(\hat{f}_{s}^{c}\) from each contributing pixel, while preserving the texture detail \(\hat {f}_{t}^{p}\) for the pixel being de-noised. We compute the final radiance contributed to p by pixel c for a kernel cluster as:

(13)

We then combine \(\hat{R}_{p}^{c}\) for each c using the respective filter weights to influence its contribution to the radiance of the kernel cluster:

(14)

This provides a filtered contribution from each kernel cluster, representing the contributions of a subset of samples in the pixel integral at that luminance range. The total pixel radiance is the sum of \(\hat{R}_{p}\) for each kernel cluster, normalised using the sum of the sample counts in those clusters. To improve performance, we can merge kernel clusters that have uniform Poisson weights over the kernel reducing the loop over K in Algorithm 2 to a single cross-bilateral filter over the irradiance. This can improve performance for smooth regions, without loss in quality.

6 Results and discussion

Table 1 Time spent in each stage of our algorithm with reference to path tracing after running both algorithms for equal time. The path tracing stage for our method includes management of the sample clusters, and generation of the geometry and texture buffers. Cluster updates and noise removal are performed every four frames
Table 2 Clusters and memory statistics for our results. Single denotes the number of clusters representing just one sample, and the last column is the percentage of outlying samples. Memory use includes our texture, depth and normal buffers (29 MB per image)

We implement our method using a CPU-based renderer running on a 2.66 GHz Intel Core i7 920 with 8 Gb of RAM. We trace a single path per pixel using next event estimation at each vertex, making use of BSDF importance sampling and applying Russian roulette after three bounces. To demonstrate the generality of our parameters, we use the same settings for all images in the paper. For our method we use σ = 11 (our filter kernel size) and set μ = 0.5. Our high intensity noise removal uses a low density threshold, removing samples with fewer than four similar samples within the 112 pixel neighbourhood. For our comparisons with cross-bilateral filtering, we do not filter the direct lighting on specular or glossy surfaces, and use the same kernel size, texture, depth and normal buffers for both methods. Figure 6 shows a scene with complex realistic textures, pure specular and glossy objects, using materials based on aluminium and copper metals with varying degrees of roughness. We compare our method with the cross-bilateral filter, with two sets of parameters. The first is tweaked post-render to try and visibly reduce noise, and the second uses a narrow range to try and preserve maximum texture detail in the specular reflections and on visible diffuse surfaces. Relying on the incident illumination means that using our method, this texture detail is always preserved, regardless of the parameters used. Our edge detection means we avoid overly blurring high frequency features such as the overlapping direct shadows on the floor, as well as the glossy reflections. We effectively remove noise from all areas of the image using a combination of our high intensity noise removal and irradiance filtering. The cross-bilateral filter fails to reduce noise across small texture features, like the mortar in the brickwork, since the kernel is too restricted by the texture range buffer to suitably distribute the energy across the image.

Fig. 6
figure 8

This scene contains multiple glossy materials and complex textures. Our method preserves all texture detail, and edges in reflections and illumination. By adjusting the range sensitivity of the texture weightings, the cross-bilateral filter can be tuned to smooth noise, or preserve texture detail, but not both and still cannot preserve small texture features. The images for path tracing and our method are equal time comparisons (see Table 1) and the cross-bilateral filter uses the same input samples as our method

Figure 7 shows the complex Ajax bust in a flooded Cornell box. The face is partially occluded by the peak of the hat, and geometry detail is only visible due to self-shadowing. Our irradiance-aware Poisson weights minimise blurring of the self-shadows providing more depth and clarity to the beard and hair especially in regions lit indirectly. We can also effectively handle transmission, with fewer artefacts even at low sample counts at which the path tracing image is plagued with noise, and the texture detail is barely visible. Our irradiance filtering ensures that we maximise the use of the input samples in geometrically similar regions, preserving the texture even through the water and handling the sparse illumination better than the cross-bilateral filter.

Fig. 7
figure 9

Ajax bust in water, displaying complex geometry, transmission, caustics and self shadowing. Our method blends soft shadows whilst preserving features on the face of the Ajax bust caused by self shadowing. We better preserve texture detail on the water surface, and in the geometry, where the depth and normal buffers are not sufficient to avoid blurring shadow detail. The images for path tracing and our method are equal time comparisons (see Table 1) and the cross-bilateral filter uses the same input samples as our method

Figure 5, shows our ability to handle multiple light sources of varying intensities, colours and sizes. The bars result in numerous overlapping shadows with hard to soft boundaries. Since the cross-bilateral filter is ignorant of shadow boundaries, it blurs across the image removing all shadow detail. We can preserve these edges, differentiating between samples from different sources and effectively de-noise the image without merging features.

7 Conclusions

We have described a cluster based filtering approach that can reduce noise in Monte Carlo methods, whilst preserving image discontinuities from both high and low variance sources. Using a layered approach, we can separate irradiance contributions according to their path length. This enables us to de-noise each layer independently, oblivious to discontinuities and noise in remaining layers and maximising the use of the input samples. In the future we would like to address the problem of finding optimal per-pixel and layer specific kernel bandwidths, providing a good balance between noise, bias and performance as rendering progresses. Further performance and visual improvements could be gained by applying perception based metrics to produce a more optimal clustering scheme.