59void DofPass::setup_samples()
62 for (
int i = 0;
i <= kernel_radius_;
i++) {
63 for (
int j = -kernel_radius_; j <= kernel_radius_; j++) {
64 for (
int k = -kernel_radius_; k <= kernel_radius_; k++) {
93 samples_buf_.push_update();
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_RGBA16F, half_res, usage,
nullptr, 3);
113 source_tx_.ensure_mip_views();
114 source_tx_.filter_mode(
true);
115 coc_halfres_tx_.ensure_2d(
GPU_RG8, 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_, sampler_state);
181 down2_ps_.bind_texture(
"input_coc_tx", &coc_halfres_tx_, sampler_state);
187 blur_ps_.bind_ubo(
"samples", samples_buf_);
188 blur_ps_.bind_texture(
"noise_tx", resources.
jitter_tx);
189 blur_ps_.bind_texture(
"input_coc_tx", &coc_halfres_tx_, sampler_state);
190 blur_ps_.bind_texture(
"half_res_color_tx", &source_tx_, sampler_state);
191 blur_ps_.push_constant(
"inverted_viewport_size", viewport_size_inv);
192 blur_ps_.push_constant(
"noise_offset", offset_);
198 blur2_ps_.bind_texture(
"input_coc_tx", &coc_halfres_tx_, sampler_state);
199 blur2_ps_.bind_texture(
"blur_tx", &blur_tx_);
200 blur2_ps_.push_constant(
"inverted_viewport_size", viewport_size_inv);
206 resolve_ps_.bind_texture(
"half_res_color_tx", &source_tx_, sampler_state);
207 resolve_ps_.bind_texture(
"scene_depth_tx", &resources.
depth_tx);
208 resolve_ps_.push_constant(
"inverted_viewport_size", viewport_size_inv);
209 resolve_ps_.push_constant(
"dof_params",
float3(aperture_size_, distance_, invsensor_size_));
210 resolve_ps_.push_constant(
"near_far",
float2(near_, far_));
229 downsample_fb_.bind();
232 struct CallbackData {
237 CallbackData callback_data = {manager,
view, down2_ps_};
239 auto downsample_level = [](
void *callback_data,
int ) {
240 CallbackData *cd =
static_cast<CallbackData *
>(callback_data);
241 cd->manager.submit(cd->pass, cd->view);
245 downsample_fb_, 2, downsample_level,
static_cast<void *
>(&callback_data));
Camera data-block and utility functions.
float BKE_camera_sensor_size(int sensor_fit, float sensor_x, float sensor_y)
float BKE_camera_object_dof_distance(const struct Object *ob)
MINLINE int max_ii(int a, int b)
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_recursive_downsample(GPUFrameBuffer *fb, int max_level, void(*per_level_callback)(void *user_data, int level), void *user_data)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
@ GPU_SAMPLER_FILTERING_MIPMAP
@ GPU_SAMPLER_FILTERING_LINEAR
void submit(PassSimple &pass, View &view)
void sync(SceneResources &resources, const DRWContext *draw_ctx)
void draw(Manager &manager, View &view, SceneResources &resources, int2 resolution)
void init(const SceneState &scene_state, const DRWContext *draw_ctx)
static ShaderCache & get()
detail::Pass< command::DrawCommandBuf > PassSimple
T cos(const AngleRadianBase< T > &a)
T sin(const AngleRadianBase< T > &a)
static void square_to_circle(float x, float y, float &r, float &T)
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
VecBase< float, 3 > float3
blender::float2 viewport_size_get() const