blender/intern/cycles/scene/integrator.h
Weizhen Huang ee89f213de Cycles: improve many lights sampling using light tree
Uses a light tree to more effectively sample scenes with many lights. This can
significantly reduce noise, at the cost of a somewhat longer render time per
sample.

Light tree sampling is enabled by default. It can be disabled in the Sampling >
Lights panel. Scenes using light clamping or ray visibility tricks may render
different as these are biased techniques that depend on the sampling strategy.

The implementation is currently disabled on AMD HIP. This is planned to be fixed
before the release.

Implementation by Jeffrey Liu, Weizhen Huang, Alaska and Brecht Van Lommel.

Ref T77889
2022-12-05 16:09:03 +01:00

127 lines
3.6 KiB
C++

/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#ifndef __INTEGRATOR_H__
#define __INTEGRATOR_H__
#include "kernel/types.h"
#include "device/denoise.h" /* For the parameters and type enum. */
#include "graph/node.h"
#include "integrator/adaptive_sampling.h"
#include "integrator/guiding.h"
CCL_NAMESPACE_BEGIN
class Device;
class DeviceScene;
class Scene;
class Integrator : public Node {
public:
NODE_DECLARE
NODE_SOCKET_API(int, min_bounce)
NODE_SOCKET_API(int, max_bounce)
NODE_SOCKET_API(int, max_diffuse_bounce)
NODE_SOCKET_API(int, max_glossy_bounce)
NODE_SOCKET_API(int, max_transmission_bounce)
NODE_SOCKET_API(int, max_volume_bounce)
#ifdef WITH_CYCLES_DEBUG
NODE_SOCKET_API(DirectLightSamplingType, direct_light_sampling_type)
#endif
NODE_SOCKET_API(int, transparent_min_bounce)
NODE_SOCKET_API(int, transparent_max_bounce)
NODE_SOCKET_API(int, ao_bounces)
NODE_SOCKET_API(float, ao_factor)
NODE_SOCKET_API(float, ao_distance)
NODE_SOCKET_API(float, ao_additive_factor)
NODE_SOCKET_API(int, volume_max_steps)
NODE_SOCKET_API(float, volume_step_rate)
NODE_SOCKET_API(bool, use_guiding);
NODE_SOCKET_API(bool, deterministic_guiding);
NODE_SOCKET_API(bool, use_surface_guiding);
NODE_SOCKET_API(float, surface_guiding_probability);
NODE_SOCKET_API(bool, use_volume_guiding);
NODE_SOCKET_API(float, volume_guiding_probability);
NODE_SOCKET_API(int, guiding_training_samples);
NODE_SOCKET_API(bool, use_guiding_direct_light);
NODE_SOCKET_API(bool, use_guiding_mis_weights);
NODE_SOCKET_API(GuidingDistributionType, guiding_distribution_type);
NODE_SOCKET_API(bool, caustics_reflective)
NODE_SOCKET_API(bool, caustics_refractive)
NODE_SOCKET_API(float, filter_glossy)
NODE_SOCKET_API(bool, use_direct_light);
NODE_SOCKET_API(bool, use_indirect_light);
NODE_SOCKET_API(bool, use_diffuse);
NODE_SOCKET_API(bool, use_glossy);
NODE_SOCKET_API(bool, use_transmission);
NODE_SOCKET_API(bool, use_emission);
NODE_SOCKET_API(int, seed)
NODE_SOCKET_API(float, sample_clamp_direct)
NODE_SOCKET_API(float, sample_clamp_indirect)
NODE_SOCKET_API(bool, motion_blur)
/* Maximum number of samples, beyond which we are likely to run into
* precision issues for sampling patterns. */
static const int MAX_SAMPLES = (1 << 24);
NODE_SOCKET_API(int, aa_samples)
NODE_SOCKET_API(int, start_sample)
NODE_SOCKET_API(bool, use_light_tree)
NODE_SOCKET_API(float, light_sampling_threshold)
NODE_SOCKET_API(bool, use_adaptive_sampling)
NODE_SOCKET_API(int, adaptive_min_samples)
NODE_SOCKET_API(float, adaptive_threshold)
NODE_SOCKET_API(SamplingPattern, sampling_pattern)
NODE_SOCKET_API(float, scrambling_distance)
NODE_SOCKET_API(bool, use_denoise);
NODE_SOCKET_API(DenoiserType, denoiser_type);
NODE_SOCKET_API(int, denoise_start_sample);
NODE_SOCKET_API(bool, use_denoise_pass_albedo);
NODE_SOCKET_API(bool, use_denoise_pass_normal);
NODE_SOCKET_API(DenoiserPrefilter, denoiser_prefilter);
enum : uint32_t {
AO_PASS_MODIFIED = (1 << 0),
OBJECT_MANAGER = (1 << 1),
/* tag everything in the manager for an update */
UPDATE_ALL = ~0u,
UPDATE_NONE = 0u,
};
Integrator();
~Integrator();
void device_update(Device *device, DeviceScene *dscene, Scene *scene);
void device_free(Device *device, DeviceScene *dscene, bool force_free = false);
void tag_update(Scene *scene, uint32_t flag);
uint get_kernel_features() const;
AdaptiveSampling get_adaptive_sampling() const;
DenoiseParams get_denoise_params() const;
GuidingParams get_guiding_params(const Device *device) const;
};
CCL_NAMESPACE_END
#endif /* __INTEGRATOR_H__ */