[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