Blender V5.0
bsdf_diffuse.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2009-2010 Sony Pictures Imageworks Inc., et al. All Rights Reserved.
2 * SPDX-FileCopyrightText: 2011-2022 Blender Foundation
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 * Adapted code from Open Shading Language. */
7
8#pragma once
9
10#include "kernel/types.h"
11
13
15
19
20static_assert(sizeof(ShaderClosure) >= sizeof(DiffuseBsdf), "DiffuseBsdf is too large!");
21
22/* DIFFUSE */
23
29
31 const float3 /*wi*/,
32 const float3 wo,
33 ccl_private float *pdf)
34{
35 const ccl_private DiffuseBsdf *bsdf = (const ccl_private DiffuseBsdf *)sc;
36 const float3 N = bsdf->N;
37
38 const float cosNO = fmaxf(dot(N, wo), 0.0f) * M_1_PI_F;
39 *pdf = cosNO;
40 return make_spectrum(cosNO);
41}
42
43ccl_device int bsdf_diffuse_sample(const ccl_private ShaderClosure *sc,
44 const float3 Ng,
45 const float3 /*wi*/,
46 const float2 rand,
49 ccl_private float *pdf)
50{
51 const ccl_private DiffuseBsdf *bsdf = (const ccl_private DiffuseBsdf *)sc;
52 const float3 N = bsdf->N;
53
54 // distribution over the hemisphere
55 sample_cos_hemisphere(N, rand, wo, pdf);
56
57 if (dot(Ng, *wo) > 0.0f) {
58 *eval = make_spectrum(*pdf);
59 }
60 else {
61 *pdf = 0.0f;
62 *eval = zero_spectrum();
63 }
65}
66
67/* TRANSLUCENT */
68
74
76 const float3 /*wi*/,
77 const float3 wo,
78 ccl_private float *pdf)
79{
80 const ccl_private DiffuseBsdf *bsdf = (const ccl_private DiffuseBsdf *)sc;
81 const float3 N = bsdf->N;
82
83 const float cosNO = fmaxf(-dot(N, wo), 0.0f) * M_1_PI_F;
84 *pdf = cosNO;
85 return make_spectrum(cosNO);
86}
87
89 const float3 Ng,
90 const float3 /*wi*/,
91 const float2 rand,
94 ccl_private float *pdf)
95{
96 const ccl_private DiffuseBsdf *bsdf = (const ccl_private DiffuseBsdf *)sc;
97 const float3 N = bsdf->N;
98
99 // we are viewing the surface from the right side - send a ray out with cosine
100 // distribution over the hemisphere
101 sample_cos_hemisphere(-N, rand, wo, pdf);
102 if (dot(Ng, *wo) < 0) {
103 *eval = make_spectrum(*pdf);
104 }
105 else {
106 *pdf = 0;
107 *eval = zero_spectrum();
108 }
110}
111
ccl_device Spectrum bsdf_diffuse_eval(const ccl_private ShaderClosure *sc, const float3, const float3 wo, ccl_private float *pdf)
ccl_device Spectrum bsdf_translucent_eval(const ccl_private ShaderClosure *sc, const float3, const float3 wo, ccl_private float *pdf)
ccl_device int bsdf_diffuse_sample(const ccl_private ShaderClosure *sc, const float3 Ng, const float3, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
ccl_device int bsdf_translucent_setup(ccl_private DiffuseBsdf *bsdf)
ccl_device int bsdf_diffuse_setup(ccl_private DiffuseBsdf *bsdf)
ccl_device int bsdf_translucent_sample(const ccl_private ShaderClosure *sc, const float3 Ng, const float3, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
#define zero_spectrum
#define make_spectrum(f)
#define ccl_private
#define M_1_PI_F
#define CCL_NAMESPACE_END
@ CLOSURE_BSDF_DIFFUSE_ID
@ CLOSURE_BSDF_TRANSLUCENT_ID
@ SD_BSDF_HAS_EVAL
@ SD_BSDF
@ SD_BSDF_HAS_TRANSMISSION
@ LABEL_TRANSMIT
@ LABEL_DIFFUSE
@ LABEL_REFLECT
#define N
#define ccl_device
#define fmaxf
ccl_device_inline void sample_cos_hemisphere(const float3 N, const float2 rand_in, ccl_private float3 *wo, ccl_private float *pdf)
float3 Spectrum