From 58a0c275464605ccff18a56c4d82b619df069e91 Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Mon, 8 May 2017 22:09:35 +0200 Subject: Cycles: Fix occasional black pixels from denoising with excessive radii Numerical inaccuracies would cause the XtWX matrix to be no longer positive-semidefinite, which in turn caused the LSQ solver to fail. --- intern/cycles/util/util_math_matrix.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'intern/cycles/util/util_math_matrix.h') diff --git a/intern/cycles/util/util_math_matrix.h b/intern/cycles/util/util_math_matrix.h index 31ea10f18a8..2172e94a14f 100644 --- a/intern/cycles/util/util_math_matrix.h +++ b/intern/cycles/util/util_math_matrix.h @@ -176,7 +176,10 @@ ccl_device void math_trimatrix_cholesky(ccl_global float *A, int n, int stride) * symmetrical positive-semidefinite by construction, so we can just use this function with A=Xt*W*X and y=Xt*W*y. */ ccl_device_inline void math_trimatrix_vec3_solve(ccl_global float *A, ccl_global float3 *y, int n, int stride) { - math_trimatrix_add_diagonal(A, n, 1e-4f, stride); /* Improve the numerical stability. */ + /* Since the first entry of the design row is always 1, the upper-left element of XtWX is a good + * heuristic for the amount of pixels considered (with weighting), therefore the amount of correction + * is scaled based on it. */ + math_trimatrix_add_diagonal(A, n, 3e-7f*A[0], stride); /* Improve the numerical stability. */ math_trimatrix_cholesky(A, n, stride); /* Replace A with L so that L*Lt = A. */ /* Use forward substitution to solve L*b = y, replacing y by b. */ -- cgit v1.2.3