111 lines
3.8 KiB
C#
111 lines
3.8 KiB
C#
using UnityEngine;
|
||
using NativeBlendMode = UnityEngine.Rendering.BlendMode;
|
||
|
||
namespace FairyGUI
|
||
{
|
||
/*关于BlendMode.Off, 这种模式相当于Blend Off指令的效果。当然,在着色器里使用Blend Off指令可以获得更高的效率,
|
||
但因为Image着色器本身就有多个关键字,复制一个这样的着色器代价太大,所有为了节省Shader数量便增加了这样一种模式,也是可以接受的。
|
||
*/
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public enum BlendMode
|
||
{
|
||
Normal,
|
||
None,
|
||
Add,
|
||
Multiply,
|
||
Screen,
|
||
Erase,
|
||
Mask,
|
||
Below,
|
||
Off,
|
||
One_OneMinusSrcAlpha,
|
||
Custom1,
|
||
Custom2,
|
||
Custom3
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public class BlendModeUtils
|
||
{
|
||
public class BlendFactor
|
||
{
|
||
public NativeBlendMode srcFactor;
|
||
public NativeBlendMode dstFactor;
|
||
public bool pma;
|
||
|
||
public BlendFactor(NativeBlendMode srcFactor, NativeBlendMode dstFactor, bool pma = false)
|
||
{
|
||
this.srcFactor = srcFactor;
|
||
this.dstFactor = dstFactor;
|
||
this.pma = pma;
|
||
}
|
||
}
|
||
|
||
//Source指的是被计算的颜色,Destination是已经在屏幕上的颜色。
|
||
//混合结果=Source * factor1 + Destination * factor2
|
||
public static BlendFactor[] Factors = new BlendFactor[] {
|
||
//Normal
|
||
new BlendFactor(NativeBlendMode.SrcAlpha, NativeBlendMode.OneMinusSrcAlpha),
|
||
//None
|
||
new BlendFactor(NativeBlendMode.One, NativeBlendMode.One),
|
||
//Add
|
||
new BlendFactor(NativeBlendMode.SrcAlpha, NativeBlendMode.One),
|
||
//Multiply
|
||
new BlendFactor(NativeBlendMode.DstColor, NativeBlendMode.OneMinusSrcAlpha, true),
|
||
//Screen
|
||
new BlendFactor(NativeBlendMode.One, NativeBlendMode.OneMinusSrcColor, true),
|
||
//Erase
|
||
new BlendFactor(NativeBlendMode.Zero, NativeBlendMode.OneMinusSrcAlpha),
|
||
//Mask
|
||
new BlendFactor(NativeBlendMode.Zero, NativeBlendMode.SrcAlpha),
|
||
//Below
|
||
new BlendFactor(NativeBlendMode.OneMinusDstAlpha, NativeBlendMode.DstAlpha),
|
||
//Off
|
||
new BlendFactor(NativeBlendMode.One, NativeBlendMode.Zero),
|
||
//One_OneMinusSrcAlpha
|
||
new BlendFactor(NativeBlendMode.One, NativeBlendMode.OneMinusSrcAlpha),
|
||
//Custom1
|
||
new BlendFactor(NativeBlendMode.SrcAlpha, NativeBlendMode.OneMinusSrcAlpha),
|
||
//Custom2
|
||
new BlendFactor(NativeBlendMode.SrcAlpha, NativeBlendMode.OneMinusSrcAlpha),
|
||
//Custom3
|
||
new BlendFactor(NativeBlendMode.SrcAlpha, NativeBlendMode.OneMinusSrcAlpha)
|
||
};
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="mat"></param>
|
||
/// <param name="blendMode"></param>
|
||
public static void Apply(Material mat, BlendMode blendMode)
|
||
{
|
||
BlendFactor bf = Factors[(int)blendMode];
|
||
mat.SetFloat(ShaderConfig.ID_BlendSrcFactor, (float)bf.srcFactor);
|
||
mat.SetFloat(ShaderConfig.ID_BlendDstFactor, (float)bf.dstFactor);
|
||
|
||
if (bf.pma)
|
||
mat.SetFloat(ShaderConfig.ID_ColorOption, 1);
|
||
else
|
||
mat.SetFloat(ShaderConfig.ID_ColorOption, 0);
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="blendMode"></param>
|
||
/// <param name="srcFactor"></param>
|
||
/// <param name="dstFactor"></param>
|
||
public static void Override(BlendMode blendMode, NativeBlendMode srcFactor, NativeBlendMode dstFactor)
|
||
{
|
||
BlendFactor bf = Factors[(int)blendMode];
|
||
bf.srcFactor = srcFactor;
|
||
bf.dstFactor = dstFactor;
|
||
}
|
||
}
|
||
}
|