[Bf-blender-cvs] [19ae71c1134] blender-v3.3-release: Fix T100914: Cycles faceting with combined Bump and Displacement

Brecht Van Lommel noreply at git.blender.org
Mon Sep 12 20:38:35 CEST 2022


Commit: 19ae71c113424e1797b678cd32c41a07a3f28986
Author: Brecht Van Lommel
Date:   Mon Sep 12 20:11:40 2022 +0200
Branches: blender-v3.3-release
https://developer.blender.org/rB19ae71c113424e1797b678cd32c41a07a3f28986

Fix T100914: Cycles faceting with combined Bump and Displacement

Port over small part of ray differentials refactor in e949d6da5bd3 that
accidentally fixed this bug. Ensure ray differentials are orthogonal to
the normal.

===================================================================

M	intern/cycles/kernel/osl/shader.cpp
M	intern/cycles/kernel/svm/bump.h

===================================================================

diff --git a/intern/cycles/kernel/osl/shader.cpp b/intern/cycles/kernel/osl/shader.cpp
index af96c0070e3..cbe04b59b0a 100644
--- a/intern/cycles/kernel/osl/shader.cpp
+++ b/intern/cycles/kernel/osl/shader.cpp
@@ -17,6 +17,8 @@
 #include "kernel/osl/globals.h"
 #include "kernel/osl/services.h"
 #include "kernel/osl/shader.h"
+
+#include "kernel/util/differential.h"
 // clang-format on
 
 #include "scene/attribute.h"
@@ -199,13 +201,20 @@ void OSLShader::eval_surface(const KernelGlobalsCPU *kg,
       (void)found;
       assert(found);
 
+      differential3 dP;
       memcpy(&sd->P, data, sizeof(float) * 3);
-      memcpy(&sd->dP.dx, data + 3, sizeof(float) * 3);
-      memcpy(&sd->dP.dy, data + 6, sizeof(float) * 3);
+      memcpy(&dP.dx, data + 3, sizeof(float) * 3);
+      memcpy(&dP.dy, data + 6, sizeof(float) * 3);
 
       object_position_transform(kg, sd, &sd->P);
-      object_dir_transform(kg, sd, &sd->dP.dx);
-      object_dir_transform(kg, sd, &sd->dP.dy);
+      object_dir_transform(kg, sd, &dP.dx);
+      object_dir_transform(kg, sd, &dP.dy);
+
+      const float dP_radius = differential_make_compact(dP);
+
+      make_orthonormals(sd->Ng, &sd->dP.dx, &sd->dP.dy);
+      sd->dP.dx *= dP_radius;
+      sd->dP.dy *= dP_radius;
 
       globals->P = TO_VEC3(sd->P);
       globals->dPdx = TO_VEC3(sd->dP.dx);
diff --git a/intern/cycles/kernel/svm/bump.h b/intern/cycles/kernel/svm/bump.h
index 566c45f5f25..833400efc09 100644
--- a/intern/cycles/kernel/svm/bump.h
+++ b/intern/cycles/kernel/svm/bump.h
@@ -21,16 +21,19 @@ ccl_device_noinline void svm_node_enter_bump_eval(KernelGlobals kg,
   const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_POSITION_UNDISPLACED);
 
   if (desc.offset != ATTR_STD_NOT_FOUND) {
-    float3 P, dPdx, dPdy;
-    P = primitive_surface_attribute_float3(kg, sd, desc, &dPdx, &dPdy);
+    differential3 dP;
+    float3 P = primitive_surface_attribute_float3(kg, sd, desc, &dP.dx, &dP.dy);
 
     object_position_transform(kg, sd, &P);
-    object_dir_transform(kg, sd, &dPdx);
-    object_dir_transform(kg, sd, &dPdy);
+    object_dir_transform(kg, sd, &dP.dx);
+    object_dir_transform(kg, sd, &dP.dy);
+
+    const float dP_radius = differential_make_compact(dP);
 
     sd->P = P;
-    sd->dP.dx = dPdx;
-    sd->dP.dy = dPdy;
+    make_orthonormals(sd->Ng, &sd->dP.dx, &sd->dP.dy);
+    sd->dP.dx *= dP_radius;
+    sd->dP.dy *= dP_radius;
   }
 }



More information about the Bf-blender-cvs mailing list