diff --git a/engine/core/src/debug.cpp b/engine/core/src/debug.cpp index 41e1bf8..cc0b97b 100644 --- a/engine/core/src/debug.cpp +++ b/engine/core/src/debug.cpp @@ -114,6 +114,8 @@ void draw_renderer() { bool should_recompile = false; + ImGui::Checkbox("Enable Dynamic Resolution", &render_options.dynamic_resolution); + float render_scale = render_options.render_scale; if(ImGui::DragFloat("Render Scale", &render_scale, 0.1f, 1.0f, 0.1f) && render_scale > 0.0f) { render_options.render_scale = render_scale; diff --git a/engine/core/src/engine.cpp b/engine/core/src/engine.cpp index 3e02a5e..21b0387 100755 --- a/engine/core/src/engine.cpp +++ b/engine/core/src/engine.cpp @@ -658,14 +658,27 @@ void Engine::begin_frame(const float delta_time) { _app->begin_frame(); } +int frame_delay = 0; +const int frame_delay_between_resolution_change = 60; + void Engine::update(const float delta_time) { const float ideal_delta_time = 0.01667f; if(render_options.dynamic_resolution) { - if(delta_time < ideal_delta_time) { - render_options.render_scale -= 0.1f; - - render_options.render_scale = std::fmax(render_options.render_scale, 0.1f); + frame_delay++; + + if(frame_delay >= frame_delay_between_resolution_change) { + if(delta_time > ideal_delta_time) { + render_options.render_scale -= 0.1f; + + render_options.render_scale = std::fmax(render_options.render_scale, 0.1f); + } else { + render_options.render_scale += 0.1f; + + render_options.render_scale = std::fmin(render_options.render_scale, 1.0f); + } + + frame_delay = 0; } } diff --git a/engine/renderer/include/render_options.hpp b/engine/renderer/include/render_options.hpp index b6599fa..434105b 100755 --- a/engine/renderer/include/render_options.hpp +++ b/engine/renderer/include/render_options.hpp @@ -43,7 +43,7 @@ struct RenderOptions { float min_luminance = -8.0f; float max_luminance = 3.0f; - bool enable_depth_of_field = true; + bool enable_depth_of_field = false; float depth_of_field_strength = 3.0f; bool dynamic_resolution = false; diff --git a/engine/renderer/include/renderer.hpp b/engine/renderer/include/renderer.hpp index 3c224e9..7d26fc1 100755 --- a/engine/renderer/include/renderer.hpp +++ b/engine/renderer/include/renderer.hpp @@ -188,4 +188,6 @@ private: std::unique_ptr dofPass; std::vector> passes; + + double current_render_scale = 1.0; }; diff --git a/engine/renderer/src/renderer.cpp b/engine/renderer/src/renderer.cpp index 8ff612c..e0d0822 100755 --- a/engine/renderer/src/renderer.cpp +++ b/engine/renderer/src/renderer.cpp @@ -102,6 +102,7 @@ Renderer::~Renderer() {} void Renderer::resize(const prism::Extent extent) { this->extent = extent; + this->current_render_scale = render_options.render_scale; if(!viewport_mode) { createOffscreenResources(); @@ -122,7 +123,8 @@ void Renderer::resize(const prism::Extent extent) { void Renderer::resize_viewport(const prism::Extent extent) { this->viewport_extent = extent; - + this->current_render_scale = render_options.render_scale; + createOffscreenResources(); createMeshPipeline(); createPostPipeline(); @@ -206,6 +208,13 @@ void Renderer::stopSceneBlur() { void Renderer::render(Scene* scene, int index) { GFXCommandBuffer* commandbuffer = engine->get_gfx()->acquire_command_buffer(); + if(render_options.render_scale != current_render_scale) { + if(viewport_mode) + resize_viewport(viewport_extent); + else + resize(extent); + } + const auto extent = get_extent(); const auto render_extent = get_render_extent(); @@ -360,7 +369,6 @@ void Renderer::render(Scene* scene, int index) { } commandbuffer->draw(0, 4, 0, 1); - commandbuffer->pop_group();