Add debug toggle for dynamic resolution
This commit is contained in:
parent
91600b5f6f
commit
f10b5fd62b
5 changed files with 32 additions and 7 deletions
|
@ -114,6 +114,8 @@ void draw_renderer() {
|
||||||
|
|
||||||
bool should_recompile = false;
|
bool should_recompile = false;
|
||||||
|
|
||||||
|
ImGui::Checkbox("Enable Dynamic Resolution", &render_options.dynamic_resolution);
|
||||||
|
|
||||||
float render_scale = render_options.render_scale;
|
float render_scale = render_options.render_scale;
|
||||||
if(ImGui::DragFloat("Render Scale", &render_scale, 0.1f, 1.0f, 0.1f) && render_scale > 0.0f) {
|
if(ImGui::DragFloat("Render Scale", &render_scale, 0.1f, 1.0f, 0.1f) && render_scale > 0.0f) {
|
||||||
render_options.render_scale = render_scale;
|
render_options.render_scale = render_scale;
|
||||||
|
|
|
@ -658,14 +658,27 @@ void Engine::begin_frame(const float delta_time) {
|
||||||
_app->begin_frame();
|
_app->begin_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int frame_delay = 0;
|
||||||
|
const int frame_delay_between_resolution_change = 60;
|
||||||
|
|
||||||
void Engine::update(const float delta_time) {
|
void Engine::update(const float delta_time) {
|
||||||
const float ideal_delta_time = 0.01667f;
|
const float ideal_delta_time = 0.01667f;
|
||||||
|
|
||||||
if(render_options.dynamic_resolution) {
|
if(render_options.dynamic_resolution) {
|
||||||
if(delta_time < ideal_delta_time) {
|
frame_delay++;
|
||||||
render_options.render_scale -= 0.1f;
|
|
||||||
|
|
||||||
render_options.render_scale = std::fmax(render_options.render_scale, 0.1f);
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ struct RenderOptions {
|
||||||
float min_luminance = -8.0f;
|
float min_luminance = -8.0f;
|
||||||
float max_luminance = 3.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;
|
float depth_of_field_strength = 3.0f;
|
||||||
|
|
||||||
bool dynamic_resolution = false;
|
bool dynamic_resolution = false;
|
||||||
|
|
|
@ -188,4 +188,6 @@ private:
|
||||||
std::unique_ptr<DoFPass> dofPass;
|
std::unique_ptr<DoFPass> dofPass;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Pass>> passes;
|
std::vector<std::unique_ptr<Pass>> passes;
|
||||||
|
|
||||||
|
double current_render_scale = 1.0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -102,6 +102,7 @@ Renderer::~Renderer() {}
|
||||||
|
|
||||||
void Renderer::resize(const prism::Extent extent) {
|
void Renderer::resize(const prism::Extent extent) {
|
||||||
this->extent = extent;
|
this->extent = extent;
|
||||||
|
this->current_render_scale = render_options.render_scale;
|
||||||
|
|
||||||
if(!viewport_mode) {
|
if(!viewport_mode) {
|
||||||
createOffscreenResources();
|
createOffscreenResources();
|
||||||
|
@ -122,6 +123,7 @@ void Renderer::resize(const prism::Extent extent) {
|
||||||
|
|
||||||
void Renderer::resize_viewport(const prism::Extent extent) {
|
void Renderer::resize_viewport(const prism::Extent extent) {
|
||||||
this->viewport_extent = extent;
|
this->viewport_extent = extent;
|
||||||
|
this->current_render_scale = render_options.render_scale;
|
||||||
|
|
||||||
createOffscreenResources();
|
createOffscreenResources();
|
||||||
createMeshPipeline();
|
createMeshPipeline();
|
||||||
|
@ -206,6 +208,13 @@ void Renderer::stopSceneBlur() {
|
||||||
void Renderer::render(Scene* scene, int index) {
|
void Renderer::render(Scene* scene, int index) {
|
||||||
GFXCommandBuffer* commandbuffer = engine->get_gfx()->acquire_command_buffer();
|
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 extent = get_extent();
|
||||||
const auto render_extent = get_render_extent();
|
const auto render_extent = get_render_extent();
|
||||||
|
|
||||||
|
@ -361,7 +370,6 @@ void Renderer::render(Scene* scene, int index) {
|
||||||
|
|
||||||
commandbuffer->draw(0, 4, 0, 1);
|
commandbuffer->draw(0, 4, 0, 1);
|
||||||
|
|
||||||
|
|
||||||
commandbuffer->pop_group();
|
commandbuffer->pop_group();
|
||||||
|
|
||||||
if(current_screen != nullptr)
|
if(current_screen != nullptr)
|
||||||
|
|
Reference in a new issue