From 6efb69a5fea75001ff209d1cdfdccab654846465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 9 May 2024 19:15:06 +0200 Subject: [PATCH] EEVEE-Next: Fixing shifted blur for non constant Shutter Curve The function `cdf_invert` was not doing linear interpolation between the correct values. This fixes the issue and make sure that `x` is never perfectly 0 nor 1. Fixes #117755 --- .../draw/engines/eevee_next/eevee_sampling.cc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/source/blender/draw/engines/eevee_next/eevee_sampling.cc b/source/blender/draw/engines/eevee_next/eevee_sampling.cc index 5f6ce7fa7dc..40ac5ceea9b 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sampling.cc +++ b/source/blender/draw/engines/eevee_next/eevee_sampling.cc @@ -317,14 +317,12 @@ void Sampling::cdf_from_curvemapping(const CurveMapping &curve, Vector &c * Output vector is expected to already be sized according to the wanted resolution. */ void Sampling::cdf_invert(Vector &cdf, Vector &inverted_cdf) { + BLI_assert(cdf.first() == 0.0f && cdf.last() == 1.0f); for (int u : inverted_cdf.index_range()) { - float x = float(u) / float(inverted_cdf.size() - 1); - for (int i : cdf.index_range()) { - if (i == cdf.size() - 1) { - inverted_cdf[u] = 1.0f; - } - else if (cdf[i] >= x) { - float t = (x - cdf[i]) / (cdf[i + 1] - cdf[i]); + float x = clamp_f(u / float(inverted_cdf.size() - 1), 1e-5f, 1.0f - 1e-5f); + for (int i : cdf.index_range().drop_front(1)) { + if (cdf[i] >= x) { + float t = (x - cdf[i]) / (cdf[i] - cdf[i - 1]); inverted_cdf[u] = (float(i) + t) / float(cdf.size() - 1); break; }