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.
195 lines
7.5 KiB
195 lines
7.5 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEditor.Rendering.BuiltIn;
|
|
using UnityEditor.Rendering.Canvas.ShaderGraph;
|
|
using UnityEditor.ShaderGraph;
|
|
using UnityEngine.Rendering.HighDefinition;
|
|
using UnityEditor.ShaderGraph.Internal;
|
|
using UnityEditor.ShaderGraph.Serialization;
|
|
using UnityEngine.UIElements;
|
|
using UnityEditor.UIElements;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
|
|
namespace UnityEditor.Rendering.HighDefinition.ShaderGraph
|
|
{
|
|
class HDCanvasSubTarget : CanvasSubTarget<HDTarget>, IRequiresData<HDCanvasData>, IHasMetadata
|
|
{
|
|
// Constants
|
|
const string kAssetGuid = "799e4883420742bfa629d3d3d9b674d6"; // CanvasTarget.cs
|
|
|
|
static readonly string kHDCanvasPass = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Canvas/HDCanvasPass.hlsl";
|
|
|
|
public override void Setup(ref TargetSetupContext context)
|
|
{
|
|
base.Setup(ref context);
|
|
context.AddAssetDependency(new GUID(kAssetGuid), AssetCollection.Flags.SourceDependency);
|
|
}
|
|
|
|
protected override string pipelineTag => HDRenderPipeline.k_ShaderTagName;
|
|
|
|
protected override IncludeCollection pregraphIncludes => new IncludeCollection
|
|
{
|
|
{ CoreIncludes.MinimalCorePregraph },
|
|
{ "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl", IncludeLocation.Pregraph},
|
|
{ "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl", IncludeLocation.Pregraph}, // Need this to make the scene color/depth nodes work
|
|
{ CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph }
|
|
};
|
|
protected override IncludeCollection postgraphIncludes => new IncludeCollection
|
|
{
|
|
{kHDCanvasPass, IncludeLocation.Postgraph},
|
|
};
|
|
|
|
HDCanvasData m_CanvasData;
|
|
|
|
HDCanvasData IRequiresData<HDCanvasData>.data
|
|
{
|
|
get => m_CanvasData;
|
|
set => m_CanvasData = value;
|
|
}
|
|
|
|
public HDCanvasData CanvasData
|
|
{
|
|
get => m_CanvasData;
|
|
set => m_CanvasData = value;
|
|
}
|
|
|
|
|
|
// We don't need the save context / update materials for now
|
|
public override object saveContext => null;
|
|
|
|
public HDCanvasSubTarget()
|
|
{
|
|
displayName = "Canvas";
|
|
}
|
|
protected override DefineCollection GetAdditionalDefines()
|
|
{
|
|
var result = new DefineCollection();
|
|
if (canvasData.alphaClip)
|
|
result.Add(CoreKeywordDescriptors.AlphaTest, 1);
|
|
|
|
result.Add(base.GetAdditionalDefines());
|
|
return result;
|
|
}
|
|
public override void GetActiveBlocks(ref TargetActiveBlockContext context)
|
|
{
|
|
base.GetActiveBlocks(ref context);
|
|
context.AddBlock(BlockFields.SurfaceDescription.AlphaClipThreshold, canvasData.alphaClip);
|
|
}
|
|
|
|
public override void GetFields(ref TargetFieldContext context)
|
|
{
|
|
base.GetFields(ref context);
|
|
if(canvasData.alphaClip)
|
|
context.AddField(UnityEditor.ShaderGraph.Fields.AlphaTest);
|
|
}
|
|
|
|
public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode)
|
|
{
|
|
base.CollectShaderProperties(collector, generationMode);
|
|
if (canvasData.alphaClip)
|
|
collector.AddShaderProperty(CanvasProperties.AlphaTest);
|
|
}
|
|
|
|
protected override DefineCollection GetPassDefines()
|
|
{
|
|
var defines = base.GetPassDefines();
|
|
|
|
if (m_CanvasData.supportsMotionVectors)
|
|
{
|
|
defines.Add(new KeywordDescriptor
|
|
{
|
|
referenceName = "UI_MOTION_VECTORS",
|
|
displayName = "UI_MOTION_VECTORS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Global,
|
|
value = 1,
|
|
}, 1);
|
|
}
|
|
|
|
return defines;
|
|
}
|
|
|
|
public override PassDescriptor GenerateUIPassDescriptor(bool isSRP)
|
|
{
|
|
var pass = base.GenerateUIPassDescriptor(isSRP);
|
|
|
|
pass.requiredFields.Add(StructFields.Varyings.texCoord2); // Motion vectors support
|
|
|
|
// Patch render state to support motion vectors.
|
|
pass.renderStates = new RenderStateCollection
|
|
{
|
|
{RenderState.Cull(Cull.Off)},
|
|
// WW1MOD - Unity recommended workaround for Canvas ShaderGraphs not working correctly in SceneView.
|
|
// Note: Won't be fixed officially as it causes MotionVector issues with Text in WorldSpace UI. Not an issue for us.
|
|
// https://support.unity.com/hc/en-us/requests/2392321?page=1
|
|
//{RenderState.ZWrite(ZWrite.On)},
|
|
{RenderState.ZWrite(ZWrite.Off)},
|
|
// WW1MOD - END
|
|
{RenderState.ZTest(CanvasUniforms.ZTest)},
|
|
{RenderState.Blend(Blend.One, Blend.OneMinusSrcAlpha)},
|
|
{RenderState.ColorMask(CanvasUniforms.ColorMask)},
|
|
{RenderState.Stencil(new StencilDescriptor()
|
|
{
|
|
Ref = CanvasUniforms.Ref,
|
|
Comp = CanvasUniforms.Comp,
|
|
Pass = CanvasUniforms.Pass,
|
|
ReadMask = CanvasUniforms.ReadMask,
|
|
WriteMask = CanvasUniforms.WriteMask,
|
|
})
|
|
}
|
|
};
|
|
|
|
return pass;
|
|
}
|
|
|
|
public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action<string> registerUndo)
|
|
{
|
|
base.GetPropertiesGUI(ref context, onChange, registerUndo);
|
|
|
|
context.AddProperty("Supports Motion vectors", new Toggle() { value = m_CanvasData.supportsMotionVectors }, (evt) =>
|
|
{
|
|
if (Equals(m_CanvasData.supportsMotionVectors, evt.newValue))
|
|
return;
|
|
|
|
registerUndo("Supports Motion vectors");
|
|
m_CanvasData.supportsMotionVectors = evt.newValue;
|
|
onChange();
|
|
});
|
|
}
|
|
|
|
public override bool IsNodeAllowedBySubTarget(Type nodeType)
|
|
{
|
|
base.IsNodeAllowedBySubTarget(nodeType);
|
|
|
|
bool allowed = true;
|
|
if (nodeType == typeof(BuiltinCorneaIOR))
|
|
return false;
|
|
if (nodeType == typeof(BuiltinIrisPlaneOffset))
|
|
return false;
|
|
if (nodeType == typeof(BuiltinIrisRadius))
|
|
return false;
|
|
if (nodeType == typeof(BlendNormal_Water))
|
|
return false;
|
|
if (nodeType == typeof(ComputeVertexData_Water))
|
|
return false;
|
|
if (nodeType == typeof(EvaluateFoamData_Water))
|
|
return false;
|
|
if (nodeType == typeof(EvaluateRefractionData_Water))
|
|
return false;
|
|
if (nodeType == typeof(EvaluateScatteringColor_Water))
|
|
return false;
|
|
if (nodeType == typeof(EvaluateSimulationAdditionalData_Water))
|
|
return false;
|
|
if (nodeType == typeof(EvaluateSimulationCaustics_Water))
|
|
return false;
|
|
if (nodeType == typeof(EvaluateTipThickness_Water))
|
|
return false;
|
|
if (nodeType == typeof(BlendNormal_Water))
|
|
return false;
|
|
|
|
return allowed;
|
|
}
|
|
}
|
|
}
|