[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