From 7062992d9b5a6b64277e5bb2366be87b109232af Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Wed, 16 Sep 2020 16:58:21 -0700 Subject: [PATCH] dynamic shadow bias --- Effects/FXB/DeferredPBREffect.fxb | Bin 52160 -> 52564 bytes Effects/HLSL/DeferredPBREffect.fx | 21 +++++++++++---------- Renderer.cs | 23 ++++++++--------------- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/Effects/FXB/DeferredPBREffect.fxb b/Effects/FXB/DeferredPBREffect.fxb index a9961cf37ec65f66aecf53a97bebf2335aa4df03..5934933a7e19ec1cde2840c6542e7438fa47a5c7 100644 GIT binary patch literal 52564 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 wzF6z*qHh6h_C&pLpdoq6wLTB|-!Hs+2LJ#7 diff --git a/Effects/HLSL/DeferredPBREffect.fx b/Effects/HLSL/DeferredPBREffect.fx index 65c1eb9..c64a9f2 100644 --- a/Effects/HLSL/DeferredPBREffect.fx +++ b/Effects/HLSL/DeferredPBREffect.fx @@ -73,9 +73,10 @@ float GeometrySmith(float3 N, float3 V, float3 L, float roughness) return ggx1 * ggx2; } -float ComputeShadow(float4 positionLightSpace) +float ComputeShadow(float4 positionLightSpace, float3 N, float L) { - float bias = 0.001; //0.005; + float bias = 0.005 * tan(acos(dot(N, L))); + bias = clamp(bias, 0, 0.01); // maps to [-1, 1] float3 projectionCoords = positionLightSpace.xyz / positionLightSpace.w; @@ -99,7 +100,7 @@ float ComputeShadow(float4 positionLightSpace) } float3 ComputeLight( - float3 lightDir, + float3 L, float3 radiance, float3 F0, float3 V, @@ -109,7 +110,6 @@ float3 ComputeLight( float roughness, float shadow ) { - float3 L = normalize(lightDir); float3 H = normalize(V + L); float NDF = DistributionGGX(N, H, roughness); @@ -136,9 +136,6 @@ float4 ComputeColor( float metallic, float roughness ) { - float4 positionLightSpace = mul(float4(worldPosition, 1.0), LightSpaceMatrix); - float shadow = ComputeShadow(positionLightSpace); - float3 V = normalize(EyePosition - worldPosition); float3 N = normalize(worldNormal); @@ -151,18 +148,22 @@ float4 ComputeColor( for (int i = 0; i < MAX_POINT_LIGHTS; i++) { float3 lightDir = PointLightPositions[i] - worldPosition; + float3 L = normalize(lightDir); float distance = length(lightDir); float attenuation = 1.0 / (distance * distance); float3 radiance = PointLightColors[i] * attenuation; - Lo += ComputeLight(lightDir, radiance, F0, V, N, albedo, metallic, roughness, 1.0); + Lo += ComputeLight(L, radiance, F0, V, N, albedo, metallic, roughness, 1.0); } // directional light - float3 lightDir = DirectionalLightDirection; + float3 L = normalize(DirectionalLightDirection); float3 radiance = DirectionalLightColor; - Lo += ComputeLight(lightDir, radiance, F0, V, N, albedo, metallic, roughness, (1.0 - shadow)); + float4 positionLightSpace = mul(float4(worldPosition, 1.0), LightSpaceMatrix); + float shadow = ComputeShadow(positionLightSpace, N, L); + + Lo += ComputeLight(L, radiance, F0, V, N, albedo, metallic, roughness, (1.0 - shadow)); float3 ambient = float3(0.03, 0.03, 0.03) * albedo; // * AO; float3 color = ambient + Lo; diff --git a/Renderer.cs b/Renderer.cs index 058a383..d5d136f 100644 --- a/Renderer.cs +++ b/Renderer.cs @@ -171,7 +171,6 @@ namespace Kav SpriteBatch.End(); } - // for shadow mapping public void ShadowMapRender(Camera camera, IEnumerable<(Model, Matrix)> modelTransforms, DirectionalLight directionalLight) { GraphicsDevice.SetRenderTarget(ShadowRenderTarget); @@ -199,24 +198,18 @@ namespace Kav } BoundingBox lightBox = BoundingBox.CreateFromPoints(frustumCorners); - Vector3 boxSize = lightBox.Max - lightBox.Min; - Vector3 halfBoxSize = boxSize * 0.5f; - Vector3 lightPosition = frustumCenter + directionalLight.Direction * -lightBox.Min.Z; - //lightPosition.Z = lightBox.Min.Z; - //lightPosition = Vector3.Transform(lightPosition, Matrix.Invert(lightRotation)); SimpleDepthEffect.View = Matrix.CreateLookAt(lightPosition, frustumCenter, camera.View.Right); - SimpleDepthEffect.Projection = Matrix.CreateOrthographicOffCenter(lightBox.Min.X, lightBox.Max.X, lightBox.Min.Y, lightBox.Max.Y, 0, lightBox.Max.Z - lightBox.Min.Z); - - //SimpleDepthEffect.View = directionalLight.View; - //SimpleDepthEffect.Projection = directionalLight.Projection; + SimpleDepthEffect.Projection = Matrix.CreateOrthographicOffCenter( + lightBox.Min.X, + lightBox.Max.X, + lightBox.Min.Y, + lightBox.Max.Y, + 0, + lightBox.Max.Z - lightBox.Min.Z + ); DeferredPBREffect.LightSpaceMatrix = SimpleDepthEffect.View * SimpleDepthEffect.Projection; - - var globalShadowView = Matrix.CreateLookAt(frustumCenter + directionalLight.Direction * -0.5f, frustumCenter, camera.View.Right); - var globalShadowProjection = Matrix.CreateOrthographic(1f, 1f, 0f, 1f); - //var texScaleBias = Matrix.CreateScale(0.5f, -0.5f, 1f) * Matrix.CreateTranslation(0.5f, 0.5f, 0f); - //DeferredPBREffect.LightSpaceMatrix = globalShadowView * globalShadowProjection; // * texScaleBias; foreach (var (model, transform) in modelTransforms) {