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
220 lines
9.0 KiB
C
220 lines
9.0 KiB
C
/* SPDX-License-Identifier: Apache-2.0
|
|
* Copyright 2011-2022 Blender Foundation */
|
|
|
|
#ifndef KERNEL_STRUCT_BEGIN
|
|
# define KERNEL_STRUCT_BEGIN(name, parent)
|
|
#endif
|
|
#ifndef KERNEL_STRUCT_END
|
|
# define KERNEL_STRUCT_END(name)
|
|
#endif
|
|
#ifndef KERNEL_STRUCT_MEMBER
|
|
# define KERNEL_STRUCT_MEMBER(parent, type, name)
|
|
#endif
|
|
|
|
/* Background. */
|
|
|
|
KERNEL_STRUCT_BEGIN(KernelBackground, background)
|
|
/* xyz store direction, w the angle. float4 instead of float3 is used
|
|
* to ensure consistent padding/alignment across devices. */
|
|
KERNEL_STRUCT_MEMBER(background, float4, sun)
|
|
/* Only shader index. */
|
|
KERNEL_STRUCT_MEMBER(background, int, surface_shader)
|
|
KERNEL_STRUCT_MEMBER(background, int, volume_shader)
|
|
KERNEL_STRUCT_MEMBER(background, float, volume_step_size)
|
|
KERNEL_STRUCT_MEMBER(background, int, transparent)
|
|
KERNEL_STRUCT_MEMBER(background, float, transparent_roughness_squared_threshold)
|
|
/* Sun sampling. */
|
|
KERNEL_STRUCT_MEMBER(background, float, sun_weight)
|
|
/* Importance map sampling. */
|
|
KERNEL_STRUCT_MEMBER(background, float, map_weight)
|
|
KERNEL_STRUCT_MEMBER(background, float, portal_weight)
|
|
KERNEL_STRUCT_MEMBER(background, int, map_res_x)
|
|
KERNEL_STRUCT_MEMBER(background, int, map_res_y)
|
|
/* Multiple importance sampling. */
|
|
KERNEL_STRUCT_MEMBER(background, int, use_mis)
|
|
/* Lightgroup. */
|
|
KERNEL_STRUCT_MEMBER(background, int, lightgroup)
|
|
/* Light Index. */
|
|
KERNEL_STRUCT_MEMBER(background, int, light_index)
|
|
KERNEL_STRUCT_END(KernelBackground)
|
|
|
|
/* BVH: own BVH2 if no native device acceleration struct used. */
|
|
|
|
KERNEL_STRUCT_BEGIN(KernelBVH, bvh)
|
|
KERNEL_STRUCT_MEMBER(bvh, int, root)
|
|
KERNEL_STRUCT_MEMBER(bvh, int, have_motion)
|
|
KERNEL_STRUCT_MEMBER(bvh, int, have_curves)
|
|
KERNEL_STRUCT_MEMBER(bvh, int, have_points)
|
|
KERNEL_STRUCT_MEMBER(bvh, int, have_volumes)
|
|
KERNEL_STRUCT_MEMBER(bvh, int, bvh_layout)
|
|
KERNEL_STRUCT_MEMBER(bvh, int, use_bvh_steps)
|
|
KERNEL_STRUCT_MEMBER(bvh, int, curve_subdivisions)
|
|
KERNEL_STRUCT_END(KernelBVH)
|
|
|
|
/* Film. */
|
|
|
|
KERNEL_STRUCT_BEGIN(KernelFilm, film)
|
|
/* XYZ to rendering color space transform. float4 instead of float3 to
|
|
* ensure consistent padding/alignment across devices. */
|
|
KERNEL_STRUCT_MEMBER(film, float4, xyz_to_r)
|
|
KERNEL_STRUCT_MEMBER(film, float4, xyz_to_g)
|
|
KERNEL_STRUCT_MEMBER(film, float4, xyz_to_b)
|
|
KERNEL_STRUCT_MEMBER(film, float4, rgb_to_y)
|
|
/* Rec709 to rendering color space. */
|
|
KERNEL_STRUCT_MEMBER(film, float4, rec709_to_r)
|
|
KERNEL_STRUCT_MEMBER(film, float4, rec709_to_g)
|
|
KERNEL_STRUCT_MEMBER(film, float4, rec709_to_b)
|
|
KERNEL_STRUCT_MEMBER(film, int, is_rec709)
|
|
/* Exposure. */
|
|
KERNEL_STRUCT_MEMBER(film, float, exposure)
|
|
/* Passed used. */
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_flag)
|
|
KERNEL_STRUCT_MEMBER(film, int, light_pass_flag)
|
|
/* Pass offsets. */
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_stride)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_combined)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_depth)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_position)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_normal)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_roughness)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_motion)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_motion_weight)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_uv)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_object_id)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_material_id)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_diffuse_color)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_glossy_color)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_transmission_color)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_diffuse_indirect)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_glossy_indirect)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_transmission_indirect)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_volume_indirect)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_diffuse_direct)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_glossy_direct)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_transmission_direct)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_volume_direct)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_emission)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_background)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_ao)
|
|
KERNEL_STRUCT_MEMBER(film, float, pass_alpha_threshold)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_shadow_catcher)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_shadow_catcher_sample_count)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_shadow_catcher_matte)
|
|
/* Cryptomatte. */
|
|
KERNEL_STRUCT_MEMBER(film, int, cryptomatte_passes)
|
|
KERNEL_STRUCT_MEMBER(film, int, cryptomatte_depth)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_cryptomatte)
|
|
/* Adaptive sampling. */
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_adaptive_aux_buffer)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_sample_count)
|
|
/* Mist. */
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_mist)
|
|
KERNEL_STRUCT_MEMBER(film, float, mist_start)
|
|
KERNEL_STRUCT_MEMBER(film, float, mist_inv_depth)
|
|
KERNEL_STRUCT_MEMBER(film, float, mist_falloff)
|
|
/* Denoising. */
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_denoising_normal)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_denoising_albedo)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_denoising_depth)
|
|
/* AOVs. */
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_aov_color)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_aov_value)
|
|
/* Light groups. */
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_lightgroup)
|
|
/* Baking. */
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_bake_primitive)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_bake_differential)
|
|
/* Shadow catcher. */
|
|
KERNEL_STRUCT_MEMBER(film, int, use_approximate_shadow_catcher)
|
|
/* Path Guiding */
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_guiding_color)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_guiding_probability)
|
|
KERNEL_STRUCT_MEMBER(film, int, pass_guiding_avg_roughness)
|
|
KERNEL_STRUCT_END(KernelFilm)
|
|
|
|
/* Integrator. */
|
|
|
|
KERNEL_STRUCT_BEGIN(KernelIntegrator, integrator)
|
|
/* Emission. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_direct_light)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_light_mis)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_light_tree)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, num_lights)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, num_distant_lights)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, num_background_lights)
|
|
/* Portal sampling. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, num_portals)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, portal_offset)
|
|
/* Flat light distribution. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, num_distribution)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, distribution_pdf_triangles)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, distribution_pdf_lights)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, light_inv_rr_threshold)
|
|
/* Bounces. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, min_bounce)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, max_bounce)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, max_diffuse_bounce)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, max_glossy_bounce)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, max_transmission_bounce)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, max_volume_bounce)
|
|
/* AO bounces. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, ao_bounces)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, ao_bounces_distance)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, ao_bounces_factor)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, ao_additive_factor)
|
|
/* Transparency. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, transparent_min_bounce)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, transparent_max_bounce)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, transparent_shadows)
|
|
/* Caustics. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, caustics_reflective)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, caustics_refractive)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, filter_glossy)
|
|
/* Seed. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, seed)
|
|
/* Clamp. */
|
|
KERNEL_STRUCT_MEMBER(integrator, float, sample_clamp_direct)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, sample_clamp_indirect)
|
|
/* Caustics. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_caustics)
|
|
/* Sampling pattern. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, sampling_pattern)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, pmj_sequence_size)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, scrambling_distance)
|
|
/* Volume render. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_volumes)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, volume_max_steps)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, volume_step_rate)
|
|
/* Shadow catcher. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, has_shadow_catcher)
|
|
/* Closure filter. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, filter_closures)
|
|
/* MIS debugging. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, direct_light_sampling_type)
|
|
/* Path Guiding */
|
|
KERNEL_STRUCT_MEMBER(integrator, float, surface_guiding_probability)
|
|
KERNEL_STRUCT_MEMBER(integrator, float, volume_guiding_probability)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, guiding_distribution_type)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_guiding)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, train_guiding)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_surface_guiding)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_volume_guiding)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_guiding_direct_light)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, use_guiding_mis_weights)
|
|
|
|
/* Padding. */
|
|
KERNEL_STRUCT_MEMBER(integrator, int, pad1)
|
|
KERNEL_STRUCT_MEMBER(integrator, int, pad2)
|
|
KERNEL_STRUCT_END(KernelIntegrator)
|
|
|
|
/* SVM. For shader specialization. */
|
|
|
|
KERNEL_STRUCT_BEGIN(KernelSVMUsage, svm_usage)
|
|
#define SHADER_NODE_TYPE(type) KERNEL_STRUCT_MEMBER(svm_usage, int, type)
|
|
#include "kernel/svm/node_types_template.h"
|
|
KERNEL_STRUCT_END(KernelSVMUsage)
|
|
|
|
#undef KERNEL_STRUCT_BEGIN
|
|
#undef KERNEL_STRUCT_MEMBER
|
|
#undef KERNEL_STRUCT_END
|