[Bf-blender-cvs] [a0c947ed4c1] eevee-motionblur-object: EEVEE: Motion Blur: Replace Wang Hash Noise function by blue noise
Clément Foucault
noreply at git.blender.org
Fri Jun 12 15:17:31 CEST 2020
Commit: a0c947ed4c1bb144efb111a9bbbb3ae926d375df
Author: Clément Foucault
Date: Thu Jun 11 14:27:20 2020 +0200
Branches: eevee-motionblur-object
https://developer.blender.org/rBa0c947ed4c1bb144efb111a9bbbb3ae926d375df
EEVEE: Motion Blur: Replace Wang Hash Noise function by blue noise
===================================================================
M source/blender/draw/engines/eevee/eevee_motion_blur.c
M source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl
===================================================================
diff --git a/source/blender/draw/engines/eevee/eevee_motion_blur.c b/source/blender/draw/engines/eevee/eevee_motion_blur.c
index 7da5a808ffc..c768ada8772 100644
--- a/source/blender/draw/engines/eevee/eevee_motion_blur.c
+++ b/source/blender/draw/engines/eevee/eevee_motion_blur.c
@@ -267,6 +267,7 @@ void EEVEE_motion_blur_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Dat
grp = DRW_shgroup_create(e_data.motion_blur_sh, psl->motion_blur);
DRW_shgroup_uniform_int_copy(grp, "samples", scene->eevee.motion_blur_samples);
DRW_shgroup_uniform_float(grp, "sampleOffset", &effects->motion_blur_sample_offset, 1);
+ DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &effects->source_buffer, state);
DRW_shgroup_uniform_texture_ref_ex(grp, "depthBuffer", &dtxl->depth, state);
DRW_shgroup_uniform_texture_ref_ex(grp, "velocityBuffer", &effects->velocity_tx, state);
diff --git a/source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl
index dd1d621ede9..04a8a989ed6 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_motion_blur_frag.glsl
@@ -13,6 +13,13 @@ uniform sampler2D depthBuffer;
uniform sampler2D velocityBuffer;
uniform sampler2D tileMaxBuffer;
+#define KERNEL 8
+
+/* TODO(fclem) deduplicate this code. */
+uniform sampler2DArray utilTex;
+#define LUT_SIZE 64
+#define texelfetch_noise_tex(coord) texelFetch(utilTex, ivec3(ivec2(coord) % LUT_SIZE, 2.0), 0)
+
uniform int maxBlurRadius;
uniform int samples;
uniform float sampleOffset;
@@ -31,21 +38,6 @@ out vec4 fragColor;
#define saturate(a) clamp(a, 0.0, 1.0)
-float wang_hash_noise(uint s)
-{
- uint seed = (uint(gl_FragCoord.x) * 1664525u + uint(gl_FragCoord.y)) + s;
-
- seed = (seed ^ 61u) ^ (seed >> 16u);
- seed *= 9u;
- seed = seed ^ (seed >> 4u);
- seed *= 0x27d4eb2du;
- seed = seed ^ (seed >> 15u);
-
- float value = float(seed);
- value *= 1.0 / 4294967296.0;
- return fract(value + sampleOffset);
-}
-
vec2 spread_compare(float center_motion_length, float sample_motion_length, float offset_length)
{
return saturate(vec2(center_motion_length, sample_motion_length) - offset_length + 1.0);
@@ -105,9 +97,6 @@ vec2 sample_velocity(vec2 uv, const bool next)
return data.xy;
}
-#define SEARCH_KERNEL 8.0
-#define KERNEL 8
-
void gather_sample(vec2 screen_uv,
float center_depth,
float center_motion_len,
@@ -139,6 +128,7 @@ void gather_blur(vec2 screen_uv,
vec2 center_motion,
float center_depth,
vec2 max_motion,
+ float ofs,
const bool next,
inout vec4 accum,
inout vec4 accum_bg,
@@ -158,9 +148,6 @@ void gather_blur(vec2 screen_uv,
return;
}
- /* TODO use blue noise texture. */
- float ofs = fract(wang_hash_noise(0u) + sampleOffset);
-
int i;
float t, inc = 1.0 / float(KERNEL);
for (i = 0, t = ofs * inc; i < KERNEL; i++, t += inc) {
@@ -204,12 +191,12 @@ void main()
vec4 center_motion = sample_velocity(uv);
vec4 center_color = textureLod(colorBuffer, uv, 0.0);
- /* TODO use blue noise texture. */
- float rand = fract(wang_hash_noise(68241u) + sampleOffset) * 2.0 - 1.0;
+ vec2 rand = texelfetch_noise_tex(gl_FragCoord.xy).xy;
/* Randomize tile boundary to avoid ugly discontinuities. Randomize 1/4th of the tile.
* Note this randomize only in one direction but in practice it's enough. */
- ivec2 tile = ivec2(gl_FragCoord.xy + rand * float(maxBlurRadius) * 0.25) / maxBlurRadius;
+ rand.x = rand.x * 2.0 - 1.0;
+ ivec2 tile = ivec2(gl_FragCoord.xy + rand.x * float(maxBlurRadius) * 0.25) / maxBlurRadius;
tile = clamp(tile, ivec2(0), textureSize(tileMaxBuffer, 0).xy - 1);
vec4 max_motion = decode_velocity(texelFetch(tileMaxBuffer, tile, 0));
@@ -219,9 +206,11 @@ void main()
vec4 accum_bg = vec4(0.0);
vec4 accum = vec4(0.0);
/* First linear gather. time = [T - delta, T] */
- gather_blur(uv, center_motion.xy, center_depth, max_motion.xy, false, accum, accum_bg, w_accum);
+ gather_blur(
+ uv, center_motion.xy, center_depth, max_motion.xy, rand.y, false, accum, accum_bg, w_accum);
/* Second linear gather. time = [T, T + delta] */
- gather_blur(uv, center_motion.zw, center_depth, max_motion.zw, true, accum, accum_bg, w_accum);
+ gather_blur(
+ uv, center_motion.zw, center_depth, max_motion.zw, rand.y, true, accum, accum_bg, w_accum);
#if 1
/* Avoid division by 0.0. */
More information about the Bf-blender-cvs
mailing list