Blender V5.0
node_scatter.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "stdcycles.h"
6
8 float g_HG;
9 float g_D;
10 float alpha;
11 float mixture;
12};
13
15{
16 float d = max(Diameter, 0.0);
17 if (d <= 0.1) {
18 /* Eq (11 - 14). */
19 return {13.8 * d * d, 1.1456 * d * sin(9.29044 * d), 250.0, 0.252977 - 312.983 * pow(d, 4.3)};
20 }
21
22 if (d < 1.5) {
23 /* Eq (15 - 18). */
24 float log_d = log(d);
25 float a = (log_d - 0.238604) * (log_d + 1.00667);
26 float b = 0.507522 - 0.15677 * log_d;
27 float c = 1.19692 * cos(a / b) + 1.37932 * log_d + 0.0625835;
28 return {0.862 - 0.143 * log_d * log_d,
29 0.379685 * cos(c) + 0.344213,
30 250.0,
31 0.146209 * cos(3.38707 * log_d + 2.11193) + 0.316072 + 0.0778917 * log_d};
32 }
33
34 if (d < 5.0) {
35 /* Eq (19 - 22). */
36 float log_d = log(d);
37 float temp = cos(5.68947 * (log(log_d) - 0.0292149));
38 return {0.0604931 * log(log_d) + 0.940256,
39 0.500411 - (0.081287 / (-2.0 * log_d + tan(log_d) + 1.27551)),
40 7.30354 * log_d + 6.31675,
41 0.026914 * (log_d - temp) + 0.3764};
42 }
43
44 /* Eq (7 - 10). */
45 return {exp(-0.0990567 / (d - 1.67154)),
46 exp(-2.20679 / (d + 3.91029) - 0.428934),
47 exp(3.62489 - 8.29288 / (d + 5.52825)),
48 exp(-0.599085 / (d - 0.641583) - 0.665888)};
49}
50
51closure color
52scatter(string phase, float Anisotropy, float IOR, float Backscatter, float Alpha, float Diameter)
53{
54 closure color scatter = 0;
55 if (phase == "Fournier-Forand") {
56 scatter = fournier_forand(Backscatter, IOR);
57 }
58 else if (phase == "Draine") {
59 scatter = draine(Anisotropy, Alpha);
60 }
61 else if (phase == "Rayleigh") {
62 scatter = rayleigh();
63 }
64 else if (phase == "Mie") {
65 /* Approximation of Mie phase function for water droplets using a mix of Draine and H-G.
66 * See `kernel/svm/closure.h` for details. */
68 scatter = mix(henyey_greenstein(param.g_HG), draine(param.g_D, param.alpha), param.mixture);
69 }
70 else {
71 scatter = henyey_greenstein(Anisotropy);
72 }
73 return scatter;
74}
#define tan
#define log
#define sin
#define pow
#define exp
#define cos
MieParameters phase_mie_fitted_parameters(float Diameter)
closure color scatter(string phase, float Anisotropy, float IOR, float Backscatter, float Alpha, float Diameter)
#define mix
closure color fournier_forand(float B, float IOR) BUILTIN
closure color henyey_greenstein(float g) BUILTIN
closure color rayleigh() BUILTIN
closure color draine(float g, float alpha) BUILTIN
max
Definition text_draw.cc:251