From 8372b4343fdc25f8d57dd8e72c9407bab3899025 Mon Sep 17 00:00:00 2001 From: Alexey Smolenchuk Date: Wed, 26 Aug 2026 10:50:48 +0100 Subject: [PATCH 1/5] [testrender] Fix discontinuities in principal directions Signed-off-by: Alexey Smolenchuk --- src/testrender/raytracer.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/testrender/raytracer.h b/src/testrender/raytracer.h index eef7f2a3e7..8d1ca73236 100644 --- a/src/testrender/raytracer.h +++ b/src/testrender/raytracer.h @@ -40,9 +40,13 @@ class OptixRenderer; // FIXME -- should not be here inline OSL_HOSTDEVICE void ortho(const Vec3& n, Vec3& x, Vec3& y) { - x = (fabsf(n.x) > .01f ? Vec3(n.z, 0, -n.x) : Vec3(0, -n.z, n.y)) - .normalize(); - y = n.cross(x); + // https://research.pixar.com/docs/2017.Others.DBCHKLV.pdf + float sign = copysignf(1.0f, n.z); + const float a = -1.0f / (sign + n.z); + const float b = n.x * n.y * a; + // Negate to match previous implementation + x = -Vec3(1.0f + sign * n.x * n.x * a, sign * b, -sign * n.x); + y = -Vec3(b, sign + n.y * n.y * a, -n.y); } From f1ef44306fd7357a4c6caee36a258af3974f0fc1 Mon Sep 17 00:00:00 2001 From: Alexey Smolenchuk Date: Wed, 26 Aug 2026 11:13:55 +0100 Subject: [PATCH 2/5] format Signed-off-by: Alexey Smolenchuk --- src/testrender/raytracer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testrender/raytracer.h b/src/testrender/raytracer.h index 8d1ca73236..325ad139c0 100644 --- a/src/testrender/raytracer.h +++ b/src/testrender/raytracer.h @@ -41,7 +41,7 @@ inline OSL_HOSTDEVICE void ortho(const Vec3& n, Vec3& x, Vec3& y) { // https://research.pixar.com/docs/2017.Others.DBCHKLV.pdf - float sign = copysignf(1.0f, n.z); + float sign = copysignf(1.0f, n.z); const float a = -1.0f / (sign + n.z); const float b = n.x * n.y * a; // Negate to match previous implementation From 5e9db457466b03f25908696274b40ec6ae1b893a Mon Sep 17 00:00:00 2001 From: Alexey Smolenchuk Date: Wed, 26 Aug 2026 17:59:31 +0100 Subject: [PATCH 3/5] remove negation update link Signed-off-by: Alexey Smolenchuk --- src/testrender/raytracer.h | 6 +++--- src/testrender/sampling.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/testrender/raytracer.h b/src/testrender/raytracer.h index 325ad139c0..122da415ad 100644 --- a/src/testrender/raytracer.h +++ b/src/testrender/raytracer.h @@ -44,9 +44,9 @@ ortho(const Vec3& n, Vec3& x, Vec3& y) float sign = copysignf(1.0f, n.z); const float a = -1.0f / (sign + n.z); const float b = n.x * n.y * a; - // Negate to match previous implementation - x = -Vec3(1.0f + sign * n.x * n.x * a, sign * b, -sign * n.x); - y = -Vec3(b, sign + n.y * n.y * a, -n.y); + + x = Vec3(1.0f + sign * n.x * n.x * a, sign * b, -sign * n.x); + y = Vec3(b, sign + n.y * n.y * a, -n.y); } diff --git a/src/testrender/sampling.h b/src/testrender/sampling.h index 69ec6909a3..19aa044108 100644 --- a/src/testrender/sampling.h +++ b/src/testrender/sampling.h @@ -16,7 +16,7 @@ struct TangentFrame { // build frame from unit normal static OSL_HOSTDEVICE TangentFrame from_normal(const Vec3& n) { - // https://graphics.pixar.com/library/OrthonormalB/paper.pdf + // https://research.pixar.com/docs/2017.Others.DBCHKLV.pdf const float sign = copysignf(1.0f, n.z); const float a = -1 / (sign + n.z); const float b = n.x * n.y * a; From f8a1a0850e1e6b4a13dea5d65f4ef49f693dbeda Mon Sep 17 00:00:00 2001 From: Larry Gritz Date: Fri, 28 Aug 2026 11:58:29 -0700 Subject: [PATCH 4/5] Apply suggestion from @lgritz Add the citation in case the pdf link url changes Signed-off-by: Larry Gritz --- src/testrender/raytracer.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/testrender/raytracer.h b/src/testrender/raytracer.h index 122da415ad..a8a9845c8f 100644 --- a/src/testrender/raytracer.h +++ b/src/testrender/raytracer.h @@ -41,6 +41,7 @@ inline OSL_HOSTDEVICE void ortho(const Vec3& n, Vec3& x, Vec3& y) { // https://research.pixar.com/docs/2017.Others.DBCHKLV.pdf + // Duff, et al. "Building an Orthonormal Basis, Revisited", JCGT 6(1) 2017. float sign = copysignf(1.0f, n.z); const float a = -1.0f / (sign + n.z); const float b = n.x * n.y * a; From 7b0114a758f557dc729538973e3068e09b647d04 Mon Sep 17 00:00:00 2001 From: Larry Gritz Date: Fri, 28 Aug 2026 11:58:41 -0700 Subject: [PATCH 5/5] Apply suggestion from @lgritz Add the citation in case the URL changes Signed-off-by: Larry Gritz --- src/testrender/sampling.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/testrender/sampling.h b/src/testrender/sampling.h index 19aa044108..06665c821c 100644 --- a/src/testrender/sampling.h +++ b/src/testrender/sampling.h @@ -17,6 +17,7 @@ struct TangentFrame { static OSL_HOSTDEVICE TangentFrame from_normal(const Vec3& n) { // https://research.pixar.com/docs/2017.Others.DBCHKLV.pdf + // Duff, et al. "Building an Orthonormal Basis, Revisited", JCGT 6(1) 2017. const float sign = copysignf(1.0f, n.z); const float a = -1 / (sign + n.z); const float b = n.x * n.y * a;