28 const int max_iter_count = sample_count / ssao_samples;
30 sample_ = scene_state.
sample % max_iter_count;
34 world_buf.cavity_sample_start = ssao_samples * sample_;
35 world_buf.cavity_sample_end = ssao_samples * (sample_ + 1);
37 world_buf.cavity_sample_count_inv = 1.0f / (world_buf.cavity_sample_end -
38 world_buf.cavity_sample_start);
39 world_buf.cavity_jitter_scale = 1.0f / 64.0f;
46 world_buf.curvature_ridge = 0.5f /
51 if (cavity_enabled_ && sample_count_ != sample_count) {
52 sample_count_ = sample_count;
53 load_samples_buf(ssao_samples);
58void CavityEffect::load_samples_buf(
int ssao_samples)
60 const float iteration_samples_inv = 1.0f / ssao_samples;
64 float it_add = (i / ssao_samples) * 0.499f;
65 float r =
fmodf((i + 0.5f + it_add) * iteration_samples_inv, 1.0f);
69 float phi =
float(dphi) * 2.0f *
M_PI + it_add;
77 samples_buf.push_update();
82 if (cavity_enabled_) {
83 pass.
bind_ubo(
"cavity_samples", samples_buf);
86 {GPU_SAMPLER_FILTERING_DEFAULT,
87 GPU_SAMPLER_EXTEND_MODE_REPEAT,
88 GPU_SAMPLER_EXTEND_MODE_REPEAT});
90 if (curvature_enabled_) {
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE float square_f(float a)
void BLI_hammersley_1d(unsigned int n, double *r)
void bind_texture(const char *name, GPUTexture *texture, GPUSamplerState state=sampler_auto)
void bind_ubo(const char *name, GPUUniformBuf *buffer)
void setup_resolve_pass(PassSimple &pass, SceneResources &resources)
void init(const SceneState &scene_state, SceneResources &resources)
draw_view in_light_buf[] float
detail::Pass< command::DrawCommandBuf > PassSimple
T cos(const AngleRadianBase< T > &a)
T sin(const AngleRadianBase< T > &a)
float matcap_ssao_distance
float matcap_ssao_attenuation
struct SceneDisplay display
float curvature_ridge_factor
float cavity_ridge_factor
float cavity_valley_factor
float curvature_valley_factor
UniformBuffer< WorldData > world_buf
void load_jitter_tx(int total_samples)
TextureFromPool object_id_tx