You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

91 lines
4.6 KiB

using UnityEditor.Rendering.HighDefinition;
using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties;
namespace UnityEngine.Rendering.HighDefinition
{
internal static class FogVolumeAPI
{
internal static readonly string k_BlendModeProperty = "_FogVolumeBlendMode";
internal static readonly string k_SrcColorBlendProperty = "_FogVolumeSrcColorBlend";
internal static readonly string k_DstColorBlendProperty = "_FogVolumeDstColorBlend";
internal static readonly string k_SrcAlphaBlendProperty = "_FogVolumeSrcAlphaBlend";
internal static readonly string k_DstAlphaBlendProperty = "_FogVolumeDstAlphaBlend";
internal static readonly string k_ColorBlendOpProperty = "_FogVolumeColorBlendOp";
internal static readonly string k_AlphaBlendOpProperty = "_FogVolumeAlphaBlendOp";
internal static readonly string k_SingleScatteringAlbedoProperty = "_FogVolumeSingleScatteringAlbedo";
internal static readonly string k_FogDistanceProperty = "_FogVolumeFogDistanceProperty";
internal static void ComputeBlendParameters(LocalVolumetricFogBlendingMode mode, out Rendering.BlendMode srcColorBlend,
out Rendering.BlendMode srcAlphaBlend, out Rendering.BlendMode dstColorBlend, out Rendering.BlendMode dstAlphaBlend,
out BlendOp colorBlendOp, out BlendOp alphaBlendOp)
{
colorBlendOp = BlendOp.Add;
alphaBlendOp = BlendOp.Add;
switch (mode)
{
default:
case LocalVolumetricFogBlendingMode.Additive:
srcColorBlend = Rendering.BlendMode.One;
dstColorBlend = Rendering.BlendMode.One;
srcAlphaBlend = Rendering.BlendMode.One;
dstAlphaBlend = Rendering.BlendMode.One;
break;
case LocalVolumetricFogBlendingMode.Multiply:
srcColorBlend = Rendering.BlendMode.DstColor;
dstColorBlend = Rendering.BlendMode.Zero;
srcAlphaBlend = Rendering.BlendMode.DstAlpha;
dstAlphaBlend = Rendering.BlendMode.Zero;
break;
case LocalVolumetricFogBlendingMode.Overwrite:
srcColorBlend = Rendering.BlendMode.One;
dstColorBlend = Rendering.BlendMode.Zero;
srcAlphaBlend = Rendering.BlendMode.One;
dstAlphaBlend = Rendering.BlendMode.Zero;
break;
case LocalVolumetricFogBlendingMode.Max:
srcColorBlend = Rendering.BlendMode.One;
dstColorBlend = Rendering.BlendMode.One;
srcAlphaBlend = Rendering.BlendMode.One;
dstAlphaBlend = Rendering.BlendMode.One;
alphaBlendOp = BlendOp.Max;
colorBlendOp = BlendOp.Max;
break;
case LocalVolumetricFogBlendingMode.Min:
srcColorBlend = Rendering.BlendMode.One;
dstColorBlend = Rendering.BlendMode.One;
srcAlphaBlend = Rendering.BlendMode.One;
dstAlphaBlend = Rendering.BlendMode.One;
alphaBlendOp = BlendOp.Min;
colorBlendOp = BlendOp.Min;
break;
}
}
internal static void SetupFogVolumeKeywordsAndProperties(Material material)
{
if (material.HasProperty(k_BlendModeProperty))
{
LocalVolumetricFogBlendingMode mode = (LocalVolumetricFogBlendingMode)material.GetFloat(k_BlendModeProperty);
SetupFogVolumeBlendMode(material, mode);
}
}
internal static int GetPassIndexFromBlendingMode(LocalVolumetricFogBlendingMode mode) => (int)mode;
internal static void SetupFogVolumeBlendMode(Material material, LocalVolumetricFogBlendingMode mode)
{
ComputeBlendParameters(mode, out var srcColorBlend, out var srcAlphaBlend, out var dstColorBlend, out var dstAlphaBlend, out var colorBlendOp, out var alphaBlendOp);
material.SetFloat(k_SrcColorBlendProperty, (float)srcColorBlend);
material.SetFloat(k_DstColorBlendProperty, (float)dstColorBlend);
material.SetFloat(k_SrcAlphaBlendProperty, (float)srcAlphaBlend);
material.SetFloat(k_DstAlphaBlendProperty, (float)dstAlphaBlend);
material.SetFloat(k_ColorBlendOpProperty, (float)colorBlendOp);
material.SetFloat(k_AlphaBlendOpProperty, (float)alphaBlendOp);
material.SetFloat(k_BlendModeProperty, (float)mode);
}
}
}