* Split light types into own files, move light type specific code from light tree and MNEE. * Move flat light distribution code into own kernel file and host side building function, in preparation of light tree addition. Add light/sample.h as main entry point to kernel light sampling. * Better separate calculation of pdf for selecting a light, and pdf for sampling a point on the light. The selection pdf is now also stored in LightSampling for MNEE to correctly recalculate the full pdf when the shading position changes but the point on the light remains fixed. * Improvement to kernel light storage, using packed_float3, better variable names, etc. Includes contributions by Brecht Van Lommel and Weizhen Huang. Ref T77889
225 lines
9.2 KiB
C
225 lines
9.2 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)
|
|
KERNEL_STRUCT_MEMBER(film, float, pass_shadow_scale)
|
|
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)
|
|
/* Padding. */
|
|
KERNEL_STRUCT_MEMBER(film, int, pad1)
|
|
KERNEL_STRUCT_MEMBER(film, int, pad2)
|
|
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, 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_MEMBER(integrator, int, pad3)
|
|
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
|