toon shadows
parent
632f0a5b06
commit
d370d4e2e4
|
@ -0,0 +1,14 @@
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
|
||||||
|
namespace Kav
|
||||||
|
{
|
||||||
|
public interface ShadowCascadeEffect
|
||||||
|
{
|
||||||
|
Matrix LightSpaceMatrixOne { get; set; }
|
||||||
|
Matrix LightSpaceMatrixTwo { get; set; }
|
||||||
|
Matrix LightSpaceMatrixThree { get; set; }
|
||||||
|
Matrix LightSpaceMatrixFour { get; set; }
|
||||||
|
|
||||||
|
float[] CascadeFarPlanes { get; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,7 +3,7 @@ using Microsoft.Xna.Framework.Graphics;
|
||||||
|
|
||||||
namespace Kav
|
namespace Kav
|
||||||
{
|
{
|
||||||
public class DeferredPBR_DirectionalLightEffect : Effect
|
public class DeferredPBR_DirectionalLightEffect : Effect, ShadowCascadeEffect
|
||||||
{
|
{
|
||||||
EffectParameter gPositionParam;
|
EffectParameter gPositionParam;
|
||||||
EffectParameter gAlbedoParam;
|
EffectParameter gAlbedoParam;
|
||||||
|
@ -46,7 +46,7 @@ namespace Kav
|
||||||
public Vector3 DirectionalLightDirection { get; set; }
|
public Vector3 DirectionalLightDirection { get; set; }
|
||||||
public Vector3 DirectionalLightColor { get; set; }
|
public Vector3 DirectionalLightColor { get; set; }
|
||||||
|
|
||||||
public readonly float[] CascadeFarPlanes;
|
public float[] CascadeFarPlanes { get; }
|
||||||
|
|
||||||
public int ShadowMapSize { get; set; }
|
public int ShadowMapSize { get; set; }
|
||||||
|
|
||||||
|
@ -147,7 +147,6 @@ namespace Kav
|
||||||
directionalLightColorParam = Parameters["DirectionalLightColor"];
|
directionalLightColorParam = Parameters["DirectionalLightColor"];
|
||||||
|
|
||||||
cascadeFarPlanesParam = Parameters["CascadeFarPlanes"];
|
cascadeFarPlanesParam = Parameters["CascadeFarPlanes"];
|
||||||
|
|
||||||
shadowMapSizeParam = Parameters["ShadowMapSize"];
|
shadowMapSizeParam = Parameters["ShadowMapSize"];
|
||||||
|
|
||||||
lightSpaceMatrixOneParam = Parameters["LightSpaceMatrixOne"];
|
lightSpaceMatrixOneParam = Parameters["LightSpaceMatrixOne"];
|
||||||
|
|
|
@ -3,30 +3,61 @@ using Microsoft.Xna.Framework.Graphics;
|
||||||
|
|
||||||
namespace Kav
|
namespace Kav
|
||||||
{
|
{
|
||||||
public class Deferred_ToonEffect : Effect
|
public class Deferred_ToonEffect : Effect, ShadowCascadeEffect
|
||||||
{
|
{
|
||||||
EffectParameter gPositionParam;
|
EffectParameter gPositionParam;
|
||||||
EffectParameter gAlbedoParam;
|
EffectParameter gAlbedoParam;
|
||||||
EffectParameter gNormalParam;
|
EffectParameter gNormalParam;
|
||||||
|
|
||||||
|
EffectParameter shadowMapOneParam;
|
||||||
|
EffectParameter shadowMapTwoParam;
|
||||||
|
EffectParameter shadowMapThreeParam;
|
||||||
|
EffectParameter shadowMapFourParam;
|
||||||
|
|
||||||
EffectParameter eyePositionParam;
|
EffectParameter eyePositionParam;
|
||||||
EffectParameter directionalLightDirectionParam;
|
EffectParameter directionalLightDirectionParam;
|
||||||
EffectParameter directionalLightColorParam;
|
EffectParameter directionalLightColorParam;
|
||||||
|
|
||||||
EffectParameter softnessParam;
|
EffectParameter softnessParam;
|
||||||
|
|
||||||
|
EffectParameter cascadeFarPlanesParam;
|
||||||
|
EffectParameter shadowMapSizeParam;
|
||||||
|
|
||||||
|
EffectParameter lightSpaceMatrixOneParam;
|
||||||
|
EffectParameter lightSpaceMatrixTwoParam;
|
||||||
|
EffectParameter lightSpaceMatrixThreeParam;
|
||||||
|
EffectParameter lightSpaceMatrixFourParam;
|
||||||
|
|
||||||
|
EffectParameter viewMatrixParam;
|
||||||
|
|
||||||
public Texture2D GPosition { get; set; }
|
public Texture2D GPosition { get; set; }
|
||||||
public Texture2D GAlbedo { get; set; }
|
public Texture2D GAlbedo { get; set; }
|
||||||
public Texture2D GNormal { get; set; }
|
public Texture2D GNormal { get; set; }
|
||||||
|
|
||||||
|
public Texture2D ShadowMapOne { get; set; }
|
||||||
|
public Texture2D ShadowMapTwo { get; set; }
|
||||||
|
public Texture2D ShadowMapThree { get; set; }
|
||||||
|
public Texture2D ShadowMapFour { get; set; }
|
||||||
|
|
||||||
public Vector3 EyePosition { get; set; }
|
public Vector3 EyePosition { get; set; }
|
||||||
public Vector3 DirectionalLightDirection { get; set; }
|
public Vector3 DirectionalLightDirection { get; set; }
|
||||||
public Vector3 DirectionalLightColor { get; set; }
|
public Vector3 DirectionalLightColor { get; set; }
|
||||||
|
|
||||||
public float Softness { get; set; }
|
public float Softness { get; set; }
|
||||||
|
|
||||||
|
public float[] CascadeFarPlanes { get; }
|
||||||
|
public float ShadowMapSize { get; set; }
|
||||||
|
|
||||||
|
public Matrix LightSpaceMatrixOne { get; set; }
|
||||||
|
public Matrix LightSpaceMatrixTwo { get; set; }
|
||||||
|
public Matrix LightSpaceMatrixThree { get; set; }
|
||||||
|
public Matrix LightSpaceMatrixFour { get; set; }
|
||||||
|
|
||||||
|
public Matrix ViewMatrix { get; set; }
|
||||||
|
|
||||||
public Deferred_ToonEffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.Deferred_ToonEffect)
|
public Deferred_ToonEffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.Deferred_ToonEffect)
|
||||||
{
|
{
|
||||||
|
CascadeFarPlanes = new float[4];
|
||||||
CacheEffectParameters();
|
CacheEffectParameters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,11 +67,26 @@ namespace Kav
|
||||||
gAlbedoParam.SetValue(GAlbedo);
|
gAlbedoParam.SetValue(GAlbedo);
|
||||||
gNormalParam.SetValue(GNormal);
|
gNormalParam.SetValue(GNormal);
|
||||||
|
|
||||||
|
shadowMapOneParam.SetValue(ShadowMapOne);
|
||||||
|
shadowMapTwoParam.SetValue(ShadowMapTwo);
|
||||||
|
shadowMapThreeParam.SetValue(ShadowMapThree);
|
||||||
|
shadowMapFourParam.SetValue(ShadowMapFour);
|
||||||
|
|
||||||
eyePositionParam.SetValue(EyePosition);
|
eyePositionParam.SetValue(EyePosition);
|
||||||
directionalLightDirectionParam.SetValue(DirectionalLightDirection);
|
directionalLightDirectionParam.SetValue(DirectionalLightDirection);
|
||||||
directionalLightColorParam.SetValue(DirectionalLightColor);
|
directionalLightColorParam.SetValue(DirectionalLightColor);
|
||||||
|
|
||||||
softnessParam.SetValue(Softness);
|
softnessParam.SetValue(Softness);
|
||||||
|
|
||||||
|
cascadeFarPlanesParam.SetValue(CascadeFarPlanes);
|
||||||
|
shadowMapSizeParam.SetValue(ShadowMapSize);
|
||||||
|
|
||||||
|
lightSpaceMatrixOneParam.SetValue(LightSpaceMatrixOne);
|
||||||
|
lightSpaceMatrixTwoParam.SetValue(LightSpaceMatrixTwo);
|
||||||
|
lightSpaceMatrixThreeParam.SetValue(LightSpaceMatrixThree);
|
||||||
|
lightSpaceMatrixFourParam.SetValue(LightSpaceMatrixFour);
|
||||||
|
|
||||||
|
viewMatrixParam.SetValue(ViewMatrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CacheEffectParameters()
|
void CacheEffectParameters()
|
||||||
|
@ -49,11 +95,26 @@ namespace Kav
|
||||||
gAlbedoParam = Parameters["gAlbedo"];
|
gAlbedoParam = Parameters["gAlbedo"];
|
||||||
gNormalParam = Parameters["gNormal"];
|
gNormalParam = Parameters["gNormal"];
|
||||||
|
|
||||||
|
shadowMapOneParam = Parameters["shadowMapOne"];
|
||||||
|
shadowMapTwoParam = Parameters["shadowMapTwo"];
|
||||||
|
shadowMapThreeParam = Parameters["shadowMapThree"];
|
||||||
|
shadowMapFourParam = Parameters["shadowMapFour"];
|
||||||
|
|
||||||
eyePositionParam = Parameters["EyePosition"];
|
eyePositionParam = Parameters["EyePosition"];
|
||||||
directionalLightDirectionParam = Parameters["DirectionalLightDirection"];
|
directionalLightDirectionParam = Parameters["DirectionalLightDirection"];
|
||||||
directionalLightColorParam = Parameters["DirectionalLightColor"];
|
directionalLightColorParam = Parameters["DirectionalLightColor"];
|
||||||
|
|
||||||
softnessParam = Parameters["Softness"];
|
softnessParam = Parameters["Softness"];
|
||||||
|
|
||||||
|
cascadeFarPlanesParam = Parameters["CascadeFarPlanes"];
|
||||||
|
shadowMapSizeParam = Parameters["ShadowMapSize"];
|
||||||
|
|
||||||
|
lightSpaceMatrixOneParam = Parameters["LightSpaceMatrixOne"];
|
||||||
|
lightSpaceMatrixTwoParam = Parameters["LightSpaceMatrixTwo"];
|
||||||
|
lightSpaceMatrixThreeParam = Parameters["LightSpaceMatrixThree"];
|
||||||
|
lightSpaceMatrixFourParam = Parameters["LightSpaceMatrixFour"];
|
||||||
|
|
||||||
|
viewMatrixParam = Parameters["ViewMatrix"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
BIN
Effects/FXB/Deferred_ToonEffect.fxb (Stored with Git LFS)
BIN
Effects/FXB/Deferred_ToonEffect.fxb (Stored with Git LFS)
Binary file not shown.
|
@ -1,17 +1,37 @@
|
||||||
#include "Macros.fxh"
|
#include "Macros.fxh"
|
||||||
|
#include "Shadow.fxh"
|
||||||
|
|
||||||
|
static const int NUM_SHADOW_CASCADES = 4;
|
||||||
|
|
||||||
DECLARE_TEXTURE(gPosition, 0);
|
DECLARE_TEXTURE(gPosition, 0);
|
||||||
DECLARE_TEXTURE(gAlbedo, 1);
|
DECLARE_TEXTURE(gAlbedo, 1);
|
||||||
DECLARE_TEXTURE(gNormal, 2);
|
DECLARE_TEXTURE(gNormal, 2);
|
||||||
|
DECLARE_TEXTURE(shadowMapOne, 4);
|
||||||
|
DECLARE_TEXTURE(shadowMapTwo, 5);
|
||||||
|
DECLARE_TEXTURE(shadowMapThree, 6);
|
||||||
|
DECLARE_TEXTURE(shadowMapFour, 7);
|
||||||
|
|
||||||
BEGIN_CONSTANTS
|
BEGIN_CONSTANTS
|
||||||
|
|
||||||
float3 EyePosition _ps(c0) _cb(c0);
|
float3 EyePosition _ps(c0) _cb(c0);
|
||||||
|
|
||||||
float3 DirectionalLightDirection _ps(c1) _cb(c1);
|
float3 DirectionalLightDirection _ps(c1) _cb(c1);
|
||||||
float3 DirectionalLightColor _ps(c2) _cb(c2);
|
float3 DirectionalLightColor _ps(c2) _cb(c2);
|
||||||
|
|
||||||
float Softness _ps(c3) _cb(c3);
|
float Softness _ps(c3) _cb(c3);
|
||||||
|
|
||||||
|
float CascadeFarPlanes[NUM_SHADOW_CASCADES] _ps(c4) _cb(c4);
|
||||||
|
|
||||||
|
float ShadowMapSize _ps(c8) _cb(c8);
|
||||||
|
|
||||||
|
MATRIX_CONSTANTS
|
||||||
|
|
||||||
|
float4x4 LightSpaceMatrixOne _ps(c9) _cb(c9);
|
||||||
|
float4x4 LightSpaceMatrixTwo _ps(c13) _cb(c13);
|
||||||
|
float4x4 LightSpaceMatrixThree _ps(c17) _cb(c17);
|
||||||
|
float4x4 LightSpaceMatrixFour _ps(c21) _cb(c21);
|
||||||
|
|
||||||
|
float4x4 ViewMatrix _ps(c25) _cb(c25);
|
||||||
|
|
||||||
END_CONSTANTS
|
END_CONSTANTS
|
||||||
|
|
||||||
|
@ -37,6 +57,88 @@ PixelInput main_vs(VertexInput input)
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float ComputeShadow(float3 positionWorldSpace, float3 N, float3 L)
|
||||||
|
{
|
||||||
|
float4 positionCameraSpace = mul(float4(positionWorldSpace, 1.0), ViewMatrix);
|
||||||
|
|
||||||
|
int shadowCascadeIndex = 0; // 0 is closest
|
||||||
|
for (int i = 0; i < NUM_SHADOW_CASCADES; i++)
|
||||||
|
{
|
||||||
|
if (abs(positionCameraSpace.z) < CascadeFarPlanes[i])
|
||||||
|
{
|
||||||
|
shadowCascadeIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float4x4 lightSpaceMatrix;
|
||||||
|
|
||||||
|
if (shadowCascadeIndex == 0)
|
||||||
|
{
|
||||||
|
lightSpaceMatrix = LightSpaceMatrixOne;
|
||||||
|
}
|
||||||
|
else if (shadowCascadeIndex == 1)
|
||||||
|
{
|
||||||
|
lightSpaceMatrix = LightSpaceMatrixTwo;
|
||||||
|
}
|
||||||
|
else if (shadowCascadeIndex == 2)
|
||||||
|
{
|
||||||
|
lightSpaceMatrix = LightSpaceMatrixThree;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lightSpaceMatrix = LightSpaceMatrixFour;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PCF + Poisson soft shadows
|
||||||
|
|
||||||
|
if (shadowCascadeIndex == 0)
|
||||||
|
{
|
||||||
|
return PoissonShadow(
|
||||||
|
positionWorldSpace,
|
||||||
|
N,
|
||||||
|
L,
|
||||||
|
lightSpaceMatrix,
|
||||||
|
SAMPLER(shadowMapOne),
|
||||||
|
ShadowMapSize
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (shadowCascadeIndex == 1)
|
||||||
|
{
|
||||||
|
return PoissonShadow(
|
||||||
|
positionWorldSpace,
|
||||||
|
N,
|
||||||
|
L,
|
||||||
|
lightSpaceMatrix,
|
||||||
|
SAMPLER(shadowMapTwo),
|
||||||
|
ShadowMapSize
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (shadowCascadeIndex == 2)
|
||||||
|
{
|
||||||
|
return PoissonShadow(
|
||||||
|
positionWorldSpace,
|
||||||
|
N,
|
||||||
|
L,
|
||||||
|
lightSpaceMatrix,
|
||||||
|
SAMPLER(shadowMapThree),
|
||||||
|
ShadowMapSize
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return PoissonShadow(
|
||||||
|
positionWorldSpace,
|
||||||
|
N,
|
||||||
|
L,
|
||||||
|
lightSpaceMatrix,
|
||||||
|
SAMPLER(shadowMapFour),
|
||||||
|
ShadowMapSize
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: organize this
|
||||||
float4 main_ps(PixelInput input) : SV_TARGET0
|
float4 main_ps(PixelInput input) : SV_TARGET0
|
||||||
{
|
{
|
||||||
float3 worldPosition = SAMPLE_TEXTURE(gPosition, input.TexCoord).rgb;
|
float3 worldPosition = SAMPLE_TEXTURE(gPosition, input.TexCoord).rgb;
|
||||||
|
@ -76,7 +178,8 @@ float4 main_ps(PixelInput input) : SV_TARGET0
|
||||||
rimIntensity = smoothstep(rimAmount - 0.01, rimAmount + 0.01, rimIntensity);
|
rimIntensity = smoothstep(rimAmount - 0.01, rimAmount + 0.01, rimIntensity);
|
||||||
float3 rim = rimIntensity * rimColor;
|
float3 rim = rimIntensity * rimColor;
|
||||||
|
|
||||||
float3 color = albedo * (light + specular + rim);
|
float shadow = ComputeShadow(worldPosition, N, L);
|
||||||
|
float3 color = albedo * (light + specular + rim) * shadow;
|
||||||
|
|
||||||
return float4(color, 1.0);
|
return float4(color, 1.0);
|
||||||
}
|
}
|
||||||
|
|
96
Renderer.cs
96
Renderer.cs
|
@ -195,11 +195,7 @@ namespace Kav
|
||||||
GraphicsDevice.Clear(Color.Black);
|
GraphicsDevice.Clear(Color.Black);
|
||||||
|
|
||||||
AmbientLightRender(ambientLight);
|
AmbientLightRender(ambientLight);
|
||||||
|
DirectionalLightToonRender(camera, modelTransforms, directionalLight);
|
||||||
Deferred_ToonEffect.GPosition = gPosition;
|
|
||||||
Deferred_ToonEffect.GAlbedo = gAlbedo;
|
|
||||||
Deferred_ToonEffect.GNormal = gNormal;
|
|
||||||
DirectionalLightToonRender(camera, directionalLight);
|
|
||||||
|
|
||||||
GraphicsDevice.SetRenderTarget(null);
|
GraphicsDevice.SetRenderTarget(null);
|
||||||
GraphicsDevice.Clear(Color.Black);
|
GraphicsDevice.Clear(Color.Black);
|
||||||
|
@ -298,28 +294,7 @@ namespace Kav
|
||||||
IEnumerable<(Model, Matrix)> modelTransforms,
|
IEnumerable<(Model, Matrix)> modelTransforms,
|
||||||
DirectionalLight directionalLight
|
DirectionalLight directionalLight
|
||||||
) {
|
) {
|
||||||
// render the individual shadow cascades
|
RenderShadows(camera, modelTransforms, directionalLight, DeferredDirectionalLightEffect);
|
||||||
var previousFarPlane = camera.NearPlane;
|
|
||||||
for (var i = 0; i < NumShadowCascades; i++)
|
|
||||||
{
|
|
||||||
var farPlane = camera.FarPlane / (MathHelper.Max((NumShadowCascades - i - 1) * 2f, 1f));
|
|
||||||
|
|
||||||
// divide the view frustum
|
|
||||||
var shadowCamera = new PerspectiveCamera(
|
|
||||||
camera.Position,
|
|
||||||
camera.Forward,
|
|
||||||
camera.Up,
|
|
||||||
camera.FieldOfView,
|
|
||||||
camera.AspectRatio,
|
|
||||||
previousFarPlane,
|
|
||||||
farPlane
|
|
||||||
);
|
|
||||||
|
|
||||||
// TODO: This is tightly coupled to the effect and it sucks
|
|
||||||
RenderShadowMap(shadowCamera, modelTransforms, directionalLight, i);
|
|
||||||
|
|
||||||
previousFarPlane = farPlane;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeferredDirectionalLightEffect.GPosition = gPosition;
|
DeferredDirectionalLightEffect.GPosition = gPosition;
|
||||||
DeferredDirectionalLightEffect.GAlbedo = gAlbedo;
|
DeferredDirectionalLightEffect.GAlbedo = gAlbedo;
|
||||||
|
@ -345,7 +320,7 @@ namespace Kav
|
||||||
directionalLight.Color.ToVector3() * directionalLight.Intensity;
|
directionalLight.Color.ToVector3() * directionalLight.Intensity;
|
||||||
|
|
||||||
DeferredDirectionalLightEffect.ViewMatrix = camera.View;
|
DeferredDirectionalLightEffect.ViewMatrix = camera.View;
|
||||||
DeferredDirectionalLightEffect.EyePosition = Matrix.Invert(camera.View).Translation;
|
DeferredDirectionalLightEffect.EyePosition = camera.Position;
|
||||||
|
|
||||||
GraphicsDevice.SetRenderTarget(ColorRenderTarget);
|
GraphicsDevice.SetRenderTarget(ColorRenderTarget);
|
||||||
GraphicsDevice.BlendState = BlendState.Additive;
|
GraphicsDevice.BlendState = BlendState.Additive;
|
||||||
|
@ -360,11 +335,18 @@ namespace Kav
|
||||||
|
|
||||||
private void DirectionalLightToonRender(
|
private void DirectionalLightToonRender(
|
||||||
PerspectiveCamera camera,
|
PerspectiveCamera camera,
|
||||||
|
IEnumerable<(Model, Matrix)> modelTransforms,
|
||||||
DirectionalLight directionalLight
|
DirectionalLight directionalLight
|
||||||
) {
|
) {
|
||||||
|
RenderShadows(camera, modelTransforms, directionalLight, Deferred_ToonEffect);
|
||||||
|
|
||||||
GraphicsDevice.SetRenderTarget(ColorRenderTarget);
|
GraphicsDevice.SetRenderTarget(ColorRenderTarget);
|
||||||
GraphicsDevice.BlendState = BlendState.Additive;
|
GraphicsDevice.BlendState = BlendState.Additive;
|
||||||
|
|
||||||
|
Deferred_ToonEffect.GPosition = gPosition;
|
||||||
|
Deferred_ToonEffect.GAlbedo = gAlbedo;
|
||||||
|
Deferred_ToonEffect.GNormal = gNormal;
|
||||||
|
|
||||||
Deferred_ToonEffect.EyePosition = camera.Position;
|
Deferred_ToonEffect.EyePosition = camera.Position;
|
||||||
Deferred_ToonEffect.DirectionalLightDirection = directionalLight.Direction;
|
Deferred_ToonEffect.DirectionalLightDirection = directionalLight.Direction;
|
||||||
Deferred_ToonEffect.DirectionalLightColor =
|
Deferred_ToonEffect.DirectionalLightColor =
|
||||||
|
@ -372,6 +354,22 @@ namespace Kav
|
||||||
|
|
||||||
Deferred_ToonEffect.Softness = 0.01f;
|
Deferred_ToonEffect.Softness = 0.01f;
|
||||||
|
|
||||||
|
Deferred_ToonEffect.ShadowMapOne = ShadowRenderTargets[0];
|
||||||
|
if (NumShadowCascades > 1)
|
||||||
|
{
|
||||||
|
Deferred_ToonEffect.ShadowMapTwo = ShadowRenderTargets[1];
|
||||||
|
}
|
||||||
|
if (NumShadowCascades > 2)
|
||||||
|
{
|
||||||
|
Deferred_ToonEffect.ShadowMapThree = ShadowRenderTargets[2];
|
||||||
|
}
|
||||||
|
if (NumShadowCascades > 3)
|
||||||
|
{
|
||||||
|
Deferred_ToonEffect.ShadowMapFour = ShadowRenderTargets[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
Deferred_ToonEffect.ViewMatrix = camera.View;
|
||||||
|
|
||||||
foreach (EffectPass pass in Deferred_ToonEffect.CurrentTechnique.Passes)
|
foreach (EffectPass pass in Deferred_ToonEffect.CurrentTechnique.Passes)
|
||||||
{
|
{
|
||||||
pass.Apply();
|
pass.Apply();
|
||||||
|
@ -380,10 +378,42 @@ namespace Kav
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RenderShadows(
|
||||||
|
PerspectiveCamera camera,
|
||||||
|
IEnumerable<(Model, Matrix)> modelTransforms,
|
||||||
|
DirectionalLight directionalLight,
|
||||||
|
ShadowCascadeEffect effect
|
||||||
|
) {
|
||||||
|
// render the individual shadow cascades
|
||||||
|
var previousFarPlane = camera.NearPlane;
|
||||||
|
for (var i = 0; i < NumShadowCascades; i++)
|
||||||
|
{
|
||||||
|
var farPlane = camera.FarPlane / (MathHelper.Max((NumShadowCascades - i - 1) * 2f, 1f));
|
||||||
|
|
||||||
|
// divide the view frustum
|
||||||
|
var shadowCamera = new PerspectiveCamera(
|
||||||
|
camera.Position,
|
||||||
|
camera.Forward,
|
||||||
|
camera.Up,
|
||||||
|
camera.FieldOfView,
|
||||||
|
camera.AspectRatio,
|
||||||
|
previousFarPlane,
|
||||||
|
farPlane
|
||||||
|
);
|
||||||
|
|
||||||
|
// TODO: This is tightly coupled to the effect and it sucks
|
||||||
|
RenderShadowMap(shadowCamera, modelTransforms, directionalLight, effect, i);
|
||||||
|
|
||||||
|
effect.CascadeFarPlanes[i] = farPlane;
|
||||||
|
previousFarPlane = farPlane;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void RenderShadowMap(
|
private void RenderShadowMap(
|
||||||
PerspectiveCamera camera,
|
PerspectiveCamera camera,
|
||||||
IEnumerable<(Model, Matrix)> modelTransforms,
|
IEnumerable<(Model, Matrix)> modelTransforms,
|
||||||
DirectionalLight directionalLight,
|
DirectionalLight directionalLight,
|
||||||
|
ShadowCascadeEffect effect,
|
||||||
int shadowCascadeIndex
|
int shadowCascadeIndex
|
||||||
) {
|
) {
|
||||||
GraphicsDevice.SetRenderTarget(ShadowRenderTargets[shadowCascadeIndex]);
|
GraphicsDevice.SetRenderTarget(ShadowRenderTargets[shadowCascadeIndex]);
|
||||||
|
@ -424,23 +454,21 @@ namespace Kav
|
||||||
|
|
||||||
if (shadowCascadeIndex == 0)
|
if (shadowCascadeIndex == 0)
|
||||||
{
|
{
|
||||||
DeferredDirectionalLightEffect.LightSpaceMatrixOne = lightSpaceMatrix;
|
effect.LightSpaceMatrixOne = lightSpaceMatrix;
|
||||||
}
|
}
|
||||||
else if (shadowCascadeIndex == 1)
|
else if (shadowCascadeIndex == 1)
|
||||||
{
|
{
|
||||||
DeferredDirectionalLightEffect.LightSpaceMatrixTwo = lightSpaceMatrix;
|
effect.LightSpaceMatrixTwo = lightSpaceMatrix;
|
||||||
}
|
}
|
||||||
else if (shadowCascadeIndex == 2)
|
else if (shadowCascadeIndex == 2)
|
||||||
{
|
{
|
||||||
DeferredDirectionalLightEffect.LightSpaceMatrixThree = lightSpaceMatrix;
|
effect.LightSpaceMatrixThree = lightSpaceMatrix;
|
||||||
}
|
}
|
||||||
else if (shadowCascadeIndex == 3)
|
else if (shadowCascadeIndex == 3)
|
||||||
{
|
{
|
||||||
DeferredDirectionalLightEffect.LightSpaceMatrixFour = lightSpaceMatrix;
|
effect.LightSpaceMatrixFour = lightSpaceMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeferredDirectionalLightEffect.CascadeFarPlanes[shadowCascadeIndex] = camera.FarPlane;
|
|
||||||
|
|
||||||
foreach (var (model, transform) in modelTransforms)
|
foreach (var (model, transform) in modelTransforms)
|
||||||
{
|
{
|
||||||
foreach (var modelMesh in model.Meshes)
|
foreach (var modelMesh in model.Meshes)
|
||||||
|
|
Loading…
Reference in New Issue