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.
This commit is contained in:
@@ -1255,7 +1255,7 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
|
||||
cls.denoising_radius = IntProperty(
|
||||
name="Denoising Radius",
|
||||
description="Size of the image area that's used to denoise a pixel (higher values are smoother, but might lose detail and are slower)",
|
||||
min=1, max=50,
|
||||
min=1, max=25,
|
||||
default=8,
|
||||
)
|
||||
cls.denoising_relative_pca = BoolProperty(
|
||||
|
@@ -364,7 +364,7 @@ ccl_device_inline void kernel_write_result(KernelGlobals *kg, ccl_global float *
|
||||
}
|
||||
else {
|
||||
kernel_write_pass_float3_variance(buffer + kernel_data.film.pass_denoising_data + DENOISING_PASS_COLOR,
|
||||
sample, L_sum);
|
||||
sample, ensure_finite3(L_sum));
|
||||
}
|
||||
|
||||
kernel_write_pass_float3_variance(buffer + kernel_data.film.pass_denoising_data + DENOISING_PASS_NORMAL,
|
||||
|
@@ -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. */
|
||||
|
Reference in New Issue
Block a user