diff --git a/projects/voxelization/resources/shaders/shader.frag b/projects/voxelization/resources/shaders/shader.frag index d27f8c767cf7cb99706995d20f90f2dd93f8ed52..eff75dde4b735a49b7be13c8d5f1b53241499007 100644 --- a/projects/voxelization/resources/shaders/shader.frag +++ b/projects/voxelization/resources/shaders/shader.frag @@ -85,7 +85,11 @@ void main() { vec3 sunSpecular = cookTorrance(f0, r, N, V, L); vec3 sun = lightInfo.sunStrength * lightInfo.sunColor * NoL; - sun *= shadowTest(passPos, lightInfo, shadowMap, shadowMapSampler); + + float noise = 2 * pi * interleavedGradientNoise(gl_FragCoord.xy); + vec2 shadowOffset = vec2(sin(noise), cos(noise)) * 0.00008; + float shadow = shadowTest(passPos, lightInfo, shadowMap, shadowMapSampler, shadowOffset); + sun *= shadow; vec3 F_in = fresnelSchlick(NoL, f0); vec3 F_out = fresnelSchlick(NoV, f0); @@ -110,5 +114,4 @@ 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/shadowBlur.comp b/projects/voxelization/resources/shaders/shadowBlur.comp index f5c3834099111c7aebe8efc04c4caf9fa1197114..3cf744ab79108c5a9c619524dd8824c39886b357 100644 --- a/projects/voxelization/resources/shaders/shadowBlur.comp +++ b/projects/voxelization/resources/shaders/shadowBlur.comp @@ -16,7 +16,7 @@ void main(){ } ivec2 coord = ivec2(gl_GlobalInvocationID.xy); - int blurRadius = 5; + int blurRadius = 9; int minOffset = -(blurRadius-1) / 2; int maxOffset = -minOffset; @@ -25,7 +25,7 @@ void main(){ float wTotal = 0; vec4 moments = vec4(0); - float weights1D[3] = { 0.5, 0.25, 0.125 }; // gaussian + float weights1D[4] = { 0.5, 0.25, 0.125, 0.0625 }; // gaussian for(int x = minOffset; x <= maxOffset; x++){ for(int y = minOffset; y <= maxOffset; y++){ diff --git a/projects/voxelization/resources/shaders/shadowMapping.inc b/projects/voxelization/resources/shaders/shadowMapping.inc index 09f01f19fca8198e1f1037c7b3335667878e21e4..c97e0b81492633175f5419495b29f94db99df0a1 100644 --- a/projects/voxelization/resources/shaders/shadowMapping.inc +++ b/projects/voxelization/resources/shaders/shadowMapping.inc @@ -59,10 +59,11 @@ vec4 unquantizeMoments(vec4 moments){ return T * moments; } -float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sampler shadowMapSampler){ +float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sampler shadowMapSampler, vec2 offset){ vec4 lightPos = lightInfo.lightMatrix * vec4(worldPos, 1); lightPos /= lightPos.w; lightPos.xy = lightPos.xy * 0.5 + 0.5; + lightPos.xy += offset; if(any(lessThan(lightPos.xy, vec2(0))) || any(greaterThan(lightPos.xy, vec2(1)))){ return 1; @@ -75,7 +76,7 @@ float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sample shadowMapSample = unquantizeMoments(shadowMapSample); float depthBias = 0.f; - float momentBias = 0.00003; + float momentBias = 0.00005; return 1-ComputeMSMShadowIntensity(shadowMapSample, lightPos.z, depthBias, momentBias); } diff --git a/projects/voxelization/resources/shaders/voxelization.frag b/projects/voxelization/resources/shaders/voxelization.frag index 3e5ce1fc1a6321a8d0115729fe10d0f20f0c32cb..0bbd26bff249db1390399b26f2f4b5a139195fef 100644 --- a/projects/voxelization/resources/shaders/voxelization.frag +++ b/projects/voxelization/resources/shaders/voxelization.frag @@ -42,7 +42,7 @@ void main() { vec3 N = normalize(passN); float NoL = clamp(dot(N, lightInfo.L), 0, 1); - vec3 sun = lightInfo.sunStrength * lightInfo.sunColor * NoL * shadowTest(passPos, lightInfo, shadowMap, shadowMapSampler); + vec3 sun = lightInfo.sunStrength * lightInfo.sunColor * NoL * shadowTest(passPos, lightInfo, shadowMap, shadowMapSampler, vec2(0)); vec3 color = albedo * sun; color = lambertBRDF(albedo) * sun; diff --git a/projects/voxelization/src/ShadowMapping.cpp b/projects/voxelization/src/ShadowMapping.cpp index e0f5567a19f2e73cf27a705b4cac8260644417dd..3e5fb9fae33bbc5438f875747629ed6070b59727 100644 --- a/projects/voxelization/src/ShadowMapping.cpp +++ b/projects/voxelization/src/ShadowMapping.cpp @@ -123,10 +123,10 @@ glm::mat4 computeShadowViewProjectionMatrix( return vulkanCorrectionMatrix * crop * view; } -const vk::Format shadowMapFormat = vk::Format::eR16G16B16A16Unorm; +const vk::Format shadowMapFormat = vk::Format::eR32G32B32A32Sfloat; const vk::Format shadowMapDepthFormat = vk::Format::eD32Sfloat; -const uint32_t shadowMapResolution = 2048; -const vkcv::Multisampling msaa = vkcv::Multisampling::MSAA4X; +const uint32_t shadowMapResolution = 1024; +const vkcv::Multisampling msaa = vkcv::Multisampling::MSAA8X; ShadowMapping::ShadowMapping(vkcv::Core* corePtr, const vkcv::VertexLayout& vertexLayout) : m_corePtr(corePtr), diff --git a/projects/voxelization/src/Voxelization.cpp b/projects/voxelization/src/Voxelization.cpp index b62bb42ae1557eafca67475d760a8af502db3c62..a5105bd26cc171d884075ebf5dc0e8f3d511e949 100644 --- a/projects/voxelization/src/Voxelization.cpp +++ b/projects/voxelization/src/Voxelization.cpp @@ -80,7 +80,8 @@ Voxelization::Voxelization( vkcv::BufferHandle lightInfoBuffer, vkcv::ImageHandle shadowMap, vkcv::SamplerHandle shadowSampler, - vkcv::SamplerHandle voxelSampler) + vkcv::SamplerHandle voxelSampler, + vkcv::Multisampling msaa) : m_corePtr(corePtr), m_voxelImage(m_corePtr->createImage(vk::Format::eR16G16B16A16Sfloat, voxelResolution, voxelResolution, voxelResolution, true, true)), @@ -148,9 +149,10 @@ Voxelization::Voxelization( vkcv::PassConfig voxelVisualisationPassDefinition( { voxelVisualisationColorAttachments, voxelVisualisationDepthAttachments }); + voxelVisualisationPassDefinition.msaa = msaa; m_visualisationPass = m_corePtr->createPass(voxelVisualisationPassDefinition); - const vkcv::PipelineConfig voxelVisualisationPipeConfig{ + vkcv::PipelineConfig voxelVisualisationPipeConfig{ voxelVisualisationShader, 0, 0, @@ -160,6 +162,7 @@ Voxelization::Voxelization( true, false, vkcv::PrimitiveTopology::PointList }; // points are extended to cubes in the geometry shader + voxelVisualisationPipeConfig.m_multisampling = msaa; m_visualisationPipe = m_corePtr->createGraphicsPipeline(voxelVisualisationPipeConfig); std::vector<uint16_t> voxelIndexData; diff --git a/projects/voxelization/src/Voxelization.hpp b/projects/voxelization/src/Voxelization.hpp index e200f660d005e2a26eb8cbf7dd1020b072cd50d2..66c87acb3c13c0d950a28dc33e4084d728da5947 100644 --- a/projects/voxelization/src/Voxelization.hpp +++ b/projects/voxelization/src/Voxelization.hpp @@ -16,7 +16,8 @@ public: vkcv::BufferHandle lightInfoBuffer, vkcv::ImageHandle shadowMap, vkcv::SamplerHandle shadowSampler, - vkcv::SamplerHandle voxelSampler); + vkcv::SamplerHandle voxelSampler, + vkcv::Multisampling msaa); void voxelizeMeshes( vkcv::CommandStreamHandle cmdStream, diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp index a5395baca1edc604c15762e41bd2a0017bb2c7c4..a9c899f3a2b481f9dbc102a963488a6cf8a7fa00 100644 --- a/projects/voxelization/src/main.cpp +++ b/projects/voxelization/src/main.cpp @@ -337,7 +337,8 @@ int main(int argc, const char** argv) { shadowMapping.getLightInfoBuffer(), shadowMapping.getShadowMap(), shadowMapping.getShadowSampler(), - voxelSampler); + voxelSampler, + msaa); vkcv::Buffer<glm::vec3> cameraPosBuffer = core.createBuffer<glm::vec3>(vkcv::BufferType::UNIFORM, 1);