Blender V4.3
bsdf_transparent.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
11
13 const Spectrum weight,
14 uint32_t path_flag)
15{
16 /* Check cutoff weight. */
17 float sample_weight = fabsf(average(weight));
18 if (!(sample_weight >= CLOSURE_WEIGHT_CUTOFF)) {
19 return;
20 }
21
22 sd->closure_transparent_extinction += weight;
23
24 if (sd->flag & SD_TRANSPARENT) {
25 /* Add weight to existing transparent BSDF. */
26 for (int i = 0; i < sd->num_closure; i++) {
27 ccl_private ShaderClosure *sc = &sd->closure[i];
28
29 if (sc->type == CLOSURE_BSDF_TRANSPARENT_ID) {
30 sc->weight += weight;
31 sc->sample_weight += sample_weight;
32 break;
33 }
34 }
35 }
36 else {
37 sd->flag |= SD_BSDF | SD_TRANSPARENT;
38
39 if (path_flag & PATH_RAY_TERMINATE) {
40 /* In this case the number of closures is set to zero to disable
41 * all others, but we still want to get transparency so increase
42 * the number just for this. */
43 sd->num_closure_left = 1;
44 }
45
46 /* Create new transparent BSDF. */
48 sd, sizeof(ShaderClosure), CLOSURE_BSDF_TRANSPARENT_ID, weight);
49
50 if (bsdf) {
51 bsdf->sample_weight = sample_weight;
52 bsdf->N = sd->N;
53 }
54 else if (path_flag & PATH_RAY_TERMINATE) {
55 sd->num_closure_left = 0;
56 }
57 }
58}
59
61 const float3 wi,
62 const float3 wo,
63 ccl_private float *pdf)
64{
65 *pdf = 0.0f;
66 return zero_spectrum();
67}
68
70 float3 Ng,
71 float3 wi,
74 ccl_private float *pdf)
75{
76 // only one direction is possible
77 *wo = -wi;
78 /* Some high number for MIS. */
79 *pdf = 1e6f;
80 *eval = one_spectrum() * 1e6f;
82}
83
CCL_NAMESPACE_BEGIN ccl_device ccl_private ShaderClosure * closure_alloc(ccl_private ShaderData *sd, int size, ClosureType type, Spectrum weight)
Definition alloc.h:9
ccl_device int bsdf_transparent_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 wi, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
CCL_NAMESPACE_BEGIN ccl_device void bsdf_transparent_setup(ccl_private ShaderData *sd, const Spectrum weight, uint32_t path_flag)
ccl_device Spectrum bsdf_transparent_eval(ccl_private const ShaderClosure *sc, const float3 wi, const float3 wo, ccl_private float *pdf)
#define ccl_device
#define ccl_private
#define CCL_NAMESPACE_END
#define fabsf(x)
@ CLOSURE_BSDF_TRANSPARENT_ID
#define CLOSURE_WEIGHT_CUTOFF
@ SD_BSDF
@ SD_TRANSPARENT
@ PATH_RAY_TERMINATE
ShaderData
@ LABEL_TRANSMIT
@ LABEL_TRANSPARENT
ShaderClosure
ccl_device_inline float average(const float2 a)
unsigned int uint32_t
Definition stdint.h:80
#define one_spectrum
#define zero_spectrum
SPECTRUM_DATA_TYPE Spectrum