diff --git a/modules/tone_mapping/include/vkcv/tone/ACESToneMapping.hpp b/modules/tone_mapping/include/vkcv/tone/ACESToneMapping.hpp index 77a9896e9b472017497012fdc6b14a35adfd5f5a..247d1d06af45bd2a23724ab9e453aeb4f8f59cd8 100644 --- a/modules/tone_mapping/include/vkcv/tone/ACESToneMapping.hpp +++ b/modules/tone_mapping/include/vkcv/tone/ACESToneMapping.hpp @@ -9,7 +9,7 @@ namespace vkcv::tone { void initToneMapping() override; public: - explicit ACESToneMapping(Core& core); + explicit ACESToneMapping(Core& core, bool normalize = false); }; diff --git a/modules/tone_mapping/include/vkcv/tone/FilmicToneMapping.hpp b/modules/tone_mapping/include/vkcv/tone/FilmicToneMapping.hpp index fd6bb975e3e7cbac0c741ef8d47e6940c374e630..6ed77ad87b10e923a1830913dfcda9c8f6753235 100644 --- a/modules/tone_mapping/include/vkcv/tone/FilmicToneMapping.hpp +++ b/modules/tone_mapping/include/vkcv/tone/FilmicToneMapping.hpp @@ -9,7 +9,7 @@ namespace vkcv::tone { void initToneMapping() override; public: - explicit FilmicToneMapping(Core& core); + explicit FilmicToneMapping(Core& core, bool normalize = false); }; diff --git a/modules/tone_mapping/include/vkcv/tone/LottesToneMapping.hpp b/modules/tone_mapping/include/vkcv/tone/LottesToneMapping.hpp index e899e2667353b4a6a8737d33465f6df9046b6a93..444b5fb30d1cb97c23dcec77739c0c49ca1d3ffc 100644 --- a/modules/tone_mapping/include/vkcv/tone/LottesToneMapping.hpp +++ b/modules/tone_mapping/include/vkcv/tone/LottesToneMapping.hpp @@ -9,7 +9,7 @@ namespace vkcv::tone { void initToneMapping() override; public: - explicit LottesToneMapping(Core& core); + explicit LottesToneMapping(Core& core, bool normalize = false); }; diff --git a/modules/tone_mapping/include/vkcv/tone/Reinhard2ToneMapping.hpp b/modules/tone_mapping/include/vkcv/tone/Reinhard2ToneMapping.hpp index 68f8fb57d62881bb9dafa25a500ff47105e83b06..2e6780837db03dc020873e492667162409ea786e 100644 --- a/modules/tone_mapping/include/vkcv/tone/Reinhard2ToneMapping.hpp +++ b/modules/tone_mapping/include/vkcv/tone/Reinhard2ToneMapping.hpp @@ -9,7 +9,7 @@ namespace vkcv::tone { void initToneMapping() override; public: - explicit Reinhard2ToneMapping(Core& core); + explicit Reinhard2ToneMapping(Core& core, bool normalize = false); }; diff --git a/modules/tone_mapping/include/vkcv/tone/ReinhardToneMapping.hpp b/modules/tone_mapping/include/vkcv/tone/ReinhardToneMapping.hpp index e1c61fd3144a4532382b06f93db5e5015e6b6b31..1b74dcce00652bfd9e8d4ab9eb4a148d3236c4e9 100644 --- a/modules/tone_mapping/include/vkcv/tone/ReinhardToneMapping.hpp +++ b/modules/tone_mapping/include/vkcv/tone/ReinhardToneMapping.hpp @@ -9,7 +9,7 @@ namespace vkcv::tone { void initToneMapping() override; public: - explicit ReinhardToneMapping(Core& core); + explicit ReinhardToneMapping(Core& core, bool normalize = false); }; diff --git a/modules/tone_mapping/include/vkcv/tone/ToneMapping.hpp b/modules/tone_mapping/include/vkcv/tone/ToneMapping.hpp index 7dce06172227f524ba89c5a1c1a6cf5b19d85a54..467ca74f0916a6ead2f45246e01c68ba3662e5f3 100644 --- a/modules/tone_mapping/include/vkcv/tone/ToneMapping.hpp +++ b/modules/tone_mapping/include/vkcv/tone/ToneMapping.hpp @@ -12,6 +12,7 @@ namespace vkcv::tone { Core& m_core; std::string m_name; + bool m_normalize; ComputePipelineHandle m_pipeline; @@ -40,8 +41,11 @@ namespace vkcv::tone { * * @param[in,out] core Reference to a Core instance * @param[in] name Name of the tone mapping function + * @param[in] normalize Normalize color values */ - explicit ToneMapping(Core& core, const std::string& name); + explicit ToneMapping(Core& core, + const std::string& name, + bool normalize = false); ~ToneMapping() = default; diff --git a/modules/tone_mapping/include/vkcv/tone/UchimuraToneMapping.hpp b/modules/tone_mapping/include/vkcv/tone/UchimuraToneMapping.hpp index b4047d1c2097f580068bdccfe0561bab8397cc5f..ad2e4f119241c31c22fbf519514c7fc366d02bd0 100644 --- a/modules/tone_mapping/include/vkcv/tone/UchimuraToneMapping.hpp +++ b/modules/tone_mapping/include/vkcv/tone/UchimuraToneMapping.hpp @@ -9,7 +9,7 @@ namespace vkcv::tone { void initToneMapping() override; public: - explicit UchimuraToneMapping(Core& core); + explicit UchimuraToneMapping(Core& core, bool normalize = false); }; diff --git a/modules/tone_mapping/include/vkcv/tone/Uncharted2ToneMapping.hpp b/modules/tone_mapping/include/vkcv/tone/Uncharted2ToneMapping.hpp index c1cf0f749f3a4dd1dc20569f6204258fbf05e1c1..99a4d6c726a37a36b4f7e86d26c9df0890a878b8 100644 --- a/modules/tone_mapping/include/vkcv/tone/Uncharted2ToneMapping.hpp +++ b/modules/tone_mapping/include/vkcv/tone/Uncharted2ToneMapping.hpp @@ -9,7 +9,7 @@ namespace vkcv::tone { void initToneMapping() override; public: - explicit Uncharted2ToneMapping(Core& core); + explicit Uncharted2ToneMapping(Core& core, bool normalize = false); }; diff --git a/modules/tone_mapping/include/vkcv/tone/UnrealToneMapping.hpp b/modules/tone_mapping/include/vkcv/tone/UnrealToneMapping.hpp index 2d3c80906139cfca7d3a205117e6e2b7fab2154b..a5e1f71741277eb158f4609916cc535fcc52b64f 100644 --- a/modules/tone_mapping/include/vkcv/tone/UnrealToneMapping.hpp +++ b/modules/tone_mapping/include/vkcv/tone/UnrealToneMapping.hpp @@ -9,7 +9,7 @@ namespace vkcv::tone { void initToneMapping() override; public: - explicit UnrealToneMapping(Core& core); + explicit UnrealToneMapping(Core& core, bool normalize = false); }; diff --git a/modules/tone_mapping/src/vkcv/tone/ACESToneMapping.cpp b/modules/tone_mapping/src/vkcv/tone/ACESToneMapping.cpp index 26e5624c944f6d9ed8c751cff534a73e8daa7888..4835fdcd6ef2acd22d4d867e284f90fc5ba6546b 100644 --- a/modules/tone_mapping/src/vkcv/tone/ACESToneMapping.cpp +++ b/modules/tone_mapping/src/vkcv/tone/ACESToneMapping.cpp @@ -9,7 +9,8 @@ namespace vkcv::tone { buildComputePipeline("aces", ACES_GLSL_SHADER); } - ACESToneMapping::ACESToneMapping(Core &core) : ToneMapping(core, "ACES Tone Mapping") { + ACESToneMapping::ACESToneMapping(Core &core, bool normalize) + : ToneMapping(core, "ACES Tone Mapping", normalize) { initToneMapping(); } diff --git a/modules/tone_mapping/src/vkcv/tone/FilmicToneMapping.cpp b/modules/tone_mapping/src/vkcv/tone/FilmicToneMapping.cpp index 26b02f5bd4249c8c4c31e52c87434054d5aa84c8..3d93ada18d39fcea59cc0258360fbea79338a631 100644 --- a/modules/tone_mapping/src/vkcv/tone/FilmicToneMapping.cpp +++ b/modules/tone_mapping/src/vkcv/tone/FilmicToneMapping.cpp @@ -9,7 +9,8 @@ namespace vkcv::tone { buildComputePipeline("filmic", FILMIC_GLSL_SHADER); } - FilmicToneMapping::FilmicToneMapping(Core &core) : ToneMapping(core, "Filmic Tone Mapping") { + FilmicToneMapping::FilmicToneMapping(Core &core, bool normalize) + : ToneMapping(core, "Filmic Tone Mapping", normalize) { initToneMapping(); } diff --git a/modules/tone_mapping/src/vkcv/tone/LottesToneMapping.cpp b/modules/tone_mapping/src/vkcv/tone/LottesToneMapping.cpp index ab5b7af11c439cebb5d220cfb39e3e740f322480..9ae38055831164933e009229d0e6510aaf99d1e5 100644 --- a/modules/tone_mapping/src/vkcv/tone/LottesToneMapping.cpp +++ b/modules/tone_mapping/src/vkcv/tone/LottesToneMapping.cpp @@ -9,7 +9,8 @@ namespace vkcv::tone { buildComputePipeline("lottes", LOTTES_GLSL_SHADER); } - LottesToneMapping::LottesToneMapping(Core &core) : ToneMapping(core, "Lottes Tone Mapping") { + LottesToneMapping::LottesToneMapping(Core &core, bool normalize) + : ToneMapping(core, "Lottes Tone Mapping", normalize) { initToneMapping(); } diff --git a/modules/tone_mapping/src/vkcv/tone/Reinhard2ToneMapping.cpp b/modules/tone_mapping/src/vkcv/tone/Reinhard2ToneMapping.cpp index 914a64913441026926017cf2e2723d0681b17529..e81b952654337b49e310111ab08f345cf2106bcb 100644 --- a/modules/tone_mapping/src/vkcv/tone/Reinhard2ToneMapping.cpp +++ b/modules/tone_mapping/src/vkcv/tone/Reinhard2ToneMapping.cpp @@ -9,7 +9,8 @@ namespace vkcv::tone { buildComputePipeline("reinhard2", REINHARD2_GLSL_SHADER); } - Reinhard2ToneMapping::Reinhard2ToneMapping(Core &core) : ToneMapping(core, "Reinhard2 Tone Mapping") { + Reinhard2ToneMapping::Reinhard2ToneMapping(Core &core, bool normalize) + : ToneMapping(core, "Reinhard2 Tone Mapping", normalize) { initToneMapping(); } diff --git a/modules/tone_mapping/src/vkcv/tone/ReinhardToneMapping.cpp b/modules/tone_mapping/src/vkcv/tone/ReinhardToneMapping.cpp index 743a4f1366c09d764aef338afeb29cbf70187703..258550d80c6b099e84cf93541aa01aa157a3645c 100644 --- a/modules/tone_mapping/src/vkcv/tone/ReinhardToneMapping.cpp +++ b/modules/tone_mapping/src/vkcv/tone/ReinhardToneMapping.cpp @@ -9,7 +9,8 @@ namespace vkcv::tone { buildComputePipeline("reinhard", REINHARD_GLSL_SHADER); } - ReinhardToneMapping::ReinhardToneMapping(Core &core) : ToneMapping(core, "Reinhard Tone Mapping") { + ReinhardToneMapping::ReinhardToneMapping(Core &core, bool normalize) + : ToneMapping(core, "Reinhard Tone Mapping", normalize) { initToneMapping(); } diff --git a/modules/tone_mapping/src/vkcv/tone/ToneMapping.cpp b/modules/tone_mapping/src/vkcv/tone/ToneMapping.cpp index 2c3fcb4a8599449f694bac4881c96605a33d3db3..3323d8797c34afd2890c433c5849bd8fdf9c807e 100644 --- a/modules/tone_mapping/src/vkcv/tone/ToneMapping.cpp +++ b/modules/tone_mapping/src/vkcv/tone/ToneMapping.cpp @@ -53,9 +53,14 @@ namespace vkcv::tone { stream << " return;" << std::endl; stream << " }" << std::endl; stream << " ivec2 uv = ivec2(gl_GlobalInvocationID.xy);" << std::endl; - stream << " vec3 color = imageLoad(inImage, uv).xyz;" << std::endl; - stream << " color = " << functionName << "(color);" << std::endl; - stream << " imageStore(outImage, uv, vec4(color, 0.f));" << std::endl; + stream << " vec4 color = imageLoad(inImage, uv);" << std::endl; + + if (m_normalize) { + stream << " color /= color.w;" << std::endl; + } + + stream << " color = vec4(" << functionName << "(color.xyz), color.w);" << std::endl; + stream << " imageStore(outImage, uv, color);" << std::endl; stream << "}" << std::endl; compiler.compileSource( @@ -88,8 +93,15 @@ namespace vkcv::tone { }); } - ToneMapping::ToneMapping(Core &core, const std::string &name) - : m_core(core), m_name(name), m_pipeline(), m_descriptorSetLayout(), m_descriptorSet() {} + ToneMapping::ToneMapping(Core &core, + const std::string &name, + bool normalize) + : m_core(core), + m_name(name), + m_normalize(normalize), + m_pipeline(), + m_descriptorSetLayout(), + m_descriptorSet() {} const std::string &ToneMapping::getName() const { return m_name; diff --git a/modules/tone_mapping/src/vkcv/tone/UchimuraToneMapping.cpp b/modules/tone_mapping/src/vkcv/tone/UchimuraToneMapping.cpp index ee0263cc7faf8a873d2f605dcb633714127056b0..f063569ad35f7b2ccdb7b1a75df3a0ef3c122ef9 100644 --- a/modules/tone_mapping/src/vkcv/tone/UchimuraToneMapping.cpp +++ b/modules/tone_mapping/src/vkcv/tone/UchimuraToneMapping.cpp @@ -9,7 +9,8 @@ namespace vkcv::tone { buildComputePipeline("uchimura", UCHIMURA_GLSL_SHADER); } - UchimuraToneMapping::UchimuraToneMapping(Core &core) : ToneMapping(core, "Uchimura Tone Mapping") { + UchimuraToneMapping::UchimuraToneMapping(Core &core, bool normalize) + : ToneMapping(core, "Uchimura Tone Mapping", normalize) { initToneMapping(); } diff --git a/modules/tone_mapping/src/vkcv/tone/Uncharted2ToneMapping.cpp b/modules/tone_mapping/src/vkcv/tone/Uncharted2ToneMapping.cpp index ff6a68ce00c512493c1947c3bcf04f871b3a8f83..c83ad5d01632072869655a56fcba217df43f35ca 100644 --- a/modules/tone_mapping/src/vkcv/tone/Uncharted2ToneMapping.cpp +++ b/modules/tone_mapping/src/vkcv/tone/Uncharted2ToneMapping.cpp @@ -9,7 +9,8 @@ namespace vkcv::tone { buildComputePipeline("uncharted2", UNCHARTED2_GLSL_SHADER); } - Uncharted2ToneMapping::Uncharted2ToneMapping(Core &core) : ToneMapping(core, "Uncharted2 Tone Mapping") { + Uncharted2ToneMapping::Uncharted2ToneMapping(Core &core, bool normalize) + : ToneMapping(core, "Uncharted2 Tone Mapping", normalize) { initToneMapping(); } diff --git a/modules/tone_mapping/src/vkcv/tone/UnrealToneMapping.cpp b/modules/tone_mapping/src/vkcv/tone/UnrealToneMapping.cpp index ebbe8fb5fbf02761da416e3e2fb058623711d054..d41c9e3fadce145765d2d237175eb7622792672d 100644 --- a/modules/tone_mapping/src/vkcv/tone/UnrealToneMapping.cpp +++ b/modules/tone_mapping/src/vkcv/tone/UnrealToneMapping.cpp @@ -9,7 +9,8 @@ namespace vkcv::tone { buildComputePipeline("unreal", UNREAL_GLSL_SHADER); } - UnrealToneMapping::UnrealToneMapping(Core &core) : ToneMapping(core, "Unreal Tone Mapping") { + UnrealToneMapping::UnrealToneMapping(Core &core, bool normalize) + : ToneMapping(core, "Unreal Tone Mapping", normalize) { initToneMapping(); } diff --git a/projects/particle_simulation/CMakeLists.txt b/projects/particle_simulation/CMakeLists.txt index ed0874fb071aadf801b03be62b7b1b8e8da47aaa..0f4e0acd2d7e1e14a82ed2f045be0e2e326b6330 100644 --- a/projects/particle_simulation/CMakeLists.txt +++ b/projects/particle_simulation/CMakeLists.txt @@ -19,6 +19,7 @@ target_include_directories(particle_simulation SYSTEM BEFORE PRIVATE ${vkcv_includes} ${vkcv_camera_include} ${vkcv_shader_compiler_include} + ${vkcv_tone_mapping_include} ${vkcv_effects_include}) # linking with libraries from all dependencies and the VkCV framework @@ -26,4 +27,5 @@ target_link_libraries(particle_simulation vkcv vkcv_camera vkcv_shader_compiler + vkcv_tone_mapping vkcv_effects) diff --git a/projects/particle_simulation/shaders/tonemapping.comp b/projects/particle_simulation/shaders/tonemapping.comp deleted file mode 100644 index 26f0232d66e3475afdd1266c0cc6288b47ed1c38..0000000000000000000000000000000000000000 --- a/projects/particle_simulation/shaders/tonemapping.comp +++ /dev/null @@ -1,19 +0,0 @@ -#version 440 - -layout(set=0, binding=0, rgba16f) uniform image2D inImage; -layout(set=0, binding=1, rgba8) uniform image2D outImage; - - -layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; - -void main(){ - - if(any(greaterThanEqual(gl_GlobalInvocationID.xy, imageSize(inImage)))){ - return; - } - ivec2 uv = ivec2(gl_GlobalInvocationID.xy); - vec3 linearColor = imageLoad(inImage, uv).rgb; - vec3 tonemapped = linearColor / (dot(linearColor, vec3(0.21, 0.71, 0.08)) + 1); // reinhard tonemapping - vec3 gammaCorrected = pow(tonemapped, vec3(1.f / 2.2f)); - imageStore(outImage, uv, vec4(gammaCorrected, 0.f)); -} \ No newline at end of file diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp index 7f270706eb2e385c539af4cdd6cb7eca3236b138..09cb702809f9f7c48105d8b95b4f398f2bbeb014 100644 --- a/projects/particle_simulation/src/main.cpp +++ b/projects/particle_simulation/src/main.cpp @@ -4,13 +4,12 @@ #include <vkcv/Pass.hpp> #include <GLFW/glfw3.h> #include <vkcv/camera/CameraManager.hpp> -#include <chrono> #include "ParticleSystem.hpp" #include <random> -#include <glm/gtc/matrix_access.hpp> -#include <ctime> #include <vkcv/shader/GLSLCompiler.hpp> #include <vkcv/effects/BloomAndFlaresEffect.hpp> +#include <vkcv/effects/GammaCorrectionEffect.hpp> +#include <vkcv/tone/ReinhardToneMapping.hpp> int main(int argc, const char **argv) { const std::string applicationName = "Particlesystem"; @@ -222,18 +221,9 @@ int main(int argc, const char **argv) { vkcv::effects::BloomAndFlaresEffect bloomAndFlares (core); bloomAndFlares.setUpsamplingLimit(3); - - vkcv::ShaderProgram tonemappingShader; - compiler.compile(vkcv::ShaderStage::COMPUTE, "shaders/tonemapping.comp", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { - tonemappingShader.addShader(shaderStage, path); - }); - - vkcv::DescriptorSetLayoutHandle tonemappingDescriptorLayout = core.createDescriptorSetLayout(tonemappingShader.getReflectedDescriptors().at(0)); - vkcv::DescriptorSetHandle tonemappingDescriptor = core.createDescriptorSet(tonemappingDescriptorLayout); - vkcv::ComputePipelineHandle tonemappingPipe = core.createComputePipeline({ - tonemappingShader, - { tonemappingDescriptorLayout } - }); + + vkcv::tone::ReinhardToneMapping toneMapping (core); + vkcv::effects::GammaCorrectionEffect gammaCorrection (core); std::uniform_real_distribution<float> rdm = std::uniform_real_distribution<float>(0.95f, 1.05f); std::default_random_engine rdmEngine; @@ -295,31 +285,8 @@ int main(int argc, const char **argv) { ); bloomAndFlares.recordEffect(cmdStream, colorBuffer, colorBuffer); - - core.prepareImageForStorage(cmdStream, colorBuffer); - core.prepareImageForStorage(cmdStream, swapchainInput); - - vkcv::DescriptorWrites tonemappingDescriptorWrites; - tonemappingDescriptorWrites.writeStorageImage( - 0, colorBuffer - ).writeStorageImage( - 1, swapchainInput - ); - - core.writeDescriptorSet(tonemappingDescriptor, tonemappingDescriptorWrites); - - const auto tonemappingDispatchCount = vkcv::dispatchInvocations( - vkcv::DispatchSize(swapchainWidth, swapchainHeight), - vkcv::DispatchSize(8, 8) - ); - - core.recordComputeDispatchToCmdStream( - cmdStream, - tonemappingPipe, - tonemappingDispatchCount, - { vkcv::useDescriptorSet(0, tonemappingDescriptor) }, - vkcv::PushConstants(0) - ); + toneMapping.recordToneMapping(cmdStream, colorBuffer, colorBuffer); + gammaCorrection.recordEffect(cmdStream, colorBuffer, swapchainInput); core.prepareSwapchainImageForPresent(cmdStream); core.submitCommandStream(cmdStream); diff --git a/projects/path_tracer/CMakeLists.txt b/projects/path_tracer/CMakeLists.txt index 03e5eec5ddbada873297d53d224d57f97b4436a9..e0287b28f177708b7ef9bd0935475de365e421fb 100644 --- a/projects/path_tracer/CMakeLists.txt +++ b/projects/path_tracer/CMakeLists.txt @@ -14,7 +14,9 @@ target_include_directories(path_tracer SYSTEM BEFORE PRIVATE ${vkcv_includes} ${vkcv_asset_loader_include} ${vkcv_camera_include} + ${vkcv_effects_include} ${vkcv_shader_compiler_include} + ${vkcv_tone_mapping_include} ${vkcv_gui_include}) # linking with libraries from all dependencies and the VkCV framework @@ -23,5 +25,7 @@ target_link_libraries(path_tracer vkcv_asset_loader ${vkcv_asset_loader_libraries} vkcv_camera + vkcv_effects vkcv_shader_compiler + vkcv_tone_mapping vkcv_gui) diff --git a/projects/path_tracer/shaders/presentImage.comp b/projects/path_tracer/shaders/presentImage.comp deleted file mode 100644 index a52159c0c6173779b091e5d4153b15b0a6361780..0000000000000000000000000000000000000000 --- a/projects/path_tracer/shaders/presentImage.comp +++ /dev/null @@ -1,23 +0,0 @@ -#version 440 -#extension GL_GOOGLE_include_directive : enable - -layout(set=0, binding=0, rgba32f) uniform image2D inImage; -layout(set=0, binding=1, rgba8) uniform image2D outImage; - -layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; - -void main(){ - - ivec2 outImageRes = imageSize(outImage); - ivec2 coord = ivec2(gl_GlobalInvocationID.xy); - - if(any(greaterThanEqual(coord, outImageRes))) - return; - - vec4 colorRaw = imageLoad(inImage, coord); - vec3 colorNormalized = colorRaw.rgb / colorRaw.a; - vec3 colorTonemapped = colorNormalized / (1 + dot(colorNormalized, vec3(0.71, 0.21, 0.08))); // reinhard tonemapping - vec3 colorGammaCorrected = pow(colorTonemapped, vec3(1.f / 2.2)); - - imageStore(outImage, coord, vec4(colorGammaCorrected, 0)); -} \ No newline at end of file diff --git a/projects/path_tracer/src/main.cpp b/projects/path_tracer/src/main.cpp index 75ee36b2ac232e20d7baf29db34909dee67cca00..1a87015e58aee80feebb4bc5fafac0a482da5743 100644 --- a/projects/path_tracer/src/main.cpp +++ b/projects/path_tracer/src/main.cpp @@ -1,11 +1,11 @@ #include <vkcv/Buffer.hpp> #include <vkcv/Core.hpp> -#include <vkcv/Pass.hpp> #include <vkcv/camera/CameraManager.hpp> #include <vkcv/asset/asset_loader.hpp> +#include <vkcv/effects/GammaCorrectionEffect.hpp> #include <vkcv/shader/GLSLCompiler.hpp> -#include "vkcv/gui/GUI.hpp" -#include <chrono> +#include <vkcv/tone/ReinhardToneMapping.hpp> +#include <vkcv/gui/GUI.hpp> #include <vector> int main(int argc, const char** argv) { @@ -81,6 +81,11 @@ int main(int argc, const char** argv) { vk::Format::eR32G32B32A32Sfloat, imageConfig ); + + vkcv::ImageHandle mappedImage = core.createImage( + vk::Format::eR8G8B8A8Unorm, + imageConfig + ); vkcv::shader::GLSLCompiler compiler; @@ -113,21 +118,9 @@ int main(int argc, const char** argv) { vkcv::DescriptorWrites imageCombineDescriptorWrites; imageCombineDescriptorWrites.writeStorageImage(0, outputImage).writeStorageImage(1, meanImage); core.writeDescriptorSet(imageCombineDescriptorSet, imageCombineDescriptorWrites); - - // image present shader - vkcv::ShaderProgram presentShaderProgram{}; - - compiler.compile(vkcv::ShaderStage::COMPUTE, "shaders/presentImage.comp", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { - presentShaderProgram.addShader(shaderStage, path); - }); - - const vkcv::DescriptorBindings& presentDescriptorBindings = presentShaderProgram.getReflectedDescriptors().at(0); - vkcv::DescriptorSetLayoutHandle presentDescriptorSetLayout = core.createDescriptorSetLayout(presentDescriptorBindings); - vkcv::DescriptorSetHandle presentDescriptorSet = core.createDescriptorSet(presentDescriptorSetLayout); - vkcv::ComputePipelineHandle presentPipeline = core.createComputePipeline({ - presentShaderProgram, - { presentDescriptorSetLayout } - }); + + vkcv::tone::ReinhardToneMapping toneMapping (core, true); + vkcv::effects::GammaCorrectionEffect gammaCorrection (core); // clear shader vkcv::ShaderProgram clearShaderProgram{}; @@ -253,13 +246,18 @@ int main(int argc, const char** argv) { // resize images outputImage = core.createImage( - vk::Format::eR32G32B32A32Sfloat, - imageConfig + vk::Format::eR32G32B32A32Sfloat, + imageConfig ); meanImage = core.createImage( - vk::Format::eR32G32B32A32Sfloat, - imageConfig + vk::Format::eR32G32B32A32Sfloat, + imageConfig + ); + + mappedImage = core.createImage( + vk::Format::eR8G8B8A8Unorm, + imageConfig ); // update descriptor sets @@ -379,23 +377,9 @@ int main(int argc, const char** argv) { // present image const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle(); - - vkcv::DescriptorWrites presentDescriptorWrites; - presentDescriptorWrites.writeStorageImage( - 0, meanImage - ).writeStorageImage( - 1, swapchainInput - ); - core.writeDescriptorSet(presentDescriptorSet, presentDescriptorWrites); - - core.prepareImageForStorage(cmdStream, swapchainInput); - - core.recordComputeDispatchToCmdStream(cmdStream, - presentPipeline, - fullscreenDispatchCount, - { vkcv::useDescriptorSet(0, presentDescriptorSet) }, - vkcv::PushConstants(0)); + toneMapping.recordToneMapping(cmdStream, meanImage, mappedImage); + gammaCorrection.recordEffect(cmdStream, mappedImage, swapchainInput); core.prepareSwapchainImageForPresent(cmdStream); core.submitCommandStream(cmdStream); diff --git a/projects/sph/CMakeLists.txt b/projects/sph/CMakeLists.txt index 01a6e083116622965b9f58c2837f6287871da50e..46e83abfbe1913ea69038db7320d370e114caa3d 100644 --- a/projects/sph/CMakeLists.txt +++ b/projects/sph/CMakeLists.txt @@ -19,6 +19,7 @@ target_include_directories(sph SYSTEM BEFORE PRIVATE ${vkcv_includes} ${vkcv_camera_include} ${vkcv_shader_compiler_include} + ${vkcv_tone_mapping_include} ${vkcv_effects_include}) # linking with libraries from all dependencies and the VkCV framework @@ -26,4 +27,5 @@ target_link_libraries(sph vkcv vkcv_camera vkcv_shader_compiler + vkcv_tone_mapping vkcv_effects) diff --git a/projects/sph/shaders/tonemapping.comp b/projects/sph/shaders/tonemapping.comp deleted file mode 100644 index 26f0232d66e3475afdd1266c0cc6288b47ed1c38..0000000000000000000000000000000000000000 --- a/projects/sph/shaders/tonemapping.comp +++ /dev/null @@ -1,19 +0,0 @@ -#version 440 - -layout(set=0, binding=0, rgba16f) uniform image2D inImage; -layout(set=0, binding=1, rgba8) uniform image2D outImage; - - -layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; - -void main(){ - - if(any(greaterThanEqual(gl_GlobalInvocationID.xy, imageSize(inImage)))){ - return; - } - ivec2 uv = ivec2(gl_GlobalInvocationID.xy); - vec3 linearColor = imageLoad(inImage, uv).rgb; - vec3 tonemapped = linearColor / (dot(linearColor, vec3(0.21, 0.71, 0.08)) + 1); // reinhard tonemapping - vec3 gammaCorrected = pow(tonemapped, vec3(1.f / 2.2f)); - imageStore(outImage, uv, vec4(gammaCorrected, 0.f)); -} \ No newline at end of file diff --git a/projects/sph/src/main.cpp b/projects/sph/src/main.cpp index 904d9e8965e41914271afb0ac31853b1581f6ca7..89f2df703ca14f7e622521e728e3b0216aa4624b 100644 --- a/projects/sph/src/main.cpp +++ b/projects/sph/src/main.cpp @@ -3,11 +3,13 @@ #include <vkcv/Buffer.hpp> #include <vkcv/Pass.hpp> #include <vkcv/camera/CameraManager.hpp> -#include <chrono> #include <random> #include <ctime> #include <vkcv/shader/GLSLCompiler.hpp> #include <vkcv/effects/BloomAndFlaresEffect.hpp> +#include <vkcv/effects/GammaCorrectionEffect.hpp> +#include <vkcv/tone/ReinhardToneMapping.hpp> + #include "PipelineInit.hpp" #include "Particle.hpp" @@ -237,15 +239,9 @@ int main(int argc, const char **argv) { vkcv::effects::BloomAndFlaresEffect bloomAndFlares (core); bloomAndFlares.setUpsamplingLimit(3); - - //tone mapping shader & pipeline - vkcv::ComputePipelineHandle tonemappingPipe; - vkcv::DescriptorSetHandle tonemappingDescriptor = PipelineInit::ComputePipelineInit( - &core, - vkcv::ShaderStage::COMPUTE, - "shaders/tonemapping.comp", - tonemappingPipe - ); + + vkcv::tone::ReinhardToneMapping toneMapping (core); + vkcv::effects::GammaCorrectionEffect gammaCorrection (core); core.run([&](const vkcv::WindowHandle &windowHandle, double t, double dt, uint32_t swapchainWidth, uint32_t swapchainHeight) { @@ -395,31 +391,8 @@ int main(int argc, const char **argv) { ); bloomAndFlares.recordEffect(cmdStream, colorBuffer, colorBuffer); - - core.prepareImageForStorage(cmdStream, colorBuffer); - core.prepareImageForStorage(cmdStream, swapchainInput); - - vkcv::DescriptorWrites tonemappingDescriptorWrites; - tonemappingDescriptorWrites.writeStorageImage( - 0, colorBuffer - ).writeStorageImage( - 1, swapchainInput - ); - - core.writeDescriptorSet(tonemappingDescriptor, tonemappingDescriptorWrites); - - const auto tonemappingDispatchCount = vkcv::dispatchInvocations( - vkcv::DispatchSize(swapchainWidth, swapchainHeight), - vkcv::DispatchSize(8, 8) - ); - - core.recordComputeDispatchToCmdStream( - cmdStream, - tonemappingPipe, - tonemappingDispatchCount, - { vkcv::useDescriptorSet(0, tonemappingDescriptor) }, - vkcv::PushConstants(0) - ); + toneMapping.recordToneMapping(cmdStream, colorBuffer, colorBuffer); + gammaCorrection.recordEffect(cmdStream, colorBuffer, swapchainInput); core.prepareSwapchainImageForPresent(cmdStream); core.submitCommandStream(cmdStream); diff --git a/projects/voxelization/CMakeLists.txt b/projects/voxelization/CMakeLists.txt index 34178021a517485e54ef8dcafe0f170a834e5186..f8735582caa27ceaf111c969d8ae716679dee1e5 100644 --- a/projects/voxelization/CMakeLists.txt +++ b/projects/voxelization/CMakeLists.txt @@ -21,6 +21,7 @@ target_include_directories(voxelization SYSTEM BEFORE PRIVATE ${vkcv_asset_loader_include} ${vkcv_camera_include} ${vkcv_shader_compiler_include} + ${vkcv_tone_mapping_include} ${vkcv_gui_include} ${vkcv_upscaling_include} ${vkcv_effects_include} @@ -34,6 +35,7 @@ target_link_libraries(voxelization ${vkcv_asset_loader_libraries} vkcv_camera vkcv_shader_compiler + vkcv_tone_mapping vkcv_gui vkcv_upscaling vkcv_effects diff --git a/projects/voxelization/assets/shaders/tonemapping.comp b/projects/voxelization/assets/shaders/tonemapping.comp deleted file mode 100644 index ffadc9a71e207f97fec9a8815aa1c61bc709c369..0000000000000000000000000000000000000000 --- a/projects/voxelization/assets/shaders/tonemapping.comp +++ /dev/null @@ -1,34 +0,0 @@ -#version 440 -#extension GL_GOOGLE_include_directive : enable - -layout(set=0, binding=0) uniform texture2D inTexture; -layout(set=0, binding=1) uniform sampler textureSampler; -layout(set=0, binding=2, rgba8) uniform image2D outImage; - -layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; - -// from: https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/ -vec3 ACESFilm(vec3 x) -{ - float a = 2.51f; - float b = 0.03f; - float c = 2.43f; - float d = 0.59f; - float e = 0.14f; - return clamp((x*(a*x+b))/(x*(c*x+d)+e), 0, 1); -} - -void main(){ - - if(any(greaterThanEqual(gl_GlobalInvocationID.xy, imageSize(outImage)))){ - return; - } - ivec2 textureRes = textureSize(sampler2D(inTexture, textureSampler), 0); - ivec2 coord = ivec2(gl_GlobalInvocationID.xy); - vec2 uv = vec2(coord) / textureRes; - - vec3 linearColor = texture(sampler2D(inTexture, textureSampler), uv).rgb; - vec3 tonemapped = ACESFilm(linearColor); - - imageStore(outImage, coord, vec4(tonemapped, 0.f)); -} \ No newline at end of file diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp index 9b9bf39b205cd65b8a0f5813b7f4376ee68152a9..d9d9aedcc5a32552b83e2d9fe48733410ec2f9c7 100644 --- a/projects/voxelization/src/main.cpp +++ b/projects/voxelization/src/main.cpp @@ -4,7 +4,6 @@ #include <vkcv/Sampler.hpp> #include <GLFW/glfw3.h> #include <vkcv/camera/CameraManager.hpp> -#include <chrono> #include <vkcv/asset/asset_loader.hpp> #include <vkcv/shader/GLSLCompiler.hpp> #include "Voxelization.hpp" @@ -15,6 +14,7 @@ #include <vkcv/upscaling/NISUpscaling.hpp> #include <vkcv/effects/BloomAndFlaresEffect.hpp> #include <vkcv/algorithm/SinglePassDownsampler.hpp> +#include <vkcv/tone/ACESToneMapping.hpp> int main(int argc, const char** argv) { const std::string applicationName = "Voxelization"; @@ -474,21 +474,6 @@ int main(int argc, const char** argv) { renderUI = !renderUI; } }); - - // tonemapping compute shader - vkcv::ShaderProgram tonemappingProgram; - compiler.compile(vkcv::ShaderStage::COMPUTE, "assets/shaders/tonemapping.comp", - [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { - tonemappingProgram.addShader(shaderStage, path); - }); - - vkcv::DescriptorSetLayoutHandle tonemappingDescriptorSetLayout = core.createDescriptorSetLayout( - tonemappingProgram.getReflectedDescriptors().at(0)); - vkcv::DescriptorSetHandle tonemappingDescriptorSet = core.createDescriptorSet(tonemappingDescriptorSetLayout); - vkcv::ComputePipelineHandle tonemappingPipeline = core.createComputePipeline({ - tonemappingProgram, - { tonemappingDescriptorSetLayout } - }); // tonemapping compute shader vkcv::ShaderProgram postEffectsProgram; @@ -609,6 +594,8 @@ int main(int argc, const char** argv) { ); core.writeDescriptorSet(forwardShadingDescriptorSet, forwardDescriptorWrites); + + vkcv::tone::ACESToneMapping acesToneMapping (core); vkcv::upscaling::FSRUpscaling upscaling (core); uint32_t fsrWidth = swapchainExtent.width, fsrHeight = swapchainExtent.height; @@ -729,14 +716,6 @@ int main(int argc, const char** argv) { swapBufferConfig ); } - - // update descriptor sets which use swapchain image - vkcv::DescriptorWrites tonemappingDescriptorWrites; - tonemappingDescriptorWrites.writeSampledImage(0, resolvedColorBuffer); - tonemappingDescriptorWrites.writeSampler(1, colorSampler); - tonemappingDescriptorWrites.writeStorageImage(2, swapBuffer); - - core.writeDescriptorSet(tonemappingDescriptorSet, tonemappingDescriptorWrites); // update descriptor sets which use swapchain image vkcv::DescriptorWrites postEffectsDescriptorWrites; @@ -892,22 +871,10 @@ int main(int argc, const char** argv) { bloomFlares.updateCameraDirection(cameraManager.getActiveCamera()); bloomFlares.recordEffect(cmdStream, resolvedColorBuffer, resolvedColorBuffer); - - core.prepareImageForStorage(cmdStream, swapBuffer); - core.prepareImageForSampling(cmdStream, resolvedColorBuffer); - - core.recordBeginDebugLabel(cmdStream, "Tonemapping", { 1, 1, 1, 1 }); - core.recordComputeDispatchToCmdStream( - cmdStream, - tonemappingPipeline, - fullscreenDispatchCount, - { vkcv::useDescriptorSet(0, tonemappingDescriptorSet) }, - vkcv::PushConstants(0) - ); + acesToneMapping.recordToneMapping(cmdStream, resolvedColorBuffer, swapBuffer); core.prepareImageForStorage(cmdStream, swapBuffer2); core.prepareImageForSampling(cmdStream, swapBuffer); - core.recordEndDebugLabel(cmdStream); switch (upscalingMode) { case 0: @@ -1011,23 +978,6 @@ int main(int argc, const char** argv) { } } - if (ImGui::Button("Reload tonemapping")) { - vkcv::ShaderProgram newProgram; - compiler.compile(vkcv::ShaderStage::COMPUTE, std::filesystem::path("assets/shaders/tonemapping.comp"), - [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { - newProgram.addShader(shaderStage, path); - }); - - vkcv::ComputePipelineHandle newPipeline = core.createComputePipeline({ - newProgram, - { tonemappingDescriptorSetLayout } - }); - - if (newPipeline) { - tonemappingPipeline = newPipeline; - } - } - ImGui::End(); }