[Bf-blender-cvs] [658885b97e8] principled-v2: Move specular to separate function
Lukas Stockner
noreply at git.blender.org
Mon Jul 4 23:56:13 CEST 2022
Commit: 658885b97e87ec05296119c400ebbde9a85f51be
Author: Lukas Stockner
Date: Mon Jul 4 23:31:47 2022 +0200
Branches: principled-v2
https://developer.blender.org/rB658885b97e87ec05296119c400ebbde9a85f51be
Move specular to separate function
===================================================================
M intern/cycles/kernel/svm/closure_principled.h
===================================================================
diff --git a/intern/cycles/kernel/svm/closure_principled.h b/intern/cycles/kernel/svm/closure_principled.h
index 4ffed8828d6..426ddeb5294 100644
--- a/intern/cycles/kernel/svm/closure_principled.h
+++ b/intern/cycles/kernel/svm/closure_principled.h
@@ -5,6 +5,63 @@
CCL_NAMESPACE_BEGIN
+ccl_device_inline void principled_v1_specular(KernelGlobals kg,
+ ccl_private ShaderData *sd,
+ float3 weight,
+ ClosureType distribution,
+ float3 base_color,
+ float3 N,
+ float3 T,
+ float specular_weight,
+ float specular,
+ float metallic,
+ float roughness,
+ float anisotropic,
+ float specular_tint)
+{
+ if ((specular_weight <= CLOSURE_WEIGHT_CUTOFF) ||
+ (specular + metallic <= CLOSURE_WEIGHT_CUTOFF)) {
+ return;
+ }
+
+ ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
+ sd, sizeof(MicrofacetBsdf), specular_weight * weight);
+ if (bsdf == NULL) {
+ return;
+ }
+ ccl_private MicrofacetExtra *extra = (ccl_private MicrofacetExtra *)closure_alloc_extra(
+ sd, sizeof(MicrofacetExtra));
+ if (extra == NULL) {
+ return;
+ }
+
+ bsdf->N = N;
+ bsdf->ior = (2.0f / (1.0f - safe_sqrtf(0.08f * specular))) - 1.0f;
+ bsdf->T = T;
+ bsdf->extra = extra;
+
+ float aspect = safe_sqrtf(1.0f - anisotropic * 0.9f);
+
+ bsdf->alpha_x = sqr(roughness) / aspect;
+ bsdf->alpha_y = sqr(roughness) * aspect;
+
+ // 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 = lerp(one_float3(), m_ctint, specular_tint);
+
+ bsdf->extra->cspec0 = lerp(specular * 0.08f * specular_color, base_color, metallic);
+ bsdf->extra->color = base_color;
+ bsdf->extra->clearcoat = 0.0f;
+
+ /* setup bsdf */
+ if (distribution == CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID ||
+ roughness <= 0.075f) /* use single-scatter GGX */
+ sd->flag |= bsdf_microfacet_ggx_fresnel_setup(bsdf, sd);
+ else /* use multi-scatter GGX */
+ sd->flag |= bsdf_microfacet_multi_ggx_fresnel_setup(bsdf, sd);
+}
+
ccl_device_inline void principled_v1_glass_refl(ccl_private ShaderData *sd,
float3 weight,
float3 base_color,
@@ -390,55 +447,23 @@ ccl_device void svm_node_closure_principled(KernelGlobals kg,
/* specular reflection */
#ifdef __CAUSTICS_TRICKS__
- if (kernel_data.integrator.caustics_reflective || (path_flag & PATH_RAY_DIFFUSE) == 0) {
-#endif
- if (specular_weight > CLOSURE_WEIGHT_CUTOFF &&
- (specular > CLOSURE_WEIGHT_CUTOFF || metallic > CLOSURE_WEIGHT_CUTOFF)) {
- float3 spec_weight = weight * specular_weight;
-
- ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
- sd, sizeof(MicrofacetBsdf), spec_weight);
- ccl_private MicrofacetExtra *extra = (bsdf != NULL) ?
- (ccl_private MicrofacetExtra *)closure_alloc_extra(
- sd, sizeof(MicrofacetExtra)) :
- NULL;
-
- if (bsdf && extra) {
- bsdf->N = N;
- bsdf->ior = (2.0f / (1.0f - safe_sqrtf(0.08f * specular))) - 1.0f;
- bsdf->T = T;
- bsdf->extra = extra;
-
- float aspect = safe_sqrtf(1.0f - anisotropic * 0.9f);
- float r2 = roughness * roughness;
-
- bsdf->alpha_x = r2 / aspect;
- bsdf->alpha_y = r2 * aspect;
-
- float m_cdlum = 0.3f * base_color.x + 0.6f * base_color.y +
- 0.1f * base_color.z; // luminance approx.
- float3 m_ctint = m_cdlum > 0.0f ?
- base_color / m_cdlum :
- make_float3(1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat
- float3 tmp_col = make_float3(1.0f, 1.0f, 1.0f) * (1.0f - specular_tint) +
- m_ctint * specular_tint;
-
- bsdf->extra->cspec0 = (specular * 0.08f * tmp_col) * (1.0f - metallic) +
- base_color * metallic;
- bsdf->extra->color = base_color;
- bsdf->extra->clearcoat = 0.0f;
-
- /* setup bsdf */
- if (distribution == CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID ||
- roughness <= 0.075f) /* use single-scatter GGX */
- sd->flag |= bsdf_microfacet_ggx_fresnel_setup(bsdf, sd);
- else /* use multi-scatter GGX */
- sd->flag |= bsdf_microfacet_multi_ggx_fresnel_setup(bsdf, sd);
- }
- }
-#ifdef __CAUSTICS_TRICKS__
+ if (!kernel_data.integrator.caustics_reflective && (path_flag & PATH_RAY_DIFFUSE)) {
+ specular_weight = 0.0f;
}
#endif
+ principled_v1_specular(kg,
+ sd,
+ weight,
+ distribution,
+ base_color,
+ N,
+ T,
+ specular_weight,
+ specular,
+ metallic,
+ roughness,
+ anisotropic,
+ specular_tint);
/* glass */
#ifdef __CAUSTICS_TRICKS__
More information about the Bf-blender-cvs
mailing list