diff --git a/engine/core/src/debug.cpp b/engine/core/src/debug.cpp index a14fbc2..54dae03 100644 --- a/engine/core/src/debug.cpp +++ b/engine/core/src/debug.cpp @@ -103,6 +103,10 @@ void draw_renderer() { ImGui::Text("Options"); ImGui::Separator(); + ImGui::ComboEnum("Display Color Space", &render_options.display_color_space); + ImGui::ComboEnum("Tonemapping", &render_options.tonemapping); + ImGui::DragFloat("Exposure", &render_options.exposure, 0.1f); + bool should_recompile = false; float render_scale = render_options.render_scale; diff --git a/engine/renderer/include/render_options.hpp b/engine/renderer/include/render_options.hpp index 6572507..7f863a3 100755 --- a/engine/renderer/include/render_options.hpp +++ b/engine/renderer/include/render_options.hpp @@ -10,6 +10,16 @@ enum class ShadowFilter { PCSS }; +enum class DisplayColorSpace { + Linear = 0, + SRGB = 1, +}; + +enum class TonemapOperator { + Linear = 0, + ExposureBased = 1 +}; + #if defined(PLATFORM_TVOS) || defined(PLATFORM_IOS) constexpr bool default_enable_ibl = false; constexpr bool default_enable_normal_mapping = false; @@ -25,6 +35,10 @@ constexpr int default_shadow_resolution = 2048; #endif struct RenderOptions { + DisplayColorSpace display_color_space = DisplayColorSpace::SRGB; + TonemapOperator tonemapping = TonemapOperator::Linear; + float exposure = 1.0f; + bool dynamic_resolution = false; double render_scale = 1.0f; diff --git a/engine/renderer/src/renderer.cpp b/engine/renderer/src/renderer.cpp index f541839..5dd97fb 100755 --- a/engine/renderer/src/renderer.cpp +++ b/engine/renderer/src/renderer.cpp @@ -73,8 +73,7 @@ struct SceneInformation { }; struct PostPushConstants { - Vector4 viewport; - Vector4 options; + Vector4 viewport, options, transform_ops; }; struct UIPushConstant { @@ -300,7 +299,9 @@ void Renderer::render(Scene* scene, int index) { PostPushConstants pc; pc.options.x = render_options.enable_aa; pc.options.y = fade; - pc.options.z = 1.0; + pc.options.z = render_options.exposure; + pc.transform_ops.x = (int)render_options.display_color_space; + pc.transform_ops.y = (int)render_options.tonemapping; const auto [width, height] = render_extent; pc.viewport = Vector4(1.0f / static_cast(width), 1.0f / static_cast(height), width, height); diff --git a/shaders/post.frag.glsl b/shaders/post.frag.glsl index 32343a7..01f3dcf 100755 --- a/shaders/post.frag.glsl +++ b/shaders/post.frag.glsl @@ -8,6 +8,7 @@ layout(std430, push_constant, binding = 4) uniform PushConstant { vec4 viewport; vec4 options; + vec4 transform_ops; }; #include "smaa.glsl" @@ -63,6 +64,13 @@ void main() { vec3 sobelColor = vec3(0, 1, 1); vec3 hdrColor = sceneColor; // fading removed - hdrColor = vec3(1.0) - exp(-hdrColor * options.z); // exposure - outColor = vec4(from_linear_to_srgb(hdrColor) + (sobelColor * sobel), 1.0); + + vec3 transformed_color = hdrColor; + if(transform_ops.x == 1) + transformed_color = from_linear_to_srgb(hdrColor); + + if(transform_ops.y == 1) + transformed_color = vec3(1.0) - exp(-hdrColor * options.z); + + outColor = vec4(transformed_color + (sobelColor * sobel), 1.0); } diff --git a/shaders/post.vert.glsl b/shaders/post.vert.glsl index 1e069b2..3a38dbe 100755 --- a/shaders/post.vert.glsl +++ b/shaders/post.vert.glsl @@ -8,8 +8,7 @@ layout(std430, push_constant, binding = 4) uniform readonlPushConstant { vec4 viewport; float fade; - bool performGammaCorrection; - bool performAA; + vec4 transform_ops; }; #include "smaa.glsl"