using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Kav { public class DeferredPBR_DirectionalLightEffect : Effect, ShadowCascadeEffect { EffectParameter gPositionParam; EffectParameter gAlbedoParam; EffectParameter gNormalParam; EffectParameter gMetallicRoughnessParam; EffectParameter shadowMapOneParam; EffectParameter shadowMapTwoParam; EffectParameter shadowMapThreeParam; EffectParameter shadowMapFourParam; EffectParameter eyePositionParam; EffectParameter directionalLightColorParam; EffectParameter directionalLightDirectionParam; EffectParameter cascadeFarPlanesParam; EffectParameter shadowMapSizeParam; EffectParameter lightSpaceMatrixOneParam; EffectParameter lightSpaceMatrixTwoParam; EffectParameter lightSpaceMatrixThreeParam; EffectParameter lightSpaceMatrixFourParam; EffectParameter viewMatrixParam; public Texture2D GPosition { get; set; } public Texture2D GAlbedo { get; set; } public Texture2D GNormal { get; set; } public Texture2D GMetallicRoughness { 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 DirectionalLightDirection { get; set; } public Vector3 DirectionalLightColor { get; set; } public float[] CascadeFarPlanes { get; } public int 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 DeferredPBR_DirectionalLightEffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.DeferredPBR_DirectionalLightEffect) { CascadeFarPlanes = new float[4]; CacheEffectParameters(); } public DeferredPBR_DirectionalLightEffect(DeferredPBR_DirectionalLightEffect cloneSource) : base(cloneSource) { GPosition = cloneSource.GPosition; GAlbedo = cloneSource.GAlbedo; GNormal = cloneSource.GNormal; GMetallicRoughness = cloneSource.GMetallicRoughness; ShadowMapOne = cloneSource.ShadowMapOne; ShadowMapTwo = cloneSource.ShadowMapTwo; ShadowMapThree = cloneSource.ShadowMapThree; ShadowMapFour = cloneSource.ShadowMapFour; EyePosition = cloneSource.EyePosition; DirectionalLightDirection = cloneSource.DirectionalLightDirection; DirectionalLightColor = cloneSource.DirectionalLightColor; CascadeFarPlanes = new float[4]; for (int i = 0 ; i < 4; i++) { CascadeFarPlanes[i] = cloneSource.CascadeFarPlanes[i]; } ShadowMapSize = cloneSource.ShadowMapSize; LightSpaceMatrixOne = cloneSource.LightSpaceMatrixOne; LightSpaceMatrixTwo = cloneSource.LightSpaceMatrixTwo; LightSpaceMatrixThree = cloneSource.LightSpaceMatrixThree; LightSpaceMatrixFour = cloneSource.LightSpaceMatrixFour; ViewMatrix = cloneSource.ViewMatrix; } public override Effect Clone() { return new DeferredPBR_DirectionalLightEffect(this); } protected override void OnApply() { gPositionParam.SetValue(GPosition); gAlbedoParam.SetValue(GAlbedo); gNormalParam.SetValue(GNormal); gMetallicRoughnessParam.SetValue(GMetallicRoughness); shadowMapOneParam.SetValue(ShadowMapOne); shadowMapTwoParam.SetValue(ShadowMapTwo); shadowMapThreeParam.SetValue(ShadowMapThree); shadowMapFourParam.SetValue(ShadowMapFour); eyePositionParam.SetValue(EyePosition); directionalLightDirectionParam.SetValue(DirectionalLightDirection); directionalLightColorParam.SetValue(DirectionalLightColor); cascadeFarPlanesParam.SetValue(CascadeFarPlanes); shadowMapSizeParam.SetValue(ShadowMapSize); lightSpaceMatrixOneParam.SetValue(LightSpaceMatrixOne); lightSpaceMatrixTwoParam.SetValue(LightSpaceMatrixTwo); lightSpaceMatrixThreeParam.SetValue(LightSpaceMatrixThree); lightSpaceMatrixFourParam.SetValue(LightSpaceMatrixFour); viewMatrixParam.SetValue(ViewMatrix); } void CacheEffectParameters() { gPositionParam = Parameters["gPosition"]; gAlbedoParam = Parameters["gAlbedo"]; gNormalParam = Parameters["gNormal"]; gMetallicRoughnessParam = Parameters["gMetallicRoughness"]; shadowMapOneParam = Parameters["shadowMapOne"]; shadowMapTwoParam = Parameters["shadowMapTwo"]; shadowMapThreeParam = Parameters["shadowMapThree"]; shadowMapFourParam = Parameters["shadowMapFour"]; eyePositionParam = Parameters["EyePosition"]; directionalLightDirectionParam = Parameters["DirectionalLightDirection"]; directionalLightColorParam = Parameters["DirectionalLightColor"]; cascadeFarPlanesParam = Parameters["CascadeFarPlanes"]; shadowMapSizeParam = Parameters["ShadowMapSize"]; lightSpaceMatrixOneParam = Parameters["LightSpaceMatrixOne"]; lightSpaceMatrixTwoParam = Parameters["LightSpaceMatrixTwo"]; lightSpaceMatrixThreeParam = Parameters["LightSpaceMatrixThree"]; lightSpaceMatrixFourParam = Parameters["LightSpaceMatrixFour"]; viewMatrixParam = Parameters["ViewMatrix"]; } } }