| const shadowDepthTextureSize : f32 = 1024.0; |
| |
| struct Scene { |
| lightViewProjMatrix : mat4x4<f32>, |
| cameraViewProjMatrix : mat4x4<f32>, |
| lightPos : vec3<f32>, |
| } |
| |
| @group(0) @binding(0) var<uniform> scene : Scene; |
| |
| @group(0) @binding(1) var shadowMap : texture_depth_2d; |
| |
| @group(0) @binding(2) var shadowSampler : sampler_comparison; |
| |
| struct FragmentInput { |
| @location(0) |
| shadowPos : vec3<f32>, |
| @location(1) |
| fragPos : vec3<f32>, |
| @location(2) |
| fragNorm : vec3<f32>, |
| } |
| |
| const albedo : vec3<f32> = vec3<f32>(0.899999976, 0.899999976, 0.899999976); |
| |
| const ambientFactor : f32 = 0.200000003; |
| |
| @fragment |
| fn main(input : FragmentInput) -> @location(0) vec4<f32> { |
| var visibility : f32 = 0.0; |
| let oneOverShadowDepthTextureSize = (1.0 / shadowDepthTextureSize); |
| for(var y : i32 = -1; (y <= 1); y = (y + 1)) { |
| for(var x : i32 = -1; (x <= 1); x = (x + 1)) { |
| let offset : vec2<f32> = vec2<f32>((f32(x) * oneOverShadowDepthTextureSize), (f32(y) * oneOverShadowDepthTextureSize)); |
| visibility = (visibility + textureSampleCompare(shadowMap, shadowSampler, (input.shadowPos.xy + offset), (input.shadowPos.z - 0.007))); |
| } |
| } |
| visibility = (visibility / 9.0); |
| let lambertFactor : f32 = max(dot(normalize((scene.lightPos - input.fragPos)), input.fragNorm), 0.0); |
| let lightingFactor : f32 = min((ambientFactor + (visibility * lambertFactor)), 1.0); |
| return vec4<f32>((lightingFactor * albedo), 1.0); |
| } |