using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Kav { public class DeferredPBREffect : Effect { EffectParameter gPositionParam; EffectParameter gAlbedoParam; EffectParameter gNormalParam; EffectParameter gMetallicRoughnessParam; EffectParameter directionalShadowMapParam; EffectParameter directionalLightDirectionParam; EffectParameter directionalLightColorParam; EffectParameter directionalLightMatrixParam; EffectParameter eyePositionParam; PointLightCollection pointLightCollection; public Texture2D GPosition { get; set; } public Texture2D GAlbedo { get; set; } public Texture2D GNormal { get; set; } public Texture2D GMetallicRoughness { get; set; } public Texture2D DirectionalShadowMap { get; set; } public Vector3 DirectionalLightDirection { get; set; } public Vector3 DirectionalLightColor { get; set; } public Matrix DirectionalLightMatrix { get; set; } public Vector3 EyePosition { get; set; } public int MaxPointLights { get; } = 64; public PointLightCollection PointLights { get { return pointLightCollection; } private set { pointLightCollection = value; } } public DeferredPBREffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.DeferredPBREffect) { CacheEffectParameters(); pointLightCollection = new PointLightCollection( Parameters["PointLightPositions"], Parameters["PointLightColors"], MaxPointLights ); } protected DeferredPBREffect(DeferredPBREffect cloneSource) : base(cloneSource) { GPosition = cloneSource.GPosition; GAlbedo = cloneSource.GAlbedo; GNormal = cloneSource.GNormal; GMetallicRoughness = cloneSource.GMetallicRoughness; EyePosition = cloneSource.EyePosition; PointLights = new PointLightCollection( Parameters["LightPositions"], Parameters["PositionLightColors"], MaxPointLights ); for (int i = 0; i < MaxPointLights; i++) { PointLights[i] = cloneSource.PointLights[i]; } } public override Effect Clone() { return new DeferredPBREffect(this); } protected override void OnApply() { gPositionParam.SetValue(GPosition); gAlbedoParam.SetValue(GAlbedo); gNormalParam.SetValue(GNormal); gMetallicRoughnessParam.SetValue(GMetallicRoughness); directionalShadowMapParam.SetValue(DirectionalShadowMap); directionalLightDirectionParam.SetValue(DirectionalLightDirection); directionalLightColorParam.SetValue(DirectionalLightColor); directionalLightMatrixParam.SetValue(DirectionalLightMatrix); eyePositionParam.SetValue(EyePosition); } void CacheEffectParameters() { gPositionParam = Parameters["gPosition"]; gAlbedoParam = Parameters["gAlbedo"]; gNormalParam = Parameters["gNormal"]; gMetallicRoughnessParam = Parameters["gMetallicRoughness"]; directionalShadowMapParam = Parameters["directionalShadowMap"]; directionalLightDirectionParam = Parameters["DirectionalLightDirection"]; directionalLightColorParam = Parameters["DirectionalLightColor"]; directionalLightMatrixParam = Parameters["DirectionalLightMatrix"]; eyePositionParam = Parameters["EyePosition"]; } } }