46 const SceneEEVEE &sce_eevee = inst_.scene->eevee;
47 const Object *camera_object_eval = inst_.camera_eval_object;
48 const ::Camera *camera = (camera_object_eval && camera_object_eval->
type ==
OB_CAMERA) ?
49 reinterpret_cast<const ::
Camera *
>(camera_object_eval->
data) :
54 if (enabled_ ==
false) {
56 data_.scatter_color_threshold = -1.0f;
60 int sce_flag = sce_eevee.
flag;
66 data_.bokeh_blades =
float(camera->dof.aperture_blades);
71 const Camera &camera = inst_.camera;
72 const Object *camera_object_eval = inst_.camera_eval_object;
73 const ::Camera *camera_data = (camera_object_eval && camera_object_eval->
type ==
OB_CAMERA) ?
74 reinterpret_cast<const ::
Camera *
>(camera_object_eval->
data) :
80 "Debug Mode: Depth Of Field Buffers\n"
81 " - Purple: Gap Fill\n"
82 " - Blue: Background\n"
83 " - Red: Slight Out Of Focus\n"
84 " - Yellow: In Focus\n"
85 " - Green: Foreground\n");
88 if (enabled_ ==
false) {
89 jitter_radius_ = 0.0f;
94 float2 anisotropic_scale = {
clamp_f(1.0f / camera_data->dof.aperture_ratio, 1e-5f, 1.0f),
95 clamp_f(camera_data->dof.aperture_ratio, 1e-5f, 1.0f)};
96 data_.bokeh_anisotropic_scale = anisotropic_scale;
97 data_.bokeh_rotation = camera_data->dof.aperture_rotation;
99 data_.bokeh_anisotropic_scale_inv = 1.0f / data_.bokeh_anisotropic_scale;
101 float fstop =
max_ff(camera_data->dof.aperture_fstop, 1e-5f);
103 float aperture = 1.0f / (2.0f * fstop);
105 aperture *= camera_data->lens * 1e-3f;
118 if (camera_data->dof.aperture_ratio < 1.0) {
121 aperture /=
max_ff(camera_data->dof.aperture_ratio, 1e-5f);
124 float jitter_radius, fx_radius;
127 if (do_jitter_ && (inst_.sampling.dof_ring_count_get() > 0) && !camera.
is_panoramic() &&
128 !inst_.is_viewport())
133 float minimal_overblur = 1.0f /
sqrtf(inst_.sampling.dof_sample_count_get());
135 fx_radius = (minimal_overblur + user_overblur_) * aperture;
137 jitter_radius =
max_ff(0.0f, aperture - fx_radius);
140 jitter_radius = 0.0f;
141 fx_radius = aperture;
145 if (fx_max_coc_ <= 0.5f) {
149 jitter_radius_ = jitter_radius;
150 fx_radius_ = fx_radius;
152 if (fx_radius_ == 0.0f) {
157 int2 max_render_res = inst_.film.render_extent_get();
161 data_.gather_uv_fac = 1.0f /
float2(reduce_size);
168 reduced_color_tx_.ensure_2d(
169 gpu::TextureFormat::SFLOAT_16_16_16_16, reduce_size, usage,
nullptr,
DOF_MIP_COUNT);
170 reduced_coc_tx_.ensure_2d(
171 gpu::TextureFormat::SFLOAT_16, reduce_size, usage,
nullptr,
DOF_MIP_COUNT);
172 reduced_color_tx_.ensure_mip_views();
173 reduced_coc_tx_.ensure_mip_views();
177 data_.scatter_max_rect = (reduced_color_tx_.pixel_count() / 4) / 2;
178 scatter_fg_list_buf_.resize(data_.scatter_max_rect);
179 scatter_bg_list_buf_.resize(data_.scatter_max_rect);
181 bokeh_lut_pass_sync();
183 stabilize_pass_sync();
184 downsample_pass_sync();
186 tiles_flatten_pass_sync();
187 tiles_dilate_pass_sync();
191 hole_fill_pass_sync();
197 if (jitter_radius_ == 0.0f) {
202 inst_.sampling.dof_disk_sample_get(&radius, &theta);
204 if (data_.bokeh_blades >= 3.0f) {
208 radius *= jitter_radius_;
209 theta += data_.bokeh_rotation;
213 sample *= data_.bokeh_anisotropic_scale;
220 const bool is_ortho = (winmat[2][3] != -1.0f);
222 sample *= focus_distance_;
236void DepthOfField::bokeh_lut_pass_sync()
241 use_bokeh_lut_ =
false;
244 use_bokeh_lut_ =
true;
247 bokeh_lut_ps_.
init();
249 bokeh_lut_ps_.
bind_ubo(
"dof_buf", data_);
250 bokeh_lut_ps_.
bind_image(
"out_gather_lut_img", &bokeh_gather_lut_tx_);
251 bokeh_lut_ps_.
bind_image(
"out_scatter_lut_img", &bokeh_scatter_lut_tx_);
252 bokeh_lut_ps_.
bind_image(
"out_resolve_lut_img", &bokeh_resolve_lut_tx_);
256void DepthOfField::setup_pass_sync()
262 setup_ps_.
bind_texture(
"color_tx", &input_color_tx_, no_filter);
263 setup_ps_.
bind_texture(
"depth_tx", &render_buffers.depth_tx, no_filter);
264 setup_ps_.
bind_ubo(
"dof_buf", data_);
265 setup_ps_.
bind_image(
"out_color_img", &setup_color_tx_);
266 setup_ps_.
bind_image(
"out_coc_img", &setup_coc_tx_);
267 setup_ps_.
dispatch(&dispatch_setup_size_);
271void DepthOfField::stabilize_pass_sync()
273 RenderBuffers &render_buffers = inst_.render_buffers;
274 VelocityModule &velocity = inst_.velocity;
276 stabilize_ps_.init();
277 stabilize_ps_.shader_set(inst_.shaders.static_shader_get(
DOF_STABILIZE));
278 stabilize_ps_.bind_ubo(
"camera_prev", &(*velocity.camera_steps[
STEP_PREVIOUS]));
279 stabilize_ps_.bind_ubo(
"camera_curr", &(*velocity.camera_steps[
STEP_CURRENT]));
281 stabilize_ps_.bind_ubo(
"camera_next", &(*velocity.camera_steps[
STEP_PREVIOUS]));
282 stabilize_ps_.bind_texture(
"coc_tx", &setup_coc_tx_, no_filter);
283 stabilize_ps_.bind_texture(
"color_tx", &setup_color_tx_, no_filter);
284 stabilize_ps_.bind_texture(
"velocity_tx", &render_buffers.vector_tx, no_filter);
285 stabilize_ps_.bind_texture(
"in_history_tx", &stabilize_input_, with_filter);
286 stabilize_ps_.bind_texture(
"depth_tx", &render_buffers.depth_tx, no_filter);
287 stabilize_ps_.bind_ubo(
"dof_buf", data_);
288 stabilize_ps_.push_constant(
"u_use_history", &stabilize_valid_history_, 1);
289 stabilize_ps_.bind_image(
"out_coc_img", reduced_coc_tx_.mip_view(0));
290 stabilize_ps_.bind_image(
"out_color_img", reduced_color_tx_.mip_view(0));
291 stabilize_ps_.bind_image(
"out_history_img", &stabilize_output_tx_);
292 stabilize_ps_.dispatch(&dispatch_stabilize_size_);
296void DepthOfField::downsample_pass_sync()
298 downsample_ps_.init();
299 downsample_ps_.shader_set(inst_.shaders.static_shader_get(
DOF_DOWNSAMPLE));
300 downsample_ps_.bind_texture(
"color_tx", reduced_color_tx_.mip_view(0), no_filter);
301 downsample_ps_.bind_texture(
"coc_tx", reduced_coc_tx_.mip_view(0), no_filter);
302 downsample_ps_.bind_image(
"out_color_img", &downsample_tx_);
303 downsample_ps_.dispatch(&dispatch_downsample_size_);
307void DepthOfField::reduce_pass_sync()
310 reduce_ps_.shader_set(inst_.shaders.static_shader_get(
DOF_REDUCE));
311 reduce_ps_.bind_ubo(
"dof_buf", data_);
312 reduce_ps_.bind_texture(
"downsample_tx", &downsample_tx_, no_filter);
313 reduce_ps_.bind_ssbo(
"scatter_fg_list_buf", scatter_fg_list_buf_);
314 reduce_ps_.bind_ssbo(
"scatter_bg_list_buf", scatter_bg_list_buf_);
315 reduce_ps_.bind_ssbo(
"scatter_fg_indirect_buf", scatter_fg_indirect_buf_);
316 reduce_ps_.bind_ssbo(
"scatter_bg_indirect_buf", scatter_bg_indirect_buf_);
317 reduce_ps_.bind_image(
"inout_color_lod0_img", reduced_color_tx_.mip_view(0));
318 reduce_ps_.bind_image(
"out_color_lod1_img", reduced_color_tx_.mip_view(1));
319 reduce_ps_.bind_image(
"out_color_lod2_img", reduced_color_tx_.mip_view(2));
320 reduce_ps_.bind_image(
"out_color_lod3_img", reduced_color_tx_.mip_view(3));
321 reduce_ps_.bind_image(
"in_coc_lod0_img", reduced_coc_tx_.mip_view(0));
322 reduce_ps_.bind_image(
"out_coc_lod1_img", reduced_coc_tx_.mip_view(1));
323 reduce_ps_.bind_image(
"out_coc_lod2_img", reduced_coc_tx_.mip_view(2));
324 reduce_ps_.bind_image(
"out_coc_lod3_img", reduced_coc_tx_.mip_view(3));
325 reduce_ps_.dispatch(&dispatch_reduce_size_);
330void DepthOfField::tiles_flatten_pass_sync()
332 tiles_flatten_ps_.init();
333 tiles_flatten_ps_.shader_set(inst_.shaders.static_shader_get(
DOF_TILES_FLATTEN));
337 tiles_flatten_ps_.bind_texture(
"coc_tx", &setup_coc_tx_, no_filter);
338 tiles_flatten_ps_.bind_image(
"out_tiles_fg_img", &tiles_fg_tx_.current());
339 tiles_flatten_ps_.bind_image(
"out_tiles_bg_img", &tiles_bg_tx_.current());
340 tiles_flatten_ps_.dispatch(&dispatch_tiles_flatten_size_);
344void DepthOfField::tiles_dilate_pass_sync()
346 for (
int pass = 0; pass < 2; pass++) {
347 PassSimple &drw_pass = (pass == 0) ? tiles_dilate_minmax_ps_ : tiles_dilate_minabs_ps_;
350 drw_pass.shader_set(inst_.shaders.static_shader_get(sh_type));
351 drw_pass.bind_image(
"in_tiles_fg_img", &tiles_fg_tx_.previous());
352 drw_pass.bind_image(
"in_tiles_bg_img", &tiles_bg_tx_.previous());
353 drw_pass.bind_image(
"out_tiles_fg_img", &tiles_fg_tx_.current());
354 drw_pass.bind_image(
"out_tiles_bg_img", &tiles_bg_tx_.current());
355 drw_pass.push_constant(
"ring_count", &tiles_dilate_ring_count_, 1);
356 drw_pass.push_constant(
"ring_width_multiplier", &tiles_dilate_ring_width_mul_, 1);
357 drw_pass.dispatch(&dispatch_tiles_dilate_size_);
362void DepthOfField::gather_pass_sync()
368 for (
int pass = 0; pass < 2; pass++) {
369 PassSimple &drw_pass = (pass == 0) ? gather_fg_ps_ : gather_bg_ps_;
370 SwapChain<TextureFromPool, 2> &color_chain = (pass == 0) ? color_fg_tx_ : color_bg_tx_;
371 SwapChain<TextureFromPool, 2> &weight_chain = (pass == 0) ? weight_fg_tx_ : weight_bg_tx_;
377 drw_pass.bind_resources(inst_.sampling);
378 drw_pass.shader_set(inst_.shaders.static_shader_get(sh_type));
379 drw_pass.bind_ubo(
"dof_buf", data_);
380 drw_pass.bind_texture(
"color_bilinear_tx", reduced_color_tx_, gather_bilinear);
381 drw_pass.bind_texture(
"color_tx", reduced_color_tx_, gather_nearest);
382 drw_pass.bind_texture(
"coc_tx", reduced_coc_tx_, gather_nearest);
383 drw_pass.bind_image(
"in_tiles_fg_img", &tiles_fg_tx_.current());
384 drw_pass.bind_image(
"in_tiles_bg_img", &tiles_bg_tx_.current());
385 drw_pass.bind_image(
"out_color_img", &color_chain.current());
386 drw_pass.bind_image(
"out_weight_img", &weight_chain.current());
387 drw_pass.bind_image(
"out_occlusion_img", &occlusion_tx_);
388 drw_pass.bind_texture(
"bokeh_lut_tx", &bokeh_gather_lut_tx_);
389 drw_pass.dispatch(&dispatch_gather_size_);
394void DepthOfField::filter_pass_sync()
396 for (
int pass = 0; pass < 2; pass++) {
397 PassSimple &drw_pass = (pass == 0) ? filter_fg_ps_ : filter_bg_ps_;
398 SwapChain<TextureFromPool, 2> &color_chain = (pass == 0) ? color_fg_tx_ : color_bg_tx_;
399 SwapChain<TextureFromPool, 2> &weight_chain = (pass == 0) ? weight_fg_tx_ : weight_bg_tx_;
401 drw_pass.shader_set(inst_.shaders.static_shader_get(
DOF_FILTER));
402 drw_pass.bind_texture(
"color_tx", &color_chain.previous());
403 drw_pass.bind_texture(
"weight_tx", &weight_chain.previous());
404 drw_pass.bind_image(
"out_color_img", &color_chain.current());
405 drw_pass.bind_image(
"out_weight_img", &weight_chain.current());
406 drw_pass.dispatch(&dispatch_filter_size_);
411void DepthOfField::scatter_pass_sync()
413 for (
int pass = 0; pass < 2; pass++) {
414 PassSimple &drw_pass = (pass == 0) ? scatter_fg_ps_ : scatter_bg_ps_;
417 drw_pass.shader_set(inst_.shaders.static_shader_get(
DOF_SCATTER));
418 drw_pass.bind_ubo(
"dof_buf", data_);
419 drw_pass.push_constant(
"use_bokeh_lut", use_bokeh_lut_);
420 drw_pass.bind_texture(
"bokeh_lut_tx", &bokeh_scatter_lut_tx_);
421 drw_pass.bind_texture(
"occlusion_tx", &occlusion_tx_);
423 drw_pass.bind_ssbo(
"scatter_list_buf", scatter_fg_list_buf_);
429 drw_pass.bind_ssbo(
"scatter_list_buf", scatter_bg_list_buf_);
435void DepthOfField::hole_fill_pass_sync()
441 hole_fill_ps_.init();
442 hole_fill_ps_.bind_resources(inst_.sampling);
444 hole_fill_ps_.bind_ubo(
"dof_buf", data_);
445 hole_fill_ps_.bind_texture(
"color_bilinear_tx", reduced_color_tx_, gather_bilinear);
446 hole_fill_ps_.bind_texture(
"color_tx", reduced_color_tx_, gather_nearest);
447 hole_fill_ps_.bind_texture(
"coc_tx", reduced_coc_tx_, gather_nearest);
448 hole_fill_ps_.bind_image(
"in_tiles_fg_img", &tiles_fg_tx_.current());
449 hole_fill_ps_.bind_image(
"in_tiles_bg_img", &tiles_bg_tx_.current());
450 hole_fill_ps_.bind_image(
"out_color_img", &hole_fill_color_tx_);
451 hole_fill_ps_.bind_image(
"out_weight_img", &hole_fill_weight_tx_);
452 hole_fill_ps_.dispatch(&dispatch_gather_size_);
456void DepthOfField::resolve_pass_sync()
459 RenderBuffers &render_buffers = inst_.render_buffers;
460 gpu::Shader *sh = inst_.shaders.static_shader_get(use_bokeh_lut_ ?
DOF_RESOLVE_LUT :
464 resolve_ps_.specialize_constant(sh,
"do_debug_color", inst_.debug_mode ==
DEBUG_DOF_PLANES);
465 resolve_ps_.shader_set(sh);
466 resolve_ps_.bind_ubo(
"dof_buf", data_);
467 resolve_ps_.bind_texture(
"depth_tx", &render_buffers.depth_tx, no_filter);
468 resolve_ps_.bind_texture(
"color_tx", &input_color_tx_, no_filter);
469 resolve_ps_.bind_texture(
"stable_color_tx", &resolve_stable_color_tx_, no_filter);
470 resolve_ps_.bind_texture(
"color_bg_tx", &color_bg_tx_.current(), with_filter);
471 resolve_ps_.bind_texture(
"color_fg_tx", &color_fg_tx_.current(), with_filter);
472 resolve_ps_.bind_image(
"in_tiles_fg_img", &tiles_fg_tx_.current());
473 resolve_ps_.bind_image(
"in_tiles_bg_img", &tiles_bg_tx_.current());
474 resolve_ps_.bind_texture(
"weight_bg_tx", &weight_bg_tx_.current());
475 resolve_ps_.bind_texture(
"weight_fg_tx", &weight_fg_tx_.current());
476 resolve_ps_.bind_texture(
"color_hole_fill_tx", &hole_fill_color_tx_);
477 resolve_ps_.bind_texture(
"weight_hole_fill_tx", &hole_fill_weight_tx_);
478 resolve_ps_.bind_texture(
"bokeh_lut_tx", &bokeh_resolve_lut_tx_);
479 resolve_ps_.bind_image(
"out_color_img", &output_color_tx_);
480 resolve_ps_.bind_resources(inst_.sampling);
482 resolve_ps_.dispatch(&dispatch_resolve_size_);
492void DepthOfField::update_sample_table()
494 float2 subpixel_offset = inst_.film.pixel_jitter_get();
496 subpixel_offset *= 0.5;
499 const std::array<int2, 4> plus_offsets = {
int2(-1, 0),
int2(0, -1),
int2(1, 0),
int2(0, 1)};
501 const float radius = 1.5f;
503 for (
int2 offset : plus_offsets) {
515 if (fx_radius_ == 0.0f) {
519 input_color_tx_ = *input_tx;
520 output_color_tx_ = *output_tx;
524 const CameraData &cam_data = inst_.camera.data_get();
525 data_.camera_type = cam_data.
type;
527 float3 jitter =
float3(fx_radius_, 0.0f, -focus_distance_);
532 if (inst_.camera.is_orthographic()) {
533 data_.coc_mul = (center[0] - jitter[0]) * 0.5f * extent_[0];
534 data_.coc_bias = focus_distance_ * data_.coc_mul;
537 data_.coc_bias = -(center[0] - jitter[0]) * 0.5f * extent_[0];
538 data_.coc_mul = focus_distance_ * data_.coc_bias;
546 max_bg_coc = data_.coc_bias;
551 data_.scatter_coc_threshold = 4.0f;
553 update_sample_table();
568 dispatch_tiles_dilate_size_ =
int3(
594 gpu::TextureFormat::SFLOAT_16);
596 if (use_bokeh_lut_) {
601 setup_color_tx_.acquire(half_res, gpu::TextureFormat::SFLOAT_16_16_16_16, usage_readwrite);
602 setup_coc_tx_.acquire(half_res, gpu::TextureFormat::SFLOAT_16);
607 stabilize_output_tx_.acquire(half_res, gpu::TextureFormat::SFLOAT_16_16_16_16);
609 gpu::TextureFormat::SFLOAT_16_16_16_16, half_res);
611 if (stabilize_valid_history_ ==
false) {
625 stabilize_output_tx_.release();
626 setup_color_tx_.release();
632 tiles_fg_tx_.previous().acquire(
633 tile_res, gpu::TextureFormat::UFLOAT_11_11_10, usage_readwrite);
634 tiles_bg_tx_.previous().acquire(
635 tile_res, gpu::TextureFormat::UFLOAT_11_11_10, usage_readwrite);
636 tiles_fg_tx_.current().acquire(
637 tile_res, gpu::TextureFormat::UFLOAT_11_11_10, usage_readwrite);
638 tiles_bg_tx_.current().acquire(
639 tile_res, gpu::TextureFormat::UFLOAT_11_11_10, usage_readwrite);
644 setup_coc_tx_.release();
651 for (
int pass = 0; pass < 2; pass++) {
653 int dilation_radius = 0;
654 while (dilation_radius < dilation_end_radius) {
655 int remainder = dilation_end_radius - dilation_radius;
657 int max_multiplier = dilation_radius + 1;
660 int multiplier =
min_ii(max_multiplier,
floorf(remainder /
float(ring_count)));
662 dilation_radius += ring_count * multiplier;
664 tiles_dilate_ring_count_ = ring_count;
665 tiles_dilate_ring_width_mul_ = multiplier;
670 drw.
submit((pass == 0) ? tiles_dilate_minmax_ps_ : tiles_dilate_minabs_ps_,
view);
674 tiles_fg_tx_.previous().release();
675 tiles_bg_tx_.previous().release();
680 downsample_tx_.acquire(quarter_res, gpu::TextureFormat::SFLOAT_16_16_16_16, usage_readwrite);
684 scatter_fg_indirect_buf_.clear_to_zero();
685 scatter_bg_indirect_buf_.clear_to_zero();
690 downsample_tx_.release();
695 for (
int is_background = 0; is_background < 2; is_background++) {
700 Framebuffer &scatter_fb = is_background ? scatter_bg_fb_ : scatter_fg_fb_;
701 PassSimple &gather_ps = is_background ? gather_bg_ps_ : gather_fg_ps_;
702 PassSimple &filter_ps = is_background ? filter_bg_ps_ : filter_fg_ps_;
703 PassSimple &scatter_ps = is_background ? scatter_bg_ps_ : scatter_fg_ps_;
706 half_res, gpu::TextureFormat::SFLOAT_16_16_16_16, usage_readwrite_attach);
707 weight_tx.
current().acquire(half_res, gpu::TextureFormat::SFLOAT_16, usage_readwrite);
708 occlusion_tx_.acquire(half_res, gpu::TextureFormat::SFLOAT_16_16);
718 half_res, gpu::TextureFormat::SFLOAT_16_16_16_16, usage_readwrite_attach);
719 weight_tx.
current().acquire(half_res, gpu::TextureFormat::SFLOAT_16, usage_readwrite);
743 occlusion_tx_.release();
750 bokeh_gather_lut_tx_.release();
751 bokeh_scatter_lut_tx_.release();
753 hole_fill_color_tx_.acquire(half_res, gpu::TextureFormat::SFLOAT_16_16_16_16, usage_readwrite);
754 hole_fill_weight_tx_.acquire(half_res, gpu::TextureFormat::SFLOAT_16, usage_readwrite);
769 color_bg_tx_.current().release();
770 color_fg_tx_.current().release();
771 weight_bg_tx_.current().release();
772 weight_fg_tx_.current().release();
773 tiles_fg_tx_.current().release();
774 tiles_bg_tx_.current().release();
775 hole_fill_color_tx_.release();
776 hole_fill_weight_tx_.release();
777 bokeh_resolve_lut_tx_.release();
785 std::swap(*input_tx, *output_tx);
Camera data-block and utility functions.
float BKE_camera_object_dof_distance(const struct Object *ob)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE float clamp_f(float value, float min, float max)
MINLINE float min_ff(float a, float b)
void mul_project_m4_v3(const float mat[4][4], float vec[3])
MINLINE void sub_v2_v2(float r[2], const float a[2])
MINLINE void add_v2_v2(float r[2], const float a[2])
void GPU_debug_group_end()
void GPU_debug_group_begin(const char *name)
#define GPU_ATTACHMENT_TEXTURE(_texture)
#define GPU_ATTACHMENT_NONE
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
@ GPU_BARRIER_SHADER_STORAGE
@ GPU_BARRIER_TEXTURE_FETCH
@ GPU_BARRIER_SHADER_IMAGE_ACCESS
@ GPU_BARRIER_FRAMEBUFFER
void GPU_memory_barrier(GPUBarrier barrier)
int GPU_texture_height(const blender::gpu::Texture *texture)
int GPU_texture_width(const blender::gpu::Texture *texture)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_WRITE
@ GPU_TEXTURE_USAGE_ATTACHMENT
@ GPU_SAMPLER_FILTERING_MIPMAP
@ GPU_SAMPLER_FILTERING_LINEAR
void ensure(GPUAttachment depth=GPU_ATTACHMENT_NONE, GPUAttachment color1=GPU_ATTACHMENT_NONE, GPUAttachment color2=GPU_ATTACHMENT_NONE, GPUAttachment color3=GPU_ATTACHMENT_NONE, GPUAttachment color4=GPU_ATTACHMENT_NONE, GPUAttachment color5=GPU_ATTACHMENT_NONE, GPUAttachment color6=GPU_ATTACHMENT_NONE, GPUAttachment color7=GPU_ATTACHMENT_NONE, GPUAttachment color8=GPU_ATTACHMENT_NONE)
void submit(PassSimple &pass, View &view)
static void swap(TextureFromPool &a, Texture &b)
void clear(float4 values)
bool ensure_2d(blender::gpu::TextureFormat format, int2 extent, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL, const float *data=nullptr, int mip_len=1)
void shader_set(gpu::Shader *shader)
void bind_texture(const char *name, gpu::Texture *texture, GPUSamplerState state=sampler_auto)
void bind_image(const char *name, gpu::Texture *image)
void dispatch(int group_len)
void barrier(GPUBarrier type)
void bind_ubo(const char *name, gpu::UniformBuf *buffer)
bool is_panoramic() const
bool is_orthographic() const
bool is_perspective() const
void jitter_apply(float4x4 &winmat, float4x4 &viewmat)
void render(View &view, gpu::Texture **input_tx, gpu::Texture **output_tx, DepthOfFieldBuffer &dof_buffer)
RenderBuffers render_buffers
gpu::Shader * static_shader_get(eShaderType shader_type)
@ DRW_STATE_BLEND_ADD_FULL
#define DOF_DEFAULT_GROUP_SIZE
#define DOF_REDUCE_GROUP_SIZE
#define DOF_TILES_DILATE_GROUP_SIZE
#define DOF_FILTER_GROUP_SIZE
#define DOF_STABILIZE_GROUP_SIZE
#define DOF_BOKEH_LUT_SIZE
#define DOF_GATHER_GROUP_SIZE
#define DOF_RESOLVE_GROUP_SIZE
#define DOF_MAX_SLIGHT_FOCUS_RADIUS
#define DOF_DILATE_RING_COUNT
#define DOF_GATHER_RING_COUNT
detail::Pass< command::DrawCommandBuf > PassSimple
@ DOF_GATHER_BACKGROUND_LUT
@ DOF_TILES_DILATE_MINABS
@ DOF_TILES_DILATE_MINMAX
@ DOF_GATHER_FOREGROUND_LUT
static float film_filter_weight(float filter_radius, float sample_distance_sqr)
static float circle_to_polygon_angle(float sides_count, float theta)
static float coc_radius_from_camera_depth(DepthOfFieldData dof, float depth)
static float circle_to_polygon_radius(float sides_count, float theta)
T length_squared(const VecBase< T, Size > &a)
VecBase< T, Size > divide_ceil(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
VecBase< T, Size > ceil_to_multiple(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< int32_t, 3 > int3
VecBase< float, 3 > float3
const c_style_mat & ptr() const
Texture stabilize_history_tx_
float2 bokeh_anisotropic_scale