36 int2 render_extent = inst_.film.render_extent_get();
39 int64_t render_pixel_count = render_extent.x *
int64_t(render_extent.y);
41 extent_[0] = extent_[1] =
ceilf(
sqrtf(1 + (render_pixel_count / 6)));
46 extent_ = render_extent;
56 const CameraData &cam = inst_.camera.data_get();
66 viewmat = face_matrix_ * cam.
viewmat;
73 main_view_.sync(viewmat, winmat);
92 inst_.planar_probes.set_view(render_view_, extent_);
101 inst_.pipelines.deferred.header_layer_count(),
102 inst_.pipelines.deferred.closure_layer_count(),
103 inst_.pipelines.deferred.normal_layer_count());
119 float4 clear_color = {0.0f, 0.0f, 0.0f, 1.0f};
122 inst_.pipelines.background.clear(render_view_);
125 inst_.lights.set_view(render_view_, extent_);
127 inst_.hiz_buffer.set_source(&inst_.render_buffers.depth_tx);
129 inst_.volume.draw_prepass(main_view_);
132 inst_.pipelines.deferred.render(main_view_,
141 inst_.pipelines.background.render(render_view_, combined_fb_);
143 inst_.gbuffer.release();
145 inst_.volume.draw_compute(main_view_, extent_);
147 inst_.ambient_occlusion.render_pass(render_view_);
149 inst_.pipelines.forward.render(render_view_, prepass_fb_, combined_fb_, extent_);
151 render_transparent_pass(rbufs);
153 inst_.lights.debug_draw(render_view_, combined_fb_);
154 inst_.hiz_buffer.debug_draw(render_view_, combined_fb_);
155 inst_.shadows.debug_draw(render_view_, combined_fb_);
156 inst_.volume_probes.viewport_draw(render_view_, combined_fb_);
157 inst_.sphere_probes.viewport_draw(render_view_, combined_fb_);
158 inst_.planar_probes.viewport_draw(render_view_, combined_fb_);
161 inst_.film.accumulate(jitter_view_, combined_final_tx);
164 postfx_tx_.release();
169void ShadingView::render_transparent_pass(
RenderBuffers &rbufs)
176 float4 clear_color = {0.0f, 0.0f, 0.0f, 1.0f};
183gpu::Texture *ShadingView::render_postfx(gpu::Texture *input_tx)
185 if (!inst_.depth_of_field.postfx_enabled() && !inst_.motion_blur.postfx_enabled()) {
188 postfx_tx_.acquire(extent_, gpu::TextureFormat::SFLOAT_16_16_16_16);
192 if (inst_.volume.enabled() && inst_.motion_blur.postfx_enabled() &&
193 !inst_.depth_of_field.postfx_enabled() &&
196 postfx_tx_.clear(
float4(0.0f));
199 gpu::Texture *output_tx = postfx_tx_;
202 inst_.motion_blur.render(render_view_, &input_tx, &output_tx);
203 inst_.depth_of_field.render(render_view_, &input_tx, &output_tx, dof_buffer_);
208void ShadingView::update_view()
210 const Film &film = inst_.film;
212 float4x4 viewmat = main_view_.viewmat();
213 float4x4 winmat = main_view_.winmat();
215 if (film.scaling_factor_get() > 1) {
219 float left, right, bottom,
top, near, far;
223 const float2 render_size_with_overscan = top_right_with_overscan - bottom_left_with_overscan;
225 float2 bottom_left = bottom_left_with_overscan;
226 float2 top_right = top_right_with_overscan;
227 float2 render_size = render_size_with_overscan;
229 float overscan = inst_.camera.overscan();
230 if (overscan > 0.0f) {
233 const float max_size_original = max_size_with_overscan / (1.0f + 2.0f * overscan);
234 const float overscan_size = (max_size_with_overscan - max_size_original) / 2.0f;
236 bottom_left = bottom_left_with_overscan + overscan_size;
237 top_right = top_right_with_overscan - overscan_size;
239 render_size = top_right - bottom_left;
243 const float2 pixel_size = render_size /
float2(film.film_extent_get());
246 const int2 render_extent = film.render_extent_get() * film.scaling_factor_get();
247 const int overscan_pixels = film.render_overscan_get() * film.scaling_factor_get();
249 const float2 render_bottom_left = bottom_left - pixel_size *
float(overscan_pixels);
250 const float2 render_top_right = render_bottom_left + pixel_size *
float2(render_extent);
252 if (main_view_.is_persp()) {
255 render_bottom_left.
y,
263 render_bottom_left.
y,
271 float2 jitter = inst_.film.pixel_jitter_get() /
float2(extent_);
276 jitter_view_.sync(viewmat, winmat);
280 inst_.depth_of_field.jitter_apply(winmat, viewmat);
281 render_view_.sync(viewmat, winmat);
292 const auto update_info = inst_.sphere_probes.world_update_info_pop();
293 if (!update_info.has_value()) {
300 if (update_info->do_render) {
304 update_info->clipping_distances.x,
305 -update_info->clipping_distances.x,
306 update_info->clipping_distances.x,
307 update_info->clipping_distances.x,
308 update_info->clipping_distances.y);
309 view.sync(view_m4, win_m4);
314 inst_.pipelines.world.render(
view);
317 inst_.sphere_probes.remap_to_octahedral_projection(update_info->atlas_coord,
true);
327 while (
const auto update_info = inst_.sphere_probes.probe_update_info_pop()) {
330 if (!inst_.pipelines.data.is_sphere_probe) {
331 inst_.pipelines.data.is_sphere_probe =
true;
332 inst_.uniform_data.push_update();
335 int2 extent =
int2(update_info->cube_target_extent);
336 inst_.render_buffers.acquire(extent);
338 inst_.render_buffers.vector_tx.clear(
float4(0.0f));
342 inst_.gbuffer.acquire(extent,
343 inst_.pipelines.probe.header_layer_count(),
344 inst_.pipelines.probe.closure_layer_count(),
345 inst_.pipelines.probe.normal_layer_count());
351 update_info->clipping_distances.x,
352 -update_info->clipping_distances.x,
353 update_info->clipping_distances.x,
354 update_info->clipping_distances.x,
355 update_info->clipping_distances.y);
356 view.sync(view_m4, win_m4);
370 combined_fb_,
float4(0.0f, 0.0f, 0.0f, 1.0f), inst_.film.depth.clear_value);
371 inst_.pipelines.probe.render(
view, prepass_fb, combined_fb_, gbuffer_fb_, extent);
374 inst_.render_buffers.release();
375 inst_.gbuffer.release();
377 inst_.sphere_probes.remap_to_octahedral_projection(update_info->atlas_coord,
false);
380 if (inst_.pipelines.data.is_sphere_probe) {
381 inst_.pipelines.data.is_sphere_probe =
false;
382 inst_.uniform_data.push_update();
394 if (!inst_.lookdev.enabled_) {
399 const float radius = inst_.lookdev.sphere_radius_;
400 const float clip = inst_.camera.data_get().clip_near;
402 -radius, radius, -radius, radius, clip);
403 const float4x4 &view_m4 = inst_.camera.data_get().viewmat;
404 view_.sync(view_m4, win_m4);
406 inst_.lookdev.draw(view_);
407 inst_.lookdev.display();
void window_translate_m4(float winmat[4][4], float perspmat[4][4], float x, float y)
void projmat_dimensions(const float winmat[4][4], float *r_left, float *r_right, float *r_bottom, float *r_top, float *r_near, float *r_far)
void GPU_debug_group_end()
void GPU_debug_group_begin(const char *name)
#define GPU_ATTACHMENT_TEXTURE(_texture)
#define GPU_ATTACHMENT_TEXTURE_CUBEFACE(_texture, _face)
#define GPU_ATTACHMENT_NONE
void GPU_framebuffer_clear_color(blender::gpu::FrameBuffer *fb, const float clear_col[4])
#define GPU_ATTACHMENT_TEXTURE_LAYER(_texture, _layer)
void GPU_framebuffer_clear_color_depth(blender::gpu::FrameBuffer *fb, const float clear_col[4], float clear_depth)
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
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)
gpu::Texture * layer_view(int layer)
void render(View &view, Framebuffer &prepass_fb, Framebuffer &combined_fb, int2 extent)
TextureFromPool combined_tx
void acquire(int2 extent)
RenderBuffersInfoData & data
TextureFromPool vector_tx
float4x4 cubeface_mat(int face)
MatBase< T, 4, 4 > orthographic(T left, T right, T bottom, T top, T near_clip, T far_clip)
Create an orthographic projection matrix using OpenGL coordinate convention: Maps each axis range to ...
MatBase< T, 4, 4 > orthographic_infinite(T left, T right, T bottom, T top)
Create an orthographic projection matrix using OpenGL coordinate convention: Maps each axis range to ...
MatBase< T, 4, 4 > perspective(T left, T right, T bottom, T top, T near_clip, T far_clip)
Create a perspective projection matrix using OpenGL coordinate convention: Maps each axis range to [-...
T reduce_max(const VecBase< T, Size > &a)
MatBase< T, NumCol, NumRow > translate(const MatBase< T, NumCol, NumRow > &mat, const VectorT &translation)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
const c_style_mat & ptr() const
void acquire(int2 extent, int header_count, int data_count, int normal_count)