Blender V4.3
volume_draine.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2024 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
8
10
11/* DRAINE CLOSURE */
12
19static_assert(sizeof(ShaderVolumeClosure) >= sizeof(DraineVolume), "DraineVolume is too large!");
20
22{
23 volume->type = CLOSURE_VOLUME_DRAINE_ID;
24 /* clamp anisotropy */
25 volume->g = signf(volume->g) * min(fabsf(volume->g), 1.0f - 1e-3f);
26
27 return SD_SCATTER;
28}
29
32 float3 wo,
33 ccl_private float *pdf)
34{
35 ccl_private const DraineVolume *volume = (ccl_private const DraineVolume *)svc;
36
37 /* note that wi points towards the viewer */
38 float cos_theta = dot(-sd->wi, wo);
39 *pdf = phase_draine(cos_theta, volume->g, volume->alpha);
40
41 return make_spectrum(*pdf);
42}
43
46 float2 rand,
49 ccl_private float *pdf)
50{
51 ccl_private const DraineVolume *volume = (ccl_private const DraineVolume *)svc;
52
53 /* note that wi points towards the viewer and so is used negated */
54 *wo = phase_draine_sample(-sd->wi, volume->g, volume->alpha, rand, pdf);
55 *eval = make_spectrum(*pdf); /* perfect importance sampling */
56
58}
59
MINLINE float signf(float f)
ccl_device_inline float cos_theta(const float3 w)
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
#define ccl_device
#define ccl_private
#define CCL_NAMESPACE_END
#define fabsf(x)
@ CLOSURE_VOLUME_DRAINE_ID
@ SD_SCATTER
struct ShaderVolumeClosure ShaderVolumeClosure
ShaderData
@ LABEL_VOLUME_SCATTER
#define min(a, b)
Definition sort.c:32
#define make_spectrum(f)
SPECTRUM_DATA_TYPE Spectrum
ccl_device int volume_draine_setup(ccl_private DraineVolume *volume)
CCL_NAMESPACE_BEGIN struct DraineVolume DraineVolume
ccl_device Spectrum volume_draine_eval(ccl_private const ShaderData *sd, ccl_private const ShaderVolumeClosure *svc, float3 wo, ccl_private float *pdf)
ccl_device int volume_draine_sample(ccl_private const ShaderData *sd, ccl_private const ShaderVolumeClosure *svc, float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
ccl_device float phase_draine(float cos_theta, float g, float alpha)
Definition volume_util.h:78
ccl_device float3 phase_draine_sample(float3 D, float g, float alpha, float2 rand, ccl_private float *pdf)