Blender V5.0
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
7#include "kernel/types.h"
8
10
12
13/* DRAINE CLOSURE */
14
21static_assert(sizeof(ShaderVolumeClosure) >= sizeof(DraineVolume), "DraineVolume is too large!");
22
24{
25 volume->type = CLOSURE_VOLUME_DRAINE_ID;
26 /* clamp anisotropy */
27 volume->g = signf(volume->g) * min(fabsf(volume->g), 1.0f - 1e-3f);
28
29 return SD_SCATTER;
30}
31
34 const float3 wo,
35 ccl_private float *pdf)
36{
37 const ccl_private DraineVolume *volume = (const ccl_private DraineVolume *)svc;
38
39 /* note that wi points towards the viewer */
40 const float cos_theta = dot(-sd->wi, wo);
41 *pdf = phase_draine(cos_theta, volume->g, volume->alpha);
42
43 return make_spectrum(*pdf);
44}
45
48 const float2 rand,
51 ccl_private float *pdf)
52{
53 const ccl_private DraineVolume *volume = (const ccl_private DraineVolume *)svc;
54
55 /* note that wi points towards the viewer and so is used negated */
56 *wo = phase_draine_sample(-sd->wi, volume->g, volume->alpha, rand, pdf);
57 *eval = make_spectrum(*pdf); /* perfect importance sampling */
58
60}
61
MINLINE float signf(float f)
ccl_device_inline float cos_theta(const float3 w)
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
#define make_spectrum(f)
#define ccl_private
#define CCL_NAMESPACE_END
@ CLOSURE_VOLUME_DRAINE_ID
@ SD_SCATTER
@ LABEL_VOLUME_SCATTER
#define fabsf
#define ccl_device
#define min(a, b)
Definition sort.cc:36
float3 Spectrum
ccl_device int volume_draine_sample(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
ccl_device int volume_draine_setup(ccl_private DraineVolume *volume)
ccl_device Spectrum volume_draine_eval(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float3 wo, ccl_private float *pdf)
ccl_device float phase_draine(const float cos_theta, const float g, float alpha)
Definition volume_util.h:79
ccl_device float3 phase_draine_sample(const float3 D, const float g, float alpha, const float2 rand, ccl_private float *pdf)