[Bf-blender-cvs] [c394ad246d4] tmp-workbench-rewrite2: Move jitter_tx to SceneResources

Miguel Pozo noreply at git.blender.org
Wed Nov 2 23:43:27 CET 2022


Commit: c394ad246d48f1043f68eb1d780d5e022f41d35e
Author: Miguel Pozo
Date:   Wed Nov 2 20:39:48 2022 +0100
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rBc394ad246d48f1043f68eb1d780d5e022f41d35e

Move jitter_tx to SceneResources

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

M	source/blender/draw/engines/workbench/workbench_effect_cavity.cc
M	source/blender/draw/engines/workbench/workbench_effect_dof.cc
M	source/blender/draw/engines/workbench/workbench_mesh_passes.cc
M	source/blender/draw/engines/workbench/workbench_private.hh
M	source/blender/draw/engines/workbench/workbench_resources.cc

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

diff --git a/source/blender/draw/engines/workbench/workbench_effect_cavity.cc b/source/blender/draw/engines/workbench/workbench_effect_cavity.cc
index 4a8e20e49b7..f939f50295b 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_cavity.cc
+++ b/source/blender/draw/engines/workbench/workbench_effect_cavity.cc
@@ -12,13 +12,12 @@
  * This is done after the opaque pass. It only affects the opaque surfaces.
  */
 
