您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
362 行
12 KiB
362 行
12 KiB
using System.Reflection;
|
|
using UnityEditor.ShaderGraph.Drawing.Controls;
|
|
using UnityEngine;
|
|
using UnityEditor.Graphing;
|
|
|
|
namespace UnityEditor.ShaderGraph
|
|
{
|
|
[Title("Artistic", "Blend", "Blend")]
|
|
public class BlendNode : CodeFunctionNode
|
|
{
|
|
public BlendNode()
|
|
{
|
|
name = "Blend";
|
|
}
|
|
|
|
public override string documentationURL
|
|
{
|
|
get { return "https://github.com/Unity-Technologies/ShaderGraph/wiki/Blend-Node"; }
|
|
}
|
|
|
|
string GetCurrentBlendName()
|
|
{
|
|
return System.Enum.GetName(typeof(BlendMode), m_BlendMode);
|
|
}
|
|
|
|
[SerializeField]
|
|
BlendMode m_BlendMode = BlendMode.Overlay;
|
|
|
|
[EnumControl("Mode")]
|
|
public BlendMode blendMode
|
|
{
|
|
get { return m_BlendMode; }
|
|
set
|
|
{
|
|
if (m_BlendMode == value)
|
|
return;
|
|
|
|
m_BlendMode = value;
|
|
Dirty(ModificationScope.Graph);
|
|
}
|
|
}
|
|
|
|
protected override MethodInfo GetFunctionToConvert()
|
|
{
|
|
return GetType().GetMethod(string.Format("Unity_Blend_{0}", GetCurrentBlendName()),
|
|
BindingFlags.Static | BindingFlags.NonPublic);
|
|
}
|
|
|
|
static string Unity_Blend_Burn(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = 1.0 - (1.0 - Blend)/Base;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Darken(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = min(Blend, Base);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Difference(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = abs(Blend - Base);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Dodge(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = Base / (1.0 - Blend);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Divide(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = Base / (Blend + 0.000000000001);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Exclusion(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = Blend + Base - (2.0 * Blend * Base);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_HardLight(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
{precision}{slot2dimension} result1 = 1.0 - 2.0 * (1.0 - Base) * (1.0 - Blend);
|
|
{precision}{slot2dimension} result2 = 2.0 * Base * Blend;
|
|
{precision}{slot2dimension} zeroOrOne = step(Blend, 0.5);
|
|
Out = result2 * zeroOrOne + (1 - zeroOrOne) * result1;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_HardMix(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = step(1 - Base, Blend);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Lighten(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = max(Blend, Base);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_LinearBurn(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = Base + Blend - 1.0;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_LinearDodge(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = Base + Blend;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_LinearLight(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = Blend < 0.5 ? max(Base + (2 * Blend) - 1, 0) : min(Base + 2 * (Blend - 0.5), 1);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_LinearLightAddSub(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = Blend + 2.0 * Base - 1.0;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Multiply(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = Base * Blend;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Negation(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = 1.0 - abs(1.0 - Blend - Base);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Screen(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = 1.0 - (1.0 - Blend) * (1.0 - Base);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}";
|
|
}
|
|
|
|
static string Unity_Blend_Overlay(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
{precision}{slot2dimension} result1 = 1.0 - 2.0 * (1.0 - Base) * (1.0 - Blend);
|
|
{precision}{slot2dimension} result2 = 2.0 * Base * Blend;
|
|
{precision}{slot2dimension} zeroOrOne = step(Base, 0.5);
|
|
Out = result2 * zeroOrOne + (1 - zeroOrOne) * result1;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}
|
|
";
|
|
}
|
|
|
|
static string Unity_Blend_PinLight(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
{precision}{slot2dimension} check = step (0.5, Blend);
|
|
{precision}{slot2dimension} result1 = check * max(2.0 * (Base - 0.5), Blend);
|
|
Out = result1 + (1.0 - check) * min(2.0 * Base, Blend);
|
|
Out = lerp(Base, Out, Opacity);
|
|
}
|
|
";
|
|
}
|
|
|
|
static string Unity_Blend_SoftLight(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
{precision}{slot2dimension} result1 = 2.0 * Base * Blend + Base * Base * (1.0 - 2.0 * Blend);
|
|
{precision}{slot2dimension} result2 = sqrt(Base) * (2.0 * Blend - 1.0) + 2.0 * Base * (1.0 - Blend);
|
|
{precision}{slot2dimension} zeroOrOne = step(0.5, Blend);
|
|
Out = result2 * zeroOrOne + (1 - zeroOrOne) * result1;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}
|
|
";
|
|
}
|
|
|
|
static string Unity_Blend_VividLight(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
{precision}{slot2dimension} result1 = 1.0 - (1.0 - Blend) / (2.0 * Base);
|
|
{precision}{slot2dimension} result2 = Blend / (2.0 * (1.0 - Base));
|
|
{precision}{slot2dimension} zeroOrOne = step(0.5, Base);
|
|
Out = result2 * zeroOrOne + (1 - zeroOrOne) * result1;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}
|
|
";
|
|
}
|
|
|
|
static string Unity_Blend_Subtract(
|
|
[Slot(0, Binding.None)] DynamicDimensionVector Base,
|
|
[Slot(1, Binding.None)] DynamicDimensionVector Blend,
|
|
[Slot(3, Binding.None, 1, 1, 1, 1)] Vector1 Opacity,
|
|
[Slot(2, Binding.None)] out DynamicDimensionVector Out)
|
|
{
|
|
return
|
|
@"
|
|
{
|
|
Out = Base - Blend;
|
|
Out = lerp(Base, Out, Opacity);
|
|
}
|
|
";
|
|
}
|
|
}
|
|
}
|