[Bf-blender-cvs] [02fe81e0967] principled-v2: Add initial parts of Principled v2 implementation
Lukas Stockner
noreply at git.blender.org
Mon Jul 4 23:56:14 CEST 2022
Commit: 02fe81e0967ec4d6bb6e047dba274d5947f65ef6
Author: Lukas Stockner
Date: Mon Jul 4 23:31:48 2022 +0200
Branches: principled-v2
https://developer.blender.org/rB02fe81e0967ec4d6bb6e047dba274d5947f65ef6
Add initial parts of Principled v2 implementation
===================================================================
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 1f0ebead9a1..33476c95f99 100644
--- a/intern/cycles/kernel/svm/closure_principled.h
+++ b/intern/cycles/kernel/svm/closure_principled.h
@@ -431,6 +431,121 @@ ccl_device_inline void principled_v1_clearcoat(KernelGlobals kg,
sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
}
+/* Principled v2 components */
+
+ccl_device_inline void principled_v2_diffuse(
+ ccl_private ShaderData *sd, float3 weight, float3 base_color, float diffuse_weight, float3 N)
+{
+ if (diffuse_weight <= CLOSURE_WEIGHT_CUTOFF) {
+ return;
+ }
+
+ ccl_private DiffuseBsdf *bsdf = (ccl_private DiffuseBsdf *)bsdf_alloc(
+ sd, sizeof(DiffuseBsdf), diffuse_weight * base_color * weight);
+
+ if (bsdf == NULL) {
+ return;
+ }
+
+ bsdf->N = N;
+
+ /* setup bsdf */
+ sd->flag |= bsdf_diffuse_setup(bsdf);
+}
+
+ccl_device_inline float principled_v2_clearcoat(KernelGlobals kg,
+ ccl_private ShaderData *sd,
+ ccl_private float *stack,
+ float3 weight,
+ int path_flag,
+ uint data)
+{
+#ifdef __CAUSTICS_TRICKS__
+ if (!kernel_data.integrator.caustics_reflective && (path_flag & PATH_RAY_DIFFUSE)) {
+ return 0.0f;
+ }
+#endif
+
+ uint clearcoat_offset, roughness_offset, tint_offset, normal_offset;
+ svm_unpack_node_uchar4(data, &clearcoat_offset, &roughness_offset, &tint_offset, &normal_offset);
+ float clearcoat = saturatef(stack_load_float(stack, clearcoat_offset));
+
+ if (clearcoat <= CLOSURE_WEIGHT_CUTOFF) {
+ return 0.0f;
+ }
+
+ float roughness = saturatef(stack_load_float(stack, roughness_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);
+ }
+ float3 tint = saturate(stack_load_float3(stack, tint_offset));
+
+ if (tint != one_float3()) {
+ /* Tint is normalized to perpendicular incidence.
+ * Therefore, if we define the coating thickness as length 1, the length along the ray is
+ * t = tan(angle(N, I)) = tan(acos(dotNI)) = sqrt(1-dotNI^2) / dotNI.
+ * From Beer's law, we have T = exp(-sigma_e * t).
+ * Therefore, tint = exp(-sigma_e * 1) (per def.), so -sigma_e = log(tint).
+ * From this, T = exp(log(tint) * t) = exp(log(tint)) ^ t = tint ^ t;
+ */
+ float cosNI = dot(sd->I, N);
+ float optical_depth = safe_sqrtf(1.0f - sqr(cosNI)) / cosNI;
+ tint = pow(tint, optical_depth);
+ }
+
+ ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
+ sd, sizeof(MicrofacetBsdf), tint * clearcoat * weight);
+
+ if (bsdf == NULL) {
+ return 0.0f;
+ }
+
+ bsdf->N = N;
+ bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
+ bsdf->ior = 1.5f;
+ bsdf->extra = NULL;
+
+ bsdf->alpha_x = bsdf->alpha_y = sqr(roughness);
+
+ /* setup bsdf */
+ sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
+
+ return 0.04f * clearcoat; // TODO better approx
+}
+
+ccl_device void svm_node_closure_principled_v2(KernelGlobals kg,
+ ccl_private ShaderData *sd,
+ ccl_private float *stack,
+ uint4 node_1,
+ uint4 node_2,
+ float mix_weight,
+ int path_flag,
+ int *offset)
+{
+ float3 weight = sd->svm_closure_weight * mix_weight;
+
+ /* Load shared parameter data. */
+ uint base_color_offset, normal_offset, dummy;
+ uint roughness_offset, metallic_offset, ior_offset, transmission_offset;
+ svm_unpack_node_uchar4(node_1.y, &dummy, &base_color_offset, &normal_offset, &dummy);
+ 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);
+ 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);
+ }
+ float roughness = saturatef(stack_load_float(stack, roughness_offset));
+ float metallic = saturatef(stack_load_float(stack, metallic_offset));
+ float ior = fmaxf(stack_load_float(stack, ior_offset), 1e-5f);
+ float transmission = saturatef(stack_load_float(stack, transmission_offset));
+
+ float clearcoat_albedo = principled_v2_clearcoat(kg, sd, stack, weight, path_flag, node_2.w);
+
+ principled_v2_diffuse(sd, weight, base_color, 1.0f - clearcoat_albedo, N);
+}
+
ccl_device void svm_node_closure_principled(KernelGlobals kg,
ccl_private ShaderData *sd,
ccl_private float *stack,
@@ -446,6 +561,7 @@ ccl_device void svm_node_closure_principled(KernelGlobals kg,
ClosureType distribution = (ClosureType)packed_distribution;
if (distribution == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID) {
+ svm_node_closure_principled_v2(kg, sd, stack, node_1, node_2, mix_weight, path_flag, offset);
return;
}
More information about the Bf-blender-cvs
mailing list