Blender V4.3
fresnel.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#pragma once
6
8
9/* Fresnel Node */
10
12 ccl_private float *stack,
13 uint ior_offset,
14 uint ior_value,
15 uint node)
16{
17 uint normal_offset, out_offset;
18 svm_unpack_node_uchar2(node, &normal_offset, &out_offset);
19 float eta = (stack_valid(ior_offset)) ? stack_load_float(stack, ior_offset) :
20 __uint_as_float(ior_value);
21 float3 normal_in = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N;
22
23 eta = fmaxf(eta, 1e-5f);
24 eta = (sd->flag & SD_BACKFACING) ? 1.0f / eta : eta;
25
26 float f = fresnel_dielectric_cos(dot(sd->wi, normal_in), eta);
27
28 stack_store_float(stack, out_offset, f);
29}
30
31/* Layer Weight Node */
32
34 ccl_private float *stack,
35 uint4 node)
36{
37 uint blend_offset = node.y;
38 uint blend_value = node.z;
39
40 uint type, normal_offset, out_offset;
41 svm_unpack_node_uchar3(node.w, &type, &normal_offset, &out_offset);
42
43 float blend = (stack_valid(blend_offset)) ? stack_load_float(stack, blend_offset) :
44 __uint_as_float(blend_value);
45 float3 normal_in = (stack_valid(normal_offset)) ? stack_load_float3(stack, normal_offset) :
46 sd->N;
47
48 float f;
49
50 if (type == NODE_LAYER_WEIGHT_FRESNEL) {
51 float eta = fmaxf(1.0f - blend, 1e-5f);
52 eta = (sd->flag & SD_BACKFACING) ? eta : 1.0f / eta;
53
54 f = fresnel_dielectric_cos(dot(sd->wi, normal_in), eta);
55 }
56 else {
57 f = fabsf(dot(sd->wi, normal_in));
58
59 if (blend != 0.5f) {
60 blend = clamp(blend, 0.0f, 1.0f - 1e-5f);
61 blend = (blend < 0.5f) ? 2.0f * blend : 0.5f / (1.0f - blend);
62
63 f = powf(f, blend);
64 }
65
66 f = 1.0f - f;
67 }
68
69 stack_store_float(stack, out_offset, f);
70}
71
unsigned int uint
ccl_device float fresnel_dielectric_cos(float cosi, float eta)
Definition bsdf_util.h:80
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
#define ccl_private
#define powf(x, y)
#define ccl_device_noinline
#define CCL_NAMESPACE_END
#define fmaxf(x, y)
#define fabsf(x)
#define __uint_as_float(x)
ccl_device_noinline void svm_node_layer_weight(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition fresnel.h:33
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_fresnel(ccl_private ShaderData *sd, ccl_private float *stack, uint ior_offset, uint ior_value, uint node)
Definition fresnel.h:11
CCL_NAMESPACE_BEGIN ccl_device_inline float3 stack_load_float3(ccl_private float *stack, uint a)
ccl_device_forceinline void svm_unpack_node_uchar3(uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z)
ccl_device_forceinline void svm_unpack_node_uchar2(uint i, ccl_private uint *x, ccl_private uint *y)
ccl_device_inline void stack_store_float(ccl_private float *stack, uint a, float f)
ccl_device_inline float stack_load_float(ccl_private float *stack, uint a)
ccl_device_inline bool stack_valid(uint a)
@ NODE_LAYER_WEIGHT_FRESNEL
@ SD_BACKFACING
ShaderData
ccl_device_inline int clamp(int a, int mn, int mx)
Definition util/math.h:379