Fix #114168: EEVEE-Next: Viewport image render sampling

Support sample accumulation in viewport image rendering.

Pull Request: https://projects.blender.org/blender/blender/pulls/116198
This commit is contained in:
Miguel Pozo
2023-12-19 16:13:45 +01:00
parent b1e83f8323
commit b6fab947d1
4 changed files with 24 additions and 6 deletions

View File

@@ -103,8 +103,12 @@ static void eevee_engine_init(void *vedata)
static void eevee_draw_scene(void *vedata)
{
EEVEE_Data *ved = reinterpret_cast<EEVEE_Data *>(vedata);
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
ved->instance->draw_viewport(dfbl);
if (DRW_state_is_viewport_image_render()) {
ved->instance->draw_viewport_image_render();
}
else {
ved->instance->draw_viewport();
}
STRNCPY(ved->info, ved->instance->info.c_str());
/* Reset view for other following engines. */
DRW_view_set_active(nullptr);

View File

@@ -493,9 +493,8 @@ void Instance::render_frame(RenderLayer *render_layer, const char *view_name)
this->render_read_result(render_layer, view_name);
}
void Instance::draw_viewport(DefaultFramebufferList *dfbl)
void Instance::draw_viewport()
{
UNUSED_VARS(dfbl);
render_sample();
velocity.step_swap();
@@ -518,6 +517,14 @@ void Instance::draw_viewport(DefaultFramebufferList *dfbl)
}
}
void Instance::draw_viewport_image_render()
{
while (!sampling.finished_viewport()) {
this->render_sample();
}
velocity.step_swap();
}
void Instance::store_metadata(RenderResult *render_result)
{
cryptomatte.store_metadata(render_result);

View File

@@ -180,7 +180,8 @@ class Instance {
/* Viewport. */
void draw_viewport(DefaultFramebufferList *dfbl);
void draw_viewport();
void draw_viewport_image_render();
/* Light bake. */
@@ -199,6 +200,11 @@ class Instance {
return render == nullptr && !is_baking();
}
bool is_viewport_image_render() const
{
return DRW_state_is_viewport_image_render();
}
bool is_baking() const
{
return is_light_bake;

View File

@@ -75,7 +75,8 @@ void Sampling::end_sync()
interactive_mode_ = viewport_sample_ < interactive_mode_threshold;
bool interactive_mode_disabled = (inst_.scene->eevee.flag & SCE_EEVEE_TAA_REPROJECTION) == 0;
bool interactive_mode_disabled = (inst_.scene->eevee.flag & SCE_EEVEE_TAA_REPROJECTION) == 0 ||
inst_.is_viewport_image_render();
if (interactive_mode_disabled) {
interactive_mode_ = false;
sample_ = viewport_sample_;