diff --git a/scripts/cube_logic.lua b/scripts/cube_logic.lua index 845b769..29f5a90 100644 --- a/scripts/cube_logic.lua +++ b/scripts/cube_logic.lua @@ -1046,6 +1046,44 @@ local function resolve_boolean(value, fallback) return fallback end +local function build_compat_render_graph(enable_tonemap, exposure, gamma) + local resources = {} + local passes = {} + + if enable_tonemap then + resources.scene_hdr = {type = "color", format = "rgba16f", size = "swapchain"} + table.insert(passes, { + name = "scene", + kind = "forward_plus", + output = "scene_hdr", + }) + table.insert(passes, { + name = "tonemap", + kind = "fullscreen", + shader = "tonemap_fallback", + input = "scene_hdr", + output = "swapchain", + settings = { + exposure = exposure, + gamma = gamma, + curve = "aces", + highlight_rolloff = 0.85, + }, + }) + else + table.insert(passes, { + name = "scene", + kind = "forward_plus", + output = "swapchain", + }) + end + + return { + resources = resources, + passes = passes, + } +end + function get_render_graph() local atmospherics = {} local rendering = {} @@ -1070,11 +1108,17 @@ function get_render_graph() local enable_vxgi = resolve_boolean(rendering.enable_vxgi, false) local enable_depth_of_field = resolve_boolean(rendering.enable_depth_of_field, true) local enable_motion_blur = resolve_boolean(rendering.enable_motion_blur, true) + local render_graph_profile = resolve_string(rendering.render_graph_profile, "compat") local pipeline_mode = resolve_string(rendering.pipeline, "deferred") local use_forward_plus = pipeline_mode == "forward_plus" or pipeline_mode == "forward+" or pipeline_mode == "forward" + if render_graph_profile ~= "full" then + log_debug("Render graph profile '%s' using compatibility graph", render_graph_profile) + return build_compat_render_graph(enable_tonemap, exposure, gamma) + end + local passes = { { name = "shadow_csm", diff --git a/src/services/impl/render_command_service.cpp b/src/services/impl/render_command_service.cpp index adb8c7b..c492e1d 100644 --- a/src/services/impl/render_command_service.cpp +++ b/src/services/impl/render_command_service.cpp @@ -360,6 +360,14 @@ void RenderCommandService::RecordRenderGraph(uint32_t imageIndex, } std::string outputName = ResolvePassOutput(pass); + if (logger_) { + logger_->Trace("RenderCommandService", "RecordRenderGraph", + "pass=" + pass.name + + ", kind=" + pass.kind + + ", scenePass=" + std::string(scenePass ? "true" : "false") + + ", shaderKey=" + (shaderKey.empty() ? "" : shaderKey) + + ", output=" + (outputName.empty() ? "" : outputName)); + } if (outputName.empty()) { if (logger_) { logger_->Warn("RenderCommandService: Render graph pass '" + pass.name + "' has no output"); @@ -522,6 +530,11 @@ void RenderCommandService::RecordRenderGraph(uint32_t imageIndex, } } else { std::string inputName = ResolvePassInput(pass); + if (logger_) { + logger_->Trace("RenderCommandService", "RecordRenderGraph", + "pass=" + pass.name + + ", input=" + (inputName.empty() ? "" : inputName)); + } if (inputName == "swapchain" && outputSwapchain) { if (logger_) { logger_->Trace("RenderCommandService", "RecordRenderGraph", @@ -1270,7 +1283,7 @@ void main() { ShaderPaths paths{}; paths.vertexSource = kFullscreenVertex; - if (shaderKey == "tonemap") { + if (shaderKey == "tonemap" || shaderKey == "tonemap_fallback") { paths.fragmentSource = kTonemapFragment; } else { paths.fragmentSource = kPostProcessFragment;