diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-09-26 22:38:23 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-09-26 22:38:23 +0300 |
commit | b96c70f9b2ec0faf314c4d1eaaa19b2ed27687d2 (patch) | |
tree | b2dfcbc9f2d2271d879887d08bb964f80db1639d | |
parent | 47e6d53c8a062dfb24ded58dffa88f276468cb3e (diff) |
BLI_rand : Make use of BLI_halton and BLI_hammersley
-rw-r--r-- | source/blender/blenkernel/intern/particle_distribute.c | 11 | ||||
-rw-r--r-- | source/blender/draw/engines/clay/clay_engine.c | 18 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_effects.c | 13 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 21 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightprobes.c | 17 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_private.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/rayshade.c | 41 |
7 files changed, 31 insertions, 91 deletions
diff --git a/source/blender/blenkernel/intern/particle_distribute.c b/source/blender/blenkernel/intern/particle_distribute.c index 9a7980827ad..ff8a638089f 100644 --- a/source/blender/blenkernel/intern/particle_distribute.c +++ b/source/blender/blenkernel/intern/particle_distribute.c @@ -312,19 +312,16 @@ static void distribute_grid(DerivedMesh *dm, ParticleSystem *psys) static void hammersley_create(float *out, int n, int seed, float amount) { RNG *rng; - double p, t, offs[2]; - int k, kk; + + double offs[2], t; rng = BLI_rng_new(31415926 + n + seed); offs[0] = BLI_rng_get_double(rng) + (double)amount; offs[1] = BLI_rng_get_double(rng) + (double)amount; BLI_rng_free(rng); - for (k = 0; k < n; k++) { - t = 0; - for (p = 0.5, kk = k; kk; p *= 0.5, kk >>= 1) - if (kk & 1) /* kk mod 2 = 1 */ - t += p; + for (int k = 0; k < n; k++) { + BLI_hammersley_1D(k, &t); out[2*k + 0] = fmod((double)k/(double)n + offs[0], 1.0); out[2*k + 1] = fmod(t + offs[1], 1.0); diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c index 97ea6ae77a4..937cf7579c6 100644 --- a/source/blender/draw/engines/clay/clay_engine.c +++ b/source/blender/draw/engines/clay/clay_engine.c @@ -277,19 +277,6 @@ static int matcap_to_index(int matcap) return 0; } -/* Van der Corput sequence */ -/* TODO this is duplicated code from eevee_lightprobes.c */ - /* From http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html */ -static float radical_inverse(int i) { - unsigned int bits = (unsigned int)i; - bits = (bits << 16u) | (bits >> 16u); - bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); - bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); - bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); - bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); - return (float)bits * 2.3283064365386963e-10f; -} - /* Using Hammersley distribution */ static float *create_disk_samples(int num_samples) { @@ -299,7 +286,10 @@ static float *create_disk_samples(int num_samples) for (int i = 0; i < num_samples; i++) { float r = (i + 0.5f) * num_samples_inv; - float phi = radical_inverse(i) * 2.0f * M_PI; + double dphi; + BLI_hammersley_1D(i, &dphi); + + float phi = (float)dphi * 2.0f * M_PI; texels[i][0] = cosf(phi); texels[i][1] = sinf(phi); /* This deliberatly distribute more samples diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index ac2d293292c..8318161ef69 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -43,7 +43,7 @@ #include "DEG_depsgraph.h" #include "BLI_dynstr.h" -#include "BLI_jitter.h" +#include "BLI_rand.h" #include "eevee_private.h" #include "GPU_texture.h" @@ -764,7 +764,6 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata) if (effects->taa_total_sample != taa_pref_samples) { effects->taa_total_sample = taa_pref_samples; - BLI_jitter_init(effects->taa_jit_ofs, effects->taa_total_sample); } DRW_viewport_matrix_get(persmat, DRW_MAT_PERS); @@ -779,10 +778,16 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata) effects->taa_alpha = 1.0f - (1.0f / (float)(effects->taa_current_sample)); + double ht_point[2]; + double ht_offset[2] = {0.0, 0.0}; + unsigned int ht_primes[2] = {2, 3}; + + BLI_halton_2D(ht_primes, ht_offset, effects->taa_current_sample - 1, ht_point); + window_translate_m4( effects->overide_winmat, persmat, - (effects->taa_jit_ofs[effects->taa_current_sample][0] * 2.0f) / viewport_size[0], - (effects->taa_jit_ofs[effects->taa_current_sample][1] * 2.0f) / viewport_size[1]); + ((float)(ht_point[0]) * 2.0f - 1.0f) / viewport_size[0], + ((float)(ht_point[1]) * 2.0f - 1.0f) / viewport_size[1]); mul_m4_m4m4(effects->overide_persmat, effects->overide_winmat, viewmat); invert_m4_m4(effects->overide_persinv, effects->overide_persmat); diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index f4b22d5b890..cbc0c059c87 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -43,22 +43,6 @@ extern GlobalsUboStorage ts; /* *********** FUNCTIONS *********** */ -/* TODO : put this somewhere in BLI */ -static float halton_1D(int prime, int n) -{ - float inv_prime = 1.0f / (float)prime; - float f = 1.0f; - float r = 0.0f; - - while (n > 0) { - f = f * inv_prime; - r += f * (n % prime); - n = (int)(n * inv_prime); - } - - return r; -} - static void EEVEE_engine_init(void *ved) { EEVEE_Data *vedata = (EEVEE_Data *)ved; @@ -192,11 +176,12 @@ static void EEVEE_draw_scene(void *vedata) EEVEE_update_util_texture(rand); } else if (((stl->effects->enabled_effects & EFFECT_TAA) != 0) && (stl->effects->taa_current_sample > 1)) { - rand = halton_1D(2, stl->effects->taa_current_sample - 1); + double r; + BLI_halton_1D(2, 0.0, stl->effects->taa_current_sample - 1, &r); /* Set jitter offset */ /* PERF This is killing perf ! */ - EEVEE_update_util_texture(rand); + EEVEE_update_util_texture((float)r); } while (loop_ct--) { diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 020734a17f9..4fcb0e45229 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -32,6 +32,7 @@ #include "BKE_object.h" #include "BLI_dynstr.h" +#include "BLI_rand.h" #include "ED_screen.h" @@ -97,18 +98,6 @@ extern GlobalsUboStorage ts; /* *********** FUNCTIONS *********** */ -/* Van der Corput sequence */ - /* From http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html */ -static float radical_inverse(int i) { - unsigned int bits = (unsigned int)i; - bits = (bits << 16u) | (bits >> 16u); - bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); - bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); - bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); - bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); - return (float)bits * 2.3283064365386963e-10f; -} - static struct GPUTexture *create_hammersley_sample_texture(int samples) { struct GPUTexture *tex; @@ -116,7 +105,9 @@ static struct GPUTexture *create_hammersley_sample_texture(int samples) int i; for (i = 0; i < samples; i++) { - float phi = radical_inverse(i) * 2.0f * M_PI; + double dphi; + BLI_hammersley_1D(i, &dphi); + float phi = (float)dphi * 2.0f * M_PI; texels[i][0] = cosf(phi); texels[i][1] = sinf(phi); } diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index f68e2eb07f2..3a719b1f3e9 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -370,7 +370,6 @@ typedef struct EEVEE_EffectsInfo { /* Temporal Anti Aliasing */ int taa_current_sample; int taa_total_sample; - float taa_jit_ofs[32][2]; float taa_alpha; float prev_drw_persmat[4][4]; float overide_persmat[4][4]; diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index 26a0b0c71b4..2eb2e95308a 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -995,7 +995,7 @@ static float *give_jitter_plane(LampRen *lar, int thread, int xs, int ys) /* **************** QMC sampling *************** */ -static void halton_sample(double *ht_invprimes, double *ht_nums, double *v) +static void UNUSED_FUNCTION(halton_sample)(double *ht_invprimes, double *ht_nums, double *v) { /* incremental halton sequence generator, from: * "Instant Radiosity", Keller A. */ @@ -1022,26 +1022,6 @@ static void halton_sample(double *ht_invprimes, double *ht_nums, double *v) } } -/* Generate Hammersley points in [0,1)^2 - * From Lucille renderer */ -static void hammersley_create(double *out, int n) -{ - double p, t; - int k, kk; - - for (k = 0; k < n; k++) { - t = 0; - for (p = 0.5, kk = k; kk; p *= 0.5, kk >>= 1) { - if (kk & 1) { /* kk mod 2 = 1 */ - t += p; - } - } - - out[2 * k + 0] = (double)k / (double)n; - out[2 * k + 1] = t; - } -} - static struct QMCSampler *QMC_initSampler(int type, int tot) { QMCSampler *qsa = MEM_callocN(sizeof(QMCSampler), "qmc sampler"); @@ -1051,7 +1031,7 @@ static struct QMCSampler *QMC_initSampler(int type, int tot) qsa->type = type; if (qsa->type==SAMP_TYPE_HAMMERSLEY) - hammersley_create(qsa->samp2d, qsa->tot); + BLI_hammersley_2D_sequence(qsa->tot, qsa->samp2d); return qsa; } @@ -1069,20 +1049,13 @@ static void QMC_initPixel(QMCSampler *qsa, int thread) /* generate a new randomized halton sequence per pixel * to alleviate qmc artifacts and make it reproducible * between threads/frames */ - double ht_invprimes[2], ht_nums[2]; - double r[2]; - int i; + double ht_offset[2]; + unsigned int ht_primes[2] = {2, 3}; - ht_nums[0] = BLI_thread_frand(thread); - ht_nums[1] = BLI_thread_frand(thread); - ht_invprimes[0] = 0.5; - ht_invprimes[1] = 1.0/3.0; + ht_offset[0] = BLI_thread_frand(thread); + ht_offset[1] = BLI_thread_frand(thread); - for (i=0; i< qsa->tot; i++) { - halton_sample(ht_invprimes, ht_nums, r); - qsa->samp2d[2*i+0] = r[0]; - qsa->samp2d[2*i+1] = r[1]; - } + BLI_halton_2D_sequence(ht_primes, ht_offset, qsa->tot, qsa->samp2d); } } |