Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/kernel/svm/closure_principled.h')
-rw-r--r--intern/cycles/kernel/svm/closure_principled.h99
1 files changed, 50 insertions, 49 deletions
diff --git a/intern/cycles/kernel/svm/closure_principled.h b/intern/cycles/kernel/svm/closure_principled.h
index c4a74a4da13..fd6df508e12 100644
--- a/intern/cycles/kernel/svm/closure_principled.h
+++ b/intern/cycles/kernel/svm/closure_principled.h
@@ -8,8 +8,8 @@ CCL_NAMESPACE_BEGIN
/* Principled v1 components */
ccl_device_inline void principled_v1_diffuse(ccl_private ShaderData *sd,
- float3 weight,
- float3 base_color,
+ Spectrum weight,
+ Spectrum base_color,
float diffuse_weight,
float3 N,
float roughness)
@@ -34,11 +34,11 @@ ccl_device_inline void principled_v1_diffuse(ccl_private ShaderData *sd,
ccl_device_inline void principled_v1_diffuse_sss(ccl_private ShaderData *sd,
ccl_private float *stack,
- float3 weight,
+ Spectrum weight,
int path_flag,
uint data_1,
uint data_2,
- float3 base_color,
+ Spectrum base_color,
float diffuse_weight,
float3 N,
float roughness)
@@ -52,10 +52,10 @@ ccl_device_inline void principled_v1_diffuse_sss(ccl_private ShaderData *sd,
float subsurface = stack_load_float(stack, subsurface_offset);
float subsurface_anisotropy = stack_load_float(stack, aniso_offset);
float subsurface_ior = stack_load_float(stack, ior_offset);
- float3 subsurface_color = stack_load_float3(stack, color_offset);
- float3 subsurface_radius = stack_load_float3(stack, radius_offset);
+ Spectrum subsurface_color = rgb_to_spectrum(stack_load_float3(stack, color_offset));
+ Spectrum subsurface_radius = rgb_to_spectrum(stack_load_float3(stack, radius_offset));
- float3 mixed_ss_base_color = mix(base_color, subsurface_color, subsurface);
+ Spectrum mixed_ss_base_color = mix(base_color, subsurface_color, subsurface);
/* disable in case of diffuse ancestor, can't see it well then and
* adds considerably noise due to probabilities of continuing path
@@ -67,7 +67,7 @@ ccl_device_inline void principled_v1_diffuse_sss(ccl_private ShaderData *sd,
/* diffuse */
if (fabsf(average(mixed_ss_base_color)) > CLOSURE_WEIGHT_CUTOFF) {
if (subsurface > CLOSURE_WEIGHT_CUTOFF) {
- float3 subsurf_weight = weight * mixed_ss_base_color * diffuse_weight;
+ Spectrum subsurf_weight = weight * mixed_ss_base_color * diffuse_weight;
ccl_private Bssrdf *bssrdf = bssrdf_alloc(sd, subsurf_weight);
if (bssrdf == NULL) {
@@ -99,11 +99,11 @@ ccl_device_inline void principled_v1_diffuse_sss(ccl_private ShaderData *sd,
ccl_device_inline void principled_v1_specular(KernelGlobals kg,
ccl_private ShaderData *sd,
ccl_private float *stack,
- float3 weight,
+ Spectrum weight,
int path_flag,
ClosureType distribution,
uint data,
- float3 base_color,
+ Spectrum base_color,
float3 N,
float specular_weight,
float metallic,
@@ -156,8 +156,8 @@ ccl_device_inline void principled_v1_specular(KernelGlobals kg,
// normalize lum. to isolate hue+sat
float m_cdlum = linear_rgb_to_gray(kg, base_color);
- float3 m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : one_float3();
- float3 specular_color = mix(one_float3(), m_ctint, specular_tint);
+ Spectrum m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : one_spectrum();
+ Spectrum specular_color = mix(one_spectrum(), m_ctint, specular_tint);
bsdf->extra->cspec0 = mix(specular * 0.08f * specular_color, base_color, metallic);
bsdf->extra->color = base_color;
@@ -171,8 +171,8 @@ ccl_device_inline void principled_v1_specular(KernelGlobals kg,
}
ccl_device_inline void principled_v1_glass_refl(ccl_private ShaderData *sd,
- float3 weight,
- float3 base_color,
+ Spectrum weight,
+ Spectrum base_color,
float reflection_weight,
float3 N,
float roughness,
@@ -203,15 +203,15 @@ ccl_device_inline void principled_v1_glass_refl(ccl_private ShaderData *sd,
bsdf->ior = ior;
bsdf->extra->color = base_color;
- bsdf->extra->cspec0 = mix(one_float3(), base_color, specular_tint);
+ bsdf->extra->cspec0 = mix(one_spectrum(), base_color, specular_tint);
/* setup bsdf */
sd->flag |= bsdf_microfacet_ggx_fresnel_setup(bsdf, sd);
}
ccl_device_inline void principled_v1_glass_refr(ccl_private ShaderData *sd,
- float3 weight,
- float3 base_color,
+ Spectrum weight,
+ Spectrum base_color,
float refraction_weight,
float3 N,
float roughness,
@@ -241,11 +241,11 @@ ccl_device_inline void principled_v1_glass_refr(ccl_private ShaderData *sd,
ccl_device_inline void principled_v1_glass_single(KernelGlobals kg,
ccl_private ShaderData *sd,
ccl_private float *stack,
- float3 weight,
+ Spectrum weight,
int path_flag,
ClosureType distribution,
uint data,
- float3 base_color,
+ Spectrum base_color,
float glass_weight,
float3 N,
float roughness,
@@ -295,10 +295,10 @@ ccl_device_inline void principled_v1_glass_single(KernelGlobals kg,
ccl_device_inline void principled_v1_glass_multi(KernelGlobals kg,
ccl_private ShaderData *sd,
ccl_private float *stack,
- float3 weight,
+ Spectrum weight,
int path_flag,
uint data,
- float3 base_color,
+ Spectrum base_color,
float glass_weight,
float3 N,
float roughness,
@@ -338,7 +338,7 @@ ccl_device_inline void principled_v1_glass_multi(KernelGlobals kg,
bsdf->ior = (sd->flag & SD_BACKFACING) ? 1.0f / eta : eta;
bsdf->extra->color = base_color;
- bsdf->extra->cspec0 = mix(one_float3(), base_color, specular_tint);
+ bsdf->extra->cspec0 = mix(one_spectrum(), base_color, specular_tint);
/* setup bsdf */
sd->flag |= bsdf_microfacet_multi_ggx_glass_fresnel_setup(kg, bsdf, sd);
@@ -347,9 +347,9 @@ ccl_device_inline void principled_v1_glass_multi(KernelGlobals kg,
ccl_device_inline void principled_v1_sheen(KernelGlobals kg,
ccl_private ShaderData *sd,
ccl_private float *stack,
- float3 weight,
+ Spectrum weight,
uint data,
- float3 base_color,
+ Spectrum base_color,
float diffuse_weight,
float3 N)
{
@@ -364,11 +364,11 @@ ccl_device_inline void principled_v1_sheen(KernelGlobals kg,
// normalize lum. to isolate hue+sat
float m_cdlum = linear_rgb_to_gray(kg, base_color);
- float3 m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : one_float3();
+ Spectrum m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : one_spectrum();
/* color of the sheen component */
float sheen_tint = stack_load_float(stack, sheen_tint_offset);
- float3 sheen_color = mix(one_float3(), m_ctint, sheen_tint);
+ Spectrum sheen_color = mix(one_spectrum(), m_ctint, sheen_tint);
ccl_private PrincipledSheenBsdf *bsdf = (ccl_private PrincipledSheenBsdf *)bsdf_alloc(
sd, sizeof(PrincipledSheenBsdf), sheen_weight * sheen_color * weight);
@@ -386,7 +386,7 @@ ccl_device_inline void principled_v1_sheen(KernelGlobals kg,
ccl_device_inline void principled_v1_clearcoat(KernelGlobals kg,
ccl_private ShaderData *sd,
ccl_private float *stack,
- float3 weight,
+ Spectrum weight,
int path_flag,
uint data)
{
@@ -432,10 +432,10 @@ ccl_device_inline void principled_v1_clearcoat(KernelGlobals kg,
ccl_device_inline void principled_v2_diffuse_sss(ccl_private ShaderData *sd,
ccl_private float *stack,
- float3 weight,
+ Spectrum weight,
int path_flag,
uint data,
- float3 base_color,
+ Spectrum base_color,
float ior,
float3 N)
{
@@ -448,7 +448,8 @@ ccl_device_inline void principled_v2_diffuse_sss(ccl_private ShaderData *sd,
svm_unpack_node_uchar4(data, &scale_offset, &aniso_offset, &radius_offset, &method);
float aniso = stack_load_float(stack, aniso_offset);
- float3 radius = stack_load_float3(stack, radius_offset) * stack_load_float(stack, scale_offset);
+ Spectrum radius = rgb_to_spectrum(stack_load_float3(stack, radius_offset)) *
+ stack_load_float(stack, scale_offset);
/* Fall back to diffuse if there has been a diffuse bounce before or the radius is too small. */
if ((path_flag & PATH_RAY_DIFFUSE_ANCESTOR) == 0 && reduce_max(radius) > 1e-7f) {
@@ -486,19 +487,19 @@ ccl_device_inline void principled_v2_diffuse_sss(ccl_private ShaderData *sd,
sd->flag |= bsdf_diffuse_setup(bsdf);
}
-ccl_device_inline float3 principled_v2_clearcoat(KernelGlobals kg,
- ccl_private ShaderData *sd,
- ccl_private float *stack,
- float3 weight,
- int path_flag,
- uint data)
+ccl_device_inline Spectrum principled_v2_clearcoat(KernelGlobals kg,
+ ccl_private ShaderData *sd,
+ ccl_private float *stack,
+ Spectrum weight,
+ int path_flag,
+ uint data)
{
uint clearcoat_offset, roughness_offset, tint_offset, normal_offset;
svm_unpack_node_uchar4(data, &clearcoat_offset, &roughness_offset, &tint_offset, &normal_offset);
float3 N = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N;
- float3 tint = saturate(stack_load_float3(stack, tint_offset));
- if (tint != one_float3()) {
+ Spectrum tint = saturate(rgb_to_spectrum(stack_load_float3(stack, tint_offset)));
+ if (tint != one_spectrum()) {
/* Tint is normalized to perpendicular incidence.
* Therefore, if we define the coating thickness as length 1, the length along the ray is
* t = sqrt(1+tan^2(angle(N, I))) = sqrt(1+tan^2(acos(dotNI))) = 1 / dotNI.
@@ -565,8 +566,8 @@ ccl_device_inline float3 principled_v2_clearcoat(KernelGlobals kg,
ccl_device_inline float principled_v2_sheen(KernelGlobals kg,
ccl_private ShaderData *sd,
ccl_private float *stack,
- float3 weight,
- float3 N,
+ Spectrum weight,
+ Spectrum N,
uint data)
{
uint sheen_offset, sheen_tint_offset, sheen_roughness_offset, dummy;
@@ -597,8 +598,8 @@ ccl_device_inline float principled_v2_sheen(KernelGlobals kg,
ccl_device_inline float principled_v2_specular(KernelGlobals kg,
ccl_private ShaderData *sd,
ccl_private float *stack,
- float3 weight,
- float3 base_color,
+ Spectrum weight,
+ Spectrum base_color,
float roughness,
float metallic,
float ior,
@@ -632,7 +633,7 @@ ccl_device_inline float principled_v2_specular(KernelGlobals kg,
T = stack_load_float3(stack, tangent_offset);
T = rotate_around_axis(T, N, stack_load_float(stack, rotation_offset) * M_2PI_F);
}
- float3 edge_color = stack_load_float3(stack, edge_offset);
+ Spectrum edge_color = rgb_to_spectrum(stack_load_float3(stack, edge_offset));
ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
sd, sizeof(MicrofacetBsdf), weight);
@@ -664,7 +665,7 @@ ccl_device_inline float principled_v2_specular(KernelGlobals kg,
ccl_device_inline void principled_v2_glass(KernelGlobals kg,
ccl_private ShaderData *sd,
- float3 weight,
+ Spectrum weight,
float transmission,
float roughness,
float ior,
@@ -683,7 +684,7 @@ ccl_device_inline void principled_v2_glass(KernelGlobals kg,
bsdf->ior = (sd->flag & SD_BACKFACING) ? 1.0f / ior : ior;
/* setup bsdf */
- sd->flag |= bsdf_microfacet_multi_ggx_glass_setup(kg, bsdf, sd, one_float3());
+ sd->flag |= bsdf_microfacet_multi_ggx_glass_setup(kg, bsdf, sd, one_spectrum());
}
ccl_device void svm_node_closure_principled_v2(KernelGlobals kg,
@@ -695,7 +696,7 @@ ccl_device void svm_node_closure_principled_v2(KernelGlobals kg,
int path_flag,
int *offset)
{
- float3 weight = sd->svm_closure_weight * mix_weight;
+ Spectrum weight = sd->svm_closure_weight * mix_weight;
/* Load shared parameter data. */
uint base_color_offset, normal_offset, dummy;
@@ -704,7 +705,7 @@ ccl_device void svm_node_closure_principled_v2(KernelGlobals kg,
svm_unpack_node_uchar4(
node_1.z, &roughness_offset, &metallic_offset, &ior_offset, &transmission_offset);
- float3 base_color = stack_load_float3(stack, base_color_offset);
+ Spectrum base_color = rgb_to_spectrum(stack_load_float3(stack, base_color_offset));
float3 N = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N;
if (!(sd->type & PRIMITIVE_CURVE)) {
N = ensure_valid_reflection(sd->Ng, sd->I, N);
@@ -764,7 +765,7 @@ ccl_device void svm_node_closure_principled(KernelGlobals kg,
svm_unpack_node_uchar4(
node_1.z, &roughness_offset, &metallic_offset, &transmission_offset, &specular_tint_offset);
- float3 base_color = stack_load_float3(stack, base_color_offset);
+ Spectrum base_color = rgb_to_spectrum(stack_load_float3(stack, base_color_offset));
float3 N = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N;
if (!(sd->type & PRIMITIVE_CURVE)) {
N = ensure_valid_reflection(sd->Ng, sd->I, N);
@@ -782,7 +783,7 @@ ccl_device void svm_node_closure_principled(KernelGlobals kg,
* since it models both the metallic specular as well as the non-glass dielectric specular.
* This only affects materials mixing diffuse, glass AND metal though. */
float specular_weight = (1.0f - transmission);
- float3 weight = sd->svm_closure_weight * mix_weight;
+ Spectrum weight = sd->svm_closure_weight * mix_weight;
/* Diffuse and subsurface */
principled_v1_diffuse_sss(