From 16afca0e095769b676c7de1b65189bbca2b6f4cc Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Tue, 22 Jun 2021 15:15:22 +0200
Subject: [PATCH] [#82] Enable depth clamp to avoid cutting off shadows

---
 include/vkcv/PipelineConfig.hpp             | 1 +
 projects/voxelization/src/ShadowMapping.cpp | 6 ++++--
 projects/voxelization/src/ShadowMapping.hpp | 4 +++-
 projects/voxelization/src/main.cpp          | 3 ++-
 src/vkcv/Context.cpp                        | 1 +
 src/vkcv/PipelineManager.cpp                | 2 +-
 6 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/include/vkcv/PipelineConfig.hpp b/include/vkcv/PipelineConfig.hpp
index 1e00c520..db9a5923 100644
--- a/include/vkcv/PipelineConfig.hpp
+++ b/include/vkcv/PipelineConfig.hpp
@@ -25,6 +25,7 @@ namespace vkcv {
         bool                                  m_UseDynamicViewport;
         bool                                  m_UseConservativeRasterization = false;
         PrimitiveTopology                     m_PrimitiveTopology = PrimitiveTopology::TriangleList;
+        bool                                  m_EnableDepthClamping = false;
     };
 
 }
\ No newline at end of file
diff --git a/projects/voxelization/src/ShadowMapping.cpp b/projects/voxelization/src/ShadowMapping.cpp
index 25d760b4..5e4901e5 100644
--- a/projects/voxelization/src/ShadowMapping.cpp
+++ b/projects/voxelization/src/ShadowMapping.cpp
@@ -30,7 +30,7 @@ ShadowMapping::ShadowMapping(vkcv::Core* corePtr, const vkcv::VertexLayout& vert
 	};
 	const vkcv::PassConfig shadowPassConfig(shadowAttachments);
 	m_shadowMapPass = corePtr->createPass(shadowPassConfig);
-	const vkcv::PipelineConfig shadowPipeConfig{
+	vkcv::PipelineConfig shadowPipeConfig{
 		shadowShader,
 		shadowMapResolution,
 		shadowMapResolution,
@@ -39,6 +39,7 @@ ShadowMapping::ShadowMapping(vkcv::Core* corePtr, const vkcv::VertexLayout& vert
 		{},
 		false
 	};
+	shadowPipeConfig.m_EnableDepthClamping = true;
 	m_shadowMapPipe = corePtr->createGraphicsPipeline(shadowPipeConfig);
 
 	// shadow map
@@ -56,7 +57,8 @@ void ShadowMapping::recordShadowMapRendering(
 	const glm::vec3&                    lightColor,
 	const float                         lightStrength,
 	const std::vector<vkcv::Mesh>&      meshes,
-	const std::vector<glm::mat4>&       modelMatrices) {
+	const std::vector<glm::mat4>&       modelMatrices,
+	const vkcv::camera::Camera&         camera) {
 
 	LightInfo lightInfo;
 	lightInfo.sunColor      = lightColor;
diff --git a/projects/voxelization/src/ShadowMapping.hpp b/projects/voxelization/src/ShadowMapping.hpp
index 0b7a12cd..295dbae3 100644
--- a/projects/voxelization/src/ShadowMapping.hpp
+++ b/projects/voxelization/src/ShadowMapping.hpp
@@ -1,5 +1,6 @@
 #pragma once
 #include <vkcv/core.hpp>
+#include <vkcv/camera/Camera.hpp>
 
 #define GLM_DEPTH_ZERO_TO_ONE
 #define GLM_FORCE_LEFT_HANDED
@@ -24,7 +25,8 @@ public:
 		const glm::vec3&                    lightColor,
 		const float                         lightStrength,
 		const std::vector<vkcv::Mesh>&      meshes,
-		const std::vector<glm::mat4>&       modelMatrices);
+		const std::vector<glm::mat4>&       modelMatrices,
+		const vkcv::camera::Camera&         camera);
 
 	vkcv::ImageHandle   getShadowMap();
 	vkcv::SamplerHandle getShadowSampler();
diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp
index 62a1bc6f..d86b8297 100644
--- a/projects/voxelization/src/main.cpp
+++ b/projects/voxelization/src/main.cpp
@@ -374,7 +374,8 @@ int main(int argc, const char** argv) {
 			lightColor,
 			lightStrength,
 			meshes,
-			modelMatrices);
+			modelMatrices,
+			cameraManager.getActiveCamera());
 
 		// voxelization
 		voxelization.setVoxelExtent(voxelizationExtent);
diff --git a/src/vkcv/Context.cpp b/src/vkcv/Context.cpp
index ac133d1a..e23213b4 100644
--- a/src/vkcv/Context.cpp
+++ b/src/vkcv/Context.cpp
@@ -280,6 +280,7 @@ namespace vkcv
 		vk::PhysicalDeviceFeatures deviceFeatures;
 		deviceFeatures.fragmentStoresAndAtomics = true;
 		deviceFeatures.geometryShader = true;
+		deviceFeatures.depthClamp = true;
 		deviceCreateInfo.pEnabledFeatures = &deviceFeatures;
 
 		// Ablauf
diff --git a/src/vkcv/PipelineManager.cpp b/src/vkcv/PipelineManager.cpp
index df36442e..5ac2d978 100644
--- a/src/vkcv/PipelineManager.cpp
+++ b/src/vkcv/PipelineManager.cpp
@@ -146,7 +146,7 @@ namespace vkcv
         // rasterization state
         vk::PipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo(
                 {},
-                false,
+                config.m_EnableDepthClamping,
                 false,
                 vk::PolygonMode::eFill,
                 vk::CullModeFlagBits::eNone,
-- 
GitLab