diff --git a/projects/voxelization/resources/shaders/shader.frag b/projects/voxelization/resources/shaders/shader.frag index e8f85919dff4ffe6fad21d4f718192e6631492fc..d27f8c767cf7cb99706995d20f90f2dd93f8ed52 100644 --- a/projects/voxelization/resources/shaders/shader.frag +++ b/projects/voxelization/resources/shaders/shader.frag @@ -110,4 +110,5 @@ void main() { (diffuse + sunSpecular) * sun + lambertBRDF(albedo) * diffuseTrace + reflectionBRDF * specularTrace; + outColor = sun; } \ No newline at end of file diff --git a/projects/voxelization/resources/shaders/shadow.frag b/projects/voxelization/resources/shaders/shadow.frag index 067b3798a9324f6ce68c302e578f5131b7a2c9c3..f98dc4369178d0f1917f9da88ecbdb3e49d6f13a 100644 --- a/projects/voxelization/resources/shaders/shadow.frag +++ b/projects/voxelization/resources/shaders/shadow.frag @@ -3,6 +3,7 @@ #extension GL_GOOGLE_include_directive : enable #include "lightInfo.inc" +#include "shadowMapping.inc" layout(set=0, binding=0) uniform LightInfoBuffer { LightInfo lightInfo; @@ -16,4 +17,6 @@ void main() { float z = passPos.z / passPos.w; float z2 = z*z; outMoments = vec4(z, z2, z2*z, z2*z2); + + outMoments = quantizeMoments(outMoments); } \ No newline at end of file diff --git a/projects/voxelization/resources/shaders/shadowMapping.inc b/projects/voxelization/resources/shaders/shadowMapping.inc index 7f92067fb978ec6ae9d6f0d89bc3f7b966b3e83e..f75dabc76af7fc160c3c8b81c73abe3b986ebc07 100644 --- a/projects/voxelization/resources/shaders/shadowMapping.inc +++ b/projects/voxelization/resources/shaders/shadowMapping.inc @@ -38,6 +38,27 @@ float ComputeMSMShadowIntensity(vec4 _4Moments, float FragmentDepth, float Depth return clamp(Switch[2]+Switch[3]*Quotient, 0, 1); } +vec4 quantizeMoments(vec4 moments){ + mat4 T = mat4( + -2.07224649f, 13.7948857237f, 0.105877704f, 9.7924062118f, + 32.23703778f, -59.4683975703f, -1.9077466311f, -33.7652110555f, + -68.571074599f, 82.0359750338f, 9.3496555107f, 47.9456096605f, + 39.3703274134f, -35.364903257f, -6.6543490743f, -23.9728048165f); + vec4 quantized = T * moments; + quantized[0] += 0.0359558848; + return quantized; +} + +vec4 unquantizeMoments(vec4 moments){ + moments[0] -= 0.0359558848; + mat4 T = mat4( + 0.2227744146f, 0.1549679261f, 0.1451988946f, 0.163127443f, + 0.0771972861f, 0.1394629426f, 0.2120202157f, 0.2591432266f, + 0.7926986636f, 0.7963415838f, 0.7258694464f, 0.6539092497f, + 0.0319417555f, -0.1722823173f, -0.2758014811f, -0.3376131734f); + return T * moments; +} + float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sampler shadowMapSampler){ vec4 lightPos = lightInfo.lightMatrix * vec4(worldPos, 1); lightPos /= lightPos.w; @@ -47,12 +68,14 @@ float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sample return 1; } - lightPos.z = clamp(lightPos.z, 0, 1); + lightPos.z = clamp(lightPos.z, 0, 1); - vec4 shadowMapSample = texture(sampler2D(shadowMap, shadowMapSampler), lightPos.xy); + vec4 shadowMapSample = texture(sampler2D(shadowMap, shadowMapSampler), lightPos.xy); + + shadowMapSample = unquantizeMoments(shadowMapSample); - float depthBias = 0.f; - float momentBias = 0.000002; + float depthBias = 0.0f; + float momentBias = 0.00003; return 1-ComputeMSMShadowIntensity(shadowMapSample, lightPos.z, depthBias, momentBias); } diff --git a/projects/voxelization/src/ShadowMapping.cpp b/projects/voxelization/src/ShadowMapping.cpp index 83ce118a2f3c3df296bed2caac2386977f7dc47a..1373c9d275956a6f86a115cdb1fdfbee29c86832 100644 --- a/projects/voxelization/src/ShadowMapping.cpp +++ b/projects/voxelization/src/ShadowMapping.cpp @@ -103,7 +103,7 @@ glm::mat4 computeShadowViewProjectionMatrix( return vulkanCorrectionMatrix * crop * view; } -const vk::Format shadowMapFormat = vk::Format::eR32G32B32A32Sfloat; +const vk::Format shadowMapFormat = vk::Format::eR16G16B16A16Sfloat; const vk::Format shadowMapDepthFormat = vk::Format::eD16Unorm; const uint32_t shadowMapResolution = 2048;