102 coc_halfres_tx_.free();
109 half_res = {
max_ii(half_res.x, 1),
max_ii(half_res.y, 1)};
112 source_tx_.ensure_2d(gpu::TextureFormat::SFLOAT_16_16_16_16, half_res, usage,
nullptr, 3);
113 source_tx_.ensure_mip_views();
114 source_tx_.filter_mode(
true);
115 coc_halfres_tx_.ensure_2d(gpu::TextureFormat::UNORM_8_8, half_res, usage,
nullptr, 3);
116 coc_halfres_tx_.ensure_mip_views();
117 coc_halfres_tx_.filter_mode(
true);
122 float fstop = camera->dof.aperture_fstop;
125 float focal_len = camera->lens;
128 const float scale_camera = 0.001f;
130 float aperture = 0.5f * scale_camera * focal_len / fstop;
131 float focal_len_scaled = scale_camera * focal_len;
132 float sensor_scaled = scale_camera * sensor;
135 sensor_scaled *= rv3d->viewcamtexcofac[0];
138 aperture_size_ = aperture *
fabsf(focal_len_scaled / (focus_dist - focal_len_scaled));
139 distance_ = -focus_dist;
140 invsensor_size_ = scene_state.
resolution.x / sensor_scaled;
142 near_ = -camera->clip_start;
143 far_ = -camera->clip_end;
145 float blades = camera->dof.aperture_blades;
146 float rotation = camera->dof.aperture_rotation;
147 float ratio = 1.0f / camera->dof.aperture_ratio;
149 if (blades_ != blades || rotation_ != rotation || ratio_ != ratio) {
151 rotation_ = rotation;
170 down_ps_.bind_texture(
"scene_color_tx", &resources.
color_tx);
171 down_ps_.bind_texture(
"scene_depth_tx", &resources.
depth_tx);
172 down_ps_.push_constant(
"inverted_viewport_size", viewport_size_inv);
173 down_ps_.push_constant(
"dof_params",
float3(aperture_size_, distance_, invsensor_size_));
174 down_ps_.push_constant(
"near_far",
float2(near_, far_));
180 down2_ps_.bind_texture(
"scene_color_tx", source_tx_.mip_view(0), sampler_state);
181 down2_ps_.bind_texture(
"input_coc_tx", coc_halfres_tx_.mip_view(0), sampler_state);
187 down3_ps_.bind_texture(
"scene_color_tx", source_tx_.mip_view(1), sampler_state);
188 down3_ps_.bind_texture(
"input_coc_tx", coc_halfres_tx_.mip_view(1), sampler_state);
194 blur_ps_.bind_ubo(
"samples", samples_buf_);
195 blur_ps_.bind_texture(
"noise_tx", resources.
jitter_tx);
196 blur_ps_.bind_texture(
"input_coc_tx", &coc_halfres_tx_, sampler_state);
197 blur_ps_.bind_texture(
"half_res_color_tx", &source_tx_, sampler_state);
198 blur_ps_.push_constant(
"inverted_viewport_size", viewport_size_inv);
199 blur_ps_.push_constant(
"noise_offset", offset_);
205 blur2_ps_.bind_texture(
"input_coc_tx", &coc_halfres_tx_, sampler_state);
206 blur2_ps_.bind_texture(
"blur_tx", &blur_tx_);
207 blur2_ps_.push_constant(
"inverted_viewport_size", viewport_size_inv);
213 resolve_ps_.bind_texture(
"half_res_color_tx", &source_tx_, sampler_state);
214 resolve_ps_.bind_texture(
"scene_depth_tx", &resources.
depth_tx);
215 resolve_ps_.push_constant(
"inverted_viewport_size", viewport_size_inv);
216 resolve_ps_.push_constant(
"dof_params",
float3(aperture_size_, distance_, invsensor_size_));
217 resolve_ps_.push_constant(
"near_far",
float2(near_, far_));
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
@ GPU_SAMPLER_FILTERING_MIPMAP
@ GPU_SAMPLER_FILTERING_LINEAR
blender::float2 viewport_size_get() const