-#include "../eevee/eevee_lut.h" /* TODO: find somewhere to share blue noise Table. */
 #include "BLI_rand.h"
 #include "workbench_private.hh"
 
 namespace blender::workbench {
 
-void CavityEffect::init(const SceneState &scene_state, UniformBuffer<WorldData> &world_buf)
+void CavityEffect::init(const SceneState &scene_state, SceneResources &resources)
 {
   cavity_enabled_ = scene_state.draw_cavity;
   curvature_enabled_ = scene_state.draw_curvature;
@@ -29,6 +28,8 @@ void CavityEffect::init(const SceneState &scene_state, UniformBuffer<WorldData>
 
   sample_ = scene_state.sample % max_iter_count;
 
+  UniformBuffer<WorldData> &world_buf = resources.world_buf;
+
   world_buf.cavity_sample_start = ssao_samples * sample_;
   world_buf.cavity_sample_end = ssao_samples * (sample_ + 1);
 
@@ -46,63 +47,43 @@ void CavityEffect::init(const SceneState &scene_state, UniformBuffer<WorldData>
   world_buf.curvature_valley = 0.7f / max_ff(square_f(scene_state.shading.curvature_valley_factor),
                                              1e-4f);
 
-  if (cavity_enabled_ || scene_state.draw_dof) {
-    setup_resources(ssao_samples, sample_count);
+  if (cavity_enabled_ && sample_count_ != sample_count) {
+    sample_count_ = sample_count;
+    load_samples_buf(ssao_samples);
+    resources.load_jitter_tx(sample_count_);
   }
 }
 
-void CavityEffect::setup_resources(int iteration_samples, int total_samples)
+void CavityEffect::load_samples_buf(int ssao_samples)
 {
-  if (sample_count_ != total_samples) {
-    sample_count_ = total_samples;
-    const float iteration_samples_inv = 1.0f / iteration_samples;
-
-    /* Create disk samples using Hammersley distribution */
-    for (int i : IndexRange(sample_count_)) {
-      float it_add = (i / iteration_samples) * 0.499f;
-      float r = fmodf((i + 0.5f + it_add) * iteration_samples_inv, 1.0f);
-      double dphi;
-      BLI_hammersley_1d(i, &dphi);
-
-      float phi = (float)dphi * 2.0f * M_PI + it_add;
-      samples_buf[i].x = cosf(phi);
-      samples_buf[i].y = sinf(phi);
-      /* This deliberately distribute more samples
-       * at the center of the disk (and thus the shadow). */
-      samples_buf[i].z = r;
-    }
-
-    samples_buf.push_update();
-
-    const float total_samples_inv = 1.0f / iteration_samples;
-
-    /* Create blue noise jitter texture */
-    const int jitter_texel_count = jitter_tx_size_ * jitter_tx_size_;
-    static float4 jitter[jitter_texel_count];
-    for (int i = 0; i < jitter_texel_count; i++) {
-      float phi = blue_noise[i][0] * 2.0f * M_PI;
-      /* This rotate the sample per pixels */
-      jitter[i].x = cosf(phi);
-      jitter[i].y = sinf(phi);
-      /* This offset the sample along its direction axis (reduce banding) */
-      float bn = blue_noise[i][1] - 0.5f;
-      bn = clamp_f(bn, -0.499f, 0.499f); /* fix fireflies */
-      jitter[i].z = bn * total_samples_inv;
-      jitter[i].w = blue_noise[i][1];
-    }
-
-    jitter_tx.ensure_2d(GPU_RGBA16F, int2(jitter_tx_size_), jitter[0]);
+  const float iteration_samples_inv = 1.0f / ssao_samples;
+
+  /* Create disk samples using Hammersley distribution */
+  for (int i : IndexRange(sample_count_)) {
+    float it_add = (i / ssao_samples) * 0.499f;
+    float r = fmodf((i + 0.5f + it_add) * iteration_samples_inv, 1.0f);
+    double dphi;
+    BLI_hammersley_1d(i, &dphi);
+
+    float phi = (float)dphi * 2.0f * M_PI + it_add;
+    samples_buf[i].x = cosf(phi);
+    samples_buf[i].y = sinf(phi);
+    /* This deliberately distribute more samples
+     * at the center of the disk (and thus the shadow). */
+    samples_buf[i].z = r;
   }
+
+  samples_buf.push_update();
 }
 
-void CavityEffect::setup_resolve_pass(PassSimple &pass, Texture &object_id_tx)
+void CavityEffect::setup_resolve_pass(PassSimple &pass, SceneResources &resources)
 {
   if (cavity_enabled_) {
     pass.bind_ubo("cavity_samples", samples_buf);
-    pass.bind_texture("jitter_tx", &jitter_tx, eGPUSamplerState::GPU_SAMPLER_REPEAT);
+    pass.bind_texture("jitter_tx", &resources.jitter_tx, eGPUSamplerState::GPU_SAMPLER_REPEAT);
   }
   if (curvature_enabled_) {
-    pass.bind_texture("object_id_tx", &object_id_tx);
+    pass.bind_texture("object_id_tx", &resources.object_id_tx);
   }
 }
 
diff --git a/source/blender/draw/engines/workbench/workbench_effect_dof.cc b/source/blender/draw/engines/workbench/workbench_effect_dof.cc
index 3c3ff803d98..ee687ec2746 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_dof.cc
+++ b/source/blender/draw/engines/workbench/workbench_effect_dof.cc
@@ -186,15 +186,11 @@ void DofPass::sync(SceneResources &resources)
   down2_ps_.bind_texture("inputCocTex", &coc_halfres_tx_, sampler_state);
   down2_ps_.draw_procedural(GPU_PRIM_TRIS, 1, 3);
 
-  /* TODO(Miguel Pozo): Move jitter_tx to SceneResources */
-  /* We reuse the same noise texture. Ensure it is up to date. */
-  // workbench_cavity_samples_ubo_ensure(wpd);
-
   blur_ps_.init();
   blur_ps_.state_set(DRW_STATE_WRITE_COLOR);
   blur_ps_.shader_set(blur1_sh_);
   blur_ps_.bind_ubo("samples", samples_buf_);
-  blur_ps_.bind_texture("noiseTex", resources.cavity.jitter_tx);
+  blur_ps_.bind_texture("noiseTex", resources.jitter_tx);
   blur_ps_.bind_texture("inputCocTex", &coc_halfres_tx_, sampler_state);
   blur_ps_.bind_texture("halfResColorTex", &source_tx_, sampler_state);
   blur_ps_.push_constant("invertedViewportSize", float2(DRW_viewport_invert_size_get()));
diff --git a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
index 2fecd4af9a3..0d07232781d 100644
--- a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
+++ b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
@@ -114,7 +114,7 @@ void OpaquePass::sync(const SceneState &scene_state, SceneResources &resources)
   deferred_ps_.bind_texture("material_tx", &gbuffer_material_tx);
   deferred_ps_.bind_texture("depth_tx", &resources.depth_tx);
   deferred_ps_.bind_image("out_color_img", &resources.color_tx);
-  resources.cavity.setup_resolve_pass(deferred_ps_, resources.object_id_tx);
+  resources.cavity.setup_resolve_pass(deferred_ps_, resources);
   deferred_ps_.dispatch(math::divide_ceil(scene_state.resolution, int2(WB_RESOLVE_GROUP_SIZE)));
   deferred_ps_.barrier(GPU_BARRIER_TEXTURE_FETCH);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index b905d182cf5..c54f729a5b9 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -120,20 +120,16 @@ class CavityEffect {
   bool curvature_enabled_;
   bool cavity_enabled_;
 
- public:
-  static const int jitter_tx_size_ = 64;
   static const int max_samples_ = 512;  // This value must be kept in sync with the one declared at
                                         // workbench_composite_info.hh (cavity_samples)
-
   UniformArrayBuffer<float4, max_samples_> samples_buf;
-  /*TODO(Miguel Pozo): Move to SceneResources (Used by DoF too)*/
-  Texture jitter_tx;
 
-  void setup_resources(int iteration_samples, int total_samples);
+  void load_samples_buf(int ssao_samples);
 
-  void init(const SceneState &scene_state, UniformBuffer<WorldData> &world_buf);
+ public:
+  void init(const SceneState &scene_state, struct SceneResources &resources);
 
-  void setup_resolve_pass(PassSimple &pass, Texture &object_id_tx);
+  void setup_resolve_pass(PassSimple &pass, struct SceneResources &resources);
 };
 
 struct SceneResources {
@@ -150,6 +146,10 @@ struct SceneResources {
   StorageVectorBuffer<Material> material_buf = {"material_buf"};
   UniformBuffer<WorldData> world_buf;
 
+  static const int jitter_tx_size = 64;
+  Texture jitter_tx = "wb_jitter_tx";
+  void load_jitter_tx(int total_samples);
+
   CavityEffect cavity;
 
   void init(const SceneState &scene_state);
diff --git a/source/blender/draw/engines/workbench/workbench_resources.cc b/source/blender/draw/engines/workbench/workbench_resources.cc
index c1728ffe12d..3ed33bbfb27 100644
--- a/source/blender/draw/engines/workbench/workbench_resources.cc
+++ b/source/blender/draw/engines/workbench/workbench_resources.cc
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later
  * Copyright 2020 Blender Foundation. */
 
+#include "../eevee/eevee_lut.h" /* TODO: find somewhere to share blue noise Table. */
 #include "BKE_studiolight.h"
 #include "IMB_imbuf_types.h"
 
@@ -66,6 +67,31 @@ LightData get_light_data_from_studio_solidlight(const SolidLight *sl,
   return light;
 }
 
+void SceneResources::load_jitter_tx(int total_samples)
+{
+  printf("Load jitter | total samples: %d\n", total_samples);
+  const int texel_count = jitter_tx_size * jitter_tx_size;
+  static float4 jitter[texel_count];
+
+  const float total_samples_inv = 1.0f / total_samples;
+
+  /* Create blue noise jitter texture */
+  for (int i = 0; i < texel_count; i++) {
+    float phi = blue_noise[i][0] * 2.0f * M_PI;
+    /* This rotate the sample per pixels */
+    jitter[i].x = cosf(phi);
+    jitter[i].y = sinf(phi);
+    /* This offset the sample along its direction axis (reduce banding) */
+    float bn = blue_noise[i][1] - 0.5f;
+    bn = clamp_f(bn, -0.499f, 0.499f); /* fix fireflies */
+    jitter[i].z = bn * total_samples_inv;
+    jitter[i].w = blue_noise[i][1];
+  }
+
+  jitter_tx.free();
+  jitter_tx.ensure_2d(GPU_RGBA16F, int2(jitter_tx_size), jitter[0]);
+}
+
 void SceneResources::init(const SceneState &scene_state)
 {
   const View3DShading &shading = scene_state.shading;
@@ -122,7 +148,12 @@ void SceneResources::init(const SceneState &scene_state)
 
   /* TODO(Miguel Pozo) volumes_do */
 
-  cavity.init(scene_state, world_buf);
+  cavit

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list