113 lines
3.5 KiB
C#
113 lines
3.5 KiB
C#
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
|
|
namespace Kav
|
|
{
|
|
public class DeferredPBREffect : Effect
|
|
{
|
|
EffectParameter gPositionParam;
|
|
EffectParameter gAlbedoParam;
|
|
EffectParameter gNormalParam;
|
|
EffectParameter gMetallicRoughnessParam;
|
|
|
|
EffectParameter eyePositionParam;
|
|
PointLightCollection pointLightCollection;
|
|
DirectionalLightCollection directionalLightCollection;
|
|
|
|
public Texture2D GPosition { get; set; }
|
|
public Texture2D GAlbedo { get; set; }
|
|
public Texture2D GNormal { get; set; }
|
|
public Texture2D GMetallicRoughness { get; set; }
|
|
|
|
public Vector3 EyePosition { get; set; }
|
|
|
|
public int MaxPointLights { get; } = 64;
|
|
|
|
public PointLightCollection PointLights
|
|
{
|
|
get { return pointLightCollection; }
|
|
private set { pointLightCollection = value; }
|
|
}
|
|
|
|
public int MaxDirectionalLights { get; } = 4;
|
|
|
|
public DirectionalLightCollection DirectionalLights
|
|
{
|
|
get { return directionalLightCollection; }
|
|
private set { directionalLightCollection = value; }
|
|
}
|
|
|
|
public DeferredPBREffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.DeferredPBREffect)
|
|
{
|
|
CacheEffectParameters();
|
|
|
|
pointLightCollection = new PointLightCollection(
|
|
Parameters["PointLightPositions"],
|
|
Parameters["PointLightColors"],
|
|
MaxPointLights
|
|
);
|
|
|
|
DirectionalLights = new DirectionalLightCollection(
|
|
Parameters["DirectionalLightDirections"],
|
|
Parameters["DirectionalLightColors"]
|
|
);
|
|
}
|
|
|
|
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];
|
|
}
|
|
|
|
DirectionalLights = new DirectionalLightCollection(
|
|
Parameters["DirectionalLightDirections"],
|
|
Parameters["DirectionalLightColors"]
|
|
);
|
|
|
|
for (int i = 0; i < MaxDirectionalLights; i++)
|
|
{
|
|
DirectionalLights[i] = cloneSource.DirectionalLights[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);
|
|
|
|
eyePositionParam.SetValue(EyePosition);
|
|
}
|
|
|
|
void CacheEffectParameters()
|
|
{
|
|
gPositionParam = Parameters["gPosition"];
|
|
gAlbedoParam = Parameters["gAlbedo"];
|
|
gNormalParam = Parameters["gNormal"];
|
|
gMetallicRoughnessParam = Parameters["gMetallicRoughness"];
|
|
|
|
eyePositionParam = Parameters["EyePosition"];
|
|
}
|
|
}
|
|
}
|