Commit: 213e34a6c32022836337c8bf181b4bbd69fa6097
Author: Clément Foucault
Date:   Tue Jan 16 19:40:17 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB213e34a6c32022836337c8bf181b4bbd69fa6097

Eevee: Fix Hashed Alpha.

Now hashed alpha materials are stable when moving the camera/not using TAA.
It also converge to a noise free image when using TAA. No more numerical 
imprecision.

There still can be situations with multiple overlapping transparent surfaces 
that can lead to residual noise.

===================================================================

M       source/blender/draw/engines/eevee/eevee_materials.c
M       source/blender/draw/engines/eevee/shaders/prepass_frag.glsl

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_materials.c 
b/source/blender/draw/engines/eevee/eevee_materials.c
index f4bef9afed1..8149c105a81 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -28,6 +28,7 @@
 #include "BLI_dynstr.h"
 #include "BLI_ghash.h"
 #include "BLI_alloca.h"
+#include "BLI_rand.h"
 
 #include "BKE_particle.h"
 #include "BKE_paint.h"
@@ -61,6 +62,7 @@ static struct {
        unsigned int sss_count;
 
        float viewvecs[2][4];
+       float alpha_hash_offset;
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_lamps_lib_glsl[];
@@ -548,6 +550,19 @@ void EEVEE_materials_init(EEVEE_StorageList *stl)
                EEVEE_update_util_texture(offsets);
        }
 
+       /* Alpha hash scale: Non-flickering size if we are not refining the 
render. */
+       if (!DRW_state_is_image_render() &&
+               (((stl->effects->enabled_effects & EFFECT_TAA) == 0) ||
+                (stl->effects->taa_current_sample == 1)))
+       {
+               e_data.alpha_hash_offset = 0.0f;
+       }
+       else {
+               double r;
+               BLI_halton_1D(5, 0.0, stl->effects->taa_current_sample, &r);
+               e_data.alpha_hash_offset = (float)r;
+       }
+
        {
                /* Update viewvecs */
                const bool is_persp = DRW_viewport_is_persp_get();
@@ -1069,6 +1084,10 @@ static void material_opaque(
                                        DRW_shgroup_uniform_float(*shgrp_depth, 
"alphaThreshold", &ma->alpha_threshold, 1);
                                        
DRW_shgroup_uniform_float(*shgrp_depth_clip, "alphaThreshold", 
&ma->alpha_threshold, 1);
                                }
+                               else if (ma->blend_method == MA_BM_HASHED) {
+                                       DRW_shgroup_uniform_float(*shgrp_depth, 
"hashAlphaOffset", &e_data.alpha_hash_offset, 1);
+                                       
DRW_shgroup_uniform_float(*shgrp_depth_clip, "hashAlphaOffset", 
&e_data.alpha_hash_offset, 1);
+                               }
                        }
                }
        }
diff --git a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl 
b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl
index f921d56e3bc..1c0e65f0613 100644
--- a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl
@@ -10,14 +10,15 @@ float hash3d(vec3 a) {
        return hash(vec2(hash(a.xy), a.z));
 }
 
-//uniform float hashScale;
-float hashScale = 0.001;
+uniform float hashAlphaOffset;
 
 float hashed_alpha_threshold(vec3 co)
 {
+       const float hash_scale = 1.0; /* Roughly in pixel */
+
        /* Find the discretized derivatives of our coordinates. */
        float max_deriv = max(length(dFdx(co)), length(dFdy(co)));
-       float pix_scale = 1.0 / (hashScale * max_deriv);
+       float pix_scale = 1.0 / (hash_scale * max_deriv);
 
        /* Find two nearest log-discretized noise scales. */
        float pix_scale_log = log2(pix_scale);
@@ -53,7 +54,8 @@ float hashed_alpha_threshold(vec3 co)
        /* Avoids threshold == 0. */
        threshold = clamp(threshold, 1.0e-6, 1.0);
 
-       return threshold;
+       /* Jitter the threshold for TAA accumulation. */
+       return fract(threshold + hashAlphaOffset);
 }
 
 #endif

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to