58void DofPass::setup_samples()
61 for (
int i = 0; i <= kernel_radius_; i++) {
62 for (
int j = -kernel_radius_; j <= kernel_radius_; j++) {
63 for (
int k = -kernel_radius_; k <= kernel_radius_; k++) {
64 if (
abs(j) > i ||
abs(k) > i) {
67 if (
abs(j) < i &&
abs(k) < i) {
79 float denom = T - (2.0 *
M_PI / blades_) *
floorf((blades_ * T +
M_PI) / (2.0 *
M_PI));
92 samples_buf_.push_update();
101 coc_halfres_tx_.
free();
108 half_res = {
max_ii(half_res.x, 1),
max_ii(half_res.y, 1)};
121 float fstop = camera->dof.aperture_fstop;
124 float focal_len = camera->lens;
127 const float scale_camera = 0.001f;
129 float aperture = 0.5f * scale_camera * focal_len / fstop;
130 float focal_len_scaled = scale_camera * focal_len;
131 float sensor_scaled = scale_camera * sensor;
134 sensor_scaled *= rv3d->viewcamtexcofac[0];
137 aperture_size_ = aperture *
fabsf(focal_len_scaled / (focus_dist - focal_len_scaled));
138 distance_ = -focus_dist;
139 invsensor_size_ = scene_state.
resolution.x / sensor_scaled;
141 near_ = -camera->clip_start;
142 far_ = -camera->clip_end;
144 float blades = camera->dof.aperture_blades;
145 float rotation = camera->dof.aperture_rotation;
146 float ratio = 1.0f / camera->dof.aperture_ratio;
148 if (blades_ != blades || rotation_ != rotation || ratio_ != ratio) {
150 rotation_ = rotation;
177 down2_ps_.
bind_texture(
"sceneColorTex", &source_tx_, sampler_state);
178 down2_ps_.
bind_texture(
"inputCocTex", &coc_halfres_tx_, sampler_state);
184 blur_ps_.
bind_ubo(
"samples", samples_buf_);
186 blur_ps_.
bind_texture(
"inputCocTex", &coc_halfres_tx_, sampler_state);
187 blur_ps_.
bind_texture(
"halfResColorTex", &source_tx_, sampler_state);
195 blur2_ps_.
bind_texture(
"inputCocTex", &coc_halfres_tx_, sampler_state);
203 resolve_ps_.
bind_texture(
"halfResColorTex", &source_tx_, sampler_state);
206 resolve_ps_.
push_constant(
"dofParams",
float3(aperture_size_, distance_, invsensor_size_));
226 downsample_fb_.
bind();
227 manager.
submit(down_ps_, view);
229 struct CallbackData {
234 CallbackData callback_data = {manager,
view, down2_ps_};
236 auto downsample_level = [](
void *callback_data,
int ) {
237 CallbackData *cd =
static_cast<CallbackData *
>(callback_data);
238 cd->manager.submit(cd->pass, cd->view);
242 downsample_fb_, 2, downsample_level,
static_cast<void *
>(&callback_data));
246 manager.
submit(blur_ps_, view);
250 manager.
submit(blur2_ps_, view);
254 manager.
submit(resolve_ps_, view);
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)
#define GPU_ATTACHMENT_TEXTURE(_texture)
#define GPU_ATTACHMENT_NONE
void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *framebuffer, 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 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)
void acquire(int2 extent, eGPUTextureFormat format, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL)
bool ensure_mip_views(bool cube_as_array=false)
void filter_mode(bool do_filter)
bool ensure_2d(eGPUTextureFormat format, int2 extent, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL, const float *data=nullptr, int mip_len=1)
void bind_texture(const char *name, GPUTexture *texture, GPUSamplerState state=sampler_auto)
void draw_procedural(GPUPrimType primitive, uint instance_len, uint vertex_len, uint vertex_first=-1, ResourceHandle handle={0}, uint custom_id=0)
void state_set(DRWState state, int clip_plane_count=0)
void bind_ubo(const char *name, GPUUniformBuf *buffer)
void push_constant(const char *name, const float &data)
void shader_set(GPUShader *shader)
void sync(SceneResources &resources)
void draw(Manager &manager, View &view, SceneResources &resources, int2 resolution)
void init(const SceneState &scene_state)
static ShaderCache & get()
const float * DRW_viewport_invert_size_get()
const DRWContextState * DRW_context_state_get()
void DRW_stats_group_start(const char *name)
void DRW_stats_group_end()
draw_view in_light_buf[] float
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, 2 > float2
VecBase< float, 3 > float3