From 419f54370ebec2e3f2de8e16635b882d1f1a3971 Mon Sep 17 00:00:00 2001 From: Alexander Gauggel <agauggel@uni-koblenz.de> Date: Sat, 19 Jun 2021 10:42:28 +0200 Subject: [PATCH] [#81] Add tonemapping --- .../resources/shaders/shader.frag | 2 +- ...{gammaCorrection.comp => tonemapping.comp} | 7 ++-- projects/voxelization/src/main.cpp | 36 +++++++++---------- 3 files changed, 23 insertions(+), 22 deletions(-) rename projects/voxelization/resources/shaders/{gammaCorrection.comp => tonemapping.comp} (60%) diff --git a/projects/voxelization/resources/shaders/shader.frag b/projects/voxelization/resources/shaders/shader.frag index def0ea0c..14d3f8fa 100644 --- a/projects/voxelization/resources/shaders/shader.frag +++ b/projects/voxelization/resources/shaders/shader.frag @@ -40,7 +40,7 @@ void main() { vec3 N = normalize(passNormal); vec3 sun = sunStrength * sunColor * clamp(dot(N, L), 0, 1); sun *= shadowTest(passPos); - vec3 ambient = vec3(0.1); + vec3 ambient = vec3(0.05); vec3 albedo = texture(sampler2D(albedoTexture, textureSampler), passUV).rgb; outColor = albedo * (sun + ambient); } \ No newline at end of file diff --git a/projects/voxelization/resources/shaders/gammaCorrection.comp b/projects/voxelization/resources/shaders/tonemapping.comp similarity index 60% rename from projects/voxelization/resources/shaders/gammaCorrection.comp rename to projects/voxelization/resources/shaders/tonemapping.comp index 411a59c3..2383302f 100644 --- a/projects/voxelization/resources/shaders/gammaCorrection.comp +++ b/projects/voxelization/resources/shaders/tonemapping.comp @@ -11,8 +11,9 @@ void main(){ if(any(greaterThanEqual(gl_GlobalInvocationID.xy, imageSize(inImage)))){ return; } - ivec2 uv = ivec2(gl_GlobalInvocationID.xy); - vec3 linearColor = imageLoad(inImage, uv).rgb; - vec3 gammaCorrected = pow(linearColor, vec3(1.f / 2.2f)); + ivec2 uv = ivec2(gl_GlobalInvocationID.xy); + vec3 linearColor = imageLoad(inImage, uv).rgb; + vec3 tonemapped = linearColor / (linearColor + 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/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp index 1fecb63e..ea4321a9 100644 --- a/projects/voxelization/src/main.cpp +++ b/projects/voxelization/src/main.cpp @@ -159,7 +159,7 @@ int main(int argc, const char** argv) { glm::vec3 direction; float padding; glm::vec3 sunColor = glm::vec3(1.f); - float sunStrength = 1.f; + float sunStrength = 8.f; glm::mat4 lightMatrix; }; LightInfo lightInfo; @@ -275,15 +275,15 @@ int main(int argc, const char** argv) { } }); - // gamma correction compute shader - vkcv::ShaderProgram gammaCorrectionProgram; - compiler.compile(vkcv::ShaderStage::COMPUTE, "resources/shaders/gammaCorrection.comp", + // tonemapping compute shader + vkcv::ShaderProgram tonemappingProgram; + compiler.compile(vkcv::ShaderStage::COMPUTE, "resources/shaders/tonemapping.comp", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { - gammaCorrectionProgram.addShader(shaderStage, path); + tonemappingProgram.addShader(shaderStage, path); }); - vkcv::DescriptorSetHandle gammaCorrectionDescriptorSet = core.createDescriptorSet(gammaCorrectionProgram.getReflectedDescriptors()[0]); - vkcv::PipelineHandle gammaCorrectionPipeline = core.createComputePipeline(gammaCorrectionProgram, - { core.getDescriptorSet(gammaCorrectionDescriptorSet).layout }); + vkcv::DescriptorSetHandle tonemappingDescriptorSet = core.createDescriptorSet(tonemappingProgram.getReflectedDescriptors()[0]); + vkcv::PipelineHandle tonemappingPipeline = core.createComputePipeline(tonemappingProgram, + { core.getDescriptorSet(tonemappingDescriptorSet).layout }); // model matrices per mesh std::vector<glm::mat4> modelMatrices; @@ -347,11 +347,11 @@ int main(int argc, const char** argv) { auto deltatime = std::chrono::duration_cast<std::chrono::microseconds>(end - start); // update descriptor sets which use swapchain image - vkcv::DescriptorWrites gammaCorrectionDescriptorWrites; - gammaCorrectionDescriptorWrites.storageImageWrites = { + vkcv::DescriptorWrites tonemappingDescriptorWrites; + tonemappingDescriptorWrites.storageImageWrites = { vkcv::StorageImageDescriptorWrite(0, colorBuffer), vkcv::StorageImageDescriptorWrite(1, swapchainInput) }; - core.writeDescriptorSet(gammaCorrectionDescriptorSet, gammaCorrectionDescriptorWrites); + core.writeDescriptorSet(tonemappingDescriptorSet, tonemappingDescriptorWrites); start = end; cameraManager.update(0.000001 * static_cast<double>(deltatime.count())); @@ -427,10 +427,10 @@ int main(int argc, const char** argv) { voxelization.renderVoxelVisualisation(cmdStream, viewProjectionCamera, renderTargets); } - const uint32_t gammaCorrectionLocalGroupSize = 8; - const uint32_t gammaCorrectionDispatchCount[3] = { - static_cast<uint32_t>(glm::ceil(windowWidth / static_cast<float>(gammaCorrectionLocalGroupSize))), - static_cast<uint32_t>(glm::ceil(windowHeight / static_cast<float>(gammaCorrectionLocalGroupSize))), + const uint32_t tonemappingLocalGroupSize = 8; + const uint32_t tonemappingDispatchCount[3] = { + static_cast<uint32_t>(glm::ceil(windowWidth / static_cast<float>(tonemappingLocalGroupSize))), + static_cast<uint32_t>(glm::ceil(windowHeight / static_cast<float>(tonemappingLocalGroupSize))), 1 }; @@ -439,9 +439,9 @@ int main(int argc, const char** argv) { core.recordComputeDispatchToCmdStream( cmdStream, - gammaCorrectionPipeline, - gammaCorrectionDispatchCount, - { vkcv::DescriptorSetUsage(0, core.getDescriptorSet(gammaCorrectionDescriptorSet).vulkanHandle) }, + tonemappingPipeline, + tonemappingDispatchCount, + { vkcv::DescriptorSetUsage(0, core.getDescriptorSet(tonemappingDescriptorSet).vulkanHandle) }, vkcv::PushConstantData(nullptr, 0)); // present and end -- GitLab