diff --git a/data/shaders/glsl/shadowmapping/offscreen.frag.spv b/data/shaders/glsl/shadowmapping/offscreen.frag.spv index 4d3440f8..4caadfac 100644 Binary files a/data/shaders/glsl/shadowmapping/offscreen.frag.spv and b/data/shaders/glsl/shadowmapping/offscreen.frag.spv differ diff --git a/data/shaders/glsl/shadowmapping/offscreen.vert.spv b/data/shaders/glsl/shadowmapping/offscreen.vert.spv index e5c7931d..8b456320 100644 Binary files a/data/shaders/glsl/shadowmapping/offscreen.vert.spv and b/data/shaders/glsl/shadowmapping/offscreen.vert.spv differ diff --git a/data/shaders/glsl/shadowmapping/quad.frag b/data/shaders/glsl/shadowmapping/quad.frag index afd8389f..86815ca7 100644 --- a/data/shaders/glsl/shadowmapping/quad.frag +++ b/data/shaders/glsl/shadowmapping/quad.frag @@ -6,10 +6,21 @@ layout (location = 0) in vec2 inUV; layout (location = 0) out vec4 outFragColor; +layout (binding = 0) uniform UBO +{ + mat4 projection; + mat4 view; + mat4 model; + mat4 lightSpace; + vec4 lightPos; + float zNear; + float zFar; +} ubo; + float LinearizeDepth(float depth) { - float n = 1.0; // camera z near - float f = 128.0; // camera z far + float n = ubo.zNear; + float f = ubo.zFar; float z = depth; return (2.0 * n) / (f + n - z * (f - n)); } diff --git a/data/shaders/glsl/shadowmapping/quad.frag.spv b/data/shaders/glsl/shadowmapping/quad.frag.spv index 13c24dee..88c56a21 100644 Binary files a/data/shaders/glsl/shadowmapping/quad.frag.spv and b/data/shaders/glsl/shadowmapping/quad.frag.spv differ diff --git a/data/shaders/glsl/shadowmapping/quad.vert.spv b/data/shaders/glsl/shadowmapping/quad.vert.spv index 5683fcb3..822048d7 100644 Binary files a/data/shaders/glsl/shadowmapping/quad.vert.spv and b/data/shaders/glsl/shadowmapping/quad.vert.spv differ diff --git a/data/shaders/glsl/shadowmapping/scene.frag.spv b/data/shaders/glsl/shadowmapping/scene.frag.spv index 3f308890..5f723ab7 100644 Binary files a/data/shaders/glsl/shadowmapping/scene.frag.spv and b/data/shaders/glsl/shadowmapping/scene.frag.spv differ diff --git a/data/shaders/glsl/shadowmapping/scene.vert b/data/shaders/glsl/shadowmapping/scene.vert index a9531b86..55bb5ea1 100644 --- a/data/shaders/glsl/shadowmapping/scene.vert +++ b/data/shaders/glsl/shadowmapping/scene.vert @@ -11,7 +11,9 @@ layout (binding = 0) uniform UBO mat4 view; mat4 model; mat4 lightSpace; - vec3 lightPos; + vec4 lightPos; + float zNear; + float zFar; } ubo; layout (location = 0) out vec3 outNormal; @@ -20,11 +22,6 @@ layout (location = 2) out vec3 outViewVec; layout (location = 3) out vec3 outLightVec; layout (location = 4) out vec4 outShadowCoord; -out gl_PerVertex -{ - vec4 gl_Position; -}; - const mat4 biasMat = mat4( 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, @@ -40,7 +37,7 @@ void main() vec4 pos = ubo.model * vec4(inPos, 1.0); outNormal = mat3(ubo.model) * inNormal; - outLightVec = normalize(ubo.lightPos - inPos); + outLightVec = normalize(ubo.lightPos.xyz - inPos); outViewVec = -pos.xyz; outShadowCoord = ( biasMat * ubo.lightSpace * ubo.model ) * vec4(inPos, 1.0); diff --git a/data/shaders/glsl/shadowmapping/scene.vert.spv b/data/shaders/glsl/shadowmapping/scene.vert.spv index b9b21407..1782e100 100644 Binary files a/data/shaders/glsl/shadowmapping/scene.vert.spv and b/data/shaders/glsl/shadowmapping/scene.vert.spv differ diff --git a/data/shaders/hlsl/shadowmapping/offscreen.frag.spv b/data/shaders/hlsl/shadowmapping/offscreen.frag.spv index 199649f3..edf3c6e0 100644 Binary files a/data/shaders/hlsl/shadowmapping/offscreen.frag.spv and b/data/shaders/hlsl/shadowmapping/offscreen.frag.spv differ diff --git a/data/shaders/hlsl/shadowmapping/offscreen.vert.spv b/data/shaders/hlsl/shadowmapping/offscreen.vert.spv index 886d2353..3c5406dc 100644 Binary files a/data/shaders/hlsl/shadowmapping/offscreen.vert.spv and b/data/shaders/hlsl/shadowmapping/offscreen.vert.spv differ diff --git a/data/shaders/hlsl/shadowmapping/quad.frag b/data/shaders/hlsl/shadowmapping/quad.frag index fb90f429..419f9569 100644 --- a/data/shaders/hlsl/shadowmapping/quad.frag +++ b/data/shaders/hlsl/shadowmapping/quad.frag @@ -3,10 +3,23 @@ Texture2D textureColor : register(t1); SamplerState samplerColor : register(s1); +struct UBO +{ + float4x4 projection; + float4x4 view; + float4x4 model; + float4x4 lightSpace; + float4 lightPos; + float zNear; + float zFar; +}; + +cbuffer ubo : register(b0) { UBO ubo; } + float LinearizeDepth(float depth) { - float n = 1.0; // camera z near - float f = 128.0; // camera z far + float n = ubo.zNear; + float f = ubo.zFar; float z = depth; return (2.0 * n) / (f + n - z * (f - n)); } diff --git a/data/shaders/hlsl/shadowmapping/quad.frag.spv b/data/shaders/hlsl/shadowmapping/quad.frag.spv index 10e04bc3..c7fda72a 100644 Binary files a/data/shaders/hlsl/shadowmapping/quad.frag.spv and b/data/shaders/hlsl/shadowmapping/quad.frag.spv differ diff --git a/data/shaders/hlsl/shadowmapping/scene.frag.spv b/data/shaders/hlsl/shadowmapping/scene.frag.spv index db20337f..893c37ba 100644 Binary files a/data/shaders/hlsl/shadowmapping/scene.frag.spv and b/data/shaders/hlsl/shadowmapping/scene.frag.spv differ diff --git a/data/shaders/hlsl/shadowmapping/scene.vert b/data/shaders/hlsl/shadowmapping/scene.vert index 583b6a8e..30ad6138 100644 --- a/data/shaders/hlsl/shadowmapping/scene.vert +++ b/data/shaders/hlsl/shadowmapping/scene.vert @@ -14,7 +14,9 @@ struct UBO float4x4 view; float4x4 model; float4x4 lightSpace; - float3 lightPos; + float4 lightPos; + float zNear; + float zFar; }; cbuffer ubo : register(b0) { UBO ubo; } @@ -45,7 +47,7 @@ VSOutput main(VSInput input) float4 pos = mul(ubo.model, float4(input.Pos, 1.0)); output.Normal = mul((float3x3)ubo.model, input.Normal); - output.LightVec = normalize(ubo.lightPos - input.Pos); + output.LightVec = normalize(ubo.lightPos.xyz - input.Pos); output.ViewVec = -pos.xyz; output.ShadowCoord = mul(biasMat, mul(ubo.lightSpace, mul(ubo.model, float4(input.Pos, 1.0)))); diff --git a/data/shaders/hlsl/shadowmapping/scene.vert.spv b/data/shaders/hlsl/shadowmapping/scene.vert.spv index 5ca9d59d..8e1c467f 100644 Binary files a/data/shaders/hlsl/shadowmapping/scene.vert.spv and b/data/shaders/hlsl/shadowmapping/scene.vert.spv differ diff --git a/examples/shadowmapping/shadowmapping.cpp b/examples/shadowmapping/shadowmapping.cpp index 0592b4fc..b0345ec9 100644 --- a/examples/shadowmapping/shadowmapping.cpp +++ b/examples/shadowmapping/shadowmapping.cpp @@ -56,7 +56,10 @@ public: glm::mat4 view; glm::mat4 model; glm::mat4 depthBiasMVP; - glm::vec3 lightPos; + glm::vec4 lightPos; + // Used for depth map visualization + float zNear; + float zFar; } uboVSscene; struct { @@ -384,7 +387,7 @@ public: // Shared pipeline layout for all pipelines used in this sample std::vector setLayoutBindings = { // Binding 0 : Vertex shader uniform buffer - vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, 0), + vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0), // Binding 1 : Fragment shader image sampler (shadow map) vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 1) }; @@ -409,6 +412,8 @@ public: VkDescriptorSetAllocateInfo allocInfo = vks::initializers::descriptorSetAllocateInfo(descriptorPool, &descriptorSetLayout, 1); VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.debug)); writeDescriptorSets = { + // Binding 0 : Parameters uniform buffer + vks::initializers::writeDescriptorSet(descriptorSets.debug, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffers.scene.descriptor), // Binding 1 : Fragment shader texture sampler vks::initializers::writeDescriptorSet(descriptorSets.debug, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &shadowMapDescriptor) }; @@ -542,8 +547,10 @@ public: uboVSscene.projection = camera.matrices.perspective; uboVSscene.view = camera.matrices.view; uboVSscene.model = glm::mat4(1.0f); - uboVSscene.lightPos = lightPos; + uboVSscene.lightPos = glm::vec4(lightPos, 1.0f); uboVSscene.depthBiasMVP = uboOffscreenVS.depthMVP; + uboVSscene.zNear = zNear; + uboVSscene.zFar = zFar; memcpy(uniformBuffers.scene.mapped, &uboVSscene, sizeof(uboVSscene)); }