From 3a89e9a09137f7b94817c8b16d7e029228618a0d Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Thu, 27 Aug 2020 22:57:15 -0700 Subject: [PATCH] pack directional shadow maps into a cubemap --- Effects/DeferredPBREffect.cs | 15 +++---- Effects/DirectionalLightCollection.cs | 12 ++++- Effects/FXB/DeferredPBREffect.fxb | Bin 54108 -> 52720 bytes Effects/HLSL/DeferredPBREffect.fx | 61 +++++++++++++++++++++----- Effects/PBREffect.cs | 6 ++- Lights/DirectionalLight.cs | 4 +- Renderer.cs | 28 +++++++----- 7 files changed, 90 insertions(+), 36 deletions(-) diff --git a/Effects/DeferredPBREffect.cs b/Effects/DeferredPBREffect.cs index 8b76aca..9569420 100644 --- a/Effects/DeferredPBREffect.cs +++ b/Effects/DeferredPBREffect.cs @@ -12,7 +12,6 @@ namespace Kav EffectParameter shadowMapParam; EffectParameter eyePositionParam; - EffectParameter lightSpaceMatrixParam; PointLightCollection pointLightCollection; DirectionalLightCollection directionalLightCollection; @@ -21,10 +20,9 @@ namespace Kav public Texture2D GAlbedo { get; set; } public Texture2D GNormal { get; set; } public Texture2D GMetallicRoughness { get; set; } - public Texture2D ShadowMap { get; set; } + public TextureCube DirectionalShadowMap { get; set; } public Vector3 EyePosition { get; set; } - public Matrix LightSpaceMatrix { get; set; } public int MaxPointLights { get; } = 64; @@ -54,7 +52,8 @@ namespace Kav DirectionalLights = new DirectionalLightCollection( Parameters["DirectionalLightDirections"], - Parameters["DirectionalLightColors"] + Parameters["DirectionalLightColors"], + Parameters["DirectionalLightMatrices"] ); } @@ -80,7 +79,8 @@ namespace Kav DirectionalLights = new DirectionalLightCollection( Parameters["DirectionalLightDirections"], - Parameters["DirectionalLightColors"] + Parameters["DirectionalLightColors"], + Parameters["DirectionalLightMatrices"] ); for (int i = 0; i < MaxDirectionalLights; i++) @@ -100,10 +100,9 @@ namespace Kav gAlbedoParam.SetValue(GAlbedo); gNormalParam.SetValue(GNormal); gMetallicRoughnessParam.SetValue(GMetallicRoughness); - shadowMapParam.SetValue(ShadowMap); + shadowMapParam.SetValue(DirectionalShadowMap); eyePositionParam.SetValue(EyePosition); - lightSpaceMatrixParam.SetValue(LightSpaceMatrix); } void CacheEffectParameters() @@ -115,8 +114,6 @@ namespace Kav shadowMapParam = Parameters["shadowMap"]; eyePositionParam = Parameters["EyePosition"]; - - lightSpaceMatrixParam = Parameters["LightSpaceMatrix"]; } } } diff --git a/Effects/DirectionalLightCollection.cs b/Effects/DirectionalLightCollection.cs index 10bcbda..93ab4a4 100644 --- a/Effects/DirectionalLightCollection.cs +++ b/Effects/DirectionalLightCollection.cs @@ -8,14 +8,20 @@ namespace Kav private readonly Vector3[] directions = new Vector3[4]; private readonly Vector3[] colors = new Vector3[4]; private readonly float[] intensities = new float[4]; + private readonly Matrix[] lightSpaceMatrices = new Matrix[4]; readonly EffectParameter lightDirectionsParam; readonly EffectParameter lightColorsParam; + readonly EffectParameter lightSpaceMatricesParam; - public DirectionalLightCollection(EffectParameter lightDirectionsParam, EffectParameter lightColorsParam) - { + public DirectionalLightCollection( + EffectParameter lightDirectionsParam, + EffectParameter lightColorsParam, + EffectParameter lightSpaceMatricesParam + ) { this.lightDirectionsParam = lightDirectionsParam; this.lightColorsParam = lightColorsParam; + this.lightSpaceMatricesParam = lightSpaceMatricesParam; } public DirectionalLight this[int i] @@ -39,8 +45,10 @@ namespace Kav directions[i] = value.Direction; colors[i] = value.Color.ToVector3() * value.Intensity; intensities[i] = value.Intensity; + lightSpaceMatrices[i] = value.View * value.Projection; lightDirectionsParam.SetValue(directions); lightColorsParam.SetValue(colors); + lightSpaceMatricesParam.SetValue(lightSpaceMatrices); } } } diff --git a/Effects/FXB/DeferredPBREffect.fxb b/Effects/FXB/DeferredPBREffect.fxb index 7bb87291b73782956945627126e1d62215f198ce..b3e238363f8a7ac9e12e625a5a73ef6986fdde1a 100644 GIT binary patch literal 52720 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 literal 54108 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 Tdst^alLzaK>Rh!xjr#upzD>+; diff --git a/Effects/HLSL/DeferredPBREffect.fx b/Effects/HLSL/DeferredPBREffect.fx index 05a3df7..5795238 100644 --- a/Effects/HLSL/DeferredPBREffect.fx +++ b/Effects/HLSL/DeferredPBREffect.fx @@ -8,7 +8,7 @@ DECLARE_TEXTURE(gPosition, 0); DECLARE_TEXTURE(gAlbedo, 1); DECLARE_TEXTURE(gNormal, 2); DECLARE_TEXTURE(gMetallicRoughness, 3); -DECLARE_TEXTURE(shadowMap, 4); // TODO: one map per directional light +DECLARE_CUBEMAP(shadowMap, 4); BEGIN_CONSTANTS @@ -22,7 +22,7 @@ BEGIN_CONSTANTS MATRIX_CONSTANTS - float4x4 LightSpaceMatrix _ps(c137) _cb(c137); + float4x4 DirectionalLightMatrices[MAX_DIRECTIONAL_LIGHTS] _ps(c137) _cb(c137); END_CONSTANTS @@ -74,17 +74,56 @@ float GeometrySmith(float3 N, float3 V, float3 L, float roughness) return ggx1 * ggx2; } -float ComputeShadow(float4 positionLightSpace) +float3 ConvertCubeUVToXYZ(int index, float u, float v) { - float bias = 0.01; + float uc = 2.0 * u - 1.0; + float vc = 2.0 * v - 1.0; + + if (index == 0) { return float3(1.0, vc, -uc); } + if (index == 1) { return float3(-1.0, vc, uc); } + if (index == 2) { return float3(uc, 1.0, -vc); } + if (index == 3) { return float3(uc, -1.0, vc); } + if (index == 4) { return float3(uc, vc, -1.0); } + if (index == 5) { return float3(-uc, vc, 1.0); } + + return float3(1.0, 0.0, 0.5); +} + +float ComputeShadow(float4 positionLightSpace, int directionalLightIndex) +{ + float bias = 0.001; // maps to [-1, 1] float3 projectionCoords = positionLightSpace.xyz / positionLightSpace.w; - // maps to [0, 1] - projectionCoords = (projectionCoords * 0.5) + 0.5; + float3 cubeMapSampleVector; - float closestDepth = SAMPLE_TEXTURE(shadowMap, projectionCoords.xy).r; + if (directionalLightIndex == 0) + { + cubeMapSampleVector = float3(1.0f, projectionCoords.y, -projectionCoords.x); + } + else if (directionalLightIndex == 1) + { + cubeMapSampleVector = float3(-1.0f, projectionCoords.y, projectionCoords.x); + } + else if (directionalLightIndex == 2) + { + cubeMapSampleVector = float3(projectionCoords.x, 1.0f, projectionCoords.y); + } + else if (directionalLightIndex == 3) + { + cubeMapSampleVector = float3(projectionCoords.x, -1.0f, -projectionCoords.y); + } + else if (directionalLightIndex == 4) + { + cubeMapSampleVector = float3(projectionCoords.x, projectionCoords.y, 1.0); + } + else + { + cubeMapSampleVector = float3(-projectionCoords.x, projectionCoords.y, -1.0); + } + + float closestDepth = SAMPLE_CUBEMAP(shadowMap, cubeMapSampleVector).r; float currentDepth = projectionCoords.z; float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0; @@ -130,9 +169,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); @@ -153,8 +189,11 @@ float4 ComputeColor( } // directional light - for (int i = 0; i < MAX_DIRECTIONAL_LIGHTS; i++) + for (int i = 0; i < 1; i++) { + float4 positionLightSpace = mul(float4(worldPosition, 1.0), DirectionalLightMatrices[i]); + float shadow = ComputeShadow(positionLightSpace, i); + float3 lightDir = DirectionalLightDirections[i]; float3 radiance = DirectionalLightColors[i]; diff --git a/Effects/PBREffect.cs b/Effects/PBREffect.cs index db04a25..5405d7e 100644 --- a/Effects/PBREffect.cs +++ b/Effects/PBREffect.cs @@ -207,7 +207,8 @@ namespace Kav directionalLightCollection = new DirectionalLightCollection( Parameters["LightDirections"], - Parameters["DirectionLightColors"] + Parameters["DirectionLightColors"], + Parameters["DirectionalLightMatrices"] ); } @@ -232,7 +233,8 @@ namespace Kav DirectionalLights = new DirectionalLightCollection( Parameters["LightDirections"], - Parameters["DirectionLightColors"] + Parameters["DirectionLightColors"], + Parameters["DirectionalLightMatrices"] ); for (int i = 0; i < MaxDirectionalLights; i++) diff --git a/Lights/DirectionalLight.cs b/Lights/DirectionalLight.cs index a22ab33..9780535 100644 --- a/Lights/DirectionalLight.cs +++ b/Lights/DirectionalLight.cs @@ -12,7 +12,7 @@ namespace Kav { get { - return Matrix.CreateLookAt(Direction * 100f, Vector3.Zero, Vector3.Up); + return Matrix.CreateLookAt(Direction * 4.5f, Vector3.Zero, Vector3.Up); } } @@ -20,7 +20,7 @@ namespace Kav { get { - return Matrix.CreateOrthographic(20f, 20f, 1f, 101f); + return Matrix.CreateOrthographic(20f, 20f, 1f, 7.5f); } } diff --git a/Renderer.cs b/Renderer.cs index 35f4b7d..9b52411 100644 --- a/Renderer.cs +++ b/Renderer.cs @@ -10,7 +10,7 @@ namespace Kav private int RenderDimensionsX { get; } private int RenderDimensionsY { get; } - private RenderTarget2D DepthRenderTarget { get; } + private RenderTargetCube DirectionalLightDepthTarget { get; } private SimpleDepthEffect SimpleDepthEffect { get; } private RenderTarget2D gPosition { get; } @@ -31,10 +31,9 @@ namespace Kav RenderDimensionsX = renderDimensionsX; RenderDimensionsY = renderDimensionsY; - DepthRenderTarget = new RenderTarget2D( + DirectionalLightDepthTarget = new RenderTargetCube( GraphicsDevice, - renderDimensionsX, - renderDimensionsY, + 1024, false, SurfaceFormat.Single, DepthFormat.Depth24 @@ -96,6 +95,13 @@ namespace Kav GraphicsDevice.SetRenderTarget(deferredRenderTarget); graphicsDevice.Clear(Color.White); + + for (int i = 0; i < 6; i++) + { + GraphicsDevice.SetRenderTarget(DirectionalLightDepthTarget, (CubeMapFace) i); + GraphicsDevice.Clear(Color.White); + } + GraphicsDevice.SetRenderTarget(null); } @@ -105,11 +111,13 @@ namespace Kav IEnumerable pointLights, IEnumerable directionalLights ) { + var directionalLightIndex = 0; + foreach (var directionalLight in directionalLights) { - DepthRender(modelTransforms, directionalLight); - DeferredPBREffect.LightSpaceMatrix = directionalLight.View * directionalLight.Projection; - break; // FIXME: this is a kludge + if (directionalLightIndex > 5) { break; } + ShadowMapRender(modelTransforms, directionalLight, (CubeMapFace) directionalLightIndex); + directionalLightIndex += 1; } GraphicsDevice.SetRenderTargets(GBuffer); @@ -157,7 +165,7 @@ namespace Kav DeferredPBREffect.GAlbedo = gAlbedo; DeferredPBREffect.GNormal = gNormal; DeferredPBREffect.GMetallicRoughness = gMetallicRoughness; - DeferredPBREffect.ShadowMap = DepthRenderTarget; + DeferredPBREffect.DirectionalShadowMap = DirectionalLightDepthTarget; DeferredPBREffect.EyePosition = Matrix.Invert(camera.View).Translation; int i = 0; @@ -182,9 +190,9 @@ namespace Kav } // for shadow mapping - public void DepthRender(IEnumerable<(Model, Matrix)> modelTransforms, DirectionalLight directionalLight) + public void ShadowMapRender(IEnumerable<(Model, Matrix)> modelTransforms, DirectionalLight directionalLight, CubeMapFace face) { - GraphicsDevice.SetRenderTarget(DepthRenderTarget); + GraphicsDevice.SetRenderTarget(DirectionalLightDepthTarget, face); GraphicsDevice.Clear(Color.White); GraphicsDevice.DepthStencilState = DepthStencilState.Default; GraphicsDevice.BlendState = BlendState.Opaque;