From 397ab273d382ef243b5e25f2826065b505088221 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 16 Sep 2021 15:39:22 +0200 Subject: [PATCH 001/108] Initial fullscreen target files --- .../Editor/Generation/Targets/Fullscreen.meta | 8 + .../Targets/Fullscreen/FullscreenMetaData.cs | 19 + .../Fullscreen/FullscreenMetaData.cs.meta | 11 + .../Targets/Fullscreen/FullscreenSubTarget.cs | 222 +++ .../Fullscreen/FullscreenSubTarget.cs.meta | 11 + .../Targets/Fullscreen/FullscreenTarget.cs | 1390 +++++++++++++++++ .../Fullscreen/FullscreenTarget.cs.meta | 11 + .../Targets/Fullscreen/Templates.meta | 8 + .../Templates/ShaderCode.template.hlsl | 124 ++ .../Templates/ShaderCode.template.hlsl.meta | 7 + .../Fullscreen/Templates/ShaderPass.template | 105 ++ .../Templates/ShaderPass.template.meta | 7 + 12 files changed, 1923 insertions(+) create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template.meta diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen.meta new file mode 100644 index 00000000000..29be796022a --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b08719eeefb3f464f9c08fa512667b40 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs new file mode 100644 index 00000000000..485c789ff4d --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs @@ -0,0 +1,19 @@ +using System; +using UnityEngine; +using UnityEditor.Rendering.BuiltIn; + +namespace UnityEditor.Rendering.Fullscreen.ShaderGraph +{ + [Serializable] + sealed class FullscreenMetadata : ScriptableObject + { + [SerializeField] + FullscreenTarget.MaterialType m_MaterialType; + + public FullscreenTarget.MaterialType materialType + { + get => m_MaterialType; + set => m_MaterialType = value; + } + } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs.meta new file mode 100644 index 00000000000..900c66d7336 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e392ecea19f8779438f0b90905fdee13 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs new file mode 100644 index 00000000000..b9e5545c64e --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -0,0 +1,222 @@ +using UnityEditor.ShaderGraph; +using UnityEngine; +using static UnityEditor.Rendering.BuiltIn.ShaderUtils; +using UnityEditor.Rendering.BuiltIn; +using System; + +namespace UnityEditor.Rendering.Fullscreen.ShaderGraph +{ + class FullscreenSubTarget : SubTarget, IHasMetadata + { + static readonly GUID kSourceCodeGuid = new GUID("1cfc804c75474e144be5d4158b9522ed"); // FullscreenSubTarget.cs // TODO + + public override void Setup(ref TargetSetupContext context) + { + context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); + + // TODO: custom editor field + // if (!context.HasCustomEditorForRenderPipeline(null)) + // context.customEditorForRenderPipelines.Add((typeof(BuiltInUnlitGUI).FullName, "")); + + // Process SubShaders + context.AddSubShader(SubShaders.Unlit(target)); + } + + protected FullscreenTarget.MaterialType materialType { get; } + + public virtual string identifier => GetType().Name; + public virtual ScriptableObject GetMetadataObject() + { + var bultInMetadata = ScriptableObject.CreateInstance(); + bultInMetadata.materialType = materialType; + return bultInMetadata; + } + + // We don't need the save context / update materials for now + public override object saveContext => null; + + + + public FullscreenSubTarget() + { + displayName = "FullScreen"; + } + + public override bool IsActive() => true; + + public override void ProcessPreviewMaterial(Material material) + { + if (target.allowMaterialOverride) + { + // copy our target's default settings into the material + // (technically not necessary since we are always recreating the material from the shader each time, + // which will pull over the defaults from the shader definition) + // but if that ever changes, this will ensure the defaults are set + // TODO: + // material.SetFloat(Property.Blend(), (float)target.alphaMode); + // material.SetFloat(Property.ZWriteControl(), target.zWrite ? 1 : 0); // TODO + material.SetFloat(Property.ZTest(), (float)target.depthTestMode); + } + + // We always need these properties regardless of whether the material is allowed to override + // Queue control & offset enable correct automatic render queue behavior + // Control == 0 is automatic, 1 is user-specified render queue + // material.SetFloat(Property.QueueOffset(), 0.0f); + // material.SetFloat(Property.QueueControl(), (float)BuiltInBaseShaderGUI.QueueControl.Auto); + + // call the full unlit material setup function + // BuiltInUnlitGUI.UpdateMaterial(material); + } + + public override void GetFields(ref TargetFieldContext context) + { + } + + public override void GetActiveBlocks(ref TargetActiveBlockContext context) + { + context.AddBlock(BlockFields.SurfaceDescription.BaseColor, target.allowMaterialOverride); + } + + public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) + { + if (target.allowMaterialOverride) + { + base.CollectShaderProperties(collector, generationMode); + + // setup properties using the defaults + // TODO + // collector.AddFloatProperty(Property.Blend(), (float)target.alphaMode); + collector.AddFloatProperty(Property.SrcBlend(), 1.0f); // always set by material inspector (TODO : get src/dst blend and set here?) + collector.AddFloatProperty(Property.DstBlend(), 0.0f); // always set by material inspector + collector.AddFloatProperty(Property.ZWrite(), 0.0f); // TODO + // collector.AddFloatProperty(Property.ZWriteControl(), (float)target.zWriteControl); + collector.AddFloatProperty(Property.ZTest(), (float)target.depthTestMode); // ztest mode is designed to directly pass as ztest + } + + // We always need these properties regardless of whether the material is allowed to override other shader properties. + // Queue control & offset enable correct automatic render queue behavior. Control == 0 is automatic, 1 is user-specified. + // We initialize queue control to -1 to indicate to UpdateMaterial that it needs to initialize it properly on the material. + // collector.AddFloatProperty(Property.QueueOffset(), 0.0f); + // collector.AddFloatProperty(Property.QueueControl(), -1.0f); + } + + public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) + { + // TODO: sub target specific options? + } + + #region SubShader + static class SubShaders + { + public static SubShaderDescriptor Unlit(FullscreenTarget target) + { + var result = new SubShaderDescriptor() + { + generatesPreview = true, + passes = new PassCollection() + }; + + result.passes.Add(UnlitPasses.Unlit(target)); + + return result; + } + } + #endregion + + #region Pass + static class UnlitPasses + { + public static PassDescriptor Unlit(FullscreenTarget target) + { + var result = new PassDescriptor + { + // Definition + displayName = "Fullscreen", + referenceName = "SHADERPASS_FULLSCREEN", + useInPreview = true, + + // Template + passTemplatePath = FullscreenTarget.kTemplatePath, + sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, + + // Port Mask + validVertexBlocks = new BlockFieldDescriptor[] { }, // No vertex blocks for fullscreen shaders + validPixelBlocks = new BlockFieldDescriptor[] + { + Color, + }, + + // Fields + structs = new StructCollection + { + { Structs.Attributes }, + { Structs.SurfaceDescriptionInputs }, + { Structs.VertexDescriptionInputs }, + }, + fieldDependencies = CoreFieldDependencies.Default, + + // Conditional State + renderStates = CoreRenderStates.Default(target), + pragmas = CorePragmas.Default, + defines = new DefineCollection(), + keywords = new KeywordCollection(), + includes = UnlitIncludes.Unlit, + }; + return result; + } + + public static BlockFieldDescriptor Color = new BlockFieldDescriptor("SurfaceDescription", "Color", "Color", "SURFACEDESCRIPTION_COLOR", new ColorControl(UnityEngine.Color.grey, true), ShaderStage.Fragment); + } + #endregion + + #region Keywords + static class UnlitKeywords + { + public static KeywordCollection Unlit(FullscreenTarget target) + { + var result = new KeywordCollection + { + // { CoreKeywordDescriptors.Lightmap }, + // { CoreKeywordDescriptors.DirectionalLightmapCombined }, + // { CoreKeywordDescriptors.SampleGI }, + }; + + return result; + } + } + #endregion + + #region Includes + static class UnlitIncludes + { + const string kUnlitPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/UnlitPass.hlsl"; + + public static IncludeCollection Unlit = new IncludeCollection + { + // Pre-graph + { CoreIncludes.CorePregraph }, + { CoreIncludes.ShaderGraphPregraph }, + + // Post-graph + { CoreIncludes.CorePostgraph }, + { kUnlitPass, IncludeLocation.Postgraph }, + }; + } + #endregion + } + + // internal static class SubShaderUtils + // { + // // Overloads to do inline PassDescriptor modifications + // // NOTE: param order should match PassDescriptor field order for consistency + // #region PassVariant + // internal static PassDescriptor PassVariant(in PassDescriptor source, PragmaCollection pragmas) + // { + // var result = source; + // result.pragmas = pragmas; + // return result; + // } + + // #endregion + // } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs.meta new file mode 100644 index 00000000000..9e73e96aec6 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1cfc804c75474e144be5d4158b9522ed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs new file mode 100644 index 00000000000..b5da5a05a74 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs @@ -0,0 +1,1390 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.UIElements; +using UnityEditor.UIElements; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Legacy; +using UnityEditor.ShaderGraph.Serialization; +using UnityEditor.Rendering.BuiltIn; +using UnityEditor.Rendering.BuiltIn.ShaderGraph; +using BlendMode = UnityEngine.Rendering.BlendMode; +using BlendOp = UnityEditor.ShaderGraph.BlendOp; + +namespace UnityEditor.Rendering.Fullscreen.ShaderGraph +{ + sealed class FullscreenTarget : Target, IHasMetadata + { + public enum MaterialType + { + Blit, + // DrawProcedural, // TODO + // CustomRenderTexture, + } + + public enum FullscreenBlendMode + { + Disabled, + Alpha, + Premultiply, + Additive, + Multiply, + Custom, + } + + public override int latestVersion => 0; + + // Constants + static readonly GUID kSourceCodeGuid = new GUID("11771342b6f6ab840ba9e2274ddd9db3"); // FullscreenTarget.cs + public static readonly string[] kSharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories().Union(new string[] { "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates" }).ToArray(); + public const string kTemplatePath = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template"; + + // SubTarget + List m_SubTargets; + List m_SubTargetNames; + int activeSubTargetIndex => m_SubTargets.IndexOf(m_ActiveSubTarget); + + // View + PopupField m_SubTargetField; + TextField m_CustomGUIField; + + [SerializeField] + JsonData m_ActiveSubTarget; + + // When checked, allows the material to control ALL surface settings (uber shader style) + [SerializeField] + bool m_AllowMaterialOverride = false; + + [SerializeField] + FullscreenBlendMode m_BlendMode = FullscreenBlendMode.Disabled; + + [SerializeField] + BlendMode m_SrcColorBlendMode = BlendMode.Zero; + [SerializeField] + BlendMode m_DstColorBlendMode = BlendMode.One; + [SerializeField] + BlendOp m_ColorBlendOperation = BlendOp.Add; + + [SerializeField] + BlendMode m_SrcAlphaBlendMode = BlendMode.Zero; + [SerializeField] + BlendMode m_DstAlphaBlendMode = BlendMode.One; + [SerializeField] + BlendOp m_AlphaBlendOperation = BlendOp.Add; + + [SerializeField] + bool m_EnableStencil = false; + [SerializeField] + int m_StencilReference = 0; + [SerializeField] + int m_StencilReadMask = 255; + [SerializeField] + int m_StencilWriteMask = 255; + [SerializeField] + CompareFunction m_StencilCompareFunction = CompareFunction.Always; + [SerializeField] + StencilOp m_StencilPassOperation = StencilOp.Keep; + [SerializeField] + StencilOp m_StencilFailOperation = StencilOp.Keep; + [SerializeField] + StencilOp m_StencilDepthFailOperation = StencilOp.Keep; + + [SerializeField] + bool m_DepthWrite = false; + + [SerializeField] + ZTestMode m_DepthTestMode = ZTestMode.Always; + + [SerializeField] + string m_CustomEditorGUI; + + internal override bool ignoreCustomInterpolators => true; + internal override int padCustomInterpolatorLimit => 4; + + public FullscreenTarget() + { + displayName = "Full-screen"; + m_SubTargets = TargetUtils.GetSubTargets(this); + m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList(); + TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + } + + public FullscreenBlendMode blendMode + { + get => m_BlendMode; + set => m_BlendMode = value; + } + + public BlendMode srcColorBlendMode + { + get => m_SrcColorBlendMode; + set => m_SrcColorBlendMode = value; + } + + public BlendMode dstColorBlendMode + { + get => m_DstColorBlendMode; + set => m_DstColorBlendMode = value; + } + + public BlendOp colorBlendOperation + { + get => m_ColorBlendOperation; + set => m_ColorBlendOperation = value; + } + + public BlendMode srcAlphaBlendMode + { + get => m_SrcAlphaBlendMode; + set => m_SrcAlphaBlendMode = value; + } + + public BlendMode dstAlphaBlendMode + { + get => m_DstAlphaBlendMode; + set => m_DstAlphaBlendMode = value; + } + + public BlendOp alphaBlendOperation + { + get => m_AlphaBlendOperation; + set => m_AlphaBlendOperation = value; + } + + public bool enableStencil + { + get => m_EnableStencil; + set => m_EnableStencil = value; + } + + public int stencilReference + { + get => m_StencilReference; + set => m_StencilReference = Mathf.Clamp(value, 0, 255); + } + + public int stencilReadMask + { + get => m_StencilReadMask; + set => m_StencilReadMask = Mathf.Clamp(value, 0, 255); + } + + public int stencilWriteMask + { + get => m_StencilWriteMask; + set => m_StencilWriteMask = Mathf.Clamp(value, 0, 255); + } + + public CompareFunction stencilCompareFunction + { + get => m_StencilCompareFunction; + set => m_StencilCompareFunction = value; + } + + public StencilOp stencilPassOperation + { + get => m_StencilPassOperation; + set => m_StencilPassOperation = value; + } + + public StencilOp stencilFailOperation + { + get => m_StencilFailOperation; + set => m_StencilFailOperation = value; + } + + public StencilOp stencilDepthTestFailOperation + { + get => m_StencilDepthFailOperation; + set => m_StencilDepthFailOperation = value; + } + + public bool depthWrite + { + get => m_DepthWrite; + set => m_DepthWrite = value; + } + + public SubTarget activeSubTarget + { + get => m_ActiveSubTarget.value; + set => m_ActiveSubTarget = value; + } + + public bool allowMaterialOverride + { + get => m_AllowMaterialOverride; + set => m_AllowMaterialOverride = value; + } + + public ZTestMode depthTestMode + { + get => m_DepthTestMode; + set => m_DepthTestMode = value; + } + + public string customEditorGUI + { + get => m_CustomEditorGUI; + set => m_CustomEditorGUI = value; + } + + public override bool IsActive() => activeSubTarget.IsActive(); + + public override bool IsNodeAllowedByTarget(Type nodeType) + { + // TODO: we must remove a lot of nodes :/ + return base.IsNodeAllowedByTarget(nodeType); + } + + public override void Setup(ref TargetSetupContext context) + { + // Setup the Target + context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); + + // Setup the active SubTarget + TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + if (m_ActiveSubTarget.value == null) + return; + m_ActiveSubTarget.value.target = this; + m_ActiveSubTarget.value.Setup(ref context); + + // Override EditorGUI + if (!string.IsNullOrEmpty(m_CustomEditorGUI)) + { + context.SetDefaultShaderGUI(m_CustomEditorGUI); + } + } + + public override void OnAfterMultiDeserialize(string json) + { + TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + m_ActiveSubTarget.value.target = this; + } + + public override void GetFields(ref TargetFieldContext context) + { + var descs = context.blocks.Select(x => x.descriptor); + // Core fields + // Always force vertex as the shim between built-in cginc files and hlsl files requires this + context.AddField(Fields.GraphVertex); + context.AddField(Fields.GraphPixel); + + // SubTarget fields + m_ActiveSubTarget.value.GetFields(ref context); + } + + public override void GetActiveBlocks(ref TargetActiveBlockContext context) + { + // Core blocks + context.AddBlock(BlockFields.VertexDescription.Position); + context.AddBlock(BlockFields.VertexDescription.Normal); + context.AddBlock(BlockFields.VertexDescription.Tangent); + context.AddBlock(BlockFields.SurfaceDescription.BaseColor); + + // SubTarget blocks + m_ActiveSubTarget.value.GetActiveBlocks(ref context); + } + + public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) + { + base.CollectShaderProperties(collector, generationMode); + activeSubTarget.CollectShaderProperties(collector, generationMode); + // collector.AddShaderProperty(LightmappingShaderProperties.kLightmapsArray); + // collector.AddShaderProperty(LightmappingShaderProperties.kLightmapsIndirectionArray); + // collector.AddShaderProperty(LightmappingShaderProperties.kShadowMasksArray); + } + + public override void ProcessPreviewMaterial(Material material) + { + m_ActiveSubTarget.value.ProcessPreviewMaterial(material); + } + + public override object saveContext => m_ActiveSubTarget.value?.saveContext; + + public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) + { + if (m_ActiveSubTarget.value == null) + return; + + // Core properties + // m_SubTargetField = new PopupField(m_SubTargetNames, activeSubTargetIndex); + // context.AddProperty("Material", m_SubTargetField, (evt) => + // { + // if (Equals(activeSubTargetIndex, m_SubTargetField.index)) + // return; + + // registerUndo("Change Material"); + // m_ActiveSubTarget = m_SubTargets[m_SubTargetField.index]; + // onChange(); + // }); + + context.AddProperty("Allow Material Override", new Toggle() { value = allowMaterialOverride }, (evt) => + { + if (Equals(allowMaterialOverride, evt.newValue)) + return; + + registerUndo("Change Allow Material Override"); + allowMaterialOverride = evt.newValue; + onChange(); + }); + + GetRenderStatePropertiesGUI(ref context, onChange, registerUndo); + + // SubTarget properties + m_ActiveSubTarget.value.GetPropertiesGUI(ref context, onChange, registerUndo); + + // Custom Editor GUI + // Requires FocusOutEvent + m_CustomGUIField = new TextField("") { value = customEditorGUI }; + m_CustomGUIField.RegisterCallback(s => + { + if (Equals(customEditorGUI, m_CustomGUIField.value)) + return; + + registerUndo("Change Custom Editor GUI"); + customEditorGUI = m_CustomGUIField.value; + onChange(); + }); + context.AddProperty("Custom Editor GUI", m_CustomGUIField, (evt) => { }); + } + + public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) + { + context.AddProperty("Blend Mode", new EnumField(blendMode) { value = blendMode }, (evt) => + { + if (Equals(blendMode, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + blendMode = (FullscreenBlendMode)evt.newValue; + onChange(); + }); + + if (blendMode == FullscreenBlendMode.Custom) + { + context.globalIndentLevel++; + context.AddLabel("Color Blend Mode", 0); + + context.AddProperty("Src Color", new EnumField(srcColorBlendMode) { value = srcColorBlendMode }, (evt) => + { + if (Equals(srcColorBlendMode, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + srcColorBlendMode = (BlendMode)evt.newValue; + onChange(); + }); + context.AddProperty("Dst Color", new EnumField(dstColorBlendMode) { value = dstColorBlendMode }, (evt) => + { + if (Equals(dstColorBlendMode, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + dstColorBlendMode = (BlendMode)evt.newValue; + onChange(); + }); + context.AddProperty("Color Operation", new EnumField(colorBlendOperation) { value = colorBlendOperation }, (evt) => + { + if (Equals(colorBlendOperation, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + colorBlendOperation = (BlendOp)evt.newValue; + onChange(); + }); + + context.AddLabel("Alpha Blend Mode", 0); + + + context.AddProperty("Src", new EnumField(srcAlphaBlendMode) { value = srcAlphaBlendMode }, (evt) => + { + if (Equals(srcAlphaBlendMode, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + srcAlphaBlendMode = (BlendMode)evt.newValue; + onChange(); + }); + context.AddProperty("Dst", new EnumField(dstAlphaBlendMode) { value = dstAlphaBlendMode }, (evt) => + { + if (Equals(dstAlphaBlendMode, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + dstAlphaBlendMode = (BlendMode)evt.newValue; + onChange(); + }); + context.AddProperty("Blend Operation Alpha", new EnumField(alphaBlendOperation) { value = alphaBlendOperation }, (evt) => + { + if (Equals(alphaBlendOperation, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + alphaBlendOperation = (BlendOp)evt.newValue; + onChange(); + }); + + context.globalIndentLevel--; + } + + context.AddProperty("Enable Stencil", new Toggle { value = enableStencil }, (evt) => + { + if (Equals(enableStencil, evt.newValue)) + return; + + registerUndo("Change Enable Stencil"); + enableStencil = evt.newValue; + onChange(); + }); + + if (enableStencil) + { + context.globalIndentLevel++; + + context.AddProperty("Reference", new IntegerField { value = stencilReference, isDelayed = true }, (evt) => + { + if (Equals(stencilReference, evt.newValue)) + return; + + registerUndo("Change Stencil Reference"); + stencilReference = evt.newValue; + onChange(); + }); + + context.AddProperty("Read Mask", new IntegerField { value = stencilReadMask, isDelayed = true }, (evt) => + { + if (Equals(stencilReadMask, evt.newValue)) + return; + + registerUndo("Change Stencil Read Mask"); + stencilReadMask = evt.newValue; + onChange(); + }); + + context.AddProperty("Write Mask", new IntegerField { value = stencilWriteMask, isDelayed = true }, (evt) => + { + if (Equals(stencilWriteMask, evt.newValue)) + return; + + registerUndo("Change Stencil Write Mask"); + stencilWriteMask = evt.newValue; + onChange(); + }); + + context.AddProperty("Comparison", new EnumField(stencilCompareFunction) { value = stencilCompareFunction }, (evt) => + { + if (Equals(stencilCompareFunction, evt.newValue)) + return; + + registerUndo("Change Stencil Comparison"); + stencilCompareFunction = (CompareFunction)evt.newValue; + onChange(); + }); + + context.AddProperty("Pass", new EnumField(stencilPassOperation) { value = stencilPassOperation }, (evt) => + { + if (Equals(stencilPassOperation, evt.newValue)) + return; + + registerUndo("Change Stencil Pass Operation"); + stencilPassOperation = (StencilOp)evt.newValue; + onChange(); + }); + + context.AddProperty("Fail", new EnumField(stencilFailOperation) { value = stencilFailOperation }, (evt) => + { + if (Equals(stencilFailOperation, evt.newValue)) + return; + + registerUndo("Change Stencil Fail Operation"); + stencilFailOperation = (StencilOp)evt.newValue; + onChange(); + }); + + context.AddProperty("Depth Fail", new EnumField(stencilDepthTestFailOperation) { value = stencilDepthTestFailOperation }, (evt) => + { + if (Equals(stencilDepthTestFailOperation, evt.newValue)) + return; + + registerUndo("Change Stencil Depth Fail Operation"); + stencilDepthTestFailOperation = (StencilOp)evt.newValue; + onChange(); + }); + + context.globalIndentLevel--; + } + + context.AddProperty("Depth Test", new EnumField(ZTestMode.LEqual) { value = depthTestMode }, (evt) => + { + if (Equals(depthTestMode, evt.newValue)) + return; + + registerUndo("Change Depth Test"); + depthTestMode = (ZTestMode)evt.newValue; + onChange(); + }); + + context.AddProperty("Depth Write", new Toggle { value = depthWrite }, (evt) => + { + if (Equals(depthTestMode, evt.newValue)) + return; + + registerUndo("Change Depth Test"); + depthWrite = evt.newValue; + onChange(); + }); + + } + + public bool TrySetActiveSubTarget(Type subTargetType) + { + if (!subTargetType.IsSubclassOf(typeof(SubTarget))) + return false; + + foreach (var subTarget in m_SubTargets) + { + if (subTarget.GetType().Equals(subTargetType)) + { + m_ActiveSubTarget = subTarget; + return true; + } + } + + return false; + } + + // The fullscreen target is compatible with all pipeline (it doesn't rely on any RP rendering feature) + public override bool WorksWithSRP(RenderPipelineAsset scriptableRenderPipeline) => true; + + public override void OnAfterDeserialize(string json) + { + base.OnAfterDeserialize(json); + + if (this.sgVersion < latestVersion) + { + ChangeVersion(latestVersion); + } + } + + #region Metadata + string IHasMetadata.identifier + { + get + { + // defer to subtarget + if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData) + return subTargetHasMetaData.identifier; + return null; + } + } + + ScriptableObject IHasMetadata.GetMetadataObject() + { + // defer to subtarget + if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData) + return subTargetHasMetaData.GetMetadataObject(); + return null; + } + + #endregion + } + + #region Passes + static class CorePasses + { + internal static void AddSurfaceTypeControlToPass(ref PassDescriptor pass, FullscreenTarget target) + { + // if (target.allowMaterialOverride) + // { + // pass.keywords.Add(CoreKeywordDescriptors.SurfaceTypeTransparent); + // } + // else if (target.surfaceType == SurfaceType.Transparent) + // { + // pass.defines.Add(CoreKeywordDescriptors.SurfaceTypeTransparent, 1); + // } + } + + internal static void AddAlphaPremultiplyControlToPass(ref PassDescriptor pass, FullscreenTarget target) + { + // if (target.allowMaterialOverride) + // { + // pass.keywords.Add(CoreKeywordDescriptors.AlphaPremultiplyOn); + // } + // else if (target.alphaMode == AlphaMode.Premultiply) + // { + // pass.defines.Add(CoreKeywordDescriptors.AlphaPremultiplyOn, 1); + // } + } + + internal static void AddAlphaClipControlToPass(ref PassDescriptor pass, FullscreenTarget target) + { + // if (target.allowMaterialOverride) + // { + // pass.keywords.Add(CoreKeywordDescriptors.AlphaClip); + // pass.keywords.Add(CoreKeywordDescriptors.AlphaTestOn); + // } + // else if (target.alphaClip) + // { + // pass.defines.Add(CoreKeywordDescriptors.AlphaClip, 1); + // pass.defines.Add(CoreKeywordDescriptors.AlphaTestOn, 1); + // } + } + + // public static PassDescriptor DepthOnly(FullscreenTarget target) + // { + // var result = new PassDescriptor() + // { + // // Definition + // displayName = "DepthOnly", + // referenceName = "SHADERPASS_DEPTHONLY", + // lightMode = "DepthOnly", + // useInPreview = true, + + // // Template + // passTemplatePath = FullscreenTarget.kTemplatePath, + // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, + + // // Port Mask + // validVertexBlocks = CoreBlockMasks.Vertex, + // validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, + + // // Fields + // structs = CoreStructCollections.Default, + // fieldDependencies = CoreFieldDependencies.Default, + + // // Conditional State + // renderStates = CoreRenderStates.DepthOnly(target), + // pragmas = CorePragmas.Instanced, + // defines = new DefineCollection() { CoreDefines.BuiltInTargetAPI }, + // keywords = new KeywordCollection(), + // includes = CoreIncludes.DepthOnly, + + // // Custom Interpolator Support + // customInterpolators = CoreCustomInterpDescriptors.Common + // }; + + // AddAlphaClipControlToPass(ref result, target); + + // return result; + // } + + // public static PassDescriptor ShadowCaster(FullscreenTarget target) + // { + // var result = new PassDescriptor() + // { + // // Definition + // displayName = "ShadowCaster", + // referenceName = "SHADERPASS_SHADOWCASTER", + // lightMode = "ShadowCaster", + + // // Template + // passTemplatePath = FullscreenTarget.kTemplatePath, + // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, + + // // Port Mask + // validVertexBlocks = CoreBlockMasks.Vertex, + // validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, + + // // Fields + // structs = CoreStructCollections.Default, + // requiredFields = CoreRequiredFields.ShadowCaster, + // fieldDependencies = CoreFieldDependencies.Default, + + // // Conditional State + // renderStates = CoreRenderStates.ShadowCaster(target), + // pragmas = CorePragmas.ShadowCaster, + // defines = new DefineCollection() { CoreDefines.BuiltInTargetAPI }, + // keywords = new KeywordCollection { CoreKeywords.ShadowCaster }, + // includes = CoreIncludes.ShadowCaster, + + // // Custom Interpolator Support + // customInterpolators = CoreCustomInterpDescriptors.Common + // }; + + // AddCommonPassSurfaceControlsToPass(ref result, target); + + // return result; + // } + + // public static PassDescriptor SceneSelection(FullscreenTarget target) + // { + // var result = new PassDescriptor() + // { + // // Definition + // displayName = "SceneSelectionPass", + // referenceName = "SceneSelectionPass", + // lightMode = "SceneSelectionPass", + // useInPreview = true, + + // // Template + // passTemplatePath = FullscreenTarget.kTemplatePath, + // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, + + // // Port Mask + // validVertexBlocks = CoreBlockMasks.Vertex, + // validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, + + // // Fields + // structs = CoreStructCollections.Default, + // fieldDependencies = CoreFieldDependencies.Default, + + // // Conditional State + // renderStates = CoreRenderStates.SceneSelection(target), + // pragmas = CorePragmas.Instanced, + // defines = new DefineCollection { CoreDefines.SceneSelection }, + // keywords = new KeywordCollection(), + // includes = CoreIncludes.SceneSelection, + + // // Custom Interpolator Support + // customInterpolators = CoreCustomInterpDescriptors.Common + // }; + + // AddCommonPassSurfaceControlsToPass(ref result, target); + + // return result; + // } + + // public static PassDescriptor ScenePicking(FullscreenTarget target) + // { + // var result = new PassDescriptor() + // { + // // Definition + // displayName = "ScenePickingPass", + // referenceName = "ScenePickingPass", + // lightMode = "Picking", + // useInPreview = true, + + // // Template + // passTemplatePath = FullscreenTarget.kTemplatePath, + // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, + + // // Port Mask + // validVertexBlocks = CoreBlockMasks.Vertex, + // validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, + + // // Fields + // structs = CoreStructCollections.Default, + // fieldDependencies = CoreFieldDependencies.Default, + + // // Conditional State + // renderStates = CoreRenderStates.ScenePicking(target), + // pragmas = CorePragmas.Instanced, + // defines = new DefineCollection { CoreDefines.ScenePicking }, + // keywords = new KeywordCollection(), + // includes = CoreIncludes.ScenePicking, + + // // Custom Interpolator Support + // customInterpolators = CoreCustomInterpDescriptors.Common + // }; + + // AddCommonPassSurfaceControlsToPass(ref result, target); + + // return result; + // } + } + #endregion + + #region FieldDependencies + static class CoreFieldDependencies + { + public static readonly DependencyCollection Default = new DependencyCollection() + { + { FieldDependencies.Default }, + // TODO: VR support + // new FieldDependency(BuiltInStructFields.Varyings.stereoTargetEyeIndexAsRTArrayIdx, StructFields.Attributes.instanceID), + // new FieldDependency(BuiltInStructFields.Varyings.stereoTargetEyeIndexAsBlendIdx0, StructFields.Attributes.instanceID), + }; + } + #endregion + + #region RenderStates + static class CoreRenderStates + { + public static class Uniforms + { + public static readonly string srcBlend = "[" + Property.SG_SrcBlend + "]"; + public static readonly string dstBlend = "[" + Property.SG_DstBlend + "]"; + public static readonly string cullMode = "[" + Property.SG_Cull + "]"; + public static readonly string zWrite = "[" + Property.SG_ZWrite + "]"; + public static readonly string zTest = "[" + Property.SG_ZTest + "]"; + } + + public static Cull RenderFaceToCull(RenderFace renderFace) + { + switch (renderFace) + { + case RenderFace.Back: + return Cull.Front; + case RenderFace.Front: + return Cull.Back; + case RenderFace.Both: + return Cull.Off; + } + return Cull.Back; + } + + public static void AddUberSwitchedZTest(FullscreenTarget target, RenderStateCollection renderStates) + { + if (target.allowMaterialOverride) + renderStates.Add(RenderState.ZTest(Uniforms.zTest)); + else + renderStates.Add(RenderState.ZTest(target.depthTestMode.ToString())); + } + + public static void AddUberSwitchedZWrite(FullscreenTarget target, RenderStateCollection renderStates) + { + if (target.allowMaterialOverride) + renderStates.Add(RenderState.ZWrite(Uniforms.zWrite)); + // TODO + // else + // renderStates.Add(RenderState.ZWrite(ZWriteControlToZWrite(target.zWriteControl, target.surfaceType))); + } + + public static void AddUberSwitchedCull(FullscreenTarget target, RenderStateCollection renderStates) + { + // TODO + // renderStates.Add(RenderState.Cull()); + } + + public static void AddUberSwitchedBlend(FullscreenTarget target, RenderStateCollection renderStates) + { + if (target.allowMaterialOverride) + { + renderStates.Add(RenderState.Blend(Uniforms.srcBlend, Uniforms.dstBlend)); + } + else + { + // TODO + // if (target.alphaMode == AlphaMode.Alpha) + // renderStates.Add(RenderState.Blend(Blend.SrcAlpha, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); + // else if (target.alphaMode == AlphaMode.Premultiply) + // renderStates.Add(RenderState.Blend(Blend.One, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); + // else if (target.alphaMode == AlphaMode.Additive) + // renderStates.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); + // else if (target.alphaMode == AlphaMode.Multiply) + // renderStates.Add(RenderState.Blend(Blend.DstColor, Blend.Zero)); + } + } + + public static readonly RenderStateCollection MaterialControlledDefault = new RenderStateCollection + { + { RenderState.ZTest(Uniforms.zTest) }, + { RenderState.ZWrite(Uniforms.zWrite) }, + { RenderState.Cull(Uniforms.cullMode) }, + { RenderState.Blend(Uniforms.srcBlend, Uniforms.dstBlend) }, + }; + + public static RenderStateCollection Default(FullscreenTarget target) + { + if (target.allowMaterialOverride) + return MaterialControlledDefault; + else + { + var result = new RenderStateCollection(); + AddUberSwitchedZTest(target, result); + AddUberSwitchedZWrite(target, result); + AddUberSwitchedCull(target, result); + AddUberSwitchedBlend(target, result); + // TODO: option? + // result.Add(RenderState.ColorMask("ColorMask RGBA")); + return result; + } + } + + // public static RenderStateCollection ForwardAdd(FullscreenTarget target) + // { + // var result = new RenderStateCollection(); + + // result.Add(RenderState.ZWrite(ZWrite.Off)); + // if (target.surfaceType != SurfaceType.Opaque) + // { + // result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One)); + // result.Add(RenderState.ColorMask("ColorMask RGB")); + // } + // else + // { + // result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); + // } + // return result; + // } + + // public static readonly RenderStateCollection Meta = new RenderStateCollection + // { + // { RenderState.Cull(Cull.Off) }, + // }; + + // public static RenderStateCollection ShadowCaster(FullscreenTarget target) + // { + // var result = new RenderStateCollection(); + // result.Add(RenderState.ZTest(ZTest.LEqual)); + // result.Add(RenderState.ZWrite(ZWrite.On)); + // AddUberSwitchedCull(target, result); + // AddUberSwitchedBlend(target, result); + // result.Add(RenderState.ColorMask("ColorMask 0")); + // return result; + // } + + // public static RenderStateCollection DepthOnly(FullscreenTarget target) + // { + // var result = new RenderStateCollection(); + // result.Add(RenderState.ZTest(ZTest.LEqual)); + // result.Add(RenderState.ZWrite(ZWrite.On)); + // AddUberSwitchedCull(target, result); + // AddUberSwitchedBlend(target, result); + // result.Add(RenderState.ColorMask("ColorMask 0")); + // return result; + // } + + // public static RenderStateCollection SceneSelection(FullscreenTarget target) + // { + // var result = new RenderStateCollection() + // { + // { RenderState.Cull(Cull.Off) } + // }; + // return result; + // } + + // public static RenderStateCollection ScenePicking(FullscreenTarget target) + // { + // var result = new RenderStateCollection(); + // AddUberSwitchedCull(target, result); + // return result; + // } + } + #endregion + + #region Pragmas + + static class CorePragmas + { + public static readonly PragmaCollection Default = new PragmaCollection + { + { Pragma.Target(ShaderModel.Target30) }, + { Pragma.Vertex("vert") }, + { Pragma.Fragment("frag") }, + }; + + // public static readonly PragmaCollection Instanced = new PragmaCollection + // { + // { Pragma.Target(ShaderModel.Target30) }, + // { Pragma.MultiCompileInstancing }, + // { Pragma.Vertex("vert") }, + // { Pragma.Fragment("frag") }, + // }; + + // public static readonly PragmaCollection Forward = new PragmaCollection + // { + // { Pragma.Target(ShaderModel.Target30) }, + // { Pragma.MultiCompileInstancing }, + // { Pragma.MultiCompileFog }, + // { Pragma.MultiCompileForwardBase }, + // { Pragma.Vertex("vert") }, + // { Pragma.Fragment("frag") }, + // }; + + // public static readonly PragmaCollection ForwardAdd = new PragmaCollection + // { + // { Pragma.Target(ShaderModel.Target30) }, + // { Pragma.MultiCompileInstancing }, + // { Pragma.MultiCompileFog }, + // { Pragma.MultiCompileForwardAddFullShadowsBase }, + // { Pragma.Vertex("vert") }, + // { Pragma.Fragment("frag") }, + // }; + + // public static readonly PragmaCollection Deferred = new PragmaCollection + // { + // { Pragma.Target(ShaderModel.Target45) }, + // { Pragma.MultiCompileInstancing }, + // { new PragmaDescriptor { value = "exclude_renderers nomrt" } }, + // { Pragma.MultiCompilePrePassFinal }, + // { Pragma.SkipVariants(new[] {"FOG_LINEAR", "FOG_EXP", "FOG_EXP2" }) }, + // { Pragma.Vertex("vert") }, + // { Pragma.Fragment("frag") }, + // }; + + // public static readonly PragmaCollection ShadowCaster = new PragmaCollection + // { + // { Pragma.Target(ShaderModel.Target30) }, + // { Pragma.MultiCompileShadowCaster }, + // { Pragma.Vertex("vert") }, + // { Pragma.Fragment("frag") }, + // }; + } + #endregion + + #region Includes + static class CoreIncludes + { + const string kColor = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"; + const string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; + const string kCore = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Core.hlsl"; + const string kLighting = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Lighting.hlsl"; + const string kGraphFunctions = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/ShaderGraphFunctions.hlsl"; + const string kVaryings = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/Varyings.hlsl"; + const string kShaderPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShaderPass.hlsl"; + const string kDepthOnlyPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/DepthOnlyPass.hlsl"; + const string kShadowCasterPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShadowCasterPass.hlsl"; + + const string kShims = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/Shims.hlsl"; + const string kLegacySurfaceVertex = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/LegacySurfaceVertex.hlsl"; + + public static readonly IncludeCollection CorePregraph = new IncludeCollection + { + { kShims, IncludeLocation.Pregraph }, + { kColor, IncludeLocation.Pregraph }, + { kCore, IncludeLocation.Pregraph }, + { kTexture, IncludeLocation.Pregraph }, + { kLighting, IncludeLocation.Pregraph }, + { kLegacySurfaceVertex, IncludeLocation.Pregraph }, + }; + + public static readonly IncludeCollection ShaderGraphPregraph = new IncludeCollection + { + { kGraphFunctions, IncludeLocation.Pregraph }, + }; + + public static readonly IncludeCollection CorePostgraph = new IncludeCollection + { + { kShaderPass, IncludeLocation.Postgraph }, + { kVaryings, IncludeLocation.Postgraph }, + }; + + public static readonly IncludeCollection DepthOnly = new IncludeCollection + { + // Pre-graph + { CorePregraph }, + { ShaderGraphPregraph }, + + // Post-graph + { CorePostgraph }, + { kDepthOnlyPass, IncludeLocation.Postgraph }, + }; + + public static readonly IncludeCollection ShadowCaster = new IncludeCollection + { + // Pre-graph + { CorePregraph }, + { ShaderGraphPregraph }, + + // Post-graph + { CorePostgraph }, + { kShadowCasterPass, IncludeLocation.Postgraph }, + }; + + public static readonly IncludeCollection SceneSelection = new IncludeCollection + { + // Pre-graph + { CorePregraph }, + { ShaderGraphPregraph }, + + // Post-graph + { CorePostgraph }, + { kDepthOnlyPass, IncludeLocation.Postgraph }, + }; + + public static readonly IncludeCollection ScenePicking = new IncludeCollection + { + // Pre-graph + { CorePregraph }, + { ShaderGraphPregraph }, + + // Post-graph + { CorePostgraph }, + { kDepthOnlyPass, IncludeLocation.Postgraph }, + }; + } + #endregion + + #region Defines + // static class CoreDefines + // { + // public static readonly DefineCollection UseLegacySpriteBlocks = new DefineCollection + // { + // { CoreKeywordDescriptors.UseLegacySpriteBlocks, 1, new FieldCondition(CoreFields.UseLegacySpriteBlocks, true) }, + // }; + // public static readonly DefineCollection BuiltInTargetAPI = new DefineCollection + // { + // { CoreKeywordDescriptors.BuiltInTargetAPI, 1 }, + // }; + // public static readonly DefineCollection SceneSelection = new DefineCollection + // { + // { CoreKeywordDescriptors.BuiltInTargetAPI, 1 }, + // { CoreKeywordDescriptors.SceneSelectionPass, 1 }, + // }; + // public static readonly DefineCollection ScenePicking = new DefineCollection + // { + // { CoreKeywordDescriptors.BuiltInTargetAPI, 1 }, + // { CoreKeywordDescriptors.ScenePickingPass, 1 }, + // }; + // } + #endregion + + #region KeywordDescriptors + + static class CoreKeywordDescriptors + { + // TODO: cleanup! + // public static readonly KeywordDescriptor Lightmap = new KeywordDescriptor() + // { + // displayName = "Lightmap", + // referenceName = "LIGHTMAP_ON", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor DirectionalLightmapCombined = new KeywordDescriptor() + // { + // displayName = "Directional Lightmap Combined", + // referenceName = "DIRLIGHTMAP_COMBINED", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor SampleGI = new KeywordDescriptor() + // { + // displayName = "Sample GI", + // referenceName = "_SAMPLE_GI", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.ShaderFeature, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor AlphaTestOn = new KeywordDescriptor() + // { + // displayName = Keyword.SG_AlphaTestOn, + // referenceName = Keyword.SG_AlphaTestOn, + // type = KeywordType.Boolean, + // definition = KeywordDefinition.ShaderFeature, + // scope = KeywordScope.Local, + // stages = KeywordShaderStage.Fragment, + // }; + + // public static readonly KeywordDescriptor AlphaClip = new KeywordDescriptor() + // { + // displayName = "Alpha Clipping", + // referenceName = Keyword.SG_AlphaClip, + // type = KeywordType.Boolean, + // definition = KeywordDefinition.ShaderFeature, + // scope = KeywordScope.Local, + // stages = KeywordShaderStage.Fragment, + // }; + + // public static readonly KeywordDescriptor SurfaceTypeTransparent = new KeywordDescriptor() + // { + // displayName = Keyword.SG_SurfaceTypeTransparent, + // referenceName = Keyword.SG_SurfaceTypeTransparent, + // type = KeywordType.Boolean, + // definition = KeywordDefinition.ShaderFeature, + // scope = KeywordScope.Local, + // stages = KeywordShaderStage.Fragment, + // }; + + // public static readonly KeywordDescriptor AlphaPremultiplyOn = new KeywordDescriptor() + // { + // displayName = Keyword.SG_AlphaPremultiplyOn, + // referenceName = Keyword.SG_AlphaPremultiplyOn, + // type = KeywordType.Boolean, + // definition = KeywordDefinition.ShaderFeature, + // scope = KeywordScope.Local, + // stages = KeywordShaderStage.Fragment, + // }; + + // public static readonly KeywordDescriptor MainLightShadows = new KeywordDescriptor() + // { + // displayName = "Main Light Shadows", + // referenceName = "", + // type = KeywordType.Enum, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // entries = new KeywordEntry[] + // { + // new KeywordEntry() { displayName = "Off", referenceName = "" }, + // new KeywordEntry() { displayName = "No Cascade", referenceName = "MAIN_LIGHT_SHADOWS" }, + // new KeywordEntry() { displayName = "Cascade", referenceName = "MAIN_LIGHT_SHADOWS_CASCADE" }, + // new KeywordEntry() { displayName = "Screen", referenceName = "MAIN_LIGHT_SHADOWS_SCREEN" }, + // } + // }; + + // public static readonly KeywordDescriptor CastingPunctualLightShadow = new KeywordDescriptor() + // { + // displayName = "Casting Punctual Light Shadow", + // referenceName = "_CASTING_PUNCTUAL_LIGHT_SHADOW", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor AdditionalLights = new KeywordDescriptor() + // { + // displayName = "Additional Lights", + // referenceName = "_ADDITIONAL", + // type = KeywordType.Enum, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // entries = new KeywordEntry[] + // { + // new KeywordEntry() { displayName = "Vertex", referenceName = "LIGHTS_VERTEX" }, + // new KeywordEntry() { displayName = "Fragment", referenceName = "LIGHTS" }, + // new KeywordEntry() { displayName = "Off", referenceName = "OFF" }, + // } + // }; + + // public static readonly KeywordDescriptor AdditionalLightShadows = new KeywordDescriptor() + // { + // displayName = "Additional Light Shadows", + // referenceName = "_ADDITIONAL_LIGHT_SHADOWS", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor ShadowsSoft = new KeywordDescriptor() + // { + // displayName = "Shadows Soft", + // referenceName = "_SHADOWS_SOFT", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor MixedLightingSubtractive = new KeywordDescriptor() + // { + // displayName = "Mixed Lighting Subtractive", + // referenceName = "_MIXED_LIGHTING_SUBTRACTIVE", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor LightmapShadowMixing = new KeywordDescriptor() + // { + // displayName = "Lightmap Shadow Mixing", + // referenceName = "LIGHTMAP_SHADOW_MIXING", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor ShadowsShadowmask = new KeywordDescriptor() + // { + // displayName = "Shadows Shadowmask", + // referenceName = "SHADOWS_SHADOWMASK", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor SmoothnessChannel = new KeywordDescriptor() + // { + // displayName = "Smoothness Channel", + // referenceName = "_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.ShaderFeature, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor ShapeLightType0 = new KeywordDescriptor() + // { + // displayName = "Shape Light Type 0", + // referenceName = "USE_SHAPE_LIGHT_TYPE_0", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor ShapeLightType1 = new KeywordDescriptor() + // { + // displayName = "Shape Light Type 1", + // referenceName = "USE_SHAPE_LIGHT_TYPE_1", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor ShapeLightType2 = new KeywordDescriptor() + // { + // displayName = "Shape Light Type 2", + // referenceName = "USE_SHAPE_LIGHT_TYPE_2", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor ShapeLightType3 = new KeywordDescriptor() + // { + // displayName = "Shape Light Type 3", + // referenceName = "USE_SHAPE_LIGHT_TYPE_3", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.MultiCompile, + // scope = KeywordScope.Global, + // }; + + // public static readonly KeywordDescriptor UseLegacySpriteBlocks = new KeywordDescriptor() + // { + // displayName = "UseLegacySpriteBlocks", + // referenceName = "USELEGACYSPRITEBLOCKS", + // type = KeywordType.Boolean, + // }; + + // public static readonly KeywordDescriptor BuiltInTargetAPI = new KeywordDescriptor() + // { + // displayName = "BuiltInTargetAPI", + // referenceName = "BUILTIN_TARGET_API", + // type = KeywordType.Boolean, + // }; + + // public static readonly KeywordDescriptor SceneSelectionPass = new KeywordDescriptor() + // { + // displayName = "Scene Selection Pass", + // referenceName = "SCENESELECTIONPASS", + // type = KeywordType.Boolean, + // }; + + // public static readonly KeywordDescriptor ScenePickingPass = new KeywordDescriptor() + // { + // displayName = "Scene Picking Pass", + // referenceName = "SCENEPICKINGPASS", + // type = KeywordType.Boolean, + // }; + } + #endregion + + // #region Keywords + // static class CoreKeywords + // { + // public static readonly KeywordCollection ShadowCaster = new KeywordCollection + // { + // { CoreKeywordDescriptors.CastingPunctualLightShadow }, + // }; + // } + // #endregion + + #region FieldDescriptors + static class CoreFields + { + public static readonly FieldDescriptor UseLegacySpriteBlocks = new FieldDescriptor("BuiltIn", "UseLegacySpriteBlocks", "BUILTIN_USELEGACYSPRITEBLOCKS"); + } + #endregion + + #region CustomInterpolators + static class CoreCustomInterpDescriptors + { + public static readonly CustomInterpSubGen.Collection Common = new CustomInterpSubGen.Collection + { + // Custom interpolators are not explicitly defined in the SurfaceDescriptionInputs template. + // This entry point will let us generate a block of pass-through assignments for each field. + CustomInterpSubGen.Descriptor.MakeBlock(CustomInterpSubGen.Splice.k_spliceCopyToSDI, "output", "input"), + + // sgci_PassThroughFunc is called from BuildVaryings in Varyings.hlsl to copy custom interpolators from vertex descriptions. + // this entry point allows for the function to be defined before it is used. + CustomInterpSubGen.Descriptor.MakeFunc(CustomInterpSubGen.Splice.k_splicePreSurface, "CustomInterpolatorPassThroughFunc", "Varyings", "VertexDescription", "CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC", "FEATURES_GRAPH_VERTEX") + }; + } + #endregion +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs.meta new file mode 100644 index 00000000000..2469d7df93b --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 11771342b6f6ab840ba9e2274ddd9db3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates.meta new file mode 100644 index 00000000000..729c6c9354f --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c131f605e2f659045adf332f0f0f876f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl new file mode 100644 index 00000000000..ee857291ec5 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl @@ -0,0 +1,124 @@ +SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) +{ + SurfaceDescriptionInputs output; + ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + + $splice(CustomInterpolatorCopyToSDI) + + $SurfaceDescriptionInputs.WorldSpaceNormal: // must use interpolated tangent, bitangent and normal before they are normalized in the pixel shader. + $SurfaceDescriptionInputs.WorldSpaceNormal: float3 unnormalizedNormalWS = input.normalWS; + $SurfaceDescriptionInputs.WorldSpaceNormal: const float renormFactor = 1.0 / length(unnormalizedNormalWS); + + $SurfaceDescriptionInputs.WorldSpaceBiTangent: // use bitangent on the fly like in hdrp + $SurfaceDescriptionInputs.WorldSpaceBiTangent: // IMPORTANT! If we ever support Flip on double sided materials ensure bitangent and tangent are NOT flipped. + $SurfaceDescriptionInputs.WorldSpaceBiTangent: float crossSign = (input.tangentWS.w > 0.0 ? 1.0 : -1.0)* GetOddNegativeScale(); + $SurfaceDescriptionInputs.WorldSpaceBiTangent: float3 bitang = crossSign * cross(input.normalWS.xyz, input.tangentWS.xyz); + + $SurfaceDescriptionInputs.WorldSpaceNormal: output.WorldSpaceNormal = renormFactor * input.normalWS.xyz; // we want a unit length Normal Vector node in shader graph + $SurfaceDescriptionInputs.ObjectSpaceNormal: output.ObjectSpaceNormal = normalize(mul(output.WorldSpaceNormal, (float3x3) UNITY_MATRIX_M)); // transposed multiplication by inverse matrix to handle normal scale + $SurfaceDescriptionInputs.ViewSpaceNormal: output.ViewSpaceNormal = mul(output.WorldSpaceNormal, (float3x3) UNITY_MATRIX_I_V); // transposed multiplication by inverse matrix to handle normal scale + $SurfaceDescriptionInputs.TangentSpaceNormal: output.TangentSpaceNormal = float3(0.0f, 0.0f, 1.0f); + + $SurfaceDescriptionInputs.WorldSpaceTangent: // to preserve mikktspace compliance we use same scale renormFactor as was used on the normal. + $SurfaceDescriptionInputs.WorldSpaceTangent: // This is explained in section 2.2 in "surface gradient based bump mapping framework" + $SurfaceDescriptionInputs.WorldSpaceTangent: output.WorldSpaceTangent = renormFactor * input.tangentWS.xyz; + $SurfaceDescriptionInputs.WorldSpaceBiTangent: output.WorldSpaceBiTangent = renormFactor * bitang; + + $SurfaceDescriptionInputs.ObjectSpaceTangent: output.ObjectSpaceTangent = TransformWorldToObjectDir(output.WorldSpaceTangent); + $SurfaceDescriptionInputs.ViewSpaceTangent: output.ViewSpaceTangent = TransformWorldToViewDir(output.WorldSpaceTangent); + $SurfaceDescriptionInputs.TangentSpaceTangent: output.TangentSpaceTangent = float3(1.0f, 0.0f, 0.0f); + $SurfaceDescriptionInputs.ObjectSpaceBiTangent: output.ObjectSpaceBiTangent = TransformWorldToObjectDir(output.WorldSpaceBiTangent); + $SurfaceDescriptionInputs.ViewSpaceBiTangent: output.ViewSpaceBiTangent = TransformWorldToViewDir(output.WorldSpaceBiTangent); + $SurfaceDescriptionInputs.TangentSpaceBiTangent: output.TangentSpaceBiTangent = float3(0.0f, 1.0f, 0.0f); + $SurfaceDescriptionInputs.WorldSpaceViewDirection: output.WorldSpaceViewDirection = normalize(input.viewDirectionWS); + $SurfaceDescriptionInputs.ObjectSpaceViewDirection: output.ObjectSpaceViewDirection = TransformWorldToObjectDir(output.WorldSpaceViewDirection); + $SurfaceDescriptionInputs.ViewSpaceViewDirection: output.ViewSpaceViewDirection = TransformWorldToViewDir(output.WorldSpaceViewDirection); + $SurfaceDescriptionInputs.TangentSpaceViewDirection: float3x3 tangentSpaceTransform = float3x3(output.WorldSpaceTangent, output.WorldSpaceBiTangent, output.WorldSpaceNormal); + $SurfaceDescriptionInputs.TangentSpaceViewDirection: output.TangentSpaceViewDirection = mul(tangentSpaceTransform, output.WorldSpaceViewDirection); + $SurfaceDescriptionInputs.WorldSpacePosition: output.WorldSpacePosition = input.positionWS; + $SurfaceDescriptionInputs.ObjectSpacePosition: output.ObjectSpacePosition = TransformWorldToObject(input.positionWS); + $SurfaceDescriptionInputs.ViewSpacePosition: output.ViewSpacePosition = TransformWorldToView(input.positionWS); + $SurfaceDescriptionInputs.TangentSpacePosition: output.TangentSpacePosition = float3(0.0f, 0.0f, 0.0f); + $SurfaceDescriptionInputs.AbsoluteWorldSpacePosition: output.AbsoluteWorldSpacePosition = GetAbsolutePositionWS(input.positionWS); + $SurfaceDescriptionInputs.WorldSpacePositionPredisplacement: output.WorldSpacePositionPredisplacement = input.positionWS; + $SurfaceDescriptionInputs.ObjectSpacePositionPredisplacement: output.ObjectSpacePositionPredisplacement = TransformWorldToObject(input.positionWS); + $SurfaceDescriptionInputs.ViewSpacePositionPredisplacement: output.ViewSpacePositionPredisplacement = TransformWorldToView(input.positionWS); + $SurfaceDescriptionInputs.TangentSpacePositionPredisplacement: output.TangentSpacePositionPredisplacement = float3(0.0f, 0.0f, 0.0f); + $SurfaceDescriptionInputs.AbsoluteWorldSpacePositionPredisplacement:output.AbsoluteWorldSpacePositionPredisplacement = GetAbsolutePositionWS(input.positionWS); + $SurfaceDescriptionInputs.ScreenPosition: output.ScreenPosition = ComputeScreenPos(TransformWorldToHClip(input.positionWS), _ProjectionParams.x); + $SurfaceDescriptionInputs.uv0: output.uv0 = input.texCoord0; + $SurfaceDescriptionInputs.uv1: output.uv1 = input.texCoord1; + $SurfaceDescriptionInputs.uv2: output.uv2 = input.texCoord2; + $SurfaceDescriptionInputs.uv3: output.uv3 = input.texCoord3; + $SurfaceDescriptionInputs.VertexColor: output.VertexColor = input.color; + $SurfaceDescriptionInputs.TimeParameters: output.TimeParameters = _TimeParameters.xyz; // This is mainly for LW as HD overwrite this value +#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) +#define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); +#else +#define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN +#endif + $SurfaceDescriptionInputs.FaceSign: BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN +#undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN + + return output; +} + +void BuildAppDataFull(Attributes attributes, VertexDescription vertexDescription, inout appdata_full result) +{ + $Attributes.positionOS: result.vertex = float4(attributes.positionOS, 1); + $Attributes.tangentOS: result.tangent = attributes.tangentOS; + $Attributes.normalOS: result.normal = attributes.normalOS; + $Attributes.uv0: result.texcoord = attributes.uv0; + $Attributes.uv1: result.texcoord1 = attributes.uv1; + $Attributes.uv2: result.texcoord2 = attributes.uv2; + $Attributes.uv3: result.texcoord3 = attributes.uv3; + $Attributes.color: result.color = attributes.color; + $VertexDescription.Position: result.vertex = float4(vertexDescription.Position, 1); + $VertexDescription.Normal: result.normal = vertexDescription.Normal; + $VertexDescription.Tangent: result.tangent = float4(vertexDescription.Tangent, 0); + #if UNITY_ANY_INSTANCING_ENABLED + $Attributes.instanceID: result.instanceID = attributes.instanceID; + #endif +} + +void VaryingsToSurfaceVertex(Varyings varyings, inout v2f_surf result) +{ + result.pos = varyings.positionCS; + $Varyings.positionWS: result.worldPos = varyings.positionWS; + $Varyings.normalWS: result.worldNormal = varyings.normalWS; + $Varyings.viewDirectionWS: result.viewDir = varyings.viewDirectionWS; + // World Tangent isn't an available input on v2f_surf + + #if UNITY_ANY_INSTANCING_ENABLED + $Varyings.instanceID: UNITY_TRANSFER_INSTANCE_ID(varyings, result); + #endif + #if UNITY_SHOULD_SAMPLE_SH + $Varyings.sh: result.sh = varyings.sh; + #endif + #if defined(LIGHTMAP_ON) + $Varyings.lightmapUV: result.lmap.xy = varyings.lightmapUV; + #endif + + DEFAULT_UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(varyings, result); +} + +void SurfaceVertexToVaryings(v2f_surf surfVertex, inout Varyings result) +{ + result.positionCS = surfVertex.pos; + $Varyings.positionWS: result.positionWS = surfVertex.worldPos; + $Varyings.normalWS: result.normalWS = surfVertex.worldNormal; + // viewDirectionWS is never filled out in the legacy pass' function. Always use the value computed by SRP + // World Tangent isn't an available input on v2f_surf + + #if UNITY_ANY_INSTANCING_ENABLED + $Varyings.instanceID: UNITY_TRANSFER_INSTANCE_ID(surfVertex, result); + #endif + #if UNITY_SHOULD_SAMPLE_SH + $Varyings.sh: result.sh = surfVertex.sh; + #endif + #if defined(LIGHTMAP_ON) + $Varyings.lightmapUV: result.lightmapUV = surfVertex.lmap.xy; + #endif + + DEFAULT_UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(surfVertex, result); +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl.meta new file mode 100644 index 00000000000..feddaf9fe66 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 16201fed0715efa48a8908fedb361bf0 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template new file mode 100644 index 00000000000..f8f6957c188 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template @@ -0,0 +1,105 @@ +Pass +{ + $splice(PassName) + +// Render State +$splice(RenderState) + +// Debug +$splice(Debug) + +// -------------------------------------------------- +// Pass + +HLSLPROGRAM + +// Pragmas +$splice(PassPragmas) + +$splice(DotsInstancingOptions) +$splice(HybridV1InjectedBuiltinProperties) + +// Keywords +$splice(PassKeywords) +$splice(GraphKeywords) + +// Defines +$SurfaceType.Transparent: // UBER SHADER NOW: #define _SURFACE_TYPE_TRANSPARENT 1 +$Attributes.normalOS: #define ATTRIBUTES_NEED_NORMAL +$Attributes.tangentOS: #define ATTRIBUTES_NEED_TANGENT +$Attributes.uv0: #define ATTRIBUTES_NEED_TEXCOORD0 +$Attributes.uv1: #define ATTRIBUTES_NEED_TEXCOORD1 +$Attributes.uv2: #define ATTRIBUTES_NEED_TEXCOORD2 +$Attributes.uv3: #define ATTRIBUTES_NEED_TEXCOORD3 +$Attributes.color: #define ATTRIBUTES_NEED_COLOR +$Attributes.vertexID: #define ATTRIBUTES_NEED_VERTEXID +$Varyings.positionWS: #define VARYINGS_NEED_POSITION_WS +$Varyings.normalWS: #define VARYINGS_NEED_NORMAL_WS +$Varyings.tangentWS: #define VARYINGS_NEED_TANGENT_WS +$Varyings.texCoord0: #define VARYINGS_NEED_TEXCOORD0 +$Varyings.texCoord1: #define VARYINGS_NEED_TEXCOORD1 +$Varyings.texCoord2: #define VARYINGS_NEED_TEXCOORD2 +$Varyings.texCoord3: #define VARYINGS_NEED_TEXCOORD3 +$Varyings.color: #define VARYINGS_NEED_COLOR +$Varyings.viewDirectionWS: #define VARYINGS_NEED_VIEWDIRECTION_WS +$Varyings.bitangentWS: #define VARYINGS_NEED_BITANGENT_WS +$Varyings.screenPosition: #define VARYINGS_NEED_SCREENPOSITION +$Varyings.fogFactorAndVertexLight: #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT +$Varyings.cullFace: #define VARYINGS_NEED_CULLFACE +$features.graphVertex: #define FEATURES_GRAPH_VERTEX +$splice(PassInstancing) +$splice(GraphDefines) + +// custom interpolator pre-include +$splice(sgci_CustomInterpolatorPreInclude) + +// Includes +$splice(PreGraphIncludes) + +// -------------------------------------------------- +// Structs and Packing + +// custom interpolators pre packing +$splice(CustomInterpolatorPrePacking) + +$splice(PassStructs) + +$splice(InterpolatorPack) + +// -------------------------------------------------- +// Graph + +// Graph Properties +$splice(GraphProperties) + +// Graph Includes +$splice(GraphIncludes) + +// Graph Functions +$splice(GraphFunctions) + +// Custom interpolators pre vertex +$splice(CustomInterpolatorPreVertex) + +// Graph Vertex +$splice(GraphVertex) + +// Custom interpolators, pre surface +$splice(CustomInterpolatorPreSurface) + +// Graph Pixel +$splice(GraphPixel) + +// -------------------------------------------------- +// Build Graph Inputs + +$features.graphVertex: $include("BuildVertexDescriptionInputs.template.hlsl") +$features.graphPixel: $include("SharedCode.template.hlsl") + +// -------------------------------------------------- +// Main + +$splice(PostGraphIncludes) + +ENDHLSL +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template.meta new file mode 100644 index 00000000000..6de4d479d90 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0ed3a57e16f0259448e5b68a210e991a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From b5e9ddf3b9f6200c2ede7cbd7a1c51e6615ff700 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 17 Sep 2021 15:45:21 +0200 Subject: [PATCH 002/108] Added blend modes + depth output option --- .../Targets/Fullscreen/FullscreenMetaData.cs | 2 +- .../Targets/Fullscreen/FullscreenSubTarget.cs | 98 +- .../Targets/Fullscreen/FullscreenTarget.cs | 977 ++++-------------- .../Targets/Fullscreen/Includes.meta | 8 + .../Fullscreen/Includes/FullscreenBlit.hlsl | 137 +++ .../Includes/FullscreenBlit.hlsl.meta | 7 + ...template.hlsl => SharedCode.template.hlsl} | 62 -- ...lsl.meta => SharedCode.template.hlsl.meta} | 0 8 files changed, 376 insertions(+), 915 deletions(-) create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl.meta rename com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/{ShaderCode.template.hlsl => SharedCode.template.hlsl} (71%) rename com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/{ShaderCode.template.hlsl.meta => SharedCode.template.hlsl.meta} (100%) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs index 485c789ff4d..626f84d6266 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs @@ -5,7 +5,7 @@ namespace UnityEditor.Rendering.Fullscreen.ShaderGraph { [Serializable] - sealed class FullscreenMetadata : ScriptableObject + sealed class FullscreenMetaData : ScriptableObject { [SerializeField] FullscreenTarget.MaterialType m_MaterialType; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index b9e5545c64e..e04a69d7398 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -19,7 +19,7 @@ public override void Setup(ref TargetSetupContext context) // context.customEditorForRenderPipelines.Add((typeof(BuiltInUnlitGUI).FullName, "")); // Process SubShaders - context.AddSubShader(SubShaders.Unlit(target)); + context.AddSubShader(SubShaders.FullscreenBlit(target)); } protected FullscreenTarget.MaterialType materialType { get; } @@ -27,7 +27,7 @@ public override void Setup(ref TargetSetupContext context) public virtual string identifier => GetType().Name; public virtual ScriptableObject GetMetadataObject() { - var bultInMetadata = ScriptableObject.CreateInstance(); + var bultInMetadata = ScriptableObject.CreateInstance(); bultInMetadata.materialType = materialType; return bultInMetadata; } @@ -39,7 +39,7 @@ public virtual ScriptableObject GetMetadataObject() public FullscreenSubTarget() { - displayName = "FullScreen"; + displayName = "Fullscreen"; } public override bool IsActive() => true; @@ -74,7 +74,6 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { - context.AddBlock(BlockFields.SurfaceDescription.BaseColor, target.allowMaterialOverride); } public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) @@ -83,6 +82,8 @@ public override void CollectShaderProperties(PropertyCollector collector, Genera { base.CollectShaderProperties(collector, generationMode); + target.CollectRenderStateShaderProperties(collector, generationMode); + // setup properties using the defaults // TODO // collector.AddFloatProperty(Property.Blend(), (float)target.alphaMode); @@ -108,7 +109,9 @@ public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Acti #region SubShader static class SubShaders { - public static SubShaderDescriptor Unlit(FullscreenTarget target) + const string kFullscreenInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; + + public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) { var result = new SubShaderDescriptor() { @@ -116,19 +119,7 @@ public static SubShaderDescriptor Unlit(FullscreenTarget target) passes = new PassCollection() }; - result.passes.Add(UnlitPasses.Unlit(target)); - - return result; - } - } - #endregion - - #region Pass - static class UnlitPasses - { - public static PassDescriptor Unlit(FullscreenTarget target) - { - var result = new PassDescriptor + result.passes.Add(new PassDescriptor { // Definition displayName = "Fullscreen", @@ -140,10 +131,13 @@ public static PassDescriptor Unlit(FullscreenTarget target) sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, // Port Mask - validVertexBlocks = new BlockFieldDescriptor[] { }, // No vertex blocks for fullscreen shaders + validVertexBlocks = new BlockFieldDescriptor[] + { + BlockFields.VertexDescription.Position + }, validPixelBlocks = new BlockFieldDescriptor[] { - Color, + FullscreenTarget.Blocks.Color, }, // Fields @@ -151,58 +145,42 @@ public static PassDescriptor Unlit(FullscreenTarget target) { { Structs.Attributes }, { Structs.SurfaceDescriptionInputs }, + { FullscreenTarget.Varyings }, { Structs.VertexDescriptionInputs }, }, - fieldDependencies = CoreFieldDependencies.Default, + fieldDependencies = FieldDependencies.Default, + requiredFields = new FieldCollection + { + StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code + StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case + }, // Conditional State - renderStates = CoreRenderStates.Default(target), - pragmas = CorePragmas.Default, + renderStates = target.GetRenderState(), + pragmas = new PragmaCollection + { + { Pragma.Target(ShaderModel.Target30) }, + { Pragma.Vertex("vert") }, + { Pragma.Fragment("frag") }, + }, defines = new DefineCollection(), keywords = new KeywordCollection(), - includes = UnlitIncludes.Unlit, - }; - return result; - } - - public static BlockFieldDescriptor Color = new BlockFieldDescriptor("SurfaceDescription", "Color", "Color", "SURFACEDESCRIPTION_COLOR", new ColorControl(UnityEngine.Color.grey, true), ShaderStage.Fragment); - } - #endregion + includes = new IncludeCollection + { + // Pre-graph + { CoreIncludes.CorePregraph }, + { CoreIncludes.ShaderGraphPregraph }, - #region Keywords - static class UnlitKeywords - { - public static KeywordCollection Unlit(FullscreenTarget target) - { - var result = new KeywordCollection - { - // { CoreKeywordDescriptors.Lightmap }, - // { CoreKeywordDescriptors.DirectionalLightmapCombined }, - // { CoreKeywordDescriptors.SampleGI }, - }; + // Post-graph + // { CoreIncludes.CorePostgraph }, + { kFullscreenInclude, IncludeLocation.Postgraph }, + }, + }); return result; } } #endregion - - #region Includes - static class UnlitIncludes - { - const string kUnlitPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/UnlitPass.hlsl"; - - public static IncludeCollection Unlit = new IncludeCollection - { - // Pre-graph - { CoreIncludes.CorePregraph }, - { CoreIncludes.ShaderGraphPregraph }, - - // Post-graph - { CoreIncludes.CorePostgraph }, - { kUnlitPass, IncludeLocation.Postgraph }, - }; - } - #endregion } // internal static class SubShaderUtils diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs index b5da5a05a74..50fd89b7188 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs @@ -6,17 +6,28 @@ using UnityEngine.UIElements; using UnityEditor.UIElements; using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Legacy; using UnityEditor.ShaderGraph.Serialization; using UnityEditor.Rendering.BuiltIn; using UnityEditor.Rendering.BuiltIn.ShaderGraph; using BlendMode = UnityEngine.Rendering.BlendMode; using BlendOp = UnityEditor.ShaderGraph.BlendOp; +using UnityEditor.ShaderGraph.Internal; namespace UnityEditor.Rendering.Fullscreen.ShaderGraph { - sealed class FullscreenTarget : Target, IHasMetadata + sealed class FullscreenTarget : Target, IHasMetadata, IMaySupportVFX { + [GenerateBlocks] + public struct Blocks + { + // TODO: add optional depth write block + public static BlockFieldDescriptor Color = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Color", "Color", + "SURFACEDESCRIPTION_COLOR", new ColorRGBAControl(UnityEngine.Color.grey), ShaderStage.Fragment); + public static BlockFieldDescriptor Depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Depth", "Depth", + "SURFACEDESCRIPTION_DEPTH", new FloatControl(0), ShaderStage.Fragment); + + } + public enum MaterialType { Blit, @@ -34,6 +45,41 @@ public enum FullscreenBlendMode Custom, } + public static class Uniforms + { + public static readonly string srcColorBlendProperty = "_Fullscreen_SrcColorBlend"; + public static readonly string dstColorBlendProperty = "_Fullscreen_DstColorBlend"; + public static readonly string srcAlphaBlendProperty = "_Fullscreen_SrcAlphaBlend"; + public static readonly string dstAlphaBlendProperty = "_Fullscreen_DstAlphaBlend"; + public static readonly string colorBlendOperationProperty = "_Fullscreen_ColorBlendOperation"; + public static readonly string alphaBlendOperationProperty = "_Fullscreen_AlphaBlendOperation"; + public static readonly string depthWriteProperty = "_Fullscreen_DepthWrite"; + public static readonly string depthTestProperty = "_Fullscreen_DepthTest"; + public static readonly string stencilReferenceProperty = "_Fullscreen_StencilReference"; + public static readonly string stencilReadMaskProperty = "_Fullscreen_StencilReadMask"; + public static readonly string stencilWriteMaskProperty = "_Fullscreen_StencilWriteMask"; + public static readonly string stencilComparisonProperty = "_Fullscreen_StencilComparison"; + public static readonly string stencilPassProperty = "_Fullscreen_StencilPass"; + public static readonly string stencilFailProperty = "_Fullscreen_StencilFail"; + public static readonly string stencilDepthFailProperty = "_Fullscreen_StencilDepthFail"; + + public static readonly string srcColorBlend = "[" + srcColorBlendProperty + "]"; + public static readonly string dstColorBlend = "[" + dstColorBlendProperty + "]"; + public static readonly string srcAlphaBlend = "[" + srcAlphaBlendProperty + "]"; + public static readonly string dstAlphaBlend = "[" + dstAlphaBlendProperty + "]"; + public static readonly string colorBlendOperation = "[" + colorBlendOperationProperty + "]"; + public static readonly string alphaBlendOperation = "[" + alphaBlendOperationProperty + "]"; + public static readonly string depthWrite = "[" + depthWriteProperty + "]"; + public static readonly string depthTest = "[" + depthTestProperty + "]"; + public static readonly string stencilReference = "[" + stencilReferenceProperty + "]"; + public static readonly string stencilReadMask = "[" + stencilReadMaskProperty + "]"; + public static readonly string stencilWriteMask = "[" + stencilWriteMaskProperty + "]"; + public static readonly string stencilComparison = "[" + stencilComparisonProperty + "]"; + public static readonly string stencilPass = "[" + stencilPassProperty + "]"; + public static readonly string stencilFail = "[" + stencilFailProperty + "]"; + public static readonly string stencilDepthFail = "[" + stencilDepthFailProperty + "]"; + } + public override int latestVersion => 0; // Constants @@ -61,16 +107,16 @@ public enum FullscreenBlendMode FullscreenBlendMode m_BlendMode = FullscreenBlendMode.Disabled; [SerializeField] - BlendMode m_SrcColorBlendMode = BlendMode.Zero; + Blend m_SrcColorBlendMode = Blend.Zero; [SerializeField] - BlendMode m_DstColorBlendMode = BlendMode.One; + Blend m_DstColorBlendMode = Blend.One; [SerializeField] BlendOp m_ColorBlendOperation = BlendOp.Add; [SerializeField] - BlendMode m_SrcAlphaBlendMode = BlendMode.Zero; + Blend m_SrcAlphaBlendMode = Blend.Zero; [SerializeField] - BlendMode m_DstAlphaBlendMode = BlendMode.One; + Blend m_DstAlphaBlendMode = Blend.One; [SerializeField] BlendOp m_AlphaBlendOperation = BlendOp.Add; @@ -105,7 +151,7 @@ public enum FullscreenBlendMode public FullscreenTarget() { - displayName = "Full-screen"; + displayName = "Fullscreen"; m_SubTargets = TargetUtils.GetSubTargets(this); m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList(); TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); @@ -117,13 +163,13 @@ public FullscreenBlendMode blendMode set => m_BlendMode = value; } - public BlendMode srcColorBlendMode + public Blend srcColorBlendMode { get => m_SrcColorBlendMode; set => m_SrcColorBlendMode = value; } - public BlendMode dstColorBlendMode + public Blend dstColorBlendMode { get => m_DstColorBlendMode; set => m_DstColorBlendMode = value; @@ -135,13 +181,13 @@ public BlendOp colorBlendOperation set => m_ColorBlendOperation = value; } - public BlendMode srcAlphaBlendMode + public Blend srcAlphaBlendMode { get => m_SrcAlphaBlendMode; set => m_SrcAlphaBlendMode = value; } - public BlendMode dstAlphaBlendMode + public Blend dstAlphaBlendMode { get => m_DstAlphaBlendMode; set => m_DstAlphaBlendMode = value; @@ -268,8 +314,7 @@ public override void GetFields(ref TargetFieldContext context) { var descs = context.blocks.Select(x => x.descriptor); // Core fields - // Always force vertex as the shim between built-in cginc files and hlsl files requires this - context.AddField(Fields.GraphVertex); + // context.AddField(Fields.GraphVertex); // We don't support custom vertex functions for now context.AddField(Fields.GraphPixel); // SubTarget fields @@ -279,10 +324,8 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { // Core blocks - context.AddBlock(BlockFields.VertexDescription.Position); - context.AddBlock(BlockFields.VertexDescription.Normal); - context.AddBlock(BlockFields.VertexDescription.Tangent); - context.AddBlock(BlockFields.SurfaceDescription.BaseColor); + context.AddBlock(Blocks.Color); + context.AddBlock(Blocks.Depth, depthWrite); // SubTarget blocks m_ActiveSubTarget.value.GetActiveBlocks(ref context); @@ -292,9 +335,29 @@ public override void CollectShaderProperties(PropertyCollector collector, Genera { base.CollectShaderProperties(collector, generationMode); activeSubTarget.CollectShaderProperties(collector, generationMode); - // collector.AddShaderProperty(LightmappingShaderProperties.kLightmapsArray); - // collector.AddShaderProperty(LightmappingShaderProperties.kLightmapsIndirectionArray); - // collector.AddShaderProperty(LightmappingShaderProperties.kShadowMasksArray); + } + + public void CollectRenderStateShaderProperties(PropertyCollector collector, GenerationMode generationMode) + { + + if (generationMode == GenerationMode.Preview || allowMaterialOverride) + { + collector.AddEnumProperty(Uniforms.srcColorBlendProperty, srcColorBlendMode); + collector.AddEnumProperty(Uniforms.dstColorBlendProperty, dstColorBlendMode); + collector.AddEnumProperty(Uniforms.srcAlphaBlendProperty, srcAlphaBlendMode); + collector.AddEnumProperty(Uniforms.dstAlphaBlendProperty, dstAlphaBlendMode); + collector.AddEnumProperty(Uniforms.colorBlendOperationProperty, colorBlendOperation); + collector.AddEnumProperty(Uniforms.alphaBlendOperationProperty, alphaBlendOperation); + collector.AddFloatProperty(Uniforms.depthWriteProperty, depthWrite ? 1 : 0); + collector.AddFloatProperty(Uniforms.depthTestProperty, (float)depthTestMode); + collector.AddIntProperty(Uniforms.stencilReferenceProperty, stencilReference); + collector.AddIntProperty(Uniforms.stencilReadMaskProperty, stencilReadMask); + collector.AddIntProperty(Uniforms.stencilWriteMaskProperty, stencilWriteMask); + collector.AddEnumProperty(Uniforms.stencilComparisonProperty, stencilCompareFunction); + collector.AddEnumProperty(Uniforms.stencilPassProperty, stencilPassOperation); + collector.AddEnumProperty(Uniforms.stencilFailProperty, stencilFailOperation); + collector.AddEnumProperty(Uniforms.stencilDepthFailProperty, stencilDepthTestFailOperation); + } } public override void ProcessPreviewMaterial(Material material) @@ -309,18 +372,6 @@ public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Acti if (m_ActiveSubTarget.value == null) return; - // Core properties - // m_SubTargetField = new PopupField(m_SubTargetNames, activeSubTargetIndex); - // context.AddProperty("Material", m_SubTargetField, (evt) => - // { - // if (Equals(activeSubTargetIndex, m_SubTargetField.index)) - // return; - - // registerUndo("Change Material"); - // m_ActiveSubTarget = m_SubTargets[m_SubTargetField.index]; - // onChange(); - // }); - context.AddProperty("Allow Material Override", new Toggle() { value = allowMaterialOverride }, (evt) => { if (Equals(allowMaterialOverride, evt.newValue)) @@ -374,7 +425,7 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac return; registerUndo("Change Blend Mode"); - srcColorBlendMode = (BlendMode)evt.newValue; + srcColorBlendMode = (Blend)evt.newValue; onChange(); }); context.AddProperty("Dst Color", new EnumField(dstColorBlendMode) { value = dstColorBlendMode }, (evt) => @@ -383,7 +434,7 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac return; registerUndo("Change Blend Mode"); - dstColorBlendMode = (BlendMode)evt.newValue; + dstColorBlendMode = (Blend)evt.newValue; onChange(); }); context.AddProperty("Color Operation", new EnumField(colorBlendOperation) { value = colorBlendOperation }, (evt) => @@ -405,7 +456,7 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac return; registerUndo("Change Blend Mode"); - srcAlphaBlendMode = (BlendMode)evt.newValue; + srcAlphaBlendMode = (Blend)evt.newValue; onChange(); }); context.AddProperty("Dst", new EnumField(dstAlphaBlendMode) { value = dstAlphaBlendMode }, (evt) => @@ -414,7 +465,7 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac return; registerUndo("Change Blend Mode"); - dstAlphaBlendMode = (BlendMode)evt.newValue; + dstAlphaBlendMode = (Blend)evt.newValue; onChange(); }); context.AddProperty("Blend Operation Alpha", new EnumField(alphaBlendOperation) { value = alphaBlendOperation }, (evt) => @@ -569,7 +620,9 @@ public override void OnAfterDeserialize(string json) } } - #region Metadata + public bool SupportsVFX() => false; + public bool CanSupportVFX() => false; + string IHasMetadata.identifier { get @@ -589,802 +642,142 @@ ScriptableObject IHasMetadata.GetMetadataObject() return null; } - #endregion - } - - #region Passes - static class CorePasses - { - internal static void AddSurfaceTypeControlToPass(ref PassDescriptor pass, FullscreenTarget target) - { - // if (target.allowMaterialOverride) - // { - // pass.keywords.Add(CoreKeywordDescriptors.SurfaceTypeTransparent); - // } - // else if (target.surfaceType == SurfaceType.Transparent) - // { - // pass.defines.Add(CoreKeywordDescriptors.SurfaceTypeTransparent, 1); - // } - } - - internal static void AddAlphaPremultiplyControlToPass(ref PassDescriptor pass, FullscreenTarget target) - { - // if (target.allowMaterialOverride) - // { - // pass.keywords.Add(CoreKeywordDescriptors.AlphaPremultiplyOn); - // } - // else if (target.alphaMode == AlphaMode.Premultiply) - // { - // pass.defines.Add(CoreKeywordDescriptors.AlphaPremultiplyOn, 1); - // } - } - - internal static void AddAlphaClipControlToPass(ref PassDescriptor pass, FullscreenTarget target) - { - // if (target.allowMaterialOverride) - // { - // pass.keywords.Add(CoreKeywordDescriptors.AlphaClip); - // pass.keywords.Add(CoreKeywordDescriptors.AlphaTestOn); - // } - // else if (target.alphaClip) - // { - // pass.defines.Add(CoreKeywordDescriptors.AlphaClip, 1); - // pass.defines.Add(CoreKeywordDescriptors.AlphaTestOn, 1); - // } - } - - // public static PassDescriptor DepthOnly(FullscreenTarget target) - // { - // var result = new PassDescriptor() - // { - // // Definition - // displayName = "DepthOnly", - // referenceName = "SHADERPASS_DEPTHONLY", - // lightMode = "DepthOnly", - // useInPreview = true, - - // // Template - // passTemplatePath = FullscreenTarget.kTemplatePath, - // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, - - // // Port Mask - // validVertexBlocks = CoreBlockMasks.Vertex, - // validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, - - // // Fields - // structs = CoreStructCollections.Default, - // fieldDependencies = CoreFieldDependencies.Default, - - // // Conditional State - // renderStates = CoreRenderStates.DepthOnly(target), - // pragmas = CorePragmas.Instanced, - // defines = new DefineCollection() { CoreDefines.BuiltInTargetAPI }, - // keywords = new KeywordCollection(), - // includes = CoreIncludes.DepthOnly, - - // // Custom Interpolator Support - // customInterpolators = CoreCustomInterpDescriptors.Common - // }; - - // AddAlphaClipControlToPass(ref result, target); - - // return result; - // } - - // public static PassDescriptor ShadowCaster(FullscreenTarget target) - // { - // var result = new PassDescriptor() - // { - // // Definition - // displayName = "ShadowCaster", - // referenceName = "SHADERPASS_SHADOWCASTER", - // lightMode = "ShadowCaster", - - // // Template - // passTemplatePath = FullscreenTarget.kTemplatePath, - // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, - - // // Port Mask - // validVertexBlocks = CoreBlockMasks.Vertex, - // validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, - - // // Fields - // structs = CoreStructCollections.Default, - // requiredFields = CoreRequiredFields.ShadowCaster, - // fieldDependencies = CoreFieldDependencies.Default, - - // // Conditional State - // renderStates = CoreRenderStates.ShadowCaster(target), - // pragmas = CorePragmas.ShadowCaster, - // defines = new DefineCollection() { CoreDefines.BuiltInTargetAPI }, - // keywords = new KeywordCollection { CoreKeywords.ShadowCaster }, - // includes = CoreIncludes.ShadowCaster, - - // // Custom Interpolator Support - // customInterpolators = CoreCustomInterpDescriptors.Common - // }; - - // AddCommonPassSurfaceControlsToPass(ref result, target); - - // return result; - // } - - // public static PassDescriptor SceneSelection(FullscreenTarget target) - // { - // var result = new PassDescriptor() - // { - // // Definition - // displayName = "SceneSelectionPass", - // referenceName = "SceneSelectionPass", - // lightMode = "SceneSelectionPass", - // useInPreview = true, - - // // Template - // passTemplatePath = FullscreenTarget.kTemplatePath, - // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, - - // // Port Mask - // validVertexBlocks = CoreBlockMasks.Vertex, - // validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, - - // // Fields - // structs = CoreStructCollections.Default, - // fieldDependencies = CoreFieldDependencies.Default, - - // // Conditional State - // renderStates = CoreRenderStates.SceneSelection(target), - // pragmas = CorePragmas.Instanced, - // defines = new DefineCollection { CoreDefines.SceneSelection }, - // keywords = new KeywordCollection(), - // includes = CoreIncludes.SceneSelection, - - // // Custom Interpolator Support - // customInterpolators = CoreCustomInterpDescriptors.Common - // }; - - // AddCommonPassSurfaceControlsToPass(ref result, target); - - // return result; - // } - - // public static PassDescriptor ScenePicking(FullscreenTarget target) - // { - // var result = new PassDescriptor() - // { - // // Definition - // displayName = "ScenePickingPass", - // referenceName = "ScenePickingPass", - // lightMode = "Picking", - // useInPreview = true, - - // // Template - // passTemplatePath = FullscreenTarget.kTemplatePath, - // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, - - // // Port Mask - // validVertexBlocks = CoreBlockMasks.Vertex, - // validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, - - // // Fields - // structs = CoreStructCollections.Default, - // fieldDependencies = CoreFieldDependencies.Default, - - // // Conditional State - // renderStates = CoreRenderStates.ScenePicking(target), - // pragmas = CorePragmas.Instanced, - // defines = new DefineCollection { CoreDefines.ScenePicking }, - // keywords = new KeywordCollection(), - // includes = CoreIncludes.ScenePicking, - - // // Custom Interpolator Support - // customInterpolators = CoreCustomInterpDescriptors.Common - // }; - - // AddCommonPassSurfaceControlsToPass(ref result, target); - - // return result; - // } - } - #endregion - - #region FieldDependencies - static class CoreFieldDependencies - { - public static readonly DependencyCollection Default = new DependencyCollection() - { - { FieldDependencies.Default }, - // TODO: VR support - // new FieldDependency(BuiltInStructFields.Varyings.stereoTargetEyeIndexAsRTArrayIdx, StructFields.Attributes.instanceID), - // new FieldDependency(BuiltInStructFields.Varyings.stereoTargetEyeIndexAsBlendIdx0, StructFields.Attributes.instanceID), - }; - } - #endregion - - #region RenderStates - static class CoreRenderStates - { - public static class Uniforms - { - public static readonly string srcBlend = "[" + Property.SG_SrcBlend + "]"; - public static readonly string dstBlend = "[" + Property.SG_DstBlend + "]"; - public static readonly string cullMode = "[" + Property.SG_Cull + "]"; - public static readonly string zWrite = "[" + Property.SG_ZWrite + "]"; - public static readonly string zTest = "[" + Property.SG_ZTest + "]"; - } - - public static Cull RenderFaceToCull(RenderFace renderFace) - { - switch (renderFace) - { - case RenderFace.Back: - return Cull.Front; - case RenderFace.Front: - return Cull.Back; - case RenderFace.Both: - return Cull.Off; - } - return Cull.Back; - } - - public static void AddUberSwitchedZTest(FullscreenTarget target, RenderStateCollection renderStates) - { - if (target.allowMaterialOverride) - renderStates.Add(RenderState.ZTest(Uniforms.zTest)); - else - renderStates.Add(RenderState.ZTest(target.depthTestMode.ToString())); - } - - public static void AddUberSwitchedZWrite(FullscreenTarget target, RenderStateCollection renderStates) - { - if (target.allowMaterialOverride) - renderStates.Add(RenderState.ZWrite(Uniforms.zWrite)); - // TODO - // else - // renderStates.Add(RenderState.ZWrite(ZWriteControlToZWrite(target.zWriteControl, target.surfaceType))); - } - - public static void AddUberSwitchedCull(FullscreenTarget target, RenderStateCollection renderStates) - { - // TODO - // renderStates.Add(RenderState.Cull()); - } - - public static void AddUberSwitchedBlend(FullscreenTarget target, RenderStateCollection renderStates) + public static StructDescriptor Varyings = new StructDescriptor() { - if (target.allowMaterialOverride) + name = "Varyings", + packFields = true, + populateWithCustomInterpolators = false, + fields = new FieldDescriptor[] { - renderStates.Add(RenderState.Blend(Uniforms.srcBlend, Uniforms.dstBlend)); + StructFields.Varyings.positionCS, + StructFields.Varyings.texCoord0, + StructFields.Varyings.instanceID, + BuiltInStructFields.Varyings.stereoTargetEyeIndexAsBlendIdx0, + BuiltInStructFields.Varyings.stereoTargetEyeIndexAsRTArrayIdx, } - else - { - // TODO - // if (target.alphaMode == AlphaMode.Alpha) - // renderStates.Add(RenderState.Blend(Blend.SrcAlpha, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); - // else if (target.alphaMode == AlphaMode.Premultiply) - // renderStates.Add(RenderState.Blend(Blend.One, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); - // else if (target.alphaMode == AlphaMode.Additive) - // renderStates.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); - // else if (target.alphaMode == AlphaMode.Multiply) - // renderStates.Add(RenderState.Blend(Blend.DstColor, Blend.Zero)); - } - } + }; public static readonly RenderStateCollection MaterialControlledDefault = new RenderStateCollection { - { RenderState.ZTest(Uniforms.zTest) }, - { RenderState.ZWrite(Uniforms.zWrite) }, - { RenderState.Cull(Uniforms.cullMode) }, - { RenderState.Blend(Uniforms.srcBlend, Uniforms.dstBlend) }, + { RenderState.ZTest(Uniforms.depthTest) }, + { RenderState.ZWrite(Uniforms.depthWrite) }, + { RenderState.Blend(Uniforms.srcColorBlend, Uniforms.dstColorBlend, Uniforms.srcAlphaBlend, Uniforms.dstAlphaBlend) }, + { RenderState.BlendOp(Uniforms.colorBlendOperation, Uniforms.alphaBlendOperation) }, + // TODO: Add stencil read mask! + { RenderState.Stencil(new StencilDescriptor{ Ref = Uniforms.stencilReference, WriteMask = Uniforms.stencilWriteMask, Comp = Uniforms.stencilComparison, ZFail = Uniforms.stencilDepthFail, Fail = Uniforms.stencilFail, Pass = Uniforms.stencilPass}) } }; - public static RenderStateCollection Default(FullscreenTarget target) + public RenderStateCollection GetRenderState() { - if (target.allowMaterialOverride) + if (allowMaterialOverride) return MaterialControlledDefault; else { var result = new RenderStateCollection(); - AddUberSwitchedZTest(target, result); - AddUberSwitchedZWrite(target, result); - AddUberSwitchedCull(target, result); - AddUberSwitchedBlend(target, result); - // TODO: option? - // result.Add(RenderState.ColorMask("ColorMask RGBA")); + result.Add(RenderState.ZTest(depthTestMode.ToString())); + result.Add(RenderState.ZWrite(depthWrite.ToString())); + + // Blend mode + if (blendMode == FullscreenBlendMode.Alpha) + result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); + else if (blendMode == FullscreenBlendMode.Premultiply) + result.Add(RenderState.Blend(Blend.One, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); + else if (blendMode == FullscreenBlendMode.Additive) + result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); + else if (blendMode == FullscreenBlendMode.Multiply) + result.Add(RenderState.Blend(Blend.DstColor, Blend.Zero)); + else + { + result.Add(RenderState.Blend(srcColorBlendMode, dstColorBlendMode, srcAlphaBlendMode, dstAlphaBlendMode)); + result.Add(RenderState.BlendOp(colorBlendOperation, alphaBlendOperation)); + } + + result.Add(RenderState.Stencil(new StencilDescriptor + { + Ref = stencilReference.ToString(), + WriteMask = stencilWriteMask.ToString(), + Comp = stencilCompareFunction.ToString(), + ZFail = stencilDepthTestFailOperation.ToString(), + Fail = stencilFailOperation.ToString(), + Pass = stencilPassOperation.ToString(), + })); return result; } } - - // public static RenderStateCollection ForwardAdd(FullscreenTarget target) - // { - // var result = new RenderStateCollection(); - - // result.Add(RenderState.ZWrite(ZWrite.Off)); - // if (target.surfaceType != SurfaceType.Opaque) - // { - // result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One)); - // result.Add(RenderState.ColorMask("ColorMask RGB")); - // } - // else - // { - // result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); - // } - // return result; - // } - - // public static readonly RenderStateCollection Meta = new RenderStateCollection - // { - // { RenderState.Cull(Cull.Off) }, - // }; - - // public static RenderStateCollection ShadowCaster(FullscreenTarget target) - // { - // var result = new RenderStateCollection(); - // result.Add(RenderState.ZTest(ZTest.LEqual)); - // result.Add(RenderState.ZWrite(ZWrite.On)); - // AddUberSwitchedCull(target, result); - // AddUberSwitchedBlend(target, result); - // result.Add(RenderState.ColorMask("ColorMask 0")); - // return result; - // } - - // public static RenderStateCollection DepthOnly(FullscreenTarget target) - // { - // var result = new RenderStateCollection(); - // result.Add(RenderState.ZTest(ZTest.LEqual)); - // result.Add(RenderState.ZWrite(ZWrite.On)); - // AddUberSwitchedCull(target, result); - // AddUberSwitchedBlend(target, result); - // result.Add(RenderState.ColorMask("ColorMask 0")); - // return result; - // } - - // public static RenderStateCollection SceneSelection(FullscreenTarget target) - // { - // var result = new RenderStateCollection() - // { - // { RenderState.Cull(Cull.Off) } - // }; - // return result; - // } - - // public static RenderStateCollection ScenePicking(FullscreenTarget target) - // { - // var result = new RenderStateCollection(); - // AddUberSwitchedCull(target, result); - // return result; - // } } - #endregion - - #region Pragmas - - static class CorePragmas - { - public static readonly PragmaCollection Default = new PragmaCollection - { - { Pragma.Target(ShaderModel.Target30) }, - { Pragma.Vertex("vert") }, - { Pragma.Fragment("frag") }, - }; - - // public static readonly PragmaCollection Instanced = new PragmaCollection - // { - // { Pragma.Target(ShaderModel.Target30) }, - // { Pragma.MultiCompileInstancing }, - // { Pragma.Vertex("vert") }, - // { Pragma.Fragment("frag") }, - // }; - - // public static readonly PragmaCollection Forward = new PragmaCollection - // { - // { Pragma.Target(ShaderModel.Target30) }, - // { Pragma.MultiCompileInstancing }, - // { Pragma.MultiCompileFog }, - // { Pragma.MultiCompileForwardBase }, - // { Pragma.Vertex("vert") }, - // { Pragma.Fragment("frag") }, - // }; - - // public static readonly PragmaCollection ForwardAdd = new PragmaCollection - // { - // { Pragma.Target(ShaderModel.Target30) }, - // { Pragma.MultiCompileInstancing }, - // { Pragma.MultiCompileFog }, - // { Pragma.MultiCompileForwardAddFullShadowsBase }, - // { Pragma.Vertex("vert") }, - // { Pragma.Fragment("frag") }, - // }; - - // public static readonly PragmaCollection Deferred = new PragmaCollection - // { - // { Pragma.Target(ShaderModel.Target45) }, - // { Pragma.MultiCompileInstancing }, - // { new PragmaDescriptor { value = "exclude_renderers nomrt" } }, - // { Pragma.MultiCompilePrePassFinal }, - // { Pragma.SkipVariants(new[] {"FOG_LINEAR", "FOG_EXP", "FOG_EXP2" }) }, - // { Pragma.Vertex("vert") }, - // { Pragma.Fragment("frag") }, - // }; - - // public static readonly PragmaCollection ShadowCaster = new PragmaCollection - // { - // { Pragma.Target(ShaderModel.Target30) }, - // { Pragma.MultiCompileShadowCaster }, - // { Pragma.Vertex("vert") }, - // { Pragma.Fragment("frag") }, - // }; - } - #endregion #region Includes static class CoreIncludes { const string kColor = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"; const string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; - const string kCore = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Core.hlsl"; - const string kLighting = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Lighting.hlsl"; - const string kGraphFunctions = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/ShaderGraphFunctions.hlsl"; - const string kVaryings = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/Varyings.hlsl"; - const string kShaderPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShaderPass.hlsl"; - const string kDepthOnlyPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/DepthOnlyPass.hlsl"; - const string kShadowCasterPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShadowCasterPass.hlsl"; - - const string kShims = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/Shims.hlsl"; - const string kLegacySurfaceVertex = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/LegacySurfaceVertex.hlsl"; + // TODO: Add shadergraph functions support (replace functions.hlsl by SGFunctions) + const string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"; + const string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; + const string kInstancing = "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"; + // const string kCore = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Core.hlsl"; + // const string kLighting = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Lighting.hlsl"; + // const string kGraphFunctions = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/ShaderGraphFunctions.hlsl"; + // const string kVaryings = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/Varyings.hlsl"; + // const string kShaderPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShaderPass.hlsl"; + // const string kDepthOnlyPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/DepthOnlyPass.hlsl"; + // const string kShadowCasterPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShadowCasterPass.hlsl"; + + // TODO: support SH + // const string kShims = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/Shims.hlsl"; public static readonly IncludeCollection CorePregraph = new IncludeCollection { - { kShims, IncludeLocation.Pregraph }, + // { kShims, IncludeLocation.Pregraph }, { kColor, IncludeLocation.Pregraph }, - { kCore, IncludeLocation.Pregraph }, + // { kCore, IncludeLocation.Pregraph }, { kTexture, IncludeLocation.Pregraph }, - { kLighting, IncludeLocation.Pregraph }, - { kLegacySurfaceVertex, IncludeLocation.Pregraph }, + { kFunctions, IncludeLocation.Pregraph }, + { kCommon, IncludeLocation.Pregraph }, + { kInstancing, IncludeLocation.Pregraph }, // For VR }; public static readonly IncludeCollection ShaderGraphPregraph = new IncludeCollection { - { kGraphFunctions, IncludeLocation.Pregraph }, - }; - - public static readonly IncludeCollection CorePostgraph = new IncludeCollection - { - { kShaderPass, IncludeLocation.Postgraph }, - { kVaryings, IncludeLocation.Postgraph }, - }; - - public static readonly IncludeCollection DepthOnly = new IncludeCollection - { - // Pre-graph - { CorePregraph }, - { ShaderGraphPregraph }, - - // Post-graph - { CorePostgraph }, - { kDepthOnlyPass, IncludeLocation.Postgraph }, - }; - - public static readonly IncludeCollection ShadowCaster = new IncludeCollection - { - // Pre-graph - { CorePregraph }, - { ShaderGraphPregraph }, - - // Post-graph - { CorePostgraph }, - { kShadowCasterPass, IncludeLocation.Postgraph }, + // { kGraphFunctions, IncludeLocation.Pregraph }, }; - public static readonly IncludeCollection SceneSelection = new IncludeCollection - { - // Pre-graph - { CorePregraph }, - { ShaderGraphPregraph }, - - // Post-graph - { CorePostgraph }, - { kDepthOnlyPass, IncludeLocation.Postgraph }, - }; - - public static readonly IncludeCollection ScenePicking = new IncludeCollection - { - // Pre-graph - { CorePregraph }, - { ShaderGraphPregraph }, - - // Post-graph - { CorePostgraph }, - { kDepthOnlyPass, IncludeLocation.Postgraph }, - }; - } - #endregion - - #region Defines - // static class CoreDefines - // { - // public static readonly DefineCollection UseLegacySpriteBlocks = new DefineCollection - // { - // { CoreKeywordDescriptors.UseLegacySpriteBlocks, 1, new FieldCondition(CoreFields.UseLegacySpriteBlocks, true) }, - // }; - // public static readonly DefineCollection BuiltInTargetAPI = new DefineCollection - // { - // { CoreKeywordDescriptors.BuiltInTargetAPI, 1 }, - // }; - // public static readonly DefineCollection SceneSelection = new DefineCollection - // { - // { CoreKeywordDescriptors.BuiltInTargetAPI, 1 }, - // { CoreKeywordDescriptors.SceneSelectionPass, 1 }, - // }; - // public static readonly DefineCollection ScenePicking = new DefineCollection - // { - // { CoreKeywordDescriptors.BuiltInTargetAPI, 1 }, - // { CoreKeywordDescriptors.ScenePickingPass, 1 }, - // }; - // } - #endregion - - #region KeywordDescriptors - - static class CoreKeywordDescriptors - { - // TODO: cleanup! - // public static readonly KeywordDescriptor Lightmap = new KeywordDescriptor() - // { - // displayName = "Lightmap", - // referenceName = "LIGHTMAP_ON", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor DirectionalLightmapCombined = new KeywordDescriptor() - // { - // displayName = "Directional Lightmap Combined", - // referenceName = "DIRLIGHTMAP_COMBINED", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor SampleGI = new KeywordDescriptor() - // { - // displayName = "Sample GI", - // referenceName = "_SAMPLE_GI", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.ShaderFeature, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor AlphaTestOn = new KeywordDescriptor() - // { - // displayName = Keyword.SG_AlphaTestOn, - // referenceName = Keyword.SG_AlphaTestOn, - // type = KeywordType.Boolean, - // definition = KeywordDefinition.ShaderFeature, - // scope = KeywordScope.Local, - // stages = KeywordShaderStage.Fragment, - // }; - - // public static readonly KeywordDescriptor AlphaClip = new KeywordDescriptor() - // { - // displayName = "Alpha Clipping", - // referenceName = Keyword.SG_AlphaClip, - // type = KeywordType.Boolean, - // definition = KeywordDefinition.ShaderFeature, - // scope = KeywordScope.Local, - // stages = KeywordShaderStage.Fragment, - // }; - - // public static readonly KeywordDescriptor SurfaceTypeTransparent = new KeywordDescriptor() - // { - // displayName = Keyword.SG_SurfaceTypeTransparent, - // referenceName = Keyword.SG_SurfaceTypeTransparent, - // type = KeywordType.Boolean, - // definition = KeywordDefinition.ShaderFeature, - // scope = KeywordScope.Local, - // stages = KeywordShaderStage.Fragment, - // }; - - // public static readonly KeywordDescriptor AlphaPremultiplyOn = new KeywordDescriptor() - // { - // displayName = Keyword.SG_AlphaPremultiplyOn, - // referenceName = Keyword.SG_AlphaPremultiplyOn, - // type = KeywordType.Boolean, - // definition = KeywordDefinition.ShaderFeature, - // scope = KeywordScope.Local, - // stages = KeywordShaderStage.Fragment, - // }; - - // public static readonly KeywordDescriptor MainLightShadows = new KeywordDescriptor() - // { - // displayName = "Main Light Shadows", - // referenceName = "", - // type = KeywordType.Enum, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // entries = new KeywordEntry[] - // { - // new KeywordEntry() { displayName = "Off", referenceName = "" }, - // new KeywordEntry() { displayName = "No Cascade", referenceName = "MAIN_LIGHT_SHADOWS" }, - // new KeywordEntry() { displayName = "Cascade", referenceName = "MAIN_LIGHT_SHADOWS_CASCADE" }, - // new KeywordEntry() { displayName = "Screen", referenceName = "MAIN_LIGHT_SHADOWS_SCREEN" }, - // } - // }; - - // public static readonly KeywordDescriptor CastingPunctualLightShadow = new KeywordDescriptor() - // { - // displayName = "Casting Punctual Light Shadow", - // referenceName = "_CASTING_PUNCTUAL_LIGHT_SHADOW", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor AdditionalLights = new KeywordDescriptor() - // { - // displayName = "Additional Lights", - // referenceName = "_ADDITIONAL", - // type = KeywordType.Enum, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // entries = new KeywordEntry[] - // { - // new KeywordEntry() { displayName = "Vertex", referenceName = "LIGHTS_VERTEX" }, - // new KeywordEntry() { displayName = "Fragment", referenceName = "LIGHTS" }, - // new KeywordEntry() { displayName = "Off", referenceName = "OFF" }, - // } - // }; - - // public static readonly KeywordDescriptor AdditionalLightShadows = new KeywordDescriptor() + // public static readonly IncludeCollection CorePostgraph = new IncludeCollection // { - // displayName = "Additional Light Shadows", - // referenceName = "_ADDITIONAL_LIGHT_SHADOWS", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, + // { kVaryings, IncludeLocation.Postgraph }, // }; - - // public static readonly KeywordDescriptor ShadowsSoft = new KeywordDescriptor() - // { - // displayName = "Shadows Soft", - // referenceName = "_SHADOWS_SOFT", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor MixedLightingSubtractive = new KeywordDescriptor() - // { - // displayName = "Mixed Lighting Subtractive", - // referenceName = "_MIXED_LIGHTING_SUBTRACTIVE", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor LightmapShadowMixing = new KeywordDescriptor() - // { - // displayName = "Lightmap Shadow Mixing", - // referenceName = "LIGHTMAP_SHADOW_MIXING", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor ShadowsShadowmask = new KeywordDescriptor() - // { - // displayName = "Shadows Shadowmask", - // referenceName = "SHADOWS_SHADOWMASK", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor SmoothnessChannel = new KeywordDescriptor() - // { - // displayName = "Smoothness Channel", - // referenceName = "_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.ShaderFeature, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor ShapeLightType0 = new KeywordDescriptor() - // { - // displayName = "Shape Light Type 0", - // referenceName = "USE_SHAPE_LIGHT_TYPE_0", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor ShapeLightType1 = new KeywordDescriptor() - // { - // displayName = "Shape Light Type 1", - // referenceName = "USE_SHAPE_LIGHT_TYPE_1", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor ShapeLightType2 = new KeywordDescriptor() - // { - // displayName = "Shape Light Type 2", - // referenceName = "USE_SHAPE_LIGHT_TYPE_2", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor ShapeLightType3 = new KeywordDescriptor() - // { - // displayName = "Shape Light Type 3", - // referenceName = "USE_SHAPE_LIGHT_TYPE_3", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.MultiCompile, - // scope = KeywordScope.Global, - // }; - - // public static readonly KeywordDescriptor UseLegacySpriteBlocks = new KeywordDescriptor() - // { - // displayName = "UseLegacySpriteBlocks", - // referenceName = "USELEGACYSPRITEBLOCKS", - // type = KeywordType.Boolean, - // }; - - // public static readonly KeywordDescriptor BuiltInTargetAPI = new KeywordDescriptor() - // { - // displayName = "BuiltInTargetAPI", - // referenceName = "BUILTIN_TARGET_API", - // type = KeywordType.Boolean, - // }; - - // public static readonly KeywordDescriptor SceneSelectionPass = new KeywordDescriptor() - // { - // displayName = "Scene Selection Pass", - // referenceName = "SCENESELECTIONPASS", - // type = KeywordType.Boolean, - // }; - - // public static readonly KeywordDescriptor ScenePickingPass = new KeywordDescriptor() - // { - // displayName = "Scene Picking Pass", - // referenceName = "SCENEPICKINGPASS", - // type = KeywordType.Boolean, - // }; - } - #endregion - - // #region Keywords - // static class CoreKeywords - // { - // public static readonly KeywordCollection ShadowCaster = new KeywordCollection - // { - // { CoreKeywordDescriptors.CastingPunctualLightShadow }, - // }; - // } - // #endregion - - #region FieldDescriptors - static class CoreFields - { - public static readonly FieldDescriptor UseLegacySpriteBlocks = new FieldDescriptor("BuiltIn", "UseLegacySpriteBlocks", "BUILTIN_USELEGACYSPRITEBLOCKS"); } #endregion - #region CustomInterpolators - static class CoreCustomInterpDescriptors + internal static class FullscreenPropertyCollectorExtension { - public static readonly CustomInterpSubGen.Collection Common = new CustomInterpSubGen.Collection + public static void AddEnumProperty(this PropertyCollector collector, string prop, T value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) where T : Enum { - // Custom interpolators are not explicitly defined in the SurfaceDescriptionInputs template. - // This entry point will let us generate a block of pass-through assignments for each field. - CustomInterpSubGen.Descriptor.MakeBlock(CustomInterpSubGen.Splice.k_spliceCopyToSDI, "output", "input"), + collector.AddShaderProperty(new Vector1ShaderProperty + { + floatType = FloatType.Enum, + enumType = EnumType.Enum, + cSharpEnumType = typeof(T), + hidden = true, + overrideHLSLDeclaration = true, + hlslDeclarationOverride = hlslDeclaration, + value = Convert.ToInt32(value), + overrideReferenceName = prop, + }); + } - // sgci_PassThroughFunc is called from BuildVaryings in Varyings.hlsl to copy custom interpolators from vertex descriptions. - // this entry point allows for the function to be defined before it is used. - CustomInterpSubGen.Descriptor.MakeFunc(CustomInterpSubGen.Splice.k_splicePreSurface, "CustomInterpolatorPassThroughFunc", "Varyings", "VertexDescription", "CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC", "FEATURES_GRAPH_VERTEX") - }; + public static void AddIntProperty(this PropertyCollector collector, string prop, int value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) + { + collector.AddShaderProperty(new Vector1ShaderProperty + { + floatType = FloatType.Integer, + hidden = true, + overrideHLSLDeclaration = true, + hlslDeclarationOverride = hlslDeclaration, + value = value, + overrideReferenceName = prop, + }); + } } - #endregion + } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes.meta new file mode 100644 index 00000000000..d54446ba6a3 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 67b87f1c65c508c429e1d957b33776b3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl new file mode 100644 index 00000000000..4c3e1b6f327 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl @@ -0,0 +1,137 @@ + +// TODO: I think we can get rid of this Varyings struct +Varyings BuildVaryings(Attributes input) +{ + Varyings output = (Varyings)0; + + // TODO: VR support + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + +// #if defined(FEATURES_GRAPH_VERTEX) +// // Evaluate Vertex Graph +// VertexDescriptionInputs vertexDescriptionInputs = BuildVertexDescriptionInputs(input); +// VertexDescription vertexDescription = VertexDescriptionFunction(vertexDescriptionInputs); + +// // Assign modified vertex attributes +// input.positionOS = vertexDescription.Position; +// #if defined(VARYINGS_NEED_NORMAL_WS) +// input.normalOS = vertexDescription.Normal; +// #endif //FEATURES_GRAPH_NORMAL +// #if defined(VARYINGS_NEED_TANGENT_WS) +// input.tangentOS.xyz = vertexDescription.Tangent.xyz; +// #endif //FEATURES GRAPH TANGENT +// #endif //FEATURES_GRAPH_VERTEX + + // TODO: Avoid path via VertexPositionInputs (BuiltIn) + // VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz); + + // Returns the camera relative position (if enabled) + // float3 positionWS = TransformObjectToWorld(input.positionOS); + +// #ifdef ATTRIBUTES_NEED_NORMAL +// float3 normalWS = TransformObjectToWorldNormal(input.normalOS); +// #else +// // Required to compile ApplyVertexModification that doesn't use normal. +// float3 normalWS = float3(0.0, 0.0, 0.0); +// #endif + +// #ifdef ATTRIBUTES_NEED_TANGENT +// float4 tangentWS = float4(TransformObjectToWorldDir(input.tangentOS.xyz), input.tangentOS.w); +// #endif + + // TODO: Change to inline ifdef + // Do vertex modification in camera relative space (if enabled) +// #if defined(HAVE_VERTEX_MODIFICATION) +// ApplyVertexModification(input, normalWS, positionWS, _TimeParameters.xyz); +// #endif + +// #ifdef VARYINGS_NEED_POSITION_WS +// output.positionWS = positionWS; +// #endif + +// #ifdef VARYINGS_NEED_NORMAL_WS +// output.normalWS = normalWS; // normalized in TransformObjectToWorldNormal() +// #endif + +// #ifdef VARYINGS_NEED_TANGENT_WS +// output.tangentWS = tangentWS; // normalized in TransformObjectToWorldDir() +// #endif + +// // Handled by the legacy pipeline +// #ifndef BUILTIN_TARGET_API +// #if (SHADERPASS == SHADERPASS_SHADOWCASTER) +// // Define shadow pass specific clip position for BuiltIn +// #if _CASTING_PUNCTUAL_LIGHT_SHADOW +// float3 lightDirectionWS = normalize(_LightPosition - positionWS); +// #else +// float3 lightDirectionWS = _LightDirection; +// #endif +// output.positionCS = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); +// #if UNITY_REVERSED_Z +// output.positionCS.z = min(output.positionCS.z, UNITY_NEAR_CLIP_VALUE); +// #else +// output.positionCS.z = max(output.positionCS.z, UNITY_NEAR_CLIP_VALUE); +// #endif +// #elif (SHADERPASS == SHADERPASS_META) +// output.positionCS = MetaVertexPosition(float4(input.positionOS, 0), input.uv1, input.uv2, unity_LightmapST, unity_DynamicLightmapST); +// #else + // output.positionCS = TransformWorldToHClip(positionWS); +// #endif +// #else + + // TODO: support Blit as well + output.positionCS = GetFullScreenTriangleVertexPosition(input.vertexID, UNITY_RAW_FAR_CLIP_VALUE); +// #endif + +#if defined(VARYINGS_NEED_TEXCOORD0) || defined(VARYINGS_DS_NEED_TEXCOORD0) + output.texCoord0 = output.positionCS * 0.5 + 0.5; +#endif +// #if defined(VARYINGS_NEED_TEXCOORD1) || defined(VARYINGS_DS_NEED_TEXCOORD1) +// output.texCoord1 = input.uv1; +// #endif +// #if defined(VARYINGS_NEED_TEXCOORD2) || defined(VARYINGS_DS_NEED_TEXCOORD2) +// output.texCoord2 = input.uv2; +// #endif +// #if defined(VARYINGS_NEED_TEXCOORD3) || defined(VARYINGS_DS_NEED_TEXCOORD3) +// output.texCoord3 = input.uv3; +// #endif + +// #if defined(VARYINGS_NEED_COLOR) || defined(VARYINGS_DS_NEED_COLOR) +// output.color = input.color; +// #endif + +// #ifdef VARYINGS_NEED_VIEWDIRECTION_WS +// output.viewDirectionWS = GetWorldSpaceViewDir(positionWS); +// #endif + +#ifdef VARYINGS_NEED_SCREENPOSITION + output.screenPosition = output.texCoord1; +#endif + + return output; +} + +PackedVaryings vert(Attributes input) +{ + Varyings output = (Varyings)0; + output = BuildVaryings(input); + PackedVaryings packedOutput = PackVaryings(output); + return packedOutput; +} + +// TODO: Add depth as optional target +float4 frag(PackedVaryings packedInput) : SV_TARGET +{ + Varyings unpacked = UnpackVaryings(packedInput); + + // TODO: VR + // UNITY_SETUP_INSTANCE_ID(unpacked); + // UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(unpacked); + + SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(unpacked); + SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); + + return surfaceDescription.Color; +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl.meta new file mode 100644 index 00000000000..b723e6b0d59 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c1931467a12255f489f3c72e4aa99ade +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl similarity index 71% rename from com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl rename to com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index ee857291ec5..f2266c7a668 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -3,8 +3,6 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) SurfaceDescriptionInputs output; ZERO_INITIALIZE(SurfaceDescriptionInputs, output); - $splice(CustomInterpolatorCopyToSDI) - $SurfaceDescriptionInputs.WorldSpaceNormal: // must use interpolated tangent, bitangent and normal before they are normalized in the pixel shader. $SurfaceDescriptionInputs.WorldSpaceNormal: float3 unnormalizedNormalWS = input.normalWS; $SurfaceDescriptionInputs.WorldSpaceNormal: const float renormFactor = 1.0 / length(unnormalizedNormalWS); @@ -62,63 +60,3 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) return output; } - -void BuildAppDataFull(Attributes attributes, VertexDescription vertexDescription, inout appdata_full result) -{ - $Attributes.positionOS: result.vertex = float4(attributes.positionOS, 1); - $Attributes.tangentOS: result.tangent = attributes.tangentOS; - $Attributes.normalOS: result.normal = attributes.normalOS; - $Attributes.uv0: result.texcoord = attributes.uv0; - $Attributes.uv1: result.texcoord1 = attributes.uv1; - $Attributes.uv2: result.texcoord2 = attributes.uv2; - $Attributes.uv3: result.texcoord3 = attributes.uv3; - $Attributes.color: result.color = attributes.color; - $VertexDescription.Position: result.vertex = float4(vertexDescription.Position, 1); - $VertexDescription.Normal: result.normal = vertexDescription.Normal; - $VertexDescription.Tangent: result.tangent = float4(vertexDescription.Tangent, 0); - #if UNITY_ANY_INSTANCING_ENABLED - $Attributes.instanceID: result.instanceID = attributes.instanceID; - #endif -} - -void VaryingsToSurfaceVertex(Varyings varyings, inout v2f_surf result) -{ - result.pos = varyings.positionCS; - $Varyings.positionWS: result.worldPos = varyings.positionWS; - $Varyings.normalWS: result.worldNormal = varyings.normalWS; - $Varyings.viewDirectionWS: result.viewDir = varyings.viewDirectionWS; - // World Tangent isn't an available input on v2f_surf - - #if UNITY_ANY_INSTANCING_ENABLED - $Varyings.instanceID: UNITY_TRANSFER_INSTANCE_ID(varyings, result); - #endif - #if UNITY_SHOULD_SAMPLE_SH - $Varyings.sh: result.sh = varyings.sh; - #endif - #if defined(LIGHTMAP_ON) - $Varyings.lightmapUV: result.lmap.xy = varyings.lightmapUV; - #endif - - DEFAULT_UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(varyings, result); -} - -void SurfaceVertexToVaryings(v2f_surf surfVertex, inout Varyings result) -{ - result.positionCS = surfVertex.pos; - $Varyings.positionWS: result.positionWS = surfVertex.worldPos; - $Varyings.normalWS: result.normalWS = surfVertex.worldNormal; - // viewDirectionWS is never filled out in the legacy pass' function. Always use the value computed by SRP - // World Tangent isn't an available input on v2f_surf - - #if UNITY_ANY_INSTANCING_ENABLED - $Varyings.instanceID: UNITY_TRANSFER_INSTANCE_ID(surfVertex, result); - #endif - #if UNITY_SHOULD_SAMPLE_SH - $Varyings.sh: result.sh = surfVertex.sh; - #endif - #if defined(LIGHTMAP_ON) - $Varyings.lightmapUV: result.lightmapUV = surfVertex.lmap.xy; - #endif - - DEFAULT_UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(surfVertex, result); -} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl.meta similarity index 100% rename from com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderCode.template.hlsl.meta rename to com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl.meta From d197e6572462972c6efd6486f6a21710157955da Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Mon, 20 Sep 2021 12:33:07 +0200 Subject: [PATCH 003/108] Added read mask in stencil descriptor --- com.unity.shadergraph/Editor/Extensions/StencilExtensions.cs | 2 ++ .../Editor/Generation/Descriptors/StencilDescriptor.cs | 1 + 2 files changed, 3 insertions(+) diff --git a/com.unity.shadergraph/Editor/Extensions/StencilExtensions.cs b/com.unity.shadergraph/Editor/Extensions/StencilExtensions.cs index efb194a2f6c..6b5b86ade5f 100644 --- a/com.unity.shadergraph/Editor/Extensions/StencilExtensions.cs +++ b/com.unity.shadergraph/Editor/Extensions/StencilExtensions.cs @@ -15,6 +15,8 @@ public static string ToShaderString(this StencilDescriptor descriptor) string failBack = descriptor.FailBack != null && descriptor.FailBack.Length > 0 ? descriptor.FailBack : descriptor.Fail; string passBack = descriptor.PassBack != null && descriptor.PassBack.Length > 0 ? descriptor.PassBack : descriptor.Pass; + if (descriptor.ReadMask != null && descriptor.ReadMask.Length > 0) + builder.AppendLine($"ReadMask {descriptor.ReadMask}"); if (descriptor.WriteMask != null && descriptor.WriteMask.Length > 0) builder.AppendLine($"WriteMask {descriptor.WriteMask}"); if (descriptor.Ref != null && descriptor.Ref.Length > 0) diff --git a/com.unity.shadergraph/Editor/Generation/Descriptors/StencilDescriptor.cs b/com.unity.shadergraph/Editor/Generation/Descriptors/StencilDescriptor.cs index 2e6e80c757b..d54a3c15bf9 100644 --- a/com.unity.shadergraph/Editor/Generation/Descriptors/StencilDescriptor.cs +++ b/com.unity.shadergraph/Editor/Generation/Descriptors/StencilDescriptor.cs @@ -3,6 +3,7 @@ namespace UnityEditor.ShaderGraph [GenerationAPI] internal struct StencilDescriptor { + public string ReadMask; public string WriteMask; public string Ref; public string Comp; From 2a70be52df3eed1a9519db3585e33e5ca80a621c Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Mon, 20 Sep 2021 19:05:30 +0200 Subject: [PATCH 004/108] Added Blit support --- .../Targets/Fullscreen/FullscreenMetaData.cs | 8 +- .../Targets/Fullscreen/FullscreenSubTarget.cs | 58 ++++---- .../Targets/Fullscreen/FullscreenTarget.cs | 109 +++++++++++---- .../Includes/CustomRenderTexture.hlsl | 17 +++ .../Includes/CustomRenderTexture.hlsl.meta | 7 + .../Fullscreen/Includes/FullscreenBlit.hlsl | 132 +----------------- .../Fullscreen/Includes/FullscreenCommon.hlsl | 58 ++++++++ .../Includes/FullscreenCommon.hlsl.meta | 7 + .../Includes/FullscreenDrawProcedural.hlsl | 13 ++ .../FullscreenDrawProcedural.hlsl.meta | 7 + .../Templates/SharedCode.template.hlsl | 42 ++++-- 11 files changed, 262 insertions(+), 196 deletions(-) create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl.meta diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs index 626f84d6266..2a05c0b37dd 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs @@ -8,12 +8,12 @@ namespace UnityEditor.Rendering.Fullscreen.ShaderGraph sealed class FullscreenMetaData : ScriptableObject { [SerializeField] - FullscreenTarget.MaterialType m_MaterialType; + FullscreenTarget.FullscreenCompatibility _FullscreenCompatibility; - public FullscreenTarget.MaterialType materialType + public FullscreenTarget.FullscreenCompatibility fullscreenCompatibility { - get => m_MaterialType; - set => m_MaterialType = value; + get => _FullscreenCompatibility; + set => _FullscreenCompatibility = value; } } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index e04a69d7398..15488958246 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -15,28 +15,24 @@ public override void Setup(ref TargetSetupContext context) context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); // TODO: custom editor field - // if (!context.HasCustomEditorForRenderPipeline(null)) - // context.customEditorForRenderPipelines.Add((typeof(BuiltInUnlitGUI).FullName, "")); + // if (!context.customEditorForRenderPipelines) + //context.defaultShaderGUI = typeof(BuiltInUnlitGUI).FullName; // Process SubShaders context.AddSubShader(SubShaders.FullscreenBlit(target)); } - protected FullscreenTarget.MaterialType materialType { get; } - public virtual string identifier => GetType().Name; public virtual ScriptableObject GetMetadataObject() { var bultInMetadata = ScriptableObject.CreateInstance(); - bultInMetadata.materialType = materialType; + bultInMetadata.fullscreenCompatibility = target.fullscreenCompatibility; return bultInMetadata; } // We don't need the save context / update materials for now public override object saveContext => null; - - public FullscreenSubTarget() { displayName = "Fullscreen"; @@ -83,22 +79,7 @@ public override void CollectShaderProperties(PropertyCollector collector, Genera base.CollectShaderProperties(collector, generationMode); target.CollectRenderStateShaderProperties(collector, generationMode); - - // setup properties using the defaults - // TODO - // collector.AddFloatProperty(Property.Blend(), (float)target.alphaMode); - collector.AddFloatProperty(Property.SrcBlend(), 1.0f); // always set by material inspector (TODO : get src/dst blend and set here?) - collector.AddFloatProperty(Property.DstBlend(), 0.0f); // always set by material inspector - collector.AddFloatProperty(Property.ZWrite(), 0.0f); // TODO - // collector.AddFloatProperty(Property.ZWriteControl(), (float)target.zWriteControl); - collector.AddFloatProperty(Property.ZTest(), (float)target.depthTestMode); // ztest mode is designed to directly pass as ztest } - - // We always need these properties regardless of whether the material is allowed to override other shader properties. - // Queue control & offset enable correct automatic render queue behavior. Control == 0 is automatic, 1 is user-specified. - // We initialize queue control to -1 to indicate to UpdateMaterial that it needs to initialize it properly on the material. - // collector.AddFloatProperty(Property.QueueOffset(), 0.0f); - // collector.AddFloatProperty(Property.QueueControl(), -1.0f); } public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) @@ -109,7 +90,10 @@ public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Acti #region SubShader static class SubShaders { - const string kFullscreenInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; + const string kFullscreenDrawProceduralInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl"; + const string kFullscreenBlitInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; + const string kCustomRenderTextureInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl"; + const string kFullscreenCommon = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl"; public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) { @@ -119,7 +103,7 @@ public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) passes = new PassCollection() }; - result.passes.Add(new PassDescriptor + var fullscreenPass = new PassDescriptor { // Definition displayName = "Fullscreen", @@ -138,6 +122,7 @@ public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) validPixelBlocks = new BlockFieldDescriptor[] { FullscreenTarget.Blocks.Color, + FullscreenTarget.Blocks.Depth, }, // Fields @@ -152,6 +137,7 @@ public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) requiredFields = new FieldCollection { StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code + StructFields.Varyings.texCoord0, StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case }, @@ -168,14 +154,28 @@ public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) includes = new IncludeCollection { // Pre-graph - { CoreIncludes.CorePregraph }, - { CoreIncludes.ShaderGraphPregraph }, + { CoreIncludes.preGraphIncludes }, // Post-graph - // { CoreIncludes.CorePostgraph }, - { kFullscreenInclude, IncludeLocation.Postgraph }, + { kFullscreenCommon, IncludeLocation.Postgraph }, }, - }); + }; + + switch (target.fullscreenCompatibility) + { + default: + case FullscreenTarget.FullscreenCompatibility.Blit: + fullscreenPass.includes.Add(kFullscreenBlitInclude, IncludeLocation.Postgraph); + break; + case FullscreenTarget.FullscreenCompatibility.DrawProcedural: + fullscreenPass.includes.Add(kFullscreenDrawProceduralInclude, IncludeLocation.Postgraph); + break; + case FullscreenTarget.FullscreenCompatibility.CustomRenderTexture: + fullscreenPass.includes.Add(kCustomRenderTextureInclude, IncludeLocation.Postgraph); + break; + } + + result.passes.Add(fullscreenPass); return result; } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs index 50fd89b7188..76b8e5bd0dc 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs @@ -28,11 +28,11 @@ public struct Blocks } - public enum MaterialType + public enum FullscreenCompatibility { Blit, - // DrawProcedural, // TODO - // CustomRenderTexture, + DrawProcedural, + CustomRenderTexture, } public enum FullscreenBlendMode @@ -99,6 +99,9 @@ public static class Uniforms [SerializeField] JsonData m_ActiveSubTarget; + [SerializeField] + FullscreenCompatibility m_fullscreenCompatibility; + // When checked, allows the material to control ALL surface settings (uber shader style) [SerializeField] bool m_AllowMaterialOverride = false; @@ -157,6 +160,12 @@ public FullscreenTarget() TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); } + public FullscreenCompatibility fullscreenCompatibility + { + get => m_fullscreenCompatibility; + set => m_fullscreenCompatibility = value; + } + public FullscreenBlendMode blendMode { get => m_BlendMode; @@ -281,8 +290,53 @@ public string customEditorGUI public override bool IsNodeAllowedByTarget(Type nodeType) { - // TODO: we must remove a lot of nodes :/ - return base.IsNodeAllowedByTarget(nodeType); + bool allowed = true; + SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); + + // Nodes with SRP specific code donesn't work in the fullscreen target. + allowed &= srpFilter == null; + + var interfaces = nodeType.GetInterfaces(); + // FIXME: allow to sample depth and color in a fullscreen node (needed to compute position) + if (interfaces.Contains(typeof(IMayRequirePosition))) + allowed = false; + if (interfaces.Contains(typeof(IMayRequirePositionPredisplacement))) + allowed = false; + if (interfaces.Contains(typeof(IMayRequireCameraOpaqueTexture))) + allowed = false; + if (interfaces.Contains(typeof(IMayRequireDepthTexture))) + allowed = false; + + // TODO: add a node to sample the normal buffer: + if (interfaces.Contains(typeof(IMayRequireNormal))) + allowed = false; + + // We don't have access to the tangent in fullscreen + if (interfaces.Contains(typeof(IMayRequireTangent))) + allowed = false; + if (interfaces.Contains(typeof(IMayRequireBitangent))) + allowed = false; + + // There is no input in the vertex block for now + if (interfaces.Contains(typeof(IMayRequireVertexColor))) + allowed = false; + if (interfaces.Contains(typeof(IMayRequireVertexID))) + allowed = false; + if (interfaces.Contains(typeof(IMayRequireVertexSkinning))) + allowed = false; + + // TODO: this is a workaround for all classes that inherit from CodeFunctionNode but doens't need forbidden inputs + if (typeof(CodeFunctionNode).IsAssignableFrom(nodeType)) + allowed = true; + + if (fullscreenCompatibility == FullscreenCompatibility.CustomRenderTexture) + { + // We can't sample scene info in custom render textures, they are executed outisde the pipeline (for now) + allowed &= nodeType != typeof(SceneColorNode); + allowed &= nodeType != typeof(SceneDepthNode); + } + + return allowed && base.IsNodeAllowedByTarget(nodeType); } public override void Setup(ref TargetSetupContext context) @@ -340,7 +394,7 @@ public override void CollectShaderProperties(PropertyCollector collector, Genera public void CollectRenderStateShaderProperties(PropertyCollector collector, GenerationMode generationMode) { - if (generationMode == GenerationMode.Preview || allowMaterialOverride) + if (generationMode != GenerationMode.Preview && allowMaterialOverride) { collector.AddEnumProperty(Uniforms.srcColorBlendProperty, srcColorBlendMode); collector.AddEnumProperty(Uniforms.dstColorBlendProperty, dstColorBlendMode); @@ -372,6 +426,16 @@ public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Acti if (m_ActiveSubTarget.value == null) return; + context.AddProperty("Compatibility", new EnumField(fullscreenCompatibility) { value = fullscreenCompatibility }, (evt) => + { + if (Equals(fullscreenCompatibility, evt.newValue)) + return; + + registerUndo("Change Compatibility"); + fullscreenCompatibility = (FullscreenCompatibility)evt.newValue; + onChange(); + }); + context.AddProperty("Allow Material Override", new Toggle() { value = allowMaterialOverride }, (evt) => { if (Equals(allowMaterialOverride, evt.newValue)) @@ -663,8 +727,7 @@ ScriptableObject IHasMetadata.GetMetadataObject() { RenderState.ZWrite(Uniforms.depthWrite) }, { RenderState.Blend(Uniforms.srcColorBlend, Uniforms.dstColorBlend, Uniforms.srcAlphaBlend, Uniforms.dstAlphaBlend) }, { RenderState.BlendOp(Uniforms.colorBlendOperation, Uniforms.alphaBlendOperation) }, - // TODO: Add stencil read mask! - { RenderState.Stencil(new StencilDescriptor{ Ref = Uniforms.stencilReference, WriteMask = Uniforms.stencilWriteMask, Comp = Uniforms.stencilComparison, ZFail = Uniforms.stencilDepthFail, Fail = Uniforms.stencilFail, Pass = Uniforms.stencilPass}) } + { RenderState.Stencil(new StencilDescriptor{ Ref = Uniforms.stencilReference, ReadMask = Uniforms.stencilReadMask, WriteMask = Uniforms.stencilWriteMask, Comp = Uniforms.stencilComparison, ZFail = Uniforms.stencilDepthFail, Fail = Uniforms.stencilFail, Pass = Uniforms.stencilPass}) } }; public RenderStateCollection GetRenderState() @@ -695,6 +758,7 @@ public RenderStateCollection GetRenderState() result.Add(RenderState.Stencil(new StencilDescriptor { Ref = stencilReference.ToString(), + ReadMask = stencilReadMask.ToString(), WriteMask = stencilWriteMask.ToString(), Comp = stencilCompareFunction.ToString(), ZFail = stencilDepthTestFailOperation.ToString(), @@ -709,12 +773,14 @@ public RenderStateCollection GetRenderState() #region Includes static class CoreIncludes { + const string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; const string kColor = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"; const string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; - // TODO: Add shadergraph functions support (replace functions.hlsl by SGFunctions) - const string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"; - const string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; const string kInstancing = "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"; + const string kSpaceTransforms = "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"; + const string kShaderGraphFunctions = "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl"; + const string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"; + const string kShaderVariables = "Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariables.hlsl"; // const string kCore = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Core.hlsl"; // const string kLighting = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Lighting.hlsl"; // const string kGraphFunctions = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/ShaderGraphFunctions.hlsl"; @@ -726,26 +792,19 @@ static class CoreIncludes // TODO: support SH // const string kShims = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/Shims.hlsl"; - public static readonly IncludeCollection CorePregraph = new IncludeCollection + public static readonly IncludeCollection preGraphIncludes = new IncludeCollection { // { kShims, IncludeLocation.Pregraph }, + { kCommon, IncludeLocation.Pregraph }, { kColor, IncludeLocation.Pregraph }, - // { kCore, IncludeLocation.Pregraph }, { kTexture, IncludeLocation.Pregraph }, - { kFunctions, IncludeLocation.Pregraph }, - { kCommon, IncludeLocation.Pregraph }, { kInstancing, IncludeLocation.Pregraph }, // For VR + { kShaderVariables, IncludeLocation.Pregraph }, + // { kCore, IncludeLocation.Pregraph }, + { kSpaceTransforms, IncludeLocation.Pregraph }, + // { kShaderGraphFunctions, IncludeLocation.Pregraph }, + { kFunctions, IncludeLocation.Pregraph }, }; - - public static readonly IncludeCollection ShaderGraphPregraph = new IncludeCollection - { - // { kGraphFunctions, IncludeLocation.Pregraph }, - }; - - // public static readonly IncludeCollection CorePostgraph = new IncludeCollection - // { - // { kVaryings, IncludeLocation.Postgraph }, - // }; } #endregion diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl new file mode 100644 index 00000000000..240e35c4d7b --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl @@ -0,0 +1,17 @@ +PackedVaryings vert(Attributes input) +{ + Varyings output = (Varyings)0; + output = BuildVaryings(input); + PackedVaryings packedOutput = PackVaryings(output); + return packedOutput; +} + +float4 frag(PackedVaryings packedInput) : SV_TARGET +{ + Varyings unpacked = UnpackVaryings(packedInput); + + SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(unpacked); + SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); + + return surfaceDescription.Color; +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl.meta new file mode 100644 index 00000000000..6f01210d18d --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0de8792ff52727f44925b54be00b9f18 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl index 4c3e1b6f327..27fc04c4d36 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl @@ -1,137 +1,13 @@ - -// TODO: I think we can get rid of this Varyings struct -Varyings BuildVaryings(Attributes input) -{ - Varyings output = (Varyings)0; - - // TODO: VR support - UNITY_SETUP_INSTANCE_ID(input); - UNITY_TRANSFER_INSTANCE_ID(input, output); - UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); - -// #if defined(FEATURES_GRAPH_VERTEX) -// // Evaluate Vertex Graph -// VertexDescriptionInputs vertexDescriptionInputs = BuildVertexDescriptionInputs(input); -// VertexDescription vertexDescription = VertexDescriptionFunction(vertexDescriptionInputs); - -// // Assign modified vertex attributes -// input.positionOS = vertexDescription.Position; -// #if defined(VARYINGS_NEED_NORMAL_WS) -// input.normalOS = vertexDescription.Normal; -// #endif //FEATURES_GRAPH_NORMAL -// #if defined(VARYINGS_NEED_TANGENT_WS) -// input.tangentOS.xyz = vertexDescription.Tangent.xyz; -// #endif //FEATURES GRAPH TANGENT -// #endif //FEATURES_GRAPH_VERTEX - - // TODO: Avoid path via VertexPositionInputs (BuiltIn) - // VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz); - - // Returns the camera relative position (if enabled) - // float3 positionWS = TransformObjectToWorld(input.positionOS); - -// #ifdef ATTRIBUTES_NEED_NORMAL -// float3 normalWS = TransformObjectToWorldNormal(input.normalOS); -// #else -// // Required to compile ApplyVertexModification that doesn't use normal. -// float3 normalWS = float3(0.0, 0.0, 0.0); -// #endif - -// #ifdef ATTRIBUTES_NEED_TANGENT -// float4 tangentWS = float4(TransformObjectToWorldDir(input.tangentOS.xyz), input.tangentOS.w); -// #endif - - // TODO: Change to inline ifdef - // Do vertex modification in camera relative space (if enabled) -// #if defined(HAVE_VERTEX_MODIFICATION) -// ApplyVertexModification(input, normalWS, positionWS, _TimeParameters.xyz); -// #endif - -// #ifdef VARYINGS_NEED_POSITION_WS -// output.positionWS = positionWS; -// #endif - -// #ifdef VARYINGS_NEED_NORMAL_WS -// output.normalWS = normalWS; // normalized in TransformObjectToWorldNormal() -// #endif - -// #ifdef VARYINGS_NEED_TANGENT_WS -// output.tangentWS = tangentWS; // normalized in TransformObjectToWorldDir() -// #endif - -// // Handled by the legacy pipeline -// #ifndef BUILTIN_TARGET_API -// #if (SHADERPASS == SHADERPASS_SHADOWCASTER) -// // Define shadow pass specific clip position for BuiltIn -// #if _CASTING_PUNCTUAL_LIGHT_SHADOW -// float3 lightDirectionWS = normalize(_LightPosition - positionWS); -// #else -// float3 lightDirectionWS = _LightDirection; -// #endif -// output.positionCS = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, lightDirectionWS)); -// #if UNITY_REVERSED_Z -// output.positionCS.z = min(output.positionCS.z, UNITY_NEAR_CLIP_VALUE); -// #else -// output.positionCS.z = max(output.positionCS.z, UNITY_NEAR_CLIP_VALUE); -// #endif -// #elif (SHADERPASS == SHADERPASS_META) -// output.positionCS = MetaVertexPosition(float4(input.positionOS, 0), input.uv1, input.uv2, unity_LightmapST, unity_DynamicLightmapST); -// #else - // output.positionCS = TransformWorldToHClip(positionWS); -// #endif -// #else - - // TODO: support Blit as well - output.positionCS = GetFullScreenTriangleVertexPosition(input.vertexID, UNITY_RAW_FAR_CLIP_VALUE); -// #endif - -#if defined(VARYINGS_NEED_TEXCOORD0) || defined(VARYINGS_DS_NEED_TEXCOORD0) - output.texCoord0 = output.positionCS * 0.5 + 0.5; -#endif -// #if defined(VARYINGS_NEED_TEXCOORD1) || defined(VARYINGS_DS_NEED_TEXCOORD1) -// output.texCoord1 = input.uv1; -// #endif -// #if defined(VARYINGS_NEED_TEXCOORD2) || defined(VARYINGS_DS_NEED_TEXCOORD2) -// output.texCoord2 = input.uv2; -// #endif -// #if defined(VARYINGS_NEED_TEXCOORD3) || defined(VARYINGS_DS_NEED_TEXCOORD3) -// output.texCoord3 = input.uv3; -// #endif - -// #if defined(VARYINGS_NEED_COLOR) || defined(VARYINGS_DS_NEED_COLOR) -// output.color = input.color; -// #endif - -// #ifdef VARYINGS_NEED_VIEWDIRECTION_WS -// output.viewDirectionWS = GetWorldSpaceViewDir(positionWS); -// #endif - -#ifdef VARYINGS_NEED_SCREENPOSITION - output.screenPosition = output.texCoord1; -#endif - - return output; -} - PackedVaryings vert(Attributes input) { Varyings output = (Varyings)0; - output = BuildVaryings(input); + output.positionCS = GetBlitVertexPosition(input.positionOS); + BuildVaryings(input, output); PackedVaryings packedOutput = PackVaryings(output); return packedOutput; } -// TODO: Add depth as optional target -float4 frag(PackedVaryings packedInput) : SV_TARGET +FragOutput frag(PackedVaryings packedInput) { - Varyings unpacked = UnpackVaryings(packedInput); - - // TODO: VR - // UNITY_SETUP_INSTANCE_ID(unpacked); - // UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(unpacked); - - SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(unpacked); - SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); - - return surfaceDescription.Color; + return DefaultFullscreenFragmentShader(packedInput); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl new file mode 100644 index 00000000000..a311c9d8763 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -0,0 +1,58 @@ +// Provies missing variables for the FullScreen pass +#ifndef FULLSCREEN_COMMON_INCLUDED +#define FULLSCREEN_COMMON_INCLUDED + +struct FragOutput +{ + float4 color : SV_TARGET; +#ifdef SURFACEDESCRIPTION_DEPTH + float depth : SV_DEPTH; +#endif +}; + +void BuildVaryings(Attributes input, inout Varyings output) +{ + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + +#if defined(VARYINGS_NEED_TEXCOORD0) || defined(VARYINGS_DS_NEED_TEXCOORD0) + output.texCoord0 = output.positionCS * 0.5 + 0.5; +#endif + +#ifdef VARYINGS_NEED_SCREENPOSITION + output.screenPosition = output.texCoord1; +#endif +} + +float4 GetDrawProceduralVertexPosition(uint vertexID) +{ + return GetFullScreenTriangleVertexPosition(vertexID, UNITY_RAW_FAR_CLIP_VALUE); +} + +float4 GetBlitVertexPosition(float3 positionOS) +{ + // TODO + return mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, float4(positionOS, 1.0))); +} + +FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) +{ + FragOutput output = (FragOutput)0; + Varyings unpacked = UnpackVaryings(packedInput); + + UNITY_SETUP_INSTANCE_ID(unpacked); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(unpacked); + + SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(unpacked); + SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); + + output.color = surfaceDescription.Color; +#ifdef SURFACEDESCRIPTION_DEPTH + output.depth = surfaceDescription.Depth; +#endif + + return output; +} + +#endif // FULLSCREEN_COMMON_INCLUDED diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl.meta new file mode 100644 index 00000000000..4ad2cc4d974 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 54f14acd1960c2a459a0fcd6c959938d +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl new file mode 100644 index 00000000000..9c52204af53 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl @@ -0,0 +1,13 @@ +PackedVaryings vert(Attributes input) +{ + Varyings output = (Varyings)0; + output.positionCS = GetDrawProceduralVertexPosition(input.vertexID); + BuildVaryings(input, output); + PackedVaryings packedOutput = PackVaryings(output); + return packedOutput; +} + +FragOutput frag(PackedVaryings packedInput) +{ + return DefaultFullscreenFragmentShader(packedInput); +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl.meta new file mode 100644 index 00000000000..550351971fc --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fa5319f2d61c4df44b77220af2406147 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index f2266c7a668..b74cb1f773d 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -22,28 +22,50 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) $SurfaceDescriptionInputs.WorldSpaceTangent: output.WorldSpaceTangent = renormFactor * input.tangentWS.xyz; $SurfaceDescriptionInputs.WorldSpaceBiTangent: output.WorldSpaceBiTangent = renormFactor * bitang; + // Calculate world space view direction without the position WS: + bool ortho = UNITY_MATRIX_P[3][3] == 0; + float3 viewDirWS; + if (ortho) + { + viewDirWS = -GetWorldToViewMatrix()[2].xyz; + } + else + { + float4 n = mul(UNITY_MATRIX_I_VP, float4(input.positionCS.xy, 0, 1)); + float4 f = n + UNITY_MATRIX_I_VP[2]; + n.xyz /= n.w; + f.xyz /= f.w; + viewDirWS = f.xyz-n.xyz; + } + $SurfaceDescriptionInputs.ObjectSpaceTangent: output.ObjectSpaceTangent = TransformWorldToObjectDir(output.WorldSpaceTangent); $SurfaceDescriptionInputs.ViewSpaceTangent: output.ViewSpaceTangent = TransformWorldToViewDir(output.WorldSpaceTangent); $SurfaceDescriptionInputs.TangentSpaceTangent: output.TangentSpaceTangent = float3(1.0f, 0.0f, 0.0f); $SurfaceDescriptionInputs.ObjectSpaceBiTangent: output.ObjectSpaceBiTangent = TransformWorldToObjectDir(output.WorldSpaceBiTangent); $SurfaceDescriptionInputs.ViewSpaceBiTangent: output.ViewSpaceBiTangent = TransformWorldToViewDir(output.WorldSpaceBiTangent); $SurfaceDescriptionInputs.TangentSpaceBiTangent: output.TangentSpaceBiTangent = float3(0.0f, 1.0f, 0.0f); - $SurfaceDescriptionInputs.WorldSpaceViewDirection: output.WorldSpaceViewDirection = normalize(input.viewDirectionWS); + $SurfaceDescriptionInputs.WorldSpaceViewDirection: output.WorldSpaceViewDirection = normalize(viewDirWS); $SurfaceDescriptionInputs.ObjectSpaceViewDirection: output.ObjectSpaceViewDirection = TransformWorldToObjectDir(output.WorldSpaceViewDirection); $SurfaceDescriptionInputs.ViewSpaceViewDirection: output.ViewSpaceViewDirection = TransformWorldToViewDir(output.WorldSpaceViewDirection); $SurfaceDescriptionInputs.TangentSpaceViewDirection: float3x3 tangentSpaceTransform = float3x3(output.WorldSpaceTangent, output.WorldSpaceBiTangent, output.WorldSpaceNormal); $SurfaceDescriptionInputs.TangentSpaceViewDirection: output.TangentSpaceViewDirection = mul(tangentSpaceTransform, output.WorldSpaceViewDirection); - $SurfaceDescriptionInputs.WorldSpacePosition: output.WorldSpacePosition = input.positionWS; - $SurfaceDescriptionInputs.ObjectSpacePosition: output.ObjectSpacePosition = TransformWorldToObject(input.positionWS); - $SurfaceDescriptionInputs.ViewSpacePosition: output.ViewSpacePosition = TransformWorldToView(input.positionWS); + + // Calculate world space position: + float2 screenSpaceUV = input.texCoord0.xy; + float linearDepth = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH(screenSpaceUV), _ZBufferParams); + float3 positionWS = viewDirWS * linearDepth; + + $SurfaceDescriptionInputs.WorldSpacePosition: output.WorldSpacePosition = positionWS; + $SurfaceDescriptionInputs.ObjectSpacePosition: output.ObjectSpacePosition = TransformWorldToObject(positionWS); + $SurfaceDescriptionInputs.ViewSpacePosition: output.ViewSpacePosition = TransformWorldToView(positionWS); $SurfaceDescriptionInputs.TangentSpacePosition: output.TangentSpacePosition = float3(0.0f, 0.0f, 0.0f); - $SurfaceDescriptionInputs.AbsoluteWorldSpacePosition: output.AbsoluteWorldSpacePosition = GetAbsolutePositionWS(input.positionWS); - $SurfaceDescriptionInputs.WorldSpacePositionPredisplacement: output.WorldSpacePositionPredisplacement = input.positionWS; - $SurfaceDescriptionInputs.ObjectSpacePositionPredisplacement: output.ObjectSpacePositionPredisplacement = TransformWorldToObject(input.positionWS); - $SurfaceDescriptionInputs.ViewSpacePositionPredisplacement: output.ViewSpacePositionPredisplacement = TransformWorldToView(input.positionWS); + $SurfaceDescriptionInputs.AbsoluteWorldSpacePosition: output.AbsoluteWorldSpacePosition = GetAbsolutePositionWS(positionWS); + $SurfaceDescriptionInputs.WorldSpacePositionPredisplacement: output.WorldSpacePositionPredisplacement = positionWS; + $SurfaceDescriptionInputs.ObjectSpacePositionPredisplacement: output.ObjectSpacePositionPredisplacement = TransformWorldToObject(positionWS); + $SurfaceDescriptionInputs.ViewSpacePositionPredisplacement: output.ViewSpacePositionPredisplacement = TransformWorldToView(positionWS); $SurfaceDescriptionInputs.TangentSpacePositionPredisplacement: output.TangentSpacePositionPredisplacement = float3(0.0f, 0.0f, 0.0f); - $SurfaceDescriptionInputs.AbsoluteWorldSpacePositionPredisplacement:output.AbsoluteWorldSpacePositionPredisplacement = GetAbsolutePositionWS(input.positionWS); - $SurfaceDescriptionInputs.ScreenPosition: output.ScreenPosition = ComputeScreenPos(TransformWorldToHClip(input.positionWS), _ProjectionParams.x); + $SurfaceDescriptionInputs.AbsoluteWorldSpacePositionPredisplacement:output.AbsoluteWorldSpacePositionPredisplacement = GetAbsolutePositionWS(positionWS); + $SurfaceDescriptionInputs.ScreenPosition: output.ScreenPosition = float4(input.texCoord0.xy, 0, 1); $SurfaceDescriptionInputs.uv0: output.uv0 = input.texCoord0; $SurfaceDescriptionInputs.uv1: output.uv1 = input.texCoord1; $SurfaceDescriptionInputs.uv2: output.uv2 = input.texCoord2; From 97047c2d4e4dd6fe2fd08df569d1820f88875e6c Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 21 Sep 2021 19:19:22 +0200 Subject: [PATCH 005/108] Fixed ShaderGraph default shader generator outputing 2 CustomEditor lines --- .../Editor/Generation/Processors/Generator.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs b/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs index 7b3ef3a69df..cd8bbbc6b54 100644 --- a/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs +++ b/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs @@ -212,18 +212,16 @@ void BuildShader() GenerateSubShader(i, subShader, subShaderProperties); } - var customEditor = context.defaultShaderGUI; - if (customEditor != null && m_Targets[i].WorksWithSRP(GraphicsSettings.currentRenderPipeline)) - { - m_Builder.AppendLine("CustomEditor \"" + customEditor + "\""); - } - foreach (var rpCustomEditor in context.customEditorForRenderPipelines) { m_Builder.AppendLine($"CustomEditorForRenderPipeline \"{rpCustomEditor.shaderGUI}\" \"{rpCustomEditor.renderPipelineAssetType}\""); } - m_Builder.AppendLine("CustomEditor \"" + typeof(GenericShaderGraphMaterialGUI).FullName + "\""); + var customEditor = context.defaultShaderGUI; + if (customEditor != null && m_Targets[i].WorksWithSRP(GraphicsSettings.currentRenderPipeline)) + m_Builder.AppendLine("CustomEditor \"" + customEditor + "\""); + else + m_Builder.AppendLine("CustomEditor \"" + typeof(GenericShaderGraphMaterialGUI).FullName + "\""); } m_Builder.AppendLine(@"FallBack ""Hidden/Shader Graph/FallbackError"""); From 50f86215d2554da7ef6291bafe7eec5524500523 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 21 Sep 2021 19:40:36 +0200 Subject: [PATCH 006/108] Added Fullscreen SG material GUI --- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 237 ++++++++++++++++++ .../Fullscreen/FullscreenShaderGUI.cs.meta | 11 + .../Targets/Fullscreen/FullscreenSubTarget.cs | 41 ++- .../Targets/Fullscreen/FullscreenTarget.cs | 116 +++++---- .../Fullscreen/Includes/FullscreenCommon.hlsl | 5 +- 5 files changed, 339 insertions(+), 71 deletions(-) create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs.meta diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs new file mode 100644 index 00000000000..3e4777639a3 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -0,0 +1,237 @@ +using System; +using UnityEngine; +using UnityEngine.Rendering; +using RenderQueue = UnityEngine.Rendering.RenderQueue; +using UnityEditor.ShaderGraph.Drawing; + +namespace UnityEditor.Rendering.Fullscreen.ShaderGraph +{ + public class FullscreenShaderGUI : ShaderGUI + { + [Flags] + protected enum Expandable + { + SurfaceOptions = 1 << 0, + SurfaceInputs = 1 << 1, + } + + protected class Styles + { + // Categories + public static readonly GUIContent SurfaceOptions = + EditorGUIUtility.TrTextContent("Surface Options", "Controls the rendering states of the fullscreen material."); + public static readonly GUIContent SurfaceInputs = EditorGUIUtility.TrTextContent("Surface Inputs", + "These settings describe the look and feel of the surface itself."); + + public static readonly GUIContent blendingMode = EditorGUIUtility.TrTextContent("Blending Mode", + "Controls how the color of the Transparent surface blends with the Material color in the background."); + public static readonly GUIContent srcColorBlendMode = EditorGUIUtility.TrTextContent("Src Color", + "TODO"); + public static readonly GUIContent dstColorBlendMode = EditorGUIUtility.TrTextContent("Dst Color", + "TODO"); + public static readonly GUIContent colorBlendOperation = EditorGUIUtility.TrTextContent("Color Blend Op", + "TODO"); + public static readonly GUIContent srcAlphaBlendMode = EditorGUIUtility.TrTextContent("Src Alpha", + "TODO"); + public static readonly GUIContent dstAlphaBlendMode = EditorGUIUtility.TrTextContent("Dst Alpha", + "TODO"); + public static readonly GUIContent alphaBlendOperation = EditorGUIUtility.TrTextContent("Alpha Blend Op", + "TODO"); + public static readonly GUIContent depthWrite = EditorGUIUtility.TrTextContent("Depth Write", + "Controls whether the shader writes depth."); + public static readonly GUIContent depthTest = EditorGUIUtility.TrTextContent("Depth Test", + "Specifies the depth test mode. The default is Always."); + + public static readonly GUIContent stencil = EditorGUIUtility.TrTextContent("Stencil Override", "TODO"); + public static readonly GUIContent stencilRef = EditorGUIUtility.TrTextContent("Reference", "TODO"); + public static readonly GUIContent stencilReadMask = EditorGUIUtility.TrTextContent("Read Mask", "TODO"); + public static readonly GUIContent stencilWriteMask = EditorGUIUtility.TrTextContent("Write Mask", "TODO"); + public static readonly GUIContent stencilComparison = EditorGUIUtility.TrTextContent("Comparison", "TODO"); + public static readonly GUIContent stencilPass = EditorGUIUtility.TrTextContent("Pass", "TODO"); + public static readonly GUIContent stencilFail = EditorGUIUtility.TrTextContent("Fail", "TODO"); + public static readonly GUIContent stencilDepthFail = EditorGUIUtility.TrTextContent("Depth Fail", "TODO"); + + } + + public bool m_FirstTimeApply = true; + + // By default, everything is expanded + readonly MaterialHeaderScopeList m_MaterialScopeList = new MaterialHeaderScopeList(uint.MaxValue); + + // These have to be stored due to how MaterialHeaderScopeList callbacks work (they don't provide this data in the callbacks) + MaterialEditor m_MaterialEditor; + MaterialProperty[] m_Properties; + + private const int queueOffsetRange = 50; + + override public void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) + { + m_MaterialEditor = materialEditor; + m_Properties = properties; + + Material targetMat = materialEditor.target as Material; + + if (m_FirstTimeApply) + { + OnOpenGUI(targetMat, materialEditor, properties); + m_FirstTimeApply = false; + } + + ShaderPropertiesGUI(materialEditor, targetMat, properties); + } + + public virtual void OnOpenGUI(Material material, MaterialEditor materialEditor, MaterialProperty[] properties) + { + // Generate the foldouts + m_MaterialScopeList.RegisterHeaderScope(Styles.SurfaceOptions, (uint)Expandable.SurfaceOptions, DrawSurfaceOptions); + m_MaterialScopeList.RegisterHeaderScope(Styles.SurfaceInputs, (uint)Expandable.SurfaceInputs, DrawSurfaceInputs); + } + + public override void AssignNewShaderToMaterial(Material material, Shader oldShader, Shader newShader) + { + // Clear all keywords for fresh start + // Note: this will nuke user-selected custom keywords when they change shaders + material.shaderKeywords = null; + + base.AssignNewShaderToMaterial(material, oldShader, newShader); + + // Setup keywords based on the new shader + UnityEditor.Rendering.BuiltIn.ShaderUtils.ResetMaterialKeywords(material); + } + + void ShaderPropertiesGUI(MaterialEditor materialEditor, Material material, MaterialProperty[] properties) + { + m_MaterialScopeList.DrawHeaders(materialEditor, material); + } + + protected virtual void DrawSurfaceOptions(Material material) + { + var materialEditor = m_MaterialEditor; + var properties = m_Properties; + + var blendMode = FindProperty(FullscreenTarget.Uniforms.blendModeProperty, properties, false); + var srcColorBlend = FindProperty(FullscreenTarget.Uniforms.srcColorBlendProperty, properties, false); + var dstColorBlend = FindProperty(FullscreenTarget.Uniforms.dstColorBlendProperty, properties, false); + var srcAlphaBlend = FindProperty(FullscreenTarget.Uniforms.srcAlphaBlendProperty, properties, false); + var dstAlphaBlend = FindProperty(FullscreenTarget.Uniforms.dstAlphaBlendProperty, properties, false); + var colorBlendOp = FindProperty(FullscreenTarget.Uniforms.colorBlendOperationProperty, properties, false); + var alphaBlendOp = FindProperty(FullscreenTarget.Uniforms.alphaBlendOperationProperty, properties, false); + var depthWrite = FindProperty(FullscreenTarget.Uniforms.depthWriteProperty, properties, false); + var depthTest = FindProperty(FullscreenTarget.Uniforms.depthTestProperty, properties, false); + var stencilEnable = FindProperty(FullscreenTarget.Uniforms.stencilEnableProperty, properties, false); + var stencilRef = FindProperty(FullscreenTarget.Uniforms.stencilReferenceProperty, properties, false); + var stencilReadMask = FindProperty(FullscreenTarget.Uniforms.stencilReadMaskProperty, properties, false); + var stencilWriteMask = FindProperty(FullscreenTarget.Uniforms.stencilWriteMaskProperty, properties, false); + var stencilComp = FindProperty(FullscreenTarget.Uniforms.stencilComparisonProperty, properties, false); + var stencilPass = FindProperty(FullscreenTarget.Uniforms.stencilPassProperty, properties, false); + var stencilFail = FindProperty(FullscreenTarget.Uniforms.stencilFailProperty, properties, false); + var stencilDepthFail = FindProperty(FullscreenTarget.Uniforms.stencilDepthFailProperty, properties, false); + + if (material.HasProperty(FullscreenTarget.Uniforms.blendModeProperty)) + { + EditorGUI.BeginChangeCheck(); + m_MaterialEditor.ShaderProperty(blendMode, Styles.blendingMode); + FullscreenBlendMode blendModeValue = (FullscreenBlendMode)blendMode.floatValue; + if (EditorGUI.EndChangeCheck()) + SetBlendMode(blendModeValue); + + if (blendModeValue == FullscreenBlendMode.Custom) ; + { + m_MaterialEditor.ShaderProperty(srcColorBlend, Styles.srcColorBlendMode, 1); + m_MaterialEditor.ShaderProperty(dstColorBlend, Styles.dstColorBlendMode, 1); + m_MaterialEditor.ShaderProperty(colorBlendOp, Styles.colorBlendOperation, 1); + m_MaterialEditor.ShaderProperty(srcAlphaBlend, Styles.srcAlphaBlendMode, 1); + m_MaterialEditor.ShaderProperty(dstAlphaBlend, Styles.dstAlphaBlendMode, 1); + m_MaterialEditor.ShaderProperty(alphaBlendOp, Styles.alphaBlendOperation, 1); + } + } + + if (material.HasProperty(FullscreenTarget.Uniforms.depthWriteProperty)) + m_MaterialEditor.ShaderProperty(depthWrite, Styles.depthWrite); + if (material.HasProperty(FullscreenTarget.Uniforms.depthTestProperty)) + m_MaterialEditor.ShaderProperty(depthTest, Styles.depthTest); + + if (material.HasProperty(FullscreenTarget.Uniforms.stencilEnableProperty)) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.BeginChangeCheck(); + m_MaterialEditor.ShaderProperty(stencilEnable, Styles.stencil); + bool stencilEnableValue = stencilEnable.floatValue < 0.5f; + if (EditorGUI.EndChangeCheck()) + SetStencilEnable(stencilEnableValue); + if (stencilEnableValue) ; + { + m_MaterialEditor.ShaderProperty(stencilRef, Styles.stencilRef, 1); + m_MaterialEditor.ShaderProperty(stencilReadMask, Styles.stencilReadMask, 1); + m_MaterialEditor.ShaderProperty(stencilWriteMask, Styles.stencilWriteMask, 1); + m_MaterialEditor.ShaderProperty(stencilComp, Styles.stencilComparison, 1); + m_MaterialEditor.ShaderProperty(stencilPass, Styles.stencilPass, 1); + m_MaterialEditor.ShaderProperty(stencilFail, Styles.stencilFail, 1); + m_MaterialEditor.ShaderProperty(stencilDepthFail, Styles.stencilDepthFail, 1); + } + } + + void SetStencilEnable(bool enabled) + { + stencilComp.floatValue = (float)CompareFunction.Always; + stencilPass.floatValue = (float)StencilOp.Keep; + } + + void SetBlendMode(FullscreenBlendMode blendMode) + { + // Note that we can't disable the blend mode from here + if (blendMode == FullscreenBlendMode.Alpha || blendMode == FullscreenBlendMode.Disabled) + { + srcColorBlend.floatValue = (float)BlendMode.SrcAlpha; + dstColorBlend.floatValue = (float)BlendMode.OneMinusSrcAlpha; + srcAlphaBlend.floatValue = (float)BlendMode.One; + dstAlphaBlend.floatValue = (float)BlendMode.OneMinusSrcAlpha; + } + else if (blendMode == FullscreenBlendMode.Premultiply) + { + srcColorBlend.floatValue = (float)BlendMode.One; + dstColorBlend.floatValue = (float)BlendMode.OneMinusSrcAlpha; + srcAlphaBlend.floatValue = (float)BlendMode.One; + dstAlphaBlend.floatValue = (float)BlendMode.OneMinusSrcAlpha; + } + else if (blendMode == FullscreenBlendMode.Additive) + { + srcColorBlend.floatValue = (float)BlendMode.SrcAlpha; + dstColorBlend.floatValue = (float)BlendMode.One; + srcAlphaBlend.floatValue = (float)BlendMode.One; + dstAlphaBlend.floatValue = (float)BlendMode.One; + } + else if (blendMode == FullscreenBlendMode.Multiply) + { + srcColorBlend.floatValue = (float)BlendMode.DstColor; + dstColorBlend.floatValue = (float)BlendMode.Zero; + srcAlphaBlend.floatValue = (float)BlendMode.One; + dstAlphaBlend.floatValue = (float)BlendMode.OneMinusSrcAlpha; + } + + colorBlendOp.floatValue = (float)BlendOp.Add; + alphaBlendOp.floatValue = (float)BlendOp.Add; + } + } + + protected virtual void DrawSurfaceInputs(Material material) + { + DrawShaderGraphProperties(m_MaterialEditor, material, m_Properties); + } + + static void DrawShaderGraphProperties(MaterialEditor materialEditor, Material material, MaterialProperty[] properties) + { + if (properties == null) + return; + + ShaderGraphPropertyDrawers.DrawShaderGraphGUI(materialEditor, properties); + } + + public override void ValidateMaterial(Material material) => SetupSurface(material); + + public static void SetupSurface(Material material) + { + // For now there is no keyword in FullScreenShader. + } + } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs.meta new file mode 100644 index 00000000000..31e63d4a781 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c8397526cd944664f841668eeee04055 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 15488958246..eb3bc49018c 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -15,8 +15,8 @@ public override void Setup(ref TargetSetupContext context) context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); // TODO: custom editor field - // if (!context.customEditorForRenderPipelines) - //context.defaultShaderGUI = typeof(BuiltInUnlitGUI).FullName; + if (context.customEditorForRenderPipelines.Count == 0) + context.SetDefaultShaderGUI(typeof(FullscreenShaderGUI).FullName); // Process SubShaders context.AddSubShader(SubShaders.FullscreenBlit(target)); @@ -42,7 +42,7 @@ public FullscreenSubTarget() public override void ProcessPreviewMaterial(Material material) { - if (target.allowMaterialOverride) + // if (target.allowMaterialOverride) { // copy our target's default settings into the material // (technically not necessary since we are always recreating the material from the shader each time, @@ -51,7 +51,7 @@ public override void ProcessPreviewMaterial(Material material) // TODO: // material.SetFloat(Property.Blend(), (float)target.alphaMode); // material.SetFloat(Property.ZWriteControl(), target.zWrite ? 1 : 0); // TODO - material.SetFloat(Property.ZTest(), (float)target.depthTestMode); + // material.SetFloat(Property.ZTest(), (float)target.depthTestMode); } // We always need these properties regardless of whether the material is allowed to override @@ -95,6 +95,15 @@ static class SubShaders const string kCustomRenderTextureInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl"; const string kFullscreenCommon = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl"; + static readonly KeywordDescriptor depthWriteKeywork = new KeywordDescriptor + { + displayName = "Depth Write", + referenceName = "DEPTH_WRITE", + type = KeywordType.Boolean, + definition = KeywordDefinition.ShaderFeature, + stages = KeywordShaderStage.Fragment, + }; + public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) { var result = new SubShaderDescriptor() @@ -121,8 +130,8 @@ public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) }, validPixelBlocks = new BlockFieldDescriptor[] { - FullscreenTarget.Blocks.Color, - FullscreenTarget.Blocks.Depth, + FullscreenTarget.Blocks.color, + FullscreenTarget.Blocks.depth, }, // Fields @@ -149,7 +158,10 @@ public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) { Pragma.Vertex("vert") }, { Pragma.Fragment("frag") }, }, - defines = new DefineCollection(), + defines = new DefineCollection + { + {depthWriteKeywork, 1, new FieldCondition(FullscreenTarget.Fields.depth, true)} + }, keywords = new KeywordCollection(), includes = new IncludeCollection { @@ -182,19 +194,4 @@ public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) } #endregion } - - // internal static class SubShaderUtils - // { - // // Overloads to do inline PassDescriptor modifications - // // NOTE: param order should match PassDescriptor field order for consistency - // #region PassVariant - // internal static PassDescriptor PassVariant(in PassDescriptor source, PragmaCollection pragmas) - // { - // var result = source; - // result.pragmas = pragmas; - // return result; - // } - - // #endregion - // } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs index 76b8e5bd0dc..2b03303ee24 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs @@ -15,17 +15,26 @@ namespace UnityEditor.Rendering.Fullscreen.ShaderGraph { + public enum FullscreenBlendMode + { + Disabled, + Alpha, + Premultiply, + Additive, + Multiply, + Custom, + } + sealed class FullscreenTarget : Target, IHasMetadata, IMaySupportVFX { [GenerateBlocks] public struct Blocks { // TODO: add optional depth write block - public static BlockFieldDescriptor Color = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Color", "Color", + public static BlockFieldDescriptor color = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Color", "Color", "SURFACEDESCRIPTION_COLOR", new ColorRGBAControl(UnityEngine.Color.grey), ShaderStage.Fragment); - public static BlockFieldDescriptor Depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Depth", "Depth", + public static BlockFieldDescriptor depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Depth", "Depth", "SURFACEDESCRIPTION_DEPTH", new FloatControl(0), ShaderStage.Fragment); - } public enum FullscreenCompatibility @@ -35,18 +44,15 @@ public enum FullscreenCompatibility CustomRenderTexture, } - public enum FullscreenBlendMode + [GenerationAPI] + public struct Fields { - Disabled, - Alpha, - Premultiply, - Additive, - Multiply, - Custom, + public static FieldDescriptor depth = new FieldDescriptor("OUTPUT", "depth", "OUTPUT_DEPTH"); } public static class Uniforms { + public static readonly string blendModeProperty = "_Fullscreen_BlendMode"; public static readonly string srcColorBlendProperty = "_Fullscreen_SrcColorBlend"; public static readonly string dstColorBlendProperty = "_Fullscreen_DstColorBlend"; public static readonly string srcAlphaBlendProperty = "_Fullscreen_SrcAlphaBlend"; @@ -55,6 +61,7 @@ public static class Uniforms public static readonly string alphaBlendOperationProperty = "_Fullscreen_AlphaBlendOperation"; public static readonly string depthWriteProperty = "_Fullscreen_DepthWrite"; public static readonly string depthTestProperty = "_Fullscreen_DepthTest"; + public static readonly string stencilEnableProperty = "_Fullscreen_Stencil"; public static readonly string stencilReferenceProperty = "_Fullscreen_StencilReference"; public static readonly string stencilReadMaskProperty = "_Fullscreen_StencilReadMask"; public static readonly string stencilWriteMaskProperty = "_Fullscreen_StencilWriteMask"; @@ -110,16 +117,16 @@ public static class Uniforms FullscreenBlendMode m_BlendMode = FullscreenBlendMode.Disabled; [SerializeField] - Blend m_SrcColorBlendMode = Blend.Zero; + BlendMode m_SrcColorBlendMode = BlendMode.Zero; [SerializeField] - Blend m_DstColorBlendMode = Blend.One; + BlendMode m_DstColorBlendMode = BlendMode.One; [SerializeField] BlendOp m_ColorBlendOperation = BlendOp.Add; [SerializeField] - Blend m_SrcAlphaBlendMode = Blend.Zero; + BlendMode m_SrcAlphaBlendMode = BlendMode.Zero; [SerializeField] - Blend m_DstAlphaBlendMode = Blend.One; + BlendMode m_DstAlphaBlendMode = BlendMode.One; [SerializeField] BlendOp m_AlphaBlendOperation = BlendOp.Add; @@ -172,13 +179,13 @@ public FullscreenBlendMode blendMode set => m_BlendMode = value; } - public Blend srcColorBlendMode + public BlendMode srcColorBlendMode { get => m_SrcColorBlendMode; set => m_SrcColorBlendMode = value; } - public Blend dstColorBlendMode + public BlendMode dstColorBlendMode { get => m_DstColorBlendMode; set => m_DstColorBlendMode = value; @@ -190,13 +197,13 @@ public BlendOp colorBlendOperation set => m_ColorBlendOperation = value; } - public Blend srcAlphaBlendMode + public BlendMode srcAlphaBlendMode { get => m_SrcAlphaBlendMode; set => m_SrcAlphaBlendMode = value; } - public Blend dstAlphaBlendMode + public BlendMode dstAlphaBlendMode { get => m_DstAlphaBlendMode; set => m_DstAlphaBlendMode = value; @@ -293,7 +300,7 @@ public override bool IsNodeAllowedByTarget(Type nodeType) bool allowed = true; SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); - // Nodes with SRP specific code donesn't work in the fullscreen target. + // Nodes with SRP specific code doesn't work in the fullscreen target. allowed &= srpFilter == null; var interfaces = nodeType.GetInterfaces(); @@ -325,13 +332,13 @@ public override bool IsNodeAllowedByTarget(Type nodeType) if (interfaces.Contains(typeof(IMayRequireVertexSkinning))) allowed = false; - // TODO: this is a workaround for all classes that inherit from CodeFunctionNode but doens't need forbidden inputs + // TODO: this is a workaround for all classes that inherit from CodeFunctionNode but doesn't need forbidden inputs if (typeof(CodeFunctionNode).IsAssignableFrom(nodeType)) allowed = true; if (fullscreenCompatibility == FullscreenCompatibility.CustomRenderTexture) { - // We can't sample scene info in custom render textures, they are executed outisde the pipeline (for now) + // We can't sample scene info in custom render textures, they are executed outside the pipeline (for now) allowed &= nodeType != typeof(SceneColorNode); allowed &= nodeType != typeof(SceneDepthNode); } @@ -367,9 +374,9 @@ public override void OnAfterMultiDeserialize(string json) public override void GetFields(ref TargetFieldContext context) { var descs = context.blocks.Select(x => x.descriptor); - // Core fields - // context.AddField(Fields.GraphVertex); // We don't support custom vertex functions for now - context.AddField(Fields.GraphPixel); + + context.AddField(UnityEditor.ShaderGraph.Fields.GraphPixel); + context.AddField(Fields.depth, depthWrite); // SubTarget fields m_ActiveSubTarget.value.GetFields(ref context); @@ -378,8 +385,8 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { // Core blocks - context.AddBlock(Blocks.Color); - context.AddBlock(Blocks.Depth, depthWrite); + context.AddBlock(Blocks.color); + context.AddBlock(Blocks.depth, depthWrite); // SubTarget blocks m_ActiveSubTarget.value.GetActiveBlocks(ref context); @@ -393,9 +400,9 @@ public override void CollectShaderProperties(PropertyCollector collector, Genera public void CollectRenderStateShaderProperties(PropertyCollector collector, GenerationMode generationMode) { - if (generationMode != GenerationMode.Preview && allowMaterialOverride) { + collector.AddEnumProperty(Uniforms.blendModeProperty, blendMode); collector.AddEnumProperty(Uniforms.srcColorBlendProperty, srcColorBlendMode); collector.AddEnumProperty(Uniforms.dstColorBlendProperty, dstColorBlendMode); collector.AddEnumProperty(Uniforms.srcAlphaBlendProperty, srcAlphaBlendMode); @@ -404,6 +411,7 @@ public void CollectRenderStateShaderProperties(PropertyCollector collector, Gene collector.AddEnumProperty(Uniforms.alphaBlendOperationProperty, alphaBlendOperation); collector.AddFloatProperty(Uniforms.depthWriteProperty, depthWrite ? 1 : 0); collector.AddFloatProperty(Uniforms.depthTestProperty, (float)depthTestMode); + collector.AddBoolProperty(Uniforms.stencilEnableProperty, enableStencil); collector.AddIntProperty(Uniforms.stencilReferenceProperty, stencilReference); collector.AddIntProperty(Uniforms.stencilReadMaskProperty, stencilReadMask); collector.AddIntProperty(Uniforms.stencilWriteMaskProperty, stencilWriteMask); @@ -489,7 +497,7 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac return; registerUndo("Change Blend Mode"); - srcColorBlendMode = (Blend)evt.newValue; + srcColorBlendMode = (BlendMode)evt.newValue; onChange(); }); context.AddProperty("Dst Color", new EnumField(dstColorBlendMode) { value = dstColorBlendMode }, (evt) => @@ -498,7 +506,7 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac return; registerUndo("Change Blend Mode"); - dstColorBlendMode = (Blend)evt.newValue; + dstColorBlendMode = (BlendMode)evt.newValue; onChange(); }); context.AddProperty("Color Operation", new EnumField(colorBlendOperation) { value = colorBlendOperation }, (evt) => @@ -520,7 +528,7 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac return; registerUndo("Change Blend Mode"); - srcAlphaBlendMode = (Blend)evt.newValue; + srcAlphaBlendMode = (BlendMode)evt.newValue; onChange(); }); context.AddProperty("Dst", new EnumField(dstAlphaBlendMode) { value = dstAlphaBlendMode }, (evt) => @@ -529,7 +537,7 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac return; registerUndo("Change Blend Mode"); - dstAlphaBlendMode = (Blend)evt.newValue; + dstAlphaBlendMode = (BlendMode)evt.newValue; onChange(); }); context.AddProperty("Blend Operation Alpha", new EnumField(alphaBlendOperation) { value = alphaBlendOperation }, (evt) => @@ -751,7 +759,7 @@ public RenderStateCollection GetRenderState() result.Add(RenderState.Blend(Blend.DstColor, Blend.Zero)); else { - result.Add(RenderState.Blend(srcColorBlendMode, dstColorBlendMode, srcAlphaBlendMode, dstAlphaBlendMode)); + result.Add(RenderState.Blend(BlendModeToBlend(srcColorBlendMode), BlendModeToBlend(dstColorBlendMode), BlendModeToBlend(srcAlphaBlendMode), BlendModeToBlend(dstAlphaBlendMode))); result.Add(RenderState.BlendOp(colorBlendOperation, alphaBlendOperation)); } @@ -768,6 +776,23 @@ public RenderStateCollection GetRenderState() return result; } } + + Blend BlendModeToBlend(BlendMode mode) => mode switch + { + BlendMode.Zero => Blend.Zero, + BlendMode.One => Blend.One, + BlendMode.DstColor => Blend.DstColor, + BlendMode.SrcColor => Blend.SrcColor, + BlendMode.OneMinusDstColor => Blend.OneMinusDstColor, + BlendMode.SrcAlpha => Blend.SrcAlpha, + BlendMode.OneMinusSrcColor => Blend.OneMinusSrcColor, + BlendMode.DstAlpha => Blend.DstAlpha, + BlendMode.OneMinusDstAlpha => Blend.OneMinusDstAlpha, + BlendMode.SrcAlphaSaturate => Blend.SrcAlpha, + BlendMode.OneMinusSrcAlpha => Blend.OneMinusSrcAlpha, + _ => Blend.Zero + }; + } #region Includes @@ -781,28 +806,15 @@ static class CoreIncludes const string kShaderGraphFunctions = "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl"; const string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"; const string kShaderVariables = "Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariables.hlsl"; - // const string kCore = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Core.hlsl"; - // const string kLighting = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Lighting.hlsl"; - // const string kGraphFunctions = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/ShaderGraphFunctions.hlsl"; - // const string kVaryings = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/Varyings.hlsl"; - // const string kShaderPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShaderPass.hlsl"; - // const string kDepthOnlyPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/DepthOnlyPass.hlsl"; - // const string kShadowCasterPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShadowCasterPass.hlsl"; - - // TODO: support SH - // const string kShims = "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/Shims.hlsl"; public static readonly IncludeCollection preGraphIncludes = new IncludeCollection { - // { kShims, IncludeLocation.Pregraph }, { kCommon, IncludeLocation.Pregraph }, { kColor, IncludeLocation.Pregraph }, { kTexture, IncludeLocation.Pregraph }, { kInstancing, IncludeLocation.Pregraph }, // For VR { kShaderVariables, IncludeLocation.Pregraph }, - // { kCore, IncludeLocation.Pregraph }, { kSpaceTransforms, IncludeLocation.Pregraph }, - // { kShaderGraphFunctions, IncludeLocation.Pregraph }, { kFunctions, IncludeLocation.Pregraph }, }; } @@ -815,7 +827,7 @@ public static void AddEnumProperty(this PropertyCollector collector, string p collector.AddShaderProperty(new Vector1ShaderProperty { floatType = FloatType.Enum, - enumType = EnumType.Enum, + enumType = EnumType.CSharpEnum, cSharpEnumType = typeof(T), hidden = true, overrideHLSLDeclaration = true, @@ -837,6 +849,18 @@ public static void AddIntProperty(this PropertyCollector collector, string prop, overrideReferenceName = prop, }); } + + public static void AddBoolProperty(this PropertyCollector collector, string prop, bool value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) + { + collector.AddShaderProperty(new BooleanShaderProperty + { + hidden = true, + overrideHLSLDeclaration = true, + hlslDeclarationOverride = hlslDeclaration, + value = value, + overrideReferenceName = prop, + }); + } } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index a311c9d8763..509fffaf7ba 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -5,7 +5,7 @@ struct FragOutput { float4 color : SV_TARGET; -#ifdef SURFACEDESCRIPTION_DEPTH +#ifdef DEPTH_WRITE float depth : SV_DEPTH; #endif }; @@ -32,7 +32,6 @@ float4 GetDrawProceduralVertexPosition(uint vertexID) float4 GetBlitVertexPosition(float3 positionOS) { - // TODO return mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, float4(positionOS, 1.0))); } @@ -48,7 +47,7 @@ FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); output.color = surfaceDescription.Color; -#ifdef SURFACEDESCRIPTION_DEPTH +#ifdef DEPTH_WRITE output.depth = surfaceDescription.Depth; #endif From e7ffca39230b18304b4c37d9041a02b9233543dc Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 22 Sep 2021 12:40:04 +0200 Subject: [PATCH 007/108] Add ability to disable stencil and blend in shadergraph (for material) --- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 13 ++-- .../Targets/Fullscreen/FullscreenTarget.cs | 76 ++++++++++++------- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs index 3e4777639a3..75f49b960f0 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -135,7 +135,7 @@ protected virtual void DrawSurfaceOptions(Material material) if (EditorGUI.EndChangeCheck()) SetBlendMode(blendModeValue); - if (blendModeValue == FullscreenBlendMode.Custom) ; + if (blendModeValue == FullscreenBlendMode.Custom) { m_MaterialEditor.ShaderProperty(srcColorBlend, Styles.srcColorBlendMode, 1); m_MaterialEditor.ShaderProperty(dstColorBlend, Styles.dstColorBlendMode, 1); @@ -156,10 +156,10 @@ protected virtual void DrawSurfaceOptions(Material material) EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck(); m_MaterialEditor.ShaderProperty(stencilEnable, Styles.stencil); - bool stencilEnableValue = stencilEnable.floatValue < 0.5f; + bool stencilEnableValue = stencilEnable.floatValue > 0.5f; if (EditorGUI.EndChangeCheck()) SetStencilEnable(stencilEnableValue); - if (stencilEnableValue) ; + if (stencilEnableValue) { m_MaterialEditor.ShaderProperty(stencilRef, Styles.stencilRef, 1); m_MaterialEditor.ShaderProperty(stencilReadMask, Styles.stencilReadMask, 1); @@ -173,8 +173,11 @@ protected virtual void DrawSurfaceOptions(Material material) void SetStencilEnable(bool enabled) { - stencilComp.floatValue = (float)CompareFunction.Always; - stencilPass.floatValue = (float)StencilOp.Keep; + if (!enabled) + { + stencilComp.floatValue = (float)CompareFunction.Always; + stencilPass.floatValue = (float)StencilOp.Keep; + } } void SetBlendMode(FullscreenBlendMode blendMode) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs index 2b03303ee24..985a92421da 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs @@ -402,23 +402,32 @@ public void CollectRenderStateShaderProperties(PropertyCollector collector, Gene { if (generationMode != GenerationMode.Preview && allowMaterialOverride) { - collector.AddEnumProperty(Uniforms.blendModeProperty, blendMode); - collector.AddEnumProperty(Uniforms.srcColorBlendProperty, srcColorBlendMode); - collector.AddEnumProperty(Uniforms.dstColorBlendProperty, dstColorBlendMode); - collector.AddEnumProperty(Uniforms.srcAlphaBlendProperty, srcAlphaBlendMode); - collector.AddEnumProperty(Uniforms.dstAlphaBlendProperty, dstAlphaBlendMode); - collector.AddEnumProperty(Uniforms.colorBlendOperationProperty, colorBlendOperation); - collector.AddEnumProperty(Uniforms.alphaBlendOperationProperty, alphaBlendOperation); + // When blend mode is disabled, we can't override + if (blendMode != FullscreenBlendMode.Disabled) + { + collector.AddEnumProperty(Uniforms.blendModeProperty, blendMode); + collector.AddEnumProperty(Uniforms.srcColorBlendProperty, srcColorBlendMode); + collector.AddEnumProperty(Uniforms.dstColorBlendProperty, dstColorBlendMode); + collector.AddEnumProperty(Uniforms.srcAlphaBlendProperty, srcAlphaBlendMode); + collector.AddEnumProperty(Uniforms.dstAlphaBlendProperty, dstAlphaBlendMode); + collector.AddEnumProperty(Uniforms.colorBlendOperationProperty, colorBlendOperation); + collector.AddEnumProperty(Uniforms.alphaBlendOperationProperty, alphaBlendOperation); + } collector.AddFloatProperty(Uniforms.depthWriteProperty, depthWrite ? 1 : 0); collector.AddFloatProperty(Uniforms.depthTestProperty, (float)depthTestMode); - collector.AddBoolProperty(Uniforms.stencilEnableProperty, enableStencil); - collector.AddIntProperty(Uniforms.stencilReferenceProperty, stencilReference); - collector.AddIntProperty(Uniforms.stencilReadMaskProperty, stencilReadMask); - collector.AddIntProperty(Uniforms.stencilWriteMaskProperty, stencilWriteMask); - collector.AddEnumProperty(Uniforms.stencilComparisonProperty, stencilCompareFunction); - collector.AddEnumProperty(Uniforms.stencilPassProperty, stencilPassOperation); - collector.AddEnumProperty(Uniforms.stencilFailProperty, stencilFailOperation); - collector.AddEnumProperty(Uniforms.stencilDepthFailProperty, stencilDepthTestFailOperation); + + // When stencil is disabled, we can't override + if (enableStencil) + { + collector.AddBoolProperty(Uniforms.stencilEnableProperty, enableStencil); + collector.AddIntProperty(Uniforms.stencilReferenceProperty, stencilReference); + collector.AddIntProperty(Uniforms.stencilReadMaskProperty, stencilReadMask); + collector.AddIntProperty(Uniforms.stencilWriteMaskProperty, stencilWriteMask); + collector.AddEnumProperty(Uniforms.stencilComparisonProperty, stencilCompareFunction); + collector.AddEnumProperty(Uniforms.stencilPassProperty, stencilPassOperation); + collector.AddEnumProperty(Uniforms.stencilFailProperty, stencilFailOperation); + collector.AddEnumProperty(Uniforms.stencilDepthFailProperty, stencilDepthTestFailOperation); + } } } @@ -729,22 +738,34 @@ ScriptableObject IHasMetadata.GetMetadataObject() } }; - public static readonly RenderStateCollection MaterialControlledDefault = new RenderStateCollection - { - { RenderState.ZTest(Uniforms.depthTest) }, - { RenderState.ZWrite(Uniforms.depthWrite) }, - { RenderState.Blend(Uniforms.srcColorBlend, Uniforms.dstColorBlend, Uniforms.srcAlphaBlend, Uniforms.dstAlphaBlend) }, - { RenderState.BlendOp(Uniforms.colorBlendOperation, Uniforms.alphaBlendOperation) }, - { RenderState.Stencil(new StencilDescriptor{ Ref = Uniforms.stencilReference, ReadMask = Uniforms.stencilReadMask, WriteMask = Uniforms.stencilWriteMask, Comp = Uniforms.stencilComparison, ZFail = Uniforms.stencilDepthFail, Fail = Uniforms.stencilFail, Pass = Uniforms.stencilPass}) } - }; public RenderStateCollection GetRenderState() { + var result = new RenderStateCollection(); + if (allowMaterialOverride) - return MaterialControlledDefault; + { + result.Add(RenderState.ZTest(Uniforms.depthTest)); + result.Add(RenderState.ZWrite(Uniforms.depthWrite)); + if (blendMode != FullscreenBlendMode.Disabled) + { + result.Add(RenderState.Blend(Uniforms.srcColorBlend, Uniforms.dstColorBlend, Uniforms.srcAlphaBlend, Uniforms.dstAlphaBlend)); + result.Add(RenderState.BlendOp(Uniforms.colorBlendOperation, Uniforms.alphaBlendOperation)); + } + else + { + result.Add(RenderState.Blend("Blend Off")); + } + + if (enableStencil) + { + result.Add(RenderState.Stencil(new StencilDescriptor { Ref = Uniforms.stencilReference, ReadMask = Uniforms.stencilReadMask, WriteMask = Uniforms.stencilWriteMask, Comp = Uniforms.stencilComparison, ZFail = Uniforms.stencilDepthFail, Fail = Uniforms.stencilFail, Pass = Uniforms.stencilPass })); + } + + return result; + } else { - var result = new RenderStateCollection(); result.Add(RenderState.ZTest(depthTestMode.ToString())); result.Add(RenderState.ZWrite(depthWrite.ToString())); @@ -757,6 +778,8 @@ public RenderStateCollection GetRenderState() result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); else if (blendMode == FullscreenBlendMode.Multiply) result.Add(RenderState.Blend(Blend.DstColor, Blend.Zero)); + else if (blendMode == FullscreenBlendMode.Disabled) + result.Add(RenderState.Blend("Blend Off")); else { result.Add(RenderState.Blend(BlendModeToBlend(srcColorBlendMode), BlendModeToBlend(dstColorBlendMode), BlendModeToBlend(srcAlphaBlendMode), BlendModeToBlend(dstAlphaBlendMode))); @@ -773,8 +796,9 @@ public RenderStateCollection GetRenderState() Fail = stencilFailOperation.ToString(), Pass = stencilPassOperation.ToString(), })); - return result; } + + return result; } Blend BlendModeToBlend(BlendMode mode) => mode switch From 28f538caca9fe146be4e6095f0b87a213c6e1a70 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 23 Sep 2021 18:30:25 +0200 Subject: [PATCH 008/108] refactor to have one sub-target per pipeline + working position computation --- .../Editor/Material/Fullscreen.meta | 8 + .../Material/Fullscreen/ShaderGraph.meta | 8 + .../ShaderGraph/HDFullscreenSubtarget.cs | 175 ++ .../ShaderGraph/HDFullscreenSubtarget.cs.meta | 11 + .../Editor/Material/ShaderGraph/HDTarget.cs | 18 +- .../ShaderGraph/TargetData/IRequiresData.cs | 7 - .../Runtime/Material/Fullscreen.meta | 8 + .../Fullscreen/HDFullscreenFunctions.hlsl | 6 + .../HDFullscreenFunctions.hlsl.meta | 7 + .../Targets/UniversalFullscreenSubTarget.cs | 157 ++ .../UniversalFullscreenSubTarget.cs.meta | 11 + .../ShaderGraph/Targets/UniversalTarget.cs | 65 +- .../ValidationExceptions.json.meta | 7 +- .../Targets/Fullscreen/FullscreenData.cs | 181 ++ .../Targets/Fullscreen/FullscreenData.cs.meta | 11 + .../Targets/Fullscreen/FullscreenMetaData.cs | 8 +- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 44 +- .../Targets/Fullscreen/FullscreenSubTarget.cs | 750 ++++++-- .../Targets/Fullscreen/FullscreenTarget.cs | 1671 ++++++++--------- .../Fullscreen/Includes/FullscreenCommon.hlsl | 3 +- .../Fullscreen/Templates/ShaderPass.template | 5 + .../Templates/SharedCode.template.hlsl | 39 +- .../Editor/Interface/IRequiresData.cs | 9 + .../Editor/Interface}/IRequiresData.cs.meta | 0 24 files changed, 2167 insertions(+), 1042 deletions(-) create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen.meta create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph.meta create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs.meta delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs create mode 100644 com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen.meta create mode 100644 com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl create mode 100644 com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl.meta create mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs create mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs.meta create mode 100644 com.unity.shadergraph/Editor/Interface/IRequiresData.cs rename {com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData => com.unity.shadergraph/Editor/Interface}/IRequiresData.cs.meta (100%) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen.meta new file mode 100644 index 00000000000..032068b9aec --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0f0ba7de1a498de4c94a45af7864bd68 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph.meta new file mode 100644 index 00000000000..9194d2bdcd8 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3242e527472609e438ae952a4b3b7cd8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs new file mode 100644 index 00000000000..5bd9cfb6999 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs @@ -0,0 +1,175 @@ +using UnityEditor.ShaderGraph; +using UnityEngine; +using static UnityEditor.Rendering.BuiltIn.ShaderUtils; +using UnityEditor.Rendering.BuiltIn; +using System; +using UnityEditor.Rendering.Fullscreen.ShaderGraph; + +namespace UnityEditor.Rendering.HighDefinition.ShaderGraph +{ + class HDFullscreenSubTarget : FullscreenSubTarget, IHasMetadata + { + static readonly GUID kSourceCodeGuid = new GUID("657f6eb2bee4e2f4985ec1ac58eb04cb"); // HDFullscreenSubTarget.cs // TODO + + public override void Setup(ref TargetSetupContext context) + { + base.Setup(ref context); + context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); + } + + protected override IncludeCollection pregraphIncludes => new IncludeCollection + { + { CoreIncludes.MinimalCorePregraph }, + // { "Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl", IncludeLocation.Pregraph }, + { "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl", IncludeLocation.Pregraph}, + { CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph } + }; + + // protected override IncludeCollection GetPostGraphIncludes() + // { + // return new IncludeCollection + // { + + // }; + // } + + // public virtual ScriptableObject GetMetadataObject() + // { + // var bultInMetadata = ScriptableObject.CreateInstance(); + // bultInMetadata.fullscreenMode = target.fullscreenMode; + // return bultInMetadata; + // } + + // We don't need the save context / update materials for now + public override object saveContext => null; + + public HDFullscreenSubTarget() + { + displayName = "Fullscreen"; + } + + // public virtual bool IsNodeAllowedByTarget(Type nodeType) + // { + // // TODO + // // SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); + // // bool worksWithThisSrp = srpFilter == null || srpFilter.srpTypes.Contains(typeof(HDRenderPipeline)); + + // return true; + // } + + // TODO: replace shader generation by this: and HDRRP specific includes + functions + + // #region SubShader + // static class SubShaders + // { + // const string kFullscreenDrawProceduralInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl"; + // const string kFullscreenBlitInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; + // const string kCustomRenderTextureInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl"; + // const string kFullscreenCommon = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl"; + + // static readonly KeywordDescriptor depthWriteKeywork = new KeywordDescriptor + // { + // displayName = "Depth Write", + // referenceName = "DEPTH_WRITE", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.ShaderFeature, + // stages = KeywordShaderStage.Fragment, + // }; + + // public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) + // { + // var result = new SubShaderDescriptor() + // { + // generatesPreview = true, + // passes = new PassCollection() + // }; + + // result.passes.Add(GetFullscreenPass(target, FullscreenTarget.FullscreenCompatibility.Blit)); + // result.passes.Add(GetFullscreenPass(target, FullscreenTarget.FullscreenCompatibility.DrawProcedural)); + + // return result; + // } + + // static PassDescriptor GetFullscreenPass(FullscreenTarget target, FullscreenTarget.FullscreenCompatibility compatibility) + // { + // var fullscreenPass = new PassDescriptor + // { + // // Definition + // displayName = compatibility.ToString(), + // referenceName = "SHADERPASS_" + compatibility.ToString().ToUpper(), + // useInPreview = true, + + // // Template + // passTemplatePath = FullscreenTarget.kTemplatePath, + // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, + + // // Port Mask + // validVertexBlocks = new BlockFieldDescriptor[] + // { + // BlockFields.VertexDescription.Position + // }, + // validPixelBlocks = new BlockFieldDescriptor[] + // { + // FullscreenTarget.Blocks.color, + // FullscreenTarget.Blocks.depth, + // }, + + // // Fields + // structs = new StructCollection + // { + // { Structs.Attributes }, + // { Structs.SurfaceDescriptionInputs }, + // { FullscreenTarget.Varyings }, + // { Structs.VertexDescriptionInputs }, + // }, + // fieldDependencies = FieldDependencies.Default, + // requiredFields = new FieldCollection + // { + // StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code + // StructFields.Varyings.texCoord0, + // StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case + // }, + + // // Conditional State + // renderStates = target.GetRenderState(), + // pragmas = new PragmaCollection + // { + // { Pragma.Target(ShaderModel.Target30) }, + // { Pragma.Vertex("vert") }, + // { Pragma.Fragment("frag") }, + // }, + // defines = new DefineCollection + // { + // {depthWriteKeywork, 1, new FieldCondition(FullscreenTarget.Fields.depth, true)} + // }, + // keywords = new KeywordCollection(), + // includes = new IncludeCollection + // { + // // Pre-graph + // { CoreIncludes.preGraphIncludes }, + + // // Post-graph + // { kFullscreenCommon, IncludeLocation.Postgraph }, + // }, + // }; + + // switch (compatibility) + // { + // default: + // case FullscreenTarget.FullscreenCompatibility.Blit: + // fullscreenPass.includes.Add(kFullscreenBlitInclude, IncludeLocation.Postgraph); + // break; + // case FullscreenTarget.FullscreenCompatibility.DrawProcedural: + // fullscreenPass.includes.Add(kFullscreenDrawProceduralInclude, IncludeLocation.Postgraph); + // break; + // // case FullscreenTarget.FullscreenCompatibility.CustomRenderTexture: + // // fullscreenPass.includes.Add(kCustomRenderTextureInclude, IncludeLocation.Postgraph); + // break; + // } + + // return fullscreenPass; + // } + // } + // #endregion + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs.meta new file mode 100644 index 00000000000..91a8b7edb82 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 657f6eb2bee4e2f4985ec1ac58eb04cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs index 7daee567bf4..45b0c751ea2 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs @@ -64,7 +64,7 @@ sealed class HDTarget : Target, IHasMetadata, ILegacyTarget, IMaySupportVFX, IRe JsonData m_ActiveSubTarget; [SerializeField] - List> m_Datas = new List>(); + List> m_Datas = new List>(); [SerializeField] string m_CustomEditorGUI; @@ -75,7 +75,8 @@ sealed class HDTarget : Target, IHasMetadata, ILegacyTarget, IMaySupportVFX, IRe private static readonly List m_IncompatibleVFXSubTargets = new List { // Currently there is not support for VFX decals via HDRP master node. - typeof(DecalSubTarget) + typeof(DecalSubTarget), + typeof(HDFullscreenSubTarget), }; internal override bool ignoreCustomInterpolators => false; @@ -271,12 +272,15 @@ public bool TrySetActiveSubTarget(Type subTargetType) void ProcessSubTargetDatas(SubTarget subTarget) { - var typeCollection = TypeCache.GetTypesDerivedFrom(); + var typeCollection = TypeCache.GetTypesDerivedFrom(); foreach (var type in typeCollection) { + if (type.IsGenericType) + continue; + // Data requirement interfaces need generic type arguments // Therefore we need to use reflections to call the method - var methodInfo = typeof(HDTarget).GetMethod("SetDataOnSubTarget"); + var methodInfo = typeof(HDTarget).GetMethod(nameof(SetDataOnSubTarget)); var genericMethodInfo = methodInfo.MakeGenericMethod(type); genericMethodInfo.Invoke(this, new object[] { subTarget }); } @@ -291,13 +295,13 @@ void ClearUnusedData() // Data requirement interfaces need generic type arguments // Therefore we need to use reflections to call the method - var methodInfo = typeof(HDTarget).GetMethod("ValidateDataForSubTarget"); + var methodInfo = typeof(HDTarget).GetMethod(nameof(ValidateDataForSubTarget)); var genericMethodInfo = methodInfo.MakeGenericMethod(type); genericMethodInfo.Invoke(this, new object[] { m_ActiveSubTarget.value, data.value }); } } - public void SetDataOnSubTarget(SubTarget subTarget) where T : HDTargetData + public void SetDataOnSubTarget(SubTarget subTarget) where T : JsonObject { if (!(subTarget is IRequiresData requiresData)) return; @@ -314,7 +318,7 @@ public void SetDataOnSubTarget(SubTarget subTarget) where T : HDTargetData requiresData.data = data; } - public void ValidateDataForSubTarget(SubTarget subTarget, T data) where T : HDTargetData + public void ValidateDataForSubTarget(SubTarget subTarget, T data) where T : JsonObject { if (!(subTarget is IRequiresData requiresData)) { diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs deleted file mode 100644 index 6568b3b2fc1..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace UnityEditor.Rendering.HighDefinition.ShaderGraph -{ - interface IRequiresData where T : HDTargetData - { - T data { get; set; } - } -} diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen.meta b/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen.meta new file mode 100644 index 00000000000..313b19c7ddd --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d260175e9b34d3c4ba428e88a086acd4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl b/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl new file mode 100644 index 00000000000..ace14fa4baf --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl @@ -0,0 +1,6 @@ + +// For now we fake the GI sampling in fullscreen. +float3 SampleBakedGI(float3 positionRWS, float3 normalWS, float2 uvStaticLightmap, float2 uvDynamicLightmap) +{ + return 0; +} diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl.meta b/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl.meta new file mode 100644 index 00000000000..6bcf3850dc1 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b439a42eff125494ea2293fa5fb56fed +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs new file mode 100644 index 00000000000..bd704ce0e3c --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs @@ -0,0 +1,157 @@ +using UnityEditor.ShaderGraph; +using UnityEngine; +using static UnityEditor.Rendering.BuiltIn.ShaderUtils; +using UnityEditor.Rendering.BuiltIn; +using System; +using UnityEditor.Rendering.Fullscreen.ShaderGraph; + +namespace UnityEditor.Rendering.Universal.ShaderGraph +{ + class UniversalFullscreenSubTarget : FullscreenSubTarget, IRequiresData, IHasMetadata + { + static readonly GUID kSourceCodeGuid = new GUID("48080a5025a54a84087e882e2f988642"); // UniversalFullscreenSubTarget.cs // TODO + + public override void Setup(ref TargetSetupContext context) + { + base.Setup(ref context); + context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); + } + + // We don't need the save context / update materials for now + public override object saveContext => null; + + protected override IncludeCollection pregraphIncludes => new IncludeCollection + { + { CoreIncludes.kGraphFunctions, IncludeLocation.Pregraph } + }; + + public UniversalFullscreenSubTarget() + { + displayName = "Fullscreen"; + } + + // public virtual bool IsNodeAllowedByTarget(Type nodeType) + // { + // // TODO + // // SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); + // // bool worksWithThisSrp = srpFilter == null || srpFilter.srpTypes.Contains(typeof(HDRenderPipeline)); + + // return true; + // } + + // TODO: replace shader generation by this: and HDRRP specific includes + functions + + // #region SubShader + // static class SubShaders + // { + // const string kFullscreenDrawProceduralInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl"; + // const string kFullscreenBlitInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; + // const string kCustomRenderTextureInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl"; + // const string kFullscreenCommon = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl"; + + // static readonly KeywordDescriptor depthWriteKeywork = new KeywordDescriptor + // { + // displayName = "Depth Write", + // referenceName = "DEPTH_WRITE", + // type = KeywordType.Boolean, + // definition = KeywordDefinition.ShaderFeature, + // stages = KeywordShaderStage.Fragment, + // }; + + // public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) + // { + // var result = new SubShaderDescriptor() + // { + // generatesPreview = true, + // passes = new PassCollection() + // }; + + // result.passes.Add(GetFullscreenPass(target, FullscreenTarget.FullscreenCompatibility.Blit)); + // result.passes.Add(GetFullscreenPass(target, FullscreenTarget.FullscreenCompatibility.DrawProcedural)); + + // return result; + // } + + // static PassDescriptor GetFullscreenPass(FullscreenTarget target, FullscreenTarget.FullscreenCompatibility compatibility) + // { + // var fullscreenPass = new PassDescriptor + // { + // // Definition + // displayName = compatibility.ToString(), + // referenceName = "SHADERPASS_" + compatibility.ToString().ToUpper(), + // useInPreview = true, + + // // Template + // passTemplatePath = FullscreenTarget.kTemplatePath, + // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, + + // // Port Mask + // validVertexBlocks = new BlockFieldDescriptor[] + // { + // BlockFields.VertexDescription.Position + // }, + // validPixelBlocks = new BlockFieldDescriptor[] + // { + // FullscreenTarget.Blocks.color, + // FullscreenTarget.Blocks.depth, + // }, + + // // Fields + // structs = new StructCollection + // { + // { Structs.Attributes }, + // { Structs.SurfaceDescriptionInputs }, + // { FullscreenTarget.Varyings }, + // { Structs.VertexDescriptionInputs }, + // }, + // fieldDependencies = FieldDependencies.Default, + // requiredFields = new FieldCollection + // { + // StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code + // StructFields.Varyings.texCoord0, + // StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case + // }, + + // // Conditional State + // renderStates = target.GetRenderState(), + // pragmas = new PragmaCollection + // { + // { Pragma.Target(ShaderModel.Target30) }, + // { Pragma.Vertex("vert") }, + // { Pragma.Fragment("frag") }, + // }, + // defines = new DefineCollection + // { + // {depthWriteKeywork, 1, new FieldCondition(FullscreenTarget.Fields.depth, true)} + // }, + // keywords = new KeywordCollection(), + // includes = new IncludeCollection + // { + // // Pre-graph + // { CoreIncludes.preGraphIncludes }, + + // // Post-graph + // { kFullscreenCommon, IncludeLocation.Postgraph }, + // }, + // }; + + // switch (compatibility) + // { + // default: + // case FullscreenTarget.FullscreenCompatibility.Blit: + // fullscreenPass.includes.Add(kFullscreenBlitInclude, IncludeLocation.Postgraph); + // break; + // case FullscreenTarget.FullscreenCompatibility.DrawProcedural: + // fullscreenPass.includes.Add(kFullscreenDrawProceduralInclude, IncludeLocation.Postgraph); + // break; + // // case FullscreenTarget.FullscreenCompatibility.CustomRenderTexture: + // // fullscreenPass.includes.Add(kCustomRenderTextureInclude, IncludeLocation.Postgraph); + // break; + // } + + // return fullscreenPass; + // } + // } + // #endregion + } +} diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta new file mode 100644 index 00000000000..13dd7fc214c --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 48080a5025a54a84087e882e2f988642 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs index ce9e84024f9..cb9b55fbe8f 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs @@ -85,6 +85,10 @@ sealed class UniversalTarget : Target, IHasMetadata, ILegacyTarget List m_SubTargetNames; int activeSubTargetIndex => m_SubTargets.IndexOf(m_ActiveSubTarget); + // Subtarget Data + [SerializeField] + List> m_Datas = new List>(); + // View PopupField m_SubTargetField; TextField m_CustomGUIField; @@ -491,6 +495,7 @@ public bool TrySetActiveSubTarget(Type subTargetType) if (subTarget.GetType().Equals(subTargetType)) { m_ActiveSubTarget = subTarget; + ProcessSubTargetDatas(m_ActiveSubTarget); return true; } } @@ -498,6 +503,64 @@ public bool TrySetActiveSubTarget(Type subTargetType) return false; } + void ProcessSubTargetDatas(SubTarget subTarget) + { + var typeCollection = TypeCache.GetTypesDerivedFrom(); + foreach (var type in typeCollection) + { + // Data requirement interfaces need generic type arguments + // Therefore we need to use reflections to call the method + var methodInfo = typeof(UniversalTarget).GetMethod(nameof(SetDataOnSubTarget)); + var genericMethodInfo = methodInfo.MakeGenericMethod(type); + genericMethodInfo.Invoke(this, new object[] { subTarget }); + } + } + + void ClearUnusedData() + { + for (int i = 0; i < m_Datas.Count; i++) + { + var data = m_Datas[i]; + var type = data.value.GetType(); + + // Data requirement interfaces need generic type arguments + // Therefore we need to use reflections to call the method + var methodInfo = typeof(UniversalTarget).GetMethod(nameof(ValidateDataForSubTarget)); + var genericMethodInfo = methodInfo.MakeGenericMethod(type); + genericMethodInfo.Invoke(this, new object[] { m_ActiveSubTarget.value, data.value }); + } + } + + public void SetDataOnSubTarget(SubTarget subTarget) where T : JsonObject + { + if (!(subTarget is IRequiresData requiresData)) + return; + + // Ensure data object exists in list + var data = m_Datas.SelectValue().FirstOrDefault(x => x.GetType().Equals(typeof(T))) as T; + if (data == null) + { + data = Activator.CreateInstance(typeof(T)) as T; + m_Datas.Add(data); + } + + // Apply data object to SubTarget + requiresData.data = data; + } + + public void ValidateDataForSubTarget(SubTarget subTarget, T data) where T : JsonObject + { + if (!(subTarget is IRequiresData requiresData)) + { + m_Datas.Remove(data); + } + } + + public override void OnBeforeSerialize() + { + ClearUnusedData(); + } + public bool TryUpgradeFromMasterNode(IMasterNode1 masterNode, out Dictionary blockMap) { void UpgradeAlphaClip() @@ -1297,7 +1360,7 @@ static class CoreIncludes const string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; const string kCore = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"; const string kLighting = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"; - const string kGraphFunctions = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"; + internal const string kGraphFunctions = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"; const string kVaryings = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl"; const string kShaderPass = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"; const string kDepthOnlyPass = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DepthOnlyPass.hlsl"; diff --git a/com.unity.render-pipelines.universal/ValidationExceptions.json.meta b/com.unity.render-pipelines.universal/ValidationExceptions.json.meta index 673f4df8c0e..777bac21963 100644 --- a/com.unity.render-pipelines.universal/ValidationExceptions.json.meta +++ b/com.unity.render-pipelines.universal/ValidationExceptions.json.meta @@ -1,2 +1,7 @@ fileFormatVersion: 2 -guid: 3afe581e949e3cc489c978bd8e000c4b \ No newline at end of file +guid: 3afe581e949e3cc489c978bd8e000c4b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs new file mode 100644 index 00000000000..c06ae483389 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs @@ -0,0 +1,181 @@ +using UnityEditor.ShaderGraph; +using UnityEngine; +using static UnityEditor.Rendering.BuiltIn.ShaderUtils; +using UnityEditor.Rendering.BuiltIn; +using System; +using UnityEditor.ShaderGraph.Serialization; +using UnityEngine.Rendering; +using BlendMode = UnityEngine.Rendering.BlendMode; +using BlendOp = UnityEditor.ShaderGraph.BlendOp; + +namespace UnityEditor.Rendering.Fullscreen.ShaderGraph +{ + internal class FullscreenData : JsonObject + { + public enum Version + { + Initial, + } + + [SerializeField] + Version m_Version = Version.Initial; + public Version version + { + get => m_Version; + set => m_Version = value; + } + + [SerializeField] + FullscreenMode m_fullscreenMode; + public FullscreenMode fullscreenMode + { + get => m_fullscreenMode; + set => m_fullscreenMode = value; + } + + [SerializeField] + FullscreenBlendMode m_BlendMode = FullscreenBlendMode.Disabled; + public FullscreenBlendMode blendMode + { + get => m_BlendMode; + set => m_BlendMode = value; + } + + [SerializeField] + BlendMode m_SrcColorBlendMode = BlendMode.Zero; + public BlendMode srcColorBlendMode + { + get => m_SrcColorBlendMode; + set => m_SrcColorBlendMode = value; + } + + [SerializeField] + BlendMode m_DstColorBlendMode = BlendMode.One; + public BlendMode dstColorBlendMode + { + get => m_DstColorBlendMode; + set => m_DstColorBlendMode = value; + } + + [SerializeField] + BlendOp m_ColorBlendOperation = BlendOp.Add; + public BlendOp colorBlendOperation + { + get => m_ColorBlendOperation; + set => m_ColorBlendOperation = value; + } + + [SerializeField] + BlendMode m_SrcAlphaBlendMode = BlendMode.Zero; + public BlendMode srcAlphaBlendMode + { + get => m_SrcAlphaBlendMode; + set => m_SrcAlphaBlendMode = value; + } + + [SerializeField] + BlendMode m_DstAlphaBlendMode = BlendMode.One; + public BlendMode dstAlphaBlendMode + { + get => m_DstAlphaBlendMode; + set => m_DstAlphaBlendMode = value; + } + + [SerializeField] + BlendOp m_AlphaBlendOperation = BlendOp.Add; + public BlendOp alphaBlendOperation + { + get => m_AlphaBlendOperation; + set => m_AlphaBlendOperation = value; + } + + [SerializeField] + bool m_EnableStencil = false; + public bool enableStencil + { + get => m_EnableStencil; + set => m_EnableStencil = value; + } + + [SerializeField] + int m_StencilReference = 0; + public int stencilReference + { + get => m_StencilReference; + set => m_StencilReference = Mathf.Clamp(value, 0, 255); + } + + [SerializeField] + int m_StencilReadMask = 255; + public int stencilReadMask + { + get => m_StencilReadMask; + set => m_StencilReadMask = Mathf.Clamp(value, 0, 255); + } + + [SerializeField] + int m_StencilWriteMask = 255; + public int stencilWriteMask + { + get => m_StencilWriteMask; + set => m_StencilWriteMask = Mathf.Clamp(value, 0, 255); + } + + [SerializeField] + CompareFunction m_StencilCompareFunction = CompareFunction.Always; + public CompareFunction stencilCompareFunction + { + get => m_StencilCompareFunction; + set => m_StencilCompareFunction = value; + } + + [SerializeField] + StencilOp m_StencilPassOperation = StencilOp.Keep; + public StencilOp stencilPassOperation + { + get => m_StencilPassOperation; + set => m_StencilPassOperation = value; + } + + [SerializeField] + StencilOp m_StencilFailOperation = StencilOp.Keep; + public StencilOp stencilFailOperation + { + get => m_StencilFailOperation; + set => m_StencilFailOperation = value; + } + + [SerializeField] + StencilOp m_StencilDepthFailOperation = StencilOp.Keep; + public StencilOp stencilDepthTestFailOperation + { + get => m_StencilDepthFailOperation; + set => m_StencilDepthFailOperation = value; + } + + [SerializeField] + bool m_DepthWrite = false; + public bool depthWrite + { + get => m_DepthWrite; + set => m_DepthWrite = value; + } + + // When checked, allows the material to control ALL surface settings (uber shader style) + [SerializeField] + bool m_AllowMaterialOverride = false; + public bool allowMaterialOverride + { + get => m_AllowMaterialOverride; + set => m_AllowMaterialOverride = value; + } + + [SerializeField] + CompareFunction m_DepthTestMode = CompareFunction.Always; + public CompareFunction depthTestMode + { + get => m_DepthTestMode; + set => m_DepthTestMode = value; + } + } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs.meta new file mode 100644 index 00000000000..93ea57f7f22 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 72e6c41bd91e94645bd050543cb17d62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs index 2a05c0b37dd..96afacbe506 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs @@ -8,12 +8,12 @@ namespace UnityEditor.Rendering.Fullscreen.ShaderGraph sealed class FullscreenMetaData : ScriptableObject { [SerializeField] - FullscreenTarget.FullscreenCompatibility _FullscreenCompatibility; + FullscreenMode m_FullscreenMode; - public FullscreenTarget.FullscreenCompatibility fullscreenCompatibility + public FullscreenMode fullscreenMode { - get => _FullscreenCompatibility; - set => _FullscreenCompatibility = value; + get => m_FullscreenMode; + set => m_FullscreenMode = value; } } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs index 75f49b960f0..f6ae849ad5f 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -109,25 +109,25 @@ protected virtual void DrawSurfaceOptions(Material material) var materialEditor = m_MaterialEditor; var properties = m_Properties; - var blendMode = FindProperty(FullscreenTarget.Uniforms.blendModeProperty, properties, false); - var srcColorBlend = FindProperty(FullscreenTarget.Uniforms.srcColorBlendProperty, properties, false); - var dstColorBlend = FindProperty(FullscreenTarget.Uniforms.dstColorBlendProperty, properties, false); - var srcAlphaBlend = FindProperty(FullscreenTarget.Uniforms.srcAlphaBlendProperty, properties, false); - var dstAlphaBlend = FindProperty(FullscreenTarget.Uniforms.dstAlphaBlendProperty, properties, false); - var colorBlendOp = FindProperty(FullscreenTarget.Uniforms.colorBlendOperationProperty, properties, false); - var alphaBlendOp = FindProperty(FullscreenTarget.Uniforms.alphaBlendOperationProperty, properties, false); - var depthWrite = FindProperty(FullscreenTarget.Uniforms.depthWriteProperty, properties, false); - var depthTest = FindProperty(FullscreenTarget.Uniforms.depthTestProperty, properties, false); - var stencilEnable = FindProperty(FullscreenTarget.Uniforms.stencilEnableProperty, properties, false); - var stencilRef = FindProperty(FullscreenTarget.Uniforms.stencilReferenceProperty, properties, false); - var stencilReadMask = FindProperty(FullscreenTarget.Uniforms.stencilReadMaskProperty, properties, false); - var stencilWriteMask = FindProperty(FullscreenTarget.Uniforms.stencilWriteMaskProperty, properties, false); - var stencilComp = FindProperty(FullscreenTarget.Uniforms.stencilComparisonProperty, properties, false); - var stencilPass = FindProperty(FullscreenTarget.Uniforms.stencilPassProperty, properties, false); - var stencilFail = FindProperty(FullscreenTarget.Uniforms.stencilFailProperty, properties, false); - var stencilDepthFail = FindProperty(FullscreenTarget.Uniforms.stencilDepthFailProperty, properties, false); - - if (material.HasProperty(FullscreenTarget.Uniforms.blendModeProperty)) + var blendMode = FindProperty(FullscreenUniforms.blendModeProperty, properties, false); + var srcColorBlend = FindProperty(FullscreenUniforms.srcColorBlendProperty, properties, false); + var dstColorBlend = FindProperty(FullscreenUniforms.dstColorBlendProperty, properties, false); + var srcAlphaBlend = FindProperty(FullscreenUniforms.srcAlphaBlendProperty, properties, false); + var dstAlphaBlend = FindProperty(FullscreenUniforms.dstAlphaBlendProperty, properties, false); + var colorBlendOp = FindProperty(FullscreenUniforms.colorBlendOperationProperty, properties, false); + var alphaBlendOp = FindProperty(FullscreenUniforms.alphaBlendOperationProperty, properties, false); + var depthWrite = FindProperty(FullscreenUniforms.depthWriteProperty, properties, false); + var depthTest = FindProperty(FullscreenUniforms.depthTestProperty, properties, false); + var stencilEnable = FindProperty(FullscreenUniforms.stencilEnableProperty, properties, false); + var stencilRef = FindProperty(FullscreenUniforms.stencilReferenceProperty, properties, false); + var stencilReadMask = FindProperty(FullscreenUniforms.stencilReadMaskProperty, properties, false); + var stencilWriteMask = FindProperty(FullscreenUniforms.stencilWriteMaskProperty, properties, false); + var stencilComp = FindProperty(FullscreenUniforms.stencilComparisonProperty, properties, false); + var stencilPass = FindProperty(FullscreenUniforms.stencilPassProperty, properties, false); + var stencilFail = FindProperty(FullscreenUniforms.stencilFailProperty, properties, false); + var stencilDepthFail = FindProperty(FullscreenUniforms.stencilDepthFailProperty, properties, false); + + if (material.HasProperty(FullscreenUniforms.blendModeProperty)) { EditorGUI.BeginChangeCheck(); m_MaterialEditor.ShaderProperty(blendMode, Styles.blendingMode); @@ -146,12 +146,12 @@ protected virtual void DrawSurfaceOptions(Material material) } } - if (material.HasProperty(FullscreenTarget.Uniforms.depthWriteProperty)) + if (material.HasProperty(FullscreenUniforms.depthWriteProperty)) m_MaterialEditor.ShaderProperty(depthWrite, Styles.depthWrite); - if (material.HasProperty(FullscreenTarget.Uniforms.depthTestProperty)) + if (material.HasProperty(FullscreenUniforms.depthTestProperty)) m_MaterialEditor.ShaderProperty(depthTest, Styles.depthTest); - if (material.HasProperty(FullscreenTarget.Uniforms.stencilEnableProperty)) + if (material.HasProperty(FullscreenUniforms.stencilEnableProperty)) { EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck(); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index eb3bc49018c..ef72418d2ea 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -3,33 +3,370 @@ using static UnityEditor.Rendering.BuiltIn.ShaderUtils; using UnityEditor.Rendering.BuiltIn; using System; +using UnityEditor.ShaderGraph.Internal; +using System.Linq; +// TODO: remove this dependency to builtin target +using UnityEditor.Rendering.BuiltIn.ShaderGraph; +using BlendMode = UnityEngine.Rendering.BlendMode; +using BlendOp = UnityEditor.ShaderGraph.BlendOp; +using UnityEngine.UIElements; +using UnityEditor.UIElements; +using UnityEngine.Rendering; namespace UnityEditor.Rendering.Fullscreen.ShaderGraph { - class FullscreenSubTarget : SubTarget, IHasMetadata + [GenerateBlocks] + internal struct FullscreenBlocks + { + public static BlockFieldDescriptor color = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Color", "Color", + "SURFACEDESCRIPTION_COLOR", new ColorRGBAControl(UnityEngine.Color.grey), ShaderStage.Fragment); + public static BlockFieldDescriptor depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Depth", "Depth", + "SURFACEDESCRIPTION_DEPTH", new FloatControl(0), ShaderStage.Fragment); + } + + [GenerationAPI] + internal struct FullscreenFields + { + public static FieldDescriptor depth = new FieldDescriptor("OUTPUT", "depth", "OUTPUT_DEPTH"); + } + + internal enum FullscreenMode + { + FullScreen, + CustomRenderTexture, + } + + internal enum FullscreenCompatibility + { + Blit, + DrawProcedural, + } + + internal enum FullscreenBlendMode + { + Disabled, + Alpha, + Premultiply, + Additive, + Multiply, + Custom, + } + + internal static class FullscreenUniforms + { + public static readonly string blendModeProperty = "_Fullscreen_BlendMode"; + public static readonly string srcColorBlendProperty = "_Fullscreen_SrcColorBlend"; + public static readonly string dstColorBlendProperty = "_Fullscreen_DstColorBlend"; + public static readonly string srcAlphaBlendProperty = "_Fullscreen_SrcAlphaBlend"; + public static readonly string dstAlphaBlendProperty = "_Fullscreen_DstAlphaBlend"; + public static readonly string colorBlendOperationProperty = "_Fullscreen_ColorBlendOperation"; + public static readonly string alphaBlendOperationProperty = "_Fullscreen_AlphaBlendOperation"; + public static readonly string depthWriteProperty = "_Fullscreen_DepthWrite"; + public static readonly string depthTestProperty = "_Fullscreen_DepthTest"; + public static readonly string stencilEnableProperty = "_Fullscreen_Stencil"; + public static readonly string stencilReferenceProperty = "_Fullscreen_StencilReference"; + public static readonly string stencilReadMaskProperty = "_Fullscreen_StencilReadMask"; + public static readonly string stencilWriteMaskProperty = "_Fullscreen_StencilWriteMask"; + public static readonly string stencilComparisonProperty = "_Fullscreen_StencilComparison"; + public static readonly string stencilPassProperty = "_Fullscreen_StencilPass"; + public static readonly string stencilFailProperty = "_Fullscreen_StencilFail"; + public static readonly string stencilDepthFailProperty = "_Fullscreen_StencilDepthFail"; + + public static readonly string srcColorBlend = "[" + srcColorBlendProperty + "]"; + public static readonly string dstColorBlend = "[" + dstColorBlendProperty + "]"; + public static readonly string srcAlphaBlend = "[" + srcAlphaBlendProperty + "]"; + public static readonly string dstAlphaBlend = "[" + dstAlphaBlendProperty + "]"; + public static readonly string colorBlendOperation = "[" + colorBlendOperationProperty + "]"; + public static readonly string alphaBlendOperation = "[" + alphaBlendOperationProperty + "]"; + public static readonly string depthWrite = "[" + depthWriteProperty + "]"; + public static readonly string depthTest = "[" + depthTestProperty + "]"; + public static readonly string stencilReference = "[" + stencilReferenceProperty + "]"; + public static readonly string stencilReadMask = "[" + stencilReadMaskProperty + "]"; + public static readonly string stencilWriteMask = "[" + stencilWriteMaskProperty + "]"; + public static readonly string stencilComparison = "[" + stencilComparisonProperty + "]"; + public static readonly string stencilPass = "[" + stencilPassProperty + "]"; + public static readonly string stencilFail = "[" + stencilFailProperty + "]"; + public static readonly string stencilDepthFail = "[" + stencilDepthFailProperty + "]"; + } + + internal abstract class FullscreenSubTarget : SubTarget, IRequiresData, IHasMetadata, IIsNodeAllowedBySubTarget where T : Target { static readonly GUID kSourceCodeGuid = new GUID("1cfc804c75474e144be5d4158b9522ed"); // FullscreenSubTarget.cs // TODO + static readonly string[] kSharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories().Union(new string[] { "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates" }).ToArray(); + + // HLSL includes + static readonly string kFullscreenDrawProceduralInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl"; + static readonly string kFullscreenBlitInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; + static readonly string kFullscreenCommon = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl"; + static readonly string kTemplatePath = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template"; + static readonly string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; + static readonly string kColor = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"; + static readonly string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; + static readonly string kInstancing = "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"; + static readonly string kSpaceTransforms = "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"; + static readonly string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"; + static readonly string kTextureStack = "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"; + + FullscreenData m_FullscreenData; + + FullscreenData IRequiresData.data + { + get => m_FullscreenData; + set => m_FullscreenData = value; + } + + public FullscreenData fullscreenData + { + get => m_FullscreenData; + set => m_FullscreenData = value; + } public override void Setup(ref TargetSetupContext context) { context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); - // TODO: custom editor field if (context.customEditorForRenderPipelines.Count == 0) - context.SetDefaultShaderGUI(typeof(FullscreenShaderGUI).FullName); + context.SetDefaultShaderGUI(GetDefaultShaderGUI().FullName); - // Process SubShaders - context.AddSubShader(SubShaders.FullscreenBlit(target)); + context.AddSubShader(GenerateSubShader()); } + protected abstract IncludeCollection pregraphIncludes { get; } + + protected virtual Type GetDefaultShaderGUI() => typeof(FullscreenShaderGUI); + public virtual string identifier => GetType().Name; public virtual ScriptableObject GetMetadataObject() { var bultInMetadata = ScriptableObject.CreateInstance(); - bultInMetadata.fullscreenCompatibility = target.fullscreenCompatibility; + bultInMetadata.fullscreenMode = fullscreenData.fullscreenMode; return bultInMetadata; } + public RenderStateCollection GetRenderState() + { + var result = new RenderStateCollection(); + + if (fullscreenData.allowMaterialOverride) + { + if (fullscreenData.depthTestMode != CompareFunction.Disabled) + result.Add(RenderState.ZTest(FullscreenUniforms.depthTest)); + else + result.Add(RenderState.ZTest("Off")); + result.Add(RenderState.ZWrite(FullscreenUniforms.depthWrite)); + if (fullscreenData.blendMode != FullscreenBlendMode.Disabled) + { + result.Add(RenderState.Blend(FullscreenUniforms.srcColorBlend, FullscreenUniforms.dstColorBlend, FullscreenUniforms.srcAlphaBlend, FullscreenUniforms.dstAlphaBlend)); + result.Add(RenderState.BlendOp(FullscreenUniforms.colorBlendOperation, FullscreenUniforms.alphaBlendOperation)); + } + else + { + result.Add(RenderState.Blend("Blend Off")); + } + + if (fullscreenData.enableStencil) + { + result.Add(RenderState.Stencil(new StencilDescriptor { Ref = FullscreenUniforms.stencilReference, ReadMask = FullscreenUniforms.stencilReadMask, WriteMask = FullscreenUniforms.stencilWriteMask, Comp = FullscreenUniforms.stencilComparison, ZFail = FullscreenUniforms.stencilDepthFail, Fail = FullscreenUniforms.stencilFail, Pass = FullscreenUniforms.stencilPass })); + } + + return result; + } + else + { + if (fullscreenData.depthTestMode == CompareFunction.Disabled) + result.Add(RenderState.ZTest("Off")); + else + result.Add(RenderState.ZTest(fullscreenData.depthTestMode.ToString())); + result.Add(RenderState.ZWrite(fullscreenData.depthWrite.ToString())); + + // Blend mode + if (fullscreenData.blendMode == FullscreenBlendMode.Alpha) + result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); + else if (fullscreenData.blendMode == FullscreenBlendMode.Premultiply) + result.Add(RenderState.Blend(Blend.One, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); + else if (fullscreenData.blendMode == FullscreenBlendMode.Additive) + result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); + else if (fullscreenData.blendMode == FullscreenBlendMode.Multiply) + result.Add(RenderState.Blend(Blend.DstColor, Blend.Zero)); + else if (fullscreenData.blendMode == FullscreenBlendMode.Disabled) + result.Add(RenderState.Blend("Blend Off")); + else + { + result.Add(RenderState.Blend(BlendModeToBlend(fullscreenData.srcColorBlendMode), BlendModeToBlend(fullscreenData.dstColorBlendMode), BlendModeToBlend(fullscreenData.srcAlphaBlendMode), BlendModeToBlend(fullscreenData.dstAlphaBlendMode))); + result.Add(RenderState.BlendOp(fullscreenData.colorBlendOperation, fullscreenData.alphaBlendOperation)); + } + + result.Add(RenderState.Stencil(new StencilDescriptor + { + Ref = fullscreenData.stencilReference.ToString(), + ReadMask = fullscreenData.stencilReadMask.ToString(), + WriteMask = fullscreenData.stencilWriteMask.ToString(), + Comp = fullscreenData.stencilCompareFunction.ToString(), + ZFail = fullscreenData.stencilDepthTestFailOperation.ToString(), + Fail = fullscreenData.stencilFailOperation.ToString(), + Pass = fullscreenData.stencilPassOperation.ToString(), + })); + } + + return result; + } + + public static Blend BlendModeToBlend(BlendMode mode) => mode switch + { + BlendMode.Zero => Blend.Zero, + BlendMode.One => Blend.One, + BlendMode.DstColor => Blend.DstColor, + BlendMode.SrcColor => Blend.SrcColor, + BlendMode.OneMinusDstColor => Blend.OneMinusDstColor, + BlendMode.SrcAlpha => Blend.SrcAlpha, + BlendMode.OneMinusSrcColor => Blend.OneMinusSrcColor, + BlendMode.DstAlpha => Blend.DstAlpha, + BlendMode.OneMinusDstAlpha => Blend.OneMinusDstAlpha, + BlendMode.SrcAlphaSaturate => Blend.SrcAlpha, + BlendMode.OneMinusSrcAlpha => Blend.OneMinusSrcAlpha, + _ => Blend.Zero + }; + + public virtual SubShaderDescriptor GenerateSubShader() + { + var result = new SubShaderDescriptor() + { + generatesPreview = true, + passes = new PassCollection() + }; + + result.passes.Add(GenerateFullscreenPass(FullscreenCompatibility.Blit)); + result.passes.Add(GenerateFullscreenPass(FullscreenCompatibility.DrawProcedural)); + + return result; + } + + public virtual IncludeCollection GetPreGraphIncludes() + { + return new IncludeCollection + { + { kCommon, IncludeLocation.Pregraph }, + { kColor, IncludeLocation.Pregraph }, + { kTexture, IncludeLocation.Pregraph }, + { kTextureStack, IncludeLocation.Pregraph }, + { kInstancing, IncludeLocation.Pregraph }, // For VR + // { kShaderVariables, IncludeLocation.Pregraph }, + // { kCommonLighting, IncludeLocation.Pregraph }, + { pregraphIncludes }, + { kSpaceTransforms, IncludeLocation.Pregraph }, + { kFunctions, IncludeLocation.Pregraph }, + }; + } + + public virtual IncludeCollection GetPostGraphIncludes() + { + return new IncludeCollection { { kFullscreenCommon, IncludeLocation.Postgraph } }; + } + + static readonly KeywordDescriptor depthWriteKeywork = new KeywordDescriptor + { + displayName = "Depth Write", + referenceName = "DEPTH_WRITE", + type = KeywordType.Boolean, + definition = KeywordDefinition.ShaderFeature, + stages = KeywordShaderStage.Fragment, + }; + + public static StructDescriptor Varyings = new StructDescriptor() + { + name = "Varyings", + packFields = true, + populateWithCustomInterpolators = false, + fields = new FieldDescriptor[] + { + StructFields.Varyings.positionCS, + StructFields.Varyings.texCoord0, + StructFields.Varyings.instanceID, + // BuiltInStructFields.Varyings.stereoTargetEyeIndexAsBlendIdx0, + // BuiltInStructFields.Varyings.stereoTargetEyeIndexAsRTArrayIdx, + } + }; + + public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility compatibility) + { + var fullscreenPass = new PassDescriptor + { + // Definition + displayName = compatibility.ToString(), + referenceName = "SHADERPASS_" + compatibility.ToString().ToUpper(), + useInPreview = true, + + // Template + passTemplatePath = kTemplatePath, + sharedTemplateDirectories = kSharedTemplateDirectories, + + // Port Mask + validVertexBlocks = new BlockFieldDescriptor[] + { + BlockFields.VertexDescription.Position + }, + validPixelBlocks = new BlockFieldDescriptor[] + { + FullscreenBlocks.color, + FullscreenBlocks.depth, + }, + + // Fields + structs = new StructCollection + { + { Structs.Attributes }, + { Structs.SurfaceDescriptionInputs }, + { Varyings }, + { Structs.VertexDescriptionInputs }, + }, + fieldDependencies = FieldDependencies.Default, + requiredFields = new FieldCollection + { + StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code + StructFields.Varyings.texCoord0, + StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case + }, + + // Conditional State + renderStates = GetRenderState(), + pragmas = new PragmaCollection + { + { Pragma.Target(ShaderModel.Target30) }, + { Pragma.Vertex("vert") }, + { Pragma.Fragment("frag") }, + }, + defines = new DefineCollection + { + {depthWriteKeywork, 1, new FieldCondition(FullscreenFields.depth, true)} + }, + keywords = new KeywordCollection(), + includes = new IncludeCollection + { + // Pre-graph + GetPreGraphIncludes(), + + // Post-graph + GetPostGraphIncludes(), + }, + }; + + switch (compatibility) + { + default: + case FullscreenCompatibility.Blit: + fullscreenPass.includes.Add(kFullscreenBlitInclude, IncludeLocation.Postgraph); + break; + case FullscreenCompatibility.DrawProcedural: + fullscreenPass.includes.Add(kFullscreenDrawProceduralInclude, IncludeLocation.Postgraph); + break; + // case FullscreenCompatibility.CustomRenderTexture: + // fullscreenPass.includes.Add(kCustomRenderTextureInclude, IncludeLocation.Postgraph); + // break; + } + + return fullscreenPass; + } + // We don't need the save context / update materials for now public override object saveContext => null; @@ -38,6 +375,15 @@ public FullscreenSubTarget() displayName = "Fullscreen"; } + public virtual bool IsNodeAllowedByTarget(Type nodeType) + { + // TODO + // SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); + // bool worksWithThisSrp = srpFilter == null || srpFilter.srpTypes.Contains(typeof(HDRenderPipeline)); + + return true; + } + public override bool IsActive() => true; public override void ProcessPreviewMaterial(Material material) @@ -66,132 +412,324 @@ public override void ProcessPreviewMaterial(Material material) public override void GetFields(ref TargetFieldContext context) { + context.AddField(UnityEditor.ShaderGraph.Fields.GraphPixel); + context.AddField(FullscreenFields.depth, fullscreenData.depthWrite); } public override void GetActiveBlocks(ref TargetActiveBlockContext context) { + // // Core blocks + context.AddBlock(FullscreenBlocks.color); + context.AddBlock(FullscreenBlocks.depth, fullscreenData.depthWrite); } public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) { - if (target.allowMaterialOverride) + if (fullscreenData.allowMaterialOverride) { base.CollectShaderProperties(collector, generationMode); - target.CollectRenderStateShaderProperties(collector, generationMode); + CollectRenderStateShaderProperties(collector, generationMode); + } + } + + public void CollectRenderStateShaderProperties(PropertyCollector collector, GenerationMode generationMode) + { + if (generationMode != GenerationMode.Preview && fullscreenData.allowMaterialOverride) + { + // When blend mode is disabled, we can't override + if (fullscreenData.blendMode != FullscreenBlendMode.Disabled) + { + collector.AddEnumProperty(FullscreenUniforms.blendModeProperty, fullscreenData.blendMode); + collector.AddEnumProperty(FullscreenUniforms.srcColorBlendProperty, fullscreenData.srcColorBlendMode); + collector.AddEnumProperty(FullscreenUniforms.dstColorBlendProperty, fullscreenData.dstColorBlendMode); + collector.AddEnumProperty(FullscreenUniforms.srcAlphaBlendProperty, fullscreenData.srcAlphaBlendMode); + collector.AddEnumProperty(FullscreenUniforms.dstAlphaBlendProperty, fullscreenData.dstAlphaBlendMode); + collector.AddEnumProperty(FullscreenUniforms.colorBlendOperationProperty, fullscreenData.colorBlendOperation); + collector.AddEnumProperty(FullscreenUniforms.alphaBlendOperationProperty, fullscreenData.alphaBlendOperation); + } + collector.AddFloatProperty(FullscreenUniforms.depthWriteProperty, fullscreenData.depthWrite ? 1 : 0); + + if (fullscreenData.depthTestMode != CompareFunction.Disabled) + collector.AddFloatProperty(FullscreenUniforms.depthTestProperty, (float)fullscreenData.depthTestMode); + + // When stencil is disabled, we can't override + if (fullscreenData.enableStencil) + { + collector.AddBoolProperty(FullscreenUniforms.stencilEnableProperty, fullscreenData.enableStencil); + collector.AddIntProperty(FullscreenUniforms.stencilReferenceProperty, fullscreenData.stencilReference); + collector.AddIntProperty(FullscreenUniforms.stencilReadMaskProperty, fullscreenData.stencilReadMask); + collector.AddIntProperty(FullscreenUniforms.stencilWriteMaskProperty, fullscreenData.stencilWriteMask); + collector.AddEnumProperty(FullscreenUniforms.stencilComparisonProperty, fullscreenData.stencilCompareFunction); + collector.AddEnumProperty(FullscreenUniforms.stencilPassProperty, fullscreenData.stencilPassOperation); + collector.AddEnumProperty(FullscreenUniforms.stencilFailProperty, fullscreenData.stencilFailOperation); + collector.AddEnumProperty(FullscreenUniforms.stencilDepthFailProperty, fullscreenData.stencilDepthTestFailOperation); + } } } public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) { - // TODO: sub target specific options? + // TODO: cleanup + // context.AddProperty("Compatibility", new EnumField(fullscreenData.fullscreenMode) { value = fullscreenData.fullscreenMode }, (evt) => + // { + // if (Equals(fullscreenData.fullscreenMode, evt.newValue)) + // return; + + // registerUndo("Change Compatibility"); + // fullscreenData.fullscreenMode = (FullscreenMode)evt.newValue; + // onChange(); + // }); + + context.AddProperty("Allow Material Override", new Toggle() { value = fullscreenData.allowMaterialOverride }, (evt) => + { + if (Equals(fullscreenData.allowMaterialOverride, evt.newValue)) + return; + + registerUndo("Change Allow Material Override"); + fullscreenData.allowMaterialOverride = evt.newValue; + onChange(); + }); + + GetRenderStatePropertiesGUI(ref context, onChange, registerUndo); } - #region SubShader - static class SubShaders + public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) { - const string kFullscreenDrawProceduralInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl"; - const string kFullscreenBlitInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; - const string kCustomRenderTextureInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl"; - const string kFullscreenCommon = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl"; + context.AddProperty("Blend Mode", new EnumField(fullscreenData.blendMode) { value = fullscreenData.blendMode }, (evt) => + { + if (Equals(fullscreenData.blendMode, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + fullscreenData.blendMode = (FullscreenBlendMode)evt.newValue; + onChange(); + }); - static readonly KeywordDescriptor depthWriteKeywork = new KeywordDescriptor + if (fullscreenData.blendMode == FullscreenBlendMode.Custom) { - displayName = "Depth Write", - referenceName = "DEPTH_WRITE", - type = KeywordType.Boolean, - definition = KeywordDefinition.ShaderFeature, - stages = KeywordShaderStage.Fragment, - }; + context.globalIndentLevel++; + context.AddLabel("Color Blend Mode", 0); - public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) - { - var result = new SubShaderDescriptor() - { - generatesPreview = true, - passes = new PassCollection() - }; - - var fullscreenPass = new PassDescriptor - { - // Definition - displayName = "Fullscreen", - referenceName = "SHADERPASS_FULLSCREEN", - useInPreview = true, - - // Template - passTemplatePath = FullscreenTarget.kTemplatePath, - sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, - - // Port Mask - validVertexBlocks = new BlockFieldDescriptor[] - { - BlockFields.VertexDescription.Position - }, - validPixelBlocks = new BlockFieldDescriptor[] - { - FullscreenTarget.Blocks.color, - FullscreenTarget.Blocks.depth, - }, - - // Fields - structs = new StructCollection - { - { Structs.Attributes }, - { Structs.SurfaceDescriptionInputs }, - { FullscreenTarget.Varyings }, - { Structs.VertexDescriptionInputs }, - }, - fieldDependencies = FieldDependencies.Default, - requiredFields = new FieldCollection - { - StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code - StructFields.Varyings.texCoord0, - StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case - }, - - // Conditional State - renderStates = target.GetRenderState(), - pragmas = new PragmaCollection - { - { Pragma.Target(ShaderModel.Target30) }, - { Pragma.Vertex("vert") }, - { Pragma.Fragment("frag") }, - }, - defines = new DefineCollection - { - {depthWriteKeywork, 1, new FieldCondition(FullscreenTarget.Fields.depth, true)} - }, - keywords = new KeywordCollection(), - includes = new IncludeCollection - { - // Pre-graph - { CoreIncludes.preGraphIncludes }, - - // Post-graph - { kFullscreenCommon, IncludeLocation.Postgraph }, - }, - }; - - switch (target.fullscreenCompatibility) - { - default: - case FullscreenTarget.FullscreenCompatibility.Blit: - fullscreenPass.includes.Add(kFullscreenBlitInclude, IncludeLocation.Postgraph); - break; - case FullscreenTarget.FullscreenCompatibility.DrawProcedural: - fullscreenPass.includes.Add(kFullscreenDrawProceduralInclude, IncludeLocation.Postgraph); - break; - case FullscreenTarget.FullscreenCompatibility.CustomRenderTexture: - fullscreenPass.includes.Add(kCustomRenderTextureInclude, IncludeLocation.Postgraph); - break; - } + context.AddProperty("Src Color", new EnumField(fullscreenData.srcColorBlendMode) { value = fullscreenData.srcColorBlendMode }, (evt) => + { + if (Equals(fullscreenData.srcColorBlendMode, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + fullscreenData.srcColorBlendMode = (BlendMode)evt.newValue; + onChange(); + }); + context.AddProperty("Dst Color", new EnumField(fullscreenData.dstColorBlendMode) { value = fullscreenData.dstColorBlendMode }, (evt) => + { + if (Equals(fullscreenData.dstColorBlendMode, evt.newValue)) + return; - result.passes.Add(fullscreenPass); + registerUndo("Change Blend Mode"); + fullscreenData.dstColorBlendMode = (BlendMode)evt.newValue; + onChange(); + }); + context.AddProperty("Color Operation", new EnumField(fullscreenData.colorBlendOperation) { value = fullscreenData.colorBlendOperation }, (evt) => + { + if (Equals(fullscreenData.colorBlendOperation, evt.newValue)) + return; - return result; + registerUndo("Change Blend Mode"); + fullscreenData.colorBlendOperation = (BlendOp)evt.newValue; + onChange(); + }); + + context.AddLabel("Alpha Blend Mode", 0); + + + context.AddProperty("Src", new EnumField(fullscreenData.srcAlphaBlendMode) { value = fullscreenData.srcAlphaBlendMode }, (evt) => + { + if (Equals(fullscreenData.srcAlphaBlendMode, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + fullscreenData.srcAlphaBlendMode = (BlendMode)evt.newValue; + onChange(); + }); + context.AddProperty("Dst", new EnumField(fullscreenData.dstAlphaBlendMode) { value = fullscreenData.dstAlphaBlendMode }, (evt) => + { + if (Equals(fullscreenData.dstAlphaBlendMode, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + fullscreenData.dstAlphaBlendMode = (BlendMode)evt.newValue; + onChange(); + }); + context.AddProperty("Blend Operation Alpha", new EnumField(fullscreenData.alphaBlendOperation) { value = fullscreenData.alphaBlendOperation }, (evt) => + { + if (Equals(fullscreenData.alphaBlendOperation, evt.newValue)) + return; + + registerUndo("Change Blend Mode"); + fullscreenData.alphaBlendOperation = (BlendOp)evt.newValue; + onChange(); + }); + + context.globalIndentLevel--; } + + context.AddProperty("Enable Stencil", new Toggle { value = fullscreenData.enableStencil }, (evt) => + { + if (Equals(fullscreenData.enableStencil, evt.newValue)) + return; + + registerUndo("Change Enable Stencil"); + fullscreenData.enableStencil = evt.newValue; + onChange(); + }); + + if (fullscreenData.enableStencil) + { + context.globalIndentLevel++; + + context.AddProperty("Reference", new IntegerField { value = fullscreenData.stencilReference, isDelayed = true }, (evt) => + { + if (Equals(fullscreenData.stencilReference, evt.newValue)) + return; + + registerUndo("Change Stencil Reference"); + fullscreenData.stencilReference = evt.newValue; + onChange(); + }); + + context.AddProperty("Read Mask", new IntegerField { value = fullscreenData.stencilReadMask, isDelayed = true }, (evt) => + { + if (Equals(fullscreenData.stencilReadMask, evt.newValue)) + return; + + registerUndo("Change Stencil Read Mask"); + fullscreenData.stencilReadMask = evt.newValue; + onChange(); + }); + + context.AddProperty("Write Mask", new IntegerField { value = fullscreenData.stencilWriteMask, isDelayed = true }, (evt) => + { + if (Equals(fullscreenData.stencilWriteMask, evt.newValue)) + return; + + registerUndo("Change Stencil Write Mask"); + fullscreenData.stencilWriteMask = evt.newValue; + onChange(); + }); + + context.AddProperty("Comparison", new EnumField(fullscreenData.stencilCompareFunction) { value = fullscreenData.stencilCompareFunction }, (evt) => + { + if (Equals(fullscreenData.stencilCompareFunction, evt.newValue)) + return; + + registerUndo("Change Stencil Comparison"); + fullscreenData.stencilCompareFunction = (CompareFunction)evt.newValue; + onChange(); + }); + + context.AddProperty("Pass", new EnumField(fullscreenData.stencilPassOperation) { value = fullscreenData.stencilPassOperation }, (evt) => + { + if (Equals(fullscreenData.stencilPassOperation, evt.newValue)) + return; + + registerUndo("Change Stencil Pass Operation"); + fullscreenData.stencilPassOperation = (StencilOp)evt.newValue; + onChange(); + }); + + context.AddProperty("Fail", new EnumField(fullscreenData.stencilFailOperation) { value = fullscreenData.stencilFailOperation }, (evt) => + { + if (Equals(fullscreenData.stencilFailOperation, evt.newValue)) + return; + + registerUndo("Change Stencil Fail Operation"); + fullscreenData.stencilFailOperation = (StencilOp)evt.newValue; + onChange(); + }); + + context.AddProperty("Depth Fail", new EnumField(fullscreenData.stencilDepthTestFailOperation) { value = fullscreenData.stencilDepthTestFailOperation }, (evt) => + { + if (Equals(fullscreenData.stencilDepthTestFailOperation, evt.newValue)) + return; + + registerUndo("Change Stencil Depth Fail Operation"); + fullscreenData.stencilDepthTestFailOperation = (StencilOp)evt.newValue; + onChange(); + }); + + context.globalIndentLevel--; + } + + context.AddProperty("Depth Test", new EnumField(fullscreenData.depthTestMode) { value = fullscreenData.depthTestMode }, (evt) => + { + if (Equals(fullscreenData.depthTestMode, evt.newValue)) + return; + + registerUndo("Change Depth Test"); + fullscreenData.depthTestMode = (CompareFunction)evt.newValue; + onChange(); + }); + + context.AddProperty("Depth Write", new Toggle { value = fullscreenData.depthWrite }, (evt) => + { + if (Equals(fullscreenData.depthWrite, evt.newValue)) + return; + + registerUndo("Change Depth Test"); + fullscreenData.depthWrite = evt.newValue; + onChange(); + }); + + } + + #region SubShader + static class SubShaders + { + } #endregion } + + internal static class FullscreenPropertyCollectorExtension + { + public static void AddEnumProperty(this PropertyCollector collector, string prop, T value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) where T : Enum + { + collector.AddShaderProperty(new Vector1ShaderProperty + { + floatType = FloatType.Enum, + enumType = EnumType.CSharpEnum, + cSharpEnumType = typeof(T), + hidden = true, + overrideHLSLDeclaration = true, + hlslDeclarationOverride = hlslDeclaration, + value = Convert.ToInt32(value), + overrideReferenceName = prop, + }); + } + + public static void AddIntProperty(this PropertyCollector collector, string prop, int value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) + { + collector.AddShaderProperty(new Vector1ShaderProperty + { + floatType = FloatType.Integer, + hidden = true, + overrideHLSLDeclaration = true, + hlslDeclarationOverride = hlslDeclaration, + value = value, + overrideReferenceName = prop, + }); + } + + public static void AddBoolProperty(this PropertyCollector collector, string prop, bool value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) + { + collector.AddShaderProperty(new BooleanShaderProperty + { + hidden = true, + overrideHLSLDeclaration = true, + hlslDeclarationOverride = hlslDeclaration, + value = value, + overrideReferenceName = prop, + }); + } + } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs index 985a92421da..472afe2c461 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs @@ -15,876 +15,811 @@ namespace UnityEditor.Rendering.Fullscreen.ShaderGraph { - public enum FullscreenBlendMode + interface IIsNodeAllowedBySubTarget { - Disabled, - Alpha, - Premultiply, - Additive, - Multiply, - Custom, + bool IsNodeAllowedByTarget(Type nodeType); } - sealed class FullscreenTarget : Target, IHasMetadata, IMaySupportVFX - { - [GenerateBlocks] - public struct Blocks - { - // TODO: add optional depth write block - public static BlockFieldDescriptor color = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Color", "Color", - "SURFACEDESCRIPTION_COLOR", new ColorRGBAControl(UnityEngine.Color.grey), ShaderStage.Fragment); - public static BlockFieldDescriptor depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Depth", "Depth", - "SURFACEDESCRIPTION_DEPTH", new FloatControl(0), ShaderStage.Fragment); - } - - public enum FullscreenCompatibility - { - Blit, - DrawProcedural, - CustomRenderTexture, - } - - [GenerationAPI] - public struct Fields - { - public static FieldDescriptor depth = new FieldDescriptor("OUTPUT", "depth", "OUTPUT_DEPTH"); - } - - public static class Uniforms - { - public static readonly string blendModeProperty = "_Fullscreen_BlendMode"; - public static readonly string srcColorBlendProperty = "_Fullscreen_SrcColorBlend"; - public static readonly string dstColorBlendProperty = "_Fullscreen_DstColorBlend"; - public static readonly string srcAlphaBlendProperty = "_Fullscreen_SrcAlphaBlend"; - public static readonly string dstAlphaBlendProperty = "_Fullscreen_DstAlphaBlend"; - public static readonly string colorBlendOperationProperty = "_Fullscreen_ColorBlendOperation"; - public static readonly string alphaBlendOperationProperty = "_Fullscreen_AlphaBlendOperation"; - public static readonly string depthWriteProperty = "_Fullscreen_DepthWrite"; - public static readonly string depthTestProperty = "_Fullscreen_DepthTest"; - public static readonly string stencilEnableProperty = "_Fullscreen_Stencil"; - public static readonly string stencilReferenceProperty = "_Fullscreen_StencilReference"; - public static readonly string stencilReadMaskProperty = "_Fullscreen_StencilReadMask"; - public static readonly string stencilWriteMaskProperty = "_Fullscreen_StencilWriteMask"; - public static readonly string stencilComparisonProperty = "_Fullscreen_StencilComparison"; - public static readonly string stencilPassProperty = "_Fullscreen_StencilPass"; - public static readonly string stencilFailProperty = "_Fullscreen_StencilFail"; - public static readonly string stencilDepthFailProperty = "_Fullscreen_StencilDepthFail"; - - public static readonly string srcColorBlend = "[" + srcColorBlendProperty + "]"; - public static readonly string dstColorBlend = "[" + dstColorBlendProperty + "]"; - public static readonly string srcAlphaBlend = "[" + srcAlphaBlendProperty + "]"; - public static readonly string dstAlphaBlend = "[" + dstAlphaBlendProperty + "]"; - public static readonly string colorBlendOperation = "[" + colorBlendOperationProperty + "]"; - public static readonly string alphaBlendOperation = "[" + alphaBlendOperationProperty + "]"; - public static readonly string depthWrite = "[" + depthWriteProperty + "]"; - public static readonly string depthTest = "[" + depthTestProperty + "]"; - public static readonly string stencilReference = "[" + stencilReferenceProperty + "]"; - public static readonly string stencilReadMask = "[" + stencilReadMaskProperty + "]"; - public static readonly string stencilWriteMask = "[" + stencilWriteMaskProperty + "]"; - public static readonly string stencilComparison = "[" + stencilComparisonProperty + "]"; - public static readonly string stencilPass = "[" + stencilPassProperty + "]"; - public static readonly string stencilFail = "[" + stencilFailProperty + "]"; - public static readonly string stencilDepthFail = "[" + stencilDepthFailProperty + "]"; - } - - public override int latestVersion => 0; - - // Constants - static readonly GUID kSourceCodeGuid = new GUID("11771342b6f6ab840ba9e2274ddd9db3"); // FullscreenTarget.cs - public static readonly string[] kSharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories().Union(new string[] { "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates" }).ToArray(); - public const string kTemplatePath = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template"; - - // SubTarget - List m_SubTargets; - List m_SubTargetNames; - int activeSubTargetIndex => m_SubTargets.IndexOf(m_ActiveSubTarget); - - // View - PopupField m_SubTargetField; - TextField m_CustomGUIField; - - [SerializeField] - JsonData m_ActiveSubTarget; - - [SerializeField] - FullscreenCompatibility m_fullscreenCompatibility; - - // When checked, allows the material to control ALL surface settings (uber shader style) - [SerializeField] - bool m_AllowMaterialOverride = false; - - [SerializeField] - FullscreenBlendMode m_BlendMode = FullscreenBlendMode.Disabled; - - [SerializeField] - BlendMode m_SrcColorBlendMode = BlendMode.Zero; - [SerializeField] - BlendMode m_DstColorBlendMode = BlendMode.One; - [SerializeField] - BlendOp m_ColorBlendOperation = BlendOp.Add; - - [SerializeField] - BlendMode m_SrcAlphaBlendMode = BlendMode.Zero; - [SerializeField] - BlendMode m_DstAlphaBlendMode = BlendMode.One; - [SerializeField] - BlendOp m_AlphaBlendOperation = BlendOp.Add; - - [SerializeField] - bool m_EnableStencil = false; - [SerializeField] - int m_StencilReference = 0; - [SerializeField] - int m_StencilReadMask = 255; - [SerializeField] - int m_StencilWriteMask = 255; - [SerializeField] - CompareFunction m_StencilCompareFunction = CompareFunction.Always; - [SerializeField] - StencilOp m_StencilPassOperation = StencilOp.Keep; - [SerializeField] - StencilOp m_StencilFailOperation = StencilOp.Keep; - [SerializeField] - StencilOp m_StencilDepthFailOperation = StencilOp.Keep; - - [SerializeField] - bool m_DepthWrite = false; - - [SerializeField] - ZTestMode m_DepthTestMode = ZTestMode.Always; - - [SerializeField] - string m_CustomEditorGUI; - - internal override bool ignoreCustomInterpolators => true; - internal override int padCustomInterpolatorLimit => 4; - - public FullscreenTarget() - { - displayName = "Fullscreen"; - m_SubTargets = TargetUtils.GetSubTargets(this); - m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList(); - TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); - } - - public FullscreenCompatibility fullscreenCompatibility - { - get => m_fullscreenCompatibility; - set => m_fullscreenCompatibility = value; - } - - public FullscreenBlendMode blendMode - { - get => m_BlendMode; - set => m_BlendMode = value; - } - - public BlendMode srcColorBlendMode - { - get => m_SrcColorBlendMode; - set => m_SrcColorBlendMode = value; - } - - public BlendMode dstColorBlendMode - { - get => m_DstColorBlendMode; - set => m_DstColorBlendMode = value; - } - - public BlendOp colorBlendOperation - { - get => m_ColorBlendOperation; - set => m_ColorBlendOperation = value; - } - - public BlendMode srcAlphaBlendMode - { - get => m_SrcAlphaBlendMode; - set => m_SrcAlphaBlendMode = value; - } - - public BlendMode dstAlphaBlendMode - { - get => m_DstAlphaBlendMode; - set => m_DstAlphaBlendMode = value; - } - - public BlendOp alphaBlendOperation - { - get => m_AlphaBlendOperation; - set => m_AlphaBlendOperation = value; - } - - public bool enableStencil - { - get => m_EnableStencil; - set => m_EnableStencil = value; - } - - public int stencilReference - { - get => m_StencilReference; - set => m_StencilReference = Mathf.Clamp(value, 0, 255); - } - - public int stencilReadMask - { - get => m_StencilReadMask; - set => m_StencilReadMask = Mathf.Clamp(value, 0, 255); - } - - public int stencilWriteMask - { - get => m_StencilWriteMask; - set => m_StencilWriteMask = Mathf.Clamp(value, 0, 255); - } - - public CompareFunction stencilCompareFunction - { - get => m_StencilCompareFunction; - set => m_StencilCompareFunction = value; - } - - public StencilOp stencilPassOperation - { - get => m_StencilPassOperation; - set => m_StencilPassOperation = value; - } - - public StencilOp stencilFailOperation - { - get => m_StencilFailOperation; - set => m_StencilFailOperation = value; - } - - public StencilOp stencilDepthTestFailOperation - { - get => m_StencilDepthFailOperation; - set => m_StencilDepthFailOperation = value; - } - - public bool depthWrite - { - get => m_DepthWrite; - set => m_DepthWrite = value; - } - - public SubTarget activeSubTarget - { - get => m_ActiveSubTarget.value; - set => m_ActiveSubTarget = value; - } - - public bool allowMaterialOverride - { - get => m_AllowMaterialOverride; - set => m_AllowMaterialOverride = value; - } - - public ZTestMode depthTestMode - { - get => m_DepthTestMode; - set => m_DepthTestMode = value; - } - - public string customEditorGUI - { - get => m_CustomEditorGUI; - set => m_CustomEditorGUI = value; - } - - public override bool IsActive() => activeSubTarget.IsActive(); - - public override bool IsNodeAllowedByTarget(Type nodeType) - { - bool allowed = true; - SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); - - // Nodes with SRP specific code doesn't work in the fullscreen target. - allowed &= srpFilter == null; - - var interfaces = nodeType.GetInterfaces(); - // FIXME: allow to sample depth and color in a fullscreen node (needed to compute position) - if (interfaces.Contains(typeof(IMayRequirePosition))) - allowed = false; - if (interfaces.Contains(typeof(IMayRequirePositionPredisplacement))) - allowed = false; - if (interfaces.Contains(typeof(IMayRequireCameraOpaqueTexture))) - allowed = false; - if (interfaces.Contains(typeof(IMayRequireDepthTexture))) - allowed = false; - - // TODO: add a node to sample the normal buffer: - if (interfaces.Contains(typeof(IMayRequireNormal))) - allowed = false; - - // We don't have access to the tangent in fullscreen - if (interfaces.Contains(typeof(IMayRequireTangent))) - allowed = false; - if (interfaces.Contains(typeof(IMayRequireBitangent))) - allowed = false; - - // There is no input in the vertex block for now - if (interfaces.Contains(typeof(IMayRequireVertexColor))) - allowed = false; - if (interfaces.Contains(typeof(IMayRequireVertexID))) - allowed = false; - if (interfaces.Contains(typeof(IMayRequireVertexSkinning))) - allowed = false; - - // TODO: this is a workaround for all classes that inherit from CodeFunctionNode but doesn't need forbidden inputs - if (typeof(CodeFunctionNode).IsAssignableFrom(nodeType)) - allowed = true; - - if (fullscreenCompatibility == FullscreenCompatibility.CustomRenderTexture) - { - // We can't sample scene info in custom render textures, they are executed outside the pipeline (for now) - allowed &= nodeType != typeof(SceneColorNode); - allowed &= nodeType != typeof(SceneDepthNode); - } - - return allowed && base.IsNodeAllowedByTarget(nodeType); - } - - public override void Setup(ref TargetSetupContext context) - { - // Setup the Target - context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); - - // Setup the active SubTarget - TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); - if (m_ActiveSubTarget.value == null) - return; - m_ActiveSubTarget.value.target = this; - m_ActiveSubTarget.value.Setup(ref context); - - // Override EditorGUI - if (!string.IsNullOrEmpty(m_CustomEditorGUI)) - { - context.SetDefaultShaderGUI(m_CustomEditorGUI); - } - } - - public override void OnAfterMultiDeserialize(string json) - { - TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); - m_ActiveSubTarget.value.target = this; - } - - public override void GetFields(ref TargetFieldContext context) - { - var descs = context.blocks.Select(x => x.descriptor); - - context.AddField(UnityEditor.ShaderGraph.Fields.GraphPixel); - context.AddField(Fields.depth, depthWrite); - - // SubTarget fields - m_ActiveSubTarget.value.GetFields(ref context); - } - - public override void GetActiveBlocks(ref TargetActiveBlockContext context) - { - // Core blocks - context.AddBlock(Blocks.color); - context.AddBlock(Blocks.depth, depthWrite); - - // SubTarget blocks - m_ActiveSubTarget.value.GetActiveBlocks(ref context); - } - - public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) - { - base.CollectShaderProperties(collector, generationMode); - activeSubTarget.CollectShaderProperties(collector, generationMode); - } - - public void CollectRenderStateShaderProperties(PropertyCollector collector, GenerationMode generationMode) - { - if (generationMode != GenerationMode.Preview && allowMaterialOverride) - { - // When blend mode is disabled, we can't override - if (blendMode != FullscreenBlendMode.Disabled) - { - collector.AddEnumProperty(Uniforms.blendModeProperty, blendMode); - collector.AddEnumProperty(Uniforms.srcColorBlendProperty, srcColorBlendMode); - collector.AddEnumProperty(Uniforms.dstColorBlendProperty, dstColorBlendMode); - collector.AddEnumProperty(Uniforms.srcAlphaBlendProperty, srcAlphaBlendMode); - collector.AddEnumProperty(Uniforms.dstAlphaBlendProperty, dstAlphaBlendMode); - collector.AddEnumProperty(Uniforms.colorBlendOperationProperty, colorBlendOperation); - collector.AddEnumProperty(Uniforms.alphaBlendOperationProperty, alphaBlendOperation); - } - collector.AddFloatProperty(Uniforms.depthWriteProperty, depthWrite ? 1 : 0); - collector.AddFloatProperty(Uniforms.depthTestProperty, (float)depthTestMode); - - // When stencil is disabled, we can't override - if (enableStencil) - { - collector.AddBoolProperty(Uniforms.stencilEnableProperty, enableStencil); - collector.AddIntProperty(Uniforms.stencilReferenceProperty, stencilReference); - collector.AddIntProperty(Uniforms.stencilReadMaskProperty, stencilReadMask); - collector.AddIntProperty(Uniforms.stencilWriteMaskProperty, stencilWriteMask); - collector.AddEnumProperty(Uniforms.stencilComparisonProperty, stencilCompareFunction); - collector.AddEnumProperty(Uniforms.stencilPassProperty, stencilPassOperation); - collector.AddEnumProperty(Uniforms.stencilFailProperty, stencilFailOperation); - collector.AddEnumProperty(Uniforms.stencilDepthFailProperty, stencilDepthTestFailOperation); - } - } - } - - public override void ProcessPreviewMaterial(Material material) - { - m_ActiveSubTarget.value.ProcessPreviewMaterial(material); - } - - public override object saveContext => m_ActiveSubTarget.value?.saveContext; - - public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) - { - if (m_ActiveSubTarget.value == null) - return; - - context.AddProperty("Compatibility", new EnumField(fullscreenCompatibility) { value = fullscreenCompatibility }, (evt) => - { - if (Equals(fullscreenCompatibility, evt.newValue)) - return; - - registerUndo("Change Compatibility"); - fullscreenCompatibility = (FullscreenCompatibility)evt.newValue; - onChange(); - }); - - context.AddProperty("Allow Material Override", new Toggle() { value = allowMaterialOverride }, (evt) => - { - if (Equals(allowMaterialOverride, evt.newValue)) - return; - - registerUndo("Change Allow Material Override"); - allowMaterialOverride = evt.newValue; - onChange(); - }); - - GetRenderStatePropertiesGUI(ref context, onChange, registerUndo); - - // SubTarget properties - m_ActiveSubTarget.value.GetPropertiesGUI(ref context, onChange, registerUndo); - - // Custom Editor GUI - // Requires FocusOutEvent - m_CustomGUIField = new TextField("") { value = customEditorGUI }; - m_CustomGUIField.RegisterCallback(s => - { - if (Equals(customEditorGUI, m_CustomGUIField.value)) - return; - - registerUndo("Change Custom Editor GUI"); - customEditorGUI = m_CustomGUIField.value; - onChange(); - }); - context.AddProperty("Custom Editor GUI", m_CustomGUIField, (evt) => { }); - } - - public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) - { - context.AddProperty("Blend Mode", new EnumField(blendMode) { value = blendMode }, (evt) => - { - if (Equals(blendMode, evt.newValue)) - return; - - registerUndo("Change Blend Mode"); - blendMode = (FullscreenBlendMode)evt.newValue; - onChange(); - }); - - if (blendMode == FullscreenBlendMode.Custom) - { - context.globalIndentLevel++; - context.AddLabel("Color Blend Mode", 0); - - context.AddProperty("Src Color", new EnumField(srcColorBlendMode) { value = srcColorBlendMode }, (evt) => - { - if (Equals(srcColorBlendMode, evt.newValue)) - return; - - registerUndo("Change Blend Mode"); - srcColorBlendMode = (BlendMode)evt.newValue; - onChange(); - }); - context.AddProperty("Dst Color", new EnumField(dstColorBlendMode) { value = dstColorBlendMode }, (evt) => - { - if (Equals(dstColorBlendMode, evt.newValue)) - return; - - registerUndo("Change Blend Mode"); - dstColorBlendMode = (BlendMode)evt.newValue; - onChange(); - }); - context.AddProperty("Color Operation", new EnumField(colorBlendOperation) { value = colorBlendOperation }, (evt) => - { - if (Equals(colorBlendOperation, evt.newValue)) - return; - - registerUndo("Change Blend Mode"); - colorBlendOperation = (BlendOp)evt.newValue; - onChange(); - }); - - context.AddLabel("Alpha Blend Mode", 0); - - - context.AddProperty("Src", new EnumField(srcAlphaBlendMode) { value = srcAlphaBlendMode }, (evt) => - { - if (Equals(srcAlphaBlendMode, evt.newValue)) - return; - - registerUndo("Change Blend Mode"); - srcAlphaBlendMode = (BlendMode)evt.newValue; - onChange(); - }); - context.AddProperty("Dst", new EnumField(dstAlphaBlendMode) { value = dstAlphaBlendMode }, (evt) => - { - if (Equals(dstAlphaBlendMode, evt.newValue)) - return; - - registerUndo("Change Blend Mode"); - dstAlphaBlendMode = (BlendMode)evt.newValue; - onChange(); - }); - context.AddProperty("Blend Operation Alpha", new EnumField(alphaBlendOperation) { value = alphaBlendOperation }, (evt) => - { - if (Equals(alphaBlendOperation, evt.newValue)) - return; - - registerUndo("Change Blend Mode"); - alphaBlendOperation = (BlendOp)evt.newValue; - onChange(); - }); - - context.globalIndentLevel--; - } - - context.AddProperty("Enable Stencil", new Toggle { value = enableStencil }, (evt) => - { - if (Equals(enableStencil, evt.newValue)) - return; - - registerUndo("Change Enable Stencil"); - enableStencil = evt.newValue; - onChange(); - }); - - if (enableStencil) - { - context.globalIndentLevel++; - - context.AddProperty("Reference", new IntegerField { value = stencilReference, isDelayed = true }, (evt) => - { - if (Equals(stencilReference, evt.newValue)) - return; - - registerUndo("Change Stencil Reference"); - stencilReference = evt.newValue; - onChange(); - }); - - context.AddProperty("Read Mask", new IntegerField { value = stencilReadMask, isDelayed = true }, (evt) => - { - if (Equals(stencilReadMask, evt.newValue)) - return; - - registerUndo("Change Stencil Read Mask"); - stencilReadMask = evt.newValue; - onChange(); - }); - - context.AddProperty("Write Mask", new IntegerField { value = stencilWriteMask, isDelayed = true }, (evt) => - { - if (Equals(stencilWriteMask, evt.newValue)) - return; - - registerUndo("Change Stencil Write Mask"); - stencilWriteMask = evt.newValue; - onChange(); - }); - - context.AddProperty("Comparison", new EnumField(stencilCompareFunction) { value = stencilCompareFunction }, (evt) => - { - if (Equals(stencilCompareFunction, evt.newValue)) - return; - - registerUndo("Change Stencil Comparison"); - stencilCompareFunction = (CompareFunction)evt.newValue; - onChange(); - }); - - context.AddProperty("Pass", new EnumField(stencilPassOperation) { value = stencilPassOperation }, (evt) => - { - if (Equals(stencilPassOperation, evt.newValue)) - return; - - registerUndo("Change Stencil Pass Operation"); - stencilPassOperation = (StencilOp)evt.newValue; - onChange(); - }); - - context.AddProperty("Fail", new EnumField(stencilFailOperation) { value = stencilFailOperation }, (evt) => - { - if (Equals(stencilFailOperation, evt.newValue)) - return; - - registerUndo("Change Stencil Fail Operation"); - stencilFailOperation = (StencilOp)evt.newValue; - onChange(); - }); - - context.AddProperty("Depth Fail", new EnumField(stencilDepthTestFailOperation) { value = stencilDepthTestFailOperation }, (evt) => - { - if (Equals(stencilDepthTestFailOperation, evt.newValue)) - return; - - registerUndo("Change Stencil Depth Fail Operation"); - stencilDepthTestFailOperation = (StencilOp)evt.newValue; - onChange(); - }); - - context.globalIndentLevel--; - } - - context.AddProperty("Depth Test", new EnumField(ZTestMode.LEqual) { value = depthTestMode }, (evt) => - { - if (Equals(depthTestMode, evt.newValue)) - return; - - registerUndo("Change Depth Test"); - depthTestMode = (ZTestMode)evt.newValue; - onChange(); - }); - - context.AddProperty("Depth Write", new Toggle { value = depthWrite }, (evt) => - { - if (Equals(depthTestMode, evt.newValue)) - return; - - registerUndo("Change Depth Test"); - depthWrite = evt.newValue; - onChange(); - }); - - } - - public bool TrySetActiveSubTarget(Type subTargetType) - { - if (!subTargetType.IsSubclassOf(typeof(SubTarget))) - return false; - - foreach (var subTarget in m_SubTargets) - { - if (subTarget.GetType().Equals(subTargetType)) - { - m_ActiveSubTarget = subTarget; - return true; - } - } - - return false; - } - - // The fullscreen target is compatible with all pipeline (it doesn't rely on any RP rendering feature) - public override bool WorksWithSRP(RenderPipelineAsset scriptableRenderPipeline) => true; - - public override void OnAfterDeserialize(string json) - { - base.OnAfterDeserialize(json); - - if (this.sgVersion < latestVersion) - { - ChangeVersion(latestVersion); - } - } - - public bool SupportsVFX() => false; - public bool CanSupportVFX() => false; - - string IHasMetadata.identifier - { - get - { - // defer to subtarget - if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData) - return subTargetHasMetaData.identifier; - return null; - } - } - - ScriptableObject IHasMetadata.GetMetadataObject() - { - // defer to subtarget - if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData) - return subTargetHasMetaData.GetMetadataObject(); - return null; - } - - public static StructDescriptor Varyings = new StructDescriptor() - { - name = "Varyings", - packFields = true, - populateWithCustomInterpolators = false, - fields = new FieldDescriptor[] - { - StructFields.Varyings.positionCS, - StructFields.Varyings.texCoord0, - StructFields.Varyings.instanceID, - BuiltInStructFields.Varyings.stereoTargetEyeIndexAsBlendIdx0, - BuiltInStructFields.Varyings.stereoTargetEyeIndexAsRTArrayIdx, - } - }; - - - public RenderStateCollection GetRenderState() - { - var result = new RenderStateCollection(); - - if (allowMaterialOverride) - { - result.Add(RenderState.ZTest(Uniforms.depthTest)); - result.Add(RenderState.ZWrite(Uniforms.depthWrite)); - if (blendMode != FullscreenBlendMode.Disabled) - { - result.Add(RenderState.Blend(Uniforms.srcColorBlend, Uniforms.dstColorBlend, Uniforms.srcAlphaBlend, Uniforms.dstAlphaBlend)); - result.Add(RenderState.BlendOp(Uniforms.colorBlendOperation, Uniforms.alphaBlendOperation)); - } - else - { - result.Add(RenderState.Blend("Blend Off")); - } - - if (enableStencil) - { - result.Add(RenderState.Stencil(new StencilDescriptor { Ref = Uniforms.stencilReference, ReadMask = Uniforms.stencilReadMask, WriteMask = Uniforms.stencilWriteMask, Comp = Uniforms.stencilComparison, ZFail = Uniforms.stencilDepthFail, Fail = Uniforms.stencilFail, Pass = Uniforms.stencilPass })); - } - - return result; - } - else - { - result.Add(RenderState.ZTest(depthTestMode.ToString())); - result.Add(RenderState.ZWrite(depthWrite.ToString())); - - // Blend mode - if (blendMode == FullscreenBlendMode.Alpha) - result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); - else if (blendMode == FullscreenBlendMode.Premultiply) - result.Add(RenderState.Blend(Blend.One, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); - else if (blendMode == FullscreenBlendMode.Additive) - result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); - else if (blendMode == FullscreenBlendMode.Multiply) - result.Add(RenderState.Blend(Blend.DstColor, Blend.Zero)); - else if (blendMode == FullscreenBlendMode.Disabled) - result.Add(RenderState.Blend("Blend Off")); - else - { - result.Add(RenderState.Blend(BlendModeToBlend(srcColorBlendMode), BlendModeToBlend(dstColorBlendMode), BlendModeToBlend(srcAlphaBlendMode), BlendModeToBlend(dstAlphaBlendMode))); - result.Add(RenderState.BlendOp(colorBlendOperation, alphaBlendOperation)); - } - - result.Add(RenderState.Stencil(new StencilDescriptor - { - Ref = stencilReference.ToString(), - ReadMask = stencilReadMask.ToString(), - WriteMask = stencilWriteMask.ToString(), - Comp = stencilCompareFunction.ToString(), - ZFail = stencilDepthTestFailOperation.ToString(), - Fail = stencilFailOperation.ToString(), - Pass = stencilPassOperation.ToString(), - })); - } - - return result; - } - - Blend BlendModeToBlend(BlendMode mode) => mode switch - { - BlendMode.Zero => Blend.Zero, - BlendMode.One => Blend.One, - BlendMode.DstColor => Blend.DstColor, - BlendMode.SrcColor => Blend.SrcColor, - BlendMode.OneMinusDstColor => Blend.OneMinusDstColor, - BlendMode.SrcAlpha => Blend.SrcAlpha, - BlendMode.OneMinusSrcColor => Blend.OneMinusSrcColor, - BlendMode.DstAlpha => Blend.DstAlpha, - BlendMode.OneMinusDstAlpha => Blend.OneMinusDstAlpha, - BlendMode.SrcAlphaSaturate => Blend.SrcAlpha, - BlendMode.OneMinusSrcAlpha => Blend.OneMinusSrcAlpha, - _ => Blend.Zero - }; - - } - - #region Includes - static class CoreIncludes - { - const string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; - const string kColor = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"; - const string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; - const string kInstancing = "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"; - const string kSpaceTransforms = "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"; - const string kShaderGraphFunctions = "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl"; - const string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"; - const string kShaderVariables = "Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariables.hlsl"; - - public static readonly IncludeCollection preGraphIncludes = new IncludeCollection - { - { kCommon, IncludeLocation.Pregraph }, - { kColor, IncludeLocation.Pregraph }, - { kTexture, IncludeLocation.Pregraph }, - { kInstancing, IncludeLocation.Pregraph }, // For VR - { kShaderVariables, IncludeLocation.Pregraph }, - { kSpaceTransforms, IncludeLocation.Pregraph }, - { kFunctions, IncludeLocation.Pregraph }, - }; - } - #endregion - - internal static class FullscreenPropertyCollectorExtension - { - public static void AddEnumProperty(this PropertyCollector collector, string prop, T value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) where T : Enum - { - collector.AddShaderProperty(new Vector1ShaderProperty - { - floatType = FloatType.Enum, - enumType = EnumType.CSharpEnum, - cSharpEnumType = typeof(T), - hidden = true, - overrideHLSLDeclaration = true, - hlslDeclarationOverride = hlslDeclaration, - value = Convert.ToInt32(value), - overrideReferenceName = prop, - }); - } - - public static void AddIntProperty(this PropertyCollector collector, string prop, int value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) - { - collector.AddShaderProperty(new Vector1ShaderProperty - { - floatType = FloatType.Integer, - hidden = true, - overrideHLSLDeclaration = true, - hlslDeclarationOverride = hlslDeclaration, - value = value, - overrideReferenceName = prop, - }); - } - - public static void AddBoolProperty(this PropertyCollector collector, string prop, bool value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) - { - collector.AddShaderProperty(new BooleanShaderProperty - { - hidden = true, - overrideHLSLDeclaration = true, - hlslDeclarationOverride = hlslDeclaration, - value = value, - overrideReferenceName = prop, - }); - } - } + // class FullscreenTarget : Target, IHasMetadata, IMaySupportVFX + // { + // public override int latestVersion => 0; + + // // Constants + // static readonly GUID kSourceCodeGuid = new GUID("11771342b6f6ab840ba9e2274ddd9db3"); // FullscreenTarget.cs + // public static readonly string[] kSharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories().Union(new string[] { "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates" }).ToArray(); + + // // SubTarget + // List m_SubTargets; + // List m_SubTargetNames; + // int activeSubTargetIndex => m_SubTargets.IndexOf(m_ActiveSubTarget); + + // // View + // PopupField m_SubTargetField; + // TextField m_CustomGUIField; + + // [SerializeField] + // JsonData m_ActiveSubTarget; + + // // [SerializeField] + // // FullscreenMode m_fullscreenMode; + + // // // When checked, allows the material to control ALL surface settings (uber shader style) + // // [SerializeField] + // // bool m_AllowMaterialOverride = false; + + // // [SerializeField] + // // FullscreenBlendMode m_BlendMode = FullscreenBlendMode.Disabled; + + // // [SerializeField] + // // BlendMode m_SrcColorBlendMode = BlendMode.Zero; + // // [SerializeField] + // // BlendMode m_DstColorBlendMode = BlendMode.One; + // // [SerializeField] + // // BlendOp m_ColorBlendOperation = BlendOp.Add; + + // // [SerializeField] + // // BlendMode m_SrcAlphaBlendMode = BlendMode.Zero; + // // [SerializeField] + // // BlendMode m_DstAlphaBlendMode = BlendMode.One; + // // [SerializeField] + // // BlendOp m_AlphaBlendOperation = BlendOp.Add; + + // // [SerializeField] + // // bool m_EnableStencil = false; + // // [SerializeField] + // // int m_StencilReference = 0; + // // [SerializeField] + // // int m_StencilReadMask = 255; + // // [SerializeField] + // // int m_StencilWriteMask = 255; + // // [SerializeField] + // // CompareFunction m_StencilCompareFunction = CompareFunction.Always; + // // [SerializeField] + // // StencilOp m_StencilPassOperation = StencilOp.Keep; + // // [SerializeField] + // // StencilOp m_StencilFailOperation = StencilOp.Keep; + // // [SerializeField] + // // StencilOp m_StencilDepthFailOperation = StencilOp.Keep; + + // // [SerializeField] + // // bool m_DepthWrite = false; + + // // [SerializeField] + // ZTestMode m_DepthTestMode = ZTestMode.Always; + + // // [SerializeField] + // // string m_CustomEditorGUI; + + // // internal override bool ignoreCustomInterpolators => true; + // // internal override int padCustomInterpolatorLimit => 4; + + // public FullscreenTarget() + // { + // displayName = "Fullscreen"; + // m_SubTargets = TargetUtils.GetSubTargets(this); + // m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList(); + // TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + // } + + // // public FullscreenMode fullscreenMode + // // { + // // get => m_fullscreenMode; + // // set => m_fullscreenMode = value; + // // } + + // // public FullscreenBlendMode blendMode + // // { + // // get => m_BlendMode; + // // set => m_BlendMode = value; + // // } + + // // public BlendMode srcColorBlendMode + // // { + // // get => m_SrcColorBlendMode; + // // set => m_SrcColorBlendMode = value; + // // } + + // // public BlendMode dstColorBlendMode + // // { + // // get => m_DstColorBlendMode; + // // set => m_DstColorBlendMode = value; + // // } + + // // public BlendOp colorBlendOperation + // // { + // // get => m_ColorBlendOperation; + // // set => m_ColorBlendOperation = value; + // // } + + // // public BlendMode srcAlphaBlendMode + // // { + // // get => m_SrcAlphaBlendMode; + // // set => m_SrcAlphaBlendMode = value; + // // } + + // // public BlendMode dstAlphaBlendMode + // // { + // // get => m_DstAlphaBlendMode; + // // set => m_DstAlphaBlendMode = value; + // // } + + // // public BlendOp alphaBlendOperation + // // { + // // get => m_AlphaBlendOperation; + // // set => m_AlphaBlendOperation = value; + // // } + + // // public bool enableStencil + // // { + // // get => m_EnableStencil; + // // set => m_EnableStencil = value; + // // } + + // // public int stencilReference + // // { + // // get => m_StencilReference; + // // set => m_StencilReference = Mathf.Clamp(value, 0, 255); + // // } + + // // public int stencilReadMask + // // { + // // get => m_StencilReadMask; + // // set => m_StencilReadMask = Mathf.Clamp(value, 0, 255); + // // } + + // // public int stencilWriteMask + // // { + // // get => m_StencilWriteMask; + // // set => m_StencilWriteMask = Mathf.Clamp(value, 0, 255); + // // } + + // // public CompareFunction stencilCompareFunction + // // { + // // get => m_StencilCompareFunction; + // // set => m_StencilCompareFunction = value; + // // } + + // // public StencilOp stencilPassOperation + // // { + // // get => m_StencilPassOperation; + // // set => m_StencilPassOperation = value; + // // } + + // // public StencilOp stencilFailOperation + // // { + // // get => m_StencilFailOperation; + // // set => m_StencilFailOperation = value; + // // } + + // // public StencilOp stencilDepthTestFailOperation + // // { + // // get => m_StencilDepthFailOperation; + // // set => m_StencilDepthFailOperation = value; + // // } + + // // public bool depthWrite + // // { + // // get => m_DepthWrite; + // // set => m_DepthWrite = value; + // // } + + // public SubTarget activeSubTarget + // { + // get => m_ActiveSubTarget.value; + // set => m_ActiveSubTarget = value; + // } + + // // public bool allowMaterialOverride + // // { + // // get => m_AllowMaterialOverride; + // // set => m_AllowMaterialOverride = value; + // // } + + // // public ZTestMode depthTestMode + // // { + // // get => m_DepthTestMode; + // // set => m_DepthTestMode = value; + // // } + + // // public string customEditorGUI + // // { + // // get => m_CustomEditorGUI; + // // set => m_CustomEditorGUI = value; + // // } + + // public override bool IsActive() => activeSubTarget.IsActive(); + + // public override bool IsNodeAllowedByTarget(Type nodeType) + // { + // bool allowed = true; + + // var interfaces = nodeType.GetInterfaces(); + // // FIXME: allow to sample depth and color in a fullscreen node (needed to compute position) + // if (interfaces.Contains(typeof(IMayRequirePosition))) + // allowed = false; + // if (interfaces.Contains(typeof(IMayRequirePositionPredisplacement))) + // allowed = false; + // if (interfaces.Contains(typeof(IMayRequireCameraOpaqueTexture))) + // allowed = false; + // if (interfaces.Contains(typeof(IMayRequireDepthTexture))) + // allowed = false; + + // // TODO: add a node to sample the normal buffer: + // if (interfaces.Contains(typeof(IMayRequireNormal))) + // allowed = false; + + // // We don't have access to the tangent in fullscreen + // if (interfaces.Contains(typeof(IMayRequireTangent))) + // allowed = false; + // if (interfaces.Contains(typeof(IMayRequireBitangent))) + // allowed = false; + + // // There is no input in the vertex block for now + // if (interfaces.Contains(typeof(IMayRequireVertexColor))) + // allowed = false; + // if (interfaces.Contains(typeof(IMayRequireVertexID))) + // allowed = false; + // if (interfaces.Contains(typeof(IMayRequireVertexSkinning))) + // allowed = false; + + // // TODO: this is a workaround for all classes that inherit from CodeFunctionNode but doesn't need forbidden inputs + // if (typeof(CodeFunctionNode).IsAssignableFrom(nodeType)) + // allowed = true; + + // if (fullscreenMode == FullscreenMode.CustomRenderTexture) + // { + // // We can't sample scene info in custom render textures, they are executed outside the pipeline (for now) + // allowed &= nodeType != typeof(SceneColorNode); + // allowed &= nodeType != typeof(SceneDepthNode); + // } + + // SubTargetFilterAttribute subTargetFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); + // bool worksWithThisSubTarget = subTargetFilter == null || subTargetFilter.subTargetTypes.Contains(activeSubTarget.GetType()); + + // var subTarget = activeSubTarget as IIsNodeAllowedBySubTarget; + + // return allowed && base.IsNodeAllowedByTarget(nodeType) && subTarget.IsNodeAllowedByTarget(nodeType); + // } + + // public override void Setup(ref TargetSetupContext context) + // { + // // Setup the Target + // context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); + + // // Setup the active SubTarget + // TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + // if (m_ActiveSubTarget.value == null) + // return; + // m_ActiveSubTarget.value.target = this; + // m_ActiveSubTarget.value.Setup(ref context); + + // // Override EditorGUI + // if (!string.IsNullOrEmpty(m_CustomEditorGUI)) + // { + // context.SetDefaultShaderGUI(m_CustomEditorGUI); + // } + // } + + // public override void OnAfterMultiDeserialize(string json) + // { + // TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + // m_ActiveSubTarget.value.target = this; + // } + + // public override void GetFields(ref TargetFieldContext context) + // { + // var descs = context.blocks.Select(x => x.descriptor); + + // context.AddField(UnityEditor.ShaderGraph.Fields.GraphPixel); + // context.AddField(Fields.depth, depthWrite); + + // // SubTarget fields + // m_ActiveSubTarget.value.GetFields(ref context); + // } + + // public override void GetActiveBlocks(ref TargetActiveBlockContext context) + // { + // // Core blocks + // context.AddBlock(Blocks.color); + // context.AddBlock(Blocks.depth, depthWrite); + + // // SubTarget blocks + // m_ActiveSubTarget.value.GetActiveBlocks(ref context); + // } + + // public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) + // { + // base.CollectShaderProperties(collector, generationMode); + // activeSubTarget.CollectShaderProperties(collector, generationMode); + // } + + // public void CollectRenderStateShaderProperties(PropertyCollector collector, GenerationMode generationMode) + // { + // if (generationMode != GenerationMode.Preview && allowMaterialOverride) + // { + // // When blend mode is disabled, we can't override + // if (blendMode != FullscreenBlendMode.Disabled) + // { + // collector.AddEnumProperty(Uniforms.blendModeProperty, blendMode); + // collector.AddEnumProperty(Uniforms.srcColorBlendProperty, srcColorBlendMode); + // collector.AddEnumProperty(Uniforms.dstColorBlendProperty, dstColorBlendMode); + // collector.AddEnumProperty(Uniforms.srcAlphaBlendProperty, srcAlphaBlendMode); + // collector.AddEnumProperty(Uniforms.dstAlphaBlendProperty, dstAlphaBlendMode); + // collector.AddEnumProperty(Uniforms.colorBlendOperationProperty, colorBlendOperation); + // collector.AddEnumProperty(Uniforms.alphaBlendOperationProperty, alphaBlendOperation); + // } + // collector.AddFloatProperty(Uniforms.depthWriteProperty, depthWrite ? 1 : 0); + // collector.AddFloatProperty(Uniforms.depthTestProperty, (float)depthTestMode); + + // // When stencil is disabled, we can't override + // if (enableStencil) + // { + // collector.AddBoolProperty(Uniforms.stencilEnableProperty, enableStencil); + // collector.AddIntProperty(Uniforms.stencilReferenceProperty, stencilReference); + // collector.AddIntProperty(Uniforms.stencilReadMaskProperty, stencilReadMask); + // collector.AddIntProperty(Uniforms.stencilWriteMaskProperty, stencilWriteMask); + // collector.AddEnumProperty(Uniforms.stencilComparisonProperty, stencilCompareFunction); + // collector.AddEnumProperty(Uniforms.stencilPassProperty, stencilPassOperation); + // collector.AddEnumProperty(Uniforms.stencilFailProperty, stencilFailOperation); + // collector.AddEnumProperty(Uniforms.stencilDepthFailProperty, stencilDepthTestFailOperation); + // } + // } + // } + + // public override void ProcessPreviewMaterial(Material material) + // { + // m_ActiveSubTarget.value.ProcessPreviewMaterial(material); + // } + + // public override object saveContext => m_ActiveSubTarget.value?.saveContext; + + // public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) + // { + // if (m_ActiveSubTarget.value == null) + // return; + + // context.AddProperty("Compatibility", new EnumField(fullscreenMode) { value = fullscreenMode }, (evt) => + // { + // if (Equals(fullscreenMode, evt.newValue)) + // return; + + // registerUndo("Change Compatibility"); + // fullscreenMode = (FullscreenMode)evt.newValue; + // onChange(); + // }); + + // context.AddProperty("Allow Material Override", new Toggle() { value = allowMaterialOverride }, (evt) => + // { + // if (Equals(allowMaterialOverride, evt.newValue)) + // return; + + // registerUndo("Change Allow Material Override"); + // allowMaterialOverride = evt.newValue; + // onChange(); + // }); + + // GetRenderStatePropertiesGUI(ref context, onChange, registerUndo); + + // // SubTarget properties + // m_ActiveSubTarget.value.GetPropertiesGUI(ref context, onChange, registerUndo); + + // // Custom Editor GUI + // // Requires FocusOutEvent + // m_CustomGUIField = new TextField("") { value = customEditorGUI }; + // m_CustomGUIField.RegisterCallback(s => + // { + // if (Equals(customEditorGUI, m_CustomGUIField.value)) + // return; + + // registerUndo("Change Custom Editor GUI"); + // customEditorGUI = m_CustomGUIField.value; + // onChange(); + // }); + // context.AddProperty("Custom Editor GUI", m_CustomGUIField, (evt) => { }); + // } + + // public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) + // { + // context.AddProperty("Blend Mode", new EnumField(blendMode) { value = blendMode }, (evt) => + // { + // if (Equals(blendMode, evt.newValue)) + // return; + + // registerUndo("Change Blend Mode"); + // blendMode = (FullscreenBlendMode)evt.newValue; + // onChange(); + // }); + + // if (blendMode == FullscreenBlendMode.Custom) + // { + // context.globalIndentLevel++; + // context.AddLabel("Color Blend Mode", 0); + + // context.AddProperty("Src Color", new EnumField(srcColorBlendMode) { value = srcColorBlendMode }, (evt) => + // { + // if (Equals(srcColorBlendMode, evt.newValue)) + // return; + + // registerUndo("Change Blend Mode"); + // srcColorBlendMode = (BlendMode)evt.newValue; + // onChange(); + // }); + // context.AddProperty("Dst Color", new EnumField(dstColorBlendMode) { value = dstColorBlendMode }, (evt) => + // { + // if (Equals(dstColorBlendMode, evt.newValue)) + // return; + + // registerUndo("Change Blend Mode"); + // dstColorBlendMode = (BlendMode)evt.newValue; + // onChange(); + // }); + // context.AddProperty("Color Operation", new EnumField(colorBlendOperation) { value = colorBlendOperation }, (evt) => + // { + // if (Equals(colorBlendOperation, evt.newValue)) + // return; + + // registerUndo("Change Blend Mode"); + // colorBlendOperation = (BlendOp)evt.newValue; + // onChange(); + // }); + + // context.AddLabel("Alpha Blend Mode", 0); + + + // context.AddProperty("Src", new EnumField(srcAlphaBlendMode) { value = srcAlphaBlendMode }, (evt) => + // { + // if (Equals(srcAlphaBlendMode, evt.newValue)) + // return; + + // registerUndo("Change Blend Mode"); + // srcAlphaBlendMode = (BlendMode)evt.newValue; + // onChange(); + // }); + // context.AddProperty("Dst", new EnumField(dstAlphaBlendMode) { value = dstAlphaBlendMode }, (evt) => + // { + // if (Equals(dstAlphaBlendMode, evt.newValue)) + // return; + + // registerUndo("Change Blend Mode"); + // dstAlphaBlendMode = (BlendMode)evt.newValue; + // onChange(); + // }); + // context.AddProperty("Blend Operation Alpha", new EnumField(alphaBlendOperation) { value = alphaBlendOperation }, (evt) => + // { + // if (Equals(alphaBlendOperation, evt.newValue)) + // return; + + // registerUndo("Change Blend Mode"); + // alphaBlendOperation = (BlendOp)evt.newValue; + // onChange(); + // }); + + // context.globalIndentLevel--; + // } + + // context.AddProperty("Enable Stencil", new Toggle { value = enableStencil }, (evt) => + // { + // if (Equals(enableStencil, evt.newValue)) + // return; + + // registerUndo("Change Enable Stencil"); + // enableStencil = evt.newValue; + // onChange(); + // }); + + // if (enableStencil) + // { + // context.globalIndentLevel++; + + // context.AddProperty("Reference", new IntegerField { value = stencilReference, isDelayed = true }, (evt) => + // { + // if (Equals(stencilReference, evt.newValue)) + // return; + + // registerUndo("Change Stencil Reference"); + // stencilReference = evt.newValue; + // onChange(); + // }); + + // context.AddProperty("Read Mask", new IntegerField { value = stencilReadMask, isDelayed = true }, (evt) => + // { + // if (Equals(stencilReadMask, evt.newValue)) + // return; + + // registerUndo("Change Stencil Read Mask"); + // stencilReadMask = evt.newValue; + // onChange(); + // }); + + // context.AddProperty("Write Mask", new IntegerField { value = stencilWriteMask, isDelayed = true }, (evt) => + // { + // if (Equals(stencilWriteMask, evt.newValue)) + // return; + + // registerUndo("Change Stencil Write Mask"); + // stencilWriteMask = evt.newValue; + // onChange(); + // }); + + // context.AddProperty("Comparison", new EnumField(stencilCompareFunction) { value = stencilCompareFunction }, (evt) => + // { + // if (Equals(stencilCompareFunction, evt.newValue)) + // return; + + // registerUndo("Change Stencil Comparison"); + // stencilCompareFunction = (CompareFunction)evt.newValue; + // onChange(); + // }); + + // context.AddProperty("Pass", new EnumField(stencilPassOperation) { value = stencilPassOperation }, (evt) => + // { + // if (Equals(stencilPassOperation, evt.newValue)) + // return; + + // registerUndo("Change Stencil Pass Operation"); + // stencilPassOperation = (StencilOp)evt.newValue; + // onChange(); + // }); + + // context.AddProperty("Fail", new EnumField(stencilFailOperation) { value = stencilFailOperation }, (evt) => + // { + // if (Equals(stencilFailOperation, evt.newValue)) + // return; + + // registerUndo("Change Stencil Fail Operation"); + // stencilFailOperation = (StencilOp)evt.newValue; + // onChange(); + // }); + + // context.AddProperty("Depth Fail", new EnumField(stencilDepthTestFailOperation) { value = stencilDepthTestFailOperation }, (evt) => + // { + // if (Equals(stencilDepthTestFailOperation, evt.newValue)) + // return; + + // registerUndo("Change Stencil Depth Fail Operation"); + // stencilDepthTestFailOperation = (StencilOp)evt.newValue; + // onChange(); + // }); + + // context.globalIndentLevel--; + // } + + // context.AddProperty("Depth Test", new EnumField(ZTestMode.LEqual) { value = depthTestMode }, (evt) => + // { + // if (Equals(depthTestMode, evt.newValue)) + // return; + + // registerUndo("Change Depth Test"); + // depthTestMode = (ZTestMode)evt.newValue; + // onChange(); + // }); + + // context.AddProperty("Depth Write", new Toggle { value = depthWrite }, (evt) => + // { + // if (Equals(depthTestMode, evt.newValue)) + // return; + + // registerUndo("Change Depth Test"); + // depthWrite = evt.newValue; + // onChange(); + // }); + + // } + + // public bool TrySetActiveSubTarget(Type subTargetType) + // { + // if (!subTargetType.IsSubclassOf(typeof(SubTarget))) + // return false; + + // foreach (var subTarget in m_SubTargets) + // { + // if (subTarget.GetType().Equals(subTargetType)) + // { + // m_ActiveSubTarget = subTarget; + // return true; + // } + // } + + // return false; + // } + + // // The fullscreen target is compatible with all pipeline (it doesn't rely on any RP rendering feature) + // public override bool WorksWithSRP(RenderPipelineAsset scriptableRenderPipeline) => true; + + // public override void OnAfterDeserialize(string json) + // { + // base.OnAfterDeserialize(json); + + // if (this.sgVersion < latestVersion) + // { + // ChangeVersion(latestVersion); + // } + // } + + // public bool SupportsVFX() => false; + // public bool CanSupportVFX() => false; + + // string IHasMetadata.identifier + // { + // get + // { + // // defer to subtarget + // if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData) + // return subTargetHasMetaData.identifier; + // return null; + // } + // } + + // ScriptableObject IHasMetadata.GetMetadataObject() + // { + // // defer to subtarget + // if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData) + // return subTargetHasMetaData.GetMetadataObject(); + // return null; + // } + + // public static StructDescriptor Varyings = new StructDescriptor() + // { + // name = "Varyings", + // packFields = true, + // populateWithCustomInterpolators = false, + // fields = new FieldDescriptor[] + // { + // StructFields.Varyings.positionCS, + // StructFields.Varyings.texCoord0, + // StructFields.Varyings.instanceID, + // BuiltInStructFields.Varyings.stereoTargetEyeIndexAsBlendIdx0, + // BuiltInStructFields.Varyings.stereoTargetEyeIndexAsRTArrayIdx, + // } + // }; + + + // public RenderStateCollection GetRenderState() + // { + // var result = new RenderStateCollection(); + + // if (allowMaterialOverride) + // { + // result.Add(RenderState.ZTest(Uniforms.depthTest)); + // result.Add(RenderState.ZWrite(Uniforms.depthWrite)); + // if (blendMode != FullscreenBlendMode.Disabled) + // { + // result.Add(RenderState.Blend(Uniforms.srcColorBlend, Uniforms.dstColorBlend, Uniforms.srcAlphaBlend, Uniforms.dstAlphaBlend)); + // result.Add(RenderState.BlendOp(Uniforms.colorBlendOperation, Uniforms.alphaBlendOperation)); + // } + // else + // { + // result.Add(RenderState.Blend("Blend Off")); + // } + + // if (enableStencil) + // { + // result.Add(RenderState.Stencil(new StencilDescriptor { Ref = Uniforms.stencilReference, ReadMask = Uniforms.stencilReadMask, WriteMask = Uniforms.stencilWriteMask, Comp = Uniforms.stencilComparison, ZFail = Uniforms.stencilDepthFail, Fail = Uniforms.stencilFail, Pass = Uniforms.stencilPass })); + // } + + // return result; + // } + // else + // { + // result.Add(RenderState.ZTest(depthTestMode.ToString())); + // result.Add(RenderState.ZWrite(depthWrite.ToString())); + + // // Blend mode + // if (blendMode == FullscreenBlendMode.Alpha) + // result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); + // else if (blendMode == FullscreenBlendMode.Premultiply) + // result.Add(RenderState.Blend(Blend.One, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); + // else if (blendMode == FullscreenBlendMode.Additive) + // result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); + // else if (blendMode == FullscreenBlendMode.Multiply) + // result.Add(RenderState.Blend(Blend.DstColor, Blend.Zero)); + // else if (blendMode == FullscreenBlendMode.Disabled) + // result.Add(RenderState.Blend("Blend Off")); + // else + // { + // result.Add(RenderState.Blend(BlendModeToBlend(srcColorBlendMode), BlendModeToBlend(dstColorBlendMode), BlendModeToBlend(srcAlphaBlendMode), BlendModeToBlend(dstAlphaBlendMode))); + // result.Add(RenderState.BlendOp(colorBlendOperation, alphaBlendOperation)); + // } + + // result.Add(RenderState.Stencil(new StencilDescriptor + // { + // Ref = stencilReference.ToString(), + // ReadMask = stencilReadMask.ToString(), + // WriteMask = stencilWriteMask.ToString(), + // Comp = stencilCompareFunction.ToString(), + // ZFail = stencilDepthTestFailOperation.ToString(), + // Fail = stencilFailOperation.ToString(), + // Pass = stencilPassOperation.ToString(), + // })); + // } + + // return result; + // } + + // Blend BlendModeToBlend(BlendMode mode) => mode switch + // { + // BlendMode.Zero => Blend.Zero, + // BlendMode.One => Blend.One, + // BlendMode.DstColor => Blend.DstColor, + // BlendMode.SrcColor => Blend.SrcColor, + // BlendMode.OneMinusDstColor => Blend.OneMinusDstColor, + // BlendMode.SrcAlpha => Blend.SrcAlpha, + // BlendMode.OneMinusSrcColor => Blend.OneMinusSrcColor, + // BlendMode.DstAlpha => Blend.DstAlpha, + // BlendMode.OneMinusDstAlpha => Blend.OneMinusDstAlpha, + // BlendMode.SrcAlphaSaturate => Blend.SrcAlpha, + // BlendMode.OneMinusSrcAlpha => Blend.OneMinusSrcAlpha, + // _ => Blend.Zero + // }; + + // } + + // #region Includes + // static class CoreIncludes + // { + // const string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; + // const string kColor = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"; + // const string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; + // const string kInstancing = "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"; + // const string kSpaceTransforms = "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"; + // const string kShaderGraphFunctions = "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl"; + // const string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"; + // const string kShaderVariables = "Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariables.hlsl"; + + // public static readonly IncludeCollection preGraphIncludes = new IncludeCollection + // { + // { kCommon, IncludeLocation.Pregraph }, + // { kColor, IncludeLocation.Pregraph }, + // { kTexture, IncludeLocation.Pregraph }, + // { kInstancing, IncludeLocation.Pregraph }, // For VR + // { kShaderVariables, IncludeLocation.Pregraph }, + // { kSpaceTransforms, IncludeLocation.Pregraph }, + // { kFunctions, IncludeLocation.Pregraph }, + // }; + // } + // #endregion + + // internal static class FullscreenPropertyCollectorExtension + // { + // public static void AddEnumProperty(this PropertyCollector collector, string prop, T value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) where T : Enum + // { + // collector.AddShaderProperty(new Vector1ShaderProperty + // { + // floatType = FloatType.Enum, + // enumType = EnumType.CSharpEnum, + // cSharpEnumType = typeof(T), + // hidden = true, + // overrideHLSLDeclaration = true, + // hlslDeclarationOverride = hlslDeclaration, + // value = Convert.ToInt32(value), + // overrideReferenceName = prop, + // }); + // } + + // public static void AddIntProperty(this PropertyCollector collector, string prop, int value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) + // { + // collector.AddShaderProperty(new Vector1ShaderProperty + // { + // floatType = FloatType.Integer, + // hidden = true, + // overrideHLSLDeclaration = true, + // hlslDeclarationOverride = hlslDeclaration, + // value = value, + // overrideReferenceName = prop, + // }); + // } + + // public static void AddBoolProperty(this PropertyCollector collector, string prop, bool value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) + // { + // collector.AddShaderProperty(new BooleanShaderProperty + // { + // hidden = true, + // overrideHLSLDeclaration = true, + // hlslDeclarationOverride = hlslDeclaration, + // value = value, + // overrideReferenceName = prop, + // }); + // } + // } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index 509fffaf7ba..0866c0505da 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -18,6 +18,7 @@ void BuildVaryings(Attributes input, inout Varyings output) #if defined(VARYINGS_NEED_TEXCOORD0) || defined(VARYINGS_DS_NEED_TEXCOORD0) output.texCoord0 = output.positionCS * 0.5 + 0.5; + output.texCoord0.y = 1 - output.texCoord0.y; #endif #ifdef VARYINGS_NEED_SCREENPOSITION @@ -32,7 +33,7 @@ float4 GetDrawProceduralVertexPosition(uint vertexID) float4 GetBlitVertexPosition(float3 positionOS) { - return mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, float4(positionOS, 1.0))); + return mul(UNITY_MATRIX_VP, mul(UNITY_MATRIX_M, float4(positionOS, 1.0))); } FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template index f8f6957c188..451c79693e9 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template @@ -47,6 +47,11 @@ $Varyings.screenPosition: #define VARYINGS_NEED_SCREENPOSITION $Varyings.fogFactorAndVertexLight: #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT $Varyings.cullFace: #define VARYINGS_NEED_CULLFACE $features.graphVertex: #define FEATURES_GRAPH_VERTEX + +// Force depth texture because we need it for almost every nodes +// TODO: dependency system that triggers this define from position or view direction usage +#define REQUIRE_DEPTH_TEXTURE + $splice(PassInstancing) $splice(GraphDefines) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index b74cb1f773d..39750e7c322 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -3,40 +3,34 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) SurfaceDescriptionInputs output; ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + // Normal is not available yet, TODO: add a node to sample the normal buffer if it exists + float3 normalWS = 0; + float4 tangentWS = 0; // We can't access the tangent in screen space + $SurfaceDescriptionInputs.WorldSpaceNormal: // must use interpolated tangent, bitangent and normal before they are normalized in the pixel shader. - $SurfaceDescriptionInputs.WorldSpaceNormal: float3 unnormalizedNormalWS = input.normalWS; + $SurfaceDescriptionInputs.WorldSpaceNormal: float3 unnormalizedNormalWS = normalWS; $SurfaceDescriptionInputs.WorldSpaceNormal: const float renormFactor = 1.0 / length(unnormalizedNormalWS); $SurfaceDescriptionInputs.WorldSpaceBiTangent: // use bitangent on the fly like in hdrp $SurfaceDescriptionInputs.WorldSpaceBiTangent: // IMPORTANT! If we ever support Flip on double sided materials ensure bitangent and tangent are NOT flipped. - $SurfaceDescriptionInputs.WorldSpaceBiTangent: float crossSign = (input.tangentWS.w > 0.0 ? 1.0 : -1.0)* GetOddNegativeScale(); - $SurfaceDescriptionInputs.WorldSpaceBiTangent: float3 bitang = crossSign * cross(input.normalWS.xyz, input.tangentWS.xyz); + $SurfaceDescriptionInputs.WorldSpaceBiTangent: float crossSign = (tangentWS.w > 0.0 ? 1.0 : -1.0)* GetOddNegativeScale(); + $SurfaceDescriptionInputs.WorldSpaceBiTangent: float3 bitang = crossSign * cross(normalWS.xyz, tangentWS.xyz); - $SurfaceDescriptionInputs.WorldSpaceNormal: output.WorldSpaceNormal = renormFactor * input.normalWS.xyz; // we want a unit length Normal Vector node in shader graph + $SurfaceDescriptionInputs.WorldSpaceNormal: output.WorldSpaceNormal = renormFactor * normalWS.xyz; // we want a unit length Normal Vector node in shader graph $SurfaceDescriptionInputs.ObjectSpaceNormal: output.ObjectSpaceNormal = normalize(mul(output.WorldSpaceNormal, (float3x3) UNITY_MATRIX_M)); // transposed multiplication by inverse matrix to handle normal scale $SurfaceDescriptionInputs.ViewSpaceNormal: output.ViewSpaceNormal = mul(output.WorldSpaceNormal, (float3x3) UNITY_MATRIX_I_V); // transposed multiplication by inverse matrix to handle normal scale $SurfaceDescriptionInputs.TangentSpaceNormal: output.TangentSpaceNormal = float3(0.0f, 0.0f, 1.0f); $SurfaceDescriptionInputs.WorldSpaceTangent: // to preserve mikktspace compliance we use same scale renormFactor as was used on the normal. $SurfaceDescriptionInputs.WorldSpaceTangent: // This is explained in section 2.2 in "surface gradient based bump mapping framework" - $SurfaceDescriptionInputs.WorldSpaceTangent: output.WorldSpaceTangent = renormFactor * input.tangentWS.xyz; + $SurfaceDescriptionInputs.WorldSpaceTangent: output.WorldSpaceTangent = renormFactor * tangentWS.xyz; $SurfaceDescriptionInputs.WorldSpaceBiTangent: output.WorldSpaceBiTangent = renormFactor * bitang; - // Calculate world space view direction without the position WS: - bool ortho = UNITY_MATRIX_P[3][3] == 0; - float3 viewDirWS; - if (ortho) - { - viewDirWS = -GetWorldToViewMatrix()[2].xyz; - } - else - { - float4 n = mul(UNITY_MATRIX_I_VP, float4(input.positionCS.xy, 0, 1)); - float4 f = n + UNITY_MATRIX_I_VP[2]; - n.xyz /= n.w; - f.xyz /= f.w; - viewDirWS = f.xyz-n.xyz; - } + float linearDepth = (SHADERGRAPH_SAMPLE_SCENE_DEPTH(input.texCoord0.xy)); + float3 positionWS = ComputeWorldSpacePosition(input.texCoord0.xy, linearDepth, UNITY_MATRIX_I_VP); + float3 viewDirWS = GetWorldSpaceNormalizeViewDir(positionWS); + + // positionWS = float3(SHADERGRAPH_SAMPLE_SCENE_DEPTH(input.texCoord0.xy), 0, 0); $SurfaceDescriptionInputs.ObjectSpaceTangent: output.ObjectSpaceTangent = TransformWorldToObjectDir(output.WorldSpaceTangent); $SurfaceDescriptionInputs.ViewSpaceTangent: output.ViewSpaceTangent = TransformWorldToViewDir(output.WorldSpaceTangent); @@ -50,11 +44,6 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) $SurfaceDescriptionInputs.TangentSpaceViewDirection: float3x3 tangentSpaceTransform = float3x3(output.WorldSpaceTangent, output.WorldSpaceBiTangent, output.WorldSpaceNormal); $SurfaceDescriptionInputs.TangentSpaceViewDirection: output.TangentSpaceViewDirection = mul(tangentSpaceTransform, output.WorldSpaceViewDirection); - // Calculate world space position: - float2 screenSpaceUV = input.texCoord0.xy; - float linearDepth = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH(screenSpaceUV), _ZBufferParams); - float3 positionWS = viewDirWS * linearDepth; - $SurfaceDescriptionInputs.WorldSpacePosition: output.WorldSpacePosition = positionWS; $SurfaceDescriptionInputs.ObjectSpacePosition: output.ObjectSpacePosition = TransformWorldToObject(positionWS); $SurfaceDescriptionInputs.ViewSpacePosition: output.ViewSpacePosition = TransformWorldToView(positionWS); diff --git a/com.unity.shadergraph/Editor/Interface/IRequiresData.cs b/com.unity.shadergraph/Editor/Interface/IRequiresData.cs new file mode 100644 index 00000000000..b42a554ae7e --- /dev/null +++ b/com.unity.shadergraph/Editor/Interface/IRequiresData.cs @@ -0,0 +1,9 @@ +using UnityEditor.ShaderGraph.Serialization; + +namespace UnityEditor.ShaderGraph +{ + interface IRequiresData where T : JsonObject + { + T data { get; set; } + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs.meta b/com.unity.shadergraph/Editor/Interface/IRequiresData.cs.meta similarity index 100% rename from com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs.meta rename to com.unity.shadergraph/Editor/Interface/IRequiresData.cs.meta From 5258060bf783609dc919436bed3cab754feb2eae Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 24 Sep 2021 19:25:27 +0200 Subject: [PATCH 009/108] Add URP fullscreen pass implementation --- .../ShaderGraph/HDFullscreenSubtarget.cs | 3 +++ .../Targets/UniversalFullscreenSubTarget.cs | 5 ++++- .../ShaderGraph/Targets/UniversalTarget.cs | 19 ++++++++++++++----- .../Targets/Fullscreen/FullscreenSubTarget.cs | 5 +++-- .../Fullscreen/Includes/FullscreenBlit.hlsl | 2 +- .../Fullscreen/Includes/FullscreenCommon.hlsl | 6 ++++-- .../Templates/SharedCode.template.hlsl | 8 ++++---- 7 files changed, 33 insertions(+), 15 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs index 5bd9cfb6999..c8c3771f116 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs @@ -4,6 +4,7 @@ using UnityEditor.Rendering.BuiltIn; using System; using UnityEditor.Rendering.Fullscreen.ShaderGraph; +using UnityEngine.Rendering.HighDefinition; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -17,6 +18,8 @@ public override void Setup(ref TargetSetupContext context) context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); } + protected override string pipelineTag => HDRenderPipeline.k_ShaderTagName; + protected override IncludeCollection pregraphIncludes => new IncludeCollection { { CoreIncludes.MinimalCorePregraph }, diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs index bd704ce0e3c..9fb894e14ce 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs @@ -20,9 +20,12 @@ public override void Setup(ref TargetSetupContext context) // We don't need the save context / update materials for now public override object saveContext => null; + protected override string pipelineTag => UniversalTarget.kPipelineTag; + protected override IncludeCollection pregraphIncludes => new IncludeCollection { - { CoreIncludes.kGraphFunctions, IncludeLocation.Pregraph } + { CoreIncludes.CorePregraph }, + { CoreIncludes.ShaderGraphPregraph }, }; public UniversalFullscreenSubTarget() diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs index cb9b55fbe8f..65ac4075a02 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs @@ -139,6 +139,7 @@ public UniversalTarget() m_SubTargets = TargetUtils.GetSubTargets(this); m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList(); TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + ProcessSubTargetDatas(m_ActiveSubTarget.value); } public string renderType @@ -286,6 +287,7 @@ public override void Setup(ref TargetSetupContext context) // Setup the active SubTarget TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); m_ActiveSubTarget.value.target = this; + ProcessSubTargetDatas(m_ActiveSubTarget.value); m_ActiveSubTarget.value.Setup(ref context); } @@ -311,10 +313,13 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { // Core blocks - context.AddBlock(BlockFields.VertexDescription.Position); - context.AddBlock(BlockFields.VertexDescription.Normal); - context.AddBlock(BlockFields.VertexDescription.Tangent); - context.AddBlock(BlockFields.SurfaceDescription.BaseColor); + if (!(m_ActiveSubTarget.value is UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenSubTarget)) + { + context.AddBlock(BlockFields.VertexDescription.Position); + context.AddBlock(BlockFields.VertexDescription.Normal); + context.AddBlock(BlockFields.VertexDescription.Tangent); + context.AddBlock(BlockFields.SurfaceDescription.BaseColor); + } // SubTarget blocks m_ActiveSubTarget.value.GetActiveBlocks(ref context); @@ -352,6 +357,7 @@ public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Acti registerUndo("Change Material"); m_ActiveSubTarget = m_SubTargets[m_SubTargetField.index]; + ProcessSubTargetDatas(m_ActiveSubTarget.value); onChange(); }); @@ -508,6 +514,9 @@ void ProcessSubTargetDatas(SubTarget subTarget) var typeCollection = TypeCache.GetTypesDerivedFrom(); foreach (var type in typeCollection) { + if (type.IsGenericType) + continue; + // Data requirement interfaces need generic type arguments // Therefore we need to use reflections to call the method var methodInfo = typeof(UniversalTarget).GetMethod(nameof(SetDataOnSubTarget)); @@ -1360,7 +1369,7 @@ static class CoreIncludes const string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; const string kCore = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"; const string kLighting = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"; - internal const string kGraphFunctions = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"; + const string kGraphFunctions = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"; const string kVaryings = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl"; const string kShaderPass = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"; const string kDepthOnlyPass = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DepthOnlyPass.hlsl"; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index ef72418d2ea..42df3274119 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -132,6 +132,7 @@ public override void Setup(ref TargetSetupContext context) } protected abstract IncludeCollection pregraphIncludes { get; } + protected abstract string pipelineTag { get; } protected virtual Type GetDefaultShaderGUI() => typeof(FullscreenShaderGUI); @@ -232,7 +233,8 @@ public virtual SubShaderDescriptor GenerateSubShader() var result = new SubShaderDescriptor() { generatesPreview = true, - passes = new PassCollection() + passes = new PassCollection(), + pipelineTag = pipelineTag, }; result.passes.Add(GenerateFullscreenPass(FullscreenCompatibility.Blit)); @@ -418,7 +420,6 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { - // // Core blocks context.AddBlock(FullscreenBlocks.color); context.AddBlock(FullscreenBlocks.depth, fullscreenData.depthWrite); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl index 27fc04c4d36..9a6e25d706b 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl @@ -1,7 +1,7 @@ PackedVaryings vert(Attributes input) { Varyings output = (Varyings)0; - output.positionCS = GetBlitVertexPosition(input.positionOS); + output.positionCS = GetBlitVertexPosition(input.vertexID); BuildVaryings(input, output); PackedVaryings packedOutput = PackVaryings(output); return packedOutput; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index 0866c0505da..0d31d5c86ba 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -31,9 +31,11 @@ float4 GetDrawProceduralVertexPosition(uint vertexID) return GetFullScreenTriangleVertexPosition(vertexID, UNITY_RAW_FAR_CLIP_VALUE); } -float4 GetBlitVertexPosition(float3 positionOS) +float4 GetBlitVertexPosition(uint vertexID) { - return mul(UNITY_MATRIX_VP, mul(UNITY_MATRIX_M, float4(positionOS, 1.0))); + float4 positionCS = GetQuadVertexPosition(vertexID); + positionCS.xy = positionCS.xy * 2 - 1; + return positionCS; } FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index 39750e7c322..7ab5978407f 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -4,8 +4,8 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) ZERO_INITIALIZE(SurfaceDescriptionInputs, output); // Normal is not available yet, TODO: add a node to sample the normal buffer if it exists - float3 normalWS = 0; - float4 tangentWS = 0; // We can't access the tangent in screen space + float3 normalWS = float3(0, 0, 1); + float4 tangentWS = float4(0, 1, 0, 0); // We can't access the tangent in screen space $SurfaceDescriptionInputs.WorldSpaceNormal: // must use interpolated tangent, bitangent and normal before they are normalized in the pixel shader. $SurfaceDescriptionInputs.WorldSpaceNormal: float3 unnormalizedNormalWS = normalWS; @@ -26,8 +26,8 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) $SurfaceDescriptionInputs.WorldSpaceTangent: output.WorldSpaceTangent = renormFactor * tangentWS.xyz; $SurfaceDescriptionInputs.WorldSpaceBiTangent: output.WorldSpaceBiTangent = renormFactor * bitang; - float linearDepth = (SHADERGRAPH_SAMPLE_SCENE_DEPTH(input.texCoord0.xy)); - float3 positionWS = ComputeWorldSpacePosition(input.texCoord0.xy, linearDepth, UNITY_MATRIX_I_VP); + float rawDepth = SHADERGRAPH_SAMPLE_SCENE_DEPTH(input.texCoord0.xy); + float3 positionWS = ComputeWorldSpacePosition(input.texCoord0.xy, rawDepth, UNITY_MATRIX_I_VP); float3 viewDirWS = GetWorldSpaceNormalizeViewDir(positionWS); // positionWS = float3(SHADERGRAPH_SAMPLE_SCENE_DEPTH(input.texCoord0.xy), 0, 0); From a0ab1513ebf808a417f1649292fe9b68d55341d3 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 29 Sep 2021 12:40:34 +0200 Subject: [PATCH 010/108] Added IsNodeAllowedBySubTarget API --- com.unity.shadergraph/Editor/Generation/SubTarget.cs | 1 + .../Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/SubTarget.cs b/com.unity.shadergraph/Editor/Generation/SubTarget.cs index d7ee0739266..47df99aa966 100644 --- a/com.unity.shadergraph/Editor/Generation/SubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/SubTarget.cs @@ -22,6 +22,7 @@ internal abstract class SubTarget : JsonObject public virtual void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) { } public virtual void ProcessPreviewMaterial(Material material) { } public virtual object saveContext => null; + public virtual bool IsNodeAllowedBySubTarget(Type nodeType) => true; } [GenerationAPI] // TODO: Public diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs index 472afe2c461..9eb33e3a7a1 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs @@ -15,11 +15,6 @@ namespace UnityEditor.Rendering.Fullscreen.ShaderGraph { - interface IIsNodeAllowedBySubTarget - { - bool IsNodeAllowedByTarget(Type nodeType); - } - // class FullscreenTarget : Target, IHasMetadata, IMaySupportVFX // { // public override int latestVersion => 0; From 851792f51647439e3077e75249035d1800e77eda Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 29 Sep 2021 12:44:20 +0200 Subject: [PATCH 011/108] Added node filtering for the fulscreen sub-target + fix scene color nodes in HDRP --- .../ShaderGraph/HDFullscreenSubtarget.cs | 147 +----------------- .../Editor/Material/ShaderGraph/HDTarget.cs | 15 +- .../Targets/UniversalFullscreenSubTarget.cs | 124 --------------- .../ShaderGraph/Targets/UniversalTarget.cs | 3 + .../Targets/Fullscreen/FullscreenSubTarget.cs | 25 +-- 5 files changed, 41 insertions(+), 273 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs index c8c3771f116..dc5546ef730 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs @@ -23,25 +23,18 @@ public override void Setup(ref TargetSetupContext context) protected override IncludeCollection pregraphIncludes => new IncludeCollection { { CoreIncludes.MinimalCorePregraph }, - // { "Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.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 { "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl", IncludeLocation.Pregraph}, { CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph } }; - // protected override IncludeCollection GetPostGraphIncludes() - // { - // return new IncludeCollection - // { - - // }; - // } - - // public virtual ScriptableObject GetMetadataObject() - // { - // var bultInMetadata = ScriptableObject.CreateInstance(); - // bultInMetadata.fullscreenMode = target.fullscreenMode; - // return bultInMetadata; - // } + protected override DefineCollection GetPassDefines(FullscreenCompatibility compatibility) + { + return new DefineCollection + { + { CoreKeywordDescriptors.SurfaceTypeTransparent, 1 }, + }; + } // We don't need the save context / update materials for now public override object saveContext => null; @@ -50,129 +43,5 @@ public HDFullscreenSubTarget() { displayName = "Fullscreen"; } - - // public virtual bool IsNodeAllowedByTarget(Type nodeType) - // { - // // TODO - // // SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); - // // bool worksWithThisSrp = srpFilter == null || srpFilter.srpTypes.Contains(typeof(HDRenderPipeline)); - - // return true; - // } - - // TODO: replace shader generation by this: and HDRRP specific includes + functions - - // #region SubShader - // static class SubShaders - // { - // const string kFullscreenDrawProceduralInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl"; - // const string kFullscreenBlitInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; - // const string kCustomRenderTextureInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl"; - // const string kFullscreenCommon = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl"; - - // static readonly KeywordDescriptor depthWriteKeywork = new KeywordDescriptor - // { - // displayName = "Depth Write", - // referenceName = "DEPTH_WRITE", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.ShaderFeature, - // stages = KeywordShaderStage.Fragment, - // }; - - // public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) - // { - // var result = new SubShaderDescriptor() - // { - // generatesPreview = true, - // passes = new PassCollection() - // }; - - // result.passes.Add(GetFullscreenPass(target, FullscreenTarget.FullscreenCompatibility.Blit)); - // result.passes.Add(GetFullscreenPass(target, FullscreenTarget.FullscreenCompatibility.DrawProcedural)); - - // return result; - // } - - // static PassDescriptor GetFullscreenPass(FullscreenTarget target, FullscreenTarget.FullscreenCompatibility compatibility) - // { - // var fullscreenPass = new PassDescriptor - // { - // // Definition - // displayName = compatibility.ToString(), - // referenceName = "SHADERPASS_" + compatibility.ToString().ToUpper(), - // useInPreview = true, - - // // Template - // passTemplatePath = FullscreenTarget.kTemplatePath, - // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, - - // // Port Mask - // validVertexBlocks = new BlockFieldDescriptor[] - // { - // BlockFields.VertexDescription.Position - // }, - // validPixelBlocks = new BlockFieldDescriptor[] - // { - // FullscreenTarget.Blocks.color, - // FullscreenTarget.Blocks.depth, - // }, - - // // Fields - // structs = new StructCollection - // { - // { Structs.Attributes }, - // { Structs.SurfaceDescriptionInputs }, - // { FullscreenTarget.Varyings }, - // { Structs.VertexDescriptionInputs }, - // }, - // fieldDependencies = FieldDependencies.Default, - // requiredFields = new FieldCollection - // { - // StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code - // StructFields.Varyings.texCoord0, - // StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case - // }, - - // // Conditional State - // renderStates = target.GetRenderState(), - // pragmas = new PragmaCollection - // { - // { Pragma.Target(ShaderModel.Target30) }, - // { Pragma.Vertex("vert") }, - // { Pragma.Fragment("frag") }, - // }, - // defines = new DefineCollection - // { - // {depthWriteKeywork, 1, new FieldCondition(FullscreenTarget.Fields.depth, true)} - // }, - // keywords = new KeywordCollection(), - // includes = new IncludeCollection - // { - // // Pre-graph - // { CoreIncludes.preGraphIncludes }, - - // // Post-graph - // { kFullscreenCommon, IncludeLocation.Postgraph }, - // }, - // }; - - // switch (compatibility) - // { - // default: - // case FullscreenTarget.FullscreenCompatibility.Blit: - // fullscreenPass.includes.Add(kFullscreenBlitInclude, IncludeLocation.Postgraph); - // break; - // case FullscreenTarget.FullscreenCompatibility.DrawProcedural: - // fullscreenPass.includes.Add(kFullscreenDrawProceduralInclude, IncludeLocation.Postgraph); - // break; - // // case FullscreenTarget.FullscreenCompatibility.CustomRenderTexture: - // // fullscreenPass.includes.Add(kCustomRenderTextureInclude, IncludeLocation.Postgraph); - // break; - // } - - // return fullscreenPass; - // } - // } - // #endregion } } diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs index 45b0c751ea2..e21cbd6f2fa 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs @@ -63,6 +63,12 @@ sealed class HDTarget : Target, IHasMetadata, ILegacyTarget, IMaySupportVFX, IRe [SerializeField] JsonData m_ActiveSubTarget; + public SubTarget activeSubTarget + { + get => m_ActiveSubTarget.value; + set => m_ActiveSubTarget = value; + } + [SerializeField] List> m_Datas = new List>(); @@ -86,7 +92,14 @@ public override bool IsNodeAllowedByTarget(Type nodeType) { SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); bool worksWithThisSrp = srpFilter == null || srpFilter.srpTypes.Contains(typeof(HDRenderPipeline)); - return worksWithThisSrp && base.IsNodeAllowedByTarget(nodeType); + + SubTargetFilterAttribute subTargetFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); + bool worksWithThisSubTarget = subTargetFilter == null || subTargetFilter.subTargetTypes.Contains(activeSubTarget.GetType()); + + if (activeSubTarget.IsActive()) + worksWithThisSubTarget &= activeSubTarget.IsNodeAllowedBySubTarget(nodeType); + + return worksWithThisSrp && worksWithThisSubTarget && base.IsNodeAllowedByTarget(nodeType); } public HDTarget() diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs index 9fb894e14ce..296da9dcd91 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs @@ -32,129 +32,5 @@ public UniversalFullscreenSubTarget() { displayName = "Fullscreen"; } - - // public virtual bool IsNodeAllowedByTarget(Type nodeType) - // { - // // TODO - // // SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); - // // bool worksWithThisSrp = srpFilter == null || srpFilter.srpTypes.Contains(typeof(HDRenderPipeline)); - - // return true; - // } - - // TODO: replace shader generation by this: and HDRRP specific includes + functions - - // #region SubShader - // static class SubShaders - // { - // const string kFullscreenDrawProceduralInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl"; - // const string kFullscreenBlitInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; - // const string kCustomRenderTextureInclude = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl"; - // const string kFullscreenCommon = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl"; - - // static readonly KeywordDescriptor depthWriteKeywork = new KeywordDescriptor - // { - // displayName = "Depth Write", - // referenceName = "DEPTH_WRITE", - // type = KeywordType.Boolean, - // definition = KeywordDefinition.ShaderFeature, - // stages = KeywordShaderStage.Fragment, - // }; - - // public static SubShaderDescriptor FullscreenBlit(FullscreenTarget target) - // { - // var result = new SubShaderDescriptor() - // { - // generatesPreview = true, - // passes = new PassCollection() - // }; - - // result.passes.Add(GetFullscreenPass(target, FullscreenTarget.FullscreenCompatibility.Blit)); - // result.passes.Add(GetFullscreenPass(target, FullscreenTarget.FullscreenCompatibility.DrawProcedural)); - - // return result; - // } - - // static PassDescriptor GetFullscreenPass(FullscreenTarget target, FullscreenTarget.FullscreenCompatibility compatibility) - // { - // var fullscreenPass = new PassDescriptor - // { - // // Definition - // displayName = compatibility.ToString(), - // referenceName = "SHADERPASS_" + compatibility.ToString().ToUpper(), - // useInPreview = true, - - // // Template - // passTemplatePath = FullscreenTarget.kTemplatePath, - // sharedTemplateDirectories = FullscreenTarget.kSharedTemplateDirectories, - - // // Port Mask - // validVertexBlocks = new BlockFieldDescriptor[] - // { - // BlockFields.VertexDescription.Position - // }, - // validPixelBlocks = new BlockFieldDescriptor[] - // { - // FullscreenTarget.Blocks.color, - // FullscreenTarget.Blocks.depth, - // }, - - // // Fields - // structs = new StructCollection - // { - // { Structs.Attributes }, - // { Structs.SurfaceDescriptionInputs }, - // { FullscreenTarget.Varyings }, - // { Structs.VertexDescriptionInputs }, - // }, - // fieldDependencies = FieldDependencies.Default, - // requiredFields = new FieldCollection - // { - // StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code - // StructFields.Varyings.texCoord0, - // StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case - // }, - - // // Conditional State - // renderStates = target.GetRenderState(), - // pragmas = new PragmaCollection - // { - // { Pragma.Target(ShaderModel.Target30) }, - // { Pragma.Vertex("vert") }, - // { Pragma.Fragment("frag") }, - // }, - // defines = new DefineCollection - // { - // {depthWriteKeywork, 1, new FieldCondition(FullscreenTarget.Fields.depth, true)} - // }, - // keywords = new KeywordCollection(), - // includes = new IncludeCollection - // { - // // Pre-graph - // { CoreIncludes.preGraphIncludes }, - - // // Post-graph - // { kFullscreenCommon, IncludeLocation.Postgraph }, - // }, - // }; - - // switch (compatibility) - // { - // default: - // case FullscreenTarget.FullscreenCompatibility.Blit: - // fullscreenPass.includes.Add(kFullscreenBlitInclude, IncludeLocation.Postgraph); - // break; - // case FullscreenTarget.FullscreenCompatibility.DrawProcedural: - // fullscreenPass.includes.Add(kFullscreenDrawProceduralInclude, IncludeLocation.Postgraph); - // break; - // // case FullscreenTarget.FullscreenCompatibility.CustomRenderTexture: - // // fullscreenPass.includes.Add(kCustomRenderTextureInclude, IncludeLocation.Postgraph); - // break; - // } - - // return fullscreenPass; - // } - // } - // #endregion } } diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs index 65ac4075a02..2b2030acd21 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs @@ -272,6 +272,9 @@ public override bool IsNodeAllowedByTarget(Type nodeType) SubTargetFilterAttribute subTargetFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); bool worksWithThisSubTarget = subTargetFilter == null || subTargetFilter.subTargetTypes.Contains(activeSubTarget.GetType()); + if (activeSubTarget.IsActive()) + worksWithThisSubTarget &= activeSubTarget.IsNodeAllowedBySubTarget(nodeType); + return worksWithThisSrp && worksWithThisSubTarget && base.IsNodeAllowedByTarget(nodeType); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 42df3274119..3c916145853 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -89,7 +89,7 @@ internal static class FullscreenUniforms public static readonly string stencilDepthFail = "[" + stencilDepthFailProperty + "]"; } - internal abstract class FullscreenSubTarget : SubTarget, IRequiresData, IHasMetadata, IIsNodeAllowedBySubTarget where T : Target + internal abstract class FullscreenSubTarget : SubTarget, IRequiresData, IHasMetadata where T : Target { static readonly GUID kSourceCodeGuid = new GUID("1cfc804c75474e144be5d4158b9522ed"); // FullscreenSubTarget.cs // TODO static readonly string[] kSharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories().Union(new string[] { "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates" }).ToArray(); @@ -252,8 +252,6 @@ public virtual IncludeCollection GetPreGraphIncludes() { kTexture, IncludeLocation.Pregraph }, { kTextureStack, IncludeLocation.Pregraph }, { kInstancing, IncludeLocation.Pregraph }, // For VR - // { kShaderVariables, IncludeLocation.Pregraph }, - // { kCommonLighting, IncludeLocation.Pregraph }, { pregraphIncludes }, { kSpaceTransforms, IncludeLocation.Pregraph }, { kFunctions, IncludeLocation.Pregraph }, @@ -289,6 +287,9 @@ public virtual IncludeCollection GetPostGraphIncludes() } }; + protected virtual DefineCollection GetPassDefines(FullscreenCompatibility compatibility) + => new DefineCollection(); + public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility compatibility) { var fullscreenPass = new PassDescriptor @@ -339,7 +340,8 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com }, defines = new DefineCollection { - {depthWriteKeywork, 1, new FieldCondition(FullscreenFields.depth, true)} + {depthWriteKeywork, 1, new FieldCondition(FullscreenFields.depth, true)}, + GetPassDefines(compatibility), }, keywords = new KeywordCollection(), includes = new IncludeCollection @@ -377,13 +379,18 @@ public FullscreenSubTarget() displayName = "Fullscreen"; } - public virtual bool IsNodeAllowedByTarget(Type nodeType) + public override bool IsNodeAllowedBySubTarget(Type nodeType) { - // TODO - // SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); - // bool worksWithThisSrp = srpFilter == null || srpFilter.srpTypes.Contains(typeof(HDRenderPipeline)); + var interfaces = nodeType.GetInterfaces(); + bool allowed = true; + + // There is no input in the vertex block for now + if (interfaces.Contains(typeof(IMayRequireVertexID))) + allowed = false; + if (interfaces.Contains(typeof(IMayRequireVertexSkinning))) + allowed = false; - return true; + return allowed; } public override bool IsActive() => true; From 82cdcfcab57420a805a5f5ed0dc23a10d3a715c0 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 29 Sep 2021 18:42:28 +0200 Subject: [PATCH 012/108] Add create callback + separate colorRGBA into color RGB + A --- .../CreateHDFullscreenShaderGraph.cs | 25 +++++++++++++++++++ .../CreateHDFullscreenShaderGraph.cs.meta | 11 ++++++++ .../CreateFullscreenShaderGraph.cs | 25 +++++++++++++++++++ .../CreateFullscreenShaderGraph.cs.meta | 11 ++++++++ .../Targets/Fullscreen/FullscreenSubTarget.cs | 6 ++++- .../Fullscreen/Includes/FullscreenCommon.hlsl | 3 ++- 6 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs.meta create mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs create mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs new file mode 100644 index 00000000000..7bbf9a8d9a2 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs @@ -0,0 +1,25 @@ +using System; +using UnityEditor.ShaderGraph; +using UnityEngine.Rendering; +using UnityEditor.Rendering.Fullscreen.ShaderGraph; + +namespace UnityEditor.Rendering.HighDefinition.ShaderGraph +{ + static class CreateHDFullscreenShaderGraph + { + [MenuItem("Assets/Create/Shader Graph/HDRP/Fullscreen Shader Graph", priority = CoreUtils.Priorities.assetsCreateShaderMenuPriority)] + public static void CreateHDFullscreenGraph() + { + var target = (HDTarget)Activator.CreateInstance(typeof(HDTarget)); + target.TrySetActiveSubTarget(typeof(HDFullscreenSubTarget)); + + var blockDescriptors = new[] + { + FullscreenBlocks.color, + FullscreenBlocks.alpha, + }; + + GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); + } + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs.meta new file mode 100644 index 00000000000..de23a02b4f6 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0825e29af0b161f44aa7027af2619ab7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs new file mode 100644 index 00000000000..0ca4c2e16c3 --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs @@ -0,0 +1,25 @@ +using System; +using UnityEditor.ShaderGraph; +using UnityEngine.Rendering; +using UnityEditor.Rendering.Fullscreen.ShaderGraph; + +namespace UnityEditor.Rendering.Universal.ShaderGraph +{ + static class CreateFullscreenShaderGraph + { + [MenuItem("Assets/Create/Shader Graph/URP/Sprite Unlit Shader Graph", priority = CoreUtils.Sections.section1 + CoreUtils.Priorities.assetsCreateShaderMenuPriority)] + public static void CreateFullscreenGraph() + { + var target = (UniversalTarget)Activator.CreateInstance(typeof(UniversalTarget)); + target.TrySetActiveSubTarget(typeof(UniversalFullscreenSubTarget)); + + var blockDescriptors = new[] + { + FullscreenBlocks.color, + FullscreenBlocks.alpha, + }; + + GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); + } + } +} diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta new file mode 100644 index 00000000000..bf1304667a9 --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 065bc4c5f217fe14bb13b4ce5ab51a0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 3c916145853..28b82dc5746 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -19,7 +19,9 @@ namespace UnityEditor.Rendering.Fullscreen.ShaderGraph internal struct FullscreenBlocks { public static BlockFieldDescriptor color = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Color", "Color", - "SURFACEDESCRIPTION_COLOR", new ColorRGBAControl(UnityEngine.Color.grey), ShaderStage.Fragment); + "SURFACEDESCRIPTION_COLOR", new ColorControl(UnityEngine.Color.grey, true), ShaderStage.Fragment); + public static BlockFieldDescriptor alpha = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Alpha", "Alpha", + "SURFACEDESCRIPTION_Alpha", new FloatControl(1), ShaderStage.Fragment); public static BlockFieldDescriptor depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Depth", "Depth", "SURFACEDESCRIPTION_DEPTH", new FloatControl(0), ShaderStage.Fragment); } @@ -311,6 +313,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com validPixelBlocks = new BlockFieldDescriptor[] { FullscreenBlocks.color, + FullscreenBlocks.alpha, FullscreenBlocks.depth, }, @@ -428,6 +431,7 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { context.AddBlock(FullscreenBlocks.color); + context.AddBlock(FullscreenBlocks.alpha); context.AddBlock(FullscreenBlocks.depth, fullscreenData.depthWrite); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index 0d31d5c86ba..40f23bbe7a4 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -49,7 +49,8 @@ FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(unpacked); SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); - output.color = surfaceDescription.Color; + output.color.rgb = surfaceDescription.Color; + output.color.a = surfaceDescription.Alpha; #ifdef DEPTH_WRITE output.depth = surfaceDescription.Depth; #endif From 18c821a2584bbb446839247ff2aed5a179bddf2d Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 30 Sep 2021 11:27:54 +0200 Subject: [PATCH 013/108] Move shadergraph fullscreen create menu --- .../Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs | 2 +- .../ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs index 7bbf9a8d9a2..3b39154d4b3 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs @@ -7,7 +7,7 @@ namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { static class CreateHDFullscreenShaderGraph { - [MenuItem("Assets/Create/Shader Graph/HDRP/Fullscreen Shader Graph", priority = CoreUtils.Priorities.assetsCreateShaderMenuPriority)] + [MenuItem("Assets/Create/Shader Graph/HDRP/Fullscreen Shader Graph", priority = CoreUtils.Priorities.assetsCreateShaderMenuPriority + 7)] public static void CreateHDFullscreenGraph() { var target = (HDTarget)Activator.CreateInstance(typeof(HDTarget)); diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs index 0ca4c2e16c3..9789498f705 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs @@ -7,7 +7,7 @@ namespace UnityEditor.Rendering.Universal.ShaderGraph { static class CreateFullscreenShaderGraph { - [MenuItem("Assets/Create/Shader Graph/URP/Sprite Unlit Shader Graph", priority = CoreUtils.Sections.section1 + CoreUtils.Priorities.assetsCreateShaderMenuPriority)] + [MenuItem("Assets/Create/Shader Graph/URP/Fullscreen Shader Graph", priority = CoreUtils.Sections.section5 + CoreUtils.Priorities.assetsCreateShaderMenuPriority)] public static void CreateFullscreenGraph() { var target = (UniversalTarget)Activator.CreateInstance(typeof(UniversalTarget)); From baf754a47423f39536ba43907d1deda94f47d2dc Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 30 Sep 2021 16:38:39 +0200 Subject: [PATCH 014/108] Fix camera color buffer sampling in all HDRP custom pass injection points --- .../ShaderGraph/HDFullscreenSubtarget.cs | 10 +---- .../ShaderGraph/Nodes/HDSceneColorNode.cs | 5 +++ .../CustomPass/CustomPassCommon.hlsl | 37 +--------------- .../CustomPass/CustomPassSampling.hlsl | 42 +++++++++++++++++++ .../CustomPass/CustomPassSampling.hlsl.meta | 7 ++++ .../ShaderLibrary/ShaderGraphFunctions.hlsl | 6 +++ .../Editor/ShaderGraph/BuiltInProperties.cs | 3 +- .../Targets/Fullscreen/FullscreenSubTarget.cs | 25 ++++++----- .../Includes/FullscreenShaderPass.cs | 12 ++++++ .../Includes/FullscreenShaderPass.cs.hlsl | 14 +++++++ .../FullscreenShaderPass.cs.hlsl.meta | 7 ++++ .../Includes/FullscreenShaderPass.cs.meta | 11 +++++ .../Fullscreen/Templates/ShaderPass.template | 2 + .../Templates/SharedCode.template.hlsl | 2 - 14 files changed, 126 insertions(+), 57 deletions(-) create mode 100644 com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl create mode 100644 com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.meta diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs index dc5546ef730..10de1070e88 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs @@ -5,6 +5,7 @@ using System; using UnityEditor.Rendering.Fullscreen.ShaderGraph; using UnityEngine.Rendering.HighDefinition; +using UnityEditor.ShaderGraph.Internal; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -23,19 +24,12 @@ public override void Setup(ref TargetSetupContext context) 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 { "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl", IncludeLocation.Pregraph}, { CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph } }; - protected override DefineCollection GetPassDefines(FullscreenCompatibility compatibility) - { - return new DefineCollection - { - { CoreKeywordDescriptors.SurfaceTypeTransparent, 1 }, - }; - } - // We don't need the save context / update materials for now public override object saveContext => null; diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs index 06a3713a497..4198ec2bd05 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs @@ -86,6 +86,11 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener s.AppendLine("#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(_SURFACE_TYPE_TRANSPARENT) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT)"); s.AppendLine("return SampleCameraColor(uv, lod) * exposureMultiplier;"); s.AppendLine("#endif"); + + s.AppendLine("#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(CUSTOM_PASS_SAMPLING_HLSL) && defined(SHADERPASS) && (SHADERPASS == SHADERPASS_DRAWPROCEDURAL || SHADERPASS == SHADERPASS_BLIT)"); + s.AppendLine("return CustomPassSampleCameraColor(uv, 0) * exposureMultiplier;"); + s.AppendLine("#endif"); + s.AppendLine("return $precision3(0.0, 0.0, 0.0);"); } } diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassCommon.hlsl b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassCommon.hlsl index f964a156c7d..ae160d0af06 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassCommon.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassCommon.hlsl @@ -5,45 +5,10 @@ #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonLighting.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" -#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassInjectionPoint.cs.hlsl" +#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl" -float _CustomPassInjectionPoint; float _FadeValue; -// This texture is only available in after post process and contains the result of post processing effects. -// While SampleCameraColor still returns the color pyramid without post processes -TEXTURE2D_X(_AfterPostProcessColorBuffer); - -float3 CustomPassSampleCameraColor(float2 uv, float lod, bool uvGuards = true) -{ - if (uvGuards) - uv = clamp(uv, 0, 1 - _ScreenSize.zw / 2.0); - - switch ((int)_CustomPassInjectionPoint) - { - case CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING: return float3(0, 0, 0); - // there is no color pyramid yet for before transparent so we can't sample with mips. - // Also, we don't use _RTHandleScaleHistory to sample because the color pyramid bound is the actual camera color buffer which is at the resolution of the camera - case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: - case CUSTOMPASSINJECTIONPOINT_BEFORE_PRE_REFRACTION: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScaleHistory.xy, 0).rgb; - case CUSTOMPASSINJECTIONPOINT_AFTER_POST_PROCESS: return SAMPLE_TEXTURE2D_X_LOD(_AfterPostProcessColorBuffer, s_trilinear_clamp_sampler, uv * _RTHandleScaleHistory.xy, 0).rgb; - default: return SampleCameraColor(uv, lod); - } -} - -float3 CustomPassLoadCameraColor(uint2 pixelCoords, float lod) -{ - switch ((int)_CustomPassInjectionPoint) - { - case CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING: return float3(0, 0, 0); - // there is no color pyramid yet for before transparent so we can't sample with mips. - case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: - case CUSTOMPASSINJECTIONPOINT_BEFORE_PRE_REFRACTION: return LOAD_TEXTURE2D_X_LOD(_ColorPyramidTexture, pixelCoords, 0).rgb; - case CUSTOMPASSINJECTIONPOINT_AFTER_POST_PROCESS: return LOAD_TEXTURE2D_X_LOD(_AfterPostProcessColorBuffer, pixelCoords, 0).rgb; - default: return LoadCameraColor(pixelCoords, lod); - } -} - struct Attributes { uint vertexID : SV_VertexID; diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl new file mode 100644 index 00000000000..9195252e8ee --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl @@ -0,0 +1,42 @@ +#ifndef CUSTOM_PASS_SAMPLING_HLSL +#define CUSTOM_PASS_SAMPLING_HLSL + +#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassInjectionPoint.cs.hlsl" + +// This texture is only available in after post process and contains the result of post processing effects. +// While SampleCameraColor still returns the color pyramid without post processes +TEXTURE2D_X(_AfterPostProcessColorBuffer); +float _CustomPassInjectionPoint; + +float3 CustomPassSampleCameraColor(float2 uv, float lod, bool uvGuards = true) +{ + if (uvGuards) + uv = clamp(uv, 0, 1 - _ScreenSize.zw / 2.0); + + switch ((int)_CustomPassInjectionPoint) + { + case CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING: return float3(0, 0, 0); + // there is no color pyramid yet for before transparent so we can't sample with mips. + // Also, we don't use _RTHandleScaleHistory to sample because the color pyramid bound is the actual camera color buffer which is at the resolution of the camera + case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScaleHistory.xy, 0).rgb; + case CUSTOMPASSINJECTIONPOINT_BEFORE_POST_PROCESS: + case CUSTOMPASSINJECTIONPOINT_BEFORE_PRE_REFRACTION: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScale.xy, 0).rgb; + case CUSTOMPASSINJECTIONPOINT_AFTER_POST_PROCESS: return SAMPLE_TEXTURE2D_X_LOD(_AfterPostProcessColorBuffer, s_trilinear_clamp_sampler, uv * _RTHandleScale.zw, 0).rgb; + default: return SampleCameraColor(uv, lod); + } +} + +float3 CustomPassLoadCameraColor(uint2 pixelCoords, float lod) +{ + switch ((int)_CustomPassInjectionPoint) + { + case CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING: return float3(0, 0, 0); + // there is no color pyramid yet for before transparent so we can't sample with mips. + case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: + case CUSTOMPASSINJECTIONPOINT_BEFORE_PRE_REFRACTION: return LOAD_TEXTURE2D_X_LOD(_ColorPyramidTexture, pixelCoords, 0).rgb; + case CUSTOMPASSINJECTIONPOINT_AFTER_POST_PROCESS: return LOAD_TEXTURE2D_X_LOD(_AfterPostProcessColorBuffer, pixelCoords, 0).rgb; + default: return LoadCameraColor(pixelCoords, lod); + } +} + +#endif diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl.meta b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl.meta new file mode 100644 index 00000000000..48fb6cece2f --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 85ec5f9b99ea1ab4293407d695a8439c +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl b/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl index 86080b58668..8e5c81bea60 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl @@ -18,6 +18,12 @@ float3 shadergraph_HDSampleSceneColor(float2 uv) // We always remove the pre-exposure when we sample the scene color return SampleCameraColor(uv) * GetInverseCurrentExposureMultiplier(); #endif + +// Special code for the Fullscreen target to be able to sample the color buffer at different places in the pipeline +#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(CUSTOM_PASS_SAMPLING_HLSL) && defined(SHADERPASS) && (SHADERPASS == SHADERPASS_DRAWPROCEDURAL || SHADERPASS == SHADERPASS_BLIT) + return CustomPassSampleCameraColor(uv, 0) * GetInverseCurrentExposureMultiplier(); +#endif + return float3(0, 0, 0); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/BuiltInProperties.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/BuiltInProperties.cs index 92419fa78d2..a5898a85bc5 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/BuiltInProperties.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/BuiltInProperties.cs @@ -71,7 +71,7 @@ internal static class Keyword internal static class BuiltInMaterialInspectorUtilities { - internal static void AddFloatProperty(this PropertyCollector collector, string referenceName, float defaultValue, HLSLDeclaration declarationType = HLSLDeclaration.DoNotDeclare) + internal static void AddFloatProperty(this PropertyCollector collector, string referenceName, float defaultValue, HLSLDeclaration declarationType = HLSLDeclaration.DoNotDeclare, bool generatePropertyBlock = true) { collector.AddShaderProperty(new Vector1ShaderProperty { @@ -80,6 +80,7 @@ internal static void AddFloatProperty(this PropertyCollector collector, string r overrideHLSLDeclaration = true, hlslDeclarationOverride = declarationType, value = defaultValue, + generatePropertyBlock = generatePropertyBlock, overrideReferenceName = referenceName, }); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 28b82dc5746..607ff7efc59 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -105,6 +105,7 @@ internal abstract class FullscreenSubTarget : SubTarget, IRequiresData Rendering > Generate Shader Includes ] instead +// + +#ifndef FULLSCREENSHADERPASS_CS_HLSL +#define FULLSCREENSHADERPASS_CS_HLSL +// +// UnityEngine.Rendering.HighDefinition.FullscreenShaderPass: static fields +// +#define FULLSCREENSHADERPASS_BLIT (0) +#define FULLSCREENSHADERPASS_DRAW_PROCEDURAL (1) + + +#endif diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl.meta new file mode 100644 index 00000000000..2cc5c6c56fc --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fa6980c25ec2f164ba4a6fcb040eb870 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.meta new file mode 100644 index 00000000000..c57335a26a5 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85ea79b0876d3ee41b7046fb73c1abba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template index 451c79693e9..ec754aab349 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template @@ -23,6 +23,8 @@ $splice(HybridV1InjectedBuiltinProperties) $splice(PassKeywords) $splice(GraphKeywords) +#define FULLSCREEN_SHADERGRAPH + // Defines $SurfaceType.Transparent: // UBER SHADER NOW: #define _SURFACE_TYPE_TRANSPARENT 1 $Attributes.normalOS: #define ATTRIBUTES_NEED_NORMAL diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index 7ab5978407f..4a1746da880 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -30,8 +30,6 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) float3 positionWS = ComputeWorldSpacePosition(input.texCoord0.xy, rawDepth, UNITY_MATRIX_I_VP); float3 viewDirWS = GetWorldSpaceNormalizeViewDir(positionWS); - // positionWS = float3(SHADERGRAPH_SAMPLE_SCENE_DEPTH(input.texCoord0.xy), 0, 0); - $SurfaceDescriptionInputs.ObjectSpaceTangent: output.ObjectSpaceTangent = TransformWorldToObjectDir(output.WorldSpaceTangent); $SurfaceDescriptionInputs.ViewSpaceTangent: output.ViewSpaceTangent = TransformWorldToViewDir(output.WorldSpaceTangent); $SurfaceDescriptionInputs.TangentSpaceTangent: output.TangentSpaceTangent = float3(1.0f, 0.0f, 0.0f); From da7674dd516e3696ae43d9e175f89c274ffef417 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 1 Oct 2021 12:17:01 +0200 Subject: [PATCH 015/108] Added HD scene depth node --- .../ShaderGraph/Nodes/HDSceneDepthNode.cs | 169 ++++++++++++++++++ .../Nodes/HDSceneDepthNode.cs.meta | 11 ++ 2 files changed, 180 insertions(+) create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs.meta diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs new file mode 100644 index 00000000000..16406c0c552 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs @@ -0,0 +1,169 @@ +using System.Collections.Generic; +using System; +using UnityEngine; +using UnityEditor.Graphing; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing.Controls; +using UnityEditor.ShaderGraph.Internal; +using UnityEngine.Rendering.HighDefinition; +using System.Reflection; + +namespace UnityEditor.Rendering.HighDefinition +{ + [SRPFilter(typeof(HDRenderPipeline))] + [Title("Input", "High Definition Render Pipeline", "HD Scene Depth")] + sealed class HDSceneDepthNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture + { + const string k_ScreenPositionSlotName = "UV"; + const string k_LodInputSlotName = "Lod"; + const string k_OutputSlotName = "Output"; + + const int k_ScreenPositionSlotId = 0; + const int k_LodInputSlotId = 1; + const int k_OutputSlotId = 2; + + [SerializeField] + private DepthSamplingMode m_DepthSamplingMode = DepthSamplingMode.Linear01; + + [EnumControl("Sampling Mode")] + public DepthSamplingMode depthSamplingMode + { + get { return m_DepthSamplingMode; } + set + { + if (m_DepthSamplingMode == value) + return; + + m_DepthSamplingMode = value; + Dirty(ModificationScope.Graph); + } + } + + public override string documentationURL => Documentation.GetPageLink("SGNode-HD-Scene-Depth"); + + public HDSceneDepthNode() + { + name = "HD Scene Depth"; + synonyms = new string[] { "hdzbuffer", "hdzdepth" }; + UpdateNodeAfterDeserialization(); + } + + public override bool hasPreview { get { return false; } } + + public sealed override void UpdateNodeAfterDeserialization() + { + AddSlot(new ScreenPositionMaterialSlot(k_ScreenPositionSlotId, k_ScreenPositionSlotName, k_ScreenPositionSlotName, ScreenSpaceType.Default)); + AddSlot(new Vector1MaterialSlot(k_LodInputSlotId, k_LodInputSlotName, k_LodInputSlotName, SlotType.Input, 0, ShaderStageCapability.Fragment)); + AddSlot(new Vector1MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, 0, ShaderStageCapability.Fragment)); + + RemoveSlotsNameNotMatching(new[] + { + k_ScreenPositionSlotId, + k_LodInputSlotId, + k_OutputSlotId, + }); + } + + string GetFunctionName() => "Unity_HDRP_SampleSceneDepth_$precision"; + + public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) + { + // Preview SG doesn't have access to HDRP depth buffer + if (!generationMode.IsPreview()) + { + registry.builder.AppendLine("StructuredBuffer _DepthPyramidMipLevelOffsets;"); + + registry.ProvideFunction(GetFunctionName(), s => + { + s.AppendLine("$precision {0}($precision2 uv, $precision lod)", GetFunctionName()); + using (s.BlockScope()) + { + s.AppendLine("#if defined(REQUIRE_DEPTH_TEXTURE) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT)"); + s.AppendLine("int2 coord = int2(uv * _ScreenSize.xy);"); + s.AppendLine("int2 mipCoord = coord.xy >> int(lod);"); + s.AppendLine("int2 mipOffset = _DepthPyramidMipLevelOffsets[int(lod)];"); + s.AppendLine("return LOAD_TEXTURE2D_X(_CameraDepthTexture, mipOffset + mipCoord).r;"); + s.AppendLine("#endif"); + + s.AppendLine("return 0.0;"); + } + }); + } + } + + public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) + { + if (generationMode.IsPreview()) + { + sb.AppendLine("$precision3 {0} = 0.0;", GetVariableNameForSlot(k_OutputSlotId)); + } + else + { + string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); + string lod = GetSlotValue(k_LodInputSlotId, generationMode); + string depth = $"{GetFunctionName()}({uv}.xy, {lod})"; + + if (depthSamplingMode == DepthSamplingMode.Eye) + depth = $"LinearEyeDepth({depth}, _ZBufferParams)"; + if (depthSamplingMode == DepthSamplingMode.Linear01) + depth = $"Linear01Depth({depth}, _ZBufferParams)"; + + sb.AppendLine($"$precision3 {GetVariableNameForSlot(k_OutputSlotId)} = {depth};"); + } + } + + // protected override MethodInfo GetFunctionToConvert() + // { + // switch (m_DepthSamplingMode) + // { + // case DepthSamplingMode.Raw: + // return GetType().GetMethod("Unity_SceneDepth_Raw", BindingFlags.Static | BindingFlags.NonPublic); + // case DepthSamplingMode.Eye: + // return GetType().GetMethod("Unity_SceneDepth_Eye", BindingFlags.Static | BindingFlags.NonPublic); + // case DepthSamplingMode.Linear01: + // default: + // return GetType().GetMethod("Unity_SceneDepth_Linear01", BindingFlags.Static | BindingFlags.NonPublic); + // } + // } + + // static string Unity_SceneDepth_Linear01( + // [Slot(0, Binding.ScreenPosition)] Vector4 UV, + // [Slot(1, Binding.None, ShaderStageCapability.Fragment)] out Vector1 Out) + // { + // return + // @" + // { + // Out = Linear01Depth(SHADERGRAPH_SAMPLE_SCENE_DEPTH(UV.xy), _ZBufferParams); + // } + // "; + // } + + // static string Unity_SceneDepth_Raw( + // [Slot(0, Binding.ScreenPosition)] Vector4 UV, + // [Slot(1, Binding.None, ShaderStageCapability.Fragment)] out Vector1 Out) + // { + // return + // @" + // { + // Out = SHADERGRAPH_SAMPLE_SCENE_DEPTH(UV.xy); + // } + // "; + // } + + // static string Unity_SceneDepth_Eye( + // [Slot(0, Binding.ScreenPosition)] Vector4 UV, + // [Slot(1, Binding.None, ShaderStageCapability.Fragment)] out Vector1 Out) + // { + // return + // @" + // { + // Out = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH(UV.xy), _ZBufferParams); + // } + // "; + // } + + public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true; + + public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs.meta new file mode 100644 index 00000000000..89c27fecd38 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c415afa2222171f4eaf631824966f118 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From dbc1e1c6cfe3d9da58f3d28711056a524307968c Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 1 Oct 2021 12:18:35 +0200 Subject: [PATCH 016/108] Fix default custom editor in ShaderGraph being only applied if target is compatible with current RP --- com.unity.shadergraph/Editor/Generation/Processors/Generator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs b/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs index cd8bbbc6b54..f4d2c156af7 100644 --- a/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs +++ b/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs @@ -218,7 +218,7 @@ void BuildShader() } var customEditor = context.defaultShaderGUI; - if (customEditor != null && m_Targets[i].WorksWithSRP(GraphicsSettings.currentRenderPipeline)) + if (customEditor != null) m_Builder.AppendLine("CustomEditor \"" + customEditor + "\""); else m_Builder.AppendLine("CustomEditor \"" + typeof(GenericShaderGraphMaterialGUI).FullName + "\""); From 648fc9553cd79f40a55bb7a443c3265800f52449 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 8 Oct 2021 13:24:05 +0200 Subject: [PATCH 017/108] Fix alpha block by default --- .../Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs index 3b39154d4b3..f6ada2277ff 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs @@ -16,7 +16,7 @@ public static void CreateHDFullscreenGraph() var blockDescriptors = new[] { FullscreenBlocks.color, - FullscreenBlocks.alpha, + BlockFields.SurfaceDescription.Alpha, }; GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); From 9b60865df34b3bd05b3da57f0b663935b688f4be Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 8 Oct 2021 13:26:05 +0200 Subject: [PATCH 018/108] Implemented builtin fullscreen pass (compatible with PPV2) --- .../ShaderLibrary/ShaderVariables.hlsl | 8 + .../CreateFullscreenShaderGraph.cs | 2 +- .../CreateFullscreenShaderGraph.cs | 25 + .../CreateFullscreenShaderGraph.cs.meta} | 2 +- .../ShaderGraph/Includes/FullscreenBlit.hlsl | 13 + .../Includes/FullscreenBlit.hlsl.meta | 7 + .../Includes/FullscreenDrawProcedural.hlsl | 13 + .../FullscreenDrawProcedural.hlsl.meta | 7 + .../ShaderGraph/Targets/BuiltInTarget.cs | 64 ++ .../Targets/BuiltinFullscreenSubTarget.cs | 50 ++ .../BuiltinFullscreenSubTarget.cs.meta | 11 + .../Targets/Fullscreen/FullscreenSubTarget.cs | 116 +-- .../Targets/Fullscreen/FullscreenTarget.cs | 820 ------------------ .../Fullscreen/Includes/FullscreenCommon.hlsl | 75 +- .../Fullscreen/Templates/ShaderPass.template | 1 + .../Templates/SharedCode.template.hlsl | 8 +- 16 files changed, 312 insertions(+), 910 deletions(-) create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs rename com.unity.shadergraph/Editor/Generation/Targets/{Fullscreen/FullscreenTarget.cs.meta => BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta} (83%) create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs diff --git a/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl b/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl index f4ee8db4208..d1214275fc6 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl @@ -298,6 +298,14 @@ float4x4 OptimizeProjectionMatrix(float4x4 M) // Helper to handle camera relative space +float3 GetCameraPositionWS() +{ +#if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) + return 0; +#endif + return _WorldSpaceCameraPos; +} + float4x4 ApplyCameraTranslationToMatrix(float4x4 modelMatrix) { // To handle camera relative rendering we substract the camera position in the model matrix diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs index 9789498f705..1d612850284 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs @@ -16,7 +16,7 @@ public static void CreateFullscreenGraph() var blockDescriptors = new[] { FullscreenBlocks.color, - FullscreenBlocks.alpha, + BlockFields.SurfaceDescription.Alpha, }; GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs new file mode 100644 index 00000000000..6ffce0aabef --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs @@ -0,0 +1,25 @@ +using System; +using UnityEditor.ShaderGraph; +using UnityEngine.Rendering; +using UnityEditor.Rendering.Fullscreen.ShaderGraph; + +namespace UnityEditor.Rendering.BuiltIn.ShaderGraph +{ + static class CreateFullscreenShaderGraph + { + [MenuItem("Assets/Create/Shader Graph/BuiltIn/Fullscreen Shader Graph", priority = CoreUtils.Sections.section1 + CoreUtils.Priorities.assetsCreateShaderMenuPriority + 2)] + public static void CreateFullscreenGraph() + { + var target = (BuiltInTarget)Activator.CreateInstance(typeof(BuiltInTarget)); + target.TrySetActiveSubTarget(typeof(BuiltInFullscreenSubTarget)); + + var blockDescriptors = new[] + { + FullscreenBlocks.color, + BlockFields.SurfaceDescription.Alpha, + }; + + GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); + } + } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta similarity index 83% rename from com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs.meta rename to com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta index 2469d7df93b..1899ab157c3 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs.meta +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 11771342b6f6ab840ba9e2274ddd9db3 +guid: b21e44f5d6b2a2f41bda30a18a433533 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl new file mode 100644 index 00000000000..4ef6e47bd2e --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl @@ -0,0 +1,13 @@ +PackedVaryings vert(Attributes input) +{ + Varyings output = (Varyings)0; + output.positionCS = GetBlitVertexPosition(input.vertexID); + BuildVaryingsWithoutInverseProjection(input, output); + PackedVaryings packedOutput = PackVaryings(output); + return packedOutput; +} + +FragOutput frag(PackedVaryings packedInput) +{ + return DefaultFullscreenFragmentShader(packedInput); +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl.meta new file mode 100644 index 00000000000..6603adc2824 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f367227261484eb45a7536634abc524a +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl new file mode 100644 index 00000000000..eff46a4e977 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl @@ -0,0 +1,13 @@ +PackedVaryings vert(Attributes input) +{ + Varyings output = (Varyings)0; + output.positionCS = GetDrawProceduralVertexPosition(input.vertexID); + BuildVaryingsWithoutInverseProjection(input, output); + PackedVaryings packedOutput = PackVaryings(output); + return packedOutput; +} + +FragOutput frag(PackedVaryings packedInput) +{ + return DefaultFullscreenFragmentShader(packedInput); +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl.meta new file mode 100644 index 00000000000..69695c04ee7 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2ce2dd97f9cccb84486a31e307b435ed +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs index ee227802fed..6786986f024 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs @@ -81,6 +81,10 @@ sealed class BuiltInTarget : Target, IHasMetadata List m_SubTargetNames; int activeSubTargetIndex => m_SubTargets.IndexOf(m_ActiveSubTarget); + // Subtarget Data + [SerializeField] + List> m_Datas = new List>(); + // View PopupField m_SubTargetField; TextField m_CustomGUIField; @@ -122,6 +126,7 @@ public BuiltInTarget() m_SubTargets = TargetUtils.GetSubTargets(this); m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList(); TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + ProcessSubTargetDatas(m_ActiveSubTarget.value); } public string renderType @@ -247,6 +252,7 @@ public override void Setup(ref TargetSetupContext context) if (m_ActiveSubTarget.value == null) return; m_ActiveSubTarget.value.target = this; + ProcessSubTargetDatas(m_ActiveSubTarget.value); m_ActiveSubTarget.value.Setup(ref context); // Override EditorGUI @@ -316,6 +322,7 @@ public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Acti registerUndo("Change Material"); m_ActiveSubTarget = m_SubTargets[m_SubTargetField.index]; + ProcessSubTargetDatas(m_ActiveSubTarget.value); onChange(); }); @@ -425,6 +432,7 @@ public bool TrySetActiveSubTarget(Type subTargetType) if (subTarget.GetType().Equals(subTargetType)) { m_ActiveSubTarget = subTarget; + ProcessSubTargetDatas(m_ActiveSubTarget); return true; } } @@ -432,6 +440,62 @@ public bool TrySetActiveSubTarget(Type subTargetType) return false; } + void ProcessSubTargetDatas(SubTarget subTarget) + { + var typeCollection = TypeCache.GetTypesDerivedFrom(); + foreach (var type in typeCollection) + { + if (type.IsGenericType) + continue; + + // Data requirement interfaces need generic type arguments + // Therefore we need to use reflections to call the method + var methodInfo = typeof(BuiltInTarget).GetMethod(nameof(SetDataOnSubTarget)); + var genericMethodInfo = methodInfo.MakeGenericMethod(type); + genericMethodInfo.Invoke(this, new object[] { subTarget }); + } + } + + void ClearUnusedData() + { + for (int i = 0; i < m_Datas.Count; i++) + { + var data = m_Datas[i]; + var type = data.value.GetType(); + + // Data requirement interfaces need generic type arguments + // Therefore we need to use reflections to call the method + var methodInfo = typeof(BuiltInTarget).GetMethod(nameof(ValidateDataForSubTarget)); + var genericMethodInfo = methodInfo.MakeGenericMethod(type); + genericMethodInfo.Invoke(this, new object[] { m_ActiveSubTarget.value, data.value }); + } + } + + public void SetDataOnSubTarget(SubTarget subTarget) where T : JsonObject + { + if (!(subTarget is IRequiresData requiresData)) + return; + + // Ensure data object exists in list + var data = m_Datas.SelectValue().FirstOrDefault(x => x.GetType().Equals(typeof(T))) as T; + if (data == null) + { + data = Activator.CreateInstance(typeof(T)) as T; + m_Datas.Add(data); + } + + // Apply data object to SubTarget + requiresData.data = data; + } + + public void ValidateDataForSubTarget(SubTarget subTarget, T data) where T : JsonObject + { + if (!(subTarget is IRequiresData requiresData)) + { + m_Datas.Remove(data); + } + } + public override bool WorksWithSRP(RenderPipelineAsset scriptableRenderPipeline) { return scriptableRenderPipeline == null; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs new file mode 100644 index 00000000000..96298f38ad0 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs @@ -0,0 +1,50 @@ +using UnityEditor.ShaderGraph; +using UnityEngine; +using static UnityEditor.Rendering.BuiltIn.ShaderUtils; +using UnityEditor.Rendering.BuiltIn; +using System; +using UnityEditor.Rendering.Fullscreen.ShaderGraph; + +namespace UnityEditor.Rendering.BuiltIn.ShaderGraph +{ + class BuiltInFullscreenSubTarget : FullscreenSubTarget, IRequiresData + { + static readonly GUID kSourceCodeGuid = new GUID("3107a8a084c35ab4cb765b37e0699ce3"); // BuiltInFullscreenSubTarget.cs // TODO + + // In builtin there is no inverse view projection matrix, so we need to compute it in the vertex shader + protected override string fullscreenDrawProceduralInclude => "Packages/com.unity.shadergraph/Editor/Generation/Targets/Builtin/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl"; + protected override string fullscreenBlitInclude => "Packages/com.unity.shadergraph/Editor/Generation/Targets/Builtin/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl"; + + public override void Setup(ref TargetSetupContext context) + { + base.Setup(ref context); + context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); + } + + // We don't need the save context / update materials for now + public override object saveContext => null; + + protected override string pipelineTag => ""; // Buitin is enabled by having an empty tag + + public override IncludeCollection GetPreGraphIncludes() + { + return new IncludeCollection + { + { kFullscreenShaderPass, IncludeLocation.Pregraph }, // For VR + { CoreIncludes.CorePregraph }, + { CoreIncludes.ShaderGraphPregraph }, + { kSpaceTransforms, IncludeLocation.Pregraph }, + }; + } + + protected override DefineCollection GetPassDefines(FullscreenCompatibility compatibility) + { + return CoreDefines.BuiltInTargetAPI; + } + + public BuiltInFullscreenSubTarget() + { + displayName = "Fullscreen"; + } + } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs.meta new file mode 100644 index 00000000000..6492eb439a4 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3107a8a084c35ab4cb765b37e0699ce3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 607ff7efc59..94b3121dca6 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -1,12 +1,8 @@ using UnityEditor.ShaderGraph; using UnityEngine; -using static UnityEditor.Rendering.BuiltIn.ShaderUtils; -using UnityEditor.Rendering.BuiltIn; using System; using UnityEditor.ShaderGraph.Internal; using System.Linq; -// TODO: remove this dependency to builtin target -using UnityEditor.Rendering.BuiltIn.ShaderGraph; using BlendMode = UnityEngine.Rendering.BlendMode; using BlendOp = UnityEditor.ShaderGraph.BlendOp; using UnityEngine.UIElements; @@ -15,14 +11,12 @@ namespace UnityEditor.Rendering.Fullscreen.ShaderGraph { - [GenerateBlocks] + [GenerateBlocks("Fullscreen")] internal struct FullscreenBlocks { - public static BlockFieldDescriptor color = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Color", "Color", + public static BlockFieldDescriptor color = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "FullscreenColor", "Color", "SURFACEDESCRIPTION_COLOR", new ColorControl(UnityEngine.Color.grey, true), ShaderStage.Fragment); - public static BlockFieldDescriptor alpha = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Alpha", "Alpha", - "SURFACEDESCRIPTION_Alpha", new FloatControl(1), ShaderStage.Fragment); - public static BlockFieldDescriptor depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "Depth", "Depth", + public static BlockFieldDescriptor depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "FullscreenDepth", "Depth", "SURFACEDESCRIPTION_DEPTH", new FloatControl(0), ShaderStage.Fragment); } @@ -97,18 +91,18 @@ internal abstract class FullscreenSubTarget : SubTarget, IRequiresData "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl"; + protected virtual string fullscreenBlitInclude => "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl"; FullscreenData m_FullscreenData; @@ -127,14 +121,11 @@ public FullscreenData fullscreenData public override void Setup(ref TargetSetupContext context) { context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); - - if (context.customEditorForRenderPipelines.Count == 0) - context.SetDefaultShaderGUI(GetDefaultShaderGUI().FullName); - + context.SetDefaultShaderGUI(GetDefaultShaderGUI().FullName); context.AddSubShader(GenerateSubShader()); } - protected abstract IncludeCollection pregraphIncludes { get; } + protected virtual IncludeCollection pregraphIncludes => new IncludeCollection(); protected abstract string pipelineTag { get; } protected virtual Type GetDefaultShaderGUI() => typeof(FullscreenShaderGUI); @@ -288,9 +279,8 @@ public virtual IncludeCollection GetPostGraphIncludes() { StructFields.Varyings.positionCS, StructFields.Varyings.texCoord0, + StructFields.Varyings.texCoord1, StructFields.Varyings.instanceID, - // BuiltInStructFields.Varyings.stereoTargetEyeIndexAsBlendIdx0, - // BuiltInStructFields.Varyings.stereoTargetEyeIndexAsRTArrayIdx, } }; @@ -318,7 +308,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com validPixelBlocks = new BlockFieldDescriptor[] { FullscreenBlocks.color, - FullscreenBlocks.alpha, + BlockFields.SurfaceDescription.Alpha, FullscreenBlocks.depth, }, @@ -335,6 +325,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com { StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code StructFields.Varyings.texCoord0, + StructFields.Varyings.texCoord1, // We store the view direction computed in the vertex in the texCoord1 StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case }, @@ -366,14 +357,13 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com { default: case FullscreenCompatibility.Blit: - fullscreenPass.includes.Add(kFullscreenBlitInclude, IncludeLocation.Postgraph); + fullscreenPass.includes.Add(fullscreenBlitInclude, IncludeLocation.Postgraph); + Debug.Log(fullscreenBlitInclude); break; case FullscreenCompatibility.DrawProcedural: - fullscreenPass.includes.Add(kFullscreenDrawProceduralInclude, IncludeLocation.Postgraph); + fullscreenPass.includes.Add(fullscreenDrawProceduralInclude, IncludeLocation.Postgraph); + Debug.Log(fullscreenDrawProceduralInclude); break; - // case FullscreenCompatibility.CustomRenderTexture: - // fullscreenPass.includes.Add(kCustomRenderTextureInclude, IncludeLocation.Postgraph); - // break; } return fullscreenPass; @@ -403,30 +393,6 @@ public override bool IsNodeAllowedBySubTarget(Type nodeType) public override bool IsActive() => true; - public override void ProcessPreviewMaterial(Material material) - { - // if (target.allowMaterialOverride) - { - // copy our target's default settings into the material - // (technically not necessary since we are always recreating the material from the shader each time, - // which will pull over the defaults from the shader definition) - // but if that ever changes, this will ensure the defaults are set - // TODO: - // material.SetFloat(Property.Blend(), (float)target.alphaMode); - // material.SetFloat(Property.ZWriteControl(), target.zWrite ? 1 : 0); // TODO - // material.SetFloat(Property.ZTest(), (float)target.depthTestMode); - } - - // We always need these properties regardless of whether the material is allowed to override - // Queue control & offset enable correct automatic render queue behavior - // Control == 0 is automatic, 1 is user-specified render queue - // material.SetFloat(Property.QueueOffset(), 0.0f); - // material.SetFloat(Property.QueueControl(), (float)BuiltInBaseShaderGUI.QueueControl.Auto); - - // call the full unlit material setup function - // BuiltInUnlitGUI.UpdateMaterial(material); - } - public override void GetFields(ref TargetFieldContext context) { context.AddField(UnityEditor.ShaderGraph.Fields.GraphPixel); @@ -436,7 +402,7 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { context.AddBlock(FullscreenBlocks.color); - context.AddBlock(FullscreenBlocks.alpha); + context.AddBlock(BlockFields.SurfaceDescription.Alpha); context.AddBlock(FullscreenBlocks.depth, fullscreenData.depthWrite); } @@ -487,17 +453,6 @@ public void CollectRenderStateShaderProperties(PropertyCollector collector, Gene public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) { - // TODO: cleanup - // context.AddProperty("Compatibility", new EnumField(fullscreenData.fullscreenMode) { value = fullscreenData.fullscreenMode }, (evt) => - // { - // if (Equals(fullscreenData.fullscreenMode, evt.newValue)) - // return; - - // registerUndo("Change Compatibility"); - // fullscreenData.fullscreenMode = (FullscreenMode)evt.newValue; - // onChange(); - // }); - context.AddProperty("Allow Material Override", new Toggle() { value = fullscreenData.allowMaterialOverride }, (evt) => { if (Equals(fullscreenData.allowMaterialOverride, evt.newValue)) @@ -698,13 +653,6 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac }); } - - #region SubShader - static class SubShaders - { - - } - #endregion } internal static class FullscreenPropertyCollectorExtension @@ -748,5 +696,19 @@ public static void AddBoolProperty(this PropertyCollector collector, string prop overrideReferenceName = prop, }); } + + public static void AddFloatProperty(this PropertyCollector collector, string referenceName, float defaultValue, HLSLDeclaration declarationType = HLSLDeclaration.DoNotDeclare, bool generatePropertyBlock = true) + { + collector.AddShaderProperty(new Vector1ShaderProperty + { + floatType = FloatType.Default, + hidden = true, + overrideHLSLDeclaration = true, + hlslDeclarationOverride = declarationType, + value = defaultValue, + generatePropertyBlock = generatePropertyBlock, + overrideReferenceName = referenceName, + }); + } } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs deleted file mode 100644 index 9eb33e3a7a1..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenTarget.cs +++ /dev/null @@ -1,820 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.UIElements; -using UnityEditor.UIElements; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Serialization; -using UnityEditor.Rendering.BuiltIn; -using UnityEditor.Rendering.BuiltIn.ShaderGraph; -using BlendMode = UnityEngine.Rendering.BlendMode; -using BlendOp = UnityEditor.ShaderGraph.BlendOp; -using UnityEditor.ShaderGraph.Internal; - -namespace UnityEditor.Rendering.Fullscreen.ShaderGraph -{ - // class FullscreenTarget : Target, IHasMetadata, IMaySupportVFX - // { - // public override int latestVersion => 0; - - // // Constants - // static readonly GUID kSourceCodeGuid = new GUID("11771342b6f6ab840ba9e2274ddd9db3"); // FullscreenTarget.cs - // public static readonly string[] kSharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories().Union(new string[] { "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates" }).ToArray(); - - // // SubTarget - // List m_SubTargets; - // List m_SubTargetNames; - // int activeSubTargetIndex => m_SubTargets.IndexOf(m_ActiveSubTarget); - - // // View - // PopupField m_SubTargetField; - // TextField m_CustomGUIField; - - // [SerializeField] - // JsonData m_ActiveSubTarget; - - // // [SerializeField] - // // FullscreenMode m_fullscreenMode; - - // // // When checked, allows the material to control ALL surface settings (uber shader style) - // // [SerializeField] - // // bool m_AllowMaterialOverride = false; - - // // [SerializeField] - // // FullscreenBlendMode m_BlendMode = FullscreenBlendMode.Disabled; - - // // [SerializeField] - // // BlendMode m_SrcColorBlendMode = BlendMode.Zero; - // // [SerializeField] - // // BlendMode m_DstColorBlendMode = BlendMode.One; - // // [SerializeField] - // // BlendOp m_ColorBlendOperation = BlendOp.Add; - - // // [SerializeField] - // // BlendMode m_SrcAlphaBlendMode = BlendMode.Zero; - // // [SerializeField] - // // BlendMode m_DstAlphaBlendMode = BlendMode.One; - // // [SerializeField] - // // BlendOp m_AlphaBlendOperation = BlendOp.Add; - - // // [SerializeField] - // // bool m_EnableStencil = false; - // // [SerializeField] - // // int m_StencilReference = 0; - // // [SerializeField] - // // int m_StencilReadMask = 255; - // // [SerializeField] - // // int m_StencilWriteMask = 255; - // // [SerializeField] - // // CompareFunction m_StencilCompareFunction = CompareFunction.Always; - // // [SerializeField] - // // StencilOp m_StencilPassOperation = StencilOp.Keep; - // // [SerializeField] - // // StencilOp m_StencilFailOperation = StencilOp.Keep; - // // [SerializeField] - // // StencilOp m_StencilDepthFailOperation = StencilOp.Keep; - - // // [SerializeField] - // // bool m_DepthWrite = false; - - // // [SerializeField] - // ZTestMode m_DepthTestMode = ZTestMode.Always; - - // // [SerializeField] - // // string m_CustomEditorGUI; - - // // internal override bool ignoreCustomInterpolators => true; - // // internal override int padCustomInterpolatorLimit => 4; - - // public FullscreenTarget() - // { - // displayName = "Fullscreen"; - // m_SubTargets = TargetUtils.GetSubTargets(this); - // m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList(); - // TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); - // } - - // // public FullscreenMode fullscreenMode - // // { - // // get => m_fullscreenMode; - // // set => m_fullscreenMode = value; - // // } - - // // public FullscreenBlendMode blendMode - // // { - // // get => m_BlendMode; - // // set => m_BlendMode = value; - // // } - - // // public BlendMode srcColorBlendMode - // // { - // // get => m_SrcColorBlendMode; - // // set => m_SrcColorBlendMode = value; - // // } - - // // public BlendMode dstColorBlendMode - // // { - // // get => m_DstColorBlendMode; - // // set => m_DstColorBlendMode = value; - // // } - - // // public BlendOp colorBlendOperation - // // { - // // get => m_ColorBlendOperation; - // // set => m_ColorBlendOperation = value; - // // } - - // // public BlendMode srcAlphaBlendMode - // // { - // // get => m_SrcAlphaBlendMode; - // // set => m_SrcAlphaBlendMode = value; - // // } - - // // public BlendMode dstAlphaBlendMode - // // { - // // get => m_DstAlphaBlendMode; - // // set => m_DstAlphaBlendMode = value; - // // } - - // // public BlendOp alphaBlendOperation - // // { - // // get => m_AlphaBlendOperation; - // // set => m_AlphaBlendOperation = value; - // // } - - // // public bool enableStencil - // // { - // // get => m_EnableStencil; - // // set => m_EnableStencil = value; - // // } - - // // public int stencilReference - // // { - // // get => m_StencilReference; - // // set => m_StencilReference = Mathf.Clamp(value, 0, 255); - // // } - - // // public int stencilReadMask - // // { - // // get => m_StencilReadMask; - // // set => m_StencilReadMask = Mathf.Clamp(value, 0, 255); - // // } - - // // public int stencilWriteMask - // // { - // // get => m_StencilWriteMask; - // // set => m_StencilWriteMask = Mathf.Clamp(value, 0, 255); - // // } - - // // public CompareFunction stencilCompareFunction - // // { - // // get => m_StencilCompareFunction; - // // set => m_StencilCompareFunction = value; - // // } - - // // public StencilOp stencilPassOperation - // // { - // // get => m_StencilPassOperation; - // // set => m_StencilPassOperation = value; - // // } - - // // public StencilOp stencilFailOperation - // // { - // // get => m_StencilFailOperation; - // // set => m_StencilFailOperation = value; - // // } - - // // public StencilOp stencilDepthTestFailOperation - // // { - // // get => m_StencilDepthFailOperation; - // // set => m_StencilDepthFailOperation = value; - // // } - - // // public bool depthWrite - // // { - // // get => m_DepthWrite; - // // set => m_DepthWrite = value; - // // } - - // public SubTarget activeSubTarget - // { - // get => m_ActiveSubTarget.value; - // set => m_ActiveSubTarget = value; - // } - - // // public bool allowMaterialOverride - // // { - // // get => m_AllowMaterialOverride; - // // set => m_AllowMaterialOverride = value; - // // } - - // // public ZTestMode depthTestMode - // // { - // // get => m_DepthTestMode; - // // set => m_DepthTestMode = value; - // // } - - // // public string customEditorGUI - // // { - // // get => m_CustomEditorGUI; - // // set => m_CustomEditorGUI = value; - // // } - - // public override bool IsActive() => activeSubTarget.IsActive(); - - // public override bool IsNodeAllowedByTarget(Type nodeType) - // { - // bool allowed = true; - - // var interfaces = nodeType.GetInterfaces(); - // // FIXME: allow to sample depth and color in a fullscreen node (needed to compute position) - // if (interfaces.Contains(typeof(IMayRequirePosition))) - // allowed = false; - // if (interfaces.Contains(typeof(IMayRequirePositionPredisplacement))) - // allowed = false; - // if (interfaces.Contains(typeof(IMayRequireCameraOpaqueTexture))) - // allowed = false; - // if (interfaces.Contains(typeof(IMayRequireDepthTexture))) - // allowed = false; - - // // TODO: add a node to sample the normal buffer: - // if (interfaces.Contains(typeof(IMayRequireNormal))) - // allowed = false; - - // // We don't have access to the tangent in fullscreen - // if (interfaces.Contains(typeof(IMayRequireTangent))) - // allowed = false; - // if (interfaces.Contains(typeof(IMayRequireBitangent))) - // allowed = false; - - // // There is no input in the vertex block for now - // if (interfaces.Contains(typeof(IMayRequireVertexColor))) - // allowed = false; - // if (interfaces.Contains(typeof(IMayRequireVertexID))) - // allowed = false; - // if (interfaces.Contains(typeof(IMayRequireVertexSkinning))) - // allowed = false; - - // // TODO: this is a workaround for all classes that inherit from CodeFunctionNode but doesn't need forbidden inputs - // if (typeof(CodeFunctionNode).IsAssignableFrom(nodeType)) - // allowed = true; - - // if (fullscreenMode == FullscreenMode.CustomRenderTexture) - // { - // // We can't sample scene info in custom render textures, they are executed outside the pipeline (for now) - // allowed &= nodeType != typeof(SceneColorNode); - // allowed &= nodeType != typeof(SceneDepthNode); - // } - - // SubTargetFilterAttribute subTargetFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); - // bool worksWithThisSubTarget = subTargetFilter == null || subTargetFilter.subTargetTypes.Contains(activeSubTarget.GetType()); - - // var subTarget = activeSubTarget as IIsNodeAllowedBySubTarget; - - // return allowed && base.IsNodeAllowedByTarget(nodeType) && subTarget.IsNodeAllowedByTarget(nodeType); - // } - - // public override void Setup(ref TargetSetupContext context) - // { - // // Setup the Target - // context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); - - // // Setup the active SubTarget - // TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); - // if (m_ActiveSubTarget.value == null) - // return; - // m_ActiveSubTarget.value.target = this; - // m_ActiveSubTarget.value.Setup(ref context); - - // // Override EditorGUI - // if (!string.IsNullOrEmpty(m_CustomEditorGUI)) - // { - // context.SetDefaultShaderGUI(m_CustomEditorGUI); - // } - // } - - // public override void OnAfterMultiDeserialize(string json) - // { - // TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); - // m_ActiveSubTarget.value.target = this; - // } - - // public override void GetFields(ref TargetFieldContext context) - // { - // var descs = context.blocks.Select(x => x.descriptor); - - // context.AddField(UnityEditor.ShaderGraph.Fields.GraphPixel); - // context.AddField(Fields.depth, depthWrite); - - // // SubTarget fields - // m_ActiveSubTarget.value.GetFields(ref context); - // } - - // public override void GetActiveBlocks(ref TargetActiveBlockContext context) - // { - // // Core blocks - // context.AddBlock(Blocks.color); - // context.AddBlock(Blocks.depth, depthWrite); - - // // SubTarget blocks - // m_ActiveSubTarget.value.GetActiveBlocks(ref context); - // } - - // public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) - // { - // base.CollectShaderProperties(collector, generationMode); - // activeSubTarget.CollectShaderProperties(collector, generationMode); - // } - - // public void CollectRenderStateShaderProperties(PropertyCollector collector, GenerationMode generationMode) - // { - // if (generationMode != GenerationMode.Preview && allowMaterialOverride) - // { - // // When blend mode is disabled, we can't override - // if (blendMode != FullscreenBlendMode.Disabled) - // { - // collector.AddEnumProperty(Uniforms.blendModeProperty, blendMode); - // collector.AddEnumProperty(Uniforms.srcColorBlendProperty, srcColorBlendMode); - // collector.AddEnumProperty(Uniforms.dstColorBlendProperty, dstColorBlendMode); - // collector.AddEnumProperty(Uniforms.srcAlphaBlendProperty, srcAlphaBlendMode); - // collector.AddEnumProperty(Uniforms.dstAlphaBlendProperty, dstAlphaBlendMode); - // collector.AddEnumProperty(Uniforms.colorBlendOperationProperty, colorBlendOperation); - // collector.AddEnumProperty(Uniforms.alphaBlendOperationProperty, alphaBlendOperation); - // } - // collector.AddFloatProperty(Uniforms.depthWriteProperty, depthWrite ? 1 : 0); - // collector.AddFloatProperty(Uniforms.depthTestProperty, (float)depthTestMode); - - // // When stencil is disabled, we can't override - // if (enableStencil) - // { - // collector.AddBoolProperty(Uniforms.stencilEnableProperty, enableStencil); - // collector.AddIntProperty(Uniforms.stencilReferenceProperty, stencilReference); - // collector.AddIntProperty(Uniforms.stencilReadMaskProperty, stencilReadMask); - // collector.AddIntProperty(Uniforms.stencilWriteMaskProperty, stencilWriteMask); - // collector.AddEnumProperty(Uniforms.stencilComparisonProperty, stencilCompareFunction); - // collector.AddEnumProperty(Uniforms.stencilPassProperty, stencilPassOperation); - // collector.AddEnumProperty(Uniforms.stencilFailProperty, stencilFailOperation); - // collector.AddEnumProperty(Uniforms.stencilDepthFailProperty, stencilDepthTestFailOperation); - // } - // } - // } - - // public override void ProcessPreviewMaterial(Material material) - // { - // m_ActiveSubTarget.value.ProcessPreviewMaterial(material); - // } - - // public override object saveContext => m_ActiveSubTarget.value?.saveContext; - - // public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) - // { - // if (m_ActiveSubTarget.value == null) - // return; - - // context.AddProperty("Compatibility", new EnumField(fullscreenMode) { value = fullscreenMode }, (evt) => - // { - // if (Equals(fullscreenMode, evt.newValue)) - // return; - - // registerUndo("Change Compatibility"); - // fullscreenMode = (FullscreenMode)evt.newValue; - // onChange(); - // }); - - // context.AddProperty("Allow Material Override", new Toggle() { value = allowMaterialOverride }, (evt) => - // { - // if (Equals(allowMaterialOverride, evt.newValue)) - // return; - - // registerUndo("Change Allow Material Override"); - // allowMaterialOverride = evt.newValue; - // onChange(); - // }); - - // GetRenderStatePropertiesGUI(ref context, onChange, registerUndo); - - // // SubTarget properties - // m_ActiveSubTarget.value.GetPropertiesGUI(ref context, onChange, registerUndo); - - // // Custom Editor GUI - // // Requires FocusOutEvent - // m_CustomGUIField = new TextField("") { value = customEditorGUI }; - // m_CustomGUIField.RegisterCallback(s => - // { - // if (Equals(customEditorGUI, m_CustomGUIField.value)) - // return; - - // registerUndo("Change Custom Editor GUI"); - // customEditorGUI = m_CustomGUIField.value; - // onChange(); - // }); - // context.AddProperty("Custom Editor GUI", m_CustomGUIField, (evt) => { }); - // } - - // public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) - // { - // context.AddProperty("Blend Mode", new EnumField(blendMode) { value = blendMode }, (evt) => - // { - // if (Equals(blendMode, evt.newValue)) - // return; - - // registerUndo("Change Blend Mode"); - // blendMode = (FullscreenBlendMode)evt.newValue; - // onChange(); - // }); - - // if (blendMode == FullscreenBlendMode.Custom) - // { - // context.globalIndentLevel++; - // context.AddLabel("Color Blend Mode", 0); - - // context.AddProperty("Src Color", new EnumField(srcColorBlendMode) { value = srcColorBlendMode }, (evt) => - // { - // if (Equals(srcColorBlendMode, evt.newValue)) - // return; - - // registerUndo("Change Blend Mode"); - // srcColorBlendMode = (BlendMode)evt.newValue; - // onChange(); - // }); - // context.AddProperty("Dst Color", new EnumField(dstColorBlendMode) { value = dstColorBlendMode }, (evt) => - // { - // if (Equals(dstColorBlendMode, evt.newValue)) - // return; - - // registerUndo("Change Blend Mode"); - // dstColorBlendMode = (BlendMode)evt.newValue; - // onChange(); - // }); - // context.AddProperty("Color Operation", new EnumField(colorBlendOperation) { value = colorBlendOperation }, (evt) => - // { - // if (Equals(colorBlendOperation, evt.newValue)) - // return; - - // registerUndo("Change Blend Mode"); - // colorBlendOperation = (BlendOp)evt.newValue; - // onChange(); - // }); - - // context.AddLabel("Alpha Blend Mode", 0); - - - // context.AddProperty("Src", new EnumField(srcAlphaBlendMode) { value = srcAlphaBlendMode }, (evt) => - // { - // if (Equals(srcAlphaBlendMode, evt.newValue)) - // return; - - // registerUndo("Change Blend Mode"); - // srcAlphaBlendMode = (BlendMode)evt.newValue; - // onChange(); - // }); - // context.AddProperty("Dst", new EnumField(dstAlphaBlendMode) { value = dstAlphaBlendMode }, (evt) => - // { - // if (Equals(dstAlphaBlendMode, evt.newValue)) - // return; - - // registerUndo("Change Blend Mode"); - // dstAlphaBlendMode = (BlendMode)evt.newValue; - // onChange(); - // }); - // context.AddProperty("Blend Operation Alpha", new EnumField(alphaBlendOperation) { value = alphaBlendOperation }, (evt) => - // { - // if (Equals(alphaBlendOperation, evt.newValue)) - // return; - - // registerUndo("Change Blend Mode"); - // alphaBlendOperation = (BlendOp)evt.newValue; - // onChange(); - // }); - - // context.globalIndentLevel--; - // } - - // context.AddProperty("Enable Stencil", new Toggle { value = enableStencil }, (evt) => - // { - // if (Equals(enableStencil, evt.newValue)) - // return; - - // registerUndo("Change Enable Stencil"); - // enableStencil = evt.newValue; - // onChange(); - // }); - - // if (enableStencil) - // { - // context.globalIndentLevel++; - - // context.AddProperty("Reference", new IntegerField { value = stencilReference, isDelayed = true }, (evt) => - // { - // if (Equals(stencilReference, evt.newValue)) - // return; - - // registerUndo("Change Stencil Reference"); - // stencilReference = evt.newValue; - // onChange(); - // }); - - // context.AddProperty("Read Mask", new IntegerField { value = stencilReadMask, isDelayed = true }, (evt) => - // { - // if (Equals(stencilReadMask, evt.newValue)) - // return; - - // registerUndo("Change Stencil Read Mask"); - // stencilReadMask = evt.newValue; - // onChange(); - // }); - - // context.AddProperty("Write Mask", new IntegerField { value = stencilWriteMask, isDelayed = true }, (evt) => - // { - // if (Equals(stencilWriteMask, evt.newValue)) - // return; - - // registerUndo("Change Stencil Write Mask"); - // stencilWriteMask = evt.newValue; - // onChange(); - // }); - - // context.AddProperty("Comparison", new EnumField(stencilCompareFunction) { value = stencilCompareFunction }, (evt) => - // { - // if (Equals(stencilCompareFunction, evt.newValue)) - // return; - - // registerUndo("Change Stencil Comparison"); - // stencilCompareFunction = (CompareFunction)evt.newValue; - // onChange(); - // }); - - // context.AddProperty("Pass", new EnumField(stencilPassOperation) { value = stencilPassOperation }, (evt) => - // { - // if (Equals(stencilPassOperation, evt.newValue)) - // return; - - // registerUndo("Change Stencil Pass Operation"); - // stencilPassOperation = (StencilOp)evt.newValue; - // onChange(); - // }); - - // context.AddProperty("Fail", new EnumField(stencilFailOperation) { value = stencilFailOperation }, (evt) => - // { - // if (Equals(stencilFailOperation, evt.newValue)) - // return; - - // registerUndo("Change Stencil Fail Operation"); - // stencilFailOperation = (StencilOp)evt.newValue; - // onChange(); - // }); - - // context.AddProperty("Depth Fail", new EnumField(stencilDepthTestFailOperation) { value = stencilDepthTestFailOperation }, (evt) => - // { - // if (Equals(stencilDepthTestFailOperation, evt.newValue)) - // return; - - // registerUndo("Change Stencil Depth Fail Operation"); - // stencilDepthTestFailOperation = (StencilOp)evt.newValue; - // onChange(); - // }); - - // context.globalIndentLevel--; - // } - - // context.AddProperty("Depth Test", new EnumField(ZTestMode.LEqual) { value = depthTestMode }, (evt) => - // { - // if (Equals(depthTestMode, evt.newValue)) - // return; - - // registerUndo("Change Depth Test"); - // depthTestMode = (ZTestMode)evt.newValue; - // onChange(); - // }); - - // context.AddProperty("Depth Write", new Toggle { value = depthWrite }, (evt) => - // { - // if (Equals(depthTestMode, evt.newValue)) - // return; - - // registerUndo("Change Depth Test"); - // depthWrite = evt.newValue; - // onChange(); - // }); - - // } - - // public bool TrySetActiveSubTarget(Type subTargetType) - // { - // if (!subTargetType.IsSubclassOf(typeof(SubTarget))) - // return false; - - // foreach (var subTarget in m_SubTargets) - // { - // if (subTarget.GetType().Equals(subTargetType)) - // { - // m_ActiveSubTarget = subTarget; - // return true; - // } - // } - - // return false; - // } - - // // The fullscreen target is compatible with all pipeline (it doesn't rely on any RP rendering feature) - // public override bool WorksWithSRP(RenderPipelineAsset scriptableRenderPipeline) => true; - - // public override void OnAfterDeserialize(string json) - // { - // base.OnAfterDeserialize(json); - - // if (this.sgVersion < latestVersion) - // { - // ChangeVersion(latestVersion); - // } - // } - - // public bool SupportsVFX() => false; - // public bool CanSupportVFX() => false; - - // string IHasMetadata.identifier - // { - // get - // { - // // defer to subtarget - // if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData) - // return subTargetHasMetaData.identifier; - // return null; - // } - // } - - // ScriptableObject IHasMetadata.GetMetadataObject() - // { - // // defer to subtarget - // if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData) - // return subTargetHasMetaData.GetMetadataObject(); - // return null; - // } - - // public static StructDescriptor Varyings = new StructDescriptor() - // { - // name = "Varyings", - // packFields = true, - // populateWithCustomInterpolators = false, - // fields = new FieldDescriptor[] - // { - // StructFields.Varyings.positionCS, - // StructFields.Varyings.texCoord0, - // StructFields.Varyings.instanceID, - // BuiltInStructFields.Varyings.stereoTargetEyeIndexAsBlendIdx0, - // BuiltInStructFields.Varyings.stereoTargetEyeIndexAsRTArrayIdx, - // } - // }; - - - // public RenderStateCollection GetRenderState() - // { - // var result = new RenderStateCollection(); - - // if (allowMaterialOverride) - // { - // result.Add(RenderState.ZTest(Uniforms.depthTest)); - // result.Add(RenderState.ZWrite(Uniforms.depthWrite)); - // if (blendMode != FullscreenBlendMode.Disabled) - // { - // result.Add(RenderState.Blend(Uniforms.srcColorBlend, Uniforms.dstColorBlend, Uniforms.srcAlphaBlend, Uniforms.dstAlphaBlend)); - // result.Add(RenderState.BlendOp(Uniforms.colorBlendOperation, Uniforms.alphaBlendOperation)); - // } - // else - // { - // result.Add(RenderState.Blend("Blend Off")); - // } - - // if (enableStencil) - // { - // result.Add(RenderState.Stencil(new StencilDescriptor { Ref = Uniforms.stencilReference, ReadMask = Uniforms.stencilReadMask, WriteMask = Uniforms.stencilWriteMask, Comp = Uniforms.stencilComparison, ZFail = Uniforms.stencilDepthFail, Fail = Uniforms.stencilFail, Pass = Uniforms.stencilPass })); - // } - - // return result; - // } - // else - // { - // result.Add(RenderState.ZTest(depthTestMode.ToString())); - // result.Add(RenderState.ZWrite(depthWrite.ToString())); - - // // Blend mode - // if (blendMode == FullscreenBlendMode.Alpha) - // result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); - // else if (blendMode == FullscreenBlendMode.Premultiply) - // result.Add(RenderState.Blend(Blend.One, Blend.OneMinusSrcAlpha, Blend.One, Blend.OneMinusSrcAlpha)); - // else if (blendMode == FullscreenBlendMode.Additive) - // result.Add(RenderState.Blend(Blend.SrcAlpha, Blend.One, Blend.One, Blend.One)); - // else if (blendMode == FullscreenBlendMode.Multiply) - // result.Add(RenderState.Blend(Blend.DstColor, Blend.Zero)); - // else if (blendMode == FullscreenBlendMode.Disabled) - // result.Add(RenderState.Blend("Blend Off")); - // else - // { - // result.Add(RenderState.Blend(BlendModeToBlend(srcColorBlendMode), BlendModeToBlend(dstColorBlendMode), BlendModeToBlend(srcAlphaBlendMode), BlendModeToBlend(dstAlphaBlendMode))); - // result.Add(RenderState.BlendOp(colorBlendOperation, alphaBlendOperation)); - // } - - // result.Add(RenderState.Stencil(new StencilDescriptor - // { - // Ref = stencilReference.ToString(), - // ReadMask = stencilReadMask.ToString(), - // WriteMask = stencilWriteMask.ToString(), - // Comp = stencilCompareFunction.ToString(), - // ZFail = stencilDepthTestFailOperation.ToString(), - // Fail = stencilFailOperation.ToString(), - // Pass = stencilPassOperation.ToString(), - // })); - // } - - // return result; - // } - - // Blend BlendModeToBlend(BlendMode mode) => mode switch - // { - // BlendMode.Zero => Blend.Zero, - // BlendMode.One => Blend.One, - // BlendMode.DstColor => Blend.DstColor, - // BlendMode.SrcColor => Blend.SrcColor, - // BlendMode.OneMinusDstColor => Blend.OneMinusDstColor, - // BlendMode.SrcAlpha => Blend.SrcAlpha, - // BlendMode.OneMinusSrcColor => Blend.OneMinusSrcColor, - // BlendMode.DstAlpha => Blend.DstAlpha, - // BlendMode.OneMinusDstAlpha => Blend.OneMinusDstAlpha, - // BlendMode.SrcAlphaSaturate => Blend.SrcAlpha, - // BlendMode.OneMinusSrcAlpha => Blend.OneMinusSrcAlpha, - // _ => Blend.Zero - // }; - - // } - - // #region Includes - // static class CoreIncludes - // { - // const string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; - // const string kColor = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"; - // const string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; - // const string kInstancing = "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"; - // const string kSpaceTransforms = "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"; - // const string kShaderGraphFunctions = "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl"; - // const string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"; - // const string kShaderVariables = "Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariables.hlsl"; - - // public static readonly IncludeCollection preGraphIncludes = new IncludeCollection - // { - // { kCommon, IncludeLocation.Pregraph }, - // { kColor, IncludeLocation.Pregraph }, - // { kTexture, IncludeLocation.Pregraph }, - // { kInstancing, IncludeLocation.Pregraph }, // For VR - // { kShaderVariables, IncludeLocation.Pregraph }, - // { kSpaceTransforms, IncludeLocation.Pregraph }, - // { kFunctions, IncludeLocation.Pregraph }, - // }; - // } - // #endregion - - // internal static class FullscreenPropertyCollectorExtension - // { - // public static void AddEnumProperty(this PropertyCollector collector, string prop, T value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) where T : Enum - // { - // collector.AddShaderProperty(new Vector1ShaderProperty - // { - // floatType = FloatType.Enum, - // enumType = EnumType.CSharpEnum, - // cSharpEnumType = typeof(T), - // hidden = true, - // overrideHLSLDeclaration = true, - // hlslDeclarationOverride = hlslDeclaration, - // value = Convert.ToInt32(value), - // overrideReferenceName = prop, - // }); - // } - - // public static void AddIntProperty(this PropertyCollector collector, string prop, int value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) - // { - // collector.AddShaderProperty(new Vector1ShaderProperty - // { - // floatType = FloatType.Integer, - // hidden = true, - // overrideHLSLDeclaration = true, - // hlslDeclarationOverride = hlslDeclaration, - // value = value, - // overrideReferenceName = prop, - // }); - // } - - // public static void AddBoolProperty(this PropertyCollector collector, string prop, bool value, HLSLDeclaration hlslDeclaration = HLSLDeclaration.DoNotDeclare) - // { - // collector.AddShaderProperty(new BooleanShaderProperty - // { - // hidden = true, - // overrideHLSLDeclaration = true, - // hlslDeclarationOverride = hlslDeclaration, - // value = value, - // overrideReferenceName = prop, - // }); - // } - // } - -} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index 40f23bbe7a4..5db5984881f 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -10,25 +10,84 @@ struct FragOutput #endif }; +float4x4 inverse(float4x4 m) { + float + a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], + a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], + a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], + a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + return float4x4( + a11 * b11 - a12 * b10 + a13 * b09, + a02 * b10 - a01 * b11 - a03 * b09, + a31 * b05 - a32 * b04 + a33 * b03, + a22 * b04 - a21 * b05 - a23 * b03, + a12 * b08 - a10 * b11 - a13 * b07, + a00 * b11 - a02 * b08 + a03 * b07, + a32 * b02 - a30 * b05 - a33 * b01, + a20 * b05 - a22 * b02 + a23 * b01, + a10 * b10 - a11 * b08 + a13 * b06, + a01 * b08 - a00 * b10 - a03 * b06, + a30 * b04 - a31 * b02 + a33 * b00, + a21 * b02 - a20 * b04 - a23 * b00, + a11 * b07 - a10 * b09 - a12 * b06, + a00 * b09 - a01 * b07 + a02 * b06, + a31 * b01 - a30 * b03 - a32 * b00, + a20 * b03 - a21 * b01 + a22 * b00) / det; +} + +// Come render pipeline don't have access to the inverse view projection matrix +// It's okay to compute it in the vertex shader because we only have 3 to 4 vertices +void BuildVaryingsWithoutInverseProjection(Attributes input, inout Varyings output) +{ + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + output.texCoord0 = output.positionCS * 0.5 + 0.5; + output.texCoord0.y = 1 - output.texCoord0.y; + + float3x3 inverseView = (float3x3)inverse(UNITY_MATRIX_V); + float4x4 inverseProj = inverse(UNITY_MATRIX_P); + float4 viewDirectionEyeSpace = mul(inverseProj, float4(output.positionCS.xyz, 1)); + float3 viewDirectionWS = mul(inverseView, viewDirectionEyeSpace.xyz).xyz; + + // Encode view direction in texCoord1 + output.texCoord1.xyz = viewDirectionWS; +} + void BuildVaryings(Attributes input, inout Varyings output) { UNITY_SETUP_INSTANCE_ID(input); UNITY_TRANSFER_INSTANCE_ID(input, output); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); -#if defined(VARYINGS_NEED_TEXCOORD0) || defined(VARYINGS_DS_NEED_TEXCOORD0) output.texCoord0 = output.positionCS * 0.5 + 0.5; output.texCoord0.y = 1 - output.texCoord0.y; -#endif -#ifdef VARYINGS_NEED_SCREENPOSITION - output.screenPosition = output.texCoord1; -#endif + // Encode view direction in texCoord1 + float3 worldPos = mul(UNITY_MATRIX_I_VP, float4(output.positionCS.xyz, 1)).xyz; + output.texCoord1.xyz = worldPos; } float4 GetDrawProceduralVertexPosition(uint vertexID) { - return GetFullScreenTriangleVertexPosition(vertexID, UNITY_RAW_FAR_CLIP_VALUE); + return GetFullScreenTriangleVertexPosition(vertexID, UNITY_NEAR_CLIP_VALUE); } float4 GetBlitVertexPosition(uint vertexID) @@ -49,10 +108,10 @@ FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(unpacked); SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); - output.color.rgb = surfaceDescription.Color; + output.color.rgb = surfaceDescription.FullscreenColor; output.color.a = surfaceDescription.Alpha; #ifdef DEPTH_WRITE - output.depth = surfaceDescription.Depth; + output.depth = surfaceDescription.FullscreenDepth; #endif return output; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template index ec754aab349..8c4fda36803 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template @@ -15,6 +15,7 @@ HLSLPROGRAM // Pragmas $splice(PassPragmas) +// #pragma enable_d3d11_debug_symbols $splice(DotsInstancingOptions) $splice(HybridV1InjectedBuiltinProperties) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index 4a1746da880..0b37a606804 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -26,9 +26,11 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) $SurfaceDescriptionInputs.WorldSpaceTangent: output.WorldSpaceTangent = renormFactor * tangentWS.xyz; $SurfaceDescriptionInputs.WorldSpaceBiTangent: output.WorldSpaceBiTangent = renormFactor * bitang; - float rawDepth = SHADERGRAPH_SAMPLE_SCENE_DEPTH(input.texCoord0.xy); - float3 positionWS = ComputeWorldSpacePosition(input.texCoord0.xy, rawDepth, UNITY_MATRIX_I_VP); - float3 viewDirWS = GetWorldSpaceNormalizeViewDir(positionWS); + float3 viewDirWS = normalize(input.texCoord1.xyz); + float linearDepth = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH(input.texCoord0.xy), _ZBufferParams); + float3 cameraForward = -UNITY_MATRIX_V[2].xyz; + float distance_to_camera = linearDepth / dot(viewDirWS, cameraForward); + float3 positionWS = viewDirWS * distance_to_camera + GetCameraPositionWS(); $SurfaceDescriptionInputs.ObjectSpaceTangent: output.ObjectSpaceTangent = TransformWorldToObjectDir(output.WorldSpaceTangent); $SurfaceDescriptionInputs.ViewSpaceTangent: output.ViewSpaceTangent = TransformWorldToViewDir(output.WorldSpaceTangent); From 0b0b79936ccbe49b93c12d9f6b67fc2416edf3c4 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 8 Oct 2021 16:14:57 +0200 Subject: [PATCH 019/108] HD Sample depth node now sample the depth instead of loading it --- .../ShaderGraph/Nodes/HDSceneDepthNode.cs | 63 +++---------------- .../HDRenderPipeline.RenderGraph.cs | 4 ++ .../RenderPipeline/HDStringConstants.cs | 1 + 3 files changed, 14 insertions(+), 54 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs index 16406c0c552..7204d0327f6 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs @@ -72,6 +72,7 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener if (!generationMode.IsPreview()) { registry.builder.AppendLine("StructuredBuffer _DepthPyramidMipLevelOffsets;"); + registry.builder.AppendLine("float4 _DepthPyramidBufferSize;"); registry.ProvideFunction(GetFunctionName(), s => { @@ -79,10 +80,14 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener using (s.BlockScope()) { s.AppendLine("#if defined(REQUIRE_DEPTH_TEXTURE) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT)"); - s.AppendLine("int2 coord = int2(uv * _ScreenSize.xy);"); - s.AppendLine("int2 mipCoord = coord.xy >> int(lod);"); - s.AppendLine("int2 mipOffset = _DepthPyramidMipLevelOffsets[int(lod)];"); - s.AppendLine("return LOAD_TEXTURE2D_X(_CameraDepthTexture, mipOffset + mipCoord).r;"); + s.AppendLine("float2 uvOffset = _DepthPyramidMipLevelOffsets[int(lod)] * _DepthPyramidBufferSize.zw;"); + s.AppendLine("$precision2 UVScale = _RTHandleScale.xy * (_ScreenSize.xy / _DepthPyramidBufferSize.xy);"); + s.AppendLine("$precision lodScale = exp2(uint(lod));"); + s.AppendLine("$precision2 lodUV = (uv * UVScale) / lodScale;"); + s.AppendLine("$precision2 halfTextel = _DepthPyramidBufferSize.zw * 0.5;"); + s.AppendLine("$precision2 lodSize = _DepthPyramidBufferSize.zw * _ScreenSize.xy / lodScale;"); + s.AppendLine("$precision2 clampedUV = clamp(uvOffset + lodUV, uvOffset + halfTextel, uvOffset + lodSize - halfTextel);"); + s.AppendLine("return SAMPLE_TEXTURE2D_X(_CameraDepthTexture, s_linear_clamp_sampler, clampedUV).r;"); s.AppendLine("#endif"); s.AppendLine("return 0.0;"); @@ -112,56 +117,6 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo } } - // protected override MethodInfo GetFunctionToConvert() - // { - // switch (m_DepthSamplingMode) - // { - // case DepthSamplingMode.Raw: - // return GetType().GetMethod("Unity_SceneDepth_Raw", BindingFlags.Static | BindingFlags.NonPublic); - // case DepthSamplingMode.Eye: - // return GetType().GetMethod("Unity_SceneDepth_Eye", BindingFlags.Static | BindingFlags.NonPublic); - // case DepthSamplingMode.Linear01: - // default: - // return GetType().GetMethod("Unity_SceneDepth_Linear01", BindingFlags.Static | BindingFlags.NonPublic); - // } - // } - - // static string Unity_SceneDepth_Linear01( - // [Slot(0, Binding.ScreenPosition)] Vector4 UV, - // [Slot(1, Binding.None, ShaderStageCapability.Fragment)] out Vector1 Out) - // { - // return - // @" - // { - // Out = Linear01Depth(SHADERGRAPH_SAMPLE_SCENE_DEPTH(UV.xy), _ZBufferParams); - // } - // "; - // } - - // static string Unity_SceneDepth_Raw( - // [Slot(0, Binding.ScreenPosition)] Vector4 UV, - // [Slot(1, Binding.None, ShaderStageCapability.Fragment)] out Vector1 Out) - // { - // return - // @" - // { - // Out = SHADERGRAPH_SAMPLE_SCENE_DEPTH(UV.xy); - // } - // "; - // } - - // static string Unity_SceneDepth_Eye( - // [Slot(0, Binding.ScreenPosition)] Vector4 UV, - // [Slot(1, Binding.None, ShaderStageCapability.Fragment)] out Vector1 Out) - // { - // return - // @" - // { - // Out = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH(UV.xy), _ZBufferParams); - // } - // "; - // } - public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true; public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index 7cdadf307d4..7b4a493c771 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs @@ -49,6 +49,10 @@ void RecordRenderGraph(RenderRequest renderRequest, // Be careful, ComputePackedMipChainInfo needs the render texture size and not the viewport size. Otherwise it would compute the wrong size. m_DepthBufferMipChainInfo.ComputePackedMipChainInfo(RTHandles.rtHandleProperties.currentRenderTargetSize); + // Bind the depth pyramid offset info for the HDSceneDepth node in ShaderGraph. This can be used by users in custom passes. + Shader.SetGlobalBuffer(HDShaderIDs._DepthPyramidMipLevelOffsets, m_DepthBufferMipChainInfo.GetOffsetBufferData(m_DepthPyramidMipLevelOffsetsBuffer)); + Shader.SetGlobalVector(HDShaderIDs._DepthPyramidBufferSize, new Vector4(m_DepthBufferMipChainInfo.textureSize.x, m_DepthBufferMipChainInfo.textureSize.y, 1.0f / m_DepthBufferMipChainInfo.textureSize.x, 1.0f / m_DepthBufferMipChainInfo.textureSize.y)); + #if UNITY_EDITOR var showGizmos = camera.cameraType == CameraType.Game || camera.cameraType == CameraType.SceneView; diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs index 6d7d559be63..8fd17b15fe5 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs @@ -391,6 +391,7 @@ static class HDShaderIDs public static readonly int _SsrClearCoatMaskTexture = Shader.PropertyToID("_SsrClearCoatMaskTexture"); public static readonly int _DepthPyramidMipLevelOffsets = Shader.PropertyToID("_DepthPyramidMipLevelOffsets"); public static readonly int _DepthPyramidFirstMipLevelOffset = Shader.PropertyToID("_DepthPyramidFirstMipLevelOffset"); + public static readonly int _DepthPyramidBufferSize = Shader.PropertyToID("_DepthPyramidBufferSize"); // Still used by ray tracing. From 57ca8e00db48c79992b2aab0c54bed18bc776e62 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Mon, 11 Oct 2021 12:07:17 +0200 Subject: [PATCH 020/108] Fixed color LOD sampling --- .../Material/ShaderGraph/Nodes/HDSceneColorNode.cs | 2 +- .../RenderPass/CustomPass/CustomPassSampling.hlsl | 9 +++------ .../Generation/Targets/Fullscreen/FullscreenSubTarget.cs | 2 -- .../Fullscreen/Templates/SharedCode.template.hlsl | 4 ++-- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs index 4198ec2bd05..cce944ce95b 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs @@ -88,7 +88,7 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener s.AppendLine("#endif"); s.AppendLine("#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(CUSTOM_PASS_SAMPLING_HLSL) && defined(SHADERPASS) && (SHADERPASS == SHADERPASS_DRAWPROCEDURAL || SHADERPASS == SHADERPASS_BLIT)"); - s.AppendLine("return CustomPassSampleCameraColor(uv, 0) * exposureMultiplier;"); + s.AppendLine("return CustomPassSampleCameraColor(uv, lod) * exposureMultiplier;"); s.AppendLine("#endif"); s.AppendLine("return $precision3(0.0, 0.0, 0.0);"); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl index 9195252e8ee..afebde23095 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl @@ -8,18 +8,15 @@ TEXTURE2D_X(_AfterPostProcessColorBuffer); float _CustomPassInjectionPoint; -float3 CustomPassSampleCameraColor(float2 uv, float lod, bool uvGuards = true) +float3 CustomPassSampleCameraColor(float2 uv, float lod) { - if (uvGuards) - uv = clamp(uv, 0, 1 - _ScreenSize.zw / 2.0); - switch ((int)_CustomPassInjectionPoint) { case CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING: return float3(0, 0, 0); // there is no color pyramid yet for before transparent so we can't sample with mips. // Also, we don't use _RTHandleScaleHistory to sample because the color pyramid bound is the actual camera color buffer which is at the resolution of the camera - case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScaleHistory.xy, 0).rgb; - case CUSTOMPASSINJECTIONPOINT_BEFORE_POST_PROCESS: + case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScaleHistory.xy, lod).rgb; + case CUSTOMPASSINJECTIONPOINT_BEFORE_POST_PROCESS: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv, lod).rgb; case CUSTOMPASSINJECTIONPOINT_BEFORE_PRE_REFRACTION: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScale.xy, 0).rgb; case CUSTOMPASSINJECTIONPOINT_AFTER_POST_PROCESS: return SAMPLE_TEXTURE2D_X_LOD(_AfterPostProcessColorBuffer, s_trilinear_clamp_sampler, uv * _RTHandleScale.zw, 0).rgb; default: return SampleCameraColor(uv, lod); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 94b3121dca6..769ee1e8259 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -358,11 +358,9 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com default: case FullscreenCompatibility.Blit: fullscreenPass.includes.Add(fullscreenBlitInclude, IncludeLocation.Postgraph); - Debug.Log(fullscreenBlitInclude); break; case FullscreenCompatibility.DrawProcedural: fullscreenPass.includes.Add(fullscreenDrawProceduralInclude, IncludeLocation.Postgraph); - Debug.Log(fullscreenDrawProceduralInclude); break; } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index 0b37a606804..507f21c8d03 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -29,8 +29,8 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) float3 viewDirWS = normalize(input.texCoord1.xyz); float linearDepth = LinearEyeDepth(SHADERGRAPH_SAMPLE_SCENE_DEPTH(input.texCoord0.xy), _ZBufferParams); float3 cameraForward = -UNITY_MATRIX_V[2].xyz; - float distance_to_camera = linearDepth / dot(viewDirWS, cameraForward); - float3 positionWS = viewDirWS * distance_to_camera + GetCameraPositionWS(); + float camearDistance = linearDepth / dot(viewDirWS, cameraForward); + float3 positionWS = viewDirWS * camearDistance + GetCameraPositionWS(); $SurfaceDescriptionInputs.ObjectSpaceTangent: output.ObjectSpaceTangent = TransformWorldToObjectDir(output.WorldSpaceTangent); $SurfaceDescriptionInputs.ViewSpaceTangent: output.ViewSpaceTangent = TransformWorldToViewDir(output.WorldSpaceTangent); From f503acd24b80ff525ad5741b7c7f0738ed6a9d0d Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Mon, 11 Oct 2021 12:44:43 +0200 Subject: [PATCH 021/108] Use BaseColor instead of Color block --- .../Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs | 2 +- .../ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs | 2 +- .../ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs | 2 +- .../Generation/Targets/Fullscreen/FullscreenSubTarget.cs | 4 ++-- .../Targets/Fullscreen/Includes/FullscreenCommon.hlsl | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs index f6ada2277ff..afae06f4747 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs @@ -15,7 +15,7 @@ public static void CreateHDFullscreenGraph() var blockDescriptors = new[] { - FullscreenBlocks.color, + BlockFields.SurfaceDescription.BaseColor, BlockFields.SurfaceDescription.Alpha, }; diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs index 1d612850284..4eb38ad9024 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs @@ -15,7 +15,7 @@ public static void CreateFullscreenGraph() var blockDescriptors = new[] { - FullscreenBlocks.color, + BlockFields.SurfaceDescription.BaseColor, BlockFields.SurfaceDescription.Alpha, }; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs index 6ffce0aabef..fa2d1bac838 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs @@ -15,7 +15,7 @@ public static void CreateFullscreenGraph() var blockDescriptors = new[] { - FullscreenBlocks.color, + BlockFields.SurfaceDescription.BaseColor, BlockFields.SurfaceDescription.Alpha, }; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 769ee1e8259..705c4d12858 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -307,7 +307,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com }, validPixelBlocks = new BlockFieldDescriptor[] { - FullscreenBlocks.color, + BlockFields.SurfaceDescription.BaseColor, BlockFields.SurfaceDescription.Alpha, FullscreenBlocks.depth, }, @@ -399,7 +399,7 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { - context.AddBlock(FullscreenBlocks.color); + context.AddBlock(BlockFields.SurfaceDescription.BaseColor); context.AddBlock(BlockFields.SurfaceDescription.Alpha); context.AddBlock(FullscreenBlocks.depth, fullscreenData.depthWrite); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index 5db5984881f..91f65238d72 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -108,7 +108,7 @@ FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(unpacked); SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); - output.color.rgb = surfaceDescription.FullscreenColor; + output.color.rgb = surfaceDescription.BaseColor; output.color.a = surfaceDescription.Alpha; #ifdef DEPTH_WRITE output.depth = surfaceDescription.FullscreenDepth; From 4dc9cb7ba58865c3a2f6857d6d907cf00a6e1edc Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 12 Oct 2021 14:46:01 +0200 Subject: [PATCH 022/108] Add the HD Sample buffer node --- .../ShaderGraph/Nodes/HDSampleBufferNode.cs | 202 ++++++++++++++++++ .../Nodes/HDSampleBufferNode.cs.meta | 11 + .../HDRenderPipeline.PostProcess.cs | 1 + .../RenderPipeline/HDStringConstants.cs | 1 + .../Graphs/Texture2DArrayShaderProperty.cs | 5 + 5 files changed, 220 insertions(+) create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs.meta diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs new file mode 100644 index 00000000000..701ba2202d8 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs @@ -0,0 +1,202 @@ +using System.Collections.Generic; +using System; +using UnityEngine; +using UnityEditor.Graphing; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing.Controls; +using UnityEditor.ShaderGraph.Internal; +using UnityEngine.Rendering.HighDefinition; +using System.Reflection; +using System.Linq; + +namespace UnityEditor.Rendering.HighDefinition +{ + [SRPFilter(typeof(HDRenderPipeline))] + [Title("Input", "High Definition Render Pipeline", "HD Sample Buffer")] + sealed class HDSampleBufferNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture + { + const string k_ScreenPositionSlotName = "UV"; + const string k_OutputSlotName = "Output"; + const string k_SamplerInputSlotName = "Sampler"; + + const int k_ScreenPositionSlotId = 0; + const int k_OutputSlotId = 2; + public const int k_SamplerInputSlotId = 3; + + public enum BufferType + { + NormalWorldSpace, + Roughness, + MotionVectors, + PostProcessInput, + BlitSource, + } + + [SerializeField] + private BufferType m_BufferType = BufferType.NormalWorldSpace; + + [EnumControl("Source Buffer")] + public BufferType bufferType + { + get { return m_BufferType; } + set + { + if (m_BufferType == value) + return; + + m_BufferType = value; + Dirty(ModificationScope.Graph); + } + } + + public override string documentationURL => Documentation.GetPageLink("SGNode-HD-Sample-Buffer"); + + public HDSampleBufferNode() + { + name = "HD Sample Buffer"; + synonyms = new string[] { "normal", "motion vector", "roughness", "postprocessinput", "blit" }; + UpdateNodeAfterDeserialization(); + } + + public override bool hasPreview { get { return false; } } + + int channelCount; + + public sealed override void UpdateNodeAfterDeserialization() + { + AddSlot(new ScreenPositionMaterialSlot(k_ScreenPositionSlotId, k_ScreenPositionSlotName, k_ScreenPositionSlotName, ScreenSpaceType.Default)); + AddSlot(new SamplerStateMaterialSlot(k_SamplerInputSlotId, k_SamplerInputSlotName, k_SamplerInputSlotName, SlotType.Input)); + + // TODO: change the output type depending on the buffer type + switch (bufferType) + { + case BufferType.NormalWorldSpace: + AddSlot(new Vector3MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Vector3.zero, ShaderStageCapability.Fragment)); + channelCount = 3; + break; + case BufferType.Roughness: + AddSlot(new Vector1MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, 0, ShaderStageCapability.Fragment)); + channelCount = 1; + break; + case BufferType.MotionVectors: + AddSlot(new Vector2MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Vector2.zero, ShaderStageCapability.Fragment)); + channelCount = 2; + break; + case BufferType.PostProcessInput: + case BufferType.BlitSource: + AddSlot(new ColorRGBAMaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Color.black, ShaderStageCapability.Fragment)); + channelCount = 4; + break; + } + + RemoveSlotsNameNotMatching(new[] + { + k_ScreenPositionSlotId, + k_SamplerInputSlotId, + k_OutputSlotId, + }); + } + + public override void CollectShaderProperties(PropertyCollector properties, GenerationMode generationMode) + { + if (generationMode.IsPreview()) + return; + + if (bufferType == BufferType.BlitSource) + { + properties.AddShaderProperty(new Texture2DArrayShaderProperty + { + overrideReferenceName = "_MainTex", + displayName = "_MainTex", + hidden = true, + generatePropertyBlock = true, + isMainTexture = true, + }); + } + else if (bufferType == BufferType.PostProcessInput) + { + properties.AddShaderProperty(new Texture2DArrayShaderProperty + { + overrideReferenceName = nameof(HDShaderIDs._CustomPostProcessInput), + displayName = nameof(HDShaderIDs._CustomPostProcessInput), + hidden = true, + generatePropertyBlock = true, + isMainTexture = true, + }); + } + } + + string GetFunctionName() => "Unity_HDRP_SampleBuffer_$precision"; + + public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) + { + // Preview SG doesn't have access to HDRP depth buffer + if (!generationMode.IsPreview()) + { + registry.ProvideFunction(GetFunctionName(), s => + { + s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/NormalBuffer.hlsl\""); + s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Builtin/BuiltinData.hlsl\""); + + s.AppendLine("$precision{1} {0}($precision2 uv, SamplerState samplerState)", GetFunctionName(), channelCount); + using (s.BlockScope()) + { + switch (bufferType) + { + case BufferType.NormalWorldSpace: + s.Append("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); + s.Append("NormalData normalData;"); + s.Append("DecodeFromNormalBuffer(pixelCoords, normalData);"); + s.Append("float depth = LoadCameraDepth(pixelCoords);"); + s.Append("return depth > 0 ? normalData.normalWS : 0;"); + break; + case BufferType.Roughness: + s.Append("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); + s.Append("NormalData normalData;"); + s.Append("DecodeFromNormalBuffer(pixelCoords, normalData);"); + s.Append("float depth = LoadCameraDepth(pixelCoords);"); + s.Append("return depth > 0 ? PerceptualRoughnessToRoughness(normalData.perceptualRoughness) : 0;"); + break; + case BufferType.MotionVectors: + // if we have a value > 1.0f, it means we have selected the "no motion option", hence we force motionVec 0. + s.Append($"float4 motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_CameraMotionVectorsTexture, samplerState, uv * _RTHandleScale.xy, 0);"); + s.Append("float2 motionVec;"); + s.Append("DecodeMotionVector(motionVecBufferSample, motionVec);"); + s.Append("return motionVec;"); + break; + case BufferType.PostProcessInput: + s.Append("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); + break; + case BufferType.BlitSource: + s.Append($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); + break; + default: + s.AppendLine("return 0.0;"); + break; + } + } + }); + } + } + + public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) + { + if (generationMode.IsPreview()) + { + sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = 0.0;"); + } + else + { + string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); + var samplerSlot = FindInputSlot(k_SamplerInputSlotId); + var edgesSampler = owner.GetEdges(samplerSlot.slotReference); + var sampler = edgesSampler.Any() ? $"{GetSlotValue(k_SamplerInputSlotId, generationMode)}.samplerstate" : "s_linear_clamp_sampler"; + sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = {GetFunctionName()}({uv}.xy, {sampler});"); + } + } + + public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true; + + public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs.meta new file mode 100644 index 00000000000..8df9df1a982 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 09b26410cccbd384dbf1c339c9618713 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs index 253c09549bc..6164aea9d95 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs @@ -1428,6 +1428,7 @@ bool DoCustomPostProcess(RenderGraph renderGraph, HDCamera hdCamera, ref Texture ctx.cmd.SetGlobalTexture(HDShaderIDs._CameraDepthTexture, data.depthBuffer); ctx.cmd.SetGlobalTexture(HDShaderIDs._NormalBufferTexture, data.normalBuffer); ctx.cmd.SetGlobalTexture(HDShaderIDs._CameraMotionVectorsTexture, data.motionVecTexture); + ctx.cmd.SetGlobalTexture(HDShaderIDs._CustomPostProcessInput, data.source); data.customPostProcess.Render(ctx.cmd, data.hdCamera, data.source, data.destination); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs index 8fd17b15fe5..5756d0d59cf 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs @@ -438,6 +438,7 @@ static class HDShaderIDs public static readonly int _CustomColorTexture = Shader.PropertyToID("_CustomColorTexture"); public static readonly int _CustomPassInjectionPoint = Shader.PropertyToID("_CustomPassInjectionPoint"); public static readonly int _AfterPostProcessColorBuffer = Shader.PropertyToID("_AfterPostProcessColorBuffer"); + public static readonly int _CustomPostProcessInput = Shader.PropertyToID("_CustomPostProcessInput"); public static readonly int _InputCubemap = Shader.PropertyToID("_InputCubemap"); public static readonly int _Mipmap = Shader.PropertyToID("_Mipmap"); diff --git a/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs b/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs index ff6d8bab4d4..f7a75d6ab30 100644 --- a/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs +++ b/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs @@ -18,9 +18,13 @@ internal Texture2DArrayShaderProperty() internal override bool isExposable => true; internal override bool isRenamable => true; + [SerializeField] + internal bool isMainTexture = false; internal string modifiableTagString => modifiable ? "" : "[NonModifiableTextureData]"; + internal string mainTextureString => isMainTexture ? "[MainTexture]" : ""; + internal override string GetPropertyBlockString() { return $"{hideTagString}{modifiableTagString}[NoScaleOffset]{referenceName}(\"{displayName}\", 2DArray) = \"\" {{}}"; @@ -81,6 +85,7 @@ internal override ShaderInput Copy() { displayName = displayName, value = value, + isMainTexture = isMainTexture }; } } From 0b0998f54b4955c5a00f27fc04d9198a0d312af0 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 12 Oct 2021 19:15:32 +0200 Subject: [PATCH 023/108] started to add the draw fullscreen render feature in URP --- .../Editor/ShaderGraph/Nodes.meta | 8 + .../Nodes/UniversalSampleBufferNode.cs | 189 ++++++++++++++++ .../Nodes/UniversalSampleBufferNode.cs.meta | 11 + .../RendererFeatures/DrawFullscreenPass.cs | 204 ++++++++++++++++++ .../DrawFullscreenPass.cs.meta | 11 + .../Runtime/UniversalRenderPipelineCore.cs | 1 + 6 files changed, 424 insertions(+) create mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes.meta create mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs create mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs.meta create mode 100644 com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs create mode 100644 com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs.meta diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes.meta b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes.meta new file mode 100644 index 00000000000..cc768d6baa2 --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6979e5ac3dcd9e147be8acbcea517686 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs new file mode 100644 index 00000000000..3dd9194792d --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs @@ -0,0 +1,189 @@ +using System.Collections.Generic; +using System; +using UnityEngine; +using UnityEditor.Graphing; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Drawing.Controls; +using UnityEditor.ShaderGraph.Internal; +using UnityEngine.Rendering.Universal; +using System.Reflection; +using System.Linq; + +namespace UnityEditor.Rendering.Universal +{ + [SRPFilter(typeof(UniversalRenderPipeline))] + [Title("Input", "Universal", "Universal Sample Buffer")] + sealed class UniversalSampleBufferNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture + { + const string k_ScreenPositionSlotName = "UV"; + const string k_OutputSlotName = "Output"; + const string k_SamplerInputSlotName = "Sampler"; + + const int k_ScreenPositionSlotId = 0; + const int k_OutputSlotId = 2; + public const int k_SamplerInputSlotId = 3; + + public enum BufferType + { + NormalWorldSpace, + MotionVectors, + // PostProcessInput, + BlitSource, + } + + [SerializeField] + private BufferType m_BufferType = BufferType.NormalWorldSpace; + + [EnumControl("Source Buffer")] + public BufferType bufferType + { + get { return m_BufferType; } + set + { + if (m_BufferType == value) + return; + + m_BufferType = value; + Dirty(ModificationScope.Graph); + } + } + + public override string documentationURL => Documentation.GetPageLink("SGNode-HD-Sample-Buffer"); + + public UniversalSampleBufferNode() + { + name = "Universal Sample Buffer"; + synonyms = new string[] { "normal", "motion vector", "postprocessinput", "blit" }; + UpdateNodeAfterDeserialization(); + } + + public override bool hasPreview { get { return false; } } + + int channelCount; + + public sealed override void UpdateNodeAfterDeserialization() + { + AddSlot(new ScreenPositionMaterialSlot(k_ScreenPositionSlotId, k_ScreenPositionSlotName, k_ScreenPositionSlotName, ScreenSpaceType.Default)); + AddSlot(new SamplerStateMaterialSlot(k_SamplerInputSlotId, k_SamplerInputSlotName, k_SamplerInputSlotName, SlotType.Input)); + + switch (bufferType) + { + case BufferType.NormalWorldSpace: + AddSlot(new Vector3MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Vector3.zero, ShaderStageCapability.Fragment)); + channelCount = 3; + break; + case BufferType.MotionVectors: + AddSlot(new Vector2MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Vector2.zero, ShaderStageCapability.Fragment)); + channelCount = 2; + break; + // case BufferType.PostProcessInput: + case BufferType.BlitSource: + AddSlot(new ColorRGBAMaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Color.black, ShaderStageCapability.Fragment)); + channelCount = 4; + break; + } + + RemoveSlotsNameNotMatching(new[] + { + k_ScreenPositionSlotId, + k_SamplerInputSlotId, + k_OutputSlotId, + }); + } + + public override void CollectShaderProperties(PropertyCollector properties, GenerationMode generationMode) + { + if (generationMode.IsPreview()) + return; + + if (bufferType == BufferType.BlitSource) + { + properties.AddShaderProperty(new Texture2DArrayShaderProperty + { + overrideReferenceName = "_MainTex", + displayName = "_MainTex", + hidden = true, + generatePropertyBlock = true, + isMainTexture = true, + }); + } + // else if (bufferType == BufferType.PostProcessInput) + // { + // properties.AddShaderProperty(new Texture2DArrayShaderProperty + // { + // overrideReferenceName = nameof(HDShaderIDs._CustomPostProcessInput), + // displayName = nameof(HDShaderIDs._CustomPostProcessInput), + // hidden = true, + // generatePropertyBlock = true, + // isMainTexture = true, + // }); + // } + } + + string GetFunctionName() => "Unity_HDRP_SampleBuffer_$precision"; + + public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) + { + // Preview SG doesn't have access to HDRP depth buffer + if (!generationMode.IsPreview()) + { + registry.ProvideFunction(GetFunctionName(), s => + { + s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/NormalBuffer.hlsl\""); + s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Builtin/BuiltinData.hlsl\""); + + s.AppendLine("$precision{1} {0}($precision2 uv, SamplerState samplerState)", GetFunctionName(), channelCount); + using (s.BlockScope()) + { + switch (bufferType) + { + case BufferType.NormalWorldSpace: + s.Append("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); + s.Append("NormalData normalData;"); + s.Append("DecodeFromNormalBuffer(pixelCoords, normalData);"); + s.Append("float depth = LoadCameraDepth(pixelCoords);"); + s.Append("return depth > 0 ? normalData.normalWS : 0;"); + break; + case BufferType.MotionVectors: + // if we have a value > 1.0f, it means we have selected the "no motion option", hence we force motionVec 0. + s.Append($"float4 motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_CameraMotionVectorsTexture, samplerState, uv * _RTHandleScale.xy, 0);"); + s.Append("float2 motionVec;"); + s.Append("DecodeMotionVector(motionVecBufferSample, motionVec);"); + s.Append("return motionVec;"); + break; + // case BufferType.PostProcessInput: + // s.Append("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); + // break; + case BufferType.BlitSource: + s.Append($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); + break; + default: + s.AppendLine("return 0.0;"); + break; + } + } + }); + } + } + + public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) + { + if (generationMode.IsPreview()) + { + sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = 0.0;"); + } + else + { + string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); + var samplerSlot = FindInputSlot(k_SamplerInputSlotId); + var edgesSampler = owner.GetEdges(samplerSlot.slotReference); + var sampler = edgesSampler.Any() ? $"{GetSlotValue(k_SamplerInputSlotId, generationMode)}.samplerstate" : "s_linear_clamp_sampler"; + sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = {GetFunctionName()}({uv}.xy, {sampler});"); + } + } + + public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true; + + public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; + } +} diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs.meta b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs.meta new file mode 100644 index 00000000000..f0102a74902 --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c92e8017e3a191445a9aa9d26d91c907 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs new file mode 100644 index 00000000000..02c96e56d2f --- /dev/null +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs @@ -0,0 +1,204 @@ +using System; + +namespace UnityEngine.Rendering.Universal +{ + internal enum DrawFullscreenBufferType + { + CameraColor, + Custom + } + + [Serializable] + internal class DrawFullscreenSettings + { + // Parameters + [SerializeField] internal RenderPassEvent injectionPoint = RenderPassEvent.AfterRenderingOpaques; + [SerializeField] internal Material blitMaterial; + [SerializeField] internal int blitMaterialPassIndex; + [SerializeField] internal DrawFullscreenBufferType source = DrawFullscreenBufferType.CameraColor; + [SerializeField] internal DrawFullscreenBufferType destination = DrawFullscreenBufferType.CameraColor; + } + + [DisallowMultipleRendererFeature] + [Tooltip("The Ambient Occlusion effect darkens creases, holes, intersections and surfaces that are close to each other.")] + internal class DrawFullscreenPass : ScriptableRendererFeature + { + // Serialized Fields + [SerializeField] private DrawFullscreenSettings m_Settings = new DrawFullscreenSettings(); + + private FullscreenPass m_FullscreenPass = null; + + /// + public override void Create() + { + // Create the pass... + if (m_FullscreenPass == null) + m_FullscreenPass = new FullscreenPass(); + } + + /// + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) + { + bool shouldAdd = m_FullscreenPass.Setup(m_Settings, renderer); + if (shouldAdd) + { + renderer.EnqueuePass(m_FullscreenPass); + } + } + + // The Fullscreen Pass + private class FullscreenPass : ScriptableRenderPass + { + static readonly int k_TemporaryRTId = Shader.PropertyToID("_TempFullscreenRT"); + static readonly int k_CustomRTId = Shader.PropertyToID("_CustomColorRT"); + + // Properties + // private bool isRendererDeferred => m_Renderer != null && m_Renderer is UniversalRenderer && ((UniversalRenderer)m_Renderer).renderingMode == RenderingMode.Deferred; + + // Private Variables + ProfilingSampler m_ProfilingSampler = ProfilingSampler.Get(URPProfileId.DrawFullscreen); + ScriptableRenderer m_Renderer = null; + DrawFullscreenSettings m_Settings; + bool m_IsSourceAndDestinationSameTarget; + RenderTargetIdentifier m_Source; + RenderTargetIdentifier m_Destination; + RenderTargetIdentifier m_Temp; + // private RenderTargetIdentifier m_SSAOTexture1Target = new RenderTargetIdentifier(s_SSAOTexture1ID, 0, CubemapFace.Unknown, -1); + // private RenderTextureDescriptor m_AOPassDescriptor; + + // Statics + // private static readonly int s_BaseMapID = Shader.PropertyToID("TODO"); + + internal bool Setup(DrawFullscreenSettings featureSettings, ScriptableRenderer renderer) + { + m_Renderer = renderer; + m_Settings = featureSettings; + + // DrawFullscreenSettings.DepthSource source; + // if (isRendererDeferred) + // { + // renderPassEvent = featureSettings.AfterOpaque ? RenderPassEvent.AfterRenderingOpaques : RenderPassEvent.AfterRenderingGbuffer; + // source = DrawFullscreenSettings.DepthSource.DepthNormals; + // } + // else + // { + // // Rendering after PrePasses is usually correct except when depth priming is in play: + // // then we rely on a depth resolve taking place after the PrePasses in order to have it ready for SSAO. + // // Hence we set the event to RenderPassEvent.AfterRenderingPrePasses + 1 at the earliest. + // renderPassEvent = featureSettings.AfterOpaque ? RenderPassEvent.AfterRenderingOpaques : RenderPassEvent.AfterRenderingPrePasses + 1; + // source = m_CurrentSettings.Source; + // } + + ConfigureInput(ScriptableRenderPassInput.Depth); + + // TODO: add an option to request normals + ConfigureInput(ScriptableRenderPassInput.Normal); + + // switch (source) + // { + // case DrawFullscreenSettings.DepthSource.Depth: + // ConfigureInput(ScriptableRenderPassInput.Depth); + // break; + // case DrawFullscreenSettings.DepthSource.DepthNormals: + // ConfigureInput(ScriptableRenderPassInput.Normal);// need depthNormal prepass for forward-only geometry + // break; + // default: + // throw new ArgumentOutOfRangeException(); + // } + + return m_Settings.blitMaterial != null + && m_Settings.blitMaterial.passCount > m_Settings.blitMaterialPassIndex + && m_Settings.blitMaterialPassIndex >= 0; + } + + /// + public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) + { + RenderTextureDescriptor blitTargetDescriptor = renderingData.cameraData.cameraTargetDescriptor; + blitTargetDescriptor.depthBufferBits = 0; + + m_IsSourceAndDestinationSameTarget = m_Settings.source == m_Settings.destination && + (m_Settings.source == DrawFullscreenBufferType.CameraColor); + + var renderer = renderingData.cameraData.renderer; + + if (m_Settings.source == DrawFullscreenBufferType.Custom || m_Settings.destination == DrawFullscreenBufferType.Custom) + { + cmd.GetTemporaryRT(k_CustomRTId, blitTargetDescriptor, FilterMode.Bilinear); + } + + if (m_Settings.source == DrawFullscreenBufferType.CameraColor) + m_Source = renderer.cameraColorTarget; + else + m_Source = new RenderTargetIdentifier(k_CustomRTId); + + if (m_Settings.destination == DrawFullscreenBufferType.CameraColor) + m_Destination = renderer.cameraColorTarget; + else + m_Destination = new RenderTargetIdentifier(k_CustomRTId); + + if (m_IsSourceAndDestinationSameTarget) + { + cmd.GetTemporaryRT(k_TemporaryRTId, blitTargetDescriptor, FilterMode.Bilinear); + m_Temp = new RenderTargetIdentifier(k_TemporaryRTId); + } + // else if (m_Settings.destinationType == BufferType.CameraColor) + // { + // destinationId = -1; + // destination = renderer.cameraColorTarget; + // } + // else + // { + // destinationId = Shader.PropertyToID(m_Settings.destinationTextureId); + // cmd.GetTemporaryRT(destinationId, blitTargetDescriptor, filterMode); + // destination = new RenderTargetIdentifier(destinationId); + // } + + // Configure targets and clear color + // TODO: we can also write to custom? + // TODO: do we need that? + if (m_Settings.destination == DrawFullscreenBufferType.CameraColor) + ConfigureTarget(m_Renderer.cameraColorTarget); + else + ConfigureTarget(new RenderTargetIdentifier(k_CustomRTId)); + //ConfigureClear(ClearFlag.None, Color.white); + } + + /// + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + CommandBuffer cmd = CommandBufferPool.Get(); + + using (new ProfilingScope(cmd, m_ProfilingSampler)) + { + // Can't read and write to same color target, create a temp render target to blit. + if (m_IsSourceAndDestinationSameTarget) + { + Blit(cmd, m_Source, m_Temp, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); + Blit(cmd, m_Temp, m_Destination); + } + else + { + Blit(cmd, m_Source, m_Destination, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); + } + } + + context.ExecuteCommandBuffer(cmd); + CommandBufferPool.Release(cmd); + } + + /// + public override void OnCameraCleanup(CommandBuffer cmd) + { + if (cmd == null) + throw new ArgumentNullException("cmd"); + + if (m_IsSourceAndDestinationSameTarget) + cmd.ReleaseTemporaryRT(k_TemporaryRTId); + + if (m_Settings.source == DrawFullscreenBufferType.Custom || m_Settings.destination == DrawFullscreenBufferType.Custom) + cmd.ReleaseTemporaryRT(k_CustomRTId); + } + } + } +} diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs.meta b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs.meta new file mode 100644 index 00000000000..2d418c0fccd --- /dev/null +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 323c8982314c2e34a90628dc56e5ed91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs b/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs index b92bf21219c..6da59ae5d1d 100644 --- a/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs +++ b/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs @@ -845,6 +845,7 @@ internal enum URPProfileId Bloom, LensFlareDataDriven, MotionVectors, + DrawFullscreen, FinalBlit } From e5abaf603d880dd2eab9094102e8918595bd14a3 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 12 Oct 2021 19:16:27 +0200 Subject: [PATCH 024/108] Fix todo --- .../Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs index 701ba2202d8..dac920bf440 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs @@ -67,7 +67,6 @@ public sealed override void UpdateNodeAfterDeserialization() AddSlot(new ScreenPositionMaterialSlot(k_ScreenPositionSlotId, k_ScreenPositionSlotName, k_ScreenPositionSlotName, ScreenSpaceType.Default)); AddSlot(new SamplerStateMaterialSlot(k_SamplerInputSlotId, k_SamplerInputSlotName, k_SamplerInputSlotName, SlotType.Input)); - // TODO: change the output type depending on the buffer type switch (bufferType) { case BufferType.NormalWorldSpace: From 5a8d654c2bf8a12977436605aa6f843dcef4ff7c Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 12 Oct 2021 19:17:37 +0200 Subject: [PATCH 025/108] Fix custom post process file creating in HDRP --- .../Editor/RenderPipeline/HDRenderPipelineMenuItems.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs index 30917441183..a2eecb90a9b 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs @@ -206,7 +206,7 @@ static void MenuCreateCustomPassCSharpScript() static void MenuCreateCSharpPostProcessVolume() { string templatePath = $"{HDUtils.GetHDRenderPipelinePath()}/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template"; - ProjectWindowUtil.CreateScriptAssetFromTemplateFile(templatePath, "New Post Process Volume.cs"); + ProjectWindowUtil.CreateScriptAssetFromTemplateFile(templatePath, "NewPostProcessVolume.cs"); } [MenuItem("Assets/Create/Shader/HDRP Post Process", priority = CoreUtils.Sections.section1)] From 07d459b0317f99d1d2163c06af635287ca6cf84e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 13 Oct 2021 15:48:10 +0200 Subject: [PATCH 026/108] Fix render feature debug name + subgraphs in Fullscreen SGs --- .../RendererFeatures/DrawFullscreenPass.cs | 73 ++++--------------- .../Targets/Fullscreen/FullscreenSubTarget.cs | 4 + 2 files changed, 18 insertions(+), 59 deletions(-) diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs index 02c96e56d2f..cc2f4e97ea9 100644 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs @@ -20,7 +20,7 @@ internal class DrawFullscreenSettings } [DisallowMultipleRendererFeature] - [Tooltip("The Ambient Occlusion effect darkens creases, holes, intersections and surfaces that are close to each other.")] + [Tooltip("Draw a fullscreen effect on screen using the material in parameter.")] internal class DrawFullscreenPass : ScriptableRendererFeature { // Serialized Fields @@ -39,7 +39,7 @@ public override void Create() /// public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { - bool shouldAdd = m_FullscreenPass.Setup(m_Settings, renderer); + bool shouldAdd = m_FullscreenPass.Setup(m_Settings, renderer, name); if (shouldAdd) { renderer.EnqueuePass(m_FullscreenPass); @@ -63,49 +63,18 @@ private class FullscreenPass : ScriptableRenderPass RenderTargetIdentifier m_Source; RenderTargetIdentifier m_Destination; RenderTargetIdentifier m_Temp; - // private RenderTargetIdentifier m_SSAOTexture1Target = new RenderTargetIdentifier(s_SSAOTexture1ID, 0, CubemapFace.Unknown, -1); - // private RenderTextureDescriptor m_AOPassDescriptor; + string m_ProfilerTagName; - // Statics - // private static readonly int s_BaseMapID = Shader.PropertyToID("TODO"); - - internal bool Setup(DrawFullscreenSettings featureSettings, ScriptableRenderer renderer) + internal bool Setup(DrawFullscreenSettings featureSettings, ScriptableRenderer renderer, string profilerTagName) { m_Renderer = renderer; m_Settings = featureSettings; - - // DrawFullscreenSettings.DepthSource source; - // if (isRendererDeferred) - // { - // renderPassEvent = featureSettings.AfterOpaque ? RenderPassEvent.AfterRenderingOpaques : RenderPassEvent.AfterRenderingGbuffer; - // source = DrawFullscreenSettings.DepthSource.DepthNormals; - // } - // else - // { - // // Rendering after PrePasses is usually correct except when depth priming is in play: - // // then we rely on a depth resolve taking place after the PrePasses in order to have it ready for SSAO. - // // Hence we set the event to RenderPassEvent.AfterRenderingPrePasses + 1 at the earliest. - // renderPassEvent = featureSettings.AfterOpaque ? RenderPassEvent.AfterRenderingOpaques : RenderPassEvent.AfterRenderingPrePasses + 1; - // source = m_CurrentSettings.Source; - // } + m_ProfilerTagName = profilerTagName; ConfigureInput(ScriptableRenderPassInput.Depth); - // TODO: add an option to request normals ConfigureInput(ScriptableRenderPassInput.Normal); - // switch (source) - // { - // case DrawFullscreenSettings.DepthSource.Depth: - // ConfigureInput(ScriptableRenderPassInput.Depth); - // break; - // case DrawFullscreenSettings.DepthSource.DepthNormals: - // ConfigureInput(ScriptableRenderPassInput.Normal);// need depthNormal prepass for forward-only geometry - // break; - // default: - // throw new ArgumentOutOfRangeException(); - // } - return m_Settings.blitMaterial != null && m_Settings.blitMaterial.passCount > m_Settings.blitMaterialPassIndex && m_Settings.blitMaterialPassIndex >= 0; @@ -142,17 +111,6 @@ public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderin cmd.GetTemporaryRT(k_TemporaryRTId, blitTargetDescriptor, FilterMode.Bilinear); m_Temp = new RenderTargetIdentifier(k_TemporaryRTId); } - // else if (m_Settings.destinationType == BufferType.CameraColor) - // { - // destinationId = -1; - // destination = renderer.cameraColorTarget; - // } - // else - // { - // destinationId = Shader.PropertyToID(m_Settings.destinationTextureId); - // cmd.GetTemporaryRT(destinationId, blitTargetDescriptor, filterMode); - // destination = new RenderTargetIdentifier(destinationId); - // } // Configure targets and clear color // TODO: we can also write to custom? @@ -167,20 +125,17 @@ public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderin /// public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { - CommandBuffer cmd = CommandBufferPool.Get(); + CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTagName); - using (new ProfilingScope(cmd, m_ProfilingSampler)) + // Can't read and write to same color target, create a temp render target to blit. + if (m_IsSourceAndDestinationSameTarget) + { + Blit(cmd, m_Source, m_Temp, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); + Blit(cmd, m_Temp, m_Destination); + } + else { - // Can't read and write to same color target, create a temp render target to blit. - if (m_IsSourceAndDestinationSameTarget) - { - Blit(cmd, m_Source, m_Temp, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); - Blit(cmd, m_Temp, m_Destination); - } - else - { - Blit(cmd, m_Source, m_Destination, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); - } + Blit(cmd, m_Source, m_Destination, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); } context.ExecuteCommandBuffer(cmd); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 705c4d12858..cc30a8a5fca 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -380,6 +380,10 @@ public override bool IsNodeAllowedBySubTarget(Type nodeType) var interfaces = nodeType.GetInterfaces(); bool allowed = true; + // Subgraph nodes inherits all the interfaces including vertex ones. + if (nodeType == typeof(SubGraphNode)) + return true; + // There is no input in the vertex block for now if (interfaces.Contains(typeof(IMayRequireVertexID))) allowed = false; From 7eb0b011232deeb58f023fba65795558bd84076e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 14 Oct 2021 17:10:07 +0200 Subject: [PATCH 027/108] Added options to bind normal and motion vectors in URP --- .../DrawFullscreenFeatureEditor.cs | 94 +++++++++++++++++++ .../DrawFullscreenFeatureEditor.cs.meta | 11 +++ .../RendererFeatures/DrawFullscreenPass.cs | 22 ++--- 3 files changed, 116 insertions(+), 11 deletions(-) create mode 100644 com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs create mode 100644 com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta diff --git a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs b/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs new file mode 100644 index 00000000000..051e917c8a3 --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs @@ -0,0 +1,94 @@ +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; +using System.Linq; + +namespace UnityEditor.Rendering.Universal +{ + [CustomEditor(typeof(DrawFullscreenPass))] + internal class DrawFullscreenPassEditor : Editor + { + #region Serialized Properties + private SerializedProperty m_InjectionPoint; + private SerializedProperty m_RequiresNormalTexture; + private SerializedProperty m_RequiresMotionVectorTexture; + private SerializedProperty m_BlitMaterial; + private SerializedProperty m_BlitMaterialPassIndex; + private SerializedProperty m_Source; + private SerializedProperty m_Destination; + #endregion + + private bool m_IsInitialized = false; + + private struct Styles + { + public static GUIContent InjectionPoint = EditorGUIUtility.TrTextContent("Injection Point", "Specify when the pass will be executed during the rendering of a frame."); + public static GUIContent RequiresNormalTexture = EditorGUIUtility.TrTextContent("Requires Normal texture", "Specifies whether the shader needs the world space normal texture. Keeping this option disabled will avoid the normal texture to be computed."); + public static GUIContent RequiresMotionVectorTexture = EditorGUIUtility.TrTextContent("Requires Motion Texture", "Specifies whether the shader needs the motion texture. Keeping this option disabled will avoid the motion texture to be computed."); + public static GUIContent BlitMaterial = new GUIContent("Material", "The material used to perform the fullscreen draw."); + public static GUIContent BlitMaterialPassIndex = EditorGUIUtility.TrTextContent("Pass Name", "Name of the material pass to use for the fullscreen draw."); + public static GUIContent Source = EditorGUIUtility.TrTextContent("Source", "Specifies the source texture for the blit. You can sample it from"); + public static GUIContent Destination = EditorGUIUtility.TrTextContent("Destination", "."); + } + + private void Init() + { + SerializedProperty settings = serializedObject.FindProperty("m_Settings"); + m_InjectionPoint = settings.FindPropertyRelative("injectionPoint"); + m_RequiresNormalTexture = settings.FindPropertyRelative("requiresNormalTexture"); + m_RequiresMotionVectorTexture = settings.FindPropertyRelative("requiresMotionVectorTexture"); + m_BlitMaterial = settings.FindPropertyRelative("blitMaterial"); + m_BlitMaterialPassIndex = settings.FindPropertyRelative("blitMaterialPassIndex"); + m_Source = settings.FindPropertyRelative("source"); + m_Destination = settings.FindPropertyRelative("destination"); + m_IsInitialized = true; + } + + GUIContent[] GetMaterialPassNames(Material mat) + { + GUIContent[] passNames = new GUIContent[mat.passCount]; + + for (int i = 0; i < mat.passCount; i++) + { + string passName = mat.GetPassName(i); + passNames[i] = new GUIContent(string.IsNullOrEmpty(passName) ? i.ToString() : passName); + } + + return passNames; + } + + public override void OnInspectorGUI() + { + if (!m_IsInitialized) + Init(); + + EditorGUILayout.PropertyField(m_InjectionPoint, Styles.InjectionPoint); + EditorGUILayout.PropertyField(m_RequiresNormalTexture, Styles.RequiresNormalTexture); + EditorGUILayout.PropertyField(m_RequiresMotionVectorTexture, Styles.RequiresMotionVectorTexture); + EditorGUILayout.PropertyField(m_BlitMaterial, Styles.BlitMaterial); + if (m_BlitMaterial.objectReferenceValue is Material material && material?.passCount > 0) + { + EditorGUI.indentLevel++; + + var rect = EditorGUILayout.GetControlRect(true); + EditorGUI.BeginProperty(rect, Styles.BlitMaterialPassIndex, m_BlitMaterialPassIndex); + + EditorGUI.BeginChangeCheck(); + int index = m_BlitMaterialPassIndex.intValue; + + if (index >= material.passCount) + index = material.passCount - 1; + + index = EditorGUI.IntPopup(rect, Styles.BlitMaterialPassIndex, index, GetMaterialPassNames(material), Enumerable.Range(0, material.passCount).ToArray()); + if (EditorGUI.EndChangeCheck()) + m_BlitMaterialPassIndex.intValue = index; + + EditorGUI.EndProperty(); + + EditorGUI.indentLevel--; + } + EditorGUILayout.PropertyField(m_Source, Styles.Source); + EditorGUILayout.PropertyField(m_Destination, Styles.Destination); + } + } +} diff --git a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta b/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta new file mode 100644 index 00000000000..95be10b6fb2 --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 22ef3eb47947de44f9295df3cbc3de75 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs index cc2f4e97ea9..46c2917dbe7 100644 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs @@ -13,13 +13,15 @@ internal class DrawFullscreenSettings { // Parameters [SerializeField] internal RenderPassEvent injectionPoint = RenderPassEvent.AfterRenderingOpaques; + [SerializeField] internal bool requiresNormalTexture = false; + [SerializeField] internal bool requiresMotionVectorTexture = false; [SerializeField] internal Material blitMaterial; [SerializeField] internal int blitMaterialPassIndex; [SerializeField] internal DrawFullscreenBufferType source = DrawFullscreenBufferType.CameraColor; [SerializeField] internal DrawFullscreenBufferType destination = DrawFullscreenBufferType.CameraColor; } - [DisallowMultipleRendererFeature] + [ExcludeFromPreset] [Tooltip("Draw a fullscreen effect on screen using the material in parameter.")] internal class DrawFullscreenPass : ScriptableRendererFeature { @@ -52,11 +54,6 @@ private class FullscreenPass : ScriptableRenderPass static readonly int k_TemporaryRTId = Shader.PropertyToID("_TempFullscreenRT"); static readonly int k_CustomRTId = Shader.PropertyToID("_CustomColorRT"); - // Properties - // private bool isRendererDeferred => m_Renderer != null && m_Renderer is UniversalRenderer && ((UniversalRenderer)m_Renderer).renderingMode == RenderingMode.Deferred; - - // Private Variables - ProfilingSampler m_ProfilingSampler = ProfilingSampler.Get(URPProfileId.DrawFullscreen); ScriptableRenderer m_Renderer = null; DrawFullscreenSettings m_Settings; bool m_IsSourceAndDestinationSameTarget; @@ -73,7 +70,10 @@ internal bool Setup(DrawFullscreenSettings featureSettings, ScriptableRenderer r ConfigureInput(ScriptableRenderPassInput.Depth); // TODO: add an option to request normals - ConfigureInput(ScriptableRenderPassInput.Normal); + if (featureSettings.requiresNormalTexture) + ConfigureInput(ScriptableRenderPassInput.Normal); + if (featureSettings.requiresMotionVectorTexture) + ConfigureInput(ScriptableRenderPassInput.Motion); return m_Settings.blitMaterial != null && m_Settings.blitMaterial.passCount > m_Settings.blitMaterialPassIndex @@ -115,10 +115,10 @@ public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderin // Configure targets and clear color // TODO: we can also write to custom? // TODO: do we need that? - if (m_Settings.destination == DrawFullscreenBufferType.CameraColor) - ConfigureTarget(m_Renderer.cameraColorTarget); - else - ConfigureTarget(new RenderTargetIdentifier(k_CustomRTId)); + // if (m_Settings.destination == DrawFullscreenBufferType.CameraColor) + // ConfigureTarget(m_Renderer.cameraColorTarget); + // else + // ConfigureTarget(new RenderTargetIdentifier(k_CustomRTId)); //ConfigureClear(ClearFlag.None, Color.white); } From a33cdb7a05ecec9f9a1625f667bb79bd16e619ef Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 14 Oct 2021 17:12:21 +0200 Subject: [PATCH 028/108] Normal sampling in Universal sample buffer node --- .../ShaderGraph/Nodes/HDSampleBufferNode.cs | 32 ++++++++--------- .../Nodes/UniversalSampleBufferNode.cs | 35 ++++++++++--------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs index dac920bf440..54394ebb6a5 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs @@ -143,31 +143,31 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener switch (bufferType) { case BufferType.NormalWorldSpace: - s.Append("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); - s.Append("NormalData normalData;"); - s.Append("DecodeFromNormalBuffer(pixelCoords, normalData);"); - s.Append("float depth = LoadCameraDepth(pixelCoords);"); - s.Append("return depth > 0 ? normalData.normalWS : 0;"); + s.AppendLine("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); + s.AppendLine("NormalData normalData;"); + s.AppendLine("DecodeFromNormalBuffer(pixelCoords, normalData);"); + s.AppendLine("float depth = LoadCameraDepth(pixelCoords);"); + s.AppendLine("return depth > 0 ? normalData.normalWS : 0;"); break; case BufferType.Roughness: - s.Append("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); - s.Append("NormalData normalData;"); - s.Append("DecodeFromNormalBuffer(pixelCoords, normalData);"); - s.Append("float depth = LoadCameraDepth(pixelCoords);"); - s.Append("return depth > 0 ? PerceptualRoughnessToRoughness(normalData.perceptualRoughness) : 0;"); + s.AppendLine("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); + s.AppendLine("NormalData normalData;"); + s.AppendLine("DecodeFromNormalBuffer(pixelCoords, normalData);"); + s.AppendLine("float depth = LoadCameraDepth(pixelCoords);"); + s.AppendLine("return depth > 0 ? PerceptualRoughnessToRoughness(normalData.perceptualRoughness) : 0;"); break; case BufferType.MotionVectors: // if we have a value > 1.0f, it means we have selected the "no motion option", hence we force motionVec 0. - s.Append($"float4 motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_CameraMotionVectorsTexture, samplerState, uv * _RTHandleScale.xy, 0);"); - s.Append("float2 motionVec;"); - s.Append("DecodeMotionVector(motionVecBufferSample, motionVec);"); - s.Append("return motionVec;"); + s.AppendLine($"float4 motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_CameraMotionVectorsTexture, samplerState, uv * _RTHandleScale.xy, 0);"); + s.AppendLine("float2 motionVec;"); + s.AppendLine("DecodeMotionVector(motionVecBufferSample, motionVec);"); + s.AppendLine("return motionVec;"); break; case BufferType.PostProcessInput: - s.Append("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); + s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); break; case BufferType.BlitSource: - s.Append($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); + s.AppendLine($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); break; default: s.AppendLine("return 0.0;"); diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs index 3dd9194792d..aa18ca789ca 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs @@ -48,7 +48,7 @@ public BufferType bufferType } } - public override string documentationURL => Documentation.GetPageLink("SGNode-HD-Sample-Buffer"); + public override string documentationURL => Documentation.GetPageLink("SGNode-Universal-Sample-Buffer"); public UniversalSampleBufferNode() { @@ -57,7 +57,8 @@ public UniversalSampleBufferNode() UpdateNodeAfterDeserialization(); } - public override bool hasPreview { get { return false; } } + public override bool hasPreview { get { return true; } } + public override PreviewMode previewMode => PreviewMode.Preview2D; int channelCount; @@ -120,17 +121,21 @@ public override void CollectShaderProperties(PropertyCollector properties, Gener // } } - string GetFunctionName() => "Unity_HDRP_SampleBuffer_$precision"; + string GetFunctionName() => "Unity_Universal_SampleBuffer_$precision"; public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) { - // Preview SG doesn't have access to HDRP depth buffer + // Preview SG doesn't have access to render pipeline buffer if (!generationMode.IsPreview()) { registry.ProvideFunction(GetFunctionName(), s => { - s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/NormalBuffer.hlsl\""); - s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Builtin/BuiltinData.hlsl\""); + // Default sampler when the sampler slot is not connected. + s.AppendLine("SAMPLER(s_linear_clamp_sampler);"); + + s.AppendLine("#include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\""); + + // s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Builtin/BuiltinData.hlsl\""); s.AppendLine("$precision{1} {0}($precision2 uv, SamplerState samplerState)", GetFunctionName(), channelCount); using (s.BlockScope()) @@ -138,24 +143,20 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener switch (bufferType) { case BufferType.NormalWorldSpace: - s.Append("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); - s.Append("NormalData normalData;"); - s.Append("DecodeFromNormalBuffer(pixelCoords, normalData);"); - s.Append("float depth = LoadCameraDepth(pixelCoords);"); - s.Append("return depth > 0 ? normalData.normalWS : 0;"); + s.AppendLine("return SampleSceneNormals(uv);"); break; case BufferType.MotionVectors: // if we have a value > 1.0f, it means we have selected the "no motion option", hence we force motionVec 0. - s.Append($"float4 motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_CameraMotionVectorsTexture, samplerState, uv * _RTHandleScale.xy, 0);"); - s.Append("float2 motionVec;"); - s.Append("DecodeMotionVector(motionVecBufferSample, motionVec);"); - s.Append("return motionVec;"); + s.AppendLine($"float4 motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_CameraMotionVectorsTexture, samplerState, uv * _RTHandleScale.xy, 0);"); + s.AppendLine("float2 motionVec;"); + s.AppendLine("DecodeMotionVector(motionVecBufferSample, motionVec);"); + s.AppendLine("return motionVec;"); break; // case BufferType.PostProcessInput: - // s.Append("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); + // s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); // break; case BufferType.BlitSource: - s.Append($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); + s.AppendLine($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); break; default: s.AppendLine("return 0.0;"); From 17997a0a282adacc4f08d6965050865b26b2628c Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 14 Oct 2021 18:18:29 +0200 Subject: [PATCH 029/108] Fix depth test compilation --- .../Targets/Fullscreen/FullscreenData.cs | 2 +- .../Targets/Fullscreen/FullscreenSubTarget.cs | 21 +++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs index c06ae483389..ede3b7e30be 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs @@ -171,7 +171,7 @@ public bool allowMaterialOverride } [SerializeField] - CompareFunction m_DepthTestMode = CompareFunction.Always; + CompareFunction m_DepthTestMode = CompareFunction.Disabled; public CompareFunction depthTestMode { get => m_DepthTestMode; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index cc30a8a5fca..70b6c166971 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -171,7 +171,7 @@ public RenderStateCollection GetRenderState() if (fullscreenData.depthTestMode == CompareFunction.Disabled) result.Add(RenderState.ZTest("Off")); else - result.Add(RenderState.ZTest(fullscreenData.depthTestMode.ToString())); + result.Add(RenderState.ZTest(CompareFunctionToZTest(fullscreenData.depthTestMode).ToString())); result.Add(RenderState.ZWrite(fullscreenData.depthWrite ? ZWrite.On.ToString() : ZWrite.Off.ToString())); // Blend mode @@ -225,6 +225,19 @@ public RenderStateCollection GetRenderState() _ => Blend.Zero }; + public static ZTest CompareFunctionToZTest(CompareFunction mode) => mode switch + { + CompareFunction.Equal => ZTest.Equal, + CompareFunction.NotEqual => ZTest.NotEqual, + CompareFunction.Greater => ZTest.Greater, + CompareFunction.Less => ZTest.Less, + CompareFunction.GreaterEqual => ZTest.GEqual, + CompareFunction.LessEqual => ZTest.LEqual, + CompareFunction.Always => ZTest.Always, + CompareFunction.Disabled => ZTest.Always, + _ => ZTest.Always + }; + public virtual SubShaderDescriptor GenerateSubShader() { var result = new SubShaderDescriptor() @@ -234,8 +247,8 @@ public virtual SubShaderDescriptor GenerateSubShader() pipelineTag = pipelineTag, }; - result.passes.Add(GenerateFullscreenPass(FullscreenCompatibility.Blit)); result.passes.Add(GenerateFullscreenPass(FullscreenCompatibility.DrawProcedural)); + result.passes.Add(GenerateFullscreenPass(FullscreenCompatibility.Blit)); return result; } @@ -398,14 +411,14 @@ public override bool IsNodeAllowedBySubTarget(Type nodeType) public override void GetFields(ref TargetFieldContext context) { context.AddField(UnityEditor.ShaderGraph.Fields.GraphPixel); - context.AddField(FullscreenFields.depth, fullscreenData.depthWrite); + context.AddField(FullscreenFields.depth, fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled); } public override void GetActiveBlocks(ref TargetActiveBlockContext context) { context.AddBlock(BlockFields.SurfaceDescription.BaseColor); context.AddBlock(BlockFields.SurfaceDescription.Alpha); - context.AddBlock(FullscreenBlocks.depth, fullscreenData.depthWrite); + context.AddBlock(FullscreenBlocks.depth, fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled); } public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) From 9d002daba9f6c9d98dacb229b91e5571dd6f3399 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 14 Oct 2021 18:20:23 +0200 Subject: [PATCH 030/108] Fix custom post process template --- .../Templates/CustomPostProcessingVolume.template | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template index a3e868188fd..05f68445812 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template @@ -32,7 +32,8 @@ public sealed class #SCRIPTNAME# : CustomPostProcessVolumeComponent, IPostProces return; m_Material.SetFloat("_Intensity", intensity.value); - cmd.Blit(source, destination, m_Material, 0); + m_Material.SetTexture("_MainTex", source); + HDUtils.DrawFullScreen(cmd, m_Material, destination, shaderPassId: 0); } public override void Cleanup() From 60a85f65ac8fd90f5b7f3d9e087ac286c02b2e6e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 15 Oct 2021 16:04:11 +0200 Subject: [PATCH 031/108] Started to add GLES2 support + finish URP integration --- .../Runtime/Utilities/Blitter.cs | 16 ++++++++++++++++ .../HDRenderPipeline.RenderGraph.cs | 4 ++-- .../DrawFullscreenFeatureEditor.cs | 4 ++-- .../Nodes/UniversalSampleBufferNode.cs | 5 +++-- .../Targets/UniversalFullscreenSubTarget.cs | 19 +++++++++++++++++++ .../RendererFeatures/DrawFullscreenPass.cs | 2 -- .../Targets/Fullscreen/FullscreenSubTarget.cs | 6 +++++- .../Fullscreen/Includes/FullscreenBlit.hlsl | 4 ++++ .../Fullscreen/Includes/FullscreenCommon.hlsl | 5 +++-- .../Includes/FullscreenDrawProcedural.hlsl | 4 ++++ 10 files changed, 58 insertions(+), 11 deletions(-) diff --git a/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs b/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs index d87b4447738..18a72c6f72e 100644 --- a/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs +++ b/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs @@ -239,6 +239,22 @@ public static void BlitTexture(CommandBuffer cmd, RTHandle source, Vector4 scale DrawTriangle(cmd, material, pass); } + /// + /// Blit a Texture with a specified material. The reference name "_BlitTexture" will be used to bind the input texture. + /// + /// Command Buffer used for rendering. + /// Source render target. + /// Destination render target. + /// Material to invoke when blitting. + /// Pass idx within the material to invoke. + public static void BlitTexture(CommandBuffer cmd, RenderTargetIdentifier source, RenderTargetIdentifier destination, Material material, int pass) + { + // Unfortunately there is no function bind a RenderTargetIdentifier with a property block so we have to bind it globally. + cmd.SetGlobalTexture(BlitShaderIDs._BlitTexture, source); + cmd.SetRenderTarget(destination); + DrawTriangle(cmd, material, pass); + } + /// /// Blit a RTHandle to another RTHandle. /// This will properly account for partial usage (in term of resolution) of the texture for the current viewport. diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index aa2bc7f0929..b10a2e28ebf 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs @@ -50,8 +50,8 @@ void RecordRenderGraph(RenderRequest renderRequest, hdCamera.depthBufferMipChainInfo.ComputePackedMipChainInfo(RTHandles.rtHandleProperties.currentRenderTargetSize); // Bind the depth pyramid offset info for the HDSceneDepth node in ShaderGraph. This can be used by users in custom passes. - Shader.SetGlobalBuffer(HDShaderIDs._DepthPyramidMipLevelOffsets, m_DepthBufferMipChainInfo.GetOffsetBufferData(m_DepthPyramidMipLevelOffsetsBuffer)); - Shader.SetGlobalVector(HDShaderIDs._DepthPyramidBufferSize, new Vector4(m_DepthBufferMipChainInfo.textureSize.x, m_DepthBufferMipChainInfo.textureSize.y, 1.0f / m_DepthBufferMipChainInfo.textureSize.x, 1.0f / m_DepthBufferMipChainInfo.textureSize.y)); + Shader.SetGlobalBuffer(HDShaderIDs._DepthPyramidMipLevelOffsets, hdCamera.depthBufferMipChainInfo.GetOffsetBufferData(m_DepthPyramidMipLevelOffsetsBuffer)); + Shader.SetGlobalVector(HDShaderIDs._DepthPyramidBufferSize, new Vector4(hdCamera.depthBufferMipChainInfo.textureSize.x, hdCamera.depthBufferMipChainInfo.textureSize.y, 1.0f / hdCamera.depthBufferMipChainInfo.textureSize.x, 1.0f / hdCamera.depthBufferMipChainInfo.textureSize.y)); #if UNITY_EDITOR var showGizmos = camera.cameraType == CameraType.Game diff --git a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs b/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs index 051e917c8a3..9c587381529 100644 --- a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs +++ b/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs @@ -27,8 +27,8 @@ private struct Styles public static GUIContent RequiresMotionVectorTexture = EditorGUIUtility.TrTextContent("Requires Motion Texture", "Specifies whether the shader needs the motion texture. Keeping this option disabled will avoid the motion texture to be computed."); public static GUIContent BlitMaterial = new GUIContent("Material", "The material used to perform the fullscreen draw."); public static GUIContent BlitMaterialPassIndex = EditorGUIUtility.TrTextContent("Pass Name", "Name of the material pass to use for the fullscreen draw."); - public static GUIContent Source = EditorGUIUtility.TrTextContent("Source", "Specifies the source texture for the blit. You can sample it from"); - public static GUIContent Destination = EditorGUIUtility.TrTextContent("Destination", "."); + public static GUIContent Source = EditorGUIUtility.TrTextContent("Source", "Specifies the source texture for the fullscreen pass. You can sample it from"); + public static GUIContent Destination = EditorGUIUtility.TrTextContent("Destination", "Specifies the destination texture for the fullscreen pass."); } private void Init() diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs index aa18ca789ca..ed04692d913 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs @@ -101,8 +101,9 @@ public override void CollectShaderProperties(PropertyCollector properties, Gener { properties.AddShaderProperty(new Texture2DArrayShaderProperty { - overrideReferenceName = "_MainTex", - displayName = "_MainTex", + // Make it compatible with Blitter.cs calls + overrideReferenceName = "_BlitTexture", + displayName = "_BlitTexture", hidden = true, generatePropertyBlock = true, isMainTexture = true, diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs index 296da9dcd91..9cef4053bb2 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs @@ -32,5 +32,24 @@ public UniversalFullscreenSubTarget() { displayName = "Fullscreen"; } + + protected override KeywordCollection GetPassKeywords(FullscreenCompatibility compatibility) + { + return new KeywordCollection + { + useDrawProcedural + }; + } + + // For GLES 2 support + static KeywordDescriptor useDrawProcedural = new KeywordDescriptor + { + displayName = "Use Draw Procedural", + referenceName = "_USE_DRAW_PROCEDURAL", + type = KeywordType.Boolean, + definition = KeywordDefinition.MultiCompile, + scope = KeywordScope.Global, + stages = KeywordShaderStage.Vertex, + }; } } diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs index 46c2917dbe7..b4fe01fcbf0 100644 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs @@ -92,9 +92,7 @@ public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderin var renderer = renderingData.cameraData.renderer; if (m_Settings.source == DrawFullscreenBufferType.Custom || m_Settings.destination == DrawFullscreenBufferType.Custom) - { cmd.GetTemporaryRT(k_CustomRTId, blitTargetDescriptor, FilterMode.Bilinear); - } if (m_Settings.source == DrawFullscreenBufferType.CameraColor) m_Source = renderer.cameraColorTarget; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 70b6c166971..20267ef20fd 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -300,6 +300,9 @@ public virtual IncludeCollection GetPostGraphIncludes() protected virtual DefineCollection GetPassDefines(FullscreenCompatibility compatibility) => new DefineCollection(); + protected virtual KeywordCollection GetPassKeywords(FullscreenCompatibility compatibility) + => new KeywordCollection(); + public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility compatibility) { var fullscreenPass = new PassDescriptor @@ -337,6 +340,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com requiredFields = new FieldCollection { StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code + StructFields.Attributes.positionOS, StructFields.Varyings.texCoord0, StructFields.Varyings.texCoord1, // We store the view direction computed in the vertex in the texCoord1 StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case @@ -355,7 +359,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com {depthWriteKeywork, 1, new FieldCondition(FullscreenFields.depth, true)}, GetPassDefines(compatibility), }, - keywords = new KeywordCollection(), + keywords = GetPassKeywords(compatibility), includes = new IncludeCollection { // Pre-graph diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl index 9a6e25d706b..51687b19aeb 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl @@ -1,7 +1,11 @@ PackedVaryings vert(Attributes input) { Varyings output = (Varyings)0; +#if SHADER_API_GLES + output.positionCS = float4(input.positionOS.xyz, 1); +#else output.positionCS = GetBlitVertexPosition(input.vertexID); +#endif BuildVaryings(input, output); PackedVaryings packedOutput = PackVaryings(output); return packedOutput; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index 91f65238d72..bd5a3350107 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -80,9 +80,10 @@ void BuildVaryings(Attributes input, inout Varyings output) output.texCoord0 = output.positionCS * 0.5 + 0.5; output.texCoord0.y = 1 - output.texCoord0.y; + float3 p = ComputeWorldSpacePosition(output.positionCS, UNITY_MATRIX_I_VP); + // Encode view direction in texCoord1 - float3 worldPos = mul(UNITY_MATRIX_I_VP, float4(output.positionCS.xyz, 1)).xyz; - output.texCoord1.xyz = worldPos; + output.texCoord1.xyz = GetWorldSpaceViewDir(p);// - float3(0, 2, 0); } float4 GetDrawProceduralVertexPosition(uint vertexID) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl index 9c52204af53..fa2ff9ab93f 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl @@ -1,7 +1,11 @@ PackedVaryings vert(Attributes input) { Varyings output = (Varyings)0; +#if SHADER_API_GLES + output.positionCS = float4(input.positionOS.xyz, 1); +#else output.positionCS = GetDrawProceduralVertexPosition(input.vertexID); +#endif BuildVaryings(input, output); PackedVaryings packedOutput = PackVaryings(output); return packedOutput; From cdb4e338e9a95e36ea6fcb010134b4f06d524da2 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Mon, 18 Oct 2021 15:55:12 +0200 Subject: [PATCH 032/108] FIx missing only_renderers --- .../Runtime/Debug/DebugLightVolumes.shader | 2 ++ .../Runtime/Debug/DebugVTBlit.shader | 1 + 2 files changed, 3 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugLightVolumes.shader b/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugLightVolumes.shader index 32f2a913a98..78d0c87a5d2 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugLightVolumes.shader +++ b/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugLightVolumes.shader @@ -19,6 +19,7 @@ Shader "Hidden/HDRP/DebugLightVolumes" HLSLPROGRAM #pragma vertex vert #pragma fragment frag + #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" @@ -68,6 +69,7 @@ Shader "Hidden/HDRP/DebugLightVolumes" HLSLPROGRAM #pragma vertex vert #pragma fragment frag + #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" diff --git a/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugVTBlit.shader b/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugVTBlit.shader index f673b6e6c2a..86b05d0d9d2 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugVTBlit.shader +++ b/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugVTBlit.shader @@ -3,6 +3,7 @@ Shader "Hidden/DebugVTBlit" HLSLINCLUDE #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch struct Attributes { From bcaadca1b4cd9e5286effb1e383ab71b6dc2acba Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Mon, 18 Oct 2021 15:57:38 +0200 Subject: [PATCH 033/108] Finished fullscreen draw render feature in URP + Fix scene color node sampling --- .../RendererFeatures/DrawFullscreenPass.cs | 17 +++-------------- .../Fullscreen/Includes/FullscreenCommon.hlsl | 2 +- .../Templates/SharedCode.template.hlsl | 2 ++ 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs index b4fe01fcbf0..05c40d522b3 100644 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs @@ -11,7 +11,6 @@ internal enum DrawFullscreenBufferType [Serializable] internal class DrawFullscreenSettings { - // Parameters [SerializeField] internal RenderPassEvent injectionPoint = RenderPassEvent.AfterRenderingOpaques; [SerializeField] internal bool requiresNormalTexture = false; [SerializeField] internal bool requiresMotionVectorTexture = false; @@ -33,7 +32,6 @@ internal class DrawFullscreenPass : ScriptableRendererFeature /// public override void Create() { - // Create the pass... if (m_FullscreenPass == null) m_FullscreenPass = new FullscreenPass(); } @@ -69,7 +67,6 @@ internal bool Setup(DrawFullscreenSettings featureSettings, ScriptableRenderer r m_ProfilerTagName = profilerTagName; ConfigureInput(ScriptableRenderPassInput.Depth); - // TODO: add an option to request normals if (featureSettings.requiresNormalTexture) ConfigureInput(ScriptableRenderPassInput.Normal); if (featureSettings.requiresMotionVectorTexture) @@ -109,15 +106,6 @@ public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderin cmd.GetTemporaryRT(k_TemporaryRTId, blitTargetDescriptor, FilterMode.Bilinear); m_Temp = new RenderTargetIdentifier(k_TemporaryRTId); } - - // Configure targets and clear color - // TODO: we can also write to custom? - // TODO: do we need that? - // if (m_Settings.destination == DrawFullscreenBufferType.CameraColor) - // ConfigureTarget(m_Renderer.cameraColorTarget); - // else - // ConfigureTarget(new RenderTargetIdentifier(k_CustomRTId)); - //ConfigureClear(ClearFlag.None, Color.white); } /// @@ -125,15 +113,16 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData { CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTagName); + cmd.SetGlobalTexture("_CameraOpaqueTexture", renderingData.cameraData.renderer.cameraColorTarget); // Can't read and write to same color target, create a temp render target to blit. if (m_IsSourceAndDestinationSameTarget) { - Blit(cmd, m_Source, m_Temp, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); + Blitter.BlitTexture(cmd, m_Source, m_Temp, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); Blit(cmd, m_Temp, m_Destination); } else { - Blit(cmd, m_Source, m_Destination, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); + Blitter.BlitTexture(cmd, m_Source, m_Destination, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); } context.ExecuteCommandBuffer(cmd); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index bd5a3350107..cf8b48c4f35 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -83,7 +83,7 @@ void BuildVaryings(Attributes input, inout Varyings output) float3 p = ComputeWorldSpacePosition(output.positionCS, UNITY_MATRIX_I_VP); // Encode view direction in texCoord1 - output.texCoord1.xyz = GetWorldSpaceViewDir(p);// - float3(0, 2, 0); + output.texCoord1.xyz = GetWorldSpaceViewDir(p); } float4 GetDrawProceduralVertexPosition(uint vertexID) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index 507f21c8d03..246dd3d15ee 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -61,6 +61,8 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) $SurfaceDescriptionInputs.uv3: output.uv3 = input.texCoord3; $SurfaceDescriptionInputs.VertexColor: output.VertexColor = input.color; $SurfaceDescriptionInputs.TimeParameters: output.TimeParameters = _TimeParameters.xyz; // This is mainly for LW as HD overwrite this value + $SurfaceDescriptionInputs.NDCPosition: output.NDCPosition = output.ScreenPosition.xy; + #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE) #define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign = IS_FRONT_VFACE(input.cullFace, true, false); #else From 0b7ae6aaa14742366c15582fd5aafb848cf6d610 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Mon, 18 Oct 2021 17:31:04 +0200 Subject: [PATCH 034/108] Fix rendering pass ignored --- .../Runtime/RendererFeatures/DrawFullscreenPass.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs index 05c40d522b3..e3f3c8ebabc 100644 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs @@ -65,6 +65,7 @@ internal bool Setup(DrawFullscreenSettings featureSettings, ScriptableRenderer r m_Renderer = renderer; m_Settings = featureSettings; m_ProfilerTagName = profilerTagName; + renderPassEvent = featureSettings.injectionPoint; ConfigureInput(ScriptableRenderPassInput.Depth); if (featureSettings.requiresNormalTexture) From f893acd93edd5cc8917846a69349874971723eb4 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Mon, 18 Oct 2021 18:20:17 +0200 Subject: [PATCH 035/108] Added sample buffer nodes preview in ShaderGraph --- .../ShaderGraph/Nodes/HDSampleBufferNode.cs | 60 +++++++++++++++++-- .../Nodes/UniversalSampleBufferNode.cs | 60 ++++++++++++++++--- 2 files changed, 107 insertions(+), 13 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs index 54394ebb6a5..8fd84102a89 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs @@ -13,7 +13,7 @@ namespace UnityEditor.Rendering.HighDefinition { [SRPFilter(typeof(HDRenderPipeline))] [Title("Input", "High Definition Render Pipeline", "HD Sample Buffer")] - sealed class HDSampleBufferNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture + sealed class HDSampleBufferNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture, IMayRequireNDCPosition { const string k_ScreenPositionSlotName = "UV"; const string k_OutputSlotName = "Output"; @@ -45,6 +45,7 @@ public BufferType bufferType return; m_BufferType = value; + UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); } } @@ -58,7 +59,8 @@ public HDSampleBufferNode() UpdateNodeAfterDeserialization(); } - public override bool hasPreview { get { return false; } } + public override bool hasPreview { get { return true; } } + public override PreviewMode previewMode => PreviewMode.Preview2D; int channelCount; @@ -176,17 +178,65 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } }); } + else + { + registry.ProvideFunction(GetFunctionName(), s => + { + s.AppendLine("$precision{1} {0}($precision2 uv)", GetFunctionName(), channelCount); + using (s.BlockScope()) + { + s.AppendLine(@" +float3 origin = float3(0.0, 0.0, 0.0); +float3 direction = normalize(float3(uv * 2 - 1, 1.0)); +float3 center = float3(0.0, 0.0, 1.5); +float radius = 1; + +float3 rc = origin - center; +float c = dot(rc, rc) - (radius*radius); +float b = dot(direction, rc); +float d = b*b - c; +float t = -b - sqrt(abs(d)); +float st = step(0.0, min(t,d)); +float sphereDistance = lerp(-1.0, t, st); +float3 sphereNormal = 0; + +if (sphereDistance > 0) +{ + float3 hit = origin+direction*sphereDistance; + sphereNormal = normalize(hit - center); +} +"); + switch (bufferType) + { + case BufferType.NormalWorldSpace: + s.AppendLine("return sphereNormal;"); + break; + case BufferType.MotionVectors: + s.AppendLine("return sphereDistance > 0 ? float3(0.5, 0, 0) : 0;"); + break; + case BufferType.Roughness: + s.AppendLine("return sphereDistance > 0 ? float3(0.5, 0.5, 0.5) : 0;"); + break; + case BufferType.PostProcessInput: + case BufferType.BlitSource: + default: + s.AppendLine("return 0.0;"); + break; + } + } + }); + } } public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) { + string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); if (generationMode.IsPreview()) { - sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = 0.0;"); + sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = {GetFunctionName()}(IN.ScreenPosition.xy);"); } else { - string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); var samplerSlot = FindInputSlot(k_SamplerInputSlotId); var edgesSampler = owner.GetEdges(samplerSlot.slotReference); var sampler = edgesSampler.Any() ? $"{GetSlotValue(k_SamplerInputSlotId, generationMode)}.samplerstate" : "s_linear_clamp_sampler"; @@ -195,7 +245,7 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo } public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true; - + public bool RequiresNDCPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; } } diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs index ed04692d913..9de5e2df049 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs @@ -13,7 +13,7 @@ namespace UnityEditor.Rendering.Universal { [SRPFilter(typeof(UniversalRenderPipeline))] [Title("Input", "Universal", "Universal Sample Buffer")] - sealed class UniversalSampleBufferNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture + sealed class UniversalSampleBufferNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireNDCPosition { const string k_ScreenPositionSlotName = "UV"; const string k_OutputSlotName = "Output"; @@ -44,6 +44,7 @@ public BufferType bufferType return; m_BufferType = value; + UpdateNodeAfterDeserialization(); Dirty(ModificationScope.Graph); } } @@ -133,11 +134,8 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener { // Default sampler when the sampler slot is not connected. s.AppendLine("SAMPLER(s_linear_clamp_sampler);"); - s.AppendLine("#include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\""); - // s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Builtin/BuiltinData.hlsl\""); - s.AppendLine("$precision{1} {0}($precision2 uv, SamplerState samplerState)", GetFunctionName(), channelCount); using (s.BlockScope()) { @@ -166,17 +164,64 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } }); } + else + { + registry.ProvideFunction(GetFunctionName(), s => + { + s.AppendLine("$precision{1} {0}($precision2 uv)", GetFunctionName(), channelCount); + using (s.BlockScope()) + { + s.AppendLine(@" +float3 origin = float3(0.0, 0.0, 0.0); +float3 direction = normalize(float3(uv * 2 - 1, 1.0)); +float3 center = float3(0.0, 0.0, 1.5); +float radius = 1; + +float3 rc = origin - center; +float c = dot(rc, rc) - (radius*radius); +float b = dot(direction, rc); +float d = b*b - c; +float t = -b - sqrt(abs(d)); +float st = step(0.0, min(t,d)); +float sphereDistance = lerp(-1.0, t, st); +float3 sphereNormal = 0; + +if (sphereDistance > 0) +{ + float3 hit = origin+direction*sphereDistance; + sphereNormal = normalize(hit - center); +} +"); + switch (bufferType) + { + case BufferType.NormalWorldSpace: + s.AppendLine("return sphereNormal;"); + break; + case BufferType.MotionVectors: + s.AppendLine("return sphereDistance > 0 ? float3(0.5, 0, 0) : 0;"); + break; + // case BufferType.PostProcessInput: + // s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); + // break; + case BufferType.BlitSource: + default: + s.AppendLine("return 0.0;"); + break; + } + } + }); + } } public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) { + string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); if (generationMode.IsPreview()) { - sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = 0.0;"); + sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = {GetFunctionName()}({uv}.xy);"); } else { - string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); var samplerSlot = FindInputSlot(k_SamplerInputSlotId); var edgesSampler = owner.GetEdges(samplerSlot.slotReference); var sampler = edgesSampler.Any() ? $"{GetSlotValue(k_SamplerInputSlotId, generationMode)}.samplerstate" : "s_linear_clamp_sampler"; @@ -184,8 +229,7 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo } } - public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true; - + public bool RequiresNDCPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; } } From 8514ef0a93df9d9dc708268e069e14b5e9f6a518 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 19 Oct 2021 16:41:02 +0200 Subject: [PATCH 036/108] Started to add stencil support to custom passes --- .../DrawRenderersCustomPassDrawer.cs | 67 +++++++++++++++++++ .../CustomPass/FullScreenCustomPassDrawer.cs | 41 ++++++++++++ .../Runtime/RenderPipeline/HDStencilUsage.cs | 2 + .../RenderPass/DrawRenderersCustomPass.cs | 40 +++++++++++ 4 files changed, 150 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs index 35c2358bb3e..eb4ac454259 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs @@ -47,6 +47,16 @@ private class Styles public static GUIContent depthWrite = new GUIContent("Write Depth", "Choose to write depth to the screen."); public static GUIContent depthCompareFunction = new GUIContent("Depth Test", "Choose a new test setting for the depth."); + //Stencil Settings + public static GUIContent overrideStencil = new GUIContent("Override Stencil", "Override stencil state of the objects rendered."); + public static GUIContent stencilReferenceValue = new GUIContent("Reference", "."); + public static GUIContent stencilWriteMask = new GUIContent("Write Mask", "."); + public static GUIContent stencilReadMask = new GUIContent("Read Mask", "."); + public static GUIContent stencilCompareFunction = new GUIContent("Compare Function", "."); + public static GUIContent stencilPassOperation = new GUIContent("Pass", "."); + public static GUIContent stencilFailOperation = new GUIContent("Fail", "."); + public static GUIContent stencilDepthFailOperation = new GUIContent("Depth Fail", "."); + //Camera Settings public static GUIContent overrideCamera = new GUIContent("Camera", "Override camera projections."); public static GUIContent cameraFOV = new GUIContent("Field Of View", "Field Of View to render this pass in."); @@ -85,6 +95,15 @@ private class Styles SerializedProperty m_DepthCompareFunction; SerializedProperty m_DepthWrite; + // Override stencil state + SerializedProperty m_OverrideStencilState; + SerializedProperty m_StencilReferenceValue; + SerializedProperty m_StencilWriteMask; + SerializedProperty m_StencilReadMask; + SerializedProperty m_StencilPassOperation; + SerializedProperty m_StencilFailOperation; + SerializedProperty m_StencilDepthFailOperation; + ReorderableList m_ShaderPassesList; CustomPassVolume m_Volume; @@ -268,6 +287,7 @@ void DoMaterialOverride(ref Rect rect) rect.y += Styles.defaultLineSpace; } + // Depth properties EditorGUI.BeginProperty(rect, Styles.overrideDepth, m_OverrideDepthState); { if (customDepthIsNone) @@ -291,6 +311,52 @@ void DoMaterialOverride(ref Rect rect) EditorGUI.PropertyField(rect, m_DepthWrite, Styles.depthWrite); EditorGUI.indentLevel--; } + + // Stencil properties + EditorGUI.BeginProperty(rect, Styles.overrideStencil, m_OverrideStencilState); + { + if (customDepthIsNone) + { + using (new EditorGUI.DisabledScope(true)) + EditorGUI.Toggle(rect, Styles.overrideStencil, false); + } + else + { + EditorGUI.PropertyField(rect, m_OverrideStencilState, Styles.overrideStencil); + } + } + EditorGUI.EndProperty(); + + if (m_OverrideStencilState.boolValue && !customDepthIsNone) + { + EditorGUI.indentLevel++; + rect.y += Styles.defaultLineSpace; + EditorGUI.PropertyField(rect, m_StencilReferenceValue, Styles.stencilReferenceValue); + rect.y += Styles.defaultLineSpace; + EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); + rect.y += Styles.defaultLineSpace; + EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); + rect.y += Styles.defaultLineSpace; + EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); + rect.y += Styles.defaultLineSpace; + EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); + rect.y += Styles.defaultLineSpace; + EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); + rect.y += Styles.defaultLineSpace; + EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); + rect.y += Styles.defaultLineSpace; + EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); + + // SerializedProperty m_StencilWriteMask; + // SerializedProperty m_StencilReadMask; + // SerializedProperty m_StencilPassOperation; + // SerializedProperty m_StencilFailOperation; + // SerializedProperty m_StencilDepthFailOperation; + + + EditorGUI.indentLevel--; + + } } void DoShaderPassesList(ref Rect rect) @@ -349,6 +415,7 @@ protected override float GetPassHeight(SerializedProperty customPass) if (showMaterialOverride) height += Styles.defaultLineSpace * m_MaterialLines; height += Styles.defaultLineSpace * (m_OverrideDepthState.boolValue && !customDepthIsNone ? 3 : 1); + height += Styles.defaultLineSpace * (m_OverrideStencilState.boolValue && !customDepthIsNone ? 6 : 1); var mat = m_OverrideMaterial.objectReferenceValue as Material; #if SHOW_PASS_NAMES diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index a2efdafa29b..8e71a43842e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -25,6 +25,7 @@ private class Styles public static GUIContent fetchColorBuffer = new GUIContent("Fetch Color Buffer", "Tick this if your effect sample/fetch the camera color buffer"); public readonly static string writeAndFetchColorBufferWarning = "Fetching and Writing to the camera color buffer at the same time is not supported on most platforms."; + public readonly static string stencilWriteOverReservedBits = "The Stencil Write Mask of your material overwrites the bits reserved by HDRP. To avoid rendering errors, set the Write Mask to " + (int)(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1); } // Fullscreen pass @@ -72,16 +73,56 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) m_MaterialPassName.stringValue = mat.GetPassName(index); } EditorGUI.EndProperty(); + rect.y += Styles.defaultLineSpace; + + if (DoesWriteMaskContainsReservedBits(mat)) + { + Rect helpBoxRect = rect; + helpBoxRect.height = Styles.helpBoxHeight; + EditorGUI.HelpBox(helpBoxRect, Styles.stencilWriteOverReservedBits, MessageType.Warning); + rect.y += Styles.helpBoxHeight; + } + // TODO: get the material stencil property and show a warning if writing to HDRP bits } } } + bool DoesWriteMaskContainsReservedBits(Material material) + { + int writeMask = GetStencilWriteMask(material); + return ((writeMask & (int)~(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1)) != 0); + } + + int GetStencilWriteMask(Material material) + { + if (material.shader == null) + return 0; + + var serializedShader = new SerializedObject(material.shader); + var parsed = serializedShader.FindProperty("m_ParsedForm"); + var subShaders = parsed.FindPropertyRelative("m_SubShaders"); + var subShader = subShaders.GetArrayElementAtIndex(0); + var passes = subShader.FindPropertyRelative("m_Passes"); + var pass = passes.GetArrayElementAtIndex(0); + var state = pass.FindPropertyRelative("m_State"); + var writeMask = state.FindPropertyRelative("stencilWriteMask"); + var writeMaskFloatValue = writeMask.FindPropertyRelative("val"); + var writeMaskPropertyName = writeMask.FindPropertyRelative("name"); + + if (material.HasProperty(writeMaskPropertyName.stringValue)) + return (int)material.GetFloat(writeMaskPropertyName.stringValue); + else + return (int)writeMaskFloatValue.floatValue; + } + protected override float GetPassHeight(SerializedProperty customPass) { int lineCount = (m_FullScreenPassMaterial.objectReferenceValue is Material ? 3 : 2); int height = (int)(Styles.defaultLineSpace * lineCount); height += (m_FetchColorBuffer.boolValue && targetColorBuffer == CustomPass.TargetBuffer.Camera) ? (int)Styles.helpBoxHeight : 0; + if (m_FullScreenPassMaterial.objectReferenceValue is Material mat) + height += (DoesWriteMaskContainsReservedBits(mat)) ? (int)Styles.helpBoxHeight : 0; return height; } diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs index 4556b38149c..32b00bcab2a 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -52,6 +53,7 @@ internal enum StencilUsage /// Comp Always /// Pass Replace /// + [Flags] public enum UserStencilUsage { /// User stencil bit 0. diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs index 0e1ac5731a2..74935b05954 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs @@ -66,6 +66,46 @@ public enum ShaderPass /// public bool depthWrite = true; + /// + /// Override the stencil state of the objects. + /// + public bool overrideStencil = false; + + /// + /// Stencil reference value. + /// + public int stencilReferenceValue; + + /// + /// Write mask of the stencil. + /// + public int stencilWriteMask; + + /// + /// Read mask of the stencil + /// + public int stencilReadMask; + + /// + /// Comparison operation between the stencil buffer and the reference value. + /// + public CompareFunction stencilCompareFunction; + + /// + /// Operation to execute if the stencil test passes. + /// + public StencilOp stencilPassOperation; + + /// + /// Operation to execute if the stencil test fails. + /// + public StencilOp stencilFailOperation; + + /// + /// Operation to execute if the depth test fails. + /// + public StencilOp stencilDepthFailOperation; + /// /// Set the shader pass to use when the override material is null /// From a63c2b35ec270bc2ba61ee5ec58e546da85e296f Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 19 Oct 2021 19:41:50 +0200 Subject: [PATCH 037/108] Finish HDRP stencil integration --- .../DrawRenderersCustomPassDrawer.cs | 95 ++++++++++++++----- .../CustomPass/FullScreenCustomPassDrawer.cs | 6 ++ .../RenderPass/DrawRenderersCustomPass.cs | 10 +- 3 files changed, 84 insertions(+), 27 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs index eb4ac454259..ed3e18031a8 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs @@ -69,6 +69,38 @@ private class Styles public static string objectRendererTwiceWithMSAA = "If MSAA is enabled, re-rendering the same object twice will cause depth test artifacts in Before/After Post Process injection points"; } + // Workaround enum to make the EnumFlagsField work, it doesn't handle well enm flags that don't contain all the individual bits as enum values like the UserStencilUsage enum. + [Flags] + enum UserStencilUsageWorkaround + { + UserBit0 = 1 << 0, + UserBit1 = 1 << 1, + } + + static UserStencilUsage ConvertToUserStencilUsage(UserStencilUsageWorkaround w) + { + UserStencilUsage result = 0; + + if ((w & UserStencilUsageWorkaround.UserBit0) != 0) + result |= UserStencilUsage.UserBit0; + if ((w & UserStencilUsageWorkaround.UserBit1) != 0) + result |= UserStencilUsage.UserBit1; + + return result; + } + + static UserStencilUsageWorkaround ConvertToUserStencilUsageWorkaround(UserStencilUsage w) + { + UserStencilUsageWorkaround result = 0; + + if ((w & UserStencilUsage.UserBit0) != 0) + result |= UserStencilUsageWorkaround.UserBit0; + if ((w & UserStencilUsage.UserBit1) != 0) + result |= UserStencilUsageWorkaround.UserBit1; + + return result; + } + //Headers and layout private int m_FilterLines = 2; private int m_MaterialLines = 2; @@ -108,7 +140,8 @@ private class Styles CustomPassVolume m_Volume; - bool customDepthIsNone => (CustomPass.TargetBuffer)m_TargetDepthBuffer.intValue == CustomPass.TargetBuffer.None; + CustomPass.TargetBuffer targetDepthBuffer => (CustomPass.TargetBuffer)m_TargetDepthBuffer.intValue; + bool customDepthIsNone => targetDepthBuffer == CustomPass.TargetBuffer.None; protected bool showMaterialOverride = true; @@ -136,6 +169,15 @@ protected override void Initialize(SerializedProperty customPass) m_DepthCompareFunction = customPass.FindPropertyRelative("depthCompareFunction"); m_DepthWrite = customPass.FindPropertyRelative("depthWrite"); + // Stencil options + m_OverrideStencilState = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.overrideStencil)); + m_StencilReferenceValue = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilReferenceValue)); + m_StencilWriteMask = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilWriteMask)); + m_StencilReadMask = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilReadMask)); + m_StencilPassOperation = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilPassOperation)); + m_StencilFailOperation = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilFailOperation)); + m_StencilDepthFailOperation = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilDepthFailOperation)); + m_Volume = customPass.serializedObject.targetObject as CustomPassVolume; m_ShaderPassesList = new ReorderableList(null, m_ShaderPasses, true, true, true, true); @@ -313,6 +355,7 @@ void DoMaterialOverride(ref Rect rect) } // Stencil properties + rect.y += Styles.defaultLineSpace; EditorGUI.BeginProperty(rect, Styles.overrideStencil, m_OverrideStencilState); { if (customDepthIsNone) @@ -330,33 +373,41 @@ void DoMaterialOverride(ref Rect rect) if (m_OverrideStencilState.boolValue && !customDepthIsNone) { EditorGUI.indentLevel++; + + DrawStencilIntField(ref rect, m_StencilReferenceValue, Styles.stencilReferenceValue); + DrawStencilIntField(ref rect, m_StencilReadMask, Styles.stencilReadMask); + DrawStencilIntField(ref rect, m_StencilWriteMask, Styles.stencilWriteMask); rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilReferenceValue, Styles.stencilReferenceValue); - rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); - rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); - rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); - rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); - rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); + EditorGUI.PropertyField(rect, m_StencilPassOperation, Styles.stencilPassOperation); rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); + EditorGUI.PropertyField(rect, m_StencilFailOperation, Styles.stencilFailOperation); rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilReadMask, Styles.stencilReadMask); - - // SerializedProperty m_StencilWriteMask; - // SerializedProperty m_StencilReadMask; - // SerializedProperty m_StencilPassOperation; - // SerializedProperty m_StencilFailOperation; - // SerializedProperty m_StencilDepthFailOperation; - + EditorGUI.PropertyField(rect, m_StencilDepthFailOperation, Styles.stencilDepthFailOperation); EditorGUI.indentLevel--; + } + } + void DrawStencilIntField(ref Rect rect, SerializedProperty property, GUIContent label) + { + rect.y += Styles.defaultLineSpace; + EditorGUI.BeginProperty(rect, label, property); + if (targetDepthBuffer == CustomPass.TargetBuffer.Camera) + { + var userStencilBits = (UserStencilUsage)property.intValue; + EditorGUI.BeginChangeCheck(); + var e = ConvertToUserStencilUsage((UserStencilUsageWorkaround)EditorGUI.EnumFlagsField(rect, label, ConvertToUserStencilUsageWorkaround(userStencilBits))); + if (EditorGUI.EndChangeCheck()) + property.intValue = (int)(e & (UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1)); } + else + { + EditorGUI.BeginChangeCheck(); + property.intValue = EditorGUI.IntField(rect, Styles.stencilReferenceValue, m_StencilReferenceValue.intValue); + if (EditorGUI.EndChangeCheck()) + property.intValue &= 0xFF; + } + EditorGUI.EndProperty(); } void DoShaderPassesList(ref Rect rect) @@ -415,7 +466,7 @@ protected override float GetPassHeight(SerializedProperty customPass) if (showMaterialOverride) height += Styles.defaultLineSpace * m_MaterialLines; height += Styles.defaultLineSpace * (m_OverrideDepthState.boolValue && !customDepthIsNone ? 3 : 1); - height += Styles.defaultLineSpace * (m_OverrideStencilState.boolValue && !customDepthIsNone ? 6 : 1); + height += Styles.defaultLineSpace * (m_OverrideStencilState.boolValue && !customDepthIsNone ? 7 : 1); var mat = m_OverrideMaterial.objectReferenceValue as Material; #if SHOW_PASS_NAMES diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index 8e71a43842e..d48c336f122 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -33,8 +33,10 @@ private class Styles SerializedProperty m_MaterialPassName; SerializedProperty m_FetchColorBuffer; SerializedProperty m_TargetColorBuffer; + SerializedProperty m_TargetDepthBuffer; CustomPass.TargetBuffer targetColorBuffer => (CustomPass.TargetBuffer)m_TargetColorBuffer.intValue; + CustomPass.TargetBuffer targetDepthBuffer => (CustomPass.TargetBuffer)m_TargetDepthBuffer.intValue; protected override void Initialize(SerializedProperty customPass) { @@ -42,6 +44,7 @@ protected override void Initialize(SerializedProperty customPass) m_MaterialPassName = customPass.FindPropertyRelative("materialPassName"); m_FetchColorBuffer = customPass.FindPropertyRelative("fetchColorBuffer"); m_TargetColorBuffer = customPass.FindPropertyRelative("targetColorBuffer"); + m_TargetDepthBuffer = customPass.FindPropertyRelative("targetDepthBuffer"); } protected override void DoPassGUI(SerializedProperty customPass, Rect rect) @@ -89,6 +92,9 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) bool DoesWriteMaskContainsReservedBits(Material material) { + if (targetDepthBuffer == CustomPass.TargetBuffer.Custom) + return false; + int writeMask = GetStencilWriteMask(material); return ((writeMask & (int)~(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1)) != 0); } diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs index 74935b05954..bd4f42481f2 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs @@ -72,19 +72,19 @@ public enum ShaderPass public bool overrideStencil = false; /// - /// Stencil reference value. + /// Stencil reference value. Be careful when using this value to write in the stencil buffer to not overwrite HDRP stencil bits. /// - public int stencilReferenceValue; + public int stencilReferenceValue = (int)UserStencilUsage.UserBit0; /// /// Write mask of the stencil. /// - public int stencilWriteMask; + public int stencilWriteMask = (int)(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1); /// /// Read mask of the stencil /// - public int stencilReadMask; + public int stencilReadMask = (int)(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1); /// /// Comparison operation between the stencil buffer and the reference value. @@ -193,7 +193,7 @@ protected override void Execute(CustomPassContext ctx) { depthState = new DepthState(depthWrite, depthCompareFunction), // We disable the stencil when the depth is overwritten but we don't write to it, to prevent writing to the stencil. - stencilState = new StencilState(false), + stencilState = new StencilState(overrideStencil, (byte)stencilReadMask, (byte)stencilWriteMask, stencilCompareFunction, stencilPassOperation, stencilFailOperation, stencilDepthFailOperation), }; PerObjectData renderConfig = ctx.hdCamera.frameSettings.IsEnabled(FrameSettingsField.Shadowmask) ? HDUtils.GetBakedLightingWithShadowMaskRenderConfig() : HDUtils.GetBakedLightingRenderConfig(); From 7e1cbb216db387a1dc2be3c02501e985a9f1bcd3 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 19 Oct 2021 19:44:11 +0200 Subject: [PATCH 038/108] update node preview --- .../ShaderGraph/Nodes/HDSampleBufferNode.cs | 27 +++---------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs index 8fd84102a89..8fedcf2f346 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs @@ -185,37 +185,16 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener s.AppendLine("$precision{1} {0}($precision2 uv)", GetFunctionName(), channelCount); using (s.BlockScope()) { - s.AppendLine(@" -float3 origin = float3(0.0, 0.0, 0.0); -float3 direction = normalize(float3(uv * 2 - 1, 1.0)); -float3 center = float3(0.0, 0.0, 1.5); -float radius = 1; - -float3 rc = origin - center; -float c = dot(rc, rc) - (radius*radius); -float b = dot(direction, rc); -float d = b*b - c; -float t = -b - sqrt(abs(d)); -float st = step(0.0, min(t,d)); -float sphereDistance = lerp(-1.0, t, st); -float3 sphereNormal = 0; - -if (sphereDistance > 0) -{ - float3 hit = origin+direction*sphereDistance; - sphereNormal = normalize(hit - center); -} -"); switch (bufferType) { case BufferType.NormalWorldSpace: - s.AppendLine("return sphereNormal;"); + s.AppendLine("return LatlongToDirectionCoordinate(uv);"); break; case BufferType.MotionVectors: - s.AppendLine("return sphereDistance > 0 ? float3(0.5, 0, 0) : 0;"); + s.AppendLine("return uv * 2 - 1;"); break; case BufferType.Roughness: - s.AppendLine("return sphereDistance > 0 ? float3(0.5, 0.5, 0.5) : 0;"); + s.AppendLine("return uv.x;"); break; case BufferType.PostProcessInput: case BufferType.BlitSource: From e563dbd121bc0c0bb060b1c610fb5689c8f8f676 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 19 Oct 2021 20:13:45 +0200 Subject: [PATCH 039/108] Fix custom pass UI update --- .../CustomPass/FullScreenCustomPassDrawer.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index d48c336f122..b23968d03d7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -35,6 +35,8 @@ private class Styles SerializedProperty m_TargetColorBuffer; SerializedProperty m_TargetDepthBuffer; + bool m_ShowStencilWriteWarning = false; + CustomPass.TargetBuffer targetColorBuffer => (CustomPass.TargetBuffer)m_TargetColorBuffer.intValue; CustomPass.TargetBuffer targetDepthBuffer => (CustomPass.TargetBuffer)m_TargetDepthBuffer.intValue; @@ -80,14 +82,24 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) if (DoesWriteMaskContainsReservedBits(mat)) { + if (!m_ShowStencilWriteWarning) + { + m_ShowStencilWriteWarning = true; + GUI.changed = true; // Workaround to update the internal state of the ReorderableList and update the height of the element. + } Rect helpBoxRect = rect; helpBoxRect.height = Styles.helpBoxHeight; EditorGUI.HelpBox(helpBoxRect, Styles.stencilWriteOverReservedBits, MessageType.Warning); rect.y += Styles.helpBoxHeight; } - // TODO: get the material stencil property and show a warning if writing to HDRP bits + else if (m_ShowStencilWriteWarning) + { + m_ShowStencilWriteWarning = false; + GUI.changed = true; // Workaround to update the internal state of the ReorderableList and update the height of the element. + } } } + GUI.changed = true; } bool DoesWriteMaskContainsReservedBits(Material material) From a66a41826ad563e22c367c8303768ae5c448fdb2 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 20 Oct 2021 12:36:51 +0200 Subject: [PATCH 040/108] Fix stencil disabled because of default value --- .../DrawRenderersCustomPassDrawer.cs | 2 +- .../CustomPass/FullScreenCustomPassDrawer.cs | 75 +++++++++++++++---- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs index ed3e18031a8..5b484427824 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs @@ -403,7 +403,7 @@ void DrawStencilIntField(ref Rect rect, SerializedProperty property, GUIContent else { EditorGUI.BeginChangeCheck(); - property.intValue = EditorGUI.IntField(rect, Styles.stencilReferenceValue, m_StencilReferenceValue.intValue); + property.intValue = EditorGUI.IntField(rect, label, property.intValue); if (EditorGUI.EndChangeCheck()) property.intValue &= 0xFF; } diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index b23968d03d7..2151efacfb7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -19,6 +19,7 @@ private class Styles { public static float defaultLineSpace = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; public static float helpBoxHeight = EditorGUIUtility.singleLineHeight * 2; + public static float indentPadding = 17; public static GUIContent fullScreenPassMaterial = new GUIContent("FullScreen Material", "FullScreen Material used for the full screen DrawProcedural."); public static GUIContent materialPassName = new GUIContent("Pass Name", "The shader pass to use for your fullscreen pass."); @@ -89,6 +90,7 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) } Rect helpBoxRect = rect; helpBoxRect.height = Styles.helpBoxHeight; + helpBoxRect.xMin += Styles.indentPadding; EditorGUI.HelpBox(helpBoxRect, Styles.stencilWriteOverReservedBits, MessageType.Warning); rect.y += Styles.helpBoxHeight; } @@ -116,21 +118,64 @@ int GetStencilWriteMask(Material material) if (material.shader == null) return 0; - var serializedShader = new SerializedObject(material.shader); - var parsed = serializedShader.FindProperty("m_ParsedForm"); - var subShaders = parsed.FindPropertyRelative("m_SubShaders"); - var subShader = subShaders.GetArrayElementAtIndex(0); - var passes = subShader.FindPropertyRelative("m_Passes"); - var pass = passes.GetArrayElementAtIndex(0); - var state = pass.FindPropertyRelative("m_State"); - var writeMask = state.FindPropertyRelative("stencilWriteMask"); - var writeMaskFloatValue = writeMask.FindPropertyRelative("val"); - var writeMaskPropertyName = writeMask.FindPropertyRelative("name"); - - if (material.HasProperty(writeMaskPropertyName.stringValue)) - return (int)material.GetFloat(writeMaskPropertyName.stringValue); - else - return (int)writeMaskFloatValue.floatValue; + try + { + // Try to retrieve the serialized information of the stencil in the shader + var serializedShader = new SerializedObject(material.shader); + var parsed = serializedShader.FindProperty("m_ParsedForm"); + var subShaders = parsed.FindPropertyRelative("m_SubShaders"); + var subShader = subShaders.GetArrayElementAtIndex(0); + var passes = subShader.FindPropertyRelative("m_Passes"); + var pass = passes.GetArrayElementAtIndex(0); + var state = pass.FindPropertyRelative("m_State"); + var writeMask = state.FindPropertyRelative("stencilWriteMask"); + var readMask = state.FindPropertyRelative("stencilWriteMask"); + var reference = state.FindPropertyRelative("stencilRef"); + var stencilOpFront = state.FindPropertyRelative("stencilOpFront"); + var passOp = stencilOpFront.FindPropertyRelative("pass"); + var failOp = stencilOpFront.FindPropertyRelative("fail"); + var zFailOp = stencilOpFront.FindPropertyRelative("zFail"); + var writeMaskFloatValue = writeMask.FindPropertyRelative("val"); + var writeMaskPropertyName = writeMask.FindPropertyRelative("name"); + + bool IsStencilEnabled() + { + bool enabled = false; + enabled |= IsNotDefaultValue(reference, 0); + enabled |= IsNotDefaultValue(passOp, 0); + enabled |= IsNotDefaultValue(failOp, 0); + enabled |= IsNotDefaultValue(zFailOp, 0); + enabled |= IsNotDefaultValue(writeMask, 255); + enabled |= IsNotDefaultValue(readMask, 255); + return enabled; + } + + bool IsNotDefaultValue(SerializedProperty prop, float defaultValue) + { + var value = prop.FindPropertyRelative("val"); + var propertyName = prop.FindPropertyRelative("name"); + + if (value.floatValue != defaultValue) + return true; + if (material.HasProperty(propertyName.stringValue)) + return true; + return false; + } + + // First check if the stencil is enabled in the shader: + // We can do this by checking if there are any non-default values in the stencil state + if (!IsStencilEnabled()) + return 0; + + if (material.HasProperty(writeMaskPropertyName.stringValue)) + return (int)material.GetFloat(writeMaskPropertyName.stringValue); + else + return (int)writeMaskFloatValue.floatValue; + } + catch + { + return 0; + } } protected override float GetPassHeight(SerializedProperty customPass) From e32b9a49ebe5fe69c0d43dab3d34acc79dde4d8a Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 20 Oct 2021 15:58:27 +0200 Subject: [PATCH 041/108] Added HDRP graphic test for fullscreen shader graph --- .../8x_ShaderGraph/8210_Fullscreen.meta | 8 + .../8x_ShaderGraph/8210_Fullscreen.unity | 2744 +++++++++++++++++ .../8x_ShaderGraph/8210_Fullscreen.unity.meta | 7 + .../8210_CustomPP1.shadergraph | 753 +++++ .../8210_CustomPP1.shadergraph.meta | 10 + .../8210_CustomPP2.shadergraph | 667 ++++ .../8210_CustomPP2.shadergraph.meta | 10 + .../8210_CustomPass 1.renderTexture | 39 + .../8210_CustomPass 1.renderTexture.meta | 8 + .../8210_CustomPass 2.renderTexture | 39 + .../8210_CustomPass 2.renderTexture.meta | 8 + .../8210_CustomPass 3.renderTexture | 39 + .../8210_CustomPass 3.renderTexture.meta | 8 + .../8210_CustomPass.renderTexture | 39 + .../8210_CustomPass.renderTexture.meta | 8 + .../Box Volume Profile 1.asset | 32 + .../Box Volume Profile 1.asset.meta | 8 + .../8210_Fullscreen/Box Volume Profile.asset | 32 + .../Box Volume Profile.asset.meta | 8 + .../8210_Fullscreen/CustomPP1_8210.cs | 43 + .../8210_Fullscreen/CustomPP1_8210.cs.meta | 11 + .../8210_Fullscreen/CustomPP2_8210.cs | 43 + .../8210_Fullscreen/CustomPP2_8210.cs.meta | 11 + .../FullscreenBlue.shadergraph | 350 +++ .../FullscreenBlue.shadergraph.meta | 10 + .../FullscreenNodes.shadergraph | 397 +++ .../FullscreenNodes.shadergraph.meta | 10 + .../Shader Graphs_FullscreenBlue.mat | 39 + .../Shader Graphs_FullscreenBlue.mat.meta | 8 + .../Shader Graphs_FullscreenNodes.mat | 39 + .../Shader Graphs_FullscreenNodes.mat.meta | 8 + .../Sky and Fog Global Volume Profile.asset | 255 ++ ...y and Fog Global Volume Profile.asset.meta | 8 + .../HDRenderPipelineGlobalSettings.asset | 7 +- .../Direct3D11/None/8210_Fullscreen.png | 3 + .../Direct3D11/None/8210_Fullscreen.png.meta | 110 + TestProjects/HDRP_Tests/Assets/Temp.meta | 8 + .../ProjectSettings/EditorBuildSettings.asset | 5 +- 38 files changed, 5830 insertions(+), 2 deletions(-) create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat.meta create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset create mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset.meta create mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png create mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png.meta create mode 100644 TestProjects/HDRP_Tests/Assets/Temp.meta diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.meta new file mode 100644 index 00000000000..9bafb79e2a5 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 12059506ad0184c41880e85b920130ca +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity new file mode 100644 index 00000000000..a879e9aa354 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity @@ -0,0 +1,2744 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 4 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 4890085278179872738, guid: 29276056c451888488ed35bc795374bf, + type: 2} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &85731396 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 85731397} + - component: {fileID: 85731399} + - component: {fileID: 85731398} + m_Layer: 5 + m_Name: RawImage (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &85731397 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 85731396} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 193675098} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &85731398 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 85731396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 3407c6b0b9a7c44499e4c81b9c33af7f, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &85731399 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 85731396} + m_CullTransparentMesh: 1 +--- !u!1 &193675094 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 193675098} + - component: {fileID: 193675097} + - component: {fileID: 193675096} + - component: {fileID: 193675095} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &193675095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193675094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &193675096 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193675094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &193675097 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193675094} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 562275487} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &193675098 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193675094} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1034793645} + - {fileID: 85731397} + - {fileID: 1593046728} + - {fileID: 678125817} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &212350386 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 212350390} + - component: {fileID: 212350389} + - component: {fileID: 212350387} + m_Layer: 0 + m_Name: Custom Pass Camera 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &212350387 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 212350386} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} + m_Name: + m_EditorClassIdentifier: + clearColorMode: 0 + backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} + clearDepth: 1 + volumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + volumeAnchorOverride: {fileID: 0} + antialiasing: 0 + SMAAQuality: 2 + dithering: 0 + stopNaNs: 0 + taaSharpenStrength: 0.5 + TAAQuality: 1 + taaHistorySharpening: 0.35 + taaAntiFlicker: 0.5 + taaMotionVectorRejection: 0 + taaAntiHistoryRinging: 0 + taaBaseBlendFactor: 0.875 + physicalParameters: + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + flipYMode: 0 + xrRendering: 1 + fullscreenPassthrough: 0 + allowDynamicResolution: 0 + customRenderingSettings: 0 + invertFaceCulling: 0 + probeLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + hasPersistentHistory: 0 + allowDeepLearningSuperSampling: 1 + deepLearningSuperSamplingUseCustomQualitySettings: 0 + deepLearningSuperSamplingQuality: 0 + deepLearningSuperSamplingUseCustomAttributes: 0 + deepLearningSuperSamplingUseOptimalSettings: 1 + deepLearningSuperSamplingSharpening: 0 + exposureTarget: {fileID: 0} + materialMipBias: 0 + m_RenderingPathCustomFrameSettings: + bitDatas: + data1: 72198260625768269 + data2: 13763000477350330392 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 20 + msaaMode: 1 + materialQuality: 0 + renderingPathCustomFrameSettingsOverrideMask: + mask: + data1: 0 + data2: 0 + defaultFrameSettings: 0 + m_Version: 8 + m_ObsoleteRenderingPath: 0 + m_ObsoleteFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 +--- !u!20 &212350389 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 212350386} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 3407c6b0b9a7c44499e4c81b9c33af7f, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &212350390 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 212350386} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4.653012, y: 0.6095099, z: 4.62} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 921410349} + - {fileID: 658257261} + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &250390020 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 250390021} + - component: {fileID: 250390024} + - component: {fileID: 250390023} + - component: {fileID: 250390022} + m_Layer: 10 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &250390021 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250390020} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3.31, y: 0.57, z: 10.95} + m_LocalScale: {x: 26.346195, y: 17.466658, z: 5.612734} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1874909340} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &250390022 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250390020} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &250390023 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250390020} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 7a120e7a213136a4393449a97a8ec1e7, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &250390024 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250390020} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &424095937 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 424095939} + - component: {fileID: 424095938} + m_Layer: 0 + m_Name: Custom Pass + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &424095938 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 424095937} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 26d6499a6bd256e47b859377446493a1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IsGlobal: 0 + fadeRadius: 0 + priority: 0 + customPasses: + - rid: 4581444398646820864 + injectionPoint: 4 + m_TargetCamera: {fileID: 1478009635} + useTargetCamera: 1 + references: + version: 2 + RefIds: + - rid: 4581444398646820864 + type: {class: FullScreenCustomPass, ns: UnityEngine.Rendering.HighDefinition, + asm: Unity.RenderPipelines.HighDefinition.Runtime} + data: + m_Name: Custom Pass + enabled: 1 + targetColorBuffer: 0 + targetDepthBuffer: 0 + clearFlags: 0 + passFoldout: 0 + m_Version: 0 + fullscreenPassMaterial: {fileID: 2100000, guid: cc414eed9437dd448a39710650d4fdf2, + type: 2} + materialPassIndex: 0 + materialPassName: DrawProcedural + fetchColorBuffer: 0 +--- !u!4 &424095939 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 424095937} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 3.65125, y: -0.7491583, z: 3.678979} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1478009636} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &557483584 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 557483585} + - component: {fileID: 557483588} + - component: {fileID: 557483587} + - component: {fileID: 557483586} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &557483585 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557483584} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 2.71} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1871218409} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &557483586 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557483584} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &557483587 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557483584} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 257 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &557483588 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557483584} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!20 &562275487 stripped +Camera: + m_CorrespondingSourceObject: {fileID: 20109210616973140, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + m_PrefabInstance: {fileID: 1277404422} + m_PrefabAsset: {fileID: 0} +--- !u!1 &658257260 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 658257261} + - component: {fileID: 658257262} + m_Layer: 0 + m_Name: Custom Pass + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &658257261 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 658257260} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 3.65125, y: -0.7491583, z: 3.678979} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 212350390} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &658257262 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 658257260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 26d6499a6bd256e47b859377446493a1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IsGlobal: 0 + fadeRadius: 0 + priority: 0 + customPasses: + - rid: 4581444398646820864 + injectionPoint: 1 + m_TargetCamera: {fileID: 212350389} + useTargetCamera: 1 + references: + version: 2 + RefIds: + - rid: 4581444398646820864 + type: {class: FullScreenCustomPass, ns: UnityEngine.Rendering.HighDefinition, + asm: Unity.RenderPipelines.HighDefinition.Runtime} + data: + m_Name: Custom Pass + enabled: 1 + targetColorBuffer: 0 + targetDepthBuffer: 0 + clearFlags: 0 + passFoldout: 0 + m_Version: 0 + fullscreenPassMaterial: {fileID: 2100000, guid: 157adb0fd668aa64e972a92e0d0df1b6, + type: 2} + materialPassIndex: 0 + materialPassName: DrawProcedural + fetchColorBuffer: 0 +--- !u!1 &678125816 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 678125817} + - component: {fileID: 678125819} + - component: {fileID: 678125818} + m_Layer: 5 + m_Name: RawImage (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &678125817 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678125816} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 193675098} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &678125818 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678125816} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: c79d38983ea97334bb8aa8b585dab4be, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &678125819 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678125816} + m_CullTransparentMesh: 1 +--- !u!1 &791397220 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 791397221} + - component: {fileID: 791397224} + - component: {fileID: 791397223} + - component: {fileID: 791397222} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &791397221 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791397220} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 2.71} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1478009636} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &791397222 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791397220} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &791397223 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791397220} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 257 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &791397224 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791397220} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &877529783 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 877529784} + - component: {fileID: 877529787} + - component: {fileID: 877529786} + m_Layer: 10 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &877529784 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877529783} + m_LocalRotation: {x: 0.2178479, y: 0.24882141, z: -0.27272773, w: 0.9034655} + m_LocalPosition: {x: -2.6630733, y: 0.21388769, z: 0.8446548} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1874909340} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 31.962002, y: 22.947, z: -26.941002} +--- !u!114 &877529786 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877529783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7a68c43fe1f2a47cfa234b5eeaa98012, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Intensity: 3.1415927 + m_EnableSpotReflector: 0 + m_LuxAtDistance: 1 + m_InnerSpotPercent: 0 + m_SpotIESCutoffPercent: 100 + m_LightDimmer: 1 + m_VolumetricDimmer: 1 + m_LightUnit: 2 + m_FadeDistance: 10000 + m_VolumetricFadeDistance: 10000 + m_AffectDiffuse: 1 + m_AffectSpecular: 1 + m_NonLightmappedOnly: 0 + m_ShapeWidth: 0.5 + m_ShapeHeight: 0.5 + m_AspectRatio: 1 + m_ShapeRadius: 0 + m_SoftnessScale: 1 + m_UseCustomSpotLightShadowCone: 0 + m_CustomSpotLightShadowCone: 30 + m_MaxSmoothness: 0.99 + m_ApplyRangeAttenuation: 1 + m_DisplayAreaLightEmissiveMesh: 0 + m_AreaLightCookie: {fileID: 0} + m_IESPoint: {fileID: 0} + m_IESSpot: {fileID: 0} + m_IncludeForRayTracing: 1 + m_AreaLightShadowCone: 120 + m_UseScreenSpaceShadows: 0 + m_InteractsWithSky: 1 + m_AngularDiameter: 0 + m_FlareSize: 2 + m_FlareTint: {r: 1, g: 1, b: 1, a: 1} + m_FlareFalloff: 4 + m_SurfaceTexture: {fileID: 0} + m_SurfaceTint: {r: 1, g: 1, b: 1, a: 1} + m_Distance: 150000000 + m_UseRayTracedShadows: 0 + m_NumRayTracingSamples: 4 + m_FilterTracedShadow: 1 + m_FilterSizeTraced: 16 + m_SunLightConeAngle: 0.5 + m_LightShadowRadius: 0.5 + m_SemiTransparentShadow: 0 + m_ColorShadow: 1 + m_DistanceBasedFiltering: 0 + m_EvsmExponent: 15 + m_EvsmLightLeakBias: 0 + m_EvsmVarianceBias: 0.00001 + m_EvsmBlurPasses: 0 + m_LightlayersMask: 1 + m_LinkShadowLayers: 1 + m_ShadowNearPlane: 0.1 + m_BlockerSampleCount: 24 + m_FilterSampleCount: 16 + m_MinFilterSize: 0.01 + m_KernelSize: 5 + m_LightAngle: 1 + m_MaxDepthBias: 0.001 + m_ShadowResolution: + m_Override: 512 + m_UseOverride: 1 + m_Level: 1 + m_ShadowDimmer: 1 + m_VolumetricShadowDimmer: 1 + m_ShadowFadeDistance: 10000 + m_UseContactShadow: + m_Override: 0 + m_UseOverride: 1 + m_Level: 0 + m_RayTracedContactShadow: 0 + m_ShadowTint: {r: 0, g: 0, b: 0, a: 1} + m_PenumbraTint: 0 + m_NormalBias: 0.75 + m_SlopeBias: 0.5 + m_ShadowUpdateMode: 0 + m_AlwaysDrawDynamicShadows: 0 + m_UpdateShadowOnLightMovement: 0 + m_CachedShadowTranslationThreshold: 0.01 + m_CachedShadowAngularThreshold: 0.5 + m_BarnDoorAngle: 90 + m_BarnDoorLength: 0.05 + m_preserveCachedShadow: 0 + m_OnDemandShadowRenderOnPlacement: 1 + m_ShadowCascadeRatios: + - 0.05 + - 0.2 + - 0.3 + m_ShadowCascadeBorders: + - 0.2 + - 0.2 + - 0.2 + - 0.2 + m_ShadowAlgorithm: 0 + m_ShadowVariant: 0 + m_ShadowPrecision: 0 + useOldInspector: 0 + useVolumetric: 1 + featuresFoldout: 1 + m_AreaLightEmissiveMeshShadowCastingMode: 0 + m_AreaLightEmissiveMeshMotionVectorGenerationMode: 0 + m_AreaLightEmissiveMeshLayer: -1 + m_Version: 11 + m_ObsoleteShadowResolutionTier: 1 + m_ObsoleteUseShadowQualitySettings: 0 + m_ObsoleteCustomShadowResolution: 512 + m_ObsoleteContactShadows: 0 + m_PointlightHDType: 0 + m_SpotLightShape: 0 + m_AreaLightShape: 0 +--- !u!108 &877529787 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877529783} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 3.1415927 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 2 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!1 &921410348 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 921410349} + - component: {fileID: 921410352} + - component: {fileID: 921410351} + - component: {fileID: 921410350} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &921410349 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 921410348} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 2.71} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 212350390} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &921410350 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 921410348} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &921410351 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 921410348} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 257 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &921410352 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 921410348} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &950227071 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 950227074} + - component: {fileID: 950227073} + - component: {fileID: 950227072} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &950227072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 950227071} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &950227073 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 950227071} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &950227074 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 950227071} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1034793644 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1034793645} + - component: {fileID: 1034793647} + - component: {fileID: 1034793646} + m_Layer: 5 + m_Name: RawImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1034793645 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034793644} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 193675098} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1034793646 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034793644} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 81cc8443e3680df44941ccad58929bd1, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1034793647 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1034793644} + m_CullTransparentMesh: 1 +--- !u!1001 &1277404422 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1132393308280272, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_Name + value: HDRP_Test_Camera + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalPosition.z + value: -2.366 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 20109210616973140, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: far clip plane + value: 200 + objectReference: {fileID: 0} + - target: {fileID: 20109210616973140, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: near clip plane + value: 0.1 + objectReference: {fileID: 0} + - target: {fileID: 20109210616973140, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_CullingMask.m_Bits + value: 32 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_Version + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableSSR + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableSSAO + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.runSSRAsync + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableDecals + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableShadow + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.runSSAOAsync + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.shaderLitMode + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableDistortion + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableShadowMask + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableLightLayers + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enablePostprocess + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableVolumetrics + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.runLightListAsync + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableAsyncCompute + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableTransmission + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.diffuseGlobalDimmer + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableMotionVectors + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableOpaqueObjects + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableContactShadows + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.specularGlobalDimmer + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableRoughRefraction + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.runContactShadowsAsync + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableTransparentObjects + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableTransparentPrepass + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableObjectMotionVectors + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableTransparentPostpass + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_RenderingPathCustomFrameSettings.bitDatas.data1 + value: 70005818654557 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableSubsurfaceScattering + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.runVolumeVoxelizationAsync + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableAtmosphericScattering + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableRealtimePlanarReflection + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.isFptlEnabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.enableReprojectionForVolumetrics + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableBigTilePrepass + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableComputeLightVariants + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableFptlForForwardOpaque + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableComputeLightEvaluation + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableDeferredTileAndCluster + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableComputeMaterialVariants + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 114995348509370400, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: ImageComparisonSettings.TargetWidth + value: 160 + objectReference: {fileID: 0} + - target: {fileID: 114995348509370400, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: ImageComparisonSettings.TargetHeight + value: 160 + objectReference: {fileID: 0} + - target: {fileID: 114995348509370400, guid: c07ace9ab142ca9469fa377877c2f1e7, + type: 3} + propertyPath: ImageComparisonSettings.AverageCorrectnessThreshold + value: 0.0001 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} +--- !u!1 &1417025915 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1417025916} + - component: {fileID: 1417025918} + - component: {fileID: 1417025917} + m_Layer: 0 + m_Name: Box Volume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1417025916 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1417025915} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1580508407} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1417025917 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1417025915} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IsGlobal: 0 + priority: 0 + blendDistance: 1 + weight: 1 + sharedProfile: {fileID: 11400000, guid: 0c3cded045726c7448fe6c99b1bf862e, type: 2} +--- !u!65 &1417025918 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1417025915} + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &1420907399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1420907400} + - component: {fileID: 1420907402} + - component: {fileID: 1420907401} + m_Layer: 0 + m_Name: Box Volume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1420907400 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1420907399} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1871218409} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1420907401 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1420907399} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IsGlobal: 0 + priority: 0 + blendDistance: 1 + weight: 1 + sharedProfile: {fileID: 11400000, guid: bf36097b78501e54d9bc23dc066be831, type: 2} +--- !u!65 &1420907402 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1420907399} + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &1478009632 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1478009636} + - component: {fileID: 1478009635} + - component: {fileID: 1478009633} + m_Layer: 0 + m_Name: Custom Pass Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1478009633 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1478009632} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} + m_Name: + m_EditorClassIdentifier: + clearColorMode: 0 + backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} + clearDepth: 1 + volumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + volumeAnchorOverride: {fileID: 0} + antialiasing: 0 + SMAAQuality: 2 + dithering: 0 + stopNaNs: 0 + taaSharpenStrength: 0.5 + TAAQuality: 1 + taaHistorySharpening: 0.35 + taaAntiFlicker: 0.5 + taaMotionVectorRejection: 0 + taaAntiHistoryRinging: 0 + taaBaseBlendFactor: 0.875 + physicalParameters: + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + flipYMode: 0 + xrRendering: 1 + fullscreenPassthrough: 0 + allowDynamicResolution: 0 + customRenderingSettings: 0 + invertFaceCulling: 0 + probeLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + hasPersistentHistory: 0 + allowDeepLearningSuperSampling: 1 + deepLearningSuperSamplingUseCustomQualitySettings: 0 + deepLearningSuperSamplingQuality: 0 + deepLearningSuperSamplingUseCustomAttributes: 0 + deepLearningSuperSamplingUseOptimalSettings: 1 + deepLearningSuperSamplingSharpening: 0 + exposureTarget: {fileID: 0} + materialMipBias: 0 + m_RenderingPathCustomFrameSettings: + bitDatas: + data1: 72198260625768269 + data2: 13763000477350330392 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 20 + msaaMode: 1 + materialQuality: 0 + renderingPathCustomFrameSettingsOverrideMask: + mask: + data1: 0 + data2: 0 + defaultFrameSettings: 0 + m_Version: 8 + m_ObsoleteRenderingPath: 0 + m_ObsoleteFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 +--- !u!20 &1478009635 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1478009632} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 81cc8443e3680df44941ccad58929bd1, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1478009636 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1478009632} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4.096988, y: 0.6095099, z: 4.62} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 791397221} + - {fileID: 424095939} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1580508403 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1580508407} + - component: {fileID: 1580508406} + - component: {fileID: 1580508404} + m_Layer: 0 + m_Name: Custom Post Process 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1580508404 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1580508403} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} + m_Name: + m_EditorClassIdentifier: + clearColorMode: 0 + backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} + clearDepth: 1 + volumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + volumeAnchorOverride: {fileID: 0} + antialiasing: 0 + SMAAQuality: 2 + dithering: 0 + stopNaNs: 0 + taaSharpenStrength: 0.5 + TAAQuality: 1 + taaHistorySharpening: 0.35 + taaAntiFlicker: 0.5 + taaMotionVectorRejection: 0 + taaAntiHistoryRinging: 0 + taaBaseBlendFactor: 0.875 + physicalParameters: + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + flipYMode: 0 + xrRendering: 1 + fullscreenPassthrough: 0 + allowDynamicResolution: 0 + customRenderingSettings: 0 + invertFaceCulling: 0 + probeLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + hasPersistentHistory: 0 + allowDeepLearningSuperSampling: 1 + deepLearningSuperSamplingUseCustomQualitySettings: 0 + deepLearningSuperSamplingQuality: 0 + deepLearningSuperSamplingUseCustomAttributes: 0 + deepLearningSuperSamplingUseOptimalSettings: 1 + deepLearningSuperSamplingSharpening: 0 + exposureTarget: {fileID: 0} + materialMipBias: 0 + m_RenderingPathCustomFrameSettings: + bitDatas: + data1: 72198260625768269 + data2: 13763000477350330392 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 20 + msaaMode: 1 + materialQuality: 0 + renderingPathCustomFrameSettingsOverrideMask: + mask: + data1: 0 + data2: 0 + defaultFrameSettings: 0 + m_Version: 8 + m_ObsoleteRenderingPath: 0 + m_ObsoleteFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 +--- !u!20 &1580508406 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1580508403} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: c79d38983ea97334bb8aa8b585dab4be, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1580508407 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1580508403} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3.8469882, y: -4.64049, z: 4.62} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1715040462} + - {fileID: 1417025916} + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1593046727 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1593046728} + - component: {fileID: 1593046730} + - component: {fileID: 1593046729} + m_Layer: 5 + m_Name: RawImage (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1593046728 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1593046727} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 193675098} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1593046729 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1593046727} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 191dad7e57423184c9e8fad7ba8f538c, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1593046730 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1593046727} + m_CullTransparentMesh: 1 +--- !u!1 &1630942965 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1630942967} + - component: {fileID: 1630942966} + m_Layer: 0 + m_Name: Sky and Fog Global Volume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1630942966 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1630942965} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IsGlobal: 1 + priority: 0 + blendDistance: 0 + weight: 1 + sharedProfile: {fileID: 11400000, guid: bf5eb914dbdcd2f4288904fda1f02f12, type: 2} +--- !u!4 &1630942967 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1630942965} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -3.7611985, y: 0.7031163, z: -0.66328514} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1874909340} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1715040461 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1715040462} + - component: {fileID: 1715040465} + - component: {fileID: 1715040464} + - component: {fileID: 1715040463} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1715040462 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1715040461} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 2.71} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1580508407} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1715040463 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1715040461} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1715040464 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1715040461} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 257 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1715040465 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1715040461} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1871218405 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1871218409} + - component: {fileID: 1871218408} + - component: {fileID: 1871218406} + m_Layer: 0 + m_Name: Custom Post Process + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1871218406 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1871218405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} + m_Name: + m_EditorClassIdentifier: + clearColorMode: 0 + backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} + clearDepth: 1 + volumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + volumeAnchorOverride: {fileID: 0} + antialiasing: 0 + SMAAQuality: 2 + dithering: 0 + stopNaNs: 0 + taaSharpenStrength: 0.5 + TAAQuality: 1 + taaHistorySharpening: 0.35 + taaAntiFlicker: 0.5 + taaMotionVectorRejection: 0 + taaAntiHistoryRinging: 0 + taaBaseBlendFactor: 0.875 + physicalParameters: + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + flipYMode: 0 + xrRendering: 1 + fullscreenPassthrough: 0 + allowDynamicResolution: 0 + customRenderingSettings: 0 + invertFaceCulling: 0 + probeLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + hasPersistentHistory: 0 + allowDeepLearningSuperSampling: 1 + deepLearningSuperSamplingUseCustomQualitySettings: 0 + deepLearningSuperSamplingQuality: 0 + deepLearningSuperSamplingUseCustomAttributes: 0 + deepLearningSuperSamplingUseOptimalSettings: 1 + deepLearningSuperSamplingSharpening: 0 + exposureTarget: {fileID: 0} + materialMipBias: 0 + m_RenderingPathCustomFrameSettings: + bitDatas: + data1: 72198260625768269 + data2: 13763000477350330392 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 20 + msaaMode: 1 + materialQuality: 0 + renderingPathCustomFrameSettingsOverrideMask: + mask: + data1: 0 + data2: 0 + defaultFrameSettings: 0 + m_Version: 8 + m_ObsoleteRenderingPath: 0 + m_ObsoleteFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 +--- !u!20 &1871218408 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1871218405} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 191dad7e57423184c9e8fad7ba8f538c, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1871218409 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1871218405} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4.653012, y: -4.64049, z: 4.62} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 557483585} + - {fileID: 1420907400} + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1874909339 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1874909340} + m_Layer: 10 + m_Name: Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1874909340 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1874909339} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.6630733, y: -0.21388769, z: 0.1553452} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 250390021} + - {fileID: 877529784} + - {fileID: 1630942967} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity.meta new file mode 100644 index 00000000000..c59a2782373 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 74b447ba1a6ee064fb7ebe7a6e56c62d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph new file mode 100644 index 00000000000..5c1a2e452ec --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph @@ -0,0 +1,753 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "1a524c69a4724bf0aa188efc10d30eb3", + "m_Properties": [], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "c63878e1b35d42ae9c76498b64a00c7e" + } + ], + "m_Nodes": [ + { + "m_Id": "4539338eb9944d1aaec9d0d433819907" + }, + { + "m_Id": "e90cf50102b54f8987f51b0010f38ee5" + }, + { + "m_Id": "c5cafa5874d547a99ead30de99f7317f" + }, + { + "m_Id": "013f5d180c044dea8728c394175d252b" + }, + { + "m_Id": "e1efc62e205b432fa9757cbcf6e22867" + }, + { + "m_Id": "f44f42f71b8841808d214756275cbde6" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "013f5d180c044dea8728c394175d252b" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4539338eb9944d1aaec9d0d433819907" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c5cafa5874d547a99ead30de99f7317f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "013f5d180c044dea8728c394175d252b" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e1efc62e205b432fa9757cbcf6e22867" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "013f5d180c044dea8728c394175d252b" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f44f42f71b8841808d214756275cbde6" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "013f5d180c044dea8728c394175d252b" + }, + "m_SlotId": 1 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "4539338eb9944d1aaec9d0d433819907" + }, + { + "m_Id": "e90cf50102b54f8987f51b0010f38ee5" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Hidden/Shader", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "3d091b47fadb4e8a9c2aad6238b33095" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.LerpNode", + "m_ObjectId": "013f5d180c044dea8728c394175d252b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Lerp", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -268.0, + "y": 184.0, + "width": 208.0, + "height": 326.0 + } + }, + "m_Slots": [ + { + "m_Id": "5f6d5723672d493698d91cf1dbb57bf6" + }, + { + "m_Id": "15013ee06c1a4f448456ad235ecc8c7d" + }, + { + "m_Id": "c87a9a1280a640a485ef19ad6e8a3ccb" + }, + { + "m_Id": "2cdeea3c45a646549d467f2fbc5e29db" + } + ], + "synonyms": [ + "mix", + "blend", + "linear interpolate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "0608a34f0e8e42f5aa4d7468ceea92f8", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "06a34c6f05474ed68ff5be7ab72fa191", + "m_Id": 4, + "m_DisplayName": "Cells", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Cells", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "15013ee06c1a4f448456ad235ecc8c7d", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBAMaterialSlot", + "m_ObjectId": "1a429df3dd3b4e97a004e3081afa0310", + "m_Id": 2, + "m_DisplayName": "Output", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Output", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "2cdeea3c45a646549d467f2fbc5e29db", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "3bbe6e477c624722824d76634c5b3b62", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", + "m_ObjectId": "3d091b47fadb4e8a9c2aad6238b33095", + "m_ActiveSubTarget": { + "m_Id": "fad52e6a52d24397a17595434f776c36" + }, + "m_Datas": [ + { + "m_Id": "a281e25b4dbe47f6bfffc42ac0349284" + } + ], + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "4539338eb9944d1aaec9d0d433819907", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "0608a34f0e8e42f5aa4d7468ceea92f8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5077f03958554725864fffd16aa502ed", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "5f6d5723672d493698d91cf1dbb57bf6", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "6332ca2634674fd0b2bcb47f45ac602b", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6e711cd584d84ceda59a57c7e59aa773", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "a281e25b4dbe47f6bfffc42ac0349284", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a6f517f9fbc942a6a7f81cdc834727c9", + "m_Id": 2, + "m_DisplayName": "CellDensity", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "CellDensity", + "m_StageCapability": 3, + "m_Value": 5.0, + "m_DefaultValue": 5.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "c58e113a9095416e825c4e109ce5512b", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.HDSampleBufferNode", + "m_ObjectId": "c5cafa5874d547a99ead30de99f7317f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "HD Sample Buffer", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -871.0, + "y": 32.0, + "width": 208.0, + "height": 337.0 + } + }, + "m_Slots": [ + { + "m_Id": "f4fe1d444c9144519d21f41fbf6dcd0e" + }, + { + "m_Id": "c58e113a9095416e825c4e109ce5512b" + }, + { + "m_Id": "1a429df3dd3b4e97a004e3081afa0310" + } + ], + "synonyms": [ + "normal", + "motion vector", + "roughness", + "postprocessinput", + "blit" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_BufferType": 3 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "c63878e1b35d42ae9c76498b64a00c7e", + "m_Name": "", + "m_ChildObjectList": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "c87a9a1280a640a485ef19ad6e8a3ccb", + "m_Id": 2, + "m_DisplayName": "T", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "T", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.VoronoiNode", + "m_ObjectId": "e1efc62e205b432fa9757cbcf6e22867", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Voronoi", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -644.0, + "y": 464.0, + "width": 208.0, + "height": 361.0 + } + }, + "m_Slots": [ + { + "m_Id": "3bbe6e477c624722824d76634c5b3b62" + }, + { + "m_Id": "f88836064ac348229765560de542ed33" + }, + { + "m_Id": "a6f517f9fbc942a6a7f81cdc834727c9" + }, + { + "m_Id": "5077f03958554725864fffd16aa502ed" + }, + { + "m_Id": "06a34c6f05474ed68ff5be7ab72fa191" + } + ], + "synonyms": [ + "worley noise" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_HashType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e90cf50102b54f8987f51b0010f38ee5", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "6e711cd584d84ceda59a57c7e59aa773" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.ColorNode", + "m_ObjectId": "f44f42f71b8841808d214756275cbde6", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -572.0, + "y": 226.0, + "width": 208.0, + "height": 127.0 + } + }, + "m_Slots": [ + { + "m_Id": "6332ca2634674fd0b2bcb47f45ac602b" + } + ], + "synonyms": [ + "rgba" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Color": { + "color": { + "r": 1.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "mode": 0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ScreenPositionMaterialSlot", + "m_ObjectId": "f4fe1d444c9144519d21f41fbf6dcd0e", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_ScreenSpaceType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f88836064ac348229765560de542ed33", + "m_Id": 1, + "m_DisplayName": "AngleOffset", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AngleOffset", + "m_StageCapability": 3, + "m_Value": 2.0, + "m_DefaultValue": 2.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDFullscreenSubTarget", + "m_ObjectId": "fad52e6a52d24397a17595434f776c36" +} + diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph.meta new file mode 100644 index 00000000000..4b9c850105d --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 68ecd3a7cbfa3cc4abea2d7e6294ff07 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph new file mode 100644 index 00000000000..8f02bacf237 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph @@ -0,0 +1,667 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "f12efad63e7944738f0a0d1c6c721728", + "m_Properties": [], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "aacacdf2c25c45de9a0257008efe3d54" + } + ], + "m_Nodes": [ + { + "m_Id": "961fb8e544cb44689ccdfe5180f7b0a1" + }, + { + "m_Id": "eef9625d161d447a88f2209c7ef721f7" + }, + { + "m_Id": "f73319e1a9e44e438ac204585fd3fd19" + }, + { + "m_Id": "d93a15285fbb4584b136c3ccec463f63" + }, + { + "m_Id": "ec6878aa5cda46e4b3b38668e2356df3" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d93a15285fbb4584b136c3ccec463f63" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "961fb8e544cb44689ccdfe5180f7b0a1" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec6878aa5cda46e4b3b38668e2356df3" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d93a15285fbb4584b136c3ccec463f63" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f73319e1a9e44e438ac204585fd3fd19" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d93a15285fbb4584b136c3ccec463f63" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f73319e1a9e44e438ac204585fd3fd19" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "ec6878aa5cda46e4b3b38668e2356df3" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "961fb8e544cb44689ccdfe5180f7b0a1" + }, + { + "m_Id": "eef9625d161d447a88f2209c7ef721f7" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Hidden/Shader", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "852a43cc1ff84236a75a104cec963d00" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "12ebd31ba71a4377a2e6e2603bf6423f", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "1f918b9180094349affefb0c3132b1c0", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", + "m_ObjectId": "852a43cc1ff84236a75a104cec963d00", + "m_ActiveSubTarget": { + "m_Id": "de52b54235ce47088b157aadbe7b83cf" + }, + "m_Datas": [ + { + "m_Id": "abdd244394974bf7b5692147e028382c" + } + ], + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "961fb8e544cb44689ccdfe5180f7b0a1", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "1f918b9180094349affefb0c3132b1c0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "9f965ce9f17d4cdea57a5a58b1f90b8f", + "m_Id": 1, + "m_DisplayName": "Color A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "ColorA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.20000000298023225, + "y": 0.20000000298023225, + "z": 0.20000000298023225 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.20000000298023225, + "g": 0.20000000298023225, + "b": 0.20000000298023225, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "a02cc3283f1e47d1b293b95caa3cca1e", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "aacacdf2c25c45de9a0257008efe3d54", + "m_Name": "", + "m_ChildObjectList": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "abdd244394974bf7b5692147e028382c", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ScreenPositionMaterialSlot", + "m_ObjectId": "b262c2e6f7ff4e3aa4caa3ff679dcbbb", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_ScreenSpaceType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "b6b6d72a669a4734bda6a9d793be6f5d", + "m_Id": 2, + "m_DisplayName": "Color B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "ColorB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.699999988079071, + "y": 0.699999988079071, + "z": 0.699999988079071 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.699999988079071, + "g": 0.699999988079071, + "b": 0.699999988079071, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "baacb8ee40f842bf8049ea7d51ee8bed", + "m_Id": 4, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBAMaterialSlot", + "m_ObjectId": "c24aa6ff2bf0427b9eeebb7ef189d484", + "m_Id": 2, + "m_DisplayName": "Output", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Output", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CheckerboardNode", + "m_ObjectId": "d93a15285fbb4584b136c3ccec463f63", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Checkerboard", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -307.0, + "y": 190.0, + "width": 208.0, + "height": 350.0 + } + }, + "m_Slots": [ + { + "m_Id": "e2020a28082b4fe3859c0a7fd537d90b" + }, + { + "m_Id": "9f965ce9f17d4cdea57a5a58b1f90b8f" + }, + { + "m_Id": "b6b6d72a669a4734bda6a9d793be6f5d" + }, + { + "m_Id": "eb4bfb404b374edb95a3853f196f6828" + }, + { + "m_Id": "baacb8ee40f842bf8049ea7d51ee8bed" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDFullscreenSubTarget", + "m_ObjectId": "de52b54235ce47088b157aadbe7b83cf" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "e2020a28082b4fe3859c0a7fd537d90b", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e2c12797a1ed47b9b082544806187dc4", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "eb4bfb404b374edb95a3853f196f6828", + "m_Id": 3, + "m_DisplayName": "Frequency", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Frequency", + "m_StageCapability": 3, + "m_Value": { + "x": 4.0, + "y": 4.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.InvertColorsNode", + "m_ObjectId": "ec6878aa5cda46e4b3b38668e2356df3", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Invert Colors", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -673.0, + "y": 299.0, + "width": 208.0, + "height": 391.0 + } + }, + "m_Slots": [ + { + "m_Id": "a02cc3283f1e47d1b293b95caa3cca1e" + }, + { + "m_Id": "12ebd31ba71a4377a2e6e2603bf6423f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_RedChannel": true, + "m_GreenChannel": true, + "m_BlueChannel": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "eef9625d161d447a88f2209c7ef721f7", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "e2c12797a1ed47b9b082544806187dc4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.HDSampleBufferNode", + "m_ObjectId": "f73319e1a9e44e438ac204585fd3fd19", + "m_Group": { + "m_Id": "" + }, + "m_Name": "HD Sample Buffer", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -934.0, + "y": 32.0, + "width": 208.0, + "height": 337.0 + } + }, + "m_Slots": [ + { + "m_Id": "b262c2e6f7ff4e3aa4caa3ff679dcbbb" + }, + { + "m_Id": "fc75ad78bad84a54a208e748b668e101" + }, + { + "m_Id": "c24aa6ff2bf0427b9eeebb7ef189d484" + } + ], + "synonyms": [ + "normal", + "motion vector", + "roughness", + "postprocessinput", + "blit" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_BufferType": 3 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "fc75ad78bad84a54a208e748b668e101", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph.meta new file mode 100644 index 00000000000..71b726e0baf --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b93fd7318812cc446a48a5a0d1875be0 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture new file mode 100644 index 00000000000..27ebc2c7440 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 8210_CustomPass 1 + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 94 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture.meta new file mode 100644 index 00000000000..85ce9c6f6a9 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3407c6b0b9a7c44499e4c81b9c33af7f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture new file mode 100644 index 00000000000..04736cb0acb --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 8210_CustomPass 2 + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 94 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture.meta new file mode 100644 index 00000000000..0f07579ee66 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 191dad7e57423184c9e8fad7ba8f538c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture new file mode 100644 index 00000000000..49c01f7c4dc --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 8210_CustomPass 3 + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 94 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture.meta new file mode 100644 index 00000000000..7f7e16dcba9 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c79d38983ea97334bb8aa8b585dab4be +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture new file mode 100644 index 00000000000..065575fac22 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 8210_CustomPass + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 94 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture.meta new file mode 100644 index 00000000000..cbfb63d9ffb --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 81cc8443e3680df44941ccad58929bd1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset new file mode 100644 index 00000000000..8b893a37bb6 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset @@ -0,0 +1,32 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: Box Volume Profile 1 + m_EditorClassIdentifier: + components: + - {fileID: 5240125479004600927} +--- !u!114 &5240125479004600927 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2f9dd64b6dbf76048b216111e4f09d56, type: 3} + m_Name: CustomPP2_8210 + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0.42 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset.meta new file mode 100644 index 00000000000..f6dbe536d3d --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0c3cded045726c7448fe6c99b1bf862e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset new file mode 100644 index 00000000000..f1a2a993dbf --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset @@ -0,0 +1,32 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-8413721414879348707 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 23386e31f132b9a4193c8dcb283de34c, type: 3} + m_Name: CustomPP1_8210 + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0.373 +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: Box Volume Profile + m_EditorClassIdentifier: + components: + - {fileID: -8413721414879348707} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset.meta new file mode 100644 index 00000000000..e96ccf748a1 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf36097b78501e54d9bc23dc066be831 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs new file mode 100644 index 00000000000..6f5940eb31b --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs @@ -0,0 +1,43 @@ +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; +using System; + +[Serializable, VolumeComponentMenu("Post-processing/Custom/8210_CustomPP1")] +public sealed class CustomPP1_8210 : CustomPostProcessVolumeComponent, IPostProcessComponent +{ + [Tooltip("Controls the intensity of the effect.")] + public ClampedFloatParameter intensity = new ClampedFloatParameter(0f, 0f, 1f); + + Material m_Material; + + public bool IsActive() => m_Material != null && intensity.value > 0f; + + // Do not forget to add this post process in the Custom Post Process Orders list (Project Settings > Graphics > HDRP Settings). + public override CustomPostProcessInjectionPoint injectionPoint => CustomPostProcessInjectionPoint.BeforePostProcess; + + const string kShaderName = "Hidden/Shader/8210_CustomPP1"; + + public override void Setup() + { + if (Shader.Find(kShaderName) != null) + m_Material = new Material(Shader.Find(kShaderName)); + else + Debug.LogError($"Unable to find shader '{kShaderName}'. Post Process Volume 8210_CustomPP1 is unable to load."); + } + + public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination) + { + if (m_Material == null) + return; + + m_Material.SetFloat("_Intensity", intensity.value); + m_Material.SetTexture("_MainTex", source); + HDUtils.DrawFullScreen(cmd, m_Material, destination, shaderPassId: 0); + } + + public override void Cleanup() + { + CoreUtils.Destroy(m_Material); + } +} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs.meta new file mode 100644 index 00000000000..fd9a919b2b2 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 23386e31f132b9a4193c8dcb283de34c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs new file mode 100644 index 00000000000..83a8fced32f --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs @@ -0,0 +1,43 @@ +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; +using System; + +[Serializable, VolumeComponentMenu("Post-processing/Custom/8210_CustomPP2")] +public sealed class CustomPP2_8210 : CustomPostProcessVolumeComponent, IPostProcessComponent +{ + [Tooltip("Controls the intensity of the effect.")] + public ClampedFloatParameter intensity = new ClampedFloatParameter(0f, 0f, 1f); + + Material m_Material; + + public bool IsActive() => m_Material != null && intensity.value > 0f; + + // Do not forget to add this post process in the Custom Post Process Orders list (Project Settings > Graphics > HDRP Settings). + public override CustomPostProcessInjectionPoint injectionPoint => CustomPostProcessInjectionPoint.AfterPostProcess; + + const string kShaderName = "Hidden/Shader/8210_CustomPP2"; + + public override void Setup() + { + if (Shader.Find(kShaderName) != null) + m_Material = new Material(Shader.Find(kShaderName)); + else + Debug.LogError($"Unable to find shader '{kShaderName}'. Post Process Volume 8210_CustomPP2 is unable to load."); + } + + public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination) + { + if (m_Material == null) + return; + + m_Material.SetFloat("_Intensity", intensity.value); + m_Material.SetTexture("_MainTex", source); + HDUtils.DrawFullScreen(cmd, m_Material, destination, shaderPassId: 0); + } + + public override void Cleanup() + { + CoreUtils.Destroy(m_Material); + } +} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs.meta new file mode 100644 index 00000000000..4aa34ad8ba1 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2f9dd64b6dbf76048b216111e4f09d56 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph new file mode 100644 index 00000000000..a7b45b63eec --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph @@ -0,0 +1,350 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "13880fa8dffe48cba4a5c3313c21a8dc", + "m_Properties": [ + { + "m_Id": "217e4a5440e645fe82c1020f27cb95c2" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "ab5f43c3048a40b6837184b272f51d9f" + } + ], + "m_Nodes": [ + { + "m_Id": "9f169391d1f640c6a128f456cbb3569a" + }, + { + "m_Id": "5aa3a723b0434c2ba571daf3917a1a71" + }, + { + "m_Id": "45ddc44fc2a64bfa973bcfd7d91eecc1" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "45ddc44fc2a64bfa973bcfd7d91eecc1" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f169391d1f640c6a128f456cbb3569a" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 6.0, + "y": -25.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 6.0, + "y": 199.0 + }, + "m_Blocks": [ + { + "m_Id": "9f169391d1f640c6a128f456cbb3569a" + }, + { + "m_Id": "5aa3a723b0434c2ba571daf3917a1a71" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "01bc0014188c4e85a8af99eebc813df9" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", + "m_ObjectId": "01bc0014188c4e85a8af99eebc813df9", + "m_ActiveSubTarget": { + "m_Id": "05fb73653a674a58b09fbbd6365d41bd" + }, + "m_Datas": [ + { + "m_Id": "037820170d9c456b98cc7756fbef0302" + } + ], + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "037820170d9c456b98cc7756fbef0302", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 1, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 10, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 8, + "m_DstAlphaBlendMode": 9, + "m_AlphaBlendOperation": 4, + "m_EnableStencil": true, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 3, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDFullscreenSubTarget", + "m_ObjectId": "05fb73653a674a58b09fbbd6365d41bd" +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "217e4a5440e645fe82c1020f27cb95c2", + "m_Guid": { + "m_GuidSerialized": "fe74a077-ef1a-4c06-af5a-f3efe67146db" + }, + "m_Name": "Color", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "Color", + "m_DefaultReferenceName": "_Color", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.05781888961791992, + "b": 1.0, + "a": 0.0 + }, + "isMainColor": false, + "m_ColorMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "45ddc44fc2a64bfa973bcfd7d91eecc1", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -194.0, + "y": 238.0, + "width": 105.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "63bc1cca8e8548e5937102c333c554fb" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "217e4a5440e645fe82c1020f27cb95c2" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "5aa3a723b0434c2ba571daf3917a1a71", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "659056cc074b499faacae5d3d5cc1d4a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "63bc1cca8e8548e5937102c333c554fb", + "m_Id": 0, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "659056cc074b499faacae5d3d5cc1d4a", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 0.5, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "7f77e09be2d14ff08488f6a18c5cf3ae", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "9f169391d1f640c6a128f456cbb3569a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "7f77e09be2d14ff08488f6a18c5cf3ae" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "ab5f43c3048a40b6837184b272f51d9f", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "217e4a5440e645fe82c1020f27cb95c2" + } + ] +} + diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph.meta new file mode 100644 index 00000000000..70b17b28a50 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b43d2018578f95441bc84313425fc48e +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph new file mode 100644 index 00000000000..cc0f8416603 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph @@ -0,0 +1,397 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "13880fa8dffe48cba4a5c3313c21a8dc", + "m_Properties": [ + { + "m_Id": "217e4a5440e645fe82c1020f27cb95c2" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "ab5f43c3048a40b6837184b272f51d9f" + } + ], + "m_Nodes": [ + { + "m_Id": "9f169391d1f640c6a128f456cbb3569a" + }, + { + "m_Id": "5aa3a723b0434c2ba571daf3917a1a71" + }, + { + "m_Id": "7a72cdd297604f4c899a1c7888a7fa36" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7a72cdd297604f4c899a1c7888a7fa36" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f169391d1f640c6a128f456cbb3569a" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 6.0, + "y": -25.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 6.0, + "y": 199.0 + }, + "m_Blocks": [ + { + "m_Id": "9f169391d1f640c6a128f456cbb3569a" + }, + { + "m_Id": "5aa3a723b0434c2ba571daf3917a1a71" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "01bc0014188c4e85a8af99eebc813df9" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", + "m_ObjectId": "01bc0014188c4e85a8af99eebc813df9", + "m_ActiveSubTarget": { + "m_Id": "05fb73653a674a58b09fbbd6365d41bd" + }, + "m_Datas": [ + { + "m_Id": "037820170d9c456b98cc7756fbef0302" + } + ], + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "037820170d9c456b98cc7756fbef0302", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 1, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 10, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 8, + "m_DstAlphaBlendMode": 9, + "m_AlphaBlendOperation": 4, + "m_EnableStencil": true, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 3, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDFullscreenSubTarget", + "m_ObjectId": "05fb73653a674a58b09fbbd6365d41bd" +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "217e4a5440e645fe82c1020f27cb95c2", + "m_Guid": { + "m_GuidSerialized": "fe74a077-ef1a-4c06-af5a-f3efe67146db" + }, + "m_Name": "Color", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "Color", + "m_DefaultReferenceName": "_Color", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.05781888961791992, + "b": 1.0, + "a": 0.0 + }, + "isMainColor": false, + "m_ColorMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "5aa3a723b0434c2ba571daf3917a1a71", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "659056cc074b499faacae5d3d5cc1d4a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "659056cc074b499faacae5d3d5cc1d4a", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 0.5, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.HDSampleBufferNode", + "m_ObjectId": "7a72cdd297604f4c899a1c7888a7fa36", + "m_Group": { + "m_Id": "" + }, + "m_Name": "HD Sample Buffer", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -300.0, + "y": 199.0, + "width": 208.0, + "height": 337.0 + } + }, + "m_Slots": [ + { + "m_Id": "c5d53005f8b3462285b112c1d61b8257" + }, + { + "m_Id": "e35745a2b5f9435887ae45730aae129d" + }, + { + "m_Id": "ed24fd51c1a94fb78ca5f08074f50962" + } + ], + "synonyms": [ + "normal", + "motion vector", + "roughness", + "postprocessinput", + "blit" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_BufferType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "7f77e09be2d14ff08488f6a18c5cf3ae", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "9f169391d1f640c6a128f456cbb3569a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "7f77e09be2d14ff08488f6a18c5cf3ae" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "ab5f43c3048a40b6837184b272f51d9f", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "217e4a5440e645fe82c1020f27cb95c2" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ScreenPositionMaterialSlot", + "m_ObjectId": "c5d53005f8b3462285b112c1d61b8257", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_ScreenSpaceType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "e35745a2b5f9435887ae45730aae129d", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "ed24fd51c1a94fb78ca5f08074f50962", + "m_Id": 2, + "m_DisplayName": "Output", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Output", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph.meta new file mode 100644 index 00000000000..d636a19f95d --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3cb6943ee49a9e04a968082a1670458f +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat new file mode 100644 index 00000000000..db32cb95ed2 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Shader Graphs_FullscreenBlue + m_Shader: {fileID: -6465566751694194690, guid: b43d2018578f95441bc84313425fc48e, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: [] + m_Colors: + - _Color: {r: 0, g: 0.057818867, b: 1, a: 0} + m_BuildTextureStacks: [] diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat.meta new file mode 100644 index 00000000000..af49afa4aa0 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cc414eed9437dd448a39710650d4fdf2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat new file mode 100644 index 00000000000..1bfd06b0c38 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Shader Graphs_FullscreenNodes + m_Shader: {fileID: -6465566751694194690, guid: 3cb6943ee49a9e04a968082a1670458f, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: [] + m_Colors: + - _Color: {r: 0, g: 0.057818867, b: 1, a: 0} + m_BuildTextureStacks: [] diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat.meta new file mode 100644 index 00000000000..652ab4c3730 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 157adb0fd668aa64e972a92e0d0df1b6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset new file mode 100644 index 00000000000..eba76a2df42 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset @@ -0,0 +1,255 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: Sky and Fog Global Volume Profile + m_EditorClassIdentifier: + components: + - {fileID: 4586809243592799487} + - {fileID: 4056967756894766036} + - {fileID: 1717160586251760895} +--- !u!114 &1717160586251760895 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2d08ce26990eb1a4a9177b860541e702, type: 3} + m_Name: Exposure + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + meteringMode: + m_OverrideState: 0 + m_Value: 2 + luminanceSource: + m_OverrideState: 0 + m_Value: 1 + fixedExposure: + m_OverrideState: 1 + m_Value: 0 + compensation: + m_OverrideState: 0 + m_Value: 0 + limitMin: + m_OverrideState: 0 + m_Value: -1 + limitMax: + m_OverrideState: 0 + m_Value: 14 + curveMap: + m_OverrideState: 0 + m_Value: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: -10 + value: -10 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 20 + value: 20 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + limitMinCurveMap: + m_OverrideState: 0 + m_Value: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: -10 + value: -12 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 20 + value: 18 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + limitMaxCurveMap: + m_OverrideState: 0 + m_Value: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: -10 + value: -8 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 20 + value: 22 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + adaptationMode: + m_OverrideState: 0 + m_Value: 1 + adaptationSpeedDarkToLight: + m_OverrideState: 0 + m_Value: 3 + adaptationSpeedLightToDark: + m_OverrideState: 0 + m_Value: 1 + weightTextureMask: + m_OverrideState: 0 + m_Value: {fileID: 0} + histogramPercentages: + m_OverrideState: 0 + m_Value: {x: 40, y: 90} + histogramUseCurveRemapping: + m_OverrideState: 0 + m_Value: 0 + targetMidGray: + m_OverrideState: 0 + m_Value: 0 + centerAroundExposureTarget: + m_OverrideState: 0 + m_Value: 0 + proceduralCenter: + m_OverrideState: 0 + m_Value: {x: 0.5, y: 0.5} + proceduralRadii: + m_OverrideState: 0 + m_Value: {x: 0.3, y: 0.3} + maskMinIntensity: + m_OverrideState: 0 + m_Value: -30 + maskMaxIntensity: + m_OverrideState: 0 + m_Value: 30 + proceduralSoftness: + m_OverrideState: 0 + m_Value: 0.5 +--- !u!114 &4056967756894766036 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0d7593b3a9277ac4696b20006c21dde2, type: 3} + m_Name: VisualEnvironment + m_EditorClassIdentifier: + active: 1 + skyType: + m_OverrideState: 1 + m_Value: 3 + cloudType: + m_OverrideState: 1 + m_Value: 0 + skyAmbientMode: + m_OverrideState: 1 + m_Value: 1 + windOrientation: + m_OverrideState: 1 + m_Value: 0 + windSpeed: + m_OverrideState: 1 + m_Value: 100 + fogType: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &4586809243592799487 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a81bcacc415a1f743bfdf703afc52027, type: 3} + m_Name: GradientSky + m_EditorClassIdentifier: + active: 1 + rotation: + m_OverrideState: 1 + m_Value: 0 + skyIntensityMode: + m_OverrideState: 1 + m_Value: 0 + exposure: + m_OverrideState: 1 + m_Value: 0 + multiplier: + m_OverrideState: 1 + m_Value: 1 + upperHemisphereLuxValue: + m_OverrideState: 1 + m_Value: 1 + upperHemisphereLuxColor: + m_OverrideState: 1 + m_Value: {x: 0, y: 0, z: 0} + desiredLuxValue: + m_OverrideState: 1 + m_Value: 20000 + updateMode: + m_OverrideState: 1 + m_Value: 0 + updatePeriod: + m_OverrideState: 1 + m_Value: 0 + includeSunInBaking: + m_OverrideState: 1 + m_Value: 0 + top: + m_OverrideState: 1 + m_Value: {r: 0, g: 0, b: 0, a: 1} + middle: + m_OverrideState: 1 + m_Value: {r: 0, g: 0, b: 0, a: 1} + bottom: + m_OverrideState: 1 + m_Value: {r: 0, g: 0, b: 0, a: 1} + gradientDiffusion: + m_OverrideState: 1 + m_Value: 1 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset.meta new file mode 100644 index 00000000000..c97221d4eec --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf5eb914dbdcd2f4288904fda1f02f12 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset b/TestProjects/HDRP_Tests/Assets/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset index f2c26454a37..3db20513ccf 100644 --- a/TestProjects/HDRP_Tests/Assets/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset +++ b/TestProjects/HDRP_Tests/Assets/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset @@ -67,12 +67,14 @@ MonoBehaviour: - GreenPP, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null beforePostProcessCustomPostProcesses: - RedPP, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + - CustomPP1_8210, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null afterPostProcessBlursCustomPostProcesses: - AfterPPBlurs, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null afterPostProcessCustomPostProcesses: - BluePP, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - CustomPostProcessMotionVector, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + - CustomPP2_8210, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null beforeTAACustomPostProcesses: - DepthTAA, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null lightLayerName0: Light Layer default @@ -114,7 +116,10 @@ MonoBehaviour: useDLSSCustomProjectId: 0 supportProbeVolumes: 0 supportRuntimeDebugDisplay: 0 - apvScenesBounds: + apvScenesData: serializedBounds: [] serializedHasVolumes: [] + serializedProfiles: [] + serializedBakeSettings: [] + serializedBakingSets: [] m_Version: 3 diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png new file mode 100644 index 00000000000..4b5ae66d2b8 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0953af27454fe3424cc02bee4274b708f2dc29307462f52d3e7a55c09962d99a +size 26842 diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png.meta b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png.meta new file mode 100644 index 00000000000..a667f4c026e --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 12ee177f4384e3249a7f7c73a76faf74 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/Temp.meta b/TestProjects/HDRP_Tests/Assets/Temp.meta new file mode 100644 index 00000000000..402d88af911 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/Temp.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b8f8b243c34f0c45bdb910737c5297b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset b/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset index 983a876bbd3..ab7de8391ce 100644 --- a/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset +++ b/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset @@ -701,6 +701,9 @@ EditorBuildSettings: - enabled: 1 path: Assets/GraphicTests/Scenes/8x_ShaderGraph/8209_CustomPassNodes.unity guid: beda2df19b812c944a26a77591f54588 + - enabled: 1 + path: Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity + guid: 74b447ba1a6ee064fb7ebe7a6e56c62d - enabled: 1 path: Assets/GraphicTests/Scenes/9x_Other/9001_LODTransition.unity guid: b15315a1f9287fa4dac965a039b3b778 @@ -812,4 +815,4 @@ EditorBuildSettings: - enabled: 1 path: Assets/GraphicTests/Scenes/9x_Other/9910_GlobalMipBias.unity guid: 3f9d18568d46df044847954b624b6152 - + m_configObjects: {} From aab5e0c91cf4ebc7d1bdefa228e742234328ea60 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 20 Oct 2021 16:00:20 +0200 Subject: [PATCH 042/108] Added custom render texture support --- .../Targets/CustomRenderTexture.meta | 8 + .../CreateCustomRenderTextureShaderGraph.cs | 24 ++ ...eateCustomRenderTextureShaderGraph.cs.meta | 11 + .../CustomRenderTextureTarget.cs | 247 ++++++++++++++ .../CustomRenderTextureTarget.cs.meta | 11 + .../CustomRenderTexture/CustomTexture.hlsl | 303 ++++++++++++++++++ .../CustomTexture.hlsl.meta | 10 + .../CustomTextureGraph.hlsl | 40 +++ .../CustomTextureGraph.hlsl.meta | 10 + .../CustomRenderTexture/CustomTextureNodes.cs | 245 ++++++++++++++ .../CustomTextureNodes.cs.meta | 11 + .../CustomTextureSubShader.template | 86 +++++ .../CustomTextureSubShader.template.meta | 7 + .../CustomTextureSubTarget.cs | 56 ++++ .../CustomTextureSubTarget.cs.meta | 11 + .../CustomRenderTexture/ShaderGraphRef.asmref | 3 + .../ShaderGraphRef.asmref.meta | 7 + 17 files changed, 1090 insertions(+) create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs.meta create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref create mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture.meta new file mode 100644 index 00000000000..6fcda6fe46d --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d5720fee1395a0469d470106d06823e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs new file mode 100644 index 00000000000..8f9a429f0f8 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs @@ -0,0 +1,24 @@ +using System; +using UnityEditor.ShaderGraph; +using UnityEngine.Rendering; + +namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph +{ + public static class CustomTextureShaderGraphMenu + { + [MenuItem("Assets/Create/Shader Graph/Custom Render Texture", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.assetsCreateShaderMenuPriority)] + public static void CreateCustomTextureShaderGraph() + { + var target = (CustomRenderTextureTarget)Activator.CreateInstance(typeof(CustomRenderTextureTarget)); + target.TrySetActiveSubTarget(typeof(CustomTextureSubTarget)); + + var blockDescriptors = new[] + { + BlockFields.SurfaceDescription.BaseColor, + BlockFields.SurfaceDescription.Alpha, + }; + + GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); + } + } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs.meta new file mode 100644 index 00000000000..3f5277f5e28 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 592fd794cdd703e4ca365fbf30d4ca8b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs new file mode 100644 index 00000000000..4b0737e2d8c --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs @@ -0,0 +1,247 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.UIElements; +using UnityEditor; +using UnityEditor.ShaderGraph; +using UnityEditor.UIElements; +using UnityEditor.ShaderGraph.Serialization; +using SubTargetListPool = UnityEngine.Rendering.ListPool; +using System.Reflection; + +namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph +{ + [GenerateBlocks] + internal struct FullScreenBlocks + { + // TODO: use base color and alpha blocks + public static BlockFieldDescriptor colorBlock = new BlockFieldDescriptor(String.Empty, "Color", "Color", + new ColorRGBAControl(UnityEngine.Color.white), ShaderStage.Fragment); + } + + sealed class CustomRenderTextureTarget : Target + { + // Constants + const string kAssetGuid = "a0bae34258e39cd4899b63278c24c086"; // FullscreenPassTarget.cs + + // SubTarget + List m_SubTargets; + List m_SubTargetNames; + int activeSubTargetIndex => m_SubTargets.IndexOf(m_ActiveSubTarget); + + // View + PopupField m_SubTargetField; + TextField m_CustomGUIField; + + [SerializeField] + JsonData m_ActiveSubTarget; + + [SerializeField] + string m_CustomEditorGUI; + + public CustomRenderTextureTarget() + { + displayName = "Custom Render Texture"; + isHidden = false; + m_SubTargets = GetSubTargets(this); + m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList(); + ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + } + + public static void ProcessSubTargetList(ref JsonData activeSubTarget, ref List subTargets) + { + if (subTargets == null || subTargets.Count == 0) + return; + + // assign the initial sub-target, if none is assigned yet + if (activeSubTarget.value == null) + activeSubTarget = subTargets[0]; + + // Update SubTarget list with active SubTarget + var activeSubTargetType = activeSubTarget.value.GetType(); + var activeSubTargetCurrent = subTargets.FirstOrDefault(x => x.GetType() == activeSubTargetType); + var index = subTargets.IndexOf(activeSubTargetCurrent); + subTargets[index] = activeSubTarget; + } + + public static List GetSubTargets(T target) where T : Target + { + // Get Variants + var subTargets = SubTargetListPool.Get(); + var typeCollection = TypeCache.GetTypesDerivedFrom(); + foreach (var type in typeCollection) + { + if (type.IsAbstract || !type.IsClass) + continue; + + var subTarget = (SubTarget)Activator.CreateInstance(type); + if (!subTarget.isHidden && subTarget.targetType.Equals(typeof(T))) + { + subTarget.target = target; + subTargets.Add(subTarget); + } + } + + return subTargets; + } + + public SubTarget activeSubTarget + { + get => m_ActiveSubTarget; + set => m_ActiveSubTarget = value; + } + + public string customEditorGUI + { + get => m_CustomEditorGUI; + set => m_CustomEditorGUI = value; + } + + public override bool IsActive() => activeSubTarget.IsActive(); + + public override void Setup(ref TargetSetupContext context) + { + // Setup the Target + context.AddAssetDependency(new GUID(kAssetGuid), AssetCollection.Flags.SourceDependency); + + // Setup the active SubTarget + ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); + m_ActiveSubTarget.value.target = this; + m_ActiveSubTarget.value.Setup(ref context); + + // Override EditorGUI + if (!string.IsNullOrEmpty(m_CustomEditorGUI)) + { + context.SetDefaultShaderGUI(m_CustomEditorGUI); + } + } + + public override void GetFields(ref TargetFieldContext context) + { + var descs = context.blocks.Select(x => x.descriptor); + // Core fields + context.AddField(Fields.GraphVertex, descs.Contains(BlockFields.VertexDescription.Position) || + descs.Contains(BlockFields.VertexDescription.Normal) || + descs.Contains(BlockFields.VertexDescription.Tangent)); + context.AddField(Fields.GraphPixel); + + // SubTarget fields + m_ActiveSubTarget.value.GetFields(ref context); + } + + public override void GetActiveBlocks(ref TargetActiveBlockContext context) + { + // SubTarget blocks + m_ActiveSubTarget.value.GetActiveBlocks(ref context); + } + + public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) + { + // Core properties + m_SubTargetField = new PopupField(m_SubTargetNames, activeSubTargetIndex); + context.AddProperty("Material", m_SubTargetField, (evt) => + { + if (Equals(activeSubTargetIndex, m_SubTargetField.index)) + return; + + registerUndo("Change Material"); + m_ActiveSubTarget = m_SubTargets[m_SubTargetField.index]; + onChange(); + }); + + // SubTarget properties + m_ActiveSubTarget.value.GetPropertiesGUI(ref context, onChange, registerUndo); + + // Custom Editor GUI + // Requires FocusOutEvent + m_CustomGUIField = new TextField("") { value = customEditorGUI }; + m_CustomGUIField.RegisterCallback(s => + { + if (Equals(customEditorGUI, m_CustomGUIField.value)) + return; + + registerUndo("Change Custom Editor GUI"); + customEditorGUI = m_CustomGUIField.value; + onChange(); + }); + context.AddProperty("Custom Editor GUI", m_CustomGUIField, (evt) => { }); + } + + public bool TrySetActiveSubTarget(Type subTargetType) + { + if (!subTargetType.IsSubclassOf(typeof(SubTarget))) + return false; + + foreach (var subTarget in m_SubTargets) + { + if (subTarget.GetType().Equals(subTargetType)) + { + m_ActiveSubTarget = subTarget; + return true; + } + } + + return false; + } + + public override bool WorksWithSRP(RenderPipelineAsset scriptableRenderPipeline) => true; + + public override bool IsNodeAllowedByTarget(System.Type nodeType) + { + SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); + bool allowed = true; + + if (srpFilter != null) + allowed = false; + + return allowed; + } + } + + static class FullscreePasses + { + public static PassDescriptor CustomRenderTexture = new PassDescriptor + { + // Definition + referenceName = "SHADERPASS_CUSTOM_RENDER_TEXTURE", + useInPreview = true, + + // Template + passTemplatePath = AssetDatabase.GUIDToAssetPath("afa536a0de48246de92194c9e987b0b8"), // CustomTextureSubShader.template + + // Port Mask + validVertexBlocks = new BlockFieldDescriptor[] + { + BlockFields.VertexDescription.Position, + BlockFields.VertexDescription.Normal, + BlockFields.VertexDescription.Tangent, + }, + validPixelBlocks = new BlockFieldDescriptor[] + { + BlockFields.SurfaceDescription.BaseColor, + BlockFields.SurfaceDescription.Alpha, + }, + + // Fields + structs = new StructCollection + { + { Structs.Attributes }, + { Structs.SurfaceDescriptionInputs }, + { Structs.VertexDescriptionInputs }, + }, + requiredFields = new FieldCollection() + { + StructFields.Attributes.color, + StructFields.Attributes.uv0, + StructFields.Varyings.color, + StructFields.Varyings.texCoord0, + }, + fieldDependencies = new DependencyCollection() + { + { FieldDependencies.Default }, + }, + }; + } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs.meta new file mode 100644 index 00000000000..b2178d23fff --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a0bae34258e39cd4899b63278c24c086 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl new file mode 100644 index 00000000000..f091eb959a9 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl @@ -0,0 +1,303 @@ +// Ported from CGinc version + +#ifndef UNITY_CUSTOM_TEXTURE_INCLUDED +#define UNITY_CUSTOM_TEXTURE_INCLUDED + +#ifndef UNITY_PI +#define UNITY_PI 3.14159265358979323846 +#endif + +// Keep in sync with CustomRenderTexture.h +#define kCustomTextureBatchSize 16 + +#define CRT_DIMENSION_2D 0.0 +#define CRT_DIMENSION_3D 1.0 +#define CRT_DIMENSION_CUBE 2.0 + +struct appdata_customrendertexture +{ + uint vertexID : SV_VertexID; +}; + +// User facing vertex to fragment shader structure +struct v2f_customrendertexture +{ + float4 vertex : SV_POSITION; + float3 localTexcoord : TEXCOORD0; // Texcoord local to the update zone (== globalTexcoord if no partial update zone is specified) + float3 globalTexcoord : TEXCOORD1; // Texcoord relative to the complete custom texture + uint primitiveID : TEXCOORD2; // Index of the update zone (correspond to the index in the updateZones of the Custom Texture) + float3 direction : TEXCOORD3; // For cube textures, direction of the pixel being rendered in the cubemap +}; + +float2 CustomRenderTextureRotate2D(float2 pos, float angle) +{ + float sn = sin(angle); + float cs = cos(angle); + + return float2( pos.x * cs - pos.y * sn, pos.x * sn + pos.y * cs); +} + +// Built-in unity functions and matrices: + +float4 _Time, _SinTime, _CosTime, unity_DeltaTime; + +// ================================ +// PER FRAME CONSTANTS +// ================================ +#if defined(USING_STEREO_MATRICES) + #define glstate_matrix_projection unity_StereoMatrixP[unity_StereoEyeIndex] + #define unity_MatrixV unity_StereoMatrixV[unity_StereoEyeIndex] + #define unity_MatrixInvV unity_StereoMatrixInvV[unity_StereoEyeIndex] + #define unity_MatrixVP unity_StereoMatrixVP[unity_StereoEyeIndex] + + #define unity_CameraProjection unity_StereoCameraProjection[unity_StereoEyeIndex] + #define unity_CameraInvProjection unity_StereoCameraInvProjection[unity_StereoEyeIndex] + #define unity_WorldToCamera unity_StereoWorldToCamera[unity_StereoEyeIndex] + #define unity_CameraToWorld unity_StereoCameraToWorld[unity_StereoEyeIndex] +#else + #if !defined(USING_STEREO_MATRICES) + float4x4 glstate_matrix_projection; + float4x4 unity_MatrixV; + float4x4 unity_MatrixInvV; + float4x4 unity_MatrixVP; + float4x4 unity_ObjectToWorld; + float4 unity_StereoScaleOffset; + #endif +#endif + +// Internal +float4 CustomRenderTextureCenters[kCustomTextureBatchSize]; +float4 CustomRenderTextureSizesAndRotations[kCustomTextureBatchSize]; +float CustomRenderTexturePrimitiveIDs[kCustomTextureBatchSize]; + +float4 CustomRenderTextureParameters; +#define CustomRenderTextureUpdateSpace CustomRenderTextureParameters.x // Normalized(0)/PixelSpace(1) +#define CustomRenderTexture3DTexcoordW CustomRenderTextureParameters.y +#define CustomRenderTextureIs3D CustomRenderTextureParameters.z == CRT_DIMENSION_3D +#define CustomRenderTextureDimension CustomRenderTextureParameters.z + +// User facing uniform variables +float4 _CustomRenderTextureInfo; // x = width, y = height, z = depth, w = face/3DSlice + +// Helpers +#define _CustomRenderTextureWidth _CustomRenderTextureInfo.x +#define _CustomRenderTextureHeight _CustomRenderTextureInfo.y +#define _CustomRenderTextureDepth _CustomRenderTextureInfo.z + +// Those two are mutually exclusive so we can use the same slot +#define _CustomRenderTextureCubeFace _CustomRenderTextureInfo.w +#define _CustomRenderTexture3DSlice _CustomRenderTextureInfo.w + +float _CustomRenderTextureMipLevel; + +Texture2D _SelfTexture2D; +float4 _SelfTexture2D_TexelSize; +sampler sampler_SelfTexture2D; + +TextureCube _SelfTextureCube; +float4 _SelfTextureCube_TexelSize; +sampler sampler_SelfTextureCube; + +Texture3D _SelfTexture3D; +float4 _SelfTexture3D_TexelSize; +sampler sampler_SelfTexture3D; + +float3 ComputeCubemapDirectionFromUV(float2 uv, int cubeFace) +{ + float2 xy = uv * 2.0 - 1.0; + float3 direction; + if(cubeFace == 0.0) + { + direction = normalize(float3(1.0, -xy.y, -xy.x)); + } + else if(cubeFace == 1.0) + { + direction = normalize(float3(-1.0, -xy.y, xy.x)); + } + else if(cubeFace == 2.0) + { + direction = normalize(float3(xy.x, 1.0, xy.y)); + } + else if(cubeFace == 3.0) + { + direction = normalize(float3(xy.x, -1.0, -xy.y)); + } + else if(cubeFace == 4.0) + { + direction = normalize(float3(xy.x, -xy.y, 1.0)); + } + else if(cubeFace == 5.0) + { + direction = normalize(float3(-xy.x, -xy.y, -1.0)); + } + else + { + direction = float3(0, 0, 0); + } + + return direction; +} + +float3 CustomRenderTextureComputeCubeDirection(float2 globalTexcoord) +{ + return ComputeCubemapDirectionFromUV(globalTexcoord, _CustomRenderTextureCubeFace); +} + +// standard custom texture vertex shader that should always be used +v2f_customrendertexture CustomRenderTextureVertexShader(appdata_customrendertexture IN) +{ + v2f_customrendertexture OUT; + +#if UNITY_UV_STARTS_AT_TOP + const float2 vertexPositions[6] = + { + { -1.0f, 1.0f }, + { -1.0f, -1.0f }, + { 1.0f, -1.0f }, + { 1.0f, 1.0f }, + { -1.0f, 1.0f }, + { 1.0f, -1.0f } + }; + + const float2 texCoords[6] = + { + { 0.0f, 0.0f }, + { 0.0f, 1.0f }, + { 1.0f, 1.0f }, + { 1.0f, 0.0f }, + { 0.0f, 0.0f }, + { 1.0f, 1.0f } + }; +#else + const float2 vertexPositions[6] = + { + { 1.0f, 1.0f }, + { -1.0f, -1.0f }, + { -1.0f, 1.0f }, + { -1.0f, -1.0f }, + { 1.0f, 1.0f }, + { 1.0f, -1.0f } + }; + + const float2 texCoords[6] = + { + { 1.0f, 1.0f }, + { 0.0f, 0.0f }, + { 0.0f, 1.0f }, + { 0.0f, 0.0f }, + { 1.0f, 1.0f }, + { 1.0f, 0.0f } + }; +#endif + + uint primitiveID = IN.vertexID / 6; + uint vertexID = IN.vertexID % 6; + float3 updateZoneCenter = CustomRenderTextureCenters[primitiveID].xyz; + float3 updateZoneSize = CustomRenderTextureSizesAndRotations[primitiveID].xyz; + float rotation = CustomRenderTextureSizesAndRotations[primitiveID].w * UNITY_PI / 180.0f; + +#if !UNITY_UV_STARTS_AT_TOP + rotation = -rotation; +#endif + + // Normalize rect if needed + if (CustomRenderTextureUpdateSpace > 0.0) // Pixel space + { + // Normalize xy because we need it in clip space. + updateZoneCenter.xy /= _CustomRenderTextureInfo.xy; + updateZoneSize.xy /= _CustomRenderTextureInfo.xy; + } + else // normalized space + { + // Un-normalize depth because we need actual slice index for culling + updateZoneCenter.z *= _CustomRenderTextureInfo.z; + updateZoneSize.z *= _CustomRenderTextureInfo.z; + } + + // Compute rotation + + // Compute quad vertex position + float2 clipSpaceCenter = updateZoneCenter.xy * 2.0 - 1.0; + float2 pos = vertexPositions[vertexID] * updateZoneSize.xy; + pos = CustomRenderTextureRotate2D(pos, rotation); + pos.x += clipSpaceCenter.x; +#if UNITY_UV_STARTS_AT_TOP + pos.y += clipSpaceCenter.y; +#else + pos.y -= clipSpaceCenter.y; +#endif + + // For 3D texture, cull quads outside of the update zone + // This is neeeded in additional to the preliminary minSlice/maxSlice done on the CPU because update zones can be disjointed. + // ie: slices [1..5] and [10..15] for two differents zones so we need to cull out slices 0 and [6..9] + if (CustomRenderTextureIs3D) + { + int minSlice = (int)(updateZoneCenter.z - updateZoneSize.z * 0.5); + int maxSlice = minSlice + (int)updateZoneSize.z; + if (_CustomRenderTexture3DSlice < minSlice || _CustomRenderTexture3DSlice >= maxSlice) + { + pos.xy = float2(1000.0, 1000.0); // Vertex outside of ncs + } + } + + OUT.vertex = float4(pos, 0.0, 1.0); + OUT.primitiveID = asuint(CustomRenderTexturePrimitiveIDs[primitiveID]); + OUT.localTexcoord = float3(texCoords[vertexID], CustomRenderTexture3DTexcoordW); + OUT.globalTexcoord = float3(pos.xy * 0.5 + 0.5, CustomRenderTexture3DTexcoordW); +#if UNITY_UV_STARTS_AT_TOP + OUT.globalTexcoord.y = 1.0 - OUT.globalTexcoord.y; +#endif + OUT.direction = CustomRenderTextureComputeCubeDirection(OUT.globalTexcoord.xy); + + return OUT; +} + +struct appdata_init_customrendertexture +{ + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; +}; + +// User facing vertex to fragment structure for initialization materials +struct v2f_init_customrendertexture +{ + float4 vertex : SV_POSITION; + float3 texcoord : TEXCOORD0; + float3 direction : TEXCOORD1; +}; + +// standard custom texture vertex shader that should always be used for initialization shaders +v2f_init_customrendertexture InitCustomRenderTextureVertexShader (appdata_init_customrendertexture v) +{ + v2f_init_customrendertexture o; + o.vertex = v.vertex; + o.texcoord = float3(v.texcoord.xy, CustomRenderTexture3DTexcoordW); + o.direction = CustomRenderTextureComputeCubeDirection(v.texcoord.xy); + return o; +} + +#ifdef CRT_CUBE +#define FIX_CUBEMAP_DIRECTION(crt) crt.direction = normalize(crt.direction) +#else +#define FIX_CUBEMAP_DIRECTION(crt) +#endif + +#ifdef CRT_3D +#define FIX_TEXTURE3D_POSITION_Z(crt) crt.localTexcoord.z += rcp(_CustomRenderTextureDepth * 2.0); +#else +#define FIX_TEXTURE3D_POSITION_Z(crt) +#endif + + +// Declare the prototype +float4 mixture(v2f_customrendertexture i); + +float4 MixtureFragment (v2f_customrendertexture i) : SV_Target +{ + // Fix the cubemap direction: + FIX_CUBEMAP_DIRECTION(i); + FIX_TEXTURE3D_POSITION_Z(i); + return mixture(i); +} + +#endif // UNITY_CUSTOM_TEXTURE_INCLUDED diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl.meta new file mode 100644 index 00000000000..6a2dc397e15 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 8f43a880cf1819049aa196a7696ee562 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl new file mode 100644 index 00000000000..36981dd1bfc --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl @@ -0,0 +1,40 @@ +#ifndef CUSTOM_TEXTURE_GTRAPH +#define CUSTOM_TEXTURE_GTRAPH + +float4 SRGBToLinear( float4 c ) { return c; } +float3 SRGBToLinear( float3 c ) { return c; } + +// This function exists in ShaderGraph +#ifndef UNITY_GRAPHFUNCTIONS_INCLUDED +bool IsGammaSpace() +{ +#ifdef UNITY_COLORSPACE_GAMMA + return true; +#else + return false; +#endif +} +#endif + +// Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1) +// Note neutral texture like "bump" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5 +float3 UnpackNormalmapRGorAG(float4 packednormal) +{ + // This do the trick + packednormal.x *= packednormal.w; + + float3 normal; + normal.xy = packednormal.xy * 2 - 1; + normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy))); + return normal; +} +inline float3 UnpackNormal(float4 packednormal) +{ +#if defined(UNITY_NO_DXT5nm) + return packednormal.xyz * 2 - 1; +#else + return UnpackNormalmapRGorAG(packednormal); +#endif +} + +#endif // CUSTOM_TEXTURE_GTRAPH diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl.meta new file mode 100644 index 00000000000..d4b4100c917 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 96a8b300b2dfb474bb4fd8118749fdec +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs new file mode 100644 index 00000000000..68e4a054145 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -0,0 +1,245 @@ +using UnityEngine; +using UnityEditor.ShaderGraph; +using UnityEditor.Graphing; +using UnityEditor.ShaderGraph.Internal; + +namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph +{ + [Title("Custom Render Texture", "Size")] + class CustomTextureSize : AbstractMaterialNode, IGeneratesFunction + { + private const string kOutputSlotWidthName = "Texture Width"; + private const string kOutputSlotHeightName = "Texture Height"; + private const string kOutputSlotDepthName = "Texture Depth"; + + public const int OutputSlotWidthId = 0; + public const int OutputSlotHeightId = 1; + public const int OutputSlotDepthId = 2; + + public CustomTextureSize() + { + name = "Custom Render Texture Size"; + UpdateNodeAfterDeserialization(); + } + + protected int[] validSlots => new[] { OutputSlotWidthId, OutputSlotHeightId, OutputSlotDepthId }; + + public sealed override void UpdateNodeAfterDeserialization() + { + AddSlot(new Vector1MaterialSlot(OutputSlotWidthId, kOutputSlotWidthName, kOutputSlotWidthName, SlotType.Output, 0)); + AddSlot(new Vector1MaterialSlot(OutputSlotHeightId, kOutputSlotHeightName, kOutputSlotHeightName, SlotType.Output, 0)); + AddSlot(new Vector1MaterialSlot(OutputSlotDepthId, kOutputSlotDepthName, kOutputSlotDepthName, SlotType.Output, 0)); + RemoveSlotsNameNotMatching(validSlots); + } + + public override string GetVariableNameForSlot(int slotId) + { + switch (slotId) + { + case OutputSlotHeightId: + return "_CustomRenderTextureHeight"; + case OutputSlotDepthId: + return "_CustomRenderTextureDepth"; + default: + return "_CustomRenderTextureWidth"; + } + } + + public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) + { + // For preview only we declare CRT defines + if (generationMode == GenerationMode.Preview) + { + registry.builder.AppendLine("#define _CustomRenderTextureHeight 0.0"); + registry.builder.AppendLine("#define _CustomRenderTextureWidth 0.0"); + registry.builder.AppendLine("#define _CustomRenderTextureDepth 0.0"); + } + } + } + + [Title("Custom Render Texture", "Slice / Face")] + class CustomTextureSlice : AbstractMaterialNode, IGeneratesFunction + { + private const string kOutputSlotCubeFaceName = "Texture Cube Face"; + private const string kOutputSlot3DSliceName = "Texture 3D Slice"; + + public const int OutputSlotCubeFaceId = 3; + public const int OutputSlot3DSliceId = 4; + + public CustomTextureSlice() + { + name = "Custom Render Texture Size"; + UpdateNodeAfterDeserialization(); + } + + protected int[] validSlots => new[] { OutputSlotCubeFaceId, OutputSlot3DSliceId }; + + public sealed override void UpdateNodeAfterDeserialization() + { + AddSlot(new Vector1MaterialSlot(OutputSlotCubeFaceId, kOutputSlotCubeFaceName, kOutputSlotCubeFaceName, SlotType.Output, 0)); + AddSlot(new Vector1MaterialSlot(OutputSlot3DSliceId, kOutputSlot3DSliceName, kOutputSlot3DSliceName, SlotType.Output, 0)); + RemoveSlotsNameNotMatching(validSlots); + } + + public override string GetVariableNameForSlot(int slotId) + { + switch (slotId) + { + case OutputSlotCubeFaceId: + return "_CustomRenderTextureCubeFace"; + case OutputSlot3DSliceId: + return "_CustomRenderTexture3DSlice"; + default: + return "_CustomRenderTextureWidth"; + } + } + + public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) + { + // For preview only we declare CRT defines + if (generationMode == GenerationMode.Preview) + { + registry.builder.AppendLine("#define _CustomRenderTextureCubeFace 0.0"); + registry.builder.AppendLine("#define _CustomRenderTexture3DSlice 0.0"); + } + } + } + + [Title("Custom Render Texture", "Self")] + class CustomTextureSelf : AbstractMaterialNode, IGeneratesFunction + { + private const string kOutputSlotSelf2DName = "Self Texture 2D"; + private const string kOutputSlotSelfCubeName = "Self Texture Cube"; + private const string kOutputSlotSelf3DName = "Self Texture 3D"; + + public const int OutputSlotSelf2DId = 5; + public const int OutputSlotSelfCubeId = 6; + public const int OutputSlotSelf3DId = 7; + + public CustomTextureSelf() + { + name = "Custom Render Texture Self"; + UpdateNodeAfterDeserialization(); + } + + protected int[] validSlots => new[] { OutputSlotSelf2DId, OutputSlotSelfCubeId, OutputSlotSelf3DId }; + + public sealed override void UpdateNodeAfterDeserialization() + { + AddSlot(new Texture2DMaterialSlot(OutputSlotSelf2DId, kOutputSlotSelf2DName, kOutputSlotSelf2DName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); + AddSlot(new CubemapMaterialSlot(OutputSlotSelfCubeId, kOutputSlotSelfCubeName, kOutputSlotSelfCubeName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); + AddSlot(new Texture2DMaterialSlot(OutputSlotSelf3DId, kOutputSlotSelf3DName, kOutputSlotSelf3DName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); + RemoveSlotsNameNotMatching(validSlots); + } + + public override string GetVariableNameForSlot(int slotId) + { + switch (slotId) + { + case OutputSlotSelf2DId: + return "UnityBuildTexture2DStructNoScale(_SelfTexture2D)"; + case OutputSlotSelfCubeId: + return "UnityBuildTextureCubeStructNoScale(_SelfTextureCube)"; + default: + return "UnityBuildTexture3DStructNoScale(_SelfTexture3D)"; + } + } + + public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) + { + // For preview only we declare CRT defines + if (generationMode == GenerationMode.Preview) + { + registry.builder.AppendLine("TEXTURE2D(_SelfTexture2D);"); + registry.builder.AppendLine("SAMPLER(sampler_SelfTexture2D);"); + registry.builder.AppendLine("TEXTURE2D(_SelfTextureCube);"); + registry.builder.AppendLine("SAMPLER(sampler_SelfTextureCube);"); + registry.builder.AppendLine("TEXTURE2D(_SelfTexture3D);"); + registry.builder.AppendLine("SAMPLER(sampler_SelfTexture3D);"); + } + } + } + + [Title("Custom Render Texture", "Current Dimension")] + class CustomTextureDimension : AbstractMaterialNode, IGeneratesBodyCode + { + private const string kOutputSlot2D = "Is 2D"; + private const string kOutputSlot3D = "Is 3D"; + private const string kOutputSlotCube = "Is Cube"; + + public const int kOutputSlot2DId = 0; + public const int kOutputSlot3DId = 1; + public const int kOutputSlotCubeId = 2; + + public CustomTextureDimension() + { + name = "Custom Render Texture Dimension"; + UpdateNodeAfterDeserialization(); + } + + protected int[] validSlots => new[] { kOutputSlot2DId, kOutputSlot3DId, kOutputSlotCubeId }; + + public sealed override void UpdateNodeAfterDeserialization() + { + AddSlot(new BooleanMaterialSlot(kOutputSlot2DId, kOutputSlot2D, kOutputSlot2D, SlotType.Output, false)); + AddSlot(new BooleanMaterialSlot(kOutputSlot3DId, kOutputSlot3D, kOutputSlot3D, SlotType.Output, false)); + AddSlot(new BooleanMaterialSlot(kOutputSlotCubeId, kOutputSlotCube, kOutputSlotCube, SlotType.Output, false)); + RemoveSlotsNameNotMatching(validSlots); + } + + public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) + { + if (generationMode.IsPreview()) + { + sb.AppendLine(@"bool {0} = false;", GetVariableNameForSlot(kOutputSlot2DId)); + sb.AppendLine(@"bool {0} = false;", GetVariableNameForSlot(kOutputSlot3DId)); + sb.AppendLine(@"bool {0} = false;", GetVariableNameForSlot(kOutputSlotCubeId)); + } + else + { + sb.AppendLine(@"bool {0} = CustomRenderTextureDimension == CRT_DIMENSION_2D;", GetVariableNameForSlot(kOutputSlot2DId)); + sb.AppendLine(@"bool {0} = CustomRenderTextureDimension == CRT_DIMENSION_3D;", GetVariableNameForSlot(kOutputSlot3DId)); + sb.AppendLine(@"bool {0} = CustomRenderTextureDimension == CRT_DIMENSION_CUBE;", GetVariableNameForSlot(kOutputSlotCubeId)); + } + } + } + + [Title("Custom Render Texture", "UV/Direction")] + class UVOrDirection : AbstractMaterialNode, IGeneratesBodyCode, IMayRequireMeshUV, IMayRequireViewDirection + { + private const string kOutput = "Uv/Direction"; + + public UVOrDirection() + { + name = "UV/Direction"; + UpdateNodeAfterDeserialization(); + } + + public sealed override void UpdateNodeAfterDeserialization() + { + AddSlot(new Vector3MaterialSlot(0, kOutput, kOutput, SlotType.Output, Vector3.zero)); + } + + public override bool hasPreview => false; + + public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) + { + if (generationMode.IsPreview()) + { + sb.AppendLine(@"$precision3 {0} = 0;", GetVariableNameForSlot(0)); + } + else + { + var dir = CoordinateSpace.World.ToVariableName(InterpolatorType.ViewDirection); + var uv = UVChannel.UV0.GetUVName(); + sb.AppendLine(@"$precision3 {0} = CustomRenderTextureDimension == CRT_DIMENSION_CUBE ? IN.{1} : IN.{2}.xyz;", GetVariableNameForSlot(0), dir, uv); + } + } + + public bool RequiresMeshUV(UVChannel channel, ShaderStageCapability stageCapability = ShaderStageCapability.All) + => channel == UVChannel.UV0 && stageCapability == ShaderStageCapability.Fragment; + + public NeededCoordinateSpace RequiresViewDirection(ShaderStageCapability stageCapability = ShaderStageCapability.All) + => NeededCoordinateSpace.World; + } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs.meta new file mode 100644 index 00000000000..ae900600b2c --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 72b77c287dc624a48a85dea2fb04eeb7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template new file mode 100644 index 00000000000..f4109a36042 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template @@ -0,0 +1,86 @@ +Pass +{ + $splice(PassName) + Tags + { + $splice(LightMode) + } + + // Debug + $splice(Debug) + + // -------------------------------------------------- + // Pass + + Lighting Off + Blend One Zero + + HLSLPROGRAM + #include "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl" + #undef SAMPLE_DEPTH_TEXTURE + #undef SAMPLE_DEPTH_TEXTURE_LOD + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl" + #pragma vertex CustomRenderTextureVertexShader + #pragma fragment frag + #pragma target 4.5 + + // Pragmas + $splice(PassPragmas) + + // Keywords + $splice(PassKeywords) + $splice(GraphKeywords) + + struct SurfaceDescriptionInputs + { + // update input values + float4 uv0; + float4 uv1; + uint primitiveID; + float3 direction; + + // ShaderGraph accessors: + float3 WorldSpaceViewDirection; + float3 TimeParameters; + }; + + SurfaceDescriptionInputs ConvertV2FToSurfaceInputs( v2f_customrendertexture IN ) + { + SurfaceDescriptionInputs o; + + o.uv0 = float4(IN.localTexcoord, 0); + o.uv1 = float4(IN.globalTexcoord, 0); + o.primitiveID = IN.primitiveID; + o.direction = IN.direction; + + // other space of view direction are not supported + o.WorldSpaceViewDirection = o.direction; + o.TimeParameters = float3(_Time.y, _SinTime.x, _CosTime.y); + + return o; + } + + // -------------------------------------------------- + // Graph + + // Graph Properties + $splice(GraphProperties) + + // Graph Functions + $splice(GraphFunctions) + + // Graph Pixel + $splice(GraphPixel) + + float4 frag(v2f_customrendertexture IN) : COLOR + { + SurfaceDescriptionInputs surfaceInput = ConvertV2FToSurfaceInputs(IN); + SurfaceDescription surface = SurfaceDescriptionFunction(surfaceInput); + + return float4(surface.BaseColor, surface.Alpha); + } + ENDHLSL +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template.meta new file mode 100644 index 00000000000..fed3124f382 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: afa536a0de48246de92194c9e987b0b8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs new file mode 100644 index 00000000000..76345338bd0 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.ShaderGraph; +using UnityEditor.ShaderGraph.Legacy; + +namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph +{ + sealed class CustomTextureSubTarget : SubTarget + { + const string kAssetGuid = "5b2d4724a38a5485ba5e7dc2f7d86f1a"; // CustomTextureSubShader.cs + + internal static FieldDescriptor colorField = new FieldDescriptor(String.Empty, "Color", string.Empty); + + public CustomTextureSubTarget() + { + isHidden = false; + displayName = "Custom Render Texture"; + } + + public override bool IsActive() => true; + + public override void Setup(ref TargetSetupContext context) + { + context.AddAssetDependency(new GUID(kAssetGuid), AssetCollection.Flags.SourceDependency); + context.AddSubShader(SubShaders.CustomRenderTexture); + } + + public override void GetFields(ref TargetFieldContext context) + { + context.AddField(colorField, true); + } + + public override void GetActiveBlocks(ref TargetActiveBlockContext context) + { + context.AddBlock(BlockFields.SurfaceDescription.BaseColor); + context.AddBlock(BlockFields.SurfaceDescription.Alpha); + } + + public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) + { + } + + static class SubShaders + { + public static SubShaderDescriptor CustomRenderTexture = new SubShaderDescriptor() + { + generatesPreview = true, + passes = new PassCollection + { + { FullscreePasses.CustomRenderTexture }, + }, + }; + } + } +} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs.meta new file mode 100644 index 00000000000..763bcc9d552 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b2d4724a38a5485ba5e7dc2f7d86f1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref new file mode 100644 index 00000000000..6f5b7c2733d --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref @@ -0,0 +1,3 @@ +{ + "reference": "GUID:be0903cd8e1546f498710afdc59db5eb" +} \ No newline at end of file diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta new file mode 100644 index 00000000000..4450ceb19e9 --- /dev/null +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6c89fe02bcce6b9408a6cfa328cfa005 +AssemblyDefinitionReferenceImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From a11dd3478881cfcf2137245156590bc387a00acd Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 20 Oct 2021 16:02:46 +0200 Subject: [PATCH 043/108] Fix wrong stencil keyword generation --- .../Targets/Fullscreen/FullscreenSubTarget.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 20267ef20fd..d7c984fa359 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -238,6 +238,32 @@ public RenderStateCollection GetRenderState() _ => ZTest.Always }; + public static string CompareFunctionToStencilString(CompareFunction compare) => compare switch + { + CompareFunction.Never => "Never", + CompareFunction.Equal => "Equal", + CompareFunction.NotEqual => "NotEqual", + CompareFunction.Greater => "Greater", + CompareFunction.Less => "Less", + CompareFunction.GreaterEqual => "GEqual", + CompareFunction.LessEqual => "LEqual", + CompareFunction.Always => "Always", + _ => "Always" + }; + + public static string StencilOpToStencilString(StencilOp op) => op switch + { + StencilOp.Keep => "Keep", + StencilOp.Zero => "Zero", + StencilOp.Replace => "Replace", + StencilOp.IncrementSaturate => "IncrSat", + StencilOp.DecrementSaturate => "DecrSat", + StencilOp.Invert => "Invert", + StencilOp.IncrementWrap => "IncrWrap", + StencilOp.DecrementWrap => "DecrWrap", + _ => "Keep" + }; + public virtual SubShaderDescriptor GenerateSubShader() { var result = new SubShaderDescriptor() From 0dd896aa2bf39948db319ab68bc95bcfbe6f695f Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 20 Oct 2021 19:01:22 +0200 Subject: [PATCH 044/108] Fixes --- .../Nodes/UniversalSampleBufferNode.cs | 25 +-------- .../CustomRenderTexture/CustomTextureNodes.cs | 52 +++---------------- .../CustomTextureSubShader.template | 3 ++ 3 files changed, 13 insertions(+), 67 deletions(-) diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs index 9de5e2df049..bf40721147d 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs @@ -171,34 +171,13 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener s.AppendLine("$precision{1} {0}($precision2 uv)", GetFunctionName(), channelCount); using (s.BlockScope()) { - s.AppendLine(@" -float3 origin = float3(0.0, 0.0, 0.0); -float3 direction = normalize(float3(uv * 2 - 1, 1.0)); -float3 center = float3(0.0, 0.0, 1.5); -float radius = 1; - -float3 rc = origin - center; -float c = dot(rc, rc) - (radius*radius); -float b = dot(direction, rc); -float d = b*b - c; -float t = -b - sqrt(abs(d)); -float st = step(0.0, min(t,d)); -float sphereDistance = lerp(-1.0, t, st); -float3 sphereNormal = 0; - -if (sphereDistance > 0) -{ - float3 hit = origin+direction*sphereDistance; - sphereNormal = normalize(hit - center); -} -"); switch (bufferType) { case BufferType.NormalWorldSpace: - s.AppendLine("return sphereNormal;"); + s.AppendLine("return LatlongToDirectionCoordinate(uv);"); break; case BufferType.MotionVectors: - s.AppendLine("return sphereDistance > 0 ? float3(0.5, 0, 0) : 0;"); + s.AppendLine("return uv * 2 - 1;"); break; // case BufferType.PostProcessInput: // s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs index 68e4a054145..172625829d0 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -50,14 +50,14 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener // For preview only we declare CRT defines if (generationMode == GenerationMode.Preview) { - registry.builder.AppendLine("#define _CustomRenderTextureHeight 0.0"); - registry.builder.AppendLine("#define _CustomRenderTextureWidth 0.0"); - registry.builder.AppendLine("#define _CustomRenderTextureDepth 0.0"); + registry.builder.AppendLine("#define _CustomRenderTextureHeight 1.0"); + registry.builder.AppendLine("#define _CustomRenderTextureWidth 1.0"); + registry.builder.AppendLine("#define _CustomRenderTextureDepth 1.0"); } } } - [Title("Custom Render Texture", "Slice / Face")] + [Title("Custom Render Texture", "Slice Index / Cubemap Face")] class CustomTextureSlice : AbstractMaterialNode, IGeneratesFunction { private const string kOutputSlotCubeFaceName = "Texture Cube Face"; @@ -68,7 +68,7 @@ class CustomTextureSlice : AbstractMaterialNode, IGeneratesFunction public CustomTextureSlice() { - name = "Custom Render Texture Size"; + name = "Slice Index / Cubemap Face"; UpdateNodeAfterDeserialization(); } @@ -152,10 +152,13 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener { registry.builder.AppendLine("TEXTURE2D(_SelfTexture2D);"); registry.builder.AppendLine("SAMPLER(sampler_SelfTexture2D);"); + registry.builder.AppendLine("float4 _SelfTexture2D_TexelSize;"); registry.builder.AppendLine("TEXTURE2D(_SelfTextureCube);"); registry.builder.AppendLine("SAMPLER(sampler_SelfTextureCube);"); + registry.builder.AppendLine("float4 _SelfTextureCube_TexelSize;"); registry.builder.AppendLine("TEXTURE2D(_SelfTexture3D);"); registry.builder.AppendLine("SAMPLER(sampler_SelfTexture3D);"); + registry.builder.AppendLine("float4 sampler_SelfTexture3D_TexelSize;"); } } } @@ -203,43 +206,4 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo } } } - - [Title("Custom Render Texture", "UV/Direction")] - class UVOrDirection : AbstractMaterialNode, IGeneratesBodyCode, IMayRequireMeshUV, IMayRequireViewDirection - { - private const string kOutput = "Uv/Direction"; - - public UVOrDirection() - { - name = "UV/Direction"; - UpdateNodeAfterDeserialization(); - } - - public sealed override void UpdateNodeAfterDeserialization() - { - AddSlot(new Vector3MaterialSlot(0, kOutput, kOutput, SlotType.Output, Vector3.zero)); - } - - public override bool hasPreview => false; - - public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) - { - if (generationMode.IsPreview()) - { - sb.AppendLine(@"$precision3 {0} = 0;", GetVariableNameForSlot(0)); - } - else - { - var dir = CoordinateSpace.World.ToVariableName(InterpolatorType.ViewDirection); - var uv = UVChannel.UV0.GetUVName(); - sb.AppendLine(@"$precision3 {0} = CustomRenderTextureDimension == CRT_DIMENSION_CUBE ? IN.{1} : IN.{2}.xyz;", GetVariableNameForSlot(0), dir, uv); - } - } - - public bool RequiresMeshUV(UVChannel channel, ShaderStageCapability stageCapability = ShaderStageCapability.All) - => channel == UVChannel.UV0 && stageCapability == ShaderStageCapability.Fragment; - - public NeededCoordinateSpace RequiresViewDirection(ShaderStageCapability stageCapability = ShaderStageCapability.All) - => NeededCoordinateSpace.World; - } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template index f4109a36042..589abe64d1a 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template @@ -69,6 +69,9 @@ Pass // Graph Properties $splice(GraphProperties) + // Graph Includes + $splice(GraphIncludes) + // Graph Functions $splice(GraphFunctions) From 8d3cf694d7a50bc71504a517fbd2cb58e7b0a226 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 21 Oct 2021 14:56:56 +0200 Subject: [PATCH 045/108] Fix custom pass editor not selecting correctt pass name when a new material is assigned --- .../RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index 2151efacfb7..5a9b2c0b51f 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -74,6 +74,8 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) { EditorGUI.BeginChangeCheck(); int index = mat.FindPass(m_MaterialPassName.stringValue); + if (index == -1) + index = 0; // Select the first pass by default when the previous pass name doesn't exist in the new material. index = EditorGUI.IntPopup(rect, Styles.materialPassName, index, GetMaterialPassNames(mat), Enumerable.Range(0, mat.passCount).ToArray()); if (EditorGUI.EndChangeCheck()) m_MaterialPassName.stringValue = mat.GetPassName(index); From dd1f6a108ef845d90db7ed0d8cf0970eba4c5598 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 21 Oct 2021 17:07:23 +0200 Subject: [PATCH 046/108] Add simple fullscreen graphic test for ShaderGraph --- .../Direct3D11/None/Fullscreen.png | 3 + .../Direct3D11/None/Fullscreen.png.meta | 98 + .../ShaderGraph/Assets/Scenes/Fullscreen.meta | 8 + .../Assets/Scenes/Fullscreen.unity | 1742 +++++++++++++++++ .../Assets/Scenes/Fullscreen.unity.meta | 7 + .../AlphaBlend_RT_Blit.renderTexture | 39 + .../AlphaBlend_RT_Blit.renderTexture.meta | 8 + ...AlphaBlend_RT_DrawProcedural.renderTexture | 39 + ...Blend_RT_DrawProcedural.renderTexture.meta | 8 + .../Fullscreen/Depth_RT_Blit.renderTexture | 39 + .../Depth_RT_Blit.renderTexture.meta | 8 + .../Depth_RT_DrawProcedural.renderTexture | 39 + ...Depth_RT_DrawProcedural.renderTexture.meta | 8 + .../Scenes/Fullscreen/FullscreenTests.cs | 61 + .../Scenes/Fullscreen/FullscreenTests.cs.meta | 11 + .../Fullscreen/Fullscreen_AlphaBlend.mat | 38 + .../Fullscreen/Fullscreen_AlphaBlend.mat.meta | 8 + .../Fullscreen_AlphaBlend.shadergraph | 409 ++++ .../Fullscreen_AlphaBlend.shadergraph.meta | 10 + .../Scenes/Fullscreen/Fullscreen_Depth.mat | 38 + .../Fullscreen/Fullscreen_Depth.mat.meta | 8 + .../Fullscreen/Fullscreen_Depth.shadergraph | 392 ++++ .../Fullscreen_Depth.shadergraph.meta | 10 + .../Fullscreen/Fullscreen_StencilTest.mat | 38 + .../Fullscreen_StencilTest.mat.meta | 8 + .../Fullscreen_StencilTest.shadergraph | 323 +++ .../Fullscreen_StencilTest.shadergraph.meta | 10 + .../Fullscreen/Fullscreen_StencilWrite.mat | 38 + .../Fullscreen_StencilWrite.mat.meta | 8 + .../Fullscreen_StencilWrite.shadergraph | 329 ++++ .../Fullscreen_StencilWrite.shadergraph.meta | 10 + .../Scenes/Fullscreen/Fullscreen_UV.mat | 38 + .../Scenes/Fullscreen/Fullscreen_UV.mat.meta | 8 + .../Fullscreen/Fullscreen_UV.shadergraph | 323 +++ .../Fullscreen/Fullscreen_UV.shadergraph.meta | 10 + .../Fullscreen/Stencil_RT_Blit.renderTexture | 39 + .../Stencil_RT_Blit.renderTexture.meta | 8 + .../Stencil_RT_DrawProcedural.renderTexture | 39 + ...encil_RT_DrawProcedural.renderTexture.meta | 8 + .../Fullscreen/UV_RT_Blit.renderTexture | 39 + .../Fullscreen/UV_RT_Blit.renderTexture.meta | 8 + .../UV_RT_DrawProcedural.renderTexture | 39 + .../UV_RT_DrawProcedural.renderTexture.meta | 8 + .../ProjectSettings/EditorBuildSettings.asset | 3 + 44 files changed, 4365 insertions(+) create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture.meta create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture create mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture.meta diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png new file mode 100644 index 00000000000..eba76015e39 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b936b49ea69ef35140c92c12d8f7cb4b07bd596be89302e6ec451bdcf316766 +size 15556 diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png.meta b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png.meta new file mode 100644 index 00000000000..1de740dc7db --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: 2fae55da62af92e4ab0b7eb3ec8eb770 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.meta new file mode 100644 index 00000000000..3dc882f5b5c --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91a6e62db7716e84eb3fe8ab0fac5fe9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity new file mode 100644 index 00000000000..804ea334b6c --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity @@ -0,0 +1,1742 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.12731749, g: 0.13414757, b: 0.1210787, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 4890085278179872738, guid: 2d1d7097c72e31b4a9d0603532ace997, + type: 2} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &54070874 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 54070875} + - component: {fileID: 54070877} + - component: {fileID: 54070876} + m_Layer: 5 + m_Name: AlphaBlend_RT_Blit + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &54070875 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 54070874} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &54070876 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 54070874} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 679f03fd27b4ea84daee6912c06cf0e6, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &54070877 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 54070874} + m_CullTransparentMesh: 1 +--- !u!1 &125068266 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 125068267} + - component: {fileID: 125068268} + m_Layer: 0 + m_Name: Fullscreen Tests object + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &125068267 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125068266} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.3705864, y: 0.60729027, z: 0.7232092} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &125068268 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125068266} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2eab774764b045445b005fe774b06cc9, type: 3} + m_Name: + m_EditorClassIdentifier: + uv: {fileID: 2100000, guid: fbacff351499a1e488ba7f3de58ab149, type: 2} + uvRT1: {fileID: 8400000, guid: d8a0bc84cb05ecf4d98c26eaf44014e1, type: 2} + uvRT2: {fileID: 8400000, guid: 6d34677b3ea8c564fb1003dbbc77c5ae, type: 2} + viewDir: {fileID: 2100000, guid: 88e97b177ad297d4fabd641f0791ae05, type: 2} + viewDirRT1: {fileID: 8400000, guid: f1e9e309129785c47b9e3e3e987aab39, type: 2} + viewDirRT2: {fileID: 8400000, guid: 5e17aea4de9413448b83907916faeb01, type: 2} + alphaBlend: {fileID: 2100000, guid: b2719833af97256459e8e8f792c107e2, type: 2} + alphaBlendRT1: {fileID: 8400000, guid: 7b2abc9285711f147b44c1c60d87fddd, type: 2} + alphaBlendRT2: {fileID: 8400000, guid: 679f03fd27b4ea84daee6912c06cf0e6, type: 2} + stencilWrite: {fileID: 2100000, guid: 6a54bfdd467d98848b7282a9f5ace22c, type: 2} + stencilTest: {fileID: 2100000, guid: 1dd7d11c220392b4e9125411b966d253, type: 2} + stencilRT1: {fileID: 8400000, guid: 61857689904ba2e4db2e75a985f617ab, type: 2} + stencilRT2: {fileID: 8400000, guid: a564de6f1e0272b469ba5fd704880e5e, type: 2} +--- !u!1 &161488924 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 161488925} + - component: {fileID: 161488927} + - component: {fileID: 161488926} + m_Layer: 5 + m_Name: RawImage (13) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &161488925 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161488924} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &161488926 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161488924} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &161488927 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161488924} + m_CullTransparentMesh: 1 +--- !u!1 &206706240 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 206706241} + - component: {fileID: 206706243} + - component: {fileID: 206706242} + m_Layer: 5 + m_Name: RawImage (12) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &206706241 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206706240} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &206706242 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206706240} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &206706243 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206706240} + m_CullTransparentMesh: 1 +--- !u!1 &276111445 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 276111446} + - component: {fileID: 276111448} + - component: {fileID: 276111447} + m_Layer: 5 + m_Name: UV_RT_DrawProcedural + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &276111446 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 276111445} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &276111447 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 276111445} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: d8a0bc84cb05ecf4d98c26eaf44014e1, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &276111448 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 276111445} + m_CullTransparentMesh: 1 +--- !u!1 &317833755 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 317833756} + - component: {fileID: 317833758} + - component: {fileID: 317833757} + m_Layer: 5 + m_Name: RawImage (11) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &317833756 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317833755} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &317833757 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317833755} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &317833758 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317833755} + m_CullTransparentMesh: 1 +--- !u!1 &338607173 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 338607174} + - component: {fileID: 338607176} + - component: {fileID: 338607175} + m_Layer: 5 + m_Name: AlphaBlend_RT_DrawProcedural + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &338607174 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338607173} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &338607175 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338607173} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 7b2abc9285711f147b44c1c60d87fddd, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &338607176 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 338607173} + m_CullTransparentMesh: 1 +--- !u!1 &487053996 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 487053999} + - component: {fileID: 487053998} + - component: {fileID: 487053997} + - component: {fileID: 487054000} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &487053997 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 487053996} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7de28847c8d6a2f4b9e5e48e2f1e59aa, type: 3} + m_Name: + m_EditorClassIdentifier: + ImageComparisonSettings: + TargetWidth: 800 + TargetHeight: 800 + PerPixelCorrectnessThreshold: 0.00075 + PerPixelGammaThreshold: 0.003921569 + PerPixelAlphaThreshold: 0.003921569 + AverageCorrectnessThreshold: 0.0001 + IncorrectPixelsThreshold: 0.0000038146973 + UseHDR: 0 + UseBackBuffer: 0 + ImageResolution: 0 + ActiveImageTests: 1 + ActivePixelTests: 7 + WaitFrames: 0 +--- !u!20 &487053998 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 487053996} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 3 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &487053999 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 487053996} + m_LocalRotation: {x: 0.5, y: 0.5, z: -0.5, w: 0.5} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 90, y: 90, z: 0} +--- !u!114 &487054000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 487053996} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 +--- !u!1 &563873521 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 563873522} + - component: {fileID: 563873524} + - component: {fileID: 563873523} + m_Layer: 5 + m_Name: UV_RT_Blit + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &563873522 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 563873521} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &563873523 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 563873521} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 6d34677b3ea8c564fb1003dbbc77c5ae, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &563873524 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 563873521} + m_CullTransparentMesh: 1 +--- !u!1 &769672740 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 769672741} + - component: {fileID: 769672743} + - component: {fileID: 769672742} + m_Layer: 5 + m_Name: Stencil_RT_Blit + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &769672741 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769672740} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &769672742 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769672740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: a564de6f1e0272b469ba5fd704880e5e, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &769672743 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769672740} + m_CullTransparentMesh: 1 +--- !u!1 &809824961 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 809824965} + - component: {fileID: 809824964} + - component: {fileID: 809824963} + - component: {fileID: 809824962} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &809824962 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 809824961} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &809824963 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 809824961} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &809824964 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 809824961} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 487053998} + m_PlaneDistance: 1 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &809824965 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 809824961} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1485633328} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1195298006 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1195298007} + - component: {fileID: 1195298009} + - component: {fileID: 1195298008} + m_Layer: 5 + m_Name: RawImage (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1195298007 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1195298006} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1195298008 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1195298006} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1195298009 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1195298006} + m_CullTransparentMesh: 1 +--- !u!1 &1399479113 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1399479114} + - component: {fileID: 1399479116} + - component: {fileID: 1399479115} + m_Layer: 5 + m_Name: RawImage (10) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1399479114 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399479113} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1399479115 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399479113} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1399479116 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399479113} + m_CullTransparentMesh: 1 +--- !u!1 &1485633327 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1485633328} + - component: {fileID: 1485633330} + - component: {fileID: 1485633329} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1485633328 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1485633327} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 54070875} + - {fileID: 338607174} + - {fileID: 769672741} + - {fileID: 1675925326} + - {fileID: 563873522} + - {fileID: 276111446} + - {fileID: 1517459219} + - {fileID: 1539522353} + - {fileID: 1195298007} + - {fileID: 1539453433} + - {fileID: 1399479114} + - {fileID: 317833756} + - {fileID: 206706241} + - {fileID: 161488925} + - {fileID: 1620326878} + - {fileID: 1597517994} + m_Father: {fileID: 809824965} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1485633329 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1485633327} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 200, y: 200} + m_Spacing: {x: 0, y: 0} + m_Constraint: 0 + m_ConstraintCount: 2 +--- !u!222 &1485633330 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1485633327} + m_CullTransparentMesh: 1 +--- !u!1 &1515837373 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1515837376} + - component: {fileID: 1515837375} + - component: {fileID: 1515837374} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1515837374 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1515837373} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1515837375 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1515837373} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1515837376 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1515837373} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1517459218 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1517459219} + - component: {fileID: 1517459221} + - component: {fileID: 1517459220} + m_Layer: 5 + m_Name: Depth_RT_Blit + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1517459219 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1517459218} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1517459220 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1517459218} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 5e17aea4de9413448b83907916faeb01, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1517459221 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1517459218} + m_CullTransparentMesh: 1 +--- !u!1 &1539453432 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1539453433} + - component: {fileID: 1539453435} + - component: {fileID: 1539453434} + m_Layer: 5 + m_Name: RawImage (9) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1539453433 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1539453432} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1539453434 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1539453432} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1539453435 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1539453432} + m_CullTransparentMesh: 1 +--- !u!1 &1539522352 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1539522353} + - component: {fileID: 1539522355} + - component: {fileID: 1539522354} + m_Layer: 5 + m_Name: Depth_RT_DrawProcedural + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1539522353 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1539522352} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1539522354 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1539522352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: f1e9e309129785c47b9e3e3e987aab39, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1539522355 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1539522352} + m_CullTransparentMesh: 1 +--- !u!1 &1597517993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1597517994} + - component: {fileID: 1597517996} + - component: {fileID: 1597517995} + m_Layer: 5 + m_Name: RawImage (15) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1597517994 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1597517993} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1597517995 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1597517993} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1597517996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1597517993} + m_CullTransparentMesh: 1 +--- !u!1 &1620326877 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1620326878} + - component: {fileID: 1620326880} + - component: {fileID: 1620326879} + m_Layer: 5 + m_Name: RawImage (14) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1620326878 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1620326877} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1620326879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1620326877} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1620326880 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1620326877} + m_CullTransparentMesh: 1 +--- !u!1 &1675925325 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1675925326} + - component: {fileID: 1675925328} + - component: {fileID: 1675925327} + m_Layer: 5 + m_Name: Stencil_RT_DrawProcedural + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1675925326 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1675925325} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1485633328} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1675925327 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1675925325} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 61857689904ba2e4db2e75a985f617ab, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1675925328 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1675925325} + m_CullTransparentMesh: 1 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity.meta new file mode 100644 index 00000000000..c27d09132da --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8b2856898c3f1cb43a36c7329bdbcc97 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture new file mode 100644 index 00000000000..dbc1e3ca752 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AlphaBlend_RT_Blit + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 128 + m_Height: 128 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture.meta new file mode 100644 index 00000000000..eaf8ebabb35 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 679f03fd27b4ea84daee6912c06cf0e6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture new file mode 100644 index 00000000000..ce153f85d6a --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AlphaBlend_RT_DrawProcedural + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 128 + m_Height: 128 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture.meta new file mode 100644 index 00000000000..0d73f42a757 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7b2abc9285711f147b44c1c60d87fddd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture new file mode 100644 index 00000000000..e80e262c248 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Depth_RT_Blit + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 128 + m_Height: 128 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture.meta new file mode 100644 index 00000000000..169e3f9ef33 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e17aea4de9413448b83907916faeb01 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture new file mode 100644 index 00000000000..4be11421e2d --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Depth_RT_DrawProcedural + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 128 + m_Height: 128 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture.meta new file mode 100644 index 00000000000..3aa45f05be9 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f1e9e309129785c47b9e3e3e987aab39 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs new file mode 100644 index 00000000000..2381c011892 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs @@ -0,0 +1,61 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +[ExecuteAlways] +public class FullscreenTests : MonoBehaviour +{ + [Header("UV")] + public Material uv; + public RenderTexture uvRT1; + public RenderTexture uvRT2; + + [Header("ViewDir")] + public Material viewDir; + public RenderTexture viewDirRT1; + public RenderTexture viewDirRT2; + + [Header("AlphaBlend")] + public Material alphaBlend; + public RenderTexture alphaBlendRT1; + public RenderTexture alphaBlendRT2; + + [Header("Stencil")] + public Material stencilWrite; + public Material stencilTest; + public RenderTexture stencilRT1; + public RenderTexture stencilRT2; + + void Update() + { + var cmd = new CommandBuffer{ name = "Fullscreen Blit" }; + + DrawFullscreenBlitTest(cmd, uv, uvRT1, uvRT2); + DrawFullscreenBlitTest(cmd, viewDir, viewDirRT1, viewDirRT2); + DrawFullscreenBlitTest(cmd, alphaBlend, alphaBlendRT1, alphaBlendRT2); + + DrawFullscreenStencilTest(cmd, stencilWrite, stencilTest, stencilRT1, stencilRT2); + + Graphics.ExecuteCommandBuffer(cmd); + } + + void DrawFullscreenBlitTest(CommandBuffer cmd, Material material, RenderTexture rt1, RenderTexture rt2) + { + CoreUtils.SetRenderTarget(cmd, rt1, ClearFlag.All, Color.white); + CoreUtils.DrawFullScreen(cmd, material, shaderPassId: 0); + CoreUtils.SetRenderTarget(cmd, rt2, ClearFlag.All, Color.white); + cmd.Blit(Texture2D.whiteTexture, rt2, material, pass: 1); + } + + void DrawFullscreenStencilTest(CommandBuffer cmd, Material writeStencil, Material testStencil, RenderTexture rt1, RenderTexture rt2) + { + CoreUtils.SetRenderTarget(cmd, rt1, ClearFlag.All, Color.white); + CoreUtils.DrawFullScreen(cmd, writeStencil, shaderPassId: 0); + CoreUtils.DrawFullScreen(cmd, testStencil, shaderPassId: 0); + + CoreUtils.SetRenderTarget(cmd, rt2, ClearFlag.All, Color.white); + Blitter.BlitTexture(cmd, Texture2D.whiteTexture, rt1, writeStencil, 1); + Blitter.BlitTexture(cmd, Texture2D.whiteTexture, rt1, testStencil, 1); + } +} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs.meta new file mode 100644 index 00000000000..7888e279b15 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2eab774764b045445b005fe774b06cc9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat new file mode 100644 index 00000000000..218316b3351 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Fullscreen_AlphaBlend + m_Shader: {fileID: -6465566751694194690, guid: e67bcfc9844b56b4581011ebe9c74d49, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: [] + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat.meta new file mode 100644 index 00000000000..4b4be6d6f68 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2719833af97256459e8e8f792c107e2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph new file mode 100644 index 00000000000..e506b4ab484 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph @@ -0,0 +1,409 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", + "m_Properties": [], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "4290cfbed07440b093fddf91b8d76b29" + } + ], + "m_Nodes": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + }, + { + "m_Id": "ec2966dd7c5f4bc1a3c20763e2e33646" + }, + { + "m_Id": "22fac907f78c41df9e7a68e4897c5e67" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "22fac907f78c41df9e7a68e4897c5e67" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec2966dd7c5f4bc1a3c20763e2e33646" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 8.0, + "y": 100.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "22f53713eb17485f8cf0e5aaa5906406" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", + "m_Datas": [ + { + "m_Id": "a90b0aea35e14008a266a1a9113e451f" + } + ], + "m_ActiveSubTarget": { + "m_Id": "af7bf9fba27b49d0972f3ab028062356" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.ColorNode", + "m_ObjectId": "22fac907f78c41df9e7a68e4897c5e67", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -312.0, + "y": 151.0, + "width": 208.0, + "height": 127.0 + } + }, + "m_Slots": [ + { + "m_Id": "925cc6c93752438ba85b121a4eb91930" + } + ], + "synonyms": [ + "rgba" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Color": { + "color": { + "r": 1.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "mode": 0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", + "m_Name": "", + "m_ChildObjectList": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "15df3b650d2344cbb6aeb200d400b117" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "925cc6c93752438ba85b121a4eb91930", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 1, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", + "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "ec2966dd7c5f4bc1a3c20763e2e33646", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -312.0, + "y": 291.0, + "width": 208.0, + "height": 313.0 + } + }, + "m_Slots": [ + { + "m_Id": "f9e92ac71a204e08994598c217bb1290" + } + ], + "synonyms": [ + "texcoords", + "coords", + "coordinates" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f9e92ac71a204e08994598c217bb1290", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph.meta new file mode 100644 index 00000000000..a22a1d1e11c --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e67bcfc9844b56b4581011ebe9c74d49 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat new file mode 100644 index 00000000000..97a71d0fc6b --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Fullscreen_Depth + m_Shader: {fileID: -6465566751694194690, guid: e2f2acfc02800be4e9d158379da26dcb, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: [] + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat.meta new file mode 100644 index 00000000000..f0c9e7835fa --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 88e97b177ad297d4fabd641f0791ae05 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph new file mode 100644 index 00000000000..5cb78cbd8c9 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph @@ -0,0 +1,392 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", + "m_Properties": [], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "4290cfbed07440b093fddf91b8d76b29" + } + ], + "m_Nodes": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + }, + { + "m_Id": "ec7e25b5d6344b1cbff7ebf39f9cf715" + }, + { + "m_Id": "27a0c061e2f64edc9f190f63a29e2d7c" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec7e25b5d6344b1cbff7ebf39f9cf715" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "27a0c061e2f64edc9f190f63a29e2d7c" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec7e25b5d6344b1cbff7ebf39f9cf715" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 8.0, + "y": 100.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + }, + { + "m_Id": "27a0c061e2f64edc9f190f63a29e2d7c" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "22f53713eb17485f8cf0e5aaa5906406" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "15e57ac8f8d549ac955781de0b470a63", + "m_Id": 0, + "m_DisplayName": "Depth", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "FullscreenDepth", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", + "m_Datas": [ + { + "m_Id": "a90b0aea35e14008a266a1a9113e451f" + } + ], + "m_ActiveSubTarget": { + "m_Id": "af7bf9fba27b49d0972f3ab028062356" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "27a0c061e2f64edc9f190f63a29e2d7c", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.FullscreenDepth", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "15e57ac8f8d549ac955781de0b470a63" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.FullscreenDepth" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", + "m_Name": "", + "m_ChildObjectList": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "15df3b650d2344cbb6aeb200d400b117" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": true, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 8 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", + "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "c75531fd9036486dbbc8b8b2cd1d2d87", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "ec7e25b5d6344b1cbff7ebf39f9cf715", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -492.0, + "y": 200.0, + "width": 208.0, + "height": 313.0 + } + }, + "m_Slots": [ + { + "m_Id": "c75531fd9036486dbbc8b8b2cd1d2d87" + } + ], + "synonyms": [ + "texcoords", + "coords", + "coordinates" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph.meta new file mode 100644 index 00000000000..b3a5727afa1 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e2f2acfc02800be4e9d158379da26dcb +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat new file mode 100644 index 00000000000..64132b65fcf --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Fullscreen_StencilTest + m_Shader: {fileID: -6465566751694194690, guid: f555b855075efeb4eb2d97fe34fe00c5, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: [] + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat.meta new file mode 100644 index 00000000000..c7dc5b5c3a3 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1dd7d11c220392b4e9125411b966d253 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph new file mode 100644 index 00000000000..62680b16e07 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph @@ -0,0 +1,323 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", + "m_Properties": [], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "4290cfbed07440b093fddf91b8d76b29" + } + ], + "m_Nodes": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + }, + { + "m_Id": "c988b9c0cd824d30a3ccaa8ae7c9b2ae" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c988b9c0cd824d30a3ccaa8ae7c9b2ae" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 8.0, + "y": 100.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "22f53713eb17485f8cf0e5aaa5906406" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", + "m_Datas": [ + { + "m_Id": "a90b0aea35e14008a266a1a9113e451f" + } + ], + "m_ActiveSubTarget": { + "m_Id": "af7bf9fba27b49d0972f3ab028062356" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3eabdd38d0354650b20acc6d94b02489", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", + "m_Name": "", + "m_ChildObjectList": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "15df3b650d2344cbb6aeb200d400b117" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": true, + "m_StencilReference": 128, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 3, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", + "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "c988b9c0cd824d30a3ccaa8ae7c9b2ae", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -322.9999694824219, + "y": 200.0, + "width": 207.99998474121095, + "height": 313.0 + } + }, + "m_Slots": [ + { + "m_Id": "3eabdd38d0354650b20acc6d94b02489" + } + ], + "synonyms": [ + "texcoords", + "coords", + "coordinates" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph.meta new file mode 100644 index 00000000000..70759e38583 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f555b855075efeb4eb2d97fe34fe00c5 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat new file mode 100644 index 00000000000..ecfb648ac77 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Fullscreen_StencilWrite + m_Shader: {fileID: -6465566751694194690, guid: 77c10b40993da9d4493793a1b28d8dd6, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: [] + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat.meta new file mode 100644 index 00000000000..abaaa93a884 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6a54bfdd467d98848b7282a9f5ace22c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph new file mode 100644 index 00000000000..13f0f45bae7 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph @@ -0,0 +1,329 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", + "m_Properties": [], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "4290cfbed07440b093fddf91b8d76b29" + } + ], + "m_Nodes": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + }, + { + "m_Id": "17b6dbbf4f3a45ab88ebb7ff3f8a60ec" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "17b6dbbf4f3a45ab88ebb7ff3f8a60ec" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 8.0, + "y": 100.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "22f53713eb17485f8cf0e5aaa5906406" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.ColorNode", + "m_ObjectId": "17b6dbbf4f3a45ab88ebb7ff3f8a60ec", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -303.0, + "y": 200.0, + "width": 208.0, + "height": 127.0 + } + }, + "m_Slots": [ + { + "m_Id": "2c1ec6ce88f24390b0feb0258fe2d3c3" + } + ], + "synonyms": [ + "rgba" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Color": { + "color": { + "r": 0.0, + "g": 0.0, + "b": 1.0, + "a": 0.0 + }, + "mode": 0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", + "m_Datas": [ + { + "m_Id": "a90b0aea35e14008a266a1a9113e451f" + } + ], + "m_ActiveSubTarget": { + "m_Id": "af7bf9fba27b49d0972f3ab028062356" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "2c1ec6ce88f24390b0feb0258fe2d3c3", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", + "m_Name": "", + "m_ChildObjectList": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "15df3b650d2344cbb6aeb200d400b117" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": true, + "m_StencilReference": 128, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 2, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", + "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph.meta new file mode 100644 index 00000000000..67b322e997c --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 77c10b40993da9d4493793a1b28d8dd6 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat new file mode 100644 index 00000000000..83746a47e1e --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Fullscreen_UV + m_Shader: {fileID: -6465566751694194690, guid: c465be304d0c4614da3c1e53e503dd19, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: [] + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat.meta new file mode 100644 index 00000000000..c662d7cb06e --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fbacff351499a1e488ba7f3de58ab149 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph new file mode 100644 index 00000000000..ff26b7923c2 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph @@ -0,0 +1,323 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", + "m_Properties": [], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "4290cfbed07440b093fddf91b8d76b29" + } + ], + "m_Nodes": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + }, + { + "m_Id": "c988b9c0cd824d30a3ccaa8ae7c9b2ae" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c988b9c0cd824d30a3ccaa8ae7c9b2ae" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 8.0, + "y": 100.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "6f0cd4479cda49a6a6713e3556302138" + }, + { + "m_Id": "766e7ec131324300b800a271f8a5ed2d" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "22f53713eb17485f8cf0e5aaa5906406" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", + "m_Datas": [ + { + "m_Id": "a90b0aea35e14008a266a1a9113e451f" + } + ], + "m_ActiveSubTarget": { + "m_Id": "af7bf9fba27b49d0972f3ab028062356" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3eabdd38d0354650b20acc6d94b02489", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", + "m_Name": "", + "m_ChildObjectList": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "15df3b650d2344cbb6aeb200d400b117" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", + "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "c988b9c0cd824d30a3ccaa8ae7c9b2ae", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -322.9999694824219, + "y": 200.0, + "width": 207.99998474121095, + "height": 313.0 + } + }, + "m_Slots": [ + { + "m_Id": "3eabdd38d0354650b20acc6d94b02489" + } + ], + "synonyms": [ + "texcoords", + "coords", + "coordinates" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph.meta new file mode 100644 index 00000000000..fb4dea559af --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c465be304d0c4614da3c1e53e503dd19 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture new file mode 100644 index 00000000000..b727077c5d2 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Stencil_RT_Blit + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 128 + m_Height: 128 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 94 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture.meta new file mode 100644 index 00000000000..438b3753611 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a564de6f1e0272b469ba5fd704880e5e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture new file mode 100644 index 00000000000..46911ad0199 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Stencil_RT_DrawProcedural + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 128 + m_Height: 128 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 94 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture.meta new file mode 100644 index 00000000000..c539a51a0df --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 61857689904ba2e4db2e75a985f617ab +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture new file mode 100644 index 00000000000..e8b28e7dbb9 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UV_RT_Blit + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 128 + m_Height: 128 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture.meta new file mode 100644 index 00000000000..ede372963ed --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d34677b3ea8c564fb1003dbbc77c5ae +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture new file mode 100644 index 00000000000..6abf0490736 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UV_RT_DrawProcedural + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 128 + m_Height: 128 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture.meta new file mode 100644 index 00000000000..794abe516c1 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d8a0bc84cb05ecf4d98c26eaf44014e1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/ProjectSettings/EditorBuildSettings.asset b/TestProjects/ShaderGraph/ProjectSettings/EditorBuildSettings.asset index 9139c5b6b7c..4557bcf3062 100644 --- a/TestProjects/ShaderGraph/ProjectSettings/EditorBuildSettings.asset +++ b/TestProjects/ShaderGraph/ProjectSettings/EditorBuildSettings.asset @@ -47,4 +47,7 @@ EditorBuildSettings: - enabled: 1 path: Assets/Scenes/URP_InstancingTest.unity guid: 4229d44b837011e48b0f123903ea0ea5 + - enabled: 1 + path: Assets/Scenes/Fullscreen.unity + guid: 8b2856898c3f1cb43a36c7329bdbcc97 m_configObjects: {} From 72388a5050acf70fb0147ba689e60f1c8c4d2a24 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 21 Oct 2021 18:14:35 +0200 Subject: [PATCH 047/108] Cleanup for ShaderGraph only PR --- .../DrawFullscreenFeatureEditor.cs | 94 -------- .../DrawFullscreenFeatureEditor.cs.meta | 11 - .../CreateFullscreenShaderGraph.cs | 25 -- .../CreateFullscreenShaderGraph.cs.meta | 11 - .../Editor/ShaderGraph/Nodes.meta | 8 - .../Nodes/UniversalSampleBufferNode.cs | 214 ------------------ .../Nodes/UniversalSampleBufferNode.cs.meta | 11 - .../Targets/UniversalFullscreenSubTarget.cs | 55 ----- .../UniversalFullscreenSubTarget.cs.meta | 11 - .../ShaderGraph/Targets/UniversalTarget.cs | 83 +------ .../RendererFeatures/DrawFullscreenPass.cs | 147 ------------ .../DrawFullscreenPass.cs.meta | 11 - .../Runtime/UniversalRenderPipelineCore.cs | 1 - 13 files changed, 4 insertions(+), 678 deletions(-) delete mode 100644 com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs delete mode 100644 com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta delete mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs delete mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta delete mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes.meta delete mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs delete mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs.meta delete mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs delete mode 100644 com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta delete mode 100644 com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs delete mode 100644 com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs.meta diff --git a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs b/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs deleted file mode 100644 index 9c587381529..00000000000 --- a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs +++ /dev/null @@ -1,94 +0,0 @@ -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.Rendering.Universal; -using System.Linq; - -namespace UnityEditor.Rendering.Universal -{ - [CustomEditor(typeof(DrawFullscreenPass))] - internal class DrawFullscreenPassEditor : Editor - { - #region Serialized Properties - private SerializedProperty m_InjectionPoint; - private SerializedProperty m_RequiresNormalTexture; - private SerializedProperty m_RequiresMotionVectorTexture; - private SerializedProperty m_BlitMaterial; - private SerializedProperty m_BlitMaterialPassIndex; - private SerializedProperty m_Source; - private SerializedProperty m_Destination; - #endregion - - private bool m_IsInitialized = false; - - private struct Styles - { - public static GUIContent InjectionPoint = EditorGUIUtility.TrTextContent("Injection Point", "Specify when the pass will be executed during the rendering of a frame."); - public static GUIContent RequiresNormalTexture = EditorGUIUtility.TrTextContent("Requires Normal texture", "Specifies whether the shader needs the world space normal texture. Keeping this option disabled will avoid the normal texture to be computed."); - public static GUIContent RequiresMotionVectorTexture = EditorGUIUtility.TrTextContent("Requires Motion Texture", "Specifies whether the shader needs the motion texture. Keeping this option disabled will avoid the motion texture to be computed."); - public static GUIContent BlitMaterial = new GUIContent("Material", "The material used to perform the fullscreen draw."); - public static GUIContent BlitMaterialPassIndex = EditorGUIUtility.TrTextContent("Pass Name", "Name of the material pass to use for the fullscreen draw."); - public static GUIContent Source = EditorGUIUtility.TrTextContent("Source", "Specifies the source texture for the fullscreen pass. You can sample it from"); - public static GUIContent Destination = EditorGUIUtility.TrTextContent("Destination", "Specifies the destination texture for the fullscreen pass."); - } - - private void Init() - { - SerializedProperty settings = serializedObject.FindProperty("m_Settings"); - m_InjectionPoint = settings.FindPropertyRelative("injectionPoint"); - m_RequiresNormalTexture = settings.FindPropertyRelative("requiresNormalTexture"); - m_RequiresMotionVectorTexture = settings.FindPropertyRelative("requiresMotionVectorTexture"); - m_BlitMaterial = settings.FindPropertyRelative("blitMaterial"); - m_BlitMaterialPassIndex = settings.FindPropertyRelative("blitMaterialPassIndex"); - m_Source = settings.FindPropertyRelative("source"); - m_Destination = settings.FindPropertyRelative("destination"); - m_IsInitialized = true; - } - - GUIContent[] GetMaterialPassNames(Material mat) - { - GUIContent[] passNames = new GUIContent[mat.passCount]; - - for (int i = 0; i < mat.passCount; i++) - { - string passName = mat.GetPassName(i); - passNames[i] = new GUIContent(string.IsNullOrEmpty(passName) ? i.ToString() : passName); - } - - return passNames; - } - - public override void OnInspectorGUI() - { - if (!m_IsInitialized) - Init(); - - EditorGUILayout.PropertyField(m_InjectionPoint, Styles.InjectionPoint); - EditorGUILayout.PropertyField(m_RequiresNormalTexture, Styles.RequiresNormalTexture); - EditorGUILayout.PropertyField(m_RequiresMotionVectorTexture, Styles.RequiresMotionVectorTexture); - EditorGUILayout.PropertyField(m_BlitMaterial, Styles.BlitMaterial); - if (m_BlitMaterial.objectReferenceValue is Material material && material?.passCount > 0) - { - EditorGUI.indentLevel++; - - var rect = EditorGUILayout.GetControlRect(true); - EditorGUI.BeginProperty(rect, Styles.BlitMaterialPassIndex, m_BlitMaterialPassIndex); - - EditorGUI.BeginChangeCheck(); - int index = m_BlitMaterialPassIndex.intValue; - - if (index >= material.passCount) - index = material.passCount - 1; - - index = EditorGUI.IntPopup(rect, Styles.BlitMaterialPassIndex, index, GetMaterialPassNames(material), Enumerable.Range(0, material.passCount).ToArray()); - if (EditorGUI.EndChangeCheck()) - m_BlitMaterialPassIndex.intValue = index; - - EditorGUI.EndProperty(); - - EditorGUI.indentLevel--; - } - EditorGUILayout.PropertyField(m_Source, Styles.Source); - EditorGUILayout.PropertyField(m_Destination, Styles.Destination); - } - } -} diff --git a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta b/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta deleted file mode 100644 index 95be10b6fb2..00000000000 --- a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 22ef3eb47947de44f9295df3cbc3de75 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs deleted file mode 100644 index 4eb38ad9024..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using UnityEditor.ShaderGraph; -using UnityEngine.Rendering; -using UnityEditor.Rendering.Fullscreen.ShaderGraph; - -namespace UnityEditor.Rendering.Universal.ShaderGraph -{ - static class CreateFullscreenShaderGraph - { - [MenuItem("Assets/Create/Shader Graph/URP/Fullscreen Shader Graph", priority = CoreUtils.Sections.section5 + CoreUtils.Priorities.assetsCreateShaderMenuPriority)] - public static void CreateFullscreenGraph() - { - var target = (UniversalTarget)Activator.CreateInstance(typeof(UniversalTarget)); - target.TrySetActiveSubTarget(typeof(UniversalFullscreenSubTarget)); - - var blockDescriptors = new[] - { - BlockFields.SurfaceDescription.BaseColor, - BlockFields.SurfaceDescription.Alpha, - }; - - GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); - } - } -} diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta b/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta deleted file mode 100644 index bf1304667a9..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 065bc4c5f217fe14bb13b4ce5ab51a0c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes.meta b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes.meta deleted file mode 100644 index cc768d6baa2..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6979e5ac3dcd9e147be8acbcea517686 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs deleted file mode 100644 index bf40721147d..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs +++ /dev/null @@ -1,214 +0,0 @@ -using System.Collections.Generic; -using System; -using UnityEngine; -using UnityEditor.Graphing; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Drawing.Controls; -using UnityEditor.ShaderGraph.Internal; -using UnityEngine.Rendering.Universal; -using System.Reflection; -using System.Linq; - -namespace UnityEditor.Rendering.Universal -{ - [SRPFilter(typeof(UniversalRenderPipeline))] - [Title("Input", "Universal", "Universal Sample Buffer")] - sealed class UniversalSampleBufferNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireNDCPosition - { - const string k_ScreenPositionSlotName = "UV"; - const string k_OutputSlotName = "Output"; - const string k_SamplerInputSlotName = "Sampler"; - - const int k_ScreenPositionSlotId = 0; - const int k_OutputSlotId = 2; - public const int k_SamplerInputSlotId = 3; - - public enum BufferType - { - NormalWorldSpace, - MotionVectors, - // PostProcessInput, - BlitSource, - } - - [SerializeField] - private BufferType m_BufferType = BufferType.NormalWorldSpace; - - [EnumControl("Source Buffer")] - public BufferType bufferType - { - get { return m_BufferType; } - set - { - if (m_BufferType == value) - return; - - m_BufferType = value; - UpdateNodeAfterDeserialization(); - Dirty(ModificationScope.Graph); - } - } - - public override string documentationURL => Documentation.GetPageLink("SGNode-Universal-Sample-Buffer"); - - public UniversalSampleBufferNode() - { - name = "Universal Sample Buffer"; - synonyms = new string[] { "normal", "motion vector", "postprocessinput", "blit" }; - UpdateNodeAfterDeserialization(); - } - - public override bool hasPreview { get { return true; } } - public override PreviewMode previewMode => PreviewMode.Preview2D; - - int channelCount; - - public sealed override void UpdateNodeAfterDeserialization() - { - AddSlot(new ScreenPositionMaterialSlot(k_ScreenPositionSlotId, k_ScreenPositionSlotName, k_ScreenPositionSlotName, ScreenSpaceType.Default)); - AddSlot(new SamplerStateMaterialSlot(k_SamplerInputSlotId, k_SamplerInputSlotName, k_SamplerInputSlotName, SlotType.Input)); - - switch (bufferType) - { - case BufferType.NormalWorldSpace: - AddSlot(new Vector3MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Vector3.zero, ShaderStageCapability.Fragment)); - channelCount = 3; - break; - case BufferType.MotionVectors: - AddSlot(new Vector2MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Vector2.zero, ShaderStageCapability.Fragment)); - channelCount = 2; - break; - // case BufferType.PostProcessInput: - case BufferType.BlitSource: - AddSlot(new ColorRGBAMaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Color.black, ShaderStageCapability.Fragment)); - channelCount = 4; - break; - } - - RemoveSlotsNameNotMatching(new[] - { - k_ScreenPositionSlotId, - k_SamplerInputSlotId, - k_OutputSlotId, - }); - } - - public override void CollectShaderProperties(PropertyCollector properties, GenerationMode generationMode) - { - if (generationMode.IsPreview()) - return; - - if (bufferType == BufferType.BlitSource) - { - properties.AddShaderProperty(new Texture2DArrayShaderProperty - { - // Make it compatible with Blitter.cs calls - overrideReferenceName = "_BlitTexture", - displayName = "_BlitTexture", - hidden = true, - generatePropertyBlock = true, - isMainTexture = true, - }); - } - // else if (bufferType == BufferType.PostProcessInput) - // { - // properties.AddShaderProperty(new Texture2DArrayShaderProperty - // { - // overrideReferenceName = nameof(HDShaderIDs._CustomPostProcessInput), - // displayName = nameof(HDShaderIDs._CustomPostProcessInput), - // hidden = true, - // generatePropertyBlock = true, - // isMainTexture = true, - // }); - // } - } - - string GetFunctionName() => "Unity_Universal_SampleBuffer_$precision"; - - public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) - { - // Preview SG doesn't have access to render pipeline buffer - if (!generationMode.IsPreview()) - { - registry.ProvideFunction(GetFunctionName(), s => - { - // Default sampler when the sampler slot is not connected. - s.AppendLine("SAMPLER(s_linear_clamp_sampler);"); - s.AppendLine("#include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\""); - - s.AppendLine("$precision{1} {0}($precision2 uv, SamplerState samplerState)", GetFunctionName(), channelCount); - using (s.BlockScope()) - { - switch (bufferType) - { - case BufferType.NormalWorldSpace: - s.AppendLine("return SampleSceneNormals(uv);"); - break; - case BufferType.MotionVectors: - // if we have a value > 1.0f, it means we have selected the "no motion option", hence we force motionVec 0. - s.AppendLine($"float4 motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_CameraMotionVectorsTexture, samplerState, uv * _RTHandleScale.xy, 0);"); - s.AppendLine("float2 motionVec;"); - s.AppendLine("DecodeMotionVector(motionVecBufferSample, motionVec);"); - s.AppendLine("return motionVec;"); - break; - // case BufferType.PostProcessInput: - // s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); - // break; - case BufferType.BlitSource: - s.AppendLine($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); - break; - default: - s.AppendLine("return 0.0;"); - break; - } - } - }); - } - else - { - registry.ProvideFunction(GetFunctionName(), s => - { - s.AppendLine("$precision{1} {0}($precision2 uv)", GetFunctionName(), channelCount); - using (s.BlockScope()) - { - switch (bufferType) - { - case BufferType.NormalWorldSpace: - s.AppendLine("return LatlongToDirectionCoordinate(uv);"); - break; - case BufferType.MotionVectors: - s.AppendLine("return uv * 2 - 1;"); - break; - // case BufferType.PostProcessInput: - // s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); - // break; - case BufferType.BlitSource: - default: - s.AppendLine("return 0.0;"); - break; - } - } - }); - } - } - - public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) - { - string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); - if (generationMode.IsPreview()) - { - sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = {GetFunctionName()}({uv}.xy);"); - } - else - { - var samplerSlot = FindInputSlot(k_SamplerInputSlotId); - var edgesSampler = owner.GetEdges(samplerSlot.slotReference); - var sampler = edgesSampler.Any() ? $"{GetSlotValue(k_SamplerInputSlotId, generationMode)}.samplerstate" : "s_linear_clamp_sampler"; - sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = {GetFunctionName()}({uv}.xy, {sampler});"); - } - } - - public bool RequiresNDCPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; - public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; - } -} diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs.meta b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs.meta deleted file mode 100644 index f0102a74902..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c92e8017e3a191445a9aa9d26d91c907 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs deleted file mode 100644 index 9cef4053bb2..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs +++ /dev/null @@ -1,55 +0,0 @@ -using UnityEditor.ShaderGraph; -using UnityEngine; -using static UnityEditor.Rendering.BuiltIn.ShaderUtils; -using UnityEditor.Rendering.BuiltIn; -using System; -using UnityEditor.Rendering.Fullscreen.ShaderGraph; - -namespace UnityEditor.Rendering.Universal.ShaderGraph -{ - class UniversalFullscreenSubTarget : FullscreenSubTarget, IRequiresData, IHasMetadata - { - static readonly GUID kSourceCodeGuid = new GUID("48080a5025a54a84087e882e2f988642"); // UniversalFullscreenSubTarget.cs // TODO - - public override void Setup(ref TargetSetupContext context) - { - base.Setup(ref context); - context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); - } - - // We don't need the save context / update materials for now - public override object saveContext => null; - - protected override string pipelineTag => UniversalTarget.kPipelineTag; - - protected override IncludeCollection pregraphIncludes => new IncludeCollection - { - { CoreIncludes.CorePregraph }, - { CoreIncludes.ShaderGraphPregraph }, - }; - - public UniversalFullscreenSubTarget() - { - displayName = "Fullscreen"; - } - - protected override KeywordCollection GetPassKeywords(FullscreenCompatibility compatibility) - { - return new KeywordCollection - { - useDrawProcedural - }; - } - - // For GLES 2 support - static KeywordDescriptor useDrawProcedural = new KeywordDescriptor - { - displayName = "Use Draw Procedural", - referenceName = "_USE_DRAW_PROCEDURAL", - type = KeywordType.Boolean, - definition = KeywordDefinition.MultiCompile, - scope = KeywordScope.Global, - stages = KeywordShaderStage.Vertex, - }; - } -} diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta deleted file mode 100644 index 13dd7fc214c..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 48080a5025a54a84087e882e2f988642 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs index bb57d0b579f..52847c9e051 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs @@ -97,10 +97,6 @@ sealed class UniversalTarget : Target, IHasMetadata, ILegacyTarget List m_SubTargetNames; int activeSubTargetIndex => m_SubTargets.IndexOf(m_ActiveSubTarget); - // Subtarget Data - [SerializeField] - List> m_Datas = new List>(); - // View PopupField m_SubTargetField; TextField m_CustomGUIField; @@ -157,7 +153,6 @@ public UniversalTarget() m_SubTargets = TargetUtils.GetSubTargets(this); m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList(); TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); - ProcessSubTargetDatas(m_ActiveSubTarget.value); } public string renderType @@ -290,9 +285,6 @@ public override bool IsNodeAllowedByTarget(Type nodeType) SubTargetFilterAttribute subTargetFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); bool worksWithThisSubTarget = subTargetFilter == null || subTargetFilter.subTargetTypes.Contains(activeSubTarget.GetType()); - if (activeSubTarget.IsActive()) - worksWithThisSubTarget &= activeSubTarget.IsNodeAllowedBySubTarget(nodeType); - return worksWithThisSrp && worksWithThisSubTarget && base.IsNodeAllowedByTarget(nodeType); } @@ -308,7 +300,6 @@ public override void Setup(ref TargetSetupContext context) // Setup the active SubTarget TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets); m_ActiveSubTarget.value.target = this; - ProcessSubTargetDatas(m_ActiveSubTarget.value); m_ActiveSubTarget.value.Setup(ref context); } @@ -334,13 +325,10 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { // Core blocks - if (!(m_ActiveSubTarget.value is UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenSubTarget)) - { - context.AddBlock(BlockFields.VertexDescription.Position); - context.AddBlock(BlockFields.VertexDescription.Normal); - context.AddBlock(BlockFields.VertexDescription.Tangent); - context.AddBlock(BlockFields.SurfaceDescription.BaseColor); - } + context.AddBlock(BlockFields.VertexDescription.Position); + context.AddBlock(BlockFields.VertexDescription.Normal); + context.AddBlock(BlockFields.VertexDescription.Tangent); + context.AddBlock(BlockFields.SurfaceDescription.BaseColor); // SubTarget blocks m_ActiveSubTarget.value.GetActiveBlocks(ref context); @@ -378,7 +366,6 @@ public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Acti registerUndo("Change Material"); m_ActiveSubTarget = m_SubTargets[m_SubTargetField.index]; - ProcessSubTargetDatas(m_ActiveSubTarget.value); onChange(); }); @@ -539,7 +526,6 @@ public bool TrySetActiveSubTarget(Type subTargetType) if (subTarget.GetType().Equals(subTargetType)) { m_ActiveSubTarget = subTarget; - ProcessSubTargetDatas(m_ActiveSubTarget); return true; } } @@ -547,67 +533,6 @@ public bool TrySetActiveSubTarget(Type subTargetType) return false; } - void ProcessSubTargetDatas(SubTarget subTarget) - { - var typeCollection = TypeCache.GetTypesDerivedFrom(); - foreach (var type in typeCollection) - { - if (type.IsGenericType) - continue; - - // Data requirement interfaces need generic type arguments - // Therefore we need to use reflections to call the method - var methodInfo = typeof(UniversalTarget).GetMethod(nameof(SetDataOnSubTarget)); - var genericMethodInfo = methodInfo.MakeGenericMethod(type); - genericMethodInfo.Invoke(this, new object[] { subTarget }); - } - } - - void ClearUnusedData() - { - for (int i = 0; i < m_Datas.Count; i++) - { - var data = m_Datas[i]; - var type = data.value.GetType(); - - // Data requirement interfaces need generic type arguments - // Therefore we need to use reflections to call the method - var methodInfo = typeof(UniversalTarget).GetMethod(nameof(ValidateDataForSubTarget)); - var genericMethodInfo = methodInfo.MakeGenericMethod(type); - genericMethodInfo.Invoke(this, new object[] { m_ActiveSubTarget.value, data.value }); - } - } - - public void SetDataOnSubTarget(SubTarget subTarget) where T : JsonObject - { - if (!(subTarget is IRequiresData requiresData)) - return; - - // Ensure data object exists in list - var data = m_Datas.SelectValue().FirstOrDefault(x => x.GetType().Equals(typeof(T))) as T; - if (data == null) - { - data = Activator.CreateInstance(typeof(T)) as T; - m_Datas.Add(data); - } - - // Apply data object to SubTarget - requiresData.data = data; - } - - public void ValidateDataForSubTarget(SubTarget subTarget, T data) where T : JsonObject - { - if (!(subTarget is IRequiresData requiresData)) - { - m_Datas.Remove(data); - } - } - - public override void OnBeforeSerialize() - { - ClearUnusedData(); - } - public bool TryUpgradeFromMasterNode(IMasterNode1 masterNode, out Dictionary blockMap) { void UpgradeAlphaClip() diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs deleted file mode 100644 index e3f3c8ebabc..00000000000 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs +++ /dev/null @@ -1,147 +0,0 @@ -using System; - -namespace UnityEngine.Rendering.Universal -{ - internal enum DrawFullscreenBufferType - { - CameraColor, - Custom - } - - [Serializable] - internal class DrawFullscreenSettings - { - [SerializeField] internal RenderPassEvent injectionPoint = RenderPassEvent.AfterRenderingOpaques; - [SerializeField] internal bool requiresNormalTexture = false; - [SerializeField] internal bool requiresMotionVectorTexture = false; - [SerializeField] internal Material blitMaterial; - [SerializeField] internal int blitMaterialPassIndex; - [SerializeField] internal DrawFullscreenBufferType source = DrawFullscreenBufferType.CameraColor; - [SerializeField] internal DrawFullscreenBufferType destination = DrawFullscreenBufferType.CameraColor; - } - - [ExcludeFromPreset] - [Tooltip("Draw a fullscreen effect on screen using the material in parameter.")] - internal class DrawFullscreenPass : ScriptableRendererFeature - { - // Serialized Fields - [SerializeField] private DrawFullscreenSettings m_Settings = new DrawFullscreenSettings(); - - private FullscreenPass m_FullscreenPass = null; - - /// - public override void Create() - { - if (m_FullscreenPass == null) - m_FullscreenPass = new FullscreenPass(); - } - - /// - public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) - { - bool shouldAdd = m_FullscreenPass.Setup(m_Settings, renderer, name); - if (shouldAdd) - { - renderer.EnqueuePass(m_FullscreenPass); - } - } - - // The Fullscreen Pass - private class FullscreenPass : ScriptableRenderPass - { - static readonly int k_TemporaryRTId = Shader.PropertyToID("_TempFullscreenRT"); - static readonly int k_CustomRTId = Shader.PropertyToID("_CustomColorRT"); - - ScriptableRenderer m_Renderer = null; - DrawFullscreenSettings m_Settings; - bool m_IsSourceAndDestinationSameTarget; - RenderTargetIdentifier m_Source; - RenderTargetIdentifier m_Destination; - RenderTargetIdentifier m_Temp; - string m_ProfilerTagName; - - internal bool Setup(DrawFullscreenSettings featureSettings, ScriptableRenderer renderer, string profilerTagName) - { - m_Renderer = renderer; - m_Settings = featureSettings; - m_ProfilerTagName = profilerTagName; - renderPassEvent = featureSettings.injectionPoint; - - ConfigureInput(ScriptableRenderPassInput.Depth); - if (featureSettings.requiresNormalTexture) - ConfigureInput(ScriptableRenderPassInput.Normal); - if (featureSettings.requiresMotionVectorTexture) - ConfigureInput(ScriptableRenderPassInput.Motion); - - return m_Settings.blitMaterial != null - && m_Settings.blitMaterial.passCount > m_Settings.blitMaterialPassIndex - && m_Settings.blitMaterialPassIndex >= 0; - } - - /// - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - RenderTextureDescriptor blitTargetDescriptor = renderingData.cameraData.cameraTargetDescriptor; - blitTargetDescriptor.depthBufferBits = 0; - - m_IsSourceAndDestinationSameTarget = m_Settings.source == m_Settings.destination && - (m_Settings.source == DrawFullscreenBufferType.CameraColor); - - var renderer = renderingData.cameraData.renderer; - - if (m_Settings.source == DrawFullscreenBufferType.Custom || m_Settings.destination == DrawFullscreenBufferType.Custom) - cmd.GetTemporaryRT(k_CustomRTId, blitTargetDescriptor, FilterMode.Bilinear); - - if (m_Settings.source == DrawFullscreenBufferType.CameraColor) - m_Source = renderer.cameraColorTarget; - else - m_Source = new RenderTargetIdentifier(k_CustomRTId); - - if (m_Settings.destination == DrawFullscreenBufferType.CameraColor) - m_Destination = renderer.cameraColorTarget; - else - m_Destination = new RenderTargetIdentifier(k_CustomRTId); - - if (m_IsSourceAndDestinationSameTarget) - { - cmd.GetTemporaryRT(k_TemporaryRTId, blitTargetDescriptor, FilterMode.Bilinear); - m_Temp = new RenderTargetIdentifier(k_TemporaryRTId); - } - } - - /// - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTagName); - - cmd.SetGlobalTexture("_CameraOpaqueTexture", renderingData.cameraData.renderer.cameraColorTarget); - // Can't read and write to same color target, create a temp render target to blit. - if (m_IsSourceAndDestinationSameTarget) - { - Blitter.BlitTexture(cmd, m_Source, m_Temp, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); - Blit(cmd, m_Temp, m_Destination); - } - else - { - Blitter.BlitTexture(cmd, m_Source, m_Destination, m_Settings.blitMaterial, m_Settings.blitMaterialPassIndex); - } - - context.ExecuteCommandBuffer(cmd); - CommandBufferPool.Release(cmd); - } - - /// - public override void OnCameraCleanup(CommandBuffer cmd) - { - if (cmd == null) - throw new ArgumentNullException("cmd"); - - if (m_IsSourceAndDestinationSameTarget) - cmd.ReleaseTemporaryRT(k_TemporaryRTId); - - if (m_Settings.source == DrawFullscreenBufferType.Custom || m_Settings.destination == DrawFullscreenBufferType.Custom) - cmd.ReleaseTemporaryRT(k_CustomRTId); - } - } - } -} diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs.meta b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs.meta deleted file mode 100644 index 2d418c0fccd..00000000000 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 323c8982314c2e34a90628dc56e5ed91 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs b/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs index f19938dec68..504730cf2fe 100644 --- a/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs +++ b/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs @@ -855,7 +855,6 @@ internal enum URPProfileId Bloom, LensFlareDataDriven, MotionVectors, - DrawFullscreen, FinalBlit } From bcf949c4a9c8dfa210378e6d995ec5d40fcb0875 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 21 Oct 2021 18:15:50 +0200 Subject: [PATCH 048/108] Cleanup for ShaderGraph only PR --- .../Editor/Material/Fullscreen.meta | 8 - .../Material/Fullscreen/ShaderGraph.meta | 8 - .../CreateHDFullscreenShaderGraph.cs | 25 -- .../CreateHDFullscreenShaderGraph.cs.meta | 11 - .../ShaderGraph/HDFullscreenSubtarget.cs | 41 ---- .../ShaderGraph/HDFullscreenSubtarget.cs.meta | 11 - .../Editor/Material/ShaderGraph/HDTarget.cs | 33 +-- .../ShaderGraph/Nodes/HDSampleBufferNode.cs | 230 ------------------ .../ShaderGraph/Nodes/HDSceneColorNode.cs | 5 - .../ShaderGraph/Nodes/HDSceneDepthNode.cs | 124 ---------- .../Nodes/HDSceneDepthNode.cs.meta | 11 - .../ShaderGraph/TargetData/IRequiresData.cs | 7 + .../IRequiresData.cs.meta} | 2 +- .../CustomPostProcessingVolume.template | 3 +- .../DrawRenderersCustomPassDrawer.cs | 120 +-------- .../CustomPass/FullScreenCustomPassDrawer.cs | 106 -------- .../HDRenderPipelineMenuItems.cs | 2 +- .../Runtime/Debug/DebugLightVolumes.shader | 2 - .../Runtime/Debug/DebugVTBlit.shader | 1 - .../Runtime/Material/Fullscreen.meta | 8 - .../Fullscreen/HDFullscreenFunctions.hlsl | 6 - .../HDFullscreenFunctions.hlsl.meta | 7 - .../HDRenderPipeline.PostProcess.cs | 1 - .../HDRenderPipeline.RenderGraph.cs | 4 - .../Runtime/RenderPipeline/HDStencilUsage.cs | 2 - .../RenderPipeline/HDStringConstants.cs | 2 - .../CustomPass/CustomPassSampling.hlsl | 39 --- .../CustomPass/CustomPassSampling.hlsl.meta | 7 - .../RenderPass/DrawRenderersCustomPass.cs | 42 +--- .../ShaderLibrary/ShaderGraphFunctions.hlsl | 6 - .../ShaderLibrary/ShaderVariables.hlsl | 8 - 31 files changed, 20 insertions(+), 862 deletions(-) delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen.meta delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph.meta delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs.meta delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs.meta delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs delete mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs.meta create mode 100644 com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs rename com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/{Nodes/HDSampleBufferNode.cs.meta => TargetData/IRequiresData.cs.meta} (83%) delete mode 100644 com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen.meta delete mode 100644 com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl delete mode 100644 com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl.meta delete mode 100644 com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl delete mode 100644 com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl.meta diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen.meta deleted file mode 100644 index 032068b9aec..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0f0ba7de1a498de4c94a45af7864bd68 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph.meta deleted file mode 100644 index 9194d2bdcd8..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3242e527472609e438ae952a4b3b7cd8 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs deleted file mode 100644 index afae06f4747..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using UnityEditor.ShaderGraph; -using UnityEngine.Rendering; -using UnityEditor.Rendering.Fullscreen.ShaderGraph; - -namespace UnityEditor.Rendering.HighDefinition.ShaderGraph -{ - static class CreateHDFullscreenShaderGraph - { - [MenuItem("Assets/Create/Shader Graph/HDRP/Fullscreen Shader Graph", priority = CoreUtils.Priorities.assetsCreateShaderMenuPriority + 7)] - public static void CreateHDFullscreenGraph() - { - var target = (HDTarget)Activator.CreateInstance(typeof(HDTarget)); - target.TrySetActiveSubTarget(typeof(HDFullscreenSubTarget)); - - var blockDescriptors = new[] - { - BlockFields.SurfaceDescription.BaseColor, - BlockFields.SurfaceDescription.Alpha, - }; - - GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); - } - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs.meta deleted file mode 100644 index de23a02b4f6..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/CreateHDFullscreenShaderGraph.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0825e29af0b161f44aa7027af2619ab7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs deleted file mode 100644 index 10de1070e88..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs +++ /dev/null @@ -1,41 +0,0 @@ -using UnityEditor.ShaderGraph; -using UnityEngine; -using static UnityEditor.Rendering.BuiltIn.ShaderUtils; -using UnityEditor.Rendering.BuiltIn; -using System; -using UnityEditor.Rendering.Fullscreen.ShaderGraph; -using UnityEngine.Rendering.HighDefinition; -using UnityEditor.ShaderGraph.Internal; - -namespace UnityEditor.Rendering.HighDefinition.ShaderGraph -{ - class HDFullscreenSubTarget : FullscreenSubTarget, IHasMetadata - { - static readonly GUID kSourceCodeGuid = new GUID("657f6eb2bee4e2f4985ec1ac58eb04cb"); // HDFullscreenSubTarget.cs // TODO - - public override void Setup(ref TargetSetupContext context) - { - base.Setup(ref context); - context.AddAssetDependency(kSourceCodeGuid, 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 - { "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl", IncludeLocation.Pregraph}, - { CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph } - }; - - // We don't need the save context / update materials for now - public override object saveContext => null; - - public HDFullscreenSubTarget() - { - displayName = "Fullscreen"; - } - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs.meta deleted file mode 100644 index 91a8b7edb82..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 657f6eb2bee4e2f4985ec1ac58eb04cb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs index 6c11308cf6a..5a95e9a1cdf 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs @@ -63,14 +63,8 @@ sealed class HDTarget : Target, IHasMetadata, ILegacyTarget, IMaySupportVFX, IRe [SerializeField] JsonData m_ActiveSubTarget; - public SubTarget activeSubTarget - { - get => m_ActiveSubTarget.value; - set => m_ActiveSubTarget = value; - } - [SerializeField] - List> m_Datas = new List>(); + List> m_Datas = new List>(); [SerializeField] string m_CustomEditorGUI; @@ -81,8 +75,7 @@ public SubTarget activeSubTarget private static readonly List m_IncompatibleVFXSubTargets = new List { // Currently there is not support for VFX decals via HDRP master node. - typeof(DecalSubTarget), - typeof(HDFullscreenSubTarget), + typeof(DecalSubTarget) }; internal override bool ignoreCustomInterpolators => false; @@ -92,14 +85,7 @@ public override bool IsNodeAllowedByTarget(Type nodeType) { SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); bool worksWithThisSrp = srpFilter == null || srpFilter.srpTypes.Contains(typeof(HDRenderPipeline)); - - SubTargetFilterAttribute subTargetFilter = NodeClassCache.GetAttributeOnNodeType(nodeType); - bool worksWithThisSubTarget = subTargetFilter == null || subTargetFilter.subTargetTypes.Contains(activeSubTarget.GetType()); - - if (activeSubTarget.IsActive()) - worksWithThisSubTarget &= activeSubTarget.IsNodeAllowedBySubTarget(nodeType); - - return worksWithThisSrp && worksWithThisSubTarget && base.IsNodeAllowedByTarget(nodeType); + return worksWithThisSrp && base.IsNodeAllowedByTarget(nodeType); } public HDTarget() @@ -285,15 +271,12 @@ public bool TrySetActiveSubTarget(Type subTargetType) void ProcessSubTargetDatas(SubTarget subTarget) { - var typeCollection = TypeCache.GetTypesDerivedFrom(); + var typeCollection = TypeCache.GetTypesDerivedFrom(); foreach (var type in typeCollection) { - if (type.IsGenericType) - continue; - // Data requirement interfaces need generic type arguments // Therefore we need to use reflections to call the method - var methodInfo = typeof(HDTarget).GetMethod(nameof(SetDataOnSubTarget)); + var methodInfo = typeof(HDTarget).GetMethod("SetDataOnSubTarget"); var genericMethodInfo = methodInfo.MakeGenericMethod(type); genericMethodInfo.Invoke(this, new object[] { subTarget }); } @@ -308,13 +291,13 @@ void ClearUnusedData() // Data requirement interfaces need generic type arguments // Therefore we need to use reflections to call the method - var methodInfo = typeof(HDTarget).GetMethod(nameof(ValidateDataForSubTarget)); + var methodInfo = typeof(HDTarget).GetMethod("ValidateDataForSubTarget"); var genericMethodInfo = methodInfo.MakeGenericMethod(type); genericMethodInfo.Invoke(this, new object[] { m_ActiveSubTarget.value, data.value }); } } - public void SetDataOnSubTarget(SubTarget subTarget) where T : JsonObject + public void SetDataOnSubTarget(SubTarget subTarget) where T : HDTargetData { if (!(subTarget is IRequiresData requiresData)) return; @@ -331,7 +314,7 @@ public void SetDataOnSubTarget(SubTarget subTarget) where T : JsonObject requiresData.data = data; } - public void ValidateDataForSubTarget(SubTarget subTarget, T data) where T : JsonObject + public void ValidateDataForSubTarget(SubTarget subTarget, T data) where T : HDTargetData { if (!(subTarget is IRequiresData requiresData)) { diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs deleted file mode 100644 index 8fedcf2f346..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs +++ /dev/null @@ -1,230 +0,0 @@ -using System.Collections.Generic; -using System; -using UnityEngine; -using UnityEditor.Graphing; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Drawing.Controls; -using UnityEditor.ShaderGraph.Internal; -using UnityEngine.Rendering.HighDefinition; -using System.Reflection; -using System.Linq; - -namespace UnityEditor.Rendering.HighDefinition -{ - [SRPFilter(typeof(HDRenderPipeline))] - [Title("Input", "High Definition Render Pipeline", "HD Sample Buffer")] - sealed class HDSampleBufferNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture, IMayRequireNDCPosition - { - const string k_ScreenPositionSlotName = "UV"; - const string k_OutputSlotName = "Output"; - const string k_SamplerInputSlotName = "Sampler"; - - const int k_ScreenPositionSlotId = 0; - const int k_OutputSlotId = 2; - public const int k_SamplerInputSlotId = 3; - - public enum BufferType - { - NormalWorldSpace, - Roughness, - MotionVectors, - PostProcessInput, - BlitSource, - } - - [SerializeField] - private BufferType m_BufferType = BufferType.NormalWorldSpace; - - [EnumControl("Source Buffer")] - public BufferType bufferType - { - get { return m_BufferType; } - set - { - if (m_BufferType == value) - return; - - m_BufferType = value; - UpdateNodeAfterDeserialization(); - Dirty(ModificationScope.Graph); - } - } - - public override string documentationURL => Documentation.GetPageLink("SGNode-HD-Sample-Buffer"); - - public HDSampleBufferNode() - { - name = "HD Sample Buffer"; - synonyms = new string[] { "normal", "motion vector", "roughness", "postprocessinput", "blit" }; - UpdateNodeAfterDeserialization(); - } - - public override bool hasPreview { get { return true; } } - public override PreviewMode previewMode => PreviewMode.Preview2D; - - int channelCount; - - public sealed override void UpdateNodeAfterDeserialization() - { - AddSlot(new ScreenPositionMaterialSlot(k_ScreenPositionSlotId, k_ScreenPositionSlotName, k_ScreenPositionSlotName, ScreenSpaceType.Default)); - AddSlot(new SamplerStateMaterialSlot(k_SamplerInputSlotId, k_SamplerInputSlotName, k_SamplerInputSlotName, SlotType.Input)); - - switch (bufferType) - { - case BufferType.NormalWorldSpace: - AddSlot(new Vector3MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Vector3.zero, ShaderStageCapability.Fragment)); - channelCount = 3; - break; - case BufferType.Roughness: - AddSlot(new Vector1MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, 0, ShaderStageCapability.Fragment)); - channelCount = 1; - break; - case BufferType.MotionVectors: - AddSlot(new Vector2MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Vector2.zero, ShaderStageCapability.Fragment)); - channelCount = 2; - break; - case BufferType.PostProcessInput: - case BufferType.BlitSource: - AddSlot(new ColorRGBAMaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Color.black, ShaderStageCapability.Fragment)); - channelCount = 4; - break; - } - - RemoveSlotsNameNotMatching(new[] - { - k_ScreenPositionSlotId, - k_SamplerInputSlotId, - k_OutputSlotId, - }); - } - - public override void CollectShaderProperties(PropertyCollector properties, GenerationMode generationMode) - { - if (generationMode.IsPreview()) - return; - - if (bufferType == BufferType.BlitSource) - { - properties.AddShaderProperty(new Texture2DArrayShaderProperty - { - overrideReferenceName = "_MainTex", - displayName = "_MainTex", - hidden = true, - generatePropertyBlock = true, - isMainTexture = true, - }); - } - else if (bufferType == BufferType.PostProcessInput) - { - properties.AddShaderProperty(new Texture2DArrayShaderProperty - { - overrideReferenceName = nameof(HDShaderIDs._CustomPostProcessInput), - displayName = nameof(HDShaderIDs._CustomPostProcessInput), - hidden = true, - generatePropertyBlock = true, - isMainTexture = true, - }); - } - } - - string GetFunctionName() => "Unity_HDRP_SampleBuffer_$precision"; - - public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) - { - // Preview SG doesn't have access to HDRP depth buffer - if (!generationMode.IsPreview()) - { - registry.ProvideFunction(GetFunctionName(), s => - { - s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/NormalBuffer.hlsl\""); - s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Builtin/BuiltinData.hlsl\""); - - s.AppendLine("$precision{1} {0}($precision2 uv, SamplerState samplerState)", GetFunctionName(), channelCount); - using (s.BlockScope()) - { - switch (bufferType) - { - case BufferType.NormalWorldSpace: - s.AppendLine("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); - s.AppendLine("NormalData normalData;"); - s.AppendLine("DecodeFromNormalBuffer(pixelCoords, normalData);"); - s.AppendLine("float depth = LoadCameraDepth(pixelCoords);"); - s.AppendLine("return depth > 0 ? normalData.normalWS : 0;"); - break; - case BufferType.Roughness: - s.AppendLine("uint2 pixelCoords = uint2(uv * _ScreenSize.xy);"); - s.AppendLine("NormalData normalData;"); - s.AppendLine("DecodeFromNormalBuffer(pixelCoords, normalData);"); - s.AppendLine("float depth = LoadCameraDepth(pixelCoords);"); - s.AppendLine("return depth > 0 ? PerceptualRoughnessToRoughness(normalData.perceptualRoughness) : 0;"); - break; - case BufferType.MotionVectors: - // if we have a value > 1.0f, it means we have selected the "no motion option", hence we force motionVec 0. - s.AppendLine($"float4 motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_CameraMotionVectorsTexture, samplerState, uv * _RTHandleScale.xy, 0);"); - s.AppendLine("float2 motionVec;"); - s.AppendLine("DecodeMotionVector(motionVecBufferSample, motionVec);"); - s.AppendLine("return motionVec;"); - break; - case BufferType.PostProcessInput: - s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); - break; - case BufferType.BlitSource: - s.AppendLine($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); - break; - default: - s.AppendLine("return 0.0;"); - break; - } - } - }); - } - else - { - registry.ProvideFunction(GetFunctionName(), s => - { - s.AppendLine("$precision{1} {0}($precision2 uv)", GetFunctionName(), channelCount); - using (s.BlockScope()) - { - switch (bufferType) - { - case BufferType.NormalWorldSpace: - s.AppendLine("return LatlongToDirectionCoordinate(uv);"); - break; - case BufferType.MotionVectors: - s.AppendLine("return uv * 2 - 1;"); - break; - case BufferType.Roughness: - s.AppendLine("return uv.x;"); - break; - case BufferType.PostProcessInput: - case BufferType.BlitSource: - default: - s.AppendLine("return 0.0;"); - break; - } - } - }); - } - } - - public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) - { - string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); - if (generationMode.IsPreview()) - { - sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = {GetFunctionName()}(IN.ScreenPosition.xy);"); - } - else - { - var samplerSlot = FindInputSlot(k_SamplerInputSlotId); - var edgesSampler = owner.GetEdges(samplerSlot.slotReference); - var sampler = edgesSampler.Any() ? $"{GetSlotValue(k_SamplerInputSlotId, generationMode)}.samplerstate" : "s_linear_clamp_sampler"; - sb.AppendLine($"$precision{channelCount} {GetVariableNameForSlot(k_OutputSlotId)} = {GetFunctionName()}({uv}.xy, {sampler});"); - } - } - - public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true; - public bool RequiresNDCPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; - public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs index 0dc51571f24..8c19fe210d7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneColorNode.cs @@ -86,11 +86,6 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener s.AppendLine("#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(_SURFACE_TYPE_TRANSPARENT) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT)"); s.AppendLine("return SampleCameraColor(uv, lod) * exposureMultiplier;"); s.AppendLine("#endif"); - - s.AppendLine("#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(CUSTOM_PASS_SAMPLING_HLSL) && defined(SHADERPASS) && (SHADERPASS == SHADERPASS_DRAWPROCEDURAL || SHADERPASS == SHADERPASS_BLIT)"); - s.AppendLine("return CustomPassSampleCameraColor(uv, lod) * exposureMultiplier;"); - s.AppendLine("#endif"); - s.AppendLine("return $precision3(0.0, 0.0, 0.0);"); } } diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs deleted file mode 100644 index 7204d0327f6..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System.Collections.Generic; -using System; -using UnityEngine; -using UnityEditor.Graphing; -using UnityEditor.ShaderGraph; -using UnityEditor.ShaderGraph.Drawing.Controls; -using UnityEditor.ShaderGraph.Internal; -using UnityEngine.Rendering.HighDefinition; -using System.Reflection; - -namespace UnityEditor.Rendering.HighDefinition -{ - [SRPFilter(typeof(HDRenderPipeline))] - [Title("Input", "High Definition Render Pipeline", "HD Scene Depth")] - sealed class HDSceneDepthNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture - { - const string k_ScreenPositionSlotName = "UV"; - const string k_LodInputSlotName = "Lod"; - const string k_OutputSlotName = "Output"; - - const int k_ScreenPositionSlotId = 0; - const int k_LodInputSlotId = 1; - const int k_OutputSlotId = 2; - - [SerializeField] - private DepthSamplingMode m_DepthSamplingMode = DepthSamplingMode.Linear01; - - [EnumControl("Sampling Mode")] - public DepthSamplingMode depthSamplingMode - { - get { return m_DepthSamplingMode; } - set - { - if (m_DepthSamplingMode == value) - return; - - m_DepthSamplingMode = value; - Dirty(ModificationScope.Graph); - } - } - - public override string documentationURL => Documentation.GetPageLink("SGNode-HD-Scene-Depth"); - - public HDSceneDepthNode() - { - name = "HD Scene Depth"; - synonyms = new string[] { "hdzbuffer", "hdzdepth" }; - UpdateNodeAfterDeserialization(); - } - - public override bool hasPreview { get { return false; } } - - public sealed override void UpdateNodeAfterDeserialization() - { - AddSlot(new ScreenPositionMaterialSlot(k_ScreenPositionSlotId, k_ScreenPositionSlotName, k_ScreenPositionSlotName, ScreenSpaceType.Default)); - AddSlot(new Vector1MaterialSlot(k_LodInputSlotId, k_LodInputSlotName, k_LodInputSlotName, SlotType.Input, 0, ShaderStageCapability.Fragment)); - AddSlot(new Vector1MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, 0, ShaderStageCapability.Fragment)); - - RemoveSlotsNameNotMatching(new[] - { - k_ScreenPositionSlotId, - k_LodInputSlotId, - k_OutputSlotId, - }); - } - - string GetFunctionName() => "Unity_HDRP_SampleSceneDepth_$precision"; - - public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) - { - // Preview SG doesn't have access to HDRP depth buffer - if (!generationMode.IsPreview()) - { - registry.builder.AppendLine("StructuredBuffer _DepthPyramidMipLevelOffsets;"); - registry.builder.AppendLine("float4 _DepthPyramidBufferSize;"); - - registry.ProvideFunction(GetFunctionName(), s => - { - s.AppendLine("$precision {0}($precision2 uv, $precision lod)", GetFunctionName()); - using (s.BlockScope()) - { - s.AppendLine("#if defined(REQUIRE_DEPTH_TEXTURE) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT)"); - s.AppendLine("float2 uvOffset = _DepthPyramidMipLevelOffsets[int(lod)] * _DepthPyramidBufferSize.zw;"); - s.AppendLine("$precision2 UVScale = _RTHandleScale.xy * (_ScreenSize.xy / _DepthPyramidBufferSize.xy);"); - s.AppendLine("$precision lodScale = exp2(uint(lod));"); - s.AppendLine("$precision2 lodUV = (uv * UVScale) / lodScale;"); - s.AppendLine("$precision2 halfTextel = _DepthPyramidBufferSize.zw * 0.5;"); - s.AppendLine("$precision2 lodSize = _DepthPyramidBufferSize.zw * _ScreenSize.xy / lodScale;"); - s.AppendLine("$precision2 clampedUV = clamp(uvOffset + lodUV, uvOffset + halfTextel, uvOffset + lodSize - halfTextel);"); - s.AppendLine("return SAMPLE_TEXTURE2D_X(_CameraDepthTexture, s_linear_clamp_sampler, clampedUV).r;"); - s.AppendLine("#endif"); - - s.AppendLine("return 0.0;"); - } - }); - } - } - - public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) - { - if (generationMode.IsPreview()) - { - sb.AppendLine("$precision3 {0} = 0.0;", GetVariableNameForSlot(k_OutputSlotId)); - } - else - { - string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode); - string lod = GetSlotValue(k_LodInputSlotId, generationMode); - string depth = $"{GetFunctionName()}({uv}.xy, {lod})"; - - if (depthSamplingMode == DepthSamplingMode.Eye) - depth = $"LinearEyeDepth({depth}, _ZBufferParams)"; - if (depthSamplingMode == DepthSamplingMode.Linear01) - depth = $"Linear01Depth({depth}, _ZBufferParams)"; - - sb.AppendLine($"$precision3 {GetVariableNameForSlot(k_OutputSlotId)} = {depth};"); - } - } - - public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true; - - public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; - } -} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs.meta deleted file mode 100644 index 89c27fecd38..00000000000 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c415afa2222171f4eaf631824966f118 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs new file mode 100644 index 00000000000..6568b3b2fc1 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.Rendering.HighDefinition.ShaderGraph +{ + interface IRequiresData where T : HDTargetData + { + T data { get; set; } + } +} diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs.meta b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs.meta similarity index 83% rename from com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs.meta rename to com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs.meta index 8df9df1a982..0fb7e9a32ac 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs.meta +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/TargetData/IRequiresData.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 09b26410cccbd384dbf1c339c9618713 +guid: 0d47693329d2b0048b119eea3e618040 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template index 05f68445812..a3e868188fd 100644 --- a/com.unity.render-pipelines.high-definition/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template +++ b/com.unity.render-pipelines.high-definition/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template @@ -32,8 +32,7 @@ public sealed class #SCRIPTNAME# : CustomPostProcessVolumeComponent, IPostProces return; m_Material.SetFloat("_Intensity", intensity.value); - m_Material.SetTexture("_MainTex", source); - HDUtils.DrawFullScreen(cmd, m_Material, destination, shaderPassId: 0); + cmd.Blit(source, destination, m_Material, 0); } public override void Cleanup() diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs index 5b484427824..35c2358bb3e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs @@ -47,16 +47,6 @@ private class Styles public static GUIContent depthWrite = new GUIContent("Write Depth", "Choose to write depth to the screen."); public static GUIContent depthCompareFunction = new GUIContent("Depth Test", "Choose a new test setting for the depth."); - //Stencil Settings - public static GUIContent overrideStencil = new GUIContent("Override Stencil", "Override stencil state of the objects rendered."); - public static GUIContent stencilReferenceValue = new GUIContent("Reference", "."); - public static GUIContent stencilWriteMask = new GUIContent("Write Mask", "."); - public static GUIContent stencilReadMask = new GUIContent("Read Mask", "."); - public static GUIContent stencilCompareFunction = new GUIContent("Compare Function", "."); - public static GUIContent stencilPassOperation = new GUIContent("Pass", "."); - public static GUIContent stencilFailOperation = new GUIContent("Fail", "."); - public static GUIContent stencilDepthFailOperation = new GUIContent("Depth Fail", "."); - //Camera Settings public static GUIContent overrideCamera = new GUIContent("Camera", "Override camera projections."); public static GUIContent cameraFOV = new GUIContent("Field Of View", "Field Of View to render this pass in."); @@ -69,38 +59,6 @@ private class Styles public static string objectRendererTwiceWithMSAA = "If MSAA is enabled, re-rendering the same object twice will cause depth test artifacts in Before/After Post Process injection points"; } - // Workaround enum to make the EnumFlagsField work, it doesn't handle well enm flags that don't contain all the individual bits as enum values like the UserStencilUsage enum. - [Flags] - enum UserStencilUsageWorkaround - { - UserBit0 = 1 << 0, - UserBit1 = 1 << 1, - } - - static UserStencilUsage ConvertToUserStencilUsage(UserStencilUsageWorkaround w) - { - UserStencilUsage result = 0; - - if ((w & UserStencilUsageWorkaround.UserBit0) != 0) - result |= UserStencilUsage.UserBit0; - if ((w & UserStencilUsageWorkaround.UserBit1) != 0) - result |= UserStencilUsage.UserBit1; - - return result; - } - - static UserStencilUsageWorkaround ConvertToUserStencilUsageWorkaround(UserStencilUsage w) - { - UserStencilUsageWorkaround result = 0; - - if ((w & UserStencilUsage.UserBit0) != 0) - result |= UserStencilUsageWorkaround.UserBit0; - if ((w & UserStencilUsage.UserBit1) != 0) - result |= UserStencilUsageWorkaround.UserBit1; - - return result; - } - //Headers and layout private int m_FilterLines = 2; private int m_MaterialLines = 2; @@ -127,21 +85,11 @@ static UserStencilUsageWorkaround ConvertToUserStencilUsageWorkaround(UserStenci SerializedProperty m_DepthCompareFunction; SerializedProperty m_DepthWrite; - // Override stencil state - SerializedProperty m_OverrideStencilState; - SerializedProperty m_StencilReferenceValue; - SerializedProperty m_StencilWriteMask; - SerializedProperty m_StencilReadMask; - SerializedProperty m_StencilPassOperation; - SerializedProperty m_StencilFailOperation; - SerializedProperty m_StencilDepthFailOperation; - ReorderableList m_ShaderPassesList; CustomPassVolume m_Volume; - CustomPass.TargetBuffer targetDepthBuffer => (CustomPass.TargetBuffer)m_TargetDepthBuffer.intValue; - bool customDepthIsNone => targetDepthBuffer == CustomPass.TargetBuffer.None; + bool customDepthIsNone => (CustomPass.TargetBuffer)m_TargetDepthBuffer.intValue == CustomPass.TargetBuffer.None; protected bool showMaterialOverride = true; @@ -169,15 +117,6 @@ protected override void Initialize(SerializedProperty customPass) m_DepthCompareFunction = customPass.FindPropertyRelative("depthCompareFunction"); m_DepthWrite = customPass.FindPropertyRelative("depthWrite"); - // Stencil options - m_OverrideStencilState = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.overrideStencil)); - m_StencilReferenceValue = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilReferenceValue)); - m_StencilWriteMask = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilWriteMask)); - m_StencilReadMask = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilReadMask)); - m_StencilPassOperation = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilPassOperation)); - m_StencilFailOperation = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilFailOperation)); - m_StencilDepthFailOperation = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilDepthFailOperation)); - m_Volume = customPass.serializedObject.targetObject as CustomPassVolume; m_ShaderPassesList = new ReorderableList(null, m_ShaderPasses, true, true, true, true); @@ -329,7 +268,6 @@ void DoMaterialOverride(ref Rect rect) rect.y += Styles.defaultLineSpace; } - // Depth properties EditorGUI.BeginProperty(rect, Styles.overrideDepth, m_OverrideDepthState); { if (customDepthIsNone) @@ -353,61 +291,6 @@ void DoMaterialOverride(ref Rect rect) EditorGUI.PropertyField(rect, m_DepthWrite, Styles.depthWrite); EditorGUI.indentLevel--; } - - // Stencil properties - rect.y += Styles.defaultLineSpace; - EditorGUI.BeginProperty(rect, Styles.overrideStencil, m_OverrideStencilState); - { - if (customDepthIsNone) - { - using (new EditorGUI.DisabledScope(true)) - EditorGUI.Toggle(rect, Styles.overrideStencil, false); - } - else - { - EditorGUI.PropertyField(rect, m_OverrideStencilState, Styles.overrideStencil); - } - } - EditorGUI.EndProperty(); - - if (m_OverrideStencilState.boolValue && !customDepthIsNone) - { - EditorGUI.indentLevel++; - - DrawStencilIntField(ref rect, m_StencilReferenceValue, Styles.stencilReferenceValue); - DrawStencilIntField(ref rect, m_StencilReadMask, Styles.stencilReadMask); - DrawStencilIntField(ref rect, m_StencilWriteMask, Styles.stencilWriteMask); - rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilPassOperation, Styles.stencilPassOperation); - rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilFailOperation, Styles.stencilFailOperation); - rect.y += Styles.defaultLineSpace; - EditorGUI.PropertyField(rect, m_StencilDepthFailOperation, Styles.stencilDepthFailOperation); - - EditorGUI.indentLevel--; - } - } - - void DrawStencilIntField(ref Rect rect, SerializedProperty property, GUIContent label) - { - rect.y += Styles.defaultLineSpace; - EditorGUI.BeginProperty(rect, label, property); - if (targetDepthBuffer == CustomPass.TargetBuffer.Camera) - { - var userStencilBits = (UserStencilUsage)property.intValue; - EditorGUI.BeginChangeCheck(); - var e = ConvertToUserStencilUsage((UserStencilUsageWorkaround)EditorGUI.EnumFlagsField(rect, label, ConvertToUserStencilUsageWorkaround(userStencilBits))); - if (EditorGUI.EndChangeCheck()) - property.intValue = (int)(e & (UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1)); - } - else - { - EditorGUI.BeginChangeCheck(); - property.intValue = EditorGUI.IntField(rect, label, property.intValue); - if (EditorGUI.EndChangeCheck()) - property.intValue &= 0xFF; - } - EditorGUI.EndProperty(); } void DoShaderPassesList(ref Rect rect) @@ -466,7 +349,6 @@ protected override float GetPassHeight(SerializedProperty customPass) if (showMaterialOverride) height += Styles.defaultLineSpace * m_MaterialLines; height += Styles.defaultLineSpace * (m_OverrideDepthState.boolValue && !customDepthIsNone ? 3 : 1); - height += Styles.defaultLineSpace * (m_OverrideStencilState.boolValue && !customDepthIsNone ? 7 : 1); var mat = m_OverrideMaterial.objectReferenceValue as Material; #if SHOW_PASS_NAMES diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index 5a9b2c0b51f..a2efdafa29b 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -19,14 +19,12 @@ private class Styles { public static float defaultLineSpace = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; public static float helpBoxHeight = EditorGUIUtility.singleLineHeight * 2; - public static float indentPadding = 17; public static GUIContent fullScreenPassMaterial = new GUIContent("FullScreen Material", "FullScreen Material used for the full screen DrawProcedural."); public static GUIContent materialPassName = new GUIContent("Pass Name", "The shader pass to use for your fullscreen pass."); public static GUIContent fetchColorBuffer = new GUIContent("Fetch Color Buffer", "Tick this if your effect sample/fetch the camera color buffer"); public readonly static string writeAndFetchColorBufferWarning = "Fetching and Writing to the camera color buffer at the same time is not supported on most platforms."; - public readonly static string stencilWriteOverReservedBits = "The Stencil Write Mask of your material overwrites the bits reserved by HDRP. To avoid rendering errors, set the Write Mask to " + (int)(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1); } // Fullscreen pass @@ -34,12 +32,8 @@ private class Styles SerializedProperty m_MaterialPassName; SerializedProperty m_FetchColorBuffer; SerializedProperty m_TargetColorBuffer; - SerializedProperty m_TargetDepthBuffer; - - bool m_ShowStencilWriteWarning = false; CustomPass.TargetBuffer targetColorBuffer => (CustomPass.TargetBuffer)m_TargetColorBuffer.intValue; - CustomPass.TargetBuffer targetDepthBuffer => (CustomPass.TargetBuffer)m_TargetDepthBuffer.intValue; protected override void Initialize(SerializedProperty customPass) { @@ -47,7 +41,6 @@ protected override void Initialize(SerializedProperty customPass) m_MaterialPassName = customPass.FindPropertyRelative("materialPassName"); m_FetchColorBuffer = customPass.FindPropertyRelative("fetchColorBuffer"); m_TargetColorBuffer = customPass.FindPropertyRelative("targetColorBuffer"); - m_TargetDepthBuffer = customPass.FindPropertyRelative("targetDepthBuffer"); } protected override void DoPassGUI(SerializedProperty customPass, Rect rect) @@ -74,109 +67,12 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) { EditorGUI.BeginChangeCheck(); int index = mat.FindPass(m_MaterialPassName.stringValue); - if (index == -1) - index = 0; // Select the first pass by default when the previous pass name doesn't exist in the new material. index = EditorGUI.IntPopup(rect, Styles.materialPassName, index, GetMaterialPassNames(mat), Enumerable.Range(0, mat.passCount).ToArray()); if (EditorGUI.EndChangeCheck()) m_MaterialPassName.stringValue = mat.GetPassName(index); } EditorGUI.EndProperty(); - rect.y += Styles.defaultLineSpace; - - if (DoesWriteMaskContainsReservedBits(mat)) - { - if (!m_ShowStencilWriteWarning) - { - m_ShowStencilWriteWarning = true; - GUI.changed = true; // Workaround to update the internal state of the ReorderableList and update the height of the element. - } - Rect helpBoxRect = rect; - helpBoxRect.height = Styles.helpBoxHeight; - helpBoxRect.xMin += Styles.indentPadding; - EditorGUI.HelpBox(helpBoxRect, Styles.stencilWriteOverReservedBits, MessageType.Warning); - rect.y += Styles.helpBoxHeight; - } - else if (m_ShowStencilWriteWarning) - { - m_ShowStencilWriteWarning = false; - GUI.changed = true; // Workaround to update the internal state of the ReorderableList and update the height of the element. - } - } - } - GUI.changed = true; - } - - bool DoesWriteMaskContainsReservedBits(Material material) - { - if (targetDepthBuffer == CustomPass.TargetBuffer.Custom) - return false; - - int writeMask = GetStencilWriteMask(material); - return ((writeMask & (int)~(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1)) != 0); - } - - int GetStencilWriteMask(Material material) - { - if (material.shader == null) - return 0; - - try - { - // Try to retrieve the serialized information of the stencil in the shader - var serializedShader = new SerializedObject(material.shader); - var parsed = serializedShader.FindProperty("m_ParsedForm"); - var subShaders = parsed.FindPropertyRelative("m_SubShaders"); - var subShader = subShaders.GetArrayElementAtIndex(0); - var passes = subShader.FindPropertyRelative("m_Passes"); - var pass = passes.GetArrayElementAtIndex(0); - var state = pass.FindPropertyRelative("m_State"); - var writeMask = state.FindPropertyRelative("stencilWriteMask"); - var readMask = state.FindPropertyRelative("stencilWriteMask"); - var reference = state.FindPropertyRelative("stencilRef"); - var stencilOpFront = state.FindPropertyRelative("stencilOpFront"); - var passOp = stencilOpFront.FindPropertyRelative("pass"); - var failOp = stencilOpFront.FindPropertyRelative("fail"); - var zFailOp = stencilOpFront.FindPropertyRelative("zFail"); - var writeMaskFloatValue = writeMask.FindPropertyRelative("val"); - var writeMaskPropertyName = writeMask.FindPropertyRelative("name"); - - bool IsStencilEnabled() - { - bool enabled = false; - enabled |= IsNotDefaultValue(reference, 0); - enabled |= IsNotDefaultValue(passOp, 0); - enabled |= IsNotDefaultValue(failOp, 0); - enabled |= IsNotDefaultValue(zFailOp, 0); - enabled |= IsNotDefaultValue(writeMask, 255); - enabled |= IsNotDefaultValue(readMask, 255); - return enabled; - } - - bool IsNotDefaultValue(SerializedProperty prop, float defaultValue) - { - var value = prop.FindPropertyRelative("val"); - var propertyName = prop.FindPropertyRelative("name"); - - if (value.floatValue != defaultValue) - return true; - if (material.HasProperty(propertyName.stringValue)) - return true; - return false; } - - // First check if the stencil is enabled in the shader: - // We can do this by checking if there are any non-default values in the stencil state - if (!IsStencilEnabled()) - return 0; - - if (material.HasProperty(writeMaskPropertyName.stringValue)) - return (int)material.GetFloat(writeMaskPropertyName.stringValue); - else - return (int)writeMaskFloatValue.floatValue; - } - catch - { - return 0; } } @@ -186,8 +82,6 @@ protected override float GetPassHeight(SerializedProperty customPass) int height = (int)(Styles.defaultLineSpace * lineCount); height += (m_FetchColorBuffer.boolValue && targetColorBuffer == CustomPass.TargetBuffer.Camera) ? (int)Styles.helpBoxHeight : 0; - if (m_FullScreenPassMaterial.objectReferenceValue is Material mat) - height += (DoesWriteMaskContainsReservedBits(mat)) ? (int)Styles.helpBoxHeight : 0; return height; } diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs index 4c10bf37baa..e3d9dc9b9fa 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs @@ -206,7 +206,7 @@ static void MenuCreateCustomPassCSharpScript() static void MenuCreateCSharpPostProcessVolume() { string templatePath = $"{HDUtils.GetHDRenderPipelinePath()}/Editor/PostProcessing/Templates/CustomPostProcessingVolume.template"; - ProjectWindowUtil.CreateScriptAssetFromTemplateFile(templatePath, "NewPostProcessVolume.cs"); + ProjectWindowUtil.CreateScriptAssetFromTemplateFile(templatePath, "New Post Process Volume.cs"); } [MenuItem("Assets/Create/Shader/HDRP Post Process", priority = CoreUtils.Sections.section1)] diff --git a/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugLightVolumes.shader b/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugLightVolumes.shader index 78d0c87a5d2..32f2a913a98 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugLightVolumes.shader +++ b/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugLightVolumes.shader @@ -19,7 +19,6 @@ Shader "Hidden/HDRP/DebugLightVolumes" HLSLPROGRAM #pragma vertex vert #pragma fragment frag - #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" @@ -69,7 +68,6 @@ Shader "Hidden/HDRP/DebugLightVolumes" HLSLPROGRAM #pragma vertex vert #pragma fragment frag - #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" diff --git a/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugVTBlit.shader b/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugVTBlit.shader index 86b05d0d9d2..f673b6e6c2a 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugVTBlit.shader +++ b/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugVTBlit.shader @@ -3,7 +3,6 @@ Shader "Hidden/DebugVTBlit" HLSLINCLUDE #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" - #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch struct Attributes { diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen.meta b/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen.meta deleted file mode 100644 index 313b19c7ddd..00000000000 --- a/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d260175e9b34d3c4ba428e88a086acd4 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl b/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl deleted file mode 100644 index ace14fa4baf..00000000000 --- a/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl +++ /dev/null @@ -1,6 +0,0 @@ - -// For now we fake the GI sampling in fullscreen. -float3 SampleBakedGI(float3 positionRWS, float3 normalWS, float2 uvStaticLightmap, float2 uvDynamicLightmap) -{ - return 0; -} diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl.meta b/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl.meta deleted file mode 100644 index 6bcf3850dc1..00000000000 --- a/com.unity.render-pipelines.high-definition/Runtime/Material/Fullscreen/HDFullscreenFunctions.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b439a42eff125494ea2293fa5fb56fed -ShaderIncludeImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs index 604d9f7f05a..f89910cf2ad 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs @@ -1438,7 +1438,6 @@ bool DoCustomPostProcess(RenderGraph renderGraph, HDCamera hdCamera, ref Texture ctx.cmd.SetGlobalTexture(HDShaderIDs._CameraDepthTexture, data.depthBuffer); ctx.cmd.SetGlobalTexture(HDShaderIDs._NormalBufferTexture, data.normalBuffer); ctx.cmd.SetGlobalTexture(HDShaderIDs._CameraMotionVectorsTexture, data.motionVecTexture); - ctx.cmd.SetGlobalTexture(HDShaderIDs._CustomPostProcessInput, data.source); data.customPostProcess.Render(ctx.cmd, data.hdCamera, data.source, data.destination); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index e62b068d1d0..cc06646c495 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs @@ -40,10 +40,6 @@ void RecordRenderGraph(RenderRequest renderRequest, // Be careful, ComputePackedMipChainInfo needs the render texture size and not the viewport size. Otherwise it would compute the wrong size. hdCamera.depthBufferMipChainInfo.ComputePackedMipChainInfo(RTHandles.rtHandleProperties.currentRenderTargetSize); - // Bind the depth pyramid offset info for the HDSceneDepth node in ShaderGraph. This can be used by users in custom passes. - Shader.SetGlobalBuffer(HDShaderIDs._DepthPyramidMipLevelOffsets, hdCamera.depthBufferMipChainInfo.GetOffsetBufferData(m_DepthPyramidMipLevelOffsetsBuffer)); - Shader.SetGlobalVector(HDShaderIDs._DepthPyramidBufferSize, new Vector4(hdCamera.depthBufferMipChainInfo.textureSize.x, hdCamera.depthBufferMipChainInfo.textureSize.y, 1.0f / hdCamera.depthBufferMipChainInfo.textureSize.x, 1.0f / hdCamera.depthBufferMipChainInfo.textureSize.y)); - #if UNITY_EDITOR var showGizmos = camera.cameraType == CameraType.Game || camera.cameraType == CameraType.SceneView; diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs index 32b00bcab2a..4556b38149c 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs @@ -1,4 +1,3 @@ -using System; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -53,7 +52,6 @@ internal enum StencilUsage /// Comp Always /// Pass Replace /// - [Flags] public enum UserStencilUsage { /// User stencil bit 0. diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs index 753ad9b59bc..fc48b23ea79 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs @@ -391,7 +391,6 @@ static class HDShaderIDs public static readonly int _SsrClearCoatMaskTexture = Shader.PropertyToID("_SsrClearCoatMaskTexture"); public static readonly int _DepthPyramidMipLevelOffsets = Shader.PropertyToID("_DepthPyramidMipLevelOffsets"); public static readonly int _DepthPyramidFirstMipLevelOffset = Shader.PropertyToID("_DepthPyramidFirstMipLevelOffset"); - public static readonly int _DepthPyramidBufferSize = Shader.PropertyToID("_DepthPyramidBufferSize"); // Still used by ray tracing. @@ -438,7 +437,6 @@ static class HDShaderIDs public static readonly int _CustomColorTexture = Shader.PropertyToID("_CustomColorTexture"); public static readonly int _CustomPassInjectionPoint = Shader.PropertyToID("_CustomPassInjectionPoint"); public static readonly int _AfterPostProcessColorBuffer = Shader.PropertyToID("_AfterPostProcessColorBuffer"); - public static readonly int _CustomPostProcessInput = Shader.PropertyToID("_CustomPostProcessInput"); public static readonly int _InputCubemap = Shader.PropertyToID("_InputCubemap"); public static readonly int _Mipmap = Shader.PropertyToID("_Mipmap"); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl deleted file mode 100644 index afebde23095..00000000000 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef CUSTOM_PASS_SAMPLING_HLSL -#define CUSTOM_PASS_SAMPLING_HLSL - -#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassInjectionPoint.cs.hlsl" - -// This texture is only available in after post process and contains the result of post processing effects. -// While SampleCameraColor still returns the color pyramid without post processes -TEXTURE2D_X(_AfterPostProcessColorBuffer); -float _CustomPassInjectionPoint; - -float3 CustomPassSampleCameraColor(float2 uv, float lod) -{ - switch ((int)_CustomPassInjectionPoint) - { - case CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING: return float3(0, 0, 0); - // there is no color pyramid yet for before transparent so we can't sample with mips. - // Also, we don't use _RTHandleScaleHistory to sample because the color pyramid bound is the actual camera color buffer which is at the resolution of the camera - case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScaleHistory.xy, lod).rgb; - case CUSTOMPASSINJECTIONPOINT_BEFORE_POST_PROCESS: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv, lod).rgb; - case CUSTOMPASSINJECTIONPOINT_BEFORE_PRE_REFRACTION: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScale.xy, 0).rgb; - case CUSTOMPASSINJECTIONPOINT_AFTER_POST_PROCESS: return SAMPLE_TEXTURE2D_X_LOD(_AfterPostProcessColorBuffer, s_trilinear_clamp_sampler, uv * _RTHandleScale.zw, 0).rgb; - default: return SampleCameraColor(uv, lod); - } -} - -float3 CustomPassLoadCameraColor(uint2 pixelCoords, float lod) -{ - switch ((int)_CustomPassInjectionPoint) - { - case CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING: return float3(0, 0, 0); - // there is no color pyramid yet for before transparent so we can't sample with mips. - case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: - case CUSTOMPASSINJECTIONPOINT_BEFORE_PRE_REFRACTION: return LOAD_TEXTURE2D_X_LOD(_ColorPyramidTexture, pixelCoords, 0).rgb; - case CUSTOMPASSINJECTIONPOINT_AFTER_POST_PROCESS: return LOAD_TEXTURE2D_X_LOD(_AfterPostProcessColorBuffer, pixelCoords, 0).rgb; - default: return LoadCameraColor(pixelCoords, lod); - } -} - -#endif diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl.meta b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl.meta deleted file mode 100644 index 48fb6cece2f..00000000000 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 85ec5f9b99ea1ab4293407d695a8439c -ShaderIncludeImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs index bd4f42481f2..0e1ac5731a2 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs @@ -66,46 +66,6 @@ public enum ShaderPass /// public bool depthWrite = true; - /// - /// Override the stencil state of the objects. - /// - public bool overrideStencil = false; - - /// - /// Stencil reference value. Be careful when using this value to write in the stencil buffer to not overwrite HDRP stencil bits. - /// - public int stencilReferenceValue = (int)UserStencilUsage.UserBit0; - - /// - /// Write mask of the stencil. - /// - public int stencilWriteMask = (int)(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1); - - /// - /// Read mask of the stencil - /// - public int stencilReadMask = (int)(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1); - - /// - /// Comparison operation between the stencil buffer and the reference value. - /// - public CompareFunction stencilCompareFunction; - - /// - /// Operation to execute if the stencil test passes. - /// - public StencilOp stencilPassOperation; - - /// - /// Operation to execute if the stencil test fails. - /// - public StencilOp stencilFailOperation; - - /// - /// Operation to execute if the depth test fails. - /// - public StencilOp stencilDepthFailOperation; - /// /// Set the shader pass to use when the override material is null /// @@ -193,7 +153,7 @@ protected override void Execute(CustomPassContext ctx) { depthState = new DepthState(depthWrite, depthCompareFunction), // We disable the stencil when the depth is overwritten but we don't write to it, to prevent writing to the stencil. - stencilState = new StencilState(overrideStencil, (byte)stencilReadMask, (byte)stencilWriteMask, stencilCompareFunction, stencilPassOperation, stencilFailOperation, stencilDepthFailOperation), + stencilState = new StencilState(false), }; PerObjectData renderConfig = ctx.hdCamera.frameSettings.IsEnabled(FrameSettingsField.Shadowmask) ? HDUtils.GetBakedLightingWithShadowMaskRenderConfig() : HDUtils.GetBakedLightingRenderConfig(); diff --git a/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl b/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl index 5c1c4ff7d47..1a1c20e37c3 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl @@ -18,12 +18,6 @@ float3 shadergraph_HDSampleSceneColor(float2 uv) // We always remove the pre-exposure when we sample the scene color return SampleCameraColor(uv) * GetInverseCurrentExposureMultiplier(); #endif - -// Special code for the Fullscreen target to be able to sample the color buffer at different places in the pipeline -#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(CUSTOM_PASS_SAMPLING_HLSL) && defined(SHADERPASS) && (SHADERPASS == SHADERPASS_DRAWPROCEDURAL || SHADERPASS == SHADERPASS_BLIT) - return CustomPassSampleCameraColor(uv, 0) * GetInverseCurrentExposureMultiplier(); -#endif - return float3(0, 0, 0); } diff --git a/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl b/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl index 4e67057c5eb..e12b20e49c8 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl @@ -298,14 +298,6 @@ float4x4 OptimizeProjectionMatrix(float4x4 M) // Helper to handle camera relative space -float3 GetCameraPositionWS() -{ -#if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) - return 0; -#endif - return _WorldSpaceCameraPos; -} - float4x4 ApplyCameraTranslationToMatrix(float4x4 modelMatrix) { // To handle camera relative rendering we substract the camera position in the model matrix From cfbe04abbb937aee603190cea347e73c9a62bab0 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 21 Oct 2021 18:23:03 +0200 Subject: [PATCH 049/108] Cleanup for ShaderGraph only PR --- .../8x_ShaderGraph/8210_Fullscreen.meta | 8 - .../8x_ShaderGraph/8210_Fullscreen.unity | 2744 ----------------- .../8x_ShaderGraph/8210_Fullscreen.unity.meta | 7 - .../8210_CustomPP1.shadergraph | 753 ----- .../8210_CustomPP1.shadergraph.meta | 10 - .../8210_CustomPP2.shadergraph | 667 ---- .../8210_CustomPP2.shadergraph.meta | 10 - .../8210_CustomPass 1.renderTexture | 39 - .../8210_CustomPass 1.renderTexture.meta | 8 - .../8210_CustomPass 2.renderTexture | 39 - .../8210_CustomPass 2.renderTexture.meta | 8 - .../8210_CustomPass 3.renderTexture | 39 - .../8210_CustomPass 3.renderTexture.meta | 8 - .../8210_CustomPass.renderTexture | 39 - .../8210_CustomPass.renderTexture.meta | 8 - .../Box Volume Profile 1.asset | 32 - .../Box Volume Profile 1.asset.meta | 8 - .../8210_Fullscreen/Box Volume Profile.asset | 32 - .../Box Volume Profile.asset.meta | 8 - .../8210_Fullscreen/CustomPP1_8210.cs | 43 - .../8210_Fullscreen/CustomPP1_8210.cs.meta | 11 - .../8210_Fullscreen/CustomPP2_8210.cs | 43 - .../8210_Fullscreen/CustomPP2_8210.cs.meta | 11 - .../FullscreenBlue.shadergraph | 350 --- .../FullscreenBlue.shadergraph.meta | 10 - .../FullscreenNodes.shadergraph | 397 --- .../FullscreenNodes.shadergraph.meta | 10 - .../Shader Graphs_FullscreenBlue.mat | 39 - .../Shader Graphs_FullscreenBlue.mat.meta | 8 - .../Shader Graphs_FullscreenNodes.mat | 39 - .../Shader Graphs_FullscreenNodes.mat.meta | 8 - .../Sky and Fog Global Volume Profile.asset | 255 -- ...y and Fog Global Volume Profile.asset.meta | 8 - .../HDRenderPipelineGlobalSettings.asset | 7 +- .../Direct3D11/None/8210_Fullscreen.png | 3 - .../Direct3D11/None/8210_Fullscreen.png.meta | 110 - TestProjects/HDRP_Tests/Assets/Temp.meta | 8 - .../ProjectSettings/EditorBuildSettings.asset | 5 +- 38 files changed, 2 insertions(+), 5830 deletions(-) delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset delete mode 100644 TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png delete mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png.meta delete mode 100644 TestProjects/HDRP_Tests/Assets/Temp.meta diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.meta deleted file mode 100644 index 9bafb79e2a5..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 12059506ad0184c41880e85b920130ca -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity deleted file mode 100644 index a879e9aa354..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity +++ /dev/null @@ -1,2744 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 4 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 4890085278179872738, guid: 29276056c451888488ed35bc795374bf, - type: 2} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &85731396 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 85731397} - - component: {fileID: 85731399} - - component: {fileID: 85731398} - m_Layer: 5 - m_Name: RawImage (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &85731397 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 85731396} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 193675098} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &85731398 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 85731396} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: 3407c6b0b9a7c44499e4c81b9c33af7f, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &85731399 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 85731396} - m_CullTransparentMesh: 1 ---- !u!1 &193675094 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 193675098} - - component: {fileID: 193675097} - - component: {fileID: 193675096} - - component: {fileID: 193675095} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &193675095 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 193675094} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &193675096 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 193675094} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &193675097 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 193675094} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 562275487} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_UpdateRectTransformForStandalone: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &193675098 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 193675094} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1034793645} - - {fileID: 85731397} - - {fileID: 1593046728} - - {fileID: 678125817} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &212350386 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 212350390} - - component: {fileID: 212350389} - - component: {fileID: 212350387} - m_Layer: 0 - m_Name: Custom Pass Camera 2 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &212350387 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 212350386} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} - m_Name: - m_EditorClassIdentifier: - clearColorMode: 0 - backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} - clearDepth: 1 - volumeLayerMask: - serializedVersion: 2 - m_Bits: 1 - volumeAnchorOverride: {fileID: 0} - antialiasing: 0 - SMAAQuality: 2 - dithering: 0 - stopNaNs: 0 - taaSharpenStrength: 0.5 - TAAQuality: 1 - taaHistorySharpening: 0.35 - taaAntiFlicker: 0.5 - taaMotionVectorRejection: 0 - taaAntiHistoryRinging: 0 - taaBaseBlendFactor: 0.875 - physicalParameters: - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - flipYMode: 0 - xrRendering: 1 - fullscreenPassthrough: 0 - allowDynamicResolution: 0 - customRenderingSettings: 0 - invertFaceCulling: 0 - probeLayerMask: - serializedVersion: 2 - m_Bits: 4294967295 - hasPersistentHistory: 0 - allowDeepLearningSuperSampling: 1 - deepLearningSuperSamplingUseCustomQualitySettings: 0 - deepLearningSuperSamplingQuality: 0 - deepLearningSuperSamplingUseCustomAttributes: 0 - deepLearningSuperSamplingUseOptimalSettings: 1 - deepLearningSuperSamplingSharpening: 0 - exposureTarget: {fileID: 0} - materialMipBias: 0 - m_RenderingPathCustomFrameSettings: - bitDatas: - data1: 72198260625768269 - data2: 13763000477350330392 - lodBias: 1 - lodBiasMode: 0 - lodBiasQualityLevel: 0 - maximumLODLevel: 0 - maximumLODLevelMode: 0 - maximumLODLevelQualityLevel: 0 - sssQualityMode: 0 - sssQualityLevel: 0 - sssCustomSampleBudget: 20 - msaaMode: 1 - materialQuality: 0 - renderingPathCustomFrameSettingsOverrideMask: - mask: - data1: 0 - data2: 0 - defaultFrameSettings: 0 - m_Version: 8 - m_ObsoleteRenderingPath: 0 - m_ObsoleteFrameSettings: - overrides: 0 - enableShadow: 0 - enableContactShadows: 0 - enableShadowMask: 0 - enableSSR: 0 - enableSSAO: 0 - enableSubsurfaceScattering: 0 - enableTransmission: 0 - enableAtmosphericScattering: 0 - enableVolumetrics: 0 - enableReprojectionForVolumetrics: 0 - enableLightLayers: 0 - enableExposureControl: 1 - diffuseGlobalDimmer: 0 - specularGlobalDimmer: 0 - shaderLitMode: 0 - enableDepthPrepassWithDeferredRendering: 0 - enableTransparentPrepass: 0 - enableMotionVectors: 0 - enableObjectMotionVectors: 0 - enableDecals: 0 - enableRoughRefraction: 0 - enableTransparentPostpass: 0 - enableDistortion: 0 - enablePostprocess: 0 - enableOpaqueObjects: 0 - enableTransparentObjects: 0 - enableRealtimePlanarReflection: 0 - enableMSAA: 0 - enableAsyncCompute: 0 - runLightListAsync: 0 - runSSRAsync: 0 - runSSAOAsync: 0 - runContactShadowsAsync: 0 - runVolumeVoxelizationAsync: 0 - lightLoopSettings: - overrides: 0 - enableDeferredTileAndCluster: 0 - enableComputeLightEvaluation: 0 - enableComputeLightVariants: 0 - enableComputeMaterialVariants: 0 - enableFptlForForwardOpaque: 0 - enableBigTilePrepass: 0 - isFptlEnabled: 0 ---- !u!20 &212350389 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 212350386} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 8400000, guid: 3407c6b0b9a7c44499e4c81b9c33af7f, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &212350390 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 212350386} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 4.653012, y: 0.6095099, z: 4.62} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 921410349} - - {fileID: 658257261} - m_Father: {fileID: 0} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &250390020 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 250390021} - - component: {fileID: 250390024} - - component: {fileID: 250390023} - - component: {fileID: 250390022} - m_Layer: 10 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &250390021 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 250390020} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -3.31, y: 0.57, z: 10.95} - m_LocalScale: {x: 26.346195, y: 17.466658, z: 5.612734} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1874909340} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!65 &250390022 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 250390020} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &250390023 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 250390020} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 7a120e7a213136a4393449a97a8ec1e7, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &250390024 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 250390020} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &424095937 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 424095939} - - component: {fileID: 424095938} - m_Layer: 0 - m_Name: Custom Pass - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &424095938 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 424095937} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 26d6499a6bd256e47b859377446493a1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IsGlobal: 0 - fadeRadius: 0 - priority: 0 - customPasses: - - rid: 4581444398646820864 - injectionPoint: 4 - m_TargetCamera: {fileID: 1478009635} - useTargetCamera: 1 - references: - version: 2 - RefIds: - - rid: 4581444398646820864 - type: {class: FullScreenCustomPass, ns: UnityEngine.Rendering.HighDefinition, - asm: Unity.RenderPipelines.HighDefinition.Runtime} - data: - m_Name: Custom Pass - enabled: 1 - targetColorBuffer: 0 - targetDepthBuffer: 0 - clearFlags: 0 - passFoldout: 0 - m_Version: 0 - fullscreenPassMaterial: {fileID: 2100000, guid: cc414eed9437dd448a39710650d4fdf2, - type: 2} - materialPassIndex: 0 - materialPassName: DrawProcedural - fetchColorBuffer: 0 ---- !u!4 &424095939 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 424095937} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 3.65125, y: -0.7491583, z: 3.678979} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1478009636} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &557483584 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 557483585} - - component: {fileID: 557483588} - - component: {fileID: 557483587} - - component: {fileID: 557483586} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &557483585 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 557483584} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 2.71} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1871218409} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &557483586 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 557483584} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &557483587 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 557483584} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 257 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &557483588 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 557483584} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!20 &562275487 stripped -Camera: - m_CorrespondingSourceObject: {fileID: 20109210616973140, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - m_PrefabInstance: {fileID: 1277404422} - m_PrefabAsset: {fileID: 0} ---- !u!1 &658257260 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 658257261} - - component: {fileID: 658257262} - m_Layer: 0 - m_Name: Custom Pass - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &658257261 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 658257260} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 3.65125, y: -0.7491583, z: 3.678979} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 212350390} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &658257262 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 658257260} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 26d6499a6bd256e47b859377446493a1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IsGlobal: 0 - fadeRadius: 0 - priority: 0 - customPasses: - - rid: 4581444398646820864 - injectionPoint: 1 - m_TargetCamera: {fileID: 212350389} - useTargetCamera: 1 - references: - version: 2 - RefIds: - - rid: 4581444398646820864 - type: {class: FullScreenCustomPass, ns: UnityEngine.Rendering.HighDefinition, - asm: Unity.RenderPipelines.HighDefinition.Runtime} - data: - m_Name: Custom Pass - enabled: 1 - targetColorBuffer: 0 - targetDepthBuffer: 0 - clearFlags: 0 - passFoldout: 0 - m_Version: 0 - fullscreenPassMaterial: {fileID: 2100000, guid: 157adb0fd668aa64e972a92e0d0df1b6, - type: 2} - materialPassIndex: 0 - materialPassName: DrawProcedural - fetchColorBuffer: 0 ---- !u!1 &678125816 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 678125817} - - component: {fileID: 678125819} - - component: {fileID: 678125818} - m_Layer: 5 - m_Name: RawImage (3) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &678125817 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678125816} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 193675098} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &678125818 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678125816} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: c79d38983ea97334bb8aa8b585dab4be, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &678125819 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678125816} - m_CullTransparentMesh: 1 ---- !u!1 &791397220 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 791397221} - - component: {fileID: 791397224} - - component: {fileID: 791397223} - - component: {fileID: 791397222} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &791397221 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 791397220} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 2.71} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1478009636} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &791397222 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 791397220} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &791397223 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 791397220} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 257 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &791397224 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 791397220} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &877529783 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 877529784} - - component: {fileID: 877529787} - - component: {fileID: 877529786} - m_Layer: 10 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &877529784 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877529783} - m_LocalRotation: {x: 0.2178479, y: 0.24882141, z: -0.27272773, w: 0.9034655} - m_LocalPosition: {x: -2.6630733, y: 0.21388769, z: 0.8446548} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1874909340} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 31.962002, y: 22.947, z: -26.941002} ---- !u!114 &877529786 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877529783} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7a68c43fe1f2a47cfa234b5eeaa98012, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Intensity: 3.1415927 - m_EnableSpotReflector: 0 - m_LuxAtDistance: 1 - m_InnerSpotPercent: 0 - m_SpotIESCutoffPercent: 100 - m_LightDimmer: 1 - m_VolumetricDimmer: 1 - m_LightUnit: 2 - m_FadeDistance: 10000 - m_VolumetricFadeDistance: 10000 - m_AffectDiffuse: 1 - m_AffectSpecular: 1 - m_NonLightmappedOnly: 0 - m_ShapeWidth: 0.5 - m_ShapeHeight: 0.5 - m_AspectRatio: 1 - m_ShapeRadius: 0 - m_SoftnessScale: 1 - m_UseCustomSpotLightShadowCone: 0 - m_CustomSpotLightShadowCone: 30 - m_MaxSmoothness: 0.99 - m_ApplyRangeAttenuation: 1 - m_DisplayAreaLightEmissiveMesh: 0 - m_AreaLightCookie: {fileID: 0} - m_IESPoint: {fileID: 0} - m_IESSpot: {fileID: 0} - m_IncludeForRayTracing: 1 - m_AreaLightShadowCone: 120 - m_UseScreenSpaceShadows: 0 - m_InteractsWithSky: 1 - m_AngularDiameter: 0 - m_FlareSize: 2 - m_FlareTint: {r: 1, g: 1, b: 1, a: 1} - m_FlareFalloff: 4 - m_SurfaceTexture: {fileID: 0} - m_SurfaceTint: {r: 1, g: 1, b: 1, a: 1} - m_Distance: 150000000 - m_UseRayTracedShadows: 0 - m_NumRayTracingSamples: 4 - m_FilterTracedShadow: 1 - m_FilterSizeTraced: 16 - m_SunLightConeAngle: 0.5 - m_LightShadowRadius: 0.5 - m_SemiTransparentShadow: 0 - m_ColorShadow: 1 - m_DistanceBasedFiltering: 0 - m_EvsmExponent: 15 - m_EvsmLightLeakBias: 0 - m_EvsmVarianceBias: 0.00001 - m_EvsmBlurPasses: 0 - m_LightlayersMask: 1 - m_LinkShadowLayers: 1 - m_ShadowNearPlane: 0.1 - m_BlockerSampleCount: 24 - m_FilterSampleCount: 16 - m_MinFilterSize: 0.01 - m_KernelSize: 5 - m_LightAngle: 1 - m_MaxDepthBias: 0.001 - m_ShadowResolution: - m_Override: 512 - m_UseOverride: 1 - m_Level: 1 - m_ShadowDimmer: 1 - m_VolumetricShadowDimmer: 1 - m_ShadowFadeDistance: 10000 - m_UseContactShadow: - m_Override: 0 - m_UseOverride: 1 - m_Level: 0 - m_RayTracedContactShadow: 0 - m_ShadowTint: {r: 0, g: 0, b: 0, a: 1} - m_PenumbraTint: 0 - m_NormalBias: 0.75 - m_SlopeBias: 0.5 - m_ShadowUpdateMode: 0 - m_AlwaysDrawDynamicShadows: 0 - m_UpdateShadowOnLightMovement: 0 - m_CachedShadowTranslationThreshold: 0.01 - m_CachedShadowAngularThreshold: 0.5 - m_BarnDoorAngle: 90 - m_BarnDoorLength: 0.05 - m_preserveCachedShadow: 0 - m_OnDemandShadowRenderOnPlacement: 1 - m_ShadowCascadeRatios: - - 0.05 - - 0.2 - - 0.3 - m_ShadowCascadeBorders: - - 0.2 - - 0.2 - - 0.2 - - 0.2 - m_ShadowAlgorithm: 0 - m_ShadowVariant: 0 - m_ShadowPrecision: 0 - useOldInspector: 0 - useVolumetric: 1 - featuresFoldout: 1 - m_AreaLightEmissiveMeshShadowCastingMode: 0 - m_AreaLightEmissiveMeshMotionVectorGenerationMode: 0 - m_AreaLightEmissiveMeshLayer: -1 - m_Version: 11 - m_ObsoleteShadowResolutionTier: 1 - m_ObsoleteUseShadowQualitySettings: 0 - m_ObsoleteCustomShadowResolution: 512 - m_ObsoleteContactShadows: 0 - m_PointlightHDType: 0 - m_SpotLightShape: 0 - m_AreaLightShape: 0 ---- !u!108 &877529787 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877529783} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 3.1415927 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 0 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 2 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!1 &921410348 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 921410349} - - component: {fileID: 921410352} - - component: {fileID: 921410351} - - component: {fileID: 921410350} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &921410349 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 921410348} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 2.71} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 212350390} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &921410350 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 921410348} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &921410351 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 921410348} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 257 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &921410352 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 921410348} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &950227071 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 950227074} - - component: {fileID: 950227073} - - component: {fileID: 950227072} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &950227072 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 950227071} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &950227073 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 950227071} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &950227074 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 950227071} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1034793644 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1034793645} - - component: {fileID: 1034793647} - - component: {fileID: 1034793646} - m_Layer: 5 - m_Name: RawImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1034793645 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1034793644} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 193675098} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1034793646 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1034793644} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: 81cc8443e3680df44941ccad58929bd1, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1034793647 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1034793644} - m_CullTransparentMesh: 1 ---- !u!1001 &1277404422 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1132393308280272, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_Name - value: HDRP_Test_Camera - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalPosition.z - value: -2.366 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4209882255362944, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 20109210616973140, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: far clip plane - value: 200 - objectReference: {fileID: 0} - - target: {fileID: 20109210616973140, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: near clip plane - value: 0.1 - objectReference: {fileID: 0} - - target: {fileID: 20109210616973140, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_CullingMask.m_Bits - value: 32 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_Version - value: 8 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableSSR - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableSSAO - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.runSSRAsync - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableDecals - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableShadow - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.runSSAOAsync - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.shaderLitMode - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableDistortion - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableShadowMask - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableLightLayers - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enablePostprocess - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableVolumetrics - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.runLightListAsync - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableAsyncCompute - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableTransmission - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.diffuseGlobalDimmer - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableMotionVectors - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableOpaqueObjects - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableContactShadows - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.specularGlobalDimmer - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableRoughRefraction - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.runContactShadowsAsync - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableTransparentObjects - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableTransparentPrepass - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableObjectMotionVectors - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableTransparentPostpass - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_RenderingPathCustomFrameSettings.bitDatas.data1 - value: 70005818654557 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableSubsurfaceScattering - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.runVolumeVoxelizationAsync - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableAtmosphericScattering - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableRealtimePlanarReflection - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.isFptlEnabled - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.enableReprojectionForVolumetrics - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableBigTilePrepass - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableComputeLightVariants - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableFptlForForwardOpaque - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableComputeLightEvaluation - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableDeferredTileAndCluster - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114777190906822814, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: m_ObsoleteFrameSettings.lightLoopSettings.enableComputeMaterialVariants - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 114995348509370400, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: ImageComparisonSettings.TargetWidth - value: 160 - objectReference: {fileID: 0} - - target: {fileID: 114995348509370400, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: ImageComparisonSettings.TargetHeight - value: 160 - objectReference: {fileID: 0} - - target: {fileID: 114995348509370400, guid: c07ace9ab142ca9469fa377877c2f1e7, - type: 3} - propertyPath: ImageComparisonSettings.AverageCorrectnessThreshold - value: 0.0001 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: c07ace9ab142ca9469fa377877c2f1e7, type: 3} ---- !u!1 &1417025915 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1417025916} - - component: {fileID: 1417025918} - - component: {fileID: 1417025917} - m_Layer: 0 - m_Name: Box Volume - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1417025916 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1417025915} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1580508407} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1417025917 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1417025915} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IsGlobal: 0 - priority: 0 - blendDistance: 1 - weight: 1 - sharedProfile: {fileID: 11400000, guid: 0c3cded045726c7448fe6c99b1bf862e, type: 2} ---- !u!65 &1417025918 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1417025915} - m_Material: {fileID: 0} - m_IsTrigger: 1 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &1420907399 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1420907400} - - component: {fileID: 1420907402} - - component: {fileID: 1420907401} - m_Layer: 0 - m_Name: Box Volume - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1420907400 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1420907399} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1871218409} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1420907401 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1420907399} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IsGlobal: 0 - priority: 0 - blendDistance: 1 - weight: 1 - sharedProfile: {fileID: 11400000, guid: bf36097b78501e54d9bc23dc066be831, type: 2} ---- !u!65 &1420907402 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1420907399} - m_Material: {fileID: 0} - m_IsTrigger: 1 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &1478009632 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1478009636} - - component: {fileID: 1478009635} - - component: {fileID: 1478009633} - m_Layer: 0 - m_Name: Custom Pass Camera - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1478009633 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1478009632} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} - m_Name: - m_EditorClassIdentifier: - clearColorMode: 0 - backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} - clearDepth: 1 - volumeLayerMask: - serializedVersion: 2 - m_Bits: 1 - volumeAnchorOverride: {fileID: 0} - antialiasing: 0 - SMAAQuality: 2 - dithering: 0 - stopNaNs: 0 - taaSharpenStrength: 0.5 - TAAQuality: 1 - taaHistorySharpening: 0.35 - taaAntiFlicker: 0.5 - taaMotionVectorRejection: 0 - taaAntiHistoryRinging: 0 - taaBaseBlendFactor: 0.875 - physicalParameters: - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - flipYMode: 0 - xrRendering: 1 - fullscreenPassthrough: 0 - allowDynamicResolution: 0 - customRenderingSettings: 0 - invertFaceCulling: 0 - probeLayerMask: - serializedVersion: 2 - m_Bits: 4294967295 - hasPersistentHistory: 0 - allowDeepLearningSuperSampling: 1 - deepLearningSuperSamplingUseCustomQualitySettings: 0 - deepLearningSuperSamplingQuality: 0 - deepLearningSuperSamplingUseCustomAttributes: 0 - deepLearningSuperSamplingUseOptimalSettings: 1 - deepLearningSuperSamplingSharpening: 0 - exposureTarget: {fileID: 0} - materialMipBias: 0 - m_RenderingPathCustomFrameSettings: - bitDatas: - data1: 72198260625768269 - data2: 13763000477350330392 - lodBias: 1 - lodBiasMode: 0 - lodBiasQualityLevel: 0 - maximumLODLevel: 0 - maximumLODLevelMode: 0 - maximumLODLevelQualityLevel: 0 - sssQualityMode: 0 - sssQualityLevel: 0 - sssCustomSampleBudget: 20 - msaaMode: 1 - materialQuality: 0 - renderingPathCustomFrameSettingsOverrideMask: - mask: - data1: 0 - data2: 0 - defaultFrameSettings: 0 - m_Version: 8 - m_ObsoleteRenderingPath: 0 - m_ObsoleteFrameSettings: - overrides: 0 - enableShadow: 0 - enableContactShadows: 0 - enableShadowMask: 0 - enableSSR: 0 - enableSSAO: 0 - enableSubsurfaceScattering: 0 - enableTransmission: 0 - enableAtmosphericScattering: 0 - enableVolumetrics: 0 - enableReprojectionForVolumetrics: 0 - enableLightLayers: 0 - enableExposureControl: 1 - diffuseGlobalDimmer: 0 - specularGlobalDimmer: 0 - shaderLitMode: 0 - enableDepthPrepassWithDeferredRendering: 0 - enableTransparentPrepass: 0 - enableMotionVectors: 0 - enableObjectMotionVectors: 0 - enableDecals: 0 - enableRoughRefraction: 0 - enableTransparentPostpass: 0 - enableDistortion: 0 - enablePostprocess: 0 - enableOpaqueObjects: 0 - enableTransparentObjects: 0 - enableRealtimePlanarReflection: 0 - enableMSAA: 0 - enableAsyncCompute: 0 - runLightListAsync: 0 - runSSRAsync: 0 - runSSAOAsync: 0 - runContactShadowsAsync: 0 - runVolumeVoxelizationAsync: 0 - lightLoopSettings: - overrides: 0 - enableDeferredTileAndCluster: 0 - enableComputeLightEvaluation: 0 - enableComputeLightVariants: 0 - enableComputeMaterialVariants: 0 - enableFptlForForwardOpaque: 0 - enableBigTilePrepass: 0 - isFptlEnabled: 0 ---- !u!20 &1478009635 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1478009632} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 8400000, guid: 81cc8443e3680df44941ccad58929bd1, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1478009636 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1478009632} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -4.096988, y: 0.6095099, z: 4.62} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 791397221} - - {fileID: 424095939} - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1580508403 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1580508407} - - component: {fileID: 1580508406} - - component: {fileID: 1580508404} - m_Layer: 0 - m_Name: Custom Post Process 2 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1580508404 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1580508403} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} - m_Name: - m_EditorClassIdentifier: - clearColorMode: 0 - backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} - clearDepth: 1 - volumeLayerMask: - serializedVersion: 2 - m_Bits: 1 - volumeAnchorOverride: {fileID: 0} - antialiasing: 0 - SMAAQuality: 2 - dithering: 0 - stopNaNs: 0 - taaSharpenStrength: 0.5 - TAAQuality: 1 - taaHistorySharpening: 0.35 - taaAntiFlicker: 0.5 - taaMotionVectorRejection: 0 - taaAntiHistoryRinging: 0 - taaBaseBlendFactor: 0.875 - physicalParameters: - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - flipYMode: 0 - xrRendering: 1 - fullscreenPassthrough: 0 - allowDynamicResolution: 0 - customRenderingSettings: 0 - invertFaceCulling: 0 - probeLayerMask: - serializedVersion: 2 - m_Bits: 4294967295 - hasPersistentHistory: 0 - allowDeepLearningSuperSampling: 1 - deepLearningSuperSamplingUseCustomQualitySettings: 0 - deepLearningSuperSamplingQuality: 0 - deepLearningSuperSamplingUseCustomAttributes: 0 - deepLearningSuperSamplingUseOptimalSettings: 1 - deepLearningSuperSamplingSharpening: 0 - exposureTarget: {fileID: 0} - materialMipBias: 0 - m_RenderingPathCustomFrameSettings: - bitDatas: - data1: 72198260625768269 - data2: 13763000477350330392 - lodBias: 1 - lodBiasMode: 0 - lodBiasQualityLevel: 0 - maximumLODLevel: 0 - maximumLODLevelMode: 0 - maximumLODLevelQualityLevel: 0 - sssQualityMode: 0 - sssQualityLevel: 0 - sssCustomSampleBudget: 20 - msaaMode: 1 - materialQuality: 0 - renderingPathCustomFrameSettingsOverrideMask: - mask: - data1: 0 - data2: 0 - defaultFrameSettings: 0 - m_Version: 8 - m_ObsoleteRenderingPath: 0 - m_ObsoleteFrameSettings: - overrides: 0 - enableShadow: 0 - enableContactShadows: 0 - enableShadowMask: 0 - enableSSR: 0 - enableSSAO: 0 - enableSubsurfaceScattering: 0 - enableTransmission: 0 - enableAtmosphericScattering: 0 - enableVolumetrics: 0 - enableReprojectionForVolumetrics: 0 - enableLightLayers: 0 - enableExposureControl: 1 - diffuseGlobalDimmer: 0 - specularGlobalDimmer: 0 - shaderLitMode: 0 - enableDepthPrepassWithDeferredRendering: 0 - enableTransparentPrepass: 0 - enableMotionVectors: 0 - enableObjectMotionVectors: 0 - enableDecals: 0 - enableRoughRefraction: 0 - enableTransparentPostpass: 0 - enableDistortion: 0 - enablePostprocess: 0 - enableOpaqueObjects: 0 - enableTransparentObjects: 0 - enableRealtimePlanarReflection: 0 - enableMSAA: 0 - enableAsyncCompute: 0 - runLightListAsync: 0 - runSSRAsync: 0 - runSSAOAsync: 0 - runContactShadowsAsync: 0 - runVolumeVoxelizationAsync: 0 - lightLoopSettings: - overrides: 0 - enableDeferredTileAndCluster: 0 - enableComputeLightEvaluation: 0 - enableComputeLightVariants: 0 - enableComputeMaterialVariants: 0 - enableFptlForForwardOpaque: 0 - enableBigTilePrepass: 0 - isFptlEnabled: 0 ---- !u!20 &1580508406 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1580508403} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 8400000, guid: c79d38983ea97334bb8aa8b585dab4be, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1580508407 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1580508403} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -3.8469882, y: -4.64049, z: 4.62} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1715040462} - - {fileID: 1417025916} - m_Father: {fileID: 0} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1593046727 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1593046728} - - component: {fileID: 1593046730} - - component: {fileID: 1593046729} - m_Layer: 5 - m_Name: RawImage (2) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1593046728 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1593046727} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 193675098} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1593046729 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1593046727} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: 191dad7e57423184c9e8fad7ba8f538c, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1593046730 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1593046727} - m_CullTransparentMesh: 1 ---- !u!1 &1630942965 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1630942967} - - component: {fileID: 1630942966} - m_Layer: 0 - m_Name: Sky and Fog Global Volume - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1630942966 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1630942965} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IsGlobal: 1 - priority: 0 - blendDistance: 0 - weight: 1 - sharedProfile: {fileID: 11400000, guid: bf5eb914dbdcd2f4288904fda1f02f12, type: 2} ---- !u!4 &1630942967 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1630942965} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -3.7611985, y: 0.7031163, z: -0.66328514} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1874909340} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1715040461 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1715040462} - - component: {fileID: 1715040465} - - component: {fileID: 1715040464} - - component: {fileID: 1715040463} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1715040462 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1715040461} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 2.71} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1580508407} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &1715040463 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1715040461} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1715040464 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1715040461} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 257 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1715040465 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1715040461} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1871218405 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1871218409} - - component: {fileID: 1871218408} - - component: {fileID: 1871218406} - m_Layer: 0 - m_Name: Custom Post Process - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1871218406 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1871218405} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} - m_Name: - m_EditorClassIdentifier: - clearColorMode: 0 - backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} - clearDepth: 1 - volumeLayerMask: - serializedVersion: 2 - m_Bits: 1 - volumeAnchorOverride: {fileID: 0} - antialiasing: 0 - SMAAQuality: 2 - dithering: 0 - stopNaNs: 0 - taaSharpenStrength: 0.5 - TAAQuality: 1 - taaHistorySharpening: 0.35 - taaAntiFlicker: 0.5 - taaMotionVectorRejection: 0 - taaAntiHistoryRinging: 0 - taaBaseBlendFactor: 0.875 - physicalParameters: - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - flipYMode: 0 - xrRendering: 1 - fullscreenPassthrough: 0 - allowDynamicResolution: 0 - customRenderingSettings: 0 - invertFaceCulling: 0 - probeLayerMask: - serializedVersion: 2 - m_Bits: 4294967295 - hasPersistentHistory: 0 - allowDeepLearningSuperSampling: 1 - deepLearningSuperSamplingUseCustomQualitySettings: 0 - deepLearningSuperSamplingQuality: 0 - deepLearningSuperSamplingUseCustomAttributes: 0 - deepLearningSuperSamplingUseOptimalSettings: 1 - deepLearningSuperSamplingSharpening: 0 - exposureTarget: {fileID: 0} - materialMipBias: 0 - m_RenderingPathCustomFrameSettings: - bitDatas: - data1: 72198260625768269 - data2: 13763000477350330392 - lodBias: 1 - lodBiasMode: 0 - lodBiasQualityLevel: 0 - maximumLODLevel: 0 - maximumLODLevelMode: 0 - maximumLODLevelQualityLevel: 0 - sssQualityMode: 0 - sssQualityLevel: 0 - sssCustomSampleBudget: 20 - msaaMode: 1 - materialQuality: 0 - renderingPathCustomFrameSettingsOverrideMask: - mask: - data1: 0 - data2: 0 - defaultFrameSettings: 0 - m_Version: 8 - m_ObsoleteRenderingPath: 0 - m_ObsoleteFrameSettings: - overrides: 0 - enableShadow: 0 - enableContactShadows: 0 - enableShadowMask: 0 - enableSSR: 0 - enableSSAO: 0 - enableSubsurfaceScattering: 0 - enableTransmission: 0 - enableAtmosphericScattering: 0 - enableVolumetrics: 0 - enableReprojectionForVolumetrics: 0 - enableLightLayers: 0 - enableExposureControl: 1 - diffuseGlobalDimmer: 0 - specularGlobalDimmer: 0 - shaderLitMode: 0 - enableDepthPrepassWithDeferredRendering: 0 - enableTransparentPrepass: 0 - enableMotionVectors: 0 - enableObjectMotionVectors: 0 - enableDecals: 0 - enableRoughRefraction: 0 - enableTransparentPostpass: 0 - enableDistortion: 0 - enablePostprocess: 0 - enableOpaqueObjects: 0 - enableTransparentObjects: 0 - enableRealtimePlanarReflection: 0 - enableMSAA: 0 - enableAsyncCompute: 0 - runLightListAsync: 0 - runSSRAsync: 0 - runSSAOAsync: 0 - runContactShadowsAsync: 0 - runVolumeVoxelizationAsync: 0 - lightLoopSettings: - overrides: 0 - enableDeferredTileAndCluster: 0 - enableComputeLightEvaluation: 0 - enableComputeLightVariants: 0 - enableComputeMaterialVariants: 0 - enableFptlForForwardOpaque: 0 - enableBigTilePrepass: 0 - isFptlEnabled: 0 ---- !u!20 &1871218408 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1871218405} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 8400000, guid: 191dad7e57423184c9e8fad7ba8f538c, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1871218409 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1871218405} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 4.653012, y: -4.64049, z: 4.62} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 557483585} - - {fileID: 1420907400} - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1874909339 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1874909340} - m_Layer: 10 - m_Name: Scene - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1874909340 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1874909339} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 2.6630733, y: -0.21388769, z: 0.1553452} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 250390021} - - {fileID: 877529784} - - {fileID: 1630942967} - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity.meta deleted file mode 100644 index c59a2782373..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 74b447ba1a6ee064fb7ebe7a6e56c62d -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph deleted file mode 100644 index 5c1a2e452ec..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph +++ /dev/null @@ -1,753 +0,0 @@ -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.GraphData", - "m_ObjectId": "1a524c69a4724bf0aa188efc10d30eb3", - "m_Properties": [], - "m_Keywords": [], - "m_Dropdowns": [], - "m_CategoryData": [ - { - "m_Id": "c63878e1b35d42ae9c76498b64a00c7e" - } - ], - "m_Nodes": [ - { - "m_Id": "4539338eb9944d1aaec9d0d433819907" - }, - { - "m_Id": "e90cf50102b54f8987f51b0010f38ee5" - }, - { - "m_Id": "c5cafa5874d547a99ead30de99f7317f" - }, - { - "m_Id": "013f5d180c044dea8728c394175d252b" - }, - { - "m_Id": "e1efc62e205b432fa9757cbcf6e22867" - }, - { - "m_Id": "f44f42f71b8841808d214756275cbde6" - } - ], - "m_GroupDatas": [], - "m_StickyNoteDatas": [], - "m_Edges": [ - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "013f5d180c044dea8728c394175d252b" - }, - "m_SlotId": 3 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "4539338eb9944d1aaec9d0d433819907" - }, - "m_SlotId": 0 - } - }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "c5cafa5874d547a99ead30de99f7317f" - }, - "m_SlotId": 2 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "013f5d180c044dea8728c394175d252b" - }, - "m_SlotId": 0 - } - }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "e1efc62e205b432fa9757cbcf6e22867" - }, - "m_SlotId": 3 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "013f5d180c044dea8728c394175d252b" - }, - "m_SlotId": 2 - } - }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "f44f42f71b8841808d214756275cbde6" - }, - "m_SlotId": 0 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "013f5d180c044dea8728c394175d252b" - }, - "m_SlotId": 1 - } - } - ], - "m_VertexContext": { - "m_Position": { - "x": 0.0, - "y": 0.0 - }, - "m_Blocks": [] - }, - "m_FragmentContext": { - "m_Position": { - "x": 0.0, - "y": 200.0 - }, - "m_Blocks": [ - { - "m_Id": "4539338eb9944d1aaec9d0d433819907" - }, - { - "m_Id": "e90cf50102b54f8987f51b0010f38ee5" - } - ] - }, - "m_PreviewData": { - "serializedMesh": { - "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", - "m_Guid": "" - }, - "preventRotation": false - }, - "m_Path": "Hidden/Shader", - "m_GraphPrecision": 1, - "m_PreviewMode": 2, - "m_OutputNode": { - "m_Id": "" - }, - "m_ActiveTargets": [ - { - "m_Id": "3d091b47fadb4e8a9c2aad6238b33095" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.LerpNode", - "m_ObjectId": "013f5d180c044dea8728c394175d252b", - "m_Group": { - "m_Id": "" - }, - "m_Name": "Lerp", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -268.0, - "y": 184.0, - "width": 208.0, - "height": 326.0 - } - }, - "m_Slots": [ - { - "m_Id": "5f6d5723672d493698d91cf1dbb57bf6" - }, - { - "m_Id": "15013ee06c1a4f448456ad235ecc8c7d" - }, - { - "m_Id": "c87a9a1280a640a485ef19ad6e8a3ccb" - }, - { - "m_Id": "2cdeea3c45a646549d467f2fbc5e29db" - } - ], - "synonyms": [ - "mix", - "blend", - "linear interpolate" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "0608a34f0e8e42f5aa4d7468ceea92f8", - "m_Id": 0, - "m_DisplayName": "Base Color", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "BaseColor", - "m_StageCapability": 2, - "m_Value": { - "x": 0.5, - "y": 0.5, - "z": 0.5 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.5, - "g": 0.5, - "b": 0.5, - "a": 1.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "06a34c6f05474ed68ff5be7ab72fa191", - "m_Id": 4, - "m_DisplayName": "Cells", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Cells", - "m_StageCapability": 3, - "m_Value": 0.0, - "m_DefaultValue": 0.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", - "m_ObjectId": "15013ee06c1a4f448456ad235ecc8c7d", - "m_Id": 1, - "m_DisplayName": "B", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "B", - "m_StageCapability": 3, - "m_Value": { - "x": 1.0, - "y": 1.0, - "z": 1.0, - "w": 1.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBAMaterialSlot", - "m_ObjectId": "1a429df3dd3b4e97a004e3081afa0310", - "m_Id": 2, - "m_DisplayName": "Output", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Output", - "m_StageCapability": 2, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 1.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", - "m_ObjectId": "2cdeea3c45a646549d467f2fbc5e29db", - "m_Id": 3, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", - "m_ObjectId": "3bbe6e477c624722824d76634c5b3b62", - "m_Id": 0, - "m_DisplayName": "UV", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "UV", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0 - }, - "m_Labels": [], - "m_Channel": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", - "m_ObjectId": "3d091b47fadb4e8a9c2aad6238b33095", - "m_ActiveSubTarget": { - "m_Id": "fad52e6a52d24397a17595434f776c36" - }, - "m_Datas": [ - { - "m_Id": "a281e25b4dbe47f6bfffc42ac0349284" - } - ], - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "4539338eb9944d1aaec9d0d433819907", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.BaseColor", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "0608a34f0e8e42f5aa4d7468ceea92f8" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.BaseColor" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "5077f03958554725864fffd16aa502ed", - "m_Id": 3, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": 0.0, - "m_DefaultValue": 0.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", - "m_ObjectId": "5f6d5723672d493698d91cf1dbb57bf6", - "m_Id": 0, - "m_DisplayName": "A", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "A", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", - "m_ObjectId": "6332ca2634674fd0b2bcb47f45ac602b", - "m_Id": 0, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "6e711cd584d84ceda59a57c7e59aa773", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 1.0, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", - "m_ObjectId": "a281e25b4dbe47f6bfffc42ac0349284", - "m_Version": 0, - "m_fullscreenMode": 0, - "m_BlendMode": 0, - "m_SrcColorBlendMode": 0, - "m_DstColorBlendMode": 1, - "m_ColorBlendOperation": 0, - "m_SrcAlphaBlendMode": 0, - "m_DstAlphaBlendMode": 1, - "m_AlphaBlendOperation": 0, - "m_EnableStencil": false, - "m_StencilReference": 0, - "m_StencilReadMask": 255, - "m_StencilWriteMask": 255, - "m_StencilCompareFunction": 8, - "m_StencilPassOperation": 0, - "m_StencilFailOperation": 0, - "m_StencilDepthFailOperation": 0, - "m_DepthWrite": false, - "m_AllowMaterialOverride": false, - "m_DepthTestMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "a6f517f9fbc942a6a7f81cdc834727c9", - "m_Id": 2, - "m_DisplayName": "CellDensity", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "CellDensity", - "m_StageCapability": 3, - "m_Value": 5.0, - "m_DefaultValue": 5.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", - "m_ObjectId": "c58e113a9095416e825c4e109ce5512b", - "m_Id": 3, - "m_DisplayName": "Sampler", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Sampler", - "m_StageCapability": 3, - "m_BareResource": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.HDSampleBufferNode", - "m_ObjectId": "c5cafa5874d547a99ead30de99f7317f", - "m_Group": { - "m_Id": "" - }, - "m_Name": "HD Sample Buffer", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -871.0, - "y": 32.0, - "width": 208.0, - "height": 337.0 - } - }, - "m_Slots": [ - { - "m_Id": "f4fe1d444c9144519d21f41fbf6dcd0e" - }, - { - "m_Id": "c58e113a9095416e825c4e109ce5512b" - }, - { - "m_Id": "1a429df3dd3b4e97a004e3081afa0310" - } - ], - "synonyms": [ - "normal", - "motion vector", - "roughness", - "postprocessinput", - "blit" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_BufferType": 3 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CategoryData", - "m_ObjectId": "c63878e1b35d42ae9c76498b64a00c7e", - "m_Name": "", - "m_ChildObjectList": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", - "m_ObjectId": "c87a9a1280a640a485ef19ad6e8a3ccb", - "m_Id": 2, - "m_DisplayName": "T", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "T", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - } -} - -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.ShaderGraph.VoronoiNode", - "m_ObjectId": "e1efc62e205b432fa9757cbcf6e22867", - "m_Group": { - "m_Id": "" - }, - "m_Name": "Voronoi", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -644.0, - "y": 464.0, - "width": 208.0, - "height": 361.0 - } - }, - "m_Slots": [ - { - "m_Id": "3bbe6e477c624722824d76634c5b3b62" - }, - { - "m_Id": "f88836064ac348229765560de542ed33" - }, - { - "m_Id": "a6f517f9fbc942a6a7f81cdc834727c9" - }, - { - "m_Id": "5077f03958554725864fffd16aa502ed" - }, - { - "m_Id": "06a34c6f05474ed68ff5be7ab72fa191" - } - ], - "synonyms": [ - "worley noise" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_HashType": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "e90cf50102b54f8987f51b0010f38ee5", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "6e711cd584d84ceda59a57c7e59aa773" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.ShaderGraph.ColorNode", - "m_ObjectId": "f44f42f71b8841808d214756275cbde6", - "m_Group": { - "m_Id": "" - }, - "m_Name": "Color", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -572.0, - "y": 226.0, - "width": 208.0, - "height": 127.0 - } - }, - "m_Slots": [ - { - "m_Id": "6332ca2634674fd0b2bcb47f45ac602b" - } - ], - "synonyms": [ - "rgba" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_Color": { - "color": { - "r": 1.0, - "g": 0.0, - "b": 0.0, - "a": 0.0 - }, - "mode": 0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ScreenPositionMaterialSlot", - "m_ObjectId": "f4fe1d444c9144519d21f41fbf6dcd0e", - "m_Id": 0, - "m_DisplayName": "UV", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "UV", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [], - "m_ScreenSpaceType": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "f88836064ac348229765560de542ed33", - "m_Id": 1, - "m_DisplayName": "AngleOffset", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "AngleOffset", - "m_StageCapability": 3, - "m_Value": 2.0, - "m_DefaultValue": 2.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDFullscreenSubTarget", - "m_ObjectId": "fad52e6a52d24397a17595434f776c36" -} - diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph.meta deleted file mode 100644 index 4b9c850105d..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 68ecd3a7cbfa3cc4abea2d7e6294ff07 -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph deleted file mode 100644 index 8f02bacf237..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph +++ /dev/null @@ -1,667 +0,0 @@ -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.GraphData", - "m_ObjectId": "f12efad63e7944738f0a0d1c6c721728", - "m_Properties": [], - "m_Keywords": [], - "m_Dropdowns": [], - "m_CategoryData": [ - { - "m_Id": "aacacdf2c25c45de9a0257008efe3d54" - } - ], - "m_Nodes": [ - { - "m_Id": "961fb8e544cb44689ccdfe5180f7b0a1" - }, - { - "m_Id": "eef9625d161d447a88f2209c7ef721f7" - }, - { - "m_Id": "f73319e1a9e44e438ac204585fd3fd19" - }, - { - "m_Id": "d93a15285fbb4584b136c3ccec463f63" - }, - { - "m_Id": "ec6878aa5cda46e4b3b38668e2356df3" - } - ], - "m_GroupDatas": [], - "m_StickyNoteDatas": [], - "m_Edges": [ - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "d93a15285fbb4584b136c3ccec463f63" - }, - "m_SlotId": 4 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "961fb8e544cb44689ccdfe5180f7b0a1" - }, - "m_SlotId": 0 - } - }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "ec6878aa5cda46e4b3b38668e2356df3" - }, - "m_SlotId": 1 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "d93a15285fbb4584b136c3ccec463f63" - }, - "m_SlotId": 2 - } - }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "f73319e1a9e44e438ac204585fd3fd19" - }, - "m_SlotId": 2 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "d93a15285fbb4584b136c3ccec463f63" - }, - "m_SlotId": 1 - } - }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "f73319e1a9e44e438ac204585fd3fd19" - }, - "m_SlotId": 2 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "ec6878aa5cda46e4b3b38668e2356df3" - }, - "m_SlotId": 0 - } - } - ], - "m_VertexContext": { - "m_Position": { - "x": 0.0, - "y": 0.0 - }, - "m_Blocks": [] - }, - "m_FragmentContext": { - "m_Position": { - "x": 0.0, - "y": 200.0 - }, - "m_Blocks": [ - { - "m_Id": "961fb8e544cb44689ccdfe5180f7b0a1" - }, - { - "m_Id": "eef9625d161d447a88f2209c7ef721f7" - } - ] - }, - "m_PreviewData": { - "serializedMesh": { - "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", - "m_Guid": "" - }, - "preventRotation": false - }, - "m_Path": "Hidden/Shader", - "m_GraphPrecision": 1, - "m_PreviewMode": 2, - "m_OutputNode": { - "m_Id": "" - }, - "m_ActiveTargets": [ - { - "m_Id": "852a43cc1ff84236a75a104cec963d00" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", - "m_ObjectId": "12ebd31ba71a4377a2e6e2603bf6423f", - "m_Id": 1, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "1f918b9180094349affefb0c3132b1c0", - "m_Id": 0, - "m_DisplayName": "Base Color", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "BaseColor", - "m_StageCapability": 2, - "m_Value": { - "x": 0.5, - "y": 0.5, - "z": 0.5 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.5, - "g": 0.5, - "b": 0.5, - "a": 1.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", - "m_ObjectId": "852a43cc1ff84236a75a104cec963d00", - "m_ActiveSubTarget": { - "m_Id": "de52b54235ce47088b157aadbe7b83cf" - }, - "m_Datas": [ - { - "m_Id": "abdd244394974bf7b5692147e028382c" - } - ], - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "961fb8e544cb44689ccdfe5180f7b0a1", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.BaseColor", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "1f918b9180094349affefb0c3132b1c0" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.BaseColor" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "9f965ce9f17d4cdea57a5a58b1f90b8f", - "m_Id": 1, - "m_DisplayName": "Color A", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "ColorA", - "m_StageCapability": 3, - "m_Value": { - "x": 0.20000000298023225, - "y": 0.20000000298023225, - "z": 0.20000000298023225 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.20000000298023225, - "g": 0.20000000298023225, - "b": 0.20000000298023225, - "a": 1.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", - "m_ObjectId": "a02cc3283f1e47d1b293b95caa3cca1e", - "m_Id": 0, - "m_DisplayName": "In", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "In", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CategoryData", - "m_ObjectId": "aacacdf2c25c45de9a0257008efe3d54", - "m_Name": "", - "m_ChildObjectList": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", - "m_ObjectId": "abdd244394974bf7b5692147e028382c", - "m_Version": 0, - "m_fullscreenMode": 0, - "m_BlendMode": 0, - "m_SrcColorBlendMode": 0, - "m_DstColorBlendMode": 1, - "m_ColorBlendOperation": 0, - "m_SrcAlphaBlendMode": 0, - "m_DstAlphaBlendMode": 1, - "m_AlphaBlendOperation": 0, - "m_EnableStencil": false, - "m_StencilReference": 0, - "m_StencilReadMask": 255, - "m_StencilWriteMask": 255, - "m_StencilCompareFunction": 8, - "m_StencilPassOperation": 0, - "m_StencilFailOperation": 0, - "m_StencilDepthFailOperation": 0, - "m_DepthWrite": false, - "m_AllowMaterialOverride": false, - "m_DepthTestMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ScreenPositionMaterialSlot", - "m_ObjectId": "b262c2e6f7ff4e3aa4caa3ff679dcbbb", - "m_Id": 0, - "m_DisplayName": "UV", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "UV", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [], - "m_ScreenSpaceType": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "b6b6d72a669a4734bda6a9d793be6f5d", - "m_Id": 2, - "m_DisplayName": "Color B", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "ColorB", - "m_StageCapability": 3, - "m_Value": { - "x": 0.699999988079071, - "y": 0.699999988079071, - "z": 0.699999988079071 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.699999988079071, - "g": 0.699999988079071, - "b": 0.699999988079071, - "a": 1.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", - "m_ObjectId": "baacb8ee40f842bf8049ea7d51ee8bed", - "m_Id": 4, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 2, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBAMaterialSlot", - "m_ObjectId": "c24aa6ff2bf0427b9eeebb7ef189d484", - "m_Id": 2, - "m_DisplayName": "Output", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Output", - "m_StageCapability": 2, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 1.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CheckerboardNode", - "m_ObjectId": "d93a15285fbb4584b136c3ccec463f63", - "m_Group": { - "m_Id": "" - }, - "m_Name": "Checkerboard", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -307.0, - "y": 190.0, - "width": 208.0, - "height": 350.0 - } - }, - "m_Slots": [ - { - "m_Id": "e2020a28082b4fe3859c0a7fd537d90b" - }, - { - "m_Id": "9f965ce9f17d4cdea57a5a58b1f90b8f" - }, - { - "m_Id": "b6b6d72a669a4734bda6a9d793be6f5d" - }, - { - "m_Id": "eb4bfb404b374edb95a3853f196f6828" - }, - { - "m_Id": "baacb8ee40f842bf8049ea7d51ee8bed" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDFullscreenSubTarget", - "m_ObjectId": "de52b54235ce47088b157aadbe7b83cf" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", - "m_ObjectId": "e2020a28082b4fe3859c0a7fd537d90b", - "m_Id": 0, - "m_DisplayName": "UV", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "UV", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0 - }, - "m_Labels": [], - "m_Channel": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "e2c12797a1ed47b9b082544806187dc4", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 1.0, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", - "m_ObjectId": "eb4bfb404b374edb95a3853f196f6828", - "m_Id": 3, - "m_DisplayName": "Frequency", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Frequency", - "m_StageCapability": 3, - "m_Value": { - "x": 4.0, - "y": 4.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.InvertColorsNode", - "m_ObjectId": "ec6878aa5cda46e4b3b38668e2356df3", - "m_Group": { - "m_Id": "" - }, - "m_Name": "Invert Colors", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -673.0, - "y": 299.0, - "width": 208.0, - "height": 391.0 - } - }, - "m_Slots": [ - { - "m_Id": "a02cc3283f1e47d1b293b95caa3cca1e" - }, - { - "m_Id": "12ebd31ba71a4377a2e6e2603bf6423f" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_RedChannel": true, - "m_GreenChannel": true, - "m_BlueChannel": true -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "eef9625d161d447a88f2209c7ef721f7", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "e2c12797a1ed47b9b082544806187dc4" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.HDSampleBufferNode", - "m_ObjectId": "f73319e1a9e44e438ac204585fd3fd19", - "m_Group": { - "m_Id": "" - }, - "m_Name": "HD Sample Buffer", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -934.0, - "y": 32.0, - "width": 208.0, - "height": 337.0 - } - }, - "m_Slots": [ - { - "m_Id": "b262c2e6f7ff4e3aa4caa3ff679dcbbb" - }, - { - "m_Id": "fc75ad78bad84a54a208e748b668e101" - }, - { - "m_Id": "c24aa6ff2bf0427b9eeebb7ef189d484" - } - ], - "synonyms": [ - "normal", - "motion vector", - "roughness", - "postprocessinput", - "blit" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_BufferType": 3 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", - "m_ObjectId": "fc75ad78bad84a54a208e748b668e101", - "m_Id": 3, - "m_DisplayName": "Sampler", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Sampler", - "m_StageCapability": 3, - "m_BareResource": false -} - diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph.meta deleted file mode 100644 index 71b726e0baf..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: b93fd7318812cc446a48a5a0d1875be0 -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture deleted file mode 100644 index 27ebc2c7440..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 8210_CustomPass 1 - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 256 - m_Height: 256 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 94 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture.meta deleted file mode 100644 index 85ce9c6f6a9..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 1.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3407c6b0b9a7c44499e4c81b9c33af7f -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture deleted file mode 100644 index 04736cb0acb..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 8210_CustomPass 2 - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 256 - m_Height: 256 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 94 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture.meta deleted file mode 100644 index 0f07579ee66..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 2.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 191dad7e57423184c9e8fad7ba8f538c -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture deleted file mode 100644 index 49c01f7c4dc..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 8210_CustomPass 3 - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 256 - m_Height: 256 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 94 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture.meta deleted file mode 100644 index 7f7e16dcba9..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass 3.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c79d38983ea97334bb8aa8b585dab4be -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture deleted file mode 100644 index 065575fac22..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 8210_CustomPass - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 256 - m_Height: 256 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 94 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture.meta deleted file mode 100644 index cbfb63d9ffb..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPass.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 81cc8443e3680df44941ccad58929bd1 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset deleted file mode 100644 index 8b893a37bb6..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset +++ /dev/null @@ -1,32 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} - m_Name: Box Volume Profile 1 - m_EditorClassIdentifier: - components: - - {fileID: 5240125479004600927} ---- !u!114 &5240125479004600927 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2f9dd64b6dbf76048b216111e4f09d56, type: 3} - m_Name: CustomPP2_8210 - m_EditorClassIdentifier: - active: 1 - intensity: - m_OverrideState: 1 - m_Value: 0.42 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset.meta deleted file mode 100644 index f6dbe536d3d..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile 1.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0c3cded045726c7448fe6c99b1bf862e -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset deleted file mode 100644 index f1a2a993dbf..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset +++ /dev/null @@ -1,32 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &-8413721414879348707 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 23386e31f132b9a4193c8dcb283de34c, type: 3} - m_Name: CustomPP1_8210 - m_EditorClassIdentifier: - active: 1 - intensity: - m_OverrideState: 1 - m_Value: 0.373 ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} - m_Name: Box Volume Profile - m_EditorClassIdentifier: - components: - - {fileID: -8413721414879348707} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset.meta deleted file mode 100644 index e96ccf748a1..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Box Volume Profile.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: bf36097b78501e54d9bc23dc066be831 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs deleted file mode 100644 index 6f5940eb31b..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs +++ /dev/null @@ -1,43 +0,0 @@ -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.Rendering.HighDefinition; -using System; - -[Serializable, VolumeComponentMenu("Post-processing/Custom/8210_CustomPP1")] -public sealed class CustomPP1_8210 : CustomPostProcessVolumeComponent, IPostProcessComponent -{ - [Tooltip("Controls the intensity of the effect.")] - public ClampedFloatParameter intensity = new ClampedFloatParameter(0f, 0f, 1f); - - Material m_Material; - - public bool IsActive() => m_Material != null && intensity.value > 0f; - - // Do not forget to add this post process in the Custom Post Process Orders list (Project Settings > Graphics > HDRP Settings). - public override CustomPostProcessInjectionPoint injectionPoint => CustomPostProcessInjectionPoint.BeforePostProcess; - - const string kShaderName = "Hidden/Shader/8210_CustomPP1"; - - public override void Setup() - { - if (Shader.Find(kShaderName) != null) - m_Material = new Material(Shader.Find(kShaderName)); - else - Debug.LogError($"Unable to find shader '{kShaderName}'. Post Process Volume 8210_CustomPP1 is unable to load."); - } - - public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination) - { - if (m_Material == null) - return; - - m_Material.SetFloat("_Intensity", intensity.value); - m_Material.SetTexture("_MainTex", source); - HDUtils.DrawFullScreen(cmd, m_Material, destination, shaderPassId: 0); - } - - public override void Cleanup() - { - CoreUtils.Destroy(m_Material); - } -} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs.meta deleted file mode 100644 index fd9a919b2b2..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP1_8210.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 23386e31f132b9a4193c8dcb283de34c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs deleted file mode 100644 index 83a8fced32f..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs +++ /dev/null @@ -1,43 +0,0 @@ -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.Rendering.HighDefinition; -using System; - -[Serializable, VolumeComponentMenu("Post-processing/Custom/8210_CustomPP2")] -public sealed class CustomPP2_8210 : CustomPostProcessVolumeComponent, IPostProcessComponent -{ - [Tooltip("Controls the intensity of the effect.")] - public ClampedFloatParameter intensity = new ClampedFloatParameter(0f, 0f, 1f); - - Material m_Material; - - public bool IsActive() => m_Material != null && intensity.value > 0f; - - // Do not forget to add this post process in the Custom Post Process Orders list (Project Settings > Graphics > HDRP Settings). - public override CustomPostProcessInjectionPoint injectionPoint => CustomPostProcessInjectionPoint.AfterPostProcess; - - const string kShaderName = "Hidden/Shader/8210_CustomPP2"; - - public override void Setup() - { - if (Shader.Find(kShaderName) != null) - m_Material = new Material(Shader.Find(kShaderName)); - else - Debug.LogError($"Unable to find shader '{kShaderName}'. Post Process Volume 8210_CustomPP2 is unable to load."); - } - - public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination) - { - if (m_Material == null) - return; - - m_Material.SetFloat("_Intensity", intensity.value); - m_Material.SetTexture("_MainTex", source); - HDUtils.DrawFullScreen(cmd, m_Material, destination, shaderPassId: 0); - } - - public override void Cleanup() - { - CoreUtils.Destroy(m_Material); - } -} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs.meta deleted file mode 100644 index 4aa34ad8ba1..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/CustomPP2_8210.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2f9dd64b6dbf76048b216111e4f09d56 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph deleted file mode 100644 index a7b45b63eec..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph +++ /dev/null @@ -1,350 +0,0 @@ -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.GraphData", - "m_ObjectId": "13880fa8dffe48cba4a5c3313c21a8dc", - "m_Properties": [ - { - "m_Id": "217e4a5440e645fe82c1020f27cb95c2" - } - ], - "m_Keywords": [], - "m_Dropdowns": [], - "m_CategoryData": [ - { - "m_Id": "ab5f43c3048a40b6837184b272f51d9f" - } - ], - "m_Nodes": [ - { - "m_Id": "9f169391d1f640c6a128f456cbb3569a" - }, - { - "m_Id": "5aa3a723b0434c2ba571daf3917a1a71" - }, - { - "m_Id": "45ddc44fc2a64bfa973bcfd7d91eecc1" - } - ], - "m_GroupDatas": [], - "m_StickyNoteDatas": [], - "m_Edges": [ - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "45ddc44fc2a64bfa973bcfd7d91eecc1" - }, - "m_SlotId": 0 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "9f169391d1f640c6a128f456cbb3569a" - }, - "m_SlotId": 0 - } - } - ], - "m_VertexContext": { - "m_Position": { - "x": 6.0, - "y": -25.0 - }, - "m_Blocks": [] - }, - "m_FragmentContext": { - "m_Position": { - "x": 6.0, - "y": 199.0 - }, - "m_Blocks": [ - { - "m_Id": "9f169391d1f640c6a128f456cbb3569a" - }, - { - "m_Id": "5aa3a723b0434c2ba571daf3917a1a71" - } - ] - }, - "m_PreviewData": { - "serializedMesh": { - "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", - "m_Guid": "" - }, - "preventRotation": false - }, - "m_Path": "Shader Graphs", - "m_GraphPrecision": 1, - "m_PreviewMode": 2, - "m_OutputNode": { - "m_Id": "" - }, - "m_ActiveTargets": [ - { - "m_Id": "01bc0014188c4e85a8af99eebc813df9" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", - "m_ObjectId": "01bc0014188c4e85a8af99eebc813df9", - "m_ActiveSubTarget": { - "m_Id": "05fb73653a674a58b09fbbd6365d41bd" - }, - "m_Datas": [ - { - "m_Id": "037820170d9c456b98cc7756fbef0302" - } - ], - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", - "m_ObjectId": "037820170d9c456b98cc7756fbef0302", - "m_Version": 0, - "m_fullscreenMode": 0, - "m_BlendMode": 1, - "m_SrcColorBlendMode": 0, - "m_DstColorBlendMode": 10, - "m_ColorBlendOperation": 0, - "m_SrcAlphaBlendMode": 8, - "m_DstAlphaBlendMode": 9, - "m_AlphaBlendOperation": 4, - "m_EnableStencil": true, - "m_StencilReference": 0, - "m_StencilReadMask": 255, - "m_StencilWriteMask": 255, - "m_StencilCompareFunction": 3, - "m_StencilPassOperation": 0, - "m_StencilFailOperation": 0, - "m_StencilDepthFailOperation": 0, - "m_DepthWrite": false, - "m_AllowMaterialOverride": false, - "m_DepthTestMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDFullscreenSubTarget", - "m_ObjectId": "05fb73653a674a58b09fbbd6365d41bd" -} - -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", - "m_ObjectId": "217e4a5440e645fe82c1020f27cb95c2", - "m_Guid": { - "m_GuidSerialized": "fe74a077-ef1a-4c06-af5a-f3efe67146db" - }, - "m_Name": "Color", - "m_DefaultRefNameVersion": 1, - "m_RefNameGeneratedByDisplayName": "Color", - "m_DefaultReferenceName": "_Color", - "m_OverrideReferenceName": "", - "m_GeneratePropertyBlock": true, - "m_UseCustomSlotLabel": false, - "m_CustomSlotLabel": "", - "m_DismissedVersion": 0, - "m_Precision": 0, - "overrideHLSLDeclaration": false, - "hlslDeclarationOverride": 0, - "m_Hidden": false, - "m_Value": { - "r": 0.0, - "g": 0.05781888961791992, - "b": 1.0, - "a": 0.0 - }, - "isMainColor": false, - "m_ColorMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.PropertyNode", - "m_ObjectId": "45ddc44fc2a64bfa973bcfd7d91eecc1", - "m_Group": { - "m_Id": "" - }, - "m_Name": "Property", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -194.0, - "y": 238.0, - "width": 105.0, - "height": 34.0 - } - }, - "m_Slots": [ - { - "m_Id": "63bc1cca8e8548e5937102c333c554fb" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_Property": { - "m_Id": "217e4a5440e645fe82c1020f27cb95c2" - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "5aa3a723b0434c2ba571daf3917a1a71", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "659056cc074b499faacae5d3d5cc1d4a" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", - "m_ObjectId": "63bc1cca8e8548e5937102c333c554fb", - "m_Id": 0, - "m_DisplayName": "Color", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "659056cc074b499faacae5d3d5cc1d4a", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 0.5, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "7f77e09be2d14ff08488f6a18c5cf3ae", - "m_Id": 0, - "m_DisplayName": "Base Color", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "BaseColor", - "m_StageCapability": 2, - "m_Value": { - "x": 0.5, - "y": 0.5, - "z": 0.5 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.5, - "g": 0.5, - "b": 0.5, - "a": 1.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "9f169391d1f640c6a128f456cbb3569a", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.BaseColor", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "7f77e09be2d14ff08488f6a18c5cf3ae" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.BaseColor" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CategoryData", - "m_ObjectId": "ab5f43c3048a40b6837184b272f51d9f", - "m_Name": "", - "m_ChildObjectList": [ - { - "m_Id": "217e4a5440e645fe82c1020f27cb95c2" - } - ] -} - diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph.meta deleted file mode 100644 index 70b17b28a50..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenBlue.shadergraph.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: b43d2018578f95441bc84313425fc48e -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph deleted file mode 100644 index cc0f8416603..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph +++ /dev/null @@ -1,397 +0,0 @@ -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.GraphData", - "m_ObjectId": "13880fa8dffe48cba4a5c3313c21a8dc", - "m_Properties": [ - { - "m_Id": "217e4a5440e645fe82c1020f27cb95c2" - } - ], - "m_Keywords": [], - "m_Dropdowns": [], - "m_CategoryData": [ - { - "m_Id": "ab5f43c3048a40b6837184b272f51d9f" - } - ], - "m_Nodes": [ - { - "m_Id": "9f169391d1f640c6a128f456cbb3569a" - }, - { - "m_Id": "5aa3a723b0434c2ba571daf3917a1a71" - }, - { - "m_Id": "7a72cdd297604f4c899a1c7888a7fa36" - } - ], - "m_GroupDatas": [], - "m_StickyNoteDatas": [], - "m_Edges": [ - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "7a72cdd297604f4c899a1c7888a7fa36" - }, - "m_SlotId": 2 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "9f169391d1f640c6a128f456cbb3569a" - }, - "m_SlotId": 0 - } - } - ], - "m_VertexContext": { - "m_Position": { - "x": 6.0, - "y": -25.0 - }, - "m_Blocks": [] - }, - "m_FragmentContext": { - "m_Position": { - "x": 6.0, - "y": 199.0 - }, - "m_Blocks": [ - { - "m_Id": "9f169391d1f640c6a128f456cbb3569a" - }, - { - "m_Id": "5aa3a723b0434c2ba571daf3917a1a71" - } - ] - }, - "m_PreviewData": { - "serializedMesh": { - "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", - "m_Guid": "" - }, - "preventRotation": false - }, - "m_Path": "Shader Graphs", - "m_GraphPrecision": 1, - "m_PreviewMode": 2, - "m_OutputNode": { - "m_Id": "" - }, - "m_ActiveTargets": [ - { - "m_Id": "01bc0014188c4e85a8af99eebc813df9" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", - "m_ObjectId": "01bc0014188c4e85a8af99eebc813df9", - "m_ActiveSubTarget": { - "m_Id": "05fb73653a674a58b09fbbd6365d41bd" - }, - "m_Datas": [ - { - "m_Id": "037820170d9c456b98cc7756fbef0302" - } - ], - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", - "m_ObjectId": "037820170d9c456b98cc7756fbef0302", - "m_Version": 0, - "m_fullscreenMode": 0, - "m_BlendMode": 1, - "m_SrcColorBlendMode": 0, - "m_DstColorBlendMode": 10, - "m_ColorBlendOperation": 0, - "m_SrcAlphaBlendMode": 8, - "m_DstAlphaBlendMode": 9, - "m_AlphaBlendOperation": 4, - "m_EnableStencil": true, - "m_StencilReference": 0, - "m_StencilReadMask": 255, - "m_StencilWriteMask": 255, - "m_StencilCompareFunction": 3, - "m_StencilPassOperation": 0, - "m_StencilFailOperation": 0, - "m_StencilDepthFailOperation": 0, - "m_DepthWrite": false, - "m_AllowMaterialOverride": false, - "m_DepthTestMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDFullscreenSubTarget", - "m_ObjectId": "05fb73653a674a58b09fbbd6365d41bd" -} - -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", - "m_ObjectId": "217e4a5440e645fe82c1020f27cb95c2", - "m_Guid": { - "m_GuidSerialized": "fe74a077-ef1a-4c06-af5a-f3efe67146db" - }, - "m_Name": "Color", - "m_DefaultRefNameVersion": 1, - "m_RefNameGeneratedByDisplayName": "Color", - "m_DefaultReferenceName": "_Color", - "m_OverrideReferenceName": "", - "m_GeneratePropertyBlock": true, - "m_UseCustomSlotLabel": false, - "m_CustomSlotLabel": "", - "m_DismissedVersion": 0, - "m_Precision": 0, - "overrideHLSLDeclaration": false, - "hlslDeclarationOverride": 0, - "m_Hidden": false, - "m_Value": { - "r": 0.0, - "g": 0.05781888961791992, - "b": 1.0, - "a": 0.0 - }, - "isMainColor": false, - "m_ColorMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "5aa3a723b0434c2ba571daf3917a1a71", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "659056cc074b499faacae5d3d5cc1d4a" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "659056cc074b499faacae5d3d5cc1d4a", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 0.5, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.HDSampleBufferNode", - "m_ObjectId": "7a72cdd297604f4c899a1c7888a7fa36", - "m_Group": { - "m_Id": "" - }, - "m_Name": "HD Sample Buffer", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -300.0, - "y": 199.0, - "width": 208.0, - "height": 337.0 - } - }, - "m_Slots": [ - { - "m_Id": "c5d53005f8b3462285b112c1d61b8257" - }, - { - "m_Id": "e35745a2b5f9435887ae45730aae129d" - }, - { - "m_Id": "ed24fd51c1a94fb78ca5f08074f50962" - } - ], - "synonyms": [ - "normal", - "motion vector", - "roughness", - "postprocessinput", - "blit" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_BufferType": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "7f77e09be2d14ff08488f6a18c5cf3ae", - "m_Id": 0, - "m_DisplayName": "Base Color", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "BaseColor", - "m_StageCapability": 2, - "m_Value": { - "x": 0.5, - "y": 0.5, - "z": 0.5 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.5, - "g": 0.5, - "b": 0.5, - "a": 1.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "9f169391d1f640c6a128f456cbb3569a", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.BaseColor", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "7f77e09be2d14ff08488f6a18c5cf3ae" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.BaseColor" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CategoryData", - "m_ObjectId": "ab5f43c3048a40b6837184b272f51d9f", - "m_Name": "", - "m_ChildObjectList": [ - { - "m_Id": "217e4a5440e645fe82c1020f27cb95c2" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ScreenPositionMaterialSlot", - "m_ObjectId": "c5d53005f8b3462285b112c1d61b8257", - "m_Id": 0, - "m_DisplayName": "UV", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "UV", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [], - "m_ScreenSpaceType": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", - "m_ObjectId": "e35745a2b5f9435887ae45730aae129d", - "m_Id": 3, - "m_DisplayName": "Sampler", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Sampler", - "m_StageCapability": 3, - "m_BareResource": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", - "m_ObjectId": "ed24fd51c1a94fb78ca5f08074f50962", - "m_Id": 2, - "m_DisplayName": "Output", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Output", - "m_StageCapability": 2, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [] -} - diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph.meta deleted file mode 100644 index d636a19f95d..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/FullscreenNodes.shadergraph.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 3cb6943ee49a9e04a968082a1670458f -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat deleted file mode 100644 index db32cb95ed2..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Shader Graphs_FullscreenBlue - m_Shader: {fileID: -6465566751694194690, guid: b43d2018578f95441bc84313425fc48e, - type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: [] - m_Colors: - - _Color: {r: 0, g: 0.057818867, b: 1, a: 0} - m_BuildTextureStacks: [] diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat.meta deleted file mode 100644 index af49afa4aa0..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenBlue.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cc414eed9437dd448a39710650d4fdf2 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat deleted file mode 100644 index 1bfd06b0c38..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Shader Graphs_FullscreenNodes - m_Shader: {fileID: -6465566751694194690, guid: 3cb6943ee49a9e04a968082a1670458f, - type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: [] - m_Colors: - - _Color: {r: 0, g: 0.057818867, b: 1, a: 0} - m_BuildTextureStacks: [] diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat.meta deleted file mode 100644 index 652ab4c3730..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Shader Graphs_FullscreenNodes.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 157adb0fd668aa64e972a92e0d0df1b6 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset deleted file mode 100644 index eba76a2df42..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset +++ /dev/null @@ -1,255 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} - m_Name: Sky and Fog Global Volume Profile - m_EditorClassIdentifier: - components: - - {fileID: 4586809243592799487} - - {fileID: 4056967756894766036} - - {fileID: 1717160586251760895} ---- !u!114 &1717160586251760895 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2d08ce26990eb1a4a9177b860541e702, type: 3} - m_Name: Exposure - m_EditorClassIdentifier: - active: 1 - mode: - m_OverrideState: 1 - m_Value: 0 - meteringMode: - m_OverrideState: 0 - m_Value: 2 - luminanceSource: - m_OverrideState: 0 - m_Value: 1 - fixedExposure: - m_OverrideState: 1 - m_Value: 0 - compensation: - m_OverrideState: 0 - m_Value: 0 - limitMin: - m_OverrideState: 0 - m_Value: -1 - limitMax: - m_OverrideState: 0 - m_Value: 14 - curveMap: - m_OverrideState: 0 - m_Value: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: -10 - value: -10 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 20 - value: 20 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - limitMinCurveMap: - m_OverrideState: 0 - m_Value: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: -10 - value: -12 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 20 - value: 18 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - limitMaxCurveMap: - m_OverrideState: 0 - m_Value: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: -10 - value: -8 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 20 - value: 22 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - adaptationMode: - m_OverrideState: 0 - m_Value: 1 - adaptationSpeedDarkToLight: - m_OverrideState: 0 - m_Value: 3 - adaptationSpeedLightToDark: - m_OverrideState: 0 - m_Value: 1 - weightTextureMask: - m_OverrideState: 0 - m_Value: {fileID: 0} - histogramPercentages: - m_OverrideState: 0 - m_Value: {x: 40, y: 90} - histogramUseCurveRemapping: - m_OverrideState: 0 - m_Value: 0 - targetMidGray: - m_OverrideState: 0 - m_Value: 0 - centerAroundExposureTarget: - m_OverrideState: 0 - m_Value: 0 - proceduralCenter: - m_OverrideState: 0 - m_Value: {x: 0.5, y: 0.5} - proceduralRadii: - m_OverrideState: 0 - m_Value: {x: 0.3, y: 0.3} - maskMinIntensity: - m_OverrideState: 0 - m_Value: -30 - maskMaxIntensity: - m_OverrideState: 0 - m_Value: 30 - proceduralSoftness: - m_OverrideState: 0 - m_Value: 0.5 ---- !u!114 &4056967756894766036 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0d7593b3a9277ac4696b20006c21dde2, type: 3} - m_Name: VisualEnvironment - m_EditorClassIdentifier: - active: 1 - skyType: - m_OverrideState: 1 - m_Value: 3 - cloudType: - m_OverrideState: 1 - m_Value: 0 - skyAmbientMode: - m_OverrideState: 1 - m_Value: 1 - windOrientation: - m_OverrideState: 1 - m_Value: 0 - windSpeed: - m_OverrideState: 1 - m_Value: 100 - fogType: - m_OverrideState: 1 - m_Value: 0 ---- !u!114 &4586809243592799487 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a81bcacc415a1f743bfdf703afc52027, type: 3} - m_Name: GradientSky - m_EditorClassIdentifier: - active: 1 - rotation: - m_OverrideState: 1 - m_Value: 0 - skyIntensityMode: - m_OverrideState: 1 - m_Value: 0 - exposure: - m_OverrideState: 1 - m_Value: 0 - multiplier: - m_OverrideState: 1 - m_Value: 1 - upperHemisphereLuxValue: - m_OverrideState: 1 - m_Value: 1 - upperHemisphereLuxColor: - m_OverrideState: 1 - m_Value: {x: 0, y: 0, z: 0} - desiredLuxValue: - m_OverrideState: 1 - m_Value: 20000 - updateMode: - m_OverrideState: 1 - m_Value: 0 - updatePeriod: - m_OverrideState: 1 - m_Value: 0 - includeSunInBaking: - m_OverrideState: 1 - m_Value: 0 - top: - m_OverrideState: 1 - m_Value: {r: 0, g: 0, b: 0, a: 1} - middle: - m_OverrideState: 1 - m_Value: {r: 0, g: 0, b: 0, a: 1} - bottom: - m_OverrideState: 1 - m_Value: {r: 0, g: 0, b: 0, a: 1} - gradientDiffusion: - m_OverrideState: 1 - m_Value: 1 diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset.meta b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset.meta deleted file mode 100644 index c97221d4eec..00000000000 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/Sky and Fog Global Volume Profile.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: bf5eb914dbdcd2f4288904fda1f02f12 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset b/TestProjects/HDRP_Tests/Assets/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset index 3db20513ccf..f2c26454a37 100644 --- a/TestProjects/HDRP_Tests/Assets/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset +++ b/TestProjects/HDRP_Tests/Assets/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset @@ -67,14 +67,12 @@ MonoBehaviour: - GreenPP, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null beforePostProcessCustomPostProcesses: - RedPP, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - CustomPP1_8210, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null afterPostProcessBlursCustomPostProcesses: - AfterPPBlurs, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null afterPostProcessCustomPostProcesses: - BluePP, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - CustomPostProcessMotionVector, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - CustomPP2_8210, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null beforeTAACustomPostProcesses: - DepthTAA, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null lightLayerName0: Light Layer default @@ -116,10 +114,7 @@ MonoBehaviour: useDLSSCustomProjectId: 0 supportProbeVolumes: 0 supportRuntimeDebugDisplay: 0 - apvScenesData: + apvScenesBounds: serializedBounds: [] serializedHasVolumes: [] - serializedProfiles: [] - serializedBakeSettings: [] - serializedBakingSets: [] m_Version: 3 diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png deleted file mode 100644 index 4b5ae66d2b8..00000000000 --- a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0953af27454fe3424cc02bee4274b708f2dc29307462f52d3e7a55c09962d99a -size 26842 diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png.meta b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png.meta deleted file mode 100644 index a667f4c026e..00000000000 --- a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/8210_Fullscreen.png.meta +++ /dev/null @@ -1,110 +0,0 @@ -fileFormatVersion: 2 -guid: 12ee177f4384e3249a7f7c73a76faf74 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 1 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMasterTextureLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 0 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 3 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 0 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - nameFileIdTable: {} - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/Temp.meta b/TestProjects/HDRP_Tests/Assets/Temp.meta deleted file mode 100644 index 402d88af911..00000000000 --- a/TestProjects/HDRP_Tests/Assets/Temp.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0b8f8b243c34f0c45bdb910737c5297b -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset b/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset index 5aedee96238..6ab3080e50f 100644 --- a/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset +++ b/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset @@ -704,9 +704,6 @@ EditorBuildSettings: - enabled: 1 path: Assets/GraphicTests/Scenes/8x_ShaderGraph/8209_CustomPassNodes.unity guid: beda2df19b812c944a26a77591f54588 - - enabled: 1 - path: Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen.unity - guid: 74b447ba1a6ee064fb7ebe7a6e56c62d - enabled: 1 path: Assets/GraphicTests/Scenes/9x_Other/9001_LODTransition.unity guid: b15315a1f9287fa4dac965a039b3b778 @@ -818,4 +815,4 @@ EditorBuildSettings: - enabled: 1 path: Assets/GraphicTests/Scenes/9x_Other/9910_GlobalMipBias.unity guid: 3f9d18568d46df044847954b624b6152 - m_configObjects: {} + From 8ca2925e8eff52ef0dd47d837fb475bae33c9f51 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 21 Oct 2021 19:18:30 +0200 Subject: [PATCH 050/108] Fixes for PR --- .../Targets/BuiltinFullscreenSubTarget.cs | 2 +- .../CustomRenderTexture/CustomRenderTextureTarget.cs | 8 -------- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 12 ++++++------ .../Targets/Fullscreen/Templates/ShaderPass.template | 1 - .../Fullscreen/Templates/SharedCode.template.hlsl | 1 - 5 files changed, 7 insertions(+), 17 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs index 96298f38ad0..d388ea8eb5b 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs @@ -9,7 +9,7 @@ namespace UnityEditor.Rendering.BuiltIn.ShaderGraph { class BuiltInFullscreenSubTarget : FullscreenSubTarget, IRequiresData { - static readonly GUID kSourceCodeGuid = new GUID("3107a8a084c35ab4cb765b37e0699ce3"); // BuiltInFullscreenSubTarget.cs // TODO + static readonly GUID kSourceCodeGuid = new GUID("3107a8a084c35ab4cb765b37e0699ce3"); // BuiltInFullscreenSubTarget.cs // In builtin there is no inverse view projection matrix, so we need to compute it in the vertex shader protected override string fullscreenDrawProceduralInclude => "Packages/com.unity.shadergraph/Editor/Generation/Targets/Builtin/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl"; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs index 4b0737e2d8c..f231fa89cd7 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs @@ -13,14 +13,6 @@ namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph { - [GenerateBlocks] - internal struct FullScreenBlocks - { - // TODO: use base color and alpha blocks - public static BlockFieldDescriptor colorBlock = new BlockFieldDescriptor(String.Empty, "Color", "Color", - new ColorRGBAControl(UnityEngine.Color.white), ShaderStage.Fragment); - } - sealed class CustomRenderTextureTarget : Target { // Constants diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs index f6ae849ad5f..3329a90f0d6 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -26,17 +26,17 @@ protected class Styles public static readonly GUIContent blendingMode = EditorGUIUtility.TrTextContent("Blending Mode", "Controls how the color of the Transparent surface blends with the Material color in the background."); public static readonly GUIContent srcColorBlendMode = EditorGUIUtility.TrTextContent("Src Color", - "TODO"); + "Describes how the input color will be blended."); public static readonly GUIContent dstColorBlendMode = EditorGUIUtility.TrTextContent("Dst Color", - "TODO"); + "Describes how the destination color will be blended."); public static readonly GUIContent colorBlendOperation = EditorGUIUtility.TrTextContent("Color Blend Op", - "TODO"); + "Tell which operation to use when blending the colors. Default is Add."); public static readonly GUIContent srcAlphaBlendMode = EditorGUIUtility.TrTextContent("Src Alpha", - "TODO"); + "Describes how the input alpha will be blended."); public static readonly GUIContent dstAlphaBlendMode = EditorGUIUtility.TrTextContent("Dst Alpha", - "TODO"); + "Describes how the input alpha will be blended."); public static readonly GUIContent alphaBlendOperation = EditorGUIUtility.TrTextContent("Alpha Blend Op", - "TODO"); + "Tell which operation to use when blending the alpha channel. Default is Add."); public static readonly GUIContent depthWrite = EditorGUIUtility.TrTextContent("Depth Write", "Controls whether the shader writes depth."); public static readonly GUIContent depthTest = EditorGUIUtility.TrTextContent("Depth Test", diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template index 8c4fda36803..8f53d860544 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template @@ -52,7 +52,6 @@ $Varyings.cullFace: #define VARYINGS_NEED_CULLFACE $features.graphVertex: #define FEATURES_GRAPH_VERTEX // Force depth texture because we need it for almost every nodes -// TODO: dependency system that triggers this define from position or view direction usage #define REQUIRE_DEPTH_TEXTURE $splice(PassInstancing) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index 246dd3d15ee..3f74a2f7ac7 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -3,7 +3,6 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) SurfaceDescriptionInputs output; ZERO_INITIALIZE(SurfaceDescriptionInputs, output); - // Normal is not available yet, TODO: add a node to sample the normal buffer if it exists float3 normalWS = float3(0, 0, 1); float4 tangentWS = float4(0, 1, 0, 0); // We can't access the tangent in screen space From a97842383e0191dc54950a15609e8c42a0be61d2 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 21 Oct 2021 19:43:45 +0200 Subject: [PATCH 051/108] Revert graphic tests because it relies on URP implementation --- .../ShaderGraph/ProjectSettings/EditorBuildSettings.asset | 3 --- 1 file changed, 3 deletions(-) diff --git a/TestProjects/ShaderGraph/ProjectSettings/EditorBuildSettings.asset b/TestProjects/ShaderGraph/ProjectSettings/EditorBuildSettings.asset index 4557bcf3062..9139c5b6b7c 100644 --- a/TestProjects/ShaderGraph/ProjectSettings/EditorBuildSettings.asset +++ b/TestProjects/ShaderGraph/ProjectSettings/EditorBuildSettings.asset @@ -47,7 +47,4 @@ EditorBuildSettings: - enabled: 1 path: Assets/Scenes/URP_InstancingTest.unity guid: 4229d44b837011e48b0f123903ea0ea5 - - enabled: 1 - path: Assets/Scenes/Fullscreen.unity - guid: 8b2856898c3f1cb43a36c7329bdbcc97 m_configObjects: {} From fdba94c2d0083511346b1ede148358d172cb71a1 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 21 Oct 2021 19:46:52 +0200 Subject: [PATCH 052/108] Revert graphic tests because it relies on URP implementation --- .../Direct3D11/None/Fullscreen.png | 3 - .../Direct3D11/None/Fullscreen.png.meta | 98 - .../ShaderGraph/Assets/Scenes/Fullscreen.meta | 8 - .../Assets/Scenes/Fullscreen.unity | 1742 ----------------- .../Assets/Scenes/Fullscreen.unity.meta | 7 - .../AlphaBlend_RT_Blit.renderTexture | 39 - .../AlphaBlend_RT_Blit.renderTexture.meta | 8 - ...AlphaBlend_RT_DrawProcedural.renderTexture | 39 - ...Blend_RT_DrawProcedural.renderTexture.meta | 8 - .../Fullscreen/Depth_RT_Blit.renderTexture | 39 - .../Depth_RT_Blit.renderTexture.meta | 8 - .../Depth_RT_DrawProcedural.renderTexture | 39 - ...Depth_RT_DrawProcedural.renderTexture.meta | 8 - .../Scenes/Fullscreen/FullscreenTests.cs | 61 - .../Scenes/Fullscreen/FullscreenTests.cs.meta | 11 - .../Fullscreen/Fullscreen_AlphaBlend.mat | 38 - .../Fullscreen/Fullscreen_AlphaBlend.mat.meta | 8 - .../Fullscreen_AlphaBlend.shadergraph | 409 ---- .../Fullscreen_AlphaBlend.shadergraph.meta | 10 - .../Scenes/Fullscreen/Fullscreen_Depth.mat | 38 - .../Fullscreen/Fullscreen_Depth.mat.meta | 8 - .../Fullscreen/Fullscreen_Depth.shadergraph | 392 ---- .../Fullscreen_Depth.shadergraph.meta | 10 - .../Fullscreen/Fullscreen_StencilTest.mat | 38 - .../Fullscreen_StencilTest.mat.meta | 8 - .../Fullscreen_StencilTest.shadergraph | 323 --- .../Fullscreen_StencilTest.shadergraph.meta | 10 - .../Fullscreen/Fullscreen_StencilWrite.mat | 38 - .../Fullscreen_StencilWrite.mat.meta | 8 - .../Fullscreen_StencilWrite.shadergraph | 329 ---- .../Fullscreen_StencilWrite.shadergraph.meta | 10 - .../Scenes/Fullscreen/Fullscreen_UV.mat | 38 - .../Scenes/Fullscreen/Fullscreen_UV.mat.meta | 8 - .../Fullscreen/Fullscreen_UV.shadergraph | 323 --- .../Fullscreen/Fullscreen_UV.shadergraph.meta | 10 - .../Fullscreen/Stencil_RT_Blit.renderTexture | 39 - .../Stencil_RT_Blit.renderTexture.meta | 8 - .../Stencil_RT_DrawProcedural.renderTexture | 39 - ...encil_RT_DrawProcedural.renderTexture.meta | 8 - .../Fullscreen/UV_RT_Blit.renderTexture | 39 - .../Fullscreen/UV_RT_Blit.renderTexture.meta | 8 - .../UV_RT_DrawProcedural.renderTexture | 39 - .../UV_RT_DrawProcedural.renderTexture.meta | 8 - 43 files changed, 4362 deletions(-) delete mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png delete mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture.meta delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture delete mode 100644 TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture.meta diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png deleted file mode 100644 index eba76015e39..00000000000 --- a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b936b49ea69ef35140c92c12d8f7cb4b07bd596be89302e6ec451bdcf316766 -size 15556 diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png.meta b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png.meta deleted file mode 100644 index 1de740dc7db..00000000000 --- a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/Fullscreen.png.meta +++ /dev/null @@ -1,98 +0,0 @@ -fileFormatVersion: 2 -guid: 2fae55da62af92e4ab0b7eb3ec8eb770 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 1 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMasterTextureLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 0 - wrapV: 0 - wrapW: 0 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 0 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 0 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 0 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - nameFileIdTable: {} - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.meta deleted file mode 100644 index 3dc882f5b5c..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 91a6e62db7716e84eb3fe8ab0fac5fe9 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity deleted file mode 100644 index 804ea334b6c..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity +++ /dev/null @@ -1,1742 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.12731749, g: 0.13414757, b: 0.1210787, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 4890085278179872738, guid: 2d1d7097c72e31b4a9d0603532ace997, - type: 2} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &54070874 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 54070875} - - component: {fileID: 54070877} - - component: {fileID: 54070876} - m_Layer: 5 - m_Name: AlphaBlend_RT_Blit - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &54070875 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 54070874} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &54070876 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 54070874} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: 679f03fd27b4ea84daee6912c06cf0e6, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &54070877 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 54070874} - m_CullTransparentMesh: 1 ---- !u!1 &125068266 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 125068267} - - component: {fileID: 125068268} - m_Layer: 0 - m_Name: Fullscreen Tests object - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &125068267 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 125068266} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.3705864, y: 0.60729027, z: 0.7232092} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &125068268 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 125068266} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2eab774764b045445b005fe774b06cc9, type: 3} - m_Name: - m_EditorClassIdentifier: - uv: {fileID: 2100000, guid: fbacff351499a1e488ba7f3de58ab149, type: 2} - uvRT1: {fileID: 8400000, guid: d8a0bc84cb05ecf4d98c26eaf44014e1, type: 2} - uvRT2: {fileID: 8400000, guid: 6d34677b3ea8c564fb1003dbbc77c5ae, type: 2} - viewDir: {fileID: 2100000, guid: 88e97b177ad297d4fabd641f0791ae05, type: 2} - viewDirRT1: {fileID: 8400000, guid: f1e9e309129785c47b9e3e3e987aab39, type: 2} - viewDirRT2: {fileID: 8400000, guid: 5e17aea4de9413448b83907916faeb01, type: 2} - alphaBlend: {fileID: 2100000, guid: b2719833af97256459e8e8f792c107e2, type: 2} - alphaBlendRT1: {fileID: 8400000, guid: 7b2abc9285711f147b44c1c60d87fddd, type: 2} - alphaBlendRT2: {fileID: 8400000, guid: 679f03fd27b4ea84daee6912c06cf0e6, type: 2} - stencilWrite: {fileID: 2100000, guid: 6a54bfdd467d98848b7282a9f5ace22c, type: 2} - stencilTest: {fileID: 2100000, guid: 1dd7d11c220392b4e9125411b966d253, type: 2} - stencilRT1: {fileID: 8400000, guid: 61857689904ba2e4db2e75a985f617ab, type: 2} - stencilRT2: {fileID: 8400000, guid: a564de6f1e0272b469ba5fd704880e5e, type: 2} ---- !u!1 &161488924 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 161488925} - - component: {fileID: 161488927} - - component: {fileID: 161488926} - m_Layer: 5 - m_Name: RawImage (13) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &161488925 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161488924} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 13 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &161488926 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161488924} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 0} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &161488927 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161488924} - m_CullTransparentMesh: 1 ---- !u!1 &206706240 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 206706241} - - component: {fileID: 206706243} - - component: {fileID: 206706242} - m_Layer: 5 - m_Name: RawImage (12) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &206706241 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 206706240} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 12 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &206706242 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 206706240} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 0} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &206706243 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 206706240} - m_CullTransparentMesh: 1 ---- !u!1 &276111445 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 276111446} - - component: {fileID: 276111448} - - component: {fileID: 276111447} - m_Layer: 5 - m_Name: UV_RT_DrawProcedural - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &276111446 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 276111445} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &276111447 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 276111445} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: d8a0bc84cb05ecf4d98c26eaf44014e1, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &276111448 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 276111445} - m_CullTransparentMesh: 1 ---- !u!1 &317833755 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 317833756} - - component: {fileID: 317833758} - - component: {fileID: 317833757} - m_Layer: 5 - m_Name: RawImage (11) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &317833756 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317833755} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 11 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &317833757 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317833755} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 0} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &317833758 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317833755} - m_CullTransparentMesh: 1 ---- !u!1 &338607173 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 338607174} - - component: {fileID: 338607176} - - component: {fileID: 338607175} - m_Layer: 5 - m_Name: AlphaBlend_RT_DrawProcedural - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &338607174 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 338607173} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &338607175 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 338607173} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: 7b2abc9285711f147b44c1c60d87fddd, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &338607176 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 338607173} - m_CullTransparentMesh: 1 ---- !u!1 &487053996 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 487053999} - - component: {fileID: 487053998} - - component: {fileID: 487053997} - - component: {fileID: 487054000} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &487053997 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 487053996} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7de28847c8d6a2f4b9e5e48e2f1e59aa, type: 3} - m_Name: - m_EditorClassIdentifier: - ImageComparisonSettings: - TargetWidth: 800 - TargetHeight: 800 - PerPixelCorrectnessThreshold: 0.00075 - PerPixelGammaThreshold: 0.003921569 - PerPixelAlphaThreshold: 0.003921569 - AverageCorrectnessThreshold: 0.0001 - IncorrectPixelsThreshold: 0.0000038146973 - UseHDR: 0 - UseBackBuffer: 0 - ImageResolution: 0 - ActiveImageTests: 1 - ActivePixelTests: 7 - WaitFrames: 0 ---- !u!20 &487053998 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 487053996} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 1 - orthographic size: 3 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &487053999 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 487053996} - m_LocalRotation: {x: 0.5, y: 0.5, z: -0.5, w: 0.5} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 90, y: 90, z: 0} ---- !u!114 &487054000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 487053996} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_RenderShadows: 1 - m_RequiresDepthTextureOption: 2 - m_RequiresOpaqueTextureOption: 2 - m_CameraType: 0 - m_Cameras: [] - m_RendererIndex: -1 - m_VolumeLayerMask: - serializedVersion: 2 - m_Bits: 1 - m_VolumeTrigger: {fileID: 0} - m_VolumeFrameworkUpdateModeOption: 2 - m_RenderPostProcessing: 0 - m_Antialiasing: 0 - m_AntialiasingQuality: 2 - m_StopNaN: 0 - m_Dithering: 0 - m_ClearDepth: 1 - m_AllowXRRendering: 1 - m_RequiresDepthTexture: 0 - m_RequiresColorTexture: 0 - m_Version: 2 ---- !u!1 &563873521 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 563873522} - - component: {fileID: 563873524} - - component: {fileID: 563873523} - m_Layer: 5 - m_Name: UV_RT_Blit - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &563873522 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 563873521} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &563873523 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 563873521} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: 6d34677b3ea8c564fb1003dbbc77c5ae, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &563873524 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 563873521} - m_CullTransparentMesh: 1 ---- !u!1 &769672740 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 769672741} - - component: {fileID: 769672743} - - component: {fileID: 769672742} - m_Layer: 5 - m_Name: Stencil_RT_Blit - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &769672741 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 769672740} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &769672742 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 769672740} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: a564de6f1e0272b469ba5fd704880e5e, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &769672743 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 769672740} - m_CullTransparentMesh: 1 ---- !u!1 &809824961 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 809824965} - - component: {fileID: 809824964} - - component: {fileID: 809824963} - - component: {fileID: 809824962} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &809824962 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 809824961} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &809824963 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 809824961} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &809824964 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 809824961} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 1 - m_Camera: {fileID: 487053998} - m_PlaneDistance: 1 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_UpdateRectTransformForStandalone: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &809824965 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 809824961} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1485633328} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &1195298006 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1195298007} - - component: {fileID: 1195298009} - - component: {fileID: 1195298008} - m_Layer: 5 - m_Name: RawImage (8) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1195298007 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1195298006} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 8 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1195298008 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1195298006} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 0} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1195298009 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1195298006} - m_CullTransparentMesh: 1 ---- !u!1 &1399479113 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1399479114} - - component: {fileID: 1399479116} - - component: {fileID: 1399479115} - m_Layer: 5 - m_Name: RawImage (10) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1399479114 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1399479113} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 10 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1399479115 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1399479113} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 0} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1399479116 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1399479113} - m_CullTransparentMesh: 1 ---- !u!1 &1485633327 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1485633328} - - component: {fileID: 1485633330} - - component: {fileID: 1485633329} - m_Layer: 5 - m_Name: Panel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1485633328 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1485633327} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 54070875} - - {fileID: 338607174} - - {fileID: 769672741} - - {fileID: 1675925326} - - {fileID: 563873522} - - {fileID: 276111446} - - {fileID: 1517459219} - - {fileID: 1539522353} - - {fileID: 1195298007} - - {fileID: 1539453433} - - {fileID: 1399479114} - - {fileID: 317833756} - - {fileID: 206706241} - - {fileID: 161488925} - - {fileID: 1620326878} - - {fileID: 1597517994} - m_Father: {fileID: 809824965} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1485633329 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1485633327} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 0 - m_StartCorner: 0 - m_StartAxis: 0 - m_CellSize: {x: 200, y: 200} - m_Spacing: {x: 0, y: 0} - m_Constraint: 0 - m_ConstraintCount: 2 ---- !u!222 &1485633330 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1485633327} - m_CullTransparentMesh: 1 ---- !u!1 &1515837373 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1515837376} - - component: {fileID: 1515837375} - - component: {fileID: 1515837374} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1515837374 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1515837373} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &1515837375 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1515837373} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &1515837376 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1515837373} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1517459218 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1517459219} - - component: {fileID: 1517459221} - - component: {fileID: 1517459220} - m_Layer: 5 - m_Name: Depth_RT_Blit - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1517459219 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1517459218} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1517459220 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1517459218} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: 5e17aea4de9413448b83907916faeb01, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1517459221 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1517459218} - m_CullTransparentMesh: 1 ---- !u!1 &1539453432 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1539453433} - - component: {fileID: 1539453435} - - component: {fileID: 1539453434} - m_Layer: 5 - m_Name: RawImage (9) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1539453433 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539453432} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 9 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1539453434 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539453432} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 0} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1539453435 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539453432} - m_CullTransparentMesh: 1 ---- !u!1 &1539522352 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1539522353} - - component: {fileID: 1539522355} - - component: {fileID: 1539522354} - m_Layer: 5 - m_Name: Depth_RT_DrawProcedural - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1539522353 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539522352} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1539522354 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539522352} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: f1e9e309129785c47b9e3e3e987aab39, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1539522355 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539522352} - m_CullTransparentMesh: 1 ---- !u!1 &1597517993 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1597517994} - - component: {fileID: 1597517996} - - component: {fileID: 1597517995} - m_Layer: 5 - m_Name: RawImage (15) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1597517994 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1597517993} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 15 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1597517995 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1597517993} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 0} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1597517996 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1597517993} - m_CullTransparentMesh: 1 ---- !u!1 &1620326877 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1620326878} - - component: {fileID: 1620326880} - - component: {fileID: 1620326879} - m_Layer: 5 - m_Name: RawImage (14) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1620326878 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1620326877} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 14 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1620326879 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1620326877} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 0} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1620326880 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1620326877} - m_CullTransparentMesh: 1 ---- !u!1 &1675925325 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1675925326} - - component: {fileID: 1675925328} - - component: {fileID: 1675925327} - m_Layer: 5 - m_Name: Stencil_RT_DrawProcedural - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1675925326 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1675925325} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1485633328} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1675925327 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1675925325} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Texture: {fileID: 8400000, guid: 61857689904ba2e4db2e75a985f617ab, type: 2} - m_UVRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 ---- !u!222 &1675925328 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1675925325} - m_CullTransparentMesh: 1 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity.meta deleted file mode 100644 index c27d09132da..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 8b2856898c3f1cb43a36c7329bdbcc97 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture deleted file mode 100644 index dbc1e3ca752..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: AlphaBlend_RT_Blit - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 128 - m_Height: 128 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 0 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture.meta deleted file mode 100644 index eaf8ebabb35..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_Blit.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 679f03fd27b4ea84daee6912c06cf0e6 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture deleted file mode 100644 index ce153f85d6a..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: AlphaBlend_RT_DrawProcedural - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 128 - m_Height: 128 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 0 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture.meta deleted file mode 100644 index 0d73f42a757..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/AlphaBlend_RT_DrawProcedural.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7b2abc9285711f147b44c1c60d87fddd -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture deleted file mode 100644 index e80e262c248..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Depth_RT_Blit - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 128 - m_Height: 128 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 0 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture.meta deleted file mode 100644 index 169e3f9ef33..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_Blit.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5e17aea4de9413448b83907916faeb01 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture deleted file mode 100644 index 4be11421e2d..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Depth_RT_DrawProcedural - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 128 - m_Height: 128 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 0 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture.meta deleted file mode 100644 index 3aa45f05be9..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Depth_RT_DrawProcedural.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f1e9e309129785c47b9e3e3e987aab39 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs deleted file mode 100644 index 2381c011892..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Rendering; - -[ExecuteAlways] -public class FullscreenTests : MonoBehaviour -{ - [Header("UV")] - public Material uv; - public RenderTexture uvRT1; - public RenderTexture uvRT2; - - [Header("ViewDir")] - public Material viewDir; - public RenderTexture viewDirRT1; - public RenderTexture viewDirRT2; - - [Header("AlphaBlend")] - public Material alphaBlend; - public RenderTexture alphaBlendRT1; - public RenderTexture alphaBlendRT2; - - [Header("Stencil")] - public Material stencilWrite; - public Material stencilTest; - public RenderTexture stencilRT1; - public RenderTexture stencilRT2; - - void Update() - { - var cmd = new CommandBuffer{ name = "Fullscreen Blit" }; - - DrawFullscreenBlitTest(cmd, uv, uvRT1, uvRT2); - DrawFullscreenBlitTest(cmd, viewDir, viewDirRT1, viewDirRT2); - DrawFullscreenBlitTest(cmd, alphaBlend, alphaBlendRT1, alphaBlendRT2); - - DrawFullscreenStencilTest(cmd, stencilWrite, stencilTest, stencilRT1, stencilRT2); - - Graphics.ExecuteCommandBuffer(cmd); - } - - void DrawFullscreenBlitTest(CommandBuffer cmd, Material material, RenderTexture rt1, RenderTexture rt2) - { - CoreUtils.SetRenderTarget(cmd, rt1, ClearFlag.All, Color.white); - CoreUtils.DrawFullScreen(cmd, material, shaderPassId: 0); - CoreUtils.SetRenderTarget(cmd, rt2, ClearFlag.All, Color.white); - cmd.Blit(Texture2D.whiteTexture, rt2, material, pass: 1); - } - - void DrawFullscreenStencilTest(CommandBuffer cmd, Material writeStencil, Material testStencil, RenderTexture rt1, RenderTexture rt2) - { - CoreUtils.SetRenderTarget(cmd, rt1, ClearFlag.All, Color.white); - CoreUtils.DrawFullScreen(cmd, writeStencil, shaderPassId: 0); - CoreUtils.DrawFullScreen(cmd, testStencil, shaderPassId: 0); - - CoreUtils.SetRenderTarget(cmd, rt2, ClearFlag.All, Color.white); - Blitter.BlitTexture(cmd, Texture2D.whiteTexture, rt1, writeStencil, 1); - Blitter.BlitTexture(cmd, Texture2D.whiteTexture, rt1, testStencil, 1); - } -} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs.meta deleted file mode 100644 index 7888e279b15..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/FullscreenTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2eab774764b045445b005fe774b06cc9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat deleted file mode 100644 index 218316b3351..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat +++ /dev/null @@ -1,38 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Fullscreen_AlphaBlend - m_Shader: {fileID: -6465566751694194690, guid: e67bcfc9844b56b4581011ebe9c74d49, - type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: [] - m_Colors: [] - m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat.meta deleted file mode 100644 index 4b4be6d6f68..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b2719833af97256459e8e8f792c107e2 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph deleted file mode 100644 index e506b4ab484..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph +++ /dev/null @@ -1,409 +0,0 @@ -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.GraphData", - "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", - "m_Properties": [], - "m_Keywords": [], - "m_Dropdowns": [], - "m_CategoryData": [ - { - "m_Id": "4290cfbed07440b093fddf91b8d76b29" - } - ], - "m_Nodes": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - }, - { - "m_Id": "ec2966dd7c5f4bc1a3c20763e2e33646" - }, - { - "m_Id": "22fac907f78c41df9e7a68e4897c5e67" - } - ], - "m_GroupDatas": [], - "m_StickyNoteDatas": [], - "m_Edges": [ - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "22fac907f78c41df9e7a68e4897c5e67" - }, - "m_SlotId": 0 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - "m_SlotId": 0 - } - }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "ec2966dd7c5f4bc1a3c20763e2e33646" - }, - "m_SlotId": 0 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - }, - "m_SlotId": 0 - } - } - ], - "m_VertexContext": { - "m_Position": { - "x": 8.0, - "y": 100.0 - }, - "m_Blocks": [] - }, - "m_FragmentContext": { - "m_Position": { - "x": 0.0, - "y": 200.0 - }, - "m_Blocks": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - } - ] - }, - "m_PreviewData": { - "serializedMesh": { - "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", - "m_Guid": "" - }, - "preventRotation": false - }, - "m_Path": "Shader Graphs", - "m_GraphPrecision": 1, - "m_PreviewMode": 2, - "m_OutputNode": { - "m_Id": "" - }, - "m_ActiveTargets": [ - { - "m_Id": "22f53713eb17485f8cf0e5aaa5906406" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", - "m_Id": 0, - "m_DisplayName": "Base Color", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "BaseColor", - "m_StageCapability": 2, - "m_Value": { - "x": 0.5, - "y": 0.5, - "z": 0.5 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.5, - "g": 0.5, - "b": 0.5, - "a": 1.0 - } -} - -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", - "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", - "m_Datas": [ - { - "m_Id": "a90b0aea35e14008a266a1a9113e451f" - } - ], - "m_ActiveSubTarget": { - "m_Id": "af7bf9fba27b49d0972f3ab028062356" - }, - "m_AllowMaterialOverride": false, - "m_SurfaceType": 0, - "m_ZTestMode": 4, - "m_ZWriteControl": 0, - "m_AlphaMode": 0, - "m_RenderFace": 2, - "m_AlphaClip": false, - "m_CastShadows": true, - "m_ReceiveShadows": true, - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.ShaderGraph.ColorNode", - "m_ObjectId": "22fac907f78c41df9e7a68e4897c5e67", - "m_Group": { - "m_Id": "" - }, - "m_Name": "Color", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -312.0, - "y": 151.0, - "width": 208.0, - "height": 127.0 - } - }, - "m_Slots": [ - { - "m_Id": "925cc6c93752438ba85b121a4eb91930" - } - ], - "synonyms": [ - "rgba" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_Color": { - "color": { - "r": 1.0, - "g": 0.0, - "b": 0.0, - "a": 1.0 - }, - "mode": 0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CategoryData", - "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", - "m_Name": "", - "m_ChildObjectList": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.BaseColor", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "15df3b650d2344cbb6aeb200d400b117" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.BaseColor" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", - "m_ObjectId": "925cc6c93752438ba85b121a4eb91930", - "m_Id": 0, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", - "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", - "m_Version": 0, - "m_fullscreenMode": 0, - "m_BlendMode": 1, - "m_SrcColorBlendMode": 0, - "m_DstColorBlendMode": 1, - "m_ColorBlendOperation": 0, - "m_SrcAlphaBlendMode": 0, - "m_DstAlphaBlendMode": 1, - "m_AlphaBlendOperation": 0, - "m_EnableStencil": false, - "m_StencilReference": 0, - "m_StencilReadMask": 255, - "m_StencilWriteMask": 255, - "m_StencilCompareFunction": 8, - "m_StencilPassOperation": 0, - "m_StencilFailOperation": 0, - "m_StencilDepthFailOperation": 0, - "m_DepthWrite": false, - "m_AllowMaterialOverride": false, - "m_DepthTestMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", - "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 1.0, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.UVNode", - "m_ObjectId": "ec2966dd7c5f4bc1a3c20763e2e33646", - "m_Group": { - "m_Id": "" - }, - "m_Name": "UV", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -312.0, - "y": 291.0, - "width": 208.0, - "height": 313.0 - } - }, - "m_Slots": [ - { - "m_Id": "f9e92ac71a204e08994598c217bb1290" - } - ], - "synonyms": [ - "texcoords", - "coords", - "coordinates" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_OutputChannel": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", - "m_ObjectId": "f9e92ac71a204e08994598c217bb1290", - "m_Id": 0, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph.meta deleted file mode 100644 index a22a1d1e11c..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_AlphaBlend.shadergraph.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: e67bcfc9844b56b4581011ebe9c74d49 -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat deleted file mode 100644 index 97a71d0fc6b..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat +++ /dev/null @@ -1,38 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Fullscreen_Depth - m_Shader: {fileID: -6465566751694194690, guid: e2f2acfc02800be4e9d158379da26dcb, - type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: [] - m_Colors: [] - m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat.meta deleted file mode 100644 index f0c9e7835fa..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 88e97b177ad297d4fabd641f0791ae05 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph deleted file mode 100644 index 5cb78cbd8c9..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph +++ /dev/null @@ -1,392 +0,0 @@ -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.GraphData", - "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", - "m_Properties": [], - "m_Keywords": [], - "m_Dropdowns": [], - "m_CategoryData": [ - { - "m_Id": "4290cfbed07440b093fddf91b8d76b29" - } - ], - "m_Nodes": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - }, - { - "m_Id": "ec7e25b5d6344b1cbff7ebf39f9cf715" - }, - { - "m_Id": "27a0c061e2f64edc9f190f63a29e2d7c" - } - ], - "m_GroupDatas": [], - "m_StickyNoteDatas": [], - "m_Edges": [ - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "ec7e25b5d6344b1cbff7ebf39f9cf715" - }, - "m_SlotId": 0 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "27a0c061e2f64edc9f190f63a29e2d7c" - }, - "m_SlotId": 0 - } - }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "ec7e25b5d6344b1cbff7ebf39f9cf715" - }, - "m_SlotId": 0 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - "m_SlotId": 0 - } - } - ], - "m_VertexContext": { - "m_Position": { - "x": 8.0, - "y": 100.0 - }, - "m_Blocks": [] - }, - "m_FragmentContext": { - "m_Position": { - "x": 0.0, - "y": 200.0 - }, - "m_Blocks": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - }, - { - "m_Id": "27a0c061e2f64edc9f190f63a29e2d7c" - } - ] - }, - "m_PreviewData": { - "serializedMesh": { - "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", - "m_Guid": "" - }, - "preventRotation": false - }, - "m_Path": "Shader Graphs", - "m_GraphPrecision": 1, - "m_PreviewMode": 2, - "m_OutputNode": { - "m_Id": "" - }, - "m_ActiveTargets": [ - { - "m_Id": "22f53713eb17485f8cf0e5aaa5906406" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", - "m_Id": 0, - "m_DisplayName": "Base Color", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "BaseColor", - "m_StageCapability": 2, - "m_Value": { - "x": 0.5, - "y": 0.5, - "z": 0.5 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.5, - "g": 0.5, - "b": 0.5, - "a": 1.0 - } -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "15e57ac8f8d549ac955781de0b470a63", - "m_Id": 0, - "m_DisplayName": "Depth", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "FullscreenDepth", - "m_StageCapability": 2, - "m_Value": 0.0, - "m_DefaultValue": 0.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", - "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", - "m_Datas": [ - { - "m_Id": "a90b0aea35e14008a266a1a9113e451f" - } - ], - "m_ActiveSubTarget": { - "m_Id": "af7bf9fba27b49d0972f3ab028062356" - }, - "m_AllowMaterialOverride": false, - "m_SurfaceType": 0, - "m_ZTestMode": 4, - "m_ZWriteControl": 0, - "m_AlphaMode": 0, - "m_RenderFace": 2, - "m_AlphaClip": false, - "m_CastShadows": true, - "m_ReceiveShadows": true, - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "27a0c061e2f64edc9f190f63a29e2d7c", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.FullscreenDepth", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "15e57ac8f8d549ac955781de0b470a63" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.FullscreenDepth" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CategoryData", - "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", - "m_Name": "", - "m_ChildObjectList": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.BaseColor", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "15df3b650d2344cbb6aeb200d400b117" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.BaseColor" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", - "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", - "m_Version": 0, - "m_fullscreenMode": 0, - "m_BlendMode": 0, - "m_SrcColorBlendMode": 0, - "m_DstColorBlendMode": 1, - "m_ColorBlendOperation": 0, - "m_SrcAlphaBlendMode": 0, - "m_DstAlphaBlendMode": 1, - "m_AlphaBlendOperation": 0, - "m_EnableStencil": false, - "m_StencilReference": 0, - "m_StencilReadMask": 255, - "m_StencilWriteMask": 255, - "m_StencilCompareFunction": 8, - "m_StencilPassOperation": 0, - "m_StencilFailOperation": 0, - "m_StencilDepthFailOperation": 0, - "m_DepthWrite": true, - "m_AllowMaterialOverride": false, - "m_DepthTestMode": 8 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", - "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", - "m_ObjectId": "c75531fd9036486dbbc8b8b2cd1d2d87", - "m_Id": 0, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 1.0, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.UVNode", - "m_ObjectId": "ec7e25b5d6344b1cbff7ebf39f9cf715", - "m_Group": { - "m_Id": "" - }, - "m_Name": "UV", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -492.0, - "y": 200.0, - "width": 208.0, - "height": 313.0 - } - }, - "m_Slots": [ - { - "m_Id": "c75531fd9036486dbbc8b8b2cd1d2d87" - } - ], - "synonyms": [ - "texcoords", - "coords", - "coordinates" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_OutputChannel": 0 -} - diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph.meta deleted file mode 100644 index b3a5727afa1..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_Depth.shadergraph.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: e2f2acfc02800be4e9d158379da26dcb -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat deleted file mode 100644 index 64132b65fcf..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat +++ /dev/null @@ -1,38 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Fullscreen_StencilTest - m_Shader: {fileID: -6465566751694194690, guid: f555b855075efeb4eb2d97fe34fe00c5, - type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: [] - m_Colors: [] - m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat.meta deleted file mode 100644 index c7dc5b5c3a3..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1dd7d11c220392b4e9125411b966d253 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph deleted file mode 100644 index 62680b16e07..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph +++ /dev/null @@ -1,323 +0,0 @@ -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.GraphData", - "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", - "m_Properties": [], - "m_Keywords": [], - "m_Dropdowns": [], - "m_CategoryData": [ - { - "m_Id": "4290cfbed07440b093fddf91b8d76b29" - } - ], - "m_Nodes": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - }, - { - "m_Id": "c988b9c0cd824d30a3ccaa8ae7c9b2ae" - } - ], - "m_GroupDatas": [], - "m_StickyNoteDatas": [], - "m_Edges": [ - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "c988b9c0cd824d30a3ccaa8ae7c9b2ae" - }, - "m_SlotId": 0 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - "m_SlotId": 0 - } - } - ], - "m_VertexContext": { - "m_Position": { - "x": 8.0, - "y": 100.0 - }, - "m_Blocks": [] - }, - "m_FragmentContext": { - "m_Position": { - "x": 0.0, - "y": 200.0 - }, - "m_Blocks": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - } - ] - }, - "m_PreviewData": { - "serializedMesh": { - "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", - "m_Guid": "" - }, - "preventRotation": false - }, - "m_Path": "Shader Graphs", - "m_GraphPrecision": 1, - "m_PreviewMode": 2, - "m_OutputNode": { - "m_Id": "" - }, - "m_ActiveTargets": [ - { - "m_Id": "22f53713eb17485f8cf0e5aaa5906406" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", - "m_Id": 0, - "m_DisplayName": "Base Color", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "BaseColor", - "m_StageCapability": 2, - "m_Value": { - "x": 0.5, - "y": 0.5, - "z": 0.5 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.5, - "g": 0.5, - "b": 0.5, - "a": 1.0 - } -} - -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", - "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", - "m_Datas": [ - { - "m_Id": "a90b0aea35e14008a266a1a9113e451f" - } - ], - "m_ActiveSubTarget": { - "m_Id": "af7bf9fba27b49d0972f3ab028062356" - }, - "m_AllowMaterialOverride": false, - "m_SurfaceType": 0, - "m_ZTestMode": 4, - "m_ZWriteControl": 0, - "m_AlphaMode": 0, - "m_RenderFace": 2, - "m_AlphaClip": false, - "m_CastShadows": true, - "m_ReceiveShadows": true, - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", - "m_ObjectId": "3eabdd38d0354650b20acc6d94b02489", - "m_Id": 0, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CategoryData", - "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", - "m_Name": "", - "m_ChildObjectList": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.BaseColor", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "15df3b650d2344cbb6aeb200d400b117" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.BaseColor" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", - "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", - "m_Version": 0, - "m_fullscreenMode": 0, - "m_BlendMode": 0, - "m_SrcColorBlendMode": 0, - "m_DstColorBlendMode": 1, - "m_ColorBlendOperation": 0, - "m_SrcAlphaBlendMode": 0, - "m_DstAlphaBlendMode": 1, - "m_AlphaBlendOperation": 0, - "m_EnableStencil": true, - "m_StencilReference": 128, - "m_StencilReadMask": 255, - "m_StencilWriteMask": 255, - "m_StencilCompareFunction": 3, - "m_StencilPassOperation": 0, - "m_StencilFailOperation": 0, - "m_StencilDepthFailOperation": 0, - "m_DepthWrite": false, - "m_AllowMaterialOverride": false, - "m_DepthTestMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", - "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.UVNode", - "m_ObjectId": "c988b9c0cd824d30a3ccaa8ae7c9b2ae", - "m_Group": { - "m_Id": "" - }, - "m_Name": "UV", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -322.9999694824219, - "y": 200.0, - "width": 207.99998474121095, - "height": 313.0 - } - }, - "m_Slots": [ - { - "m_Id": "3eabdd38d0354650b20acc6d94b02489" - } - ], - "synonyms": [ - "texcoords", - "coords", - "coordinates" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_OutputChannel": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 1.0, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph.meta deleted file mode 100644 index 70759e38583..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilTest.shadergraph.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: f555b855075efeb4eb2d97fe34fe00c5 -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat deleted file mode 100644 index ecfb648ac77..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat +++ /dev/null @@ -1,38 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Fullscreen_StencilWrite - m_Shader: {fileID: -6465566751694194690, guid: 77c10b40993da9d4493793a1b28d8dd6, - type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: [] - m_Colors: [] - m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat.meta deleted file mode 100644 index abaaa93a884..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6a54bfdd467d98848b7282a9f5ace22c -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph deleted file mode 100644 index 13f0f45bae7..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph +++ /dev/null @@ -1,329 +0,0 @@ -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.GraphData", - "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", - "m_Properties": [], - "m_Keywords": [], - "m_Dropdowns": [], - "m_CategoryData": [ - { - "m_Id": "4290cfbed07440b093fddf91b8d76b29" - } - ], - "m_Nodes": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - }, - { - "m_Id": "17b6dbbf4f3a45ab88ebb7ff3f8a60ec" - } - ], - "m_GroupDatas": [], - "m_StickyNoteDatas": [], - "m_Edges": [ - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "17b6dbbf4f3a45ab88ebb7ff3f8a60ec" - }, - "m_SlotId": 0 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - "m_SlotId": 0 - } - } - ], - "m_VertexContext": { - "m_Position": { - "x": 8.0, - "y": 100.0 - }, - "m_Blocks": [] - }, - "m_FragmentContext": { - "m_Position": { - "x": 0.0, - "y": 200.0 - }, - "m_Blocks": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - } - ] - }, - "m_PreviewData": { - "serializedMesh": { - "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", - "m_Guid": "" - }, - "preventRotation": false - }, - "m_Path": "Shader Graphs", - "m_GraphPrecision": 1, - "m_PreviewMode": 2, - "m_OutputNode": { - "m_Id": "" - }, - "m_ActiveTargets": [ - { - "m_Id": "22f53713eb17485f8cf0e5aaa5906406" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", - "m_Id": 0, - "m_DisplayName": "Base Color", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "BaseColor", - "m_StageCapability": 2, - "m_Value": { - "x": 0.5, - "y": 0.5, - "z": 0.5 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.5, - "g": 0.5, - "b": 0.5, - "a": 1.0 - } -} - -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.ShaderGraph.ColorNode", - "m_ObjectId": "17b6dbbf4f3a45ab88ebb7ff3f8a60ec", - "m_Group": { - "m_Id": "" - }, - "m_Name": "Color", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -303.0, - "y": 200.0, - "width": 208.0, - "height": 127.0 - } - }, - "m_Slots": [ - { - "m_Id": "2c1ec6ce88f24390b0feb0258fe2d3c3" - } - ], - "synonyms": [ - "rgba" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_Color": { - "color": { - "r": 0.0, - "g": 0.0, - "b": 1.0, - "a": 0.0 - }, - "mode": 0 - } -} - -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", - "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", - "m_Datas": [ - { - "m_Id": "a90b0aea35e14008a266a1a9113e451f" - } - ], - "m_ActiveSubTarget": { - "m_Id": "af7bf9fba27b49d0972f3ab028062356" - }, - "m_AllowMaterialOverride": false, - "m_SurfaceType": 0, - "m_ZTestMode": 4, - "m_ZWriteControl": 0, - "m_AlphaMode": 0, - "m_RenderFace": 2, - "m_AlphaClip": false, - "m_CastShadows": true, - "m_ReceiveShadows": true, - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", - "m_ObjectId": "2c1ec6ce88f24390b0feb0258fe2d3c3", - "m_Id": 0, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CategoryData", - "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", - "m_Name": "", - "m_ChildObjectList": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.BaseColor", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "15df3b650d2344cbb6aeb200d400b117" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.BaseColor" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", - "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", - "m_Version": 0, - "m_fullscreenMode": 0, - "m_BlendMode": 0, - "m_SrcColorBlendMode": 0, - "m_DstColorBlendMode": 1, - "m_ColorBlendOperation": 0, - "m_SrcAlphaBlendMode": 0, - "m_DstAlphaBlendMode": 1, - "m_AlphaBlendOperation": 0, - "m_EnableStencil": true, - "m_StencilReference": 128, - "m_StencilReadMask": 255, - "m_StencilWriteMask": 255, - "m_StencilCompareFunction": 8, - "m_StencilPassOperation": 2, - "m_StencilFailOperation": 0, - "m_StencilDepthFailOperation": 0, - "m_DepthWrite": false, - "m_AllowMaterialOverride": false, - "m_DepthTestMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", - "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 1.0, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph.meta deleted file mode 100644 index 67b322e997c..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_StencilWrite.shadergraph.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 77c10b40993da9d4493793a1b28d8dd6 -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat deleted file mode 100644 index 83746a47e1e..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat +++ /dev/null @@ -1,38 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Fullscreen_UV - m_Shader: {fileID: -6465566751694194690, guid: c465be304d0c4614da3c1e53e503dd19, - type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: [] - m_Colors: [] - m_BuildTextureStacks: [] diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat.meta deleted file mode 100644 index c662d7cb06e..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: fbacff351499a1e488ba7f3de58ab149 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph deleted file mode 100644 index ff26b7923c2..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph +++ /dev/null @@ -1,323 +0,0 @@ -{ - "m_SGVersion": 3, - "m_Type": "UnityEditor.ShaderGraph.GraphData", - "m_ObjectId": "54c72c7b205145d4aebfbdc1ab2d060d", - "m_Properties": [], - "m_Keywords": [], - "m_Dropdowns": [], - "m_CategoryData": [ - { - "m_Id": "4290cfbed07440b093fddf91b8d76b29" - } - ], - "m_Nodes": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - }, - { - "m_Id": "c988b9c0cd824d30a3ccaa8ae7c9b2ae" - } - ], - "m_GroupDatas": [], - "m_StickyNoteDatas": [], - "m_Edges": [ - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "c988b9c0cd824d30a3ccaa8ae7c9b2ae" - }, - "m_SlotId": 0 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - "m_SlotId": 0 - } - } - ], - "m_VertexContext": { - "m_Position": { - "x": 8.0, - "y": 100.0 - }, - "m_Blocks": [] - }, - "m_FragmentContext": { - "m_Position": { - "x": 0.0, - "y": 200.0 - }, - "m_Blocks": [ - { - "m_Id": "6f0cd4479cda49a6a6713e3556302138" - }, - { - "m_Id": "766e7ec131324300b800a271f8a5ed2d" - } - ] - }, - "m_PreviewData": { - "serializedMesh": { - "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", - "m_Guid": "" - }, - "preventRotation": false - }, - "m_Path": "Shader Graphs", - "m_GraphPrecision": 1, - "m_PreviewMode": 2, - "m_OutputNode": { - "m_Id": "" - }, - "m_ActiveTargets": [ - { - "m_Id": "22f53713eb17485f8cf0e5aaa5906406" - } - ] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "15df3b650d2344cbb6aeb200d400b117", - "m_Id": 0, - "m_DisplayName": "Base Color", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "BaseColor", - "m_StageCapability": 2, - "m_Value": { - "x": 0.5, - "y": 0.5, - "z": 0.5 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 0, - "m_DefaultColor": { - "r": 0.5, - "g": 0.5, - "b": 0.5, - "a": 1.0 - } -} - -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", - "m_ObjectId": "22f53713eb17485f8cf0e5aaa5906406", - "m_Datas": [ - { - "m_Id": "a90b0aea35e14008a266a1a9113e451f" - } - ], - "m_ActiveSubTarget": { - "m_Id": "af7bf9fba27b49d0972f3ab028062356" - }, - "m_AllowMaterialOverride": false, - "m_SurfaceType": 0, - "m_ZTestMode": 4, - "m_ZWriteControl": 0, - "m_AlphaMode": 0, - "m_RenderFace": 2, - "m_AlphaClip": false, - "m_CastShadows": true, - "m_ReceiveShadows": true, - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", - "m_ObjectId": "3eabdd38d0354650b20acc6d94b02489", - "m_Id": 0, - "m_DisplayName": "Out", - "m_SlotType": 1, - "m_Hidden": false, - "m_ShaderOutputName": "Out", - "m_StageCapability": 3, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "w": 0.0 - }, - "m_Labels": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.CategoryData", - "m_ObjectId": "4290cfbed07440b093fddf91b8d76b29", - "m_Name": "", - "m_ChildObjectList": [] -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "6f0cd4479cda49a6a6713e3556302138", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.BaseColor", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "15df3b650d2344cbb6aeb200d400b117" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.BaseColor" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "766e7ec131324300b800a271f8a5ed2d", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "d6f3cd5b9af44fb0a32e173f35141a7f" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", - "m_ObjectId": "a90b0aea35e14008a266a1a9113e451f", - "m_Version": 0, - "m_fullscreenMode": 0, - "m_BlendMode": 0, - "m_SrcColorBlendMode": 0, - "m_DstColorBlendMode": 1, - "m_ColorBlendOperation": 0, - "m_SrcAlphaBlendMode": 0, - "m_DstAlphaBlendMode": 1, - "m_AlphaBlendOperation": 0, - "m_EnableStencil": false, - "m_StencilReference": 0, - "m_StencilReadMask": 255, - "m_StencilWriteMask": 255, - "m_StencilCompareFunction": 8, - "m_StencilPassOperation": 0, - "m_StencilFailOperation": 0, - "m_StencilDepthFailOperation": 0, - "m_DepthWrite": false, - "m_AllowMaterialOverride": false, - "m_DepthTestMode": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalFullscreenSubTarget", - "m_ObjectId": "af7bf9fba27b49d0972f3ab028062356" -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.UVNode", - "m_ObjectId": "c988b9c0cd824d30a3ccaa8ae7c9b2ae", - "m_Group": { - "m_Id": "" - }, - "m_Name": "UV", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": -322.9999694824219, - "y": 200.0, - "width": 207.99998474121095, - "height": 313.0 - } - }, - "m_Slots": [ - { - "m_Id": "3eabdd38d0354650b20acc6d94b02489" - } - ], - "synonyms": [ - "texcoords", - "coords", - "coordinates" - ], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_OutputChannel": 0 -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "d6f3cd5b9af44fb0a32e173f35141a7f", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 1.0, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph.meta deleted file mode 100644 index fb4dea559af..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Fullscreen_UV.shadergraph.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: c465be304d0c4614da3c1e53e503dd19 -ScriptedImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 2 - userData: - assetBundleName: - assetBundleVariant: - script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture deleted file mode 100644 index b727077c5d2..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Stencil_RT_Blit - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 128 - m_Height: 128 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 94 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture.meta deleted file mode 100644 index 438b3753611..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_Blit.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a564de6f1e0272b469ba5fd704880e5e -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture deleted file mode 100644 index 46911ad0199..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Stencil_RT_DrawProcedural - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 128 - m_Height: 128 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 94 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture.meta deleted file mode 100644 index c539a51a0df..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/Stencil_RT_DrawProcedural.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 61857689904ba2e4db2e75a985f617ab -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture deleted file mode 100644 index e8b28e7dbb9..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: UV_RT_Blit - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 128 - m_Height: 128 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 0 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture.meta deleted file mode 100644 index ede372963ed..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_Blit.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 6d34677b3ea8c564fb1003dbbc77c5ae -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture deleted file mode 100644 index 6abf0490736..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!84 &8400000 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: UV_RT_DrawProcedural - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 5 - m_Width: 128 - m_Height: 128 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthStencilFormat: 0 - m_ColorFormat: 8 - m_MipMap: 0 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 0 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_Dimension: 2 - m_VolumeDepth: 1 - m_ShadowSamplingMode: 2 diff --git a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture.meta b/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture.meta deleted file mode 100644 index 794abe516c1..00000000000 --- a/TestProjects/ShaderGraph/Assets/Scenes/Fullscreen/UV_RT_DrawProcedural.renderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d8a0bc84cb05ecf4d98c26eaf44014e1 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 8400000 - userData: - assetBundleName: - assetBundleVariant: From 23117c707a2b5f0ea36bd2f5721786035327ab1a Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 22 Oct 2021 12:22:53 +0200 Subject: [PATCH 053/108] Added CRT sub target filter on nodes --- .../Targets/CustomRenderTexture/CustomTextureNodes.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs index 172625829d0..9006037f519 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -6,6 +6,7 @@ namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph { [Title("Custom Render Texture", "Size")] + [SubTargetFilter(typeof(CustomTextureSubTarget))] class CustomTextureSize : AbstractMaterialNode, IGeneratesFunction { private const string kOutputSlotWidthName = "Texture Width"; @@ -58,6 +59,7 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } [Title("Custom Render Texture", "Slice Index / Cubemap Face")] + [SubTargetFilter(typeof(CustomTextureSubTarget))] class CustomTextureSlice : AbstractMaterialNode, IGeneratesFunction { private const string kOutputSlotCubeFaceName = "Texture Cube Face"; @@ -106,6 +108,8 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } [Title("Custom Render Texture", "Self")] + [SubTargetFilter(typeof(CustomTextureSubTarget))] + class CustomTextureSelf : AbstractMaterialNode, IGeneratesFunction { private const string kOutputSlotSelf2DName = "Self Texture 2D"; @@ -164,6 +168,8 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } [Title("Custom Render Texture", "Current Dimension")] + [SubTargetFilter(typeof(CustomTextureSubTarget))] + class CustomTextureDimension : AbstractMaterialNode, IGeneratesBodyCode { private const string kOutputSlot2D = "Is 2D"; From 63247bc8f3a95685c92313bab559664522c6196e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 22 Oct 2021 12:50:38 +0200 Subject: [PATCH 054/108] Fix motion vector and blit source in Universal Sample buffer node --- .../ShaderGraph/Nodes/UniversalSampleBufferNode.cs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs index bf40721147d..e791a3b5d80 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs @@ -12,7 +12,7 @@ namespace UnityEditor.Rendering.Universal { [SRPFilter(typeof(UniversalRenderPipeline))] - [Title("Input", "Universal", "Universal Sample Buffer")] + [Title("Input", "Universal", "URP Sample Buffer")] sealed class UniversalSampleBufferNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireNDCPosition { const string k_ScreenPositionSlotName = "UV"; @@ -53,7 +53,7 @@ public BufferType bufferType public UniversalSampleBufferNode() { - name = "Universal Sample Buffer"; + name = "URP Sample Buffer"; synonyms = new string[] { "normal", "motion vector", "postprocessinput", "blit" }; UpdateNodeAfterDeserialization(); } @@ -100,7 +100,7 @@ public override void CollectShaderProperties(PropertyCollector properties, Gener if (bufferType == BufferType.BlitSource) { - properties.AddShaderProperty(new Texture2DArrayShaderProperty + properties.AddShaderProperty(new Texture2DShaderProperty { // Make it compatible with Blitter.cs calls overrideReferenceName = "_BlitTexture", @@ -145,17 +145,13 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener s.AppendLine("return SampleSceneNormals(uv);"); break; case BufferType.MotionVectors: - // if we have a value > 1.0f, it means we have selected the "no motion option", hence we force motionVec 0. - s.AppendLine($"float4 motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_CameraMotionVectorsTexture, samplerState, uv * _RTHandleScale.xy, 0);"); - s.AppendLine("float2 motionVec;"); - s.AppendLine("DecodeMotionVector(motionVecBufferSample, motionVec);"); - s.AppendLine("return motionVec;"); + s.AppendLine($"return motionVecBufferSample = SAMPLE_TEXTURE2D_X_LOD(_MotionVectorTexture, samplerState, uv * _RTHandleScale.xy, 0).xy;"); break; // case BufferType.PostProcessInput: // s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); // break; case BufferType.BlitSource: - s.AppendLine($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); + s.AppendLine($"return SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, samplerState, uv, 0); "); break; default: s.AppendLine("return 0.0;"); From 65c82d98d1e230dccffc83380303baf512bfb8d2 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 22 Oct 2021 17:50:06 +0200 Subject: [PATCH 055/108] Add camera color as input --- .../Runtime/RendererFeatures/DrawFullscreenPass.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs index e3f3c8ebabc..03e7ad64d79 100644 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs @@ -67,11 +67,13 @@ internal bool Setup(DrawFullscreenSettings featureSettings, ScriptableRenderer r m_ProfilerTagName = profilerTagName; renderPassEvent = featureSettings.injectionPoint; - ConfigureInput(ScriptableRenderPassInput.Depth); + ConfigureInput(ScriptableRenderPassInput.Depth); // We need the depth for fullscreen effects that relies on position if (featureSettings.requiresNormalTexture) ConfigureInput(ScriptableRenderPassInput.Normal); if (featureSettings.requiresMotionVectorTexture) ConfigureInput(ScriptableRenderPassInput.Motion); + if (featureSettings.source == DrawFullscreenBufferType.CameraColor) + ConfigureInput(ScriptableRenderPassInput.Color); return m_Settings.blitMaterial != null && m_Settings.blitMaterial.passCount > m_Settings.blitMaterialPassIndex From f90918b6553017d892e74a75db4e080db6e8199e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 26 Oct 2021 11:49:52 +0200 Subject: [PATCH 056/108] Fixed HD scene depth node --- .../Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs index 7204d0327f6..827a59781d7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs @@ -12,7 +12,7 @@ namespace UnityEditor.Rendering.HighDefinition { [SRPFilter(typeof(HDRenderPipeline))] [Title("Input", "High Definition Render Pipeline", "HD Scene Depth")] - sealed class HDSceneDepthNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture + sealed class HDSceneDepthNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture, IMayRequireNDCPosition { const string k_ScreenPositionSlotName = "UV"; const string k_LodInputSlotName = "Lod"; @@ -118,7 +118,7 @@ public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMo } public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true; - + public bool RequiresNDCPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true; } } From 9d3c59116052cad64054ceba9e3b50e42d524ad6 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 22 Oct 2021 12:22:53 +0200 Subject: [PATCH 057/108] Added CRT sub target filter on nodes --- .../Targets/CustomRenderTexture/CustomTextureNodes.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs index 172625829d0..9006037f519 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -6,6 +6,7 @@ namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph { [Title("Custom Render Texture", "Size")] + [SubTargetFilter(typeof(CustomTextureSubTarget))] class CustomTextureSize : AbstractMaterialNode, IGeneratesFunction { private const string kOutputSlotWidthName = "Texture Width"; @@ -58,6 +59,7 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } [Title("Custom Render Texture", "Slice Index / Cubemap Face")] + [SubTargetFilter(typeof(CustomTextureSubTarget))] class CustomTextureSlice : AbstractMaterialNode, IGeneratesFunction { private const string kOutputSlotCubeFaceName = "Texture Cube Face"; @@ -106,6 +108,8 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } [Title("Custom Render Texture", "Self")] + [SubTargetFilter(typeof(CustomTextureSubTarget))] + class CustomTextureSelf : AbstractMaterialNode, IGeneratesFunction { private const string kOutputSlotSelf2DName = "Self Texture 2D"; @@ -164,6 +168,8 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } [Title("Custom Render Texture", "Current Dimension")] + [SubTargetFilter(typeof(CustomTextureSubTarget))] + class CustomTextureDimension : AbstractMaterialNode, IGeneratesBodyCode { private const string kOutputSlot2D = "Is 2D"; From e404553b2fa8423a4a0400c7274bfc1616620dea Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 26 Oct 2021 15:16:09 +0200 Subject: [PATCH 058/108] Fix lod sampling in custom pass from fullscreen SG --- .../RenderPass/CustomPass/CustomPassSampling.hlsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl index 221b0ca6923..40561d630c7 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl @@ -19,7 +19,7 @@ float3 CustomPassSampleCameraColor(float2 uv, float lod, bool uvGuards = true) case CUSTOMPASSINJECTIONPOINT_BEFORE_RENDERING: return float3(0, 0, 0); // there is no color pyramid yet for before transparent so we can't sample with mips. // Also, we don't use _RTHandleScaleHistory to sample because the color pyramid bound is the actual camera color buffer which is at the resolution of the camera - case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScaleHistory.xy, 0).rgb; + case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScaleHistory.xy, lod).rgb; case CUSTOMPASSINJECTIONPOINT_BEFORE_POST_PROCESS: case CUSTOMPASSINJECTIONPOINT_BEFORE_PRE_REFRACTION: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScale.xy, 0).rgb; case CUSTOMPASSINJECTIONPOINT_AFTER_POST_PROCESS: return SAMPLE_TEXTURE2D_X_LOD(_AfterPostProcessColorBuffer, s_trilinear_clamp_sampler, uv * _RTHandleScale.zw, 0).rgb; From 857b093e3c3555041f877bae41932683116c672e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 26 Oct 2021 19:08:50 +0200 Subject: [PATCH 059/108] Added depth write / test mode --- .../Targets/Fullscreen/FullscreenData.cs | 8 ++ .../Targets/Fullscreen/FullscreenSubTarget.cs | 91 +++++++++++++++---- .../Fullscreen/Includes/FullscreenCommon.hlsl | 23 ++++- 3 files changed, 103 insertions(+), 19 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs index ede3b7e30be..da060e0b556 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs @@ -161,6 +161,14 @@ public bool depthWrite set => m_DepthWrite = value; } + [SerializeField] + FullscreenDepthWriteMode m_depthWriteMode = FullscreenDepthWriteMode.LinearEye; + public FullscreenDepthWriteMode depthWriteMode + { + get => m_depthWriteMode; + set => m_depthWriteMode = value; + } + // When checked, allows the material to control ALL surface settings (uber shader style) [SerializeField] bool m_AllowMaterialOverride = false; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index d7c984fa359..dce31c26fe5 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -16,8 +16,12 @@ internal struct FullscreenBlocks { public static BlockFieldDescriptor color = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "FullscreenColor", "Color", "SURFACEDESCRIPTION_COLOR", new ColorControl(UnityEngine.Color.grey, true), ShaderStage.Fragment); - public static BlockFieldDescriptor depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "FullscreenDepth", "Depth", - "SURFACEDESCRIPTION_DEPTH", new FloatControl(0), ShaderStage.Fragment); + public static BlockFieldDescriptor eyeDepth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "FullscreenEyeDepth", "Eye Depth", + "SURFACEDESCRIPTION_EYE_DEPTH", new FloatControl(0), ShaderStage.Fragment); + public static BlockFieldDescriptor linear01Depth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "FullscreenLinear01Depth", "Linear01 Depth", + "SURFACEDESCRIPTION_LINEAR01_DEPTH", new FloatControl(0), ShaderStage.Fragment); + public static BlockFieldDescriptor rawDepth = new BlockFieldDescriptor(BlockFields.SurfaceDescription.name, "FullscreenRawDepth", "Raw Depth", + "SURFACEDESCRIPTION_RAW_DEPTH", new FloatControl(0), ShaderStage.Fragment); } [GenerationAPI] @@ -48,6 +52,13 @@ internal enum FullscreenBlendMode Custom, } + internal enum FullscreenDepthWriteMode + { + LinearEye, + Linear01, + Raw, + } + internal static class FullscreenUniforms { public static readonly string blendModeProperty = "_Fullscreen_BlendMode"; @@ -198,10 +209,10 @@ public RenderStateCollection GetRenderState() Ref = fullscreenData.stencilReference.ToString(), ReadMask = fullscreenData.stencilReadMask.ToString(), WriteMask = fullscreenData.stencilWriteMask.ToString(), - Comp = fullscreenData.stencilCompareFunction.ToString(), - ZFail = fullscreenData.stencilDepthTestFailOperation.ToString(), - Fail = fullscreenData.stencilFailOperation.ToString(), - Pass = fullscreenData.stencilPassOperation.ToString(), + Comp = CompareFunctionToStencilString(fullscreenData.stencilCompareFunction), + ZFail = StencilOpToStencilString(fullscreenData.stencilDepthTestFailOperation), + Fail = StencilOpToStencilString(fullscreenData.stencilFailOperation), + Pass = StencilOpToStencilString(fullscreenData.stencilPassOperation), })); } } @@ -300,7 +311,7 @@ public virtual IncludeCollection GetPostGraphIncludes() return new IncludeCollection { { kFullscreenCommon, IncludeLocation.Postgraph } }; } - static readonly KeywordDescriptor depthWriteKeywork = new KeywordDescriptor + static readonly KeywordDescriptor depthWriteKeyword = new KeywordDescriptor { displayName = "Depth Write", referenceName = "DEPTH_WRITE", @@ -309,6 +320,21 @@ public virtual IncludeCollection GetPostGraphIncludes() stages = KeywordShaderStage.Fragment, }; + static readonly KeywordDescriptor depthWriteModeKeyword = new KeywordDescriptor + { + displayName = "Depth Write Mode", + referenceName = "DEPTH_WRITE_MODE", + type = KeywordType.Enum, + definition = KeywordDefinition.Predefined, + entries = new KeywordEntry[] + { + new KeywordEntry("Eye Depth", "EYE"), + new KeywordEntry("Eye Linear 01", "LINEAR01"), + new KeywordEntry("Eye Raw", "RAW"), + }, + stages = KeywordShaderStage.Fragment, + }; + public static StructDescriptor Varyings = new StructDescriptor() { name = "Varyings", @@ -351,7 +377,9 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com { BlockFields.SurfaceDescription.BaseColor, BlockFields.SurfaceDescription.Alpha, - FullscreenBlocks.depth, + FullscreenBlocks.eyeDepth, + FullscreenBlocks.linear01Depth, + FullscreenBlocks.rawDepth, }, // Fields @@ -382,7 +410,8 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com }, defines = new DefineCollection { - {depthWriteKeywork, 1, new FieldCondition(FullscreenFields.depth, true)}, + {depthWriteKeyword, 1, new FieldCondition(FullscreenFields.depth, true)}, + {depthWriteModeKeyword, (int)fullscreenData.depthWriteMode, new FieldCondition(FullscreenFields.depth, true)}, GetPassDefines(compatibility), }, keywords = GetPassKeywords(compatibility), @@ -448,7 +477,15 @@ public override void GetActiveBlocks(ref TargetActiveBlockContext context) { context.AddBlock(BlockFields.SurfaceDescription.BaseColor); context.AddBlock(BlockFields.SurfaceDescription.Alpha); - context.AddBlock(FullscreenBlocks.depth, fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled); + + var depthBlock = FullscreenBlocks.eyeDepth; + + if (fullscreenData.depthWriteMode == FullscreenDepthWriteMode.Linear01) + depthBlock = FullscreenBlocks.linear01Depth; + if (fullscreenData.depthWriteMode == FullscreenDepthWriteMode.Raw) + depthBlock = FullscreenBlocks.rawDepth; + + context.AddBlock(depthBlock, fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled); } public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) @@ -687,16 +724,36 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac onChange(); }); + if (fullscreenData.depthTestMode != CompareFunction.Disabled) + DrawDepthWriteMode(ref context); + context.AddProperty("Depth Write", new Toggle { value = fullscreenData.depthWrite }, (evt) => - { - if (Equals(fullscreenData.depthWrite, evt.newValue)) - return; + { + if (Equals(fullscreenData.depthWrite, evt.newValue)) + return; - registerUndo("Change Depth Test"); - fullscreenData.depthWrite = evt.newValue; - onChange(); - }); + registerUndo("Change Depth Write"); + fullscreenData.depthWrite = evt.newValue; + onChange(); + }); + + if (fullscreenData.depthWrite) + DrawDepthWriteMode(ref context); + void DrawDepthWriteMode(ref TargetPropertyGUIContext context) + { + context.globalIndentLevel++; + context.AddProperty("Mode", new EnumField(fullscreenData.depthWriteMode) { value = fullscreenData.depthWriteMode }, (evt) => + { + if (Equals(fullscreenData.depthWriteMode, evt.newValue)) + return; + + registerUndo("Change Depth Write Mode"); + fullscreenData.depthWriteMode = (FullscreenDepthWriteMode)evt.newValue; + onChange(); + }); + context.globalIndentLevel--; + } } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index cf8b48c4f35..e440dc7199c 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -111,8 +111,27 @@ FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) output.color.rgb = surfaceDescription.BaseColor; output.color.a = surfaceDescription.Alpha; -#ifdef DEPTH_WRITE - output.depth = surfaceDescription.FullscreenDepth; +#if defined(DEPTH_WRITE) + + float n = _ProjectionParams.y; + float f = _ProjectionParams.z; + +#if defined(DEPTH_WRITE_MODE_EYE) + // Reverse of LinearEyeDepth + float d = rcp(surfaceDescription.FullscreenEyeDepth); + output.depth = (d - _ZBufferParams.w) / _ZBufferParams.z; +#endif + +#if defined(DEPTH_WRITE_MODE_LINEAR01) + // Reverse of Linear01Depth + float d = rcp(surfaceDescription.FullscreenLinear01Depth); + output.depth = (d - _ZBufferParams.y) / _ZBufferParams.x; +#endif + +#if defined(DEPTH_WRITE_MODE_RAW) + output.depth = surfaceDescription.FullscreenRawDepth; +#endif + #endif return output; From 9b033a2706ff6c98c43e365c427f2efd058e1cf0 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 11:33:21 +0200 Subject: [PATCH 060/108] Fix stencil override of objects in HDRP --- .../DrawRenderersCustomPassDrawer.cs | 20 +++++++++++-------- .../RenderPass/DrawRenderersCustomPass.cs | 3 ++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs index 5b484427824..e1549b01218 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs @@ -49,13 +49,13 @@ private class Styles //Stencil Settings public static GUIContent overrideStencil = new GUIContent("Override Stencil", "Override stencil state of the objects rendered."); - public static GUIContent stencilReferenceValue = new GUIContent("Reference", "."); - public static GUIContent stencilWriteMask = new GUIContent("Write Mask", "."); - public static GUIContent stencilReadMask = new GUIContent("Read Mask", "."); - public static GUIContent stencilCompareFunction = new GUIContent("Compare Function", "."); - public static GUIContent stencilPassOperation = new GUIContent("Pass", "."); - public static GUIContent stencilFailOperation = new GUIContent("Fail", "."); - public static GUIContent stencilDepthFailOperation = new GUIContent("Depth Fail", "."); + public static GUIContent stencilReferenceValue = new GUIContent("Reference", "Reference value used for stencil comparison and operations."); + public static GUIContent stencilWriteMask = new GUIContent("Write Mask", "Tells which bit are allowed to be read during the stencil test."); + public static GUIContent stencilReadMask = new GUIContent("Read Mask", "Tells which bit are allowed to be written during the stencil test."); + public static GUIContent stencilCompareFunction = new GUIContent("Comparison", "Tells which function to use when doing the stencil test."); + public static GUIContent stencilPassOperation = new GUIContent("Pass", "Tells what to do when the stencil test succeed."); + public static GUIContent stencilFailOperation = new GUIContent("Fail", "Tells what to do when the stencil test fai1ls."); + public static GUIContent stencilDepthFailOperation = new GUIContent("Depth Fail", "Tells what to do when the depth test fails."); //Camera Settings public static GUIContent overrideCamera = new GUIContent("Camera", "Override camera projections."); @@ -132,6 +132,7 @@ static UserStencilUsageWorkaround ConvertToUserStencilUsageWorkaround(UserStenci SerializedProperty m_StencilReferenceValue; SerializedProperty m_StencilWriteMask; SerializedProperty m_StencilReadMask; + SerializedProperty m_StencilComparison; SerializedProperty m_StencilPassOperation; SerializedProperty m_StencilFailOperation; SerializedProperty m_StencilDepthFailOperation; @@ -174,6 +175,7 @@ protected override void Initialize(SerializedProperty customPass) m_StencilReferenceValue = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilReferenceValue)); m_StencilWriteMask = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilWriteMask)); m_StencilReadMask = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilReadMask)); + m_StencilComparison = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilCompareFunction)); m_StencilPassOperation = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilPassOperation)); m_StencilFailOperation = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilFailOperation)); m_StencilDepthFailOperation = customPass.FindPropertyRelative(nameof(DrawRenderersCustomPass.stencilDepthFailOperation)); @@ -378,6 +380,8 @@ void DoMaterialOverride(ref Rect rect) DrawStencilIntField(ref rect, m_StencilReadMask, Styles.stencilReadMask); DrawStencilIntField(ref rect, m_StencilWriteMask, Styles.stencilWriteMask); rect.y += Styles.defaultLineSpace; + EditorGUI.PropertyField(rect, m_StencilComparison, Styles.stencilCompareFunction); + rect.y += Styles.defaultLineSpace; EditorGUI.PropertyField(rect, m_StencilPassOperation, Styles.stencilPassOperation); rect.y += Styles.defaultLineSpace; EditorGUI.PropertyField(rect, m_StencilFailOperation, Styles.stencilFailOperation); @@ -466,7 +470,7 @@ protected override float GetPassHeight(SerializedProperty customPass) if (showMaterialOverride) height += Styles.defaultLineSpace * m_MaterialLines; height += Styles.defaultLineSpace * (m_OverrideDepthState.boolValue && !customDepthIsNone ? 3 : 1); - height += Styles.defaultLineSpace * (m_OverrideStencilState.boolValue && !customDepthIsNone ? 7 : 1); + height += Styles.defaultLineSpace * (m_OverrideStencilState.boolValue && !customDepthIsNone ? 8 : 1); var mat = m_OverrideMaterial.objectReferenceValue as Material; #if SHOW_PASS_NAMES diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs index bd4f42481f2..76bfafe445c 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs @@ -89,7 +89,7 @@ public enum ShaderPass /// /// Comparison operation between the stencil buffer and the reference value. /// - public CompareFunction stencilCompareFunction; + public CompareFunction stencilCompareFunction = CompareFunction.Always; /// /// Operation to execute if the stencil test passes. @@ -194,6 +194,7 @@ protected override void Execute(CustomPassContext ctx) depthState = new DepthState(depthWrite, depthCompareFunction), // We disable the stencil when the depth is overwritten but we don't write to it, to prevent writing to the stencil. stencilState = new StencilState(overrideStencil, (byte)stencilReadMask, (byte)stencilWriteMask, stencilCompareFunction, stencilPassOperation, stencilFailOperation, stencilDepthFailOperation), + stencilReference = overrideStencil ? stencilReferenceValue : 0, }; PerObjectData renderConfig = ctx.hdCamera.frameSettings.IsEnabled(FrameSettingsField.Shadowmask) ? HDUtils.GetBakedLightingWithShadowMaskRenderConfig() : HDUtils.GetBakedLightingRenderConfig(); From d1ece61624fe9554b1c959fed15d3321e88df11a Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 11:43:03 +0200 Subject: [PATCH 061/108] Fix wrong pass index used in fullscreen custom pass --- .../RenderPipeline/RenderPass/FullScreenCustomPass.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/FullScreenCustomPass.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/FullScreenCustomPass.cs index 85a89b72cd0..99398a7b79b 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/FullScreenCustomPass.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/FullScreenCustomPass.cs @@ -49,7 +49,7 @@ protected override void Setup(ScriptableRenderContext renderContext, CommandBuff /// The context of the custom pass. Contains command buffer, render context, buffer, etc. protected override void Execute(CustomPassContext ctx) { - if (fullscreenPassMaterial != null) + if (fullscreenPassMaterial != null && fullscreenPassMaterial.passCount > 0) { if (fetchColorBuffer) { @@ -58,8 +58,13 @@ protected override void Execute(CustomPassContext ctx) SetRenderTargetAuto(ctx.cmd); } + // In case the pass name is not found, we fallback on the first one instead of drawing all of them (default behavior with pass id = -1) + int passIndex = fullscreenPassMaterial.FindPass(materialPassName); + if (passIndex == -1) + passIndex = 0; + fullscreenPassMaterial.SetFloat(fadeValueId, fadeValue); - CoreUtils.DrawFullScreen(ctx.cmd, fullscreenPassMaterial, shaderPassId: fullscreenPassMaterial.FindPass(materialPassName)); + CoreUtils.DrawFullScreen(ctx.cmd, fullscreenPassMaterial, shaderPassId: passIndex); } } From 8ad492d288e940cc2920575da0fb20be7af68f0e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 11:52:29 +0200 Subject: [PATCH 062/108] Fix fullscreen shader tooltips --- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs index f6ae849ad5f..b0e4e3f6a90 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -26,31 +26,30 @@ protected class Styles public static readonly GUIContent blendingMode = EditorGUIUtility.TrTextContent("Blending Mode", "Controls how the color of the Transparent surface blends with the Material color in the background."); public static readonly GUIContent srcColorBlendMode = EditorGUIUtility.TrTextContent("Src Color", - "TODO"); + "Describes how the input color will be blended."); public static readonly GUIContent dstColorBlendMode = EditorGUIUtility.TrTextContent("Dst Color", - "TODO"); + "Describes how the destination color will be blended."); public static readonly GUIContent colorBlendOperation = EditorGUIUtility.TrTextContent("Color Blend Op", - "TODO"); + "Tell which operation to use when blending the colors. Default is Add."); public static readonly GUIContent srcAlphaBlendMode = EditorGUIUtility.TrTextContent("Src Alpha", - "TODO"); + "Describes how the input alpha will be blended."); public static readonly GUIContent dstAlphaBlendMode = EditorGUIUtility.TrTextContent("Dst Alpha", - "TODO"); + "Describes how the input alpha will be blended."); public static readonly GUIContent alphaBlendOperation = EditorGUIUtility.TrTextContent("Alpha Blend Op", - "TODO"); + "Tell which operation to use when blending the alpha channel. Default is Add."); public static readonly GUIContent depthWrite = EditorGUIUtility.TrTextContent("Depth Write", "Controls whether the shader writes depth."); public static readonly GUIContent depthTest = EditorGUIUtility.TrTextContent("Depth Test", "Specifies the depth test mode. The default is Always."); - public static readonly GUIContent stencil = EditorGUIUtility.TrTextContent("Stencil Override", "TODO"); - public static readonly GUIContent stencilRef = EditorGUIUtility.TrTextContent("Reference", "TODO"); - public static readonly GUIContent stencilReadMask = EditorGUIUtility.TrTextContent("Read Mask", "TODO"); - public static readonly GUIContent stencilWriteMask = EditorGUIUtility.TrTextContent("Write Mask", "TODO"); - public static readonly GUIContent stencilComparison = EditorGUIUtility.TrTextContent("Comparison", "TODO"); - public static readonly GUIContent stencilPass = EditorGUIUtility.TrTextContent("Pass", "TODO"); - public static readonly GUIContent stencilFail = EditorGUIUtility.TrTextContent("Fail", "TODO"); - public static readonly GUIContent stencilDepthFail = EditorGUIUtility.TrTextContent("Depth Fail", "TODO"); - + public static readonly GUIContent stencil = EditorGUIUtility.TrTextContent("Stencil Override", "Enable the stencil block in the shader."); + public static readonly GUIContent stencilRef = EditorGUIUtility.TrTextContent("Reference", "Reference value use for comparison and operations."); + public static readonly GUIContent stencilReadMask = EditorGUIUtility.TrTextContent("Read Mask", "Tells which bit are allowed to be read during the stencil test."); + public static readonly GUIContent stencilWriteMask = EditorGUIUtility.TrTextContent("Write Mask", "Tells which bit are allowed to be written during the stencil test."); + public static readonly GUIContent stencilComparison = EditorGUIUtility.TrTextContent("Comparison", "Tells which function to use when doing the stencil test."); + public static readonly GUIContent stencilPass = EditorGUIUtility.TrTextContent("Pass", "Tells what to do when the stencil test succeed."); + public static readonly GUIContent stencilFail = EditorGUIUtility.TrTextContent("Fail", "Tells what to do when the stencil test fails."); + public static readonly GUIContent stencilDepthFail = EditorGUIUtility.TrTextContent("Depth Fail", "Tells what to do when the depth test fails."); } public bool m_FirstTimeApply = true; From 4eefb04a4b3f9806ad5b6cad1bf16e98c2d9ad94 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 12:29:48 +0200 Subject: [PATCH 063/108] Fix cubemap sampling in CRT shader, preview texture declaration and remove useless asmdef --- .../CustomRenderTexture/CustomTexture.hlsl | 24 ------------------- .../CustomRenderTexture/CustomTextureNodes.cs | 13 ++++++---- .../CustomTextureSubShader.template | 12 +++++++--- .../CustomTextureSubTarget.cs | 2 +- .../CustomRenderTexture/ShaderGraphRef.asmref | 3 --- .../ShaderGraphRef.asmref.meta | 7 ------ 6 files changed, 18 insertions(+), 43 deletions(-) delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl index f091eb959a9..2d5311ad14e 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl @@ -276,28 +276,4 @@ v2f_init_customrendertexture InitCustomRenderTextureVertexShader (appdata_init_c return o; } -#ifdef CRT_CUBE -#define FIX_CUBEMAP_DIRECTION(crt) crt.direction = normalize(crt.direction) -#else -#define FIX_CUBEMAP_DIRECTION(crt) -#endif - -#ifdef CRT_3D -#define FIX_TEXTURE3D_POSITION_Z(crt) crt.localTexcoord.z += rcp(_CustomRenderTextureDepth * 2.0); -#else -#define FIX_TEXTURE3D_POSITION_Z(crt) -#endif - - -// Declare the prototype -float4 mixture(v2f_customrendertexture i); - -float4 MixtureFragment (v2f_customrendertexture i) : SV_Target -{ - // Fix the cubemap direction: - FIX_CUBEMAP_DIRECTION(i); - FIX_TEXTURE3D_POSITION_Z(i); - return mixture(i); -} - #endif // UNITY_CUSTOM_TEXTURE_INCLUDED diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs index 9006037f519..a4f1b7c7b40 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -132,7 +132,7 @@ public sealed override void UpdateNodeAfterDeserialization() { AddSlot(new Texture2DMaterialSlot(OutputSlotSelf2DId, kOutputSlotSelf2DName, kOutputSlotSelf2DName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); AddSlot(new CubemapMaterialSlot(OutputSlotSelfCubeId, kOutputSlotSelfCubeName, kOutputSlotSelfCubeName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); - AddSlot(new Texture2DMaterialSlot(OutputSlotSelf3DId, kOutputSlotSelf3DName, kOutputSlotSelf3DName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); + AddSlot(new Texture3DMaterialSlot(OutputSlotSelf3DId, kOutputSlotSelf3DName, kOutputSlotSelf3DName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); RemoveSlotsNameNotMatching(validSlots); } @@ -143,9 +143,9 @@ public override string GetVariableNameForSlot(int slotId) case OutputSlotSelf2DId: return "UnityBuildTexture2DStructNoScale(_SelfTexture2D)"; case OutputSlotSelfCubeId: - return "UnityBuildTextureCubeStructNoScale(_SelfTextureCube)"; + return "UnityBuildTextureCubeStruct(_SelfTextureCube)"; default: - return "UnityBuildTexture3DStructNoScale(_SelfTexture3D)"; + return "UnityBuildTexture3DStruct(_SelfTexture3D)"; } } @@ -154,15 +154,18 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener // For preview only we declare CRT defines if (generationMode == GenerationMode.Preview) { + registry.builder.AppendLine("#if !defined(UNITY_CRT_PREVIEW_TEXTURE) && !defined(UNITY_CUSTOM_TEXTURE_INCLUDED)"); + registry.builder.AppendLine("#define UNITY_CRT_PREVIEW_TEXTURE"); registry.builder.AppendLine("TEXTURE2D(_SelfTexture2D);"); registry.builder.AppendLine("SAMPLER(sampler_SelfTexture2D);"); registry.builder.AppendLine("float4 _SelfTexture2D_TexelSize;"); - registry.builder.AppendLine("TEXTURE2D(_SelfTextureCube);"); + registry.builder.AppendLine("TEXTURECUBE(_SelfTextureCube);"); registry.builder.AppendLine("SAMPLER(sampler_SelfTextureCube);"); registry.builder.AppendLine("float4 _SelfTextureCube_TexelSize;"); - registry.builder.AppendLine("TEXTURE2D(_SelfTexture3D);"); + registry.builder.AppendLine("TEXTURE3D(_SelfTexture3D);"); registry.builder.AppendLine("SAMPLER(sampler_SelfTexture3D);"); registry.builder.AppendLine("float4 sampler_SelfTexture3D_TexelSize;"); + registry.builder.AppendLine("#endif"); } } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template index 589abe64d1a..5481d79a2fa 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template @@ -45,6 +45,9 @@ Pass // ShaderGraph accessors: float3 WorldSpaceViewDirection; float3 TimeParameters; + float3 WorldSpaceNormal; + float2 NDCPosition; + float4 ScreenPosition; }; SurfaceDescriptionInputs ConvertV2FToSurfaceInputs( v2f_customrendertexture IN ) @@ -54,11 +57,14 @@ Pass o.uv0 = float4(IN.localTexcoord, 0); o.uv1 = float4(IN.globalTexcoord, 0); o.primitiveID = IN.primitiveID; - o.direction = IN.direction; + o.direction = normalize(IN.direction); // other space of view direction are not supported - o.WorldSpaceViewDirection = o.direction; - o.TimeParameters = float3(_Time.y, _SinTime.x, _CosTime.y); + $SurfaceDescriptionInputs.WorldSpaceViewDirection: o.WorldSpaceViewDirection = o.direction; + $SurfaceDescriptionInputs.TimeParameters: o.TimeParameters = float3(_Time.y, _SinTime.x, _CosTime.y); + $SurfaceDescriptionInputs.WorldSpaceNormal: o.WorldSpaceNormal = o.direction; + $SurfaceDescriptionInputs.NDCPosition: o.NDCPosition = o.uv0.xy; + $SurfaceDescriptionInputs.ScreenPosition: o.ScreenPosition = float4(o.uv0.xy, 0, 1); return o; } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs index 76345338bd0..09f03ef082a 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs @@ -8,7 +8,7 @@ namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph { sealed class CustomTextureSubTarget : SubTarget { - const string kAssetGuid = "5b2d4724a38a5485ba5e7dc2f7d86f1a"; // CustomTextureSubShader.cs + const string kAssetGuid = "5b2d4724a38a5485ba5e7dc2f7d86f1a"; // CustomTextureSubTarget.cs internal static FieldDescriptor colorField = new FieldDescriptor(String.Empty, "Color", string.Empty); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref deleted file mode 100644 index 6f5b7c2733d..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref +++ /dev/null @@ -1,3 +0,0 @@ -{ - "reference": "GUID:be0903cd8e1546f498710afdc59db5eb" -} \ No newline at end of file diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta deleted file mode 100644 index 4450ceb19e9..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 6c89fe02bcce6b9408a6cfa328cfa005 -AssemblyDefinitionReferenceImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From b97a32d84f086a079ffc7d0a6f17cc50dae55e5f Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 11:52:29 +0200 Subject: [PATCH 064/108] Fix fullscreen shader tooltips --- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs index 3329a90f0d6..b0e4e3f6a90 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -42,15 +42,14 @@ protected class Styles public static readonly GUIContent depthTest = EditorGUIUtility.TrTextContent("Depth Test", "Specifies the depth test mode. The default is Always."); - public static readonly GUIContent stencil = EditorGUIUtility.TrTextContent("Stencil Override", "TODO"); - public static readonly GUIContent stencilRef = EditorGUIUtility.TrTextContent("Reference", "TODO"); - public static readonly GUIContent stencilReadMask = EditorGUIUtility.TrTextContent("Read Mask", "TODO"); - public static readonly GUIContent stencilWriteMask = EditorGUIUtility.TrTextContent("Write Mask", "TODO"); - public static readonly GUIContent stencilComparison = EditorGUIUtility.TrTextContent("Comparison", "TODO"); - public static readonly GUIContent stencilPass = EditorGUIUtility.TrTextContent("Pass", "TODO"); - public static readonly GUIContent stencilFail = EditorGUIUtility.TrTextContent("Fail", "TODO"); - public static readonly GUIContent stencilDepthFail = EditorGUIUtility.TrTextContent("Depth Fail", "TODO"); - + public static readonly GUIContent stencil = EditorGUIUtility.TrTextContent("Stencil Override", "Enable the stencil block in the shader."); + public static readonly GUIContent stencilRef = EditorGUIUtility.TrTextContent("Reference", "Reference value use for comparison and operations."); + public static readonly GUIContent stencilReadMask = EditorGUIUtility.TrTextContent("Read Mask", "Tells which bit are allowed to be read during the stencil test."); + public static readonly GUIContent stencilWriteMask = EditorGUIUtility.TrTextContent("Write Mask", "Tells which bit are allowed to be written during the stencil test."); + public static readonly GUIContent stencilComparison = EditorGUIUtility.TrTextContent("Comparison", "Tells which function to use when doing the stencil test."); + public static readonly GUIContent stencilPass = EditorGUIUtility.TrTextContent("Pass", "Tells what to do when the stencil test succeed."); + public static readonly GUIContent stencilFail = EditorGUIUtility.TrTextContent("Fail", "Tells what to do when the stencil test fails."); + public static readonly GUIContent stencilDepthFail = EditorGUIUtility.TrTextContent("Depth Fail", "Tells what to do when the depth test fails."); } public bool m_FirstTimeApply = true; From d7666045c5dc0caad96732d3f8a482dfa9ac9751 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 12:29:48 +0200 Subject: [PATCH 065/108] Fix cubemap sampling in CRT shader, preview texture declaration and remove useless asmdef --- .../CustomRenderTexture/CustomTexture.hlsl | 24 ------------------- .../CustomRenderTexture/CustomTextureNodes.cs | 13 ++++++---- .../CustomTextureSubShader.template | 12 +++++++--- .../CustomTextureSubTarget.cs | 2 +- .../CustomRenderTexture/ShaderGraphRef.asmref | 3 --- .../ShaderGraphRef.asmref.meta | 7 ------ 6 files changed, 18 insertions(+), 43 deletions(-) delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl index f091eb959a9..2d5311ad14e 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl @@ -276,28 +276,4 @@ v2f_init_customrendertexture InitCustomRenderTextureVertexShader (appdata_init_c return o; } -#ifdef CRT_CUBE -#define FIX_CUBEMAP_DIRECTION(crt) crt.direction = normalize(crt.direction) -#else -#define FIX_CUBEMAP_DIRECTION(crt) -#endif - -#ifdef CRT_3D -#define FIX_TEXTURE3D_POSITION_Z(crt) crt.localTexcoord.z += rcp(_CustomRenderTextureDepth * 2.0); -#else -#define FIX_TEXTURE3D_POSITION_Z(crt) -#endif - - -// Declare the prototype -float4 mixture(v2f_customrendertexture i); - -float4 MixtureFragment (v2f_customrendertexture i) : SV_Target -{ - // Fix the cubemap direction: - FIX_CUBEMAP_DIRECTION(i); - FIX_TEXTURE3D_POSITION_Z(i); - return mixture(i); -} - #endif // UNITY_CUSTOM_TEXTURE_INCLUDED diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs index 9006037f519..a4f1b7c7b40 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -132,7 +132,7 @@ public sealed override void UpdateNodeAfterDeserialization() { AddSlot(new Texture2DMaterialSlot(OutputSlotSelf2DId, kOutputSlotSelf2DName, kOutputSlotSelf2DName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); AddSlot(new CubemapMaterialSlot(OutputSlotSelfCubeId, kOutputSlotSelfCubeName, kOutputSlotSelfCubeName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); - AddSlot(new Texture2DMaterialSlot(OutputSlotSelf3DId, kOutputSlotSelf3DName, kOutputSlotSelf3DName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); + AddSlot(new Texture3DMaterialSlot(OutputSlotSelf3DId, kOutputSlotSelf3DName, kOutputSlotSelf3DName, SlotType.Output, ShaderStageCapability.Fragment, false) { bareResource = true }); RemoveSlotsNameNotMatching(validSlots); } @@ -143,9 +143,9 @@ public override string GetVariableNameForSlot(int slotId) case OutputSlotSelf2DId: return "UnityBuildTexture2DStructNoScale(_SelfTexture2D)"; case OutputSlotSelfCubeId: - return "UnityBuildTextureCubeStructNoScale(_SelfTextureCube)"; + return "UnityBuildTextureCubeStruct(_SelfTextureCube)"; default: - return "UnityBuildTexture3DStructNoScale(_SelfTexture3D)"; + return "UnityBuildTexture3DStruct(_SelfTexture3D)"; } } @@ -154,15 +154,18 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener // For preview only we declare CRT defines if (generationMode == GenerationMode.Preview) { + registry.builder.AppendLine("#if !defined(UNITY_CRT_PREVIEW_TEXTURE) && !defined(UNITY_CUSTOM_TEXTURE_INCLUDED)"); + registry.builder.AppendLine("#define UNITY_CRT_PREVIEW_TEXTURE"); registry.builder.AppendLine("TEXTURE2D(_SelfTexture2D);"); registry.builder.AppendLine("SAMPLER(sampler_SelfTexture2D);"); registry.builder.AppendLine("float4 _SelfTexture2D_TexelSize;"); - registry.builder.AppendLine("TEXTURE2D(_SelfTextureCube);"); + registry.builder.AppendLine("TEXTURECUBE(_SelfTextureCube);"); registry.builder.AppendLine("SAMPLER(sampler_SelfTextureCube);"); registry.builder.AppendLine("float4 _SelfTextureCube_TexelSize;"); - registry.builder.AppendLine("TEXTURE2D(_SelfTexture3D);"); + registry.builder.AppendLine("TEXTURE3D(_SelfTexture3D);"); registry.builder.AppendLine("SAMPLER(sampler_SelfTexture3D);"); registry.builder.AppendLine("float4 sampler_SelfTexture3D_TexelSize;"); + registry.builder.AppendLine("#endif"); } } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template index 589abe64d1a..5481d79a2fa 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template @@ -45,6 +45,9 @@ Pass // ShaderGraph accessors: float3 WorldSpaceViewDirection; float3 TimeParameters; + float3 WorldSpaceNormal; + float2 NDCPosition; + float4 ScreenPosition; }; SurfaceDescriptionInputs ConvertV2FToSurfaceInputs( v2f_customrendertexture IN ) @@ -54,11 +57,14 @@ Pass o.uv0 = float4(IN.localTexcoord, 0); o.uv1 = float4(IN.globalTexcoord, 0); o.primitiveID = IN.primitiveID; - o.direction = IN.direction; + o.direction = normalize(IN.direction); // other space of view direction are not supported - o.WorldSpaceViewDirection = o.direction; - o.TimeParameters = float3(_Time.y, _SinTime.x, _CosTime.y); + $SurfaceDescriptionInputs.WorldSpaceViewDirection: o.WorldSpaceViewDirection = o.direction; + $SurfaceDescriptionInputs.TimeParameters: o.TimeParameters = float3(_Time.y, _SinTime.x, _CosTime.y); + $SurfaceDescriptionInputs.WorldSpaceNormal: o.WorldSpaceNormal = o.direction; + $SurfaceDescriptionInputs.NDCPosition: o.NDCPosition = o.uv0.xy; + $SurfaceDescriptionInputs.ScreenPosition: o.ScreenPosition = float4(o.uv0.xy, 0, 1); return o; } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs index 76345338bd0..09f03ef082a 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs @@ -8,7 +8,7 @@ namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph { sealed class CustomTextureSubTarget : SubTarget { - const string kAssetGuid = "5b2d4724a38a5485ba5e7dc2f7d86f1a"; // CustomTextureSubShader.cs + const string kAssetGuid = "5b2d4724a38a5485ba5e7dc2f7d86f1a"; // CustomTextureSubTarget.cs internal static FieldDescriptor colorField = new FieldDescriptor(String.Empty, "Color", string.Empty); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref deleted file mode 100644 index 6f5b7c2733d..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref +++ /dev/null @@ -1,3 +0,0 @@ -{ - "reference": "GUID:be0903cd8e1546f498710afdc59db5eb" -} \ No newline at end of file diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta deleted file mode 100644 index 4450ceb19e9..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/ShaderGraphRef.asmref.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 6c89fe02bcce6b9408a6cfa328cfa005 -AssemblyDefinitionReferenceImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From b54a050403a25e5b7be5eaddfa2254237dc570b9 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 18:40:33 +0200 Subject: [PATCH 066/108] Cleanup HDRP side PR --- .../Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs | 2 +- .../RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs index 10de1070e88..4e154364767 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs @@ -11,7 +11,7 @@ namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { class HDFullscreenSubTarget : FullscreenSubTarget, IHasMetadata { - static readonly GUID kSourceCodeGuid = new GUID("657f6eb2bee4e2f4985ec1ac58eb04cb"); // HDFullscreenSubTarget.cs // TODO + static readonly GUID kSourceCodeGuid = new GUID("657f6eb2bee4e2f4985ec1ac58eb04cb"); // HDFullscreenSubTarget.cs public override void Setup(ref TargetSetupContext context) { diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index 5a9b2c0b51f..b4c799c9792 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -103,7 +103,6 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) } } } - GUI.changed = true; } bool DoesWriteMaskContainsReservedBits(Material material) From 1d7186e0fe85b683f69ad510eac8f4561dead0ac Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 18:44:45 +0200 Subject: [PATCH 067/108] Cleanup CRT + add proeprty aliases --- .../CustomRenderTexture/CustomTexture.hlsl | 2 +- .../CustomRenderTexture/CustomTextureNodes.cs | 46 ------------------- .../CustomTextureSubShader.template | 36 +++++++++++++++ 3 files changed, 37 insertions(+), 47 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl index 2d5311ad14e..d2fe9b5662a 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl @@ -73,7 +73,7 @@ float CustomRenderTexturePrimitiveIDs[kCustomTextureBatchSize]; float4 CustomRenderTextureParameters; #define CustomRenderTextureUpdateSpace CustomRenderTextureParameters.x // Normalized(0)/PixelSpace(1) #define CustomRenderTexture3DTexcoordW CustomRenderTextureParameters.y -#define CustomRenderTextureIs3D CustomRenderTextureParameters.z == CRT_DIMENSION_3D +#define CustomRenderTextureIs3D (CustomRenderTextureParameters.z == CRT_DIMENSION_3D) #define CustomRenderTextureDimension CustomRenderTextureParameters.z // User facing uniform variables diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs index a4f1b7c7b40..1bca4b6c16d 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -169,50 +169,4 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } } } - - [Title("Custom Render Texture", "Current Dimension")] - [SubTargetFilter(typeof(CustomTextureSubTarget))] - - class CustomTextureDimension : AbstractMaterialNode, IGeneratesBodyCode - { - private const string kOutputSlot2D = "Is 2D"; - private const string kOutputSlot3D = "Is 3D"; - private const string kOutputSlotCube = "Is Cube"; - - public const int kOutputSlot2DId = 0; - public const int kOutputSlot3DId = 1; - public const int kOutputSlotCubeId = 2; - - public CustomTextureDimension() - { - name = "Custom Render Texture Dimension"; - UpdateNodeAfterDeserialization(); - } - - protected int[] validSlots => new[] { kOutputSlot2DId, kOutputSlot3DId, kOutputSlotCubeId }; - - public sealed override void UpdateNodeAfterDeserialization() - { - AddSlot(new BooleanMaterialSlot(kOutputSlot2DId, kOutputSlot2D, kOutputSlot2D, SlotType.Output, false)); - AddSlot(new BooleanMaterialSlot(kOutputSlot3DId, kOutputSlot3D, kOutputSlot3D, SlotType.Output, false)); - AddSlot(new BooleanMaterialSlot(kOutputSlotCubeId, kOutputSlotCube, kOutputSlotCube, SlotType.Output, false)); - RemoveSlotsNameNotMatching(validSlots); - } - - public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) - { - if (generationMode.IsPreview()) - { - sb.AppendLine(@"bool {0} = false;", GetVariableNameForSlot(kOutputSlot2DId)); - sb.AppendLine(@"bool {0} = false;", GetVariableNameForSlot(kOutputSlot3DId)); - sb.AppendLine(@"bool {0} = false;", GetVariableNameForSlot(kOutputSlotCubeId)); - } - else - { - sb.AppendLine(@"bool {0} = CustomRenderTextureDimension == CRT_DIMENSION_2D;", GetVariableNameForSlot(kOutputSlot2DId)); - sb.AppendLine(@"bool {0} = CustomRenderTextureDimension == CRT_DIMENSION_3D;", GetVariableNameForSlot(kOutputSlot3DId)); - sb.AppendLine(@"bool {0} = CustomRenderTextureDimension == CRT_DIMENSION_CUBE;", GetVariableNameForSlot(kOutputSlotCubeId)); - } - } - } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template index 5481d79a2fa..3a69b338d4e 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template @@ -44,8 +44,11 @@ Pass // ShaderGraph accessors: float3 WorldSpaceViewDirection; + float3 ObjectSpaceViewDirection; + float3 ObjectSpacePosition; float3 TimeParameters; float3 WorldSpaceNormal; + float3 ObjectSpaceNormal; float2 NDCPosition; float4 ScreenPosition; }; @@ -61,11 +64,44 @@ Pass // other space of view direction are not supported $SurfaceDescriptionInputs.WorldSpaceViewDirection: o.WorldSpaceViewDirection = o.direction; + $SurfaceDescriptionInputs.ObjectSpaceViewDirection: o.ObjectSpaceViewDirection = o.direction; + $SurfaceDescriptionInputs.ObjectSpacePosition: o.ObjectSpacePosition = o.direction; $SurfaceDescriptionInputs.TimeParameters: o.TimeParameters = float3(_Time.y, _SinTime.x, _CosTime.y); $SurfaceDescriptionInputs.WorldSpaceNormal: o.WorldSpaceNormal = o.direction; + $SurfaceDescriptionInputs.ObjectSpaceNormal o.ObjectSpaceNormal = o.direction; $SurfaceDescriptionInputs.NDCPosition: o.NDCPosition = o.uv0.xy; $SurfaceDescriptionInputs.ScreenPosition: o.ScreenPosition = float4(o.uv0.xy, 0, 1); + // Unsupported properties: + $SurfaceDescriptionInputs.WorldSpaceBiTangent: #error 'WorldSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpaceNormal: #error 'ViewSpaceNormal' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpaceNormal: #error 'TangentSpaceNormal' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.WorldSpaceTangent: #error 'WorldSpaceTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.WorldSpaceBiTangent: #error 'WorldSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ObjectSpaceTangent: #error 'ObjectSpaceTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpaceTangent: #error 'ViewSpaceTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpaceTangent: #error 'TangentSpaceTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ObjectSpaceBiTangent: #error 'ObjectSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpaceBiTangent: #error 'ViewSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpaceBiTangent: #error 'TangentSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpaceViewDirection: #error 'ViewSpaceViewDirection' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpaceViewDirection: #error 'TangentSpaceViewDirection' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpacePosition: #error ViewSpacePosition'' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpacePosition: #error 'TangentSpacePosition' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.WorldSpacePositionPredisplacement: #error 'WorldSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ObjectSpacePositionPredisplacement: #error 'ObjectSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpacePositionPredisplacement: #error 'ViewSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpacePositionPredisplacement: #error 'TangentSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.AbsoluteWorldSpacePositionPredisplacement: #error 'AbsoluteWorldSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.uv2: #error 'uv2' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.uv3: #error 'uv3' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.VertexColor: #error 'VertexColor' is not available in Custom Render Textures. + + // We can't fake the positions because we can't differentiate Cube and 2D custom render textures + $SurfaceDescriptionInputs.WorldSpacePosition: #error 'WorldSpacePosition' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ObjectSpacePosition: #error 'ObjectSpacePosition' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.AbsoluteWorldSpacePosition: #error 'AbsoluteWorldSpacePosition' is not available in Custom Render Textures. + return o; } From 77c4de7316da1ebdf7e422ab075ab4cc6a8095d3 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 18:59:04 +0200 Subject: [PATCH 068/108] PR fixes for ShaderGraph --- .../Editor/ShaderGraph/Targets/BuiltInTarget.cs | 12 ++++++------ .../CustomRenderTexture/CustomRenderTextureTarget.cs | 2 +- .../CustomRenderTexture/CustomTextureGraph.hlsl | 3 ++- .../CustomTextureSubShader.template | 2 +- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 1 - .../Targets/Fullscreen/FullscreenSubTarget.cs | 2 -- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs index 6786986f024..84929a5548f 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs @@ -83,7 +83,7 @@ sealed class BuiltInTarget : Target, IHasMetadata // Subtarget Data [SerializeField] - List> m_Datas = new List>(); + List> m_SubTargetData = new List>(); // View PopupField m_SubTargetField; @@ -458,9 +458,9 @@ void ProcessSubTargetDatas(SubTarget subTarget) void ClearUnusedData() { - for (int i = 0; i < m_Datas.Count; i++) + for (int i = 0; i < m_SubTargetData.Count; i++) { - var data = m_Datas[i]; + var data = m_SubTargetData[i]; var type = data.value.GetType(); // Data requirement interfaces need generic type arguments @@ -477,11 +477,11 @@ public void SetDataOnSubTarget(SubTarget subTarget) where T : JsonObject return; // Ensure data object exists in list - var data = m_Datas.SelectValue().FirstOrDefault(x => x.GetType().Equals(typeof(T))) as T; + var data = m_SubTargetData.SelectValue().FirstOrDefault(x => x.GetType().Equals(typeof(T))) as T; if (data == null) { data = Activator.CreateInstance(typeof(T)) as T; - m_Datas.Add(data); + m_SubTargetData.Add(data); } // Apply data object to SubTarget @@ -492,7 +492,7 @@ public void ValidateDataForSubTarget(SubTarget subTarget, T data) where T : J { if (!(subTarget is IRequiresData requiresData)) { - m_Datas.Remove(data); + m_SubTargetData.Remove(data); } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs index 4b0737e2d8c..762d1b3a2a3 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs @@ -213,7 +213,7 @@ static class FullscreePasses // Port Mask validVertexBlocks = new BlockFieldDescriptor[] - { + { BlockFields.VertexDescription.Position, BlockFields.VertexDescription.Normal, BlockFields.VertexDescription.Tangent, diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl index 36981dd1bfc..0126093920e 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl @@ -21,13 +21,14 @@ bool IsGammaSpace() float3 UnpackNormalmapRGorAG(float4 packednormal) { // This do the trick - packednormal.x *= packednormal.w; + packednormal.x *= packednormal.w; float3 normal; normal.xy = packednormal.xy * 2 - 1; normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy))); return normal; } + inline float3 UnpackNormal(float4 packednormal) { #if defined(UNITY_NO_DXT5nm) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template index 3a69b338d4e..f685960f675 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template @@ -25,7 +25,7 @@ Pass #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl" #pragma vertex CustomRenderTextureVertexShader #pragma fragment frag - #pragma target 4.5 + #pragma target 3.0 // Pragmas $splice(PassPragmas) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs index b0e4e3f6a90..fac46900a21 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -152,7 +152,6 @@ protected virtual void DrawSurfaceOptions(Material material) if (material.HasProperty(FullscreenUniforms.stencilEnableProperty)) { - EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck(); m_MaterialEditor.ShaderProperty(stencilEnable, Styles.stencil); bool stencilEnableValue = stencilEnable.floatValue > 0.5f; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index dce31c26fe5..eafb390f65e 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -174,8 +174,6 @@ public RenderStateCollection GetRenderState() { result.Add(RenderState.Stencil(new StencilDescriptor { Ref = FullscreenUniforms.stencilReference, ReadMask = FullscreenUniforms.stencilReadMask, WriteMask = FullscreenUniforms.stencilWriteMask, Comp = FullscreenUniforms.stencilComparison, ZFail = FullscreenUniforms.stencilDepthFail, Fail = FullscreenUniforms.stencilFail, Pass = FullscreenUniforms.stencilPass })); } - - return result; } else { From 033d62711740eb85a50223493bc5f395a607ce7b Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 19:06:05 +0200 Subject: [PATCH 069/108] Fix depth mode UX --- .../Targets/Fullscreen/FullscreenSubTarget.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index eafb390f65e..905d8666e37 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -722,9 +722,6 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac onChange(); }); - if (fullscreenData.depthTestMode != CompareFunction.Disabled) - DrawDepthWriteMode(ref context); - context.AddProperty("Depth Write", new Toggle { value = fullscreenData.depthWrite }, (evt) => { if (Equals(fullscreenData.depthWrite, evt.newValue)) @@ -735,13 +732,9 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac onChange(); }); - if (fullscreenData.depthWrite) - DrawDepthWriteMode(ref context); - - void DrawDepthWriteMode(ref TargetPropertyGUIContext context) + if (fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled) { - context.globalIndentLevel++; - context.AddProperty("Mode", new EnumField(fullscreenData.depthWriteMode) { value = fullscreenData.depthWriteMode }, (evt) => + context.AddProperty("Depth Write Mode", new EnumField(fullscreenData.depthWriteMode) { value = fullscreenData.depthWriteMode }, (evt) => { if (Equals(fullscreenData.depthWriteMode, evt.newValue)) return; @@ -750,7 +743,6 @@ void DrawDepthWriteMode(ref TargetPropertyGUIContext context) fullscreenData.depthWriteMode = (FullscreenDepthWriteMode)evt.newValue; onChange(); }); - context.globalIndentLevel--; } } } From c856bece29dcd4a36645db63891cb69b009486f0 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 18:44:45 +0200 Subject: [PATCH 070/108] Cleanup CRT + add proeprty aliases --- .../CustomRenderTexture/CustomTexture.hlsl | 2 +- .../CustomRenderTexture/CustomTextureNodes.cs | 46 ------------------- .../CustomTextureSubShader.template | 36 +++++++++++++++ 3 files changed, 37 insertions(+), 47 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl index 2d5311ad14e..d2fe9b5662a 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl @@ -73,7 +73,7 @@ float CustomRenderTexturePrimitiveIDs[kCustomTextureBatchSize]; float4 CustomRenderTextureParameters; #define CustomRenderTextureUpdateSpace CustomRenderTextureParameters.x // Normalized(0)/PixelSpace(1) #define CustomRenderTexture3DTexcoordW CustomRenderTextureParameters.y -#define CustomRenderTextureIs3D CustomRenderTextureParameters.z == CRT_DIMENSION_3D +#define CustomRenderTextureIs3D (CustomRenderTextureParameters.z == CRT_DIMENSION_3D) #define CustomRenderTextureDimension CustomRenderTextureParameters.z // User facing uniform variables diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs index a4f1b7c7b40..1bca4b6c16d 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -169,50 +169,4 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener } } } - - [Title("Custom Render Texture", "Current Dimension")] - [SubTargetFilter(typeof(CustomTextureSubTarget))] - - class CustomTextureDimension : AbstractMaterialNode, IGeneratesBodyCode - { - private const string kOutputSlot2D = "Is 2D"; - private const string kOutputSlot3D = "Is 3D"; - private const string kOutputSlotCube = "Is Cube"; - - public const int kOutputSlot2DId = 0; - public const int kOutputSlot3DId = 1; - public const int kOutputSlotCubeId = 2; - - public CustomTextureDimension() - { - name = "Custom Render Texture Dimension"; - UpdateNodeAfterDeserialization(); - } - - protected int[] validSlots => new[] { kOutputSlot2DId, kOutputSlot3DId, kOutputSlotCubeId }; - - public sealed override void UpdateNodeAfterDeserialization() - { - AddSlot(new BooleanMaterialSlot(kOutputSlot2DId, kOutputSlot2D, kOutputSlot2D, SlotType.Output, false)); - AddSlot(new BooleanMaterialSlot(kOutputSlot3DId, kOutputSlot3D, kOutputSlot3D, SlotType.Output, false)); - AddSlot(new BooleanMaterialSlot(kOutputSlotCubeId, kOutputSlotCube, kOutputSlotCube, SlotType.Output, false)); - RemoveSlotsNameNotMatching(validSlots); - } - - public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) - { - if (generationMode.IsPreview()) - { - sb.AppendLine(@"bool {0} = false;", GetVariableNameForSlot(kOutputSlot2DId)); - sb.AppendLine(@"bool {0} = false;", GetVariableNameForSlot(kOutputSlot3DId)); - sb.AppendLine(@"bool {0} = false;", GetVariableNameForSlot(kOutputSlotCubeId)); - } - else - { - sb.AppendLine(@"bool {0} = CustomRenderTextureDimension == CRT_DIMENSION_2D;", GetVariableNameForSlot(kOutputSlot2DId)); - sb.AppendLine(@"bool {0} = CustomRenderTextureDimension == CRT_DIMENSION_3D;", GetVariableNameForSlot(kOutputSlot3DId)); - sb.AppendLine(@"bool {0} = CustomRenderTextureDimension == CRT_DIMENSION_CUBE;", GetVariableNameForSlot(kOutputSlotCubeId)); - } - } - } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template index 5481d79a2fa..3a69b338d4e 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template @@ -44,8 +44,11 @@ Pass // ShaderGraph accessors: float3 WorldSpaceViewDirection; + float3 ObjectSpaceViewDirection; + float3 ObjectSpacePosition; float3 TimeParameters; float3 WorldSpaceNormal; + float3 ObjectSpaceNormal; float2 NDCPosition; float4 ScreenPosition; }; @@ -61,11 +64,44 @@ Pass // other space of view direction are not supported $SurfaceDescriptionInputs.WorldSpaceViewDirection: o.WorldSpaceViewDirection = o.direction; + $SurfaceDescriptionInputs.ObjectSpaceViewDirection: o.ObjectSpaceViewDirection = o.direction; + $SurfaceDescriptionInputs.ObjectSpacePosition: o.ObjectSpacePosition = o.direction; $SurfaceDescriptionInputs.TimeParameters: o.TimeParameters = float3(_Time.y, _SinTime.x, _CosTime.y); $SurfaceDescriptionInputs.WorldSpaceNormal: o.WorldSpaceNormal = o.direction; + $SurfaceDescriptionInputs.ObjectSpaceNormal o.ObjectSpaceNormal = o.direction; $SurfaceDescriptionInputs.NDCPosition: o.NDCPosition = o.uv0.xy; $SurfaceDescriptionInputs.ScreenPosition: o.ScreenPosition = float4(o.uv0.xy, 0, 1); + // Unsupported properties: + $SurfaceDescriptionInputs.WorldSpaceBiTangent: #error 'WorldSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpaceNormal: #error 'ViewSpaceNormal' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpaceNormal: #error 'TangentSpaceNormal' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.WorldSpaceTangent: #error 'WorldSpaceTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.WorldSpaceBiTangent: #error 'WorldSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ObjectSpaceTangent: #error 'ObjectSpaceTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpaceTangent: #error 'ViewSpaceTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpaceTangent: #error 'TangentSpaceTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ObjectSpaceBiTangent: #error 'ObjectSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpaceBiTangent: #error 'ViewSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpaceBiTangent: #error 'TangentSpaceBiTangent' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpaceViewDirection: #error 'ViewSpaceViewDirection' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpaceViewDirection: #error 'TangentSpaceViewDirection' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpacePosition: #error ViewSpacePosition'' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpacePosition: #error 'TangentSpacePosition' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.WorldSpacePositionPredisplacement: #error 'WorldSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ObjectSpacePositionPredisplacement: #error 'ObjectSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ViewSpacePositionPredisplacement: #error 'ViewSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.TangentSpacePositionPredisplacement: #error 'TangentSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.AbsoluteWorldSpacePositionPredisplacement: #error 'AbsoluteWorldSpacePositionPredisplacement' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.uv2: #error 'uv2' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.uv3: #error 'uv3' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.VertexColor: #error 'VertexColor' is not available in Custom Render Textures. + + // We can't fake the positions because we can't differentiate Cube and 2D custom render textures + $SurfaceDescriptionInputs.WorldSpacePosition: #error 'WorldSpacePosition' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.ObjectSpacePosition: #error 'ObjectSpacePosition' is not available in Custom Render Textures. + $SurfaceDescriptionInputs.AbsoluteWorldSpacePosition: #error 'AbsoluteWorldSpacePosition' is not available in Custom Render Textures. + return o; } From 7192217297d48ee1341bb6c488f1e8006a034889 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 18:59:04 +0200 Subject: [PATCH 071/108] PR fixes for ShaderGraph --- .../Editor/ShaderGraph/Targets/BuiltInTarget.cs | 12 ++++++------ .../CustomRenderTexture/CustomRenderTextureTarget.cs | 2 +- .../CustomRenderTexture/CustomTextureGraph.hlsl | 3 ++- .../CustomTextureSubShader.template | 2 +- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 1 - .../Targets/Fullscreen/FullscreenSubTarget.cs | 2 -- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs index 6786986f024..84929a5548f 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs @@ -83,7 +83,7 @@ sealed class BuiltInTarget : Target, IHasMetadata // Subtarget Data [SerializeField] - List> m_Datas = new List>(); + List> m_SubTargetData = new List>(); // View PopupField m_SubTargetField; @@ -458,9 +458,9 @@ void ProcessSubTargetDatas(SubTarget subTarget) void ClearUnusedData() { - for (int i = 0; i < m_Datas.Count; i++) + for (int i = 0; i < m_SubTargetData.Count; i++) { - var data = m_Datas[i]; + var data = m_SubTargetData[i]; var type = data.value.GetType(); // Data requirement interfaces need generic type arguments @@ -477,11 +477,11 @@ public void SetDataOnSubTarget(SubTarget subTarget) where T : JsonObject return; // Ensure data object exists in list - var data = m_Datas.SelectValue().FirstOrDefault(x => x.GetType().Equals(typeof(T))) as T; + var data = m_SubTargetData.SelectValue().FirstOrDefault(x => x.GetType().Equals(typeof(T))) as T; if (data == null) { data = Activator.CreateInstance(typeof(T)) as T; - m_Datas.Add(data); + m_SubTargetData.Add(data); } // Apply data object to SubTarget @@ -492,7 +492,7 @@ public void ValidateDataForSubTarget(SubTarget subTarget, T data) where T : J { if (!(subTarget is IRequiresData requiresData)) { - m_Datas.Remove(data); + m_SubTargetData.Remove(data); } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs index f231fa89cd7..e5980188ce5 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs @@ -205,7 +205,7 @@ static class FullscreePasses // Port Mask validVertexBlocks = new BlockFieldDescriptor[] - { + { BlockFields.VertexDescription.Position, BlockFields.VertexDescription.Normal, BlockFields.VertexDescription.Tangent, diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl index 36981dd1bfc..0126093920e 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl @@ -21,13 +21,14 @@ bool IsGammaSpace() float3 UnpackNormalmapRGorAG(float4 packednormal) { // This do the trick - packednormal.x *= packednormal.w; + packednormal.x *= packednormal.w; float3 normal; normal.xy = packednormal.xy * 2 - 1; normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy))); return normal; } + inline float3 UnpackNormal(float4 packednormal) { #if defined(UNITY_NO_DXT5nm) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template index 3a69b338d4e..f685960f675 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template @@ -25,7 +25,7 @@ Pass #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl" #pragma vertex CustomRenderTextureVertexShader #pragma fragment frag - #pragma target 4.5 + #pragma target 3.0 // Pragmas $splice(PassPragmas) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs index b0e4e3f6a90..fac46900a21 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -152,7 +152,6 @@ protected virtual void DrawSurfaceOptions(Material material) if (material.HasProperty(FullscreenUniforms.stencilEnableProperty)) { - EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck(); m_MaterialEditor.ShaderProperty(stencilEnable, Styles.stencil); bool stencilEnableValue = stencilEnable.floatValue > 0.5f; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index d7c984fa359..8838a03224c 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -163,8 +163,6 @@ public RenderStateCollection GetRenderState() { result.Add(RenderState.Stencil(new StencilDescriptor { Ref = FullscreenUniforms.stencilReference, ReadMask = FullscreenUniforms.stencilReadMask, WriteMask = FullscreenUniforms.stencilWriteMask, Comp = FullscreenUniforms.stencilComparison, ZFail = FullscreenUniforms.stencilDepthFail, Fail = FullscreenUniforms.stencilFail, Pass = FullscreenUniforms.stencilPass })); } - - return result; } else { From 0c25770bbe66d88f95875513223273b1605f6dd5 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 19:06:05 +0200 Subject: [PATCH 072/108] Fix depth mode UX # Conflicts: # com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs --- .../Targets/Fullscreen/FullscreenSubTarget.cs | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 8838a03224c..a19902ad289 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -686,15 +686,27 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac }); context.AddProperty("Depth Write", new Toggle { value = fullscreenData.depthWrite }, (evt) => - { - if (Equals(fullscreenData.depthWrite, evt.newValue)) - return; + { + if (Equals(fullscreenData.depthWrite, evt.newValue)) + return; - registerUndo("Change Depth Test"); - fullscreenData.depthWrite = evt.newValue; - onChange(); - }); + registerUndo("Change Depth Write"); + fullscreenData.depthWrite = evt.newValue; + onChange(); + }); + if (fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled) + { + context.AddProperty("Depth Write Mode", new EnumField(fullscreenData.depthWriteMode) { value = fullscreenData.depthWriteMode }, (evt) => + { + if (Equals(fullscreenData.depthWriteMode, evt.newValue)) + return; + + registerUndo("Change Depth Write Mode"); + fullscreenData.depthWriteMode = (FullscreenDepthWriteMode)evt.newValue; + onChange(); + }); + } } } From b53d85fb499d95692a49bfcbc362ac51c5f8429a Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 10:45:18 +0200 Subject: [PATCH 073/108] Added stencil info box in fullscreen pass --- .../CustomPass/FullScreenCustomPassDrawer.cs | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index b4c799c9792..4a87826d526 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -27,6 +27,7 @@ private class Styles public readonly static string writeAndFetchColorBufferWarning = "Fetching and Writing to the camera color buffer at the same time is not supported on most platforms."; public readonly static string stencilWriteOverReservedBits = "The Stencil Write Mask of your material overwrites the bits reserved by HDRP. To avoid rendering errors, set the Write Mask to " + (int)(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1); + public readonly static string stencilHelpInfo = $"Stencil is enabled on the material. To help you configure the stencil operations, use these values for the bits available in HDRP: User Bit 0: {(int)UserStencilUsage.UserBit0} User Bit 1: {(int)UserStencilUsage.UserBit1}"; } // Fullscreen pass @@ -83,7 +84,18 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) EditorGUI.EndProperty(); rect.y += Styles.defaultLineSpace; - if (DoesWriteMaskContainsReservedBits(mat)) + GetStencilInfo(mat, out bool stencilEnabled, out int writeMask); + + if (stencilEnabled) + { + Rect helpBoxRect = rect; + helpBoxRect.height = Styles.helpBoxHeight; + helpBoxRect.xMin += Styles.indentPadding; + EditorGUI.HelpBox(helpBoxRect, Styles.stencilHelpInfo, MessageType.Info); + rect.y += Styles.helpBoxHeight; + } + + if (DoesWriteMaskContainsReservedBits(writeMask)) { if (!m_ShowStencilWriteWarning) { @@ -105,19 +117,23 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) } } - bool DoesWriteMaskContainsReservedBits(Material material) + + + bool DoesWriteMaskContainsReservedBits(int writeMask) { if (targetDepthBuffer == CustomPass.TargetBuffer.Custom) return false; - int writeMask = GetStencilWriteMask(material); return ((writeMask & (int)~(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1)) != 0); } - int GetStencilWriteMask(Material material) + void GetStencilInfo(Material material, out bool stencilEnabled, out int writeMaskValue) { + writeMaskValue = 0; + stencilEnabled = false; + if (material.shader == null) - return 0; + return; try { @@ -165,18 +181,16 @@ bool IsNotDefaultValue(SerializedProperty prop, float defaultValue) // First check if the stencil is enabled in the shader: // We can do this by checking if there are any non-default values in the stencil state - if (!IsStencilEnabled()) - return 0; + stencilEnabled = IsStencilEnabled(); + if (!stencilEnabled) + return; if (material.HasProperty(writeMaskPropertyName.stringValue)) - return (int)material.GetFloat(writeMaskPropertyName.stringValue); + writeMaskValue = (int)material.GetFloat(writeMaskPropertyName.stringValue); else - return (int)writeMaskFloatValue.floatValue; - } - catch - { - return 0; + writeMaskValue = (int)writeMaskFloatValue.floatValue; } + catch { } } protected override float GetPassHeight(SerializedProperty customPass) @@ -186,7 +200,14 @@ protected override float GetPassHeight(SerializedProperty customPass) height += (m_FetchColorBuffer.boolValue && targetColorBuffer == CustomPass.TargetBuffer.Camera) ? (int)Styles.helpBoxHeight : 0; if (m_FullScreenPassMaterial.objectReferenceValue is Material mat) - height += (DoesWriteMaskContainsReservedBits(mat)) ? (int)Styles.helpBoxHeight : 0; + { + if (targetDepthBuffer == CustomPass.TargetBuffer.Camera) + { + GetStencilInfo(mat, out bool stencilEnabled, out int writeMask); + height += stencilEnabled ? (int)Styles.helpBoxHeight : 0; + height += (DoesWriteMaskContainsReservedBits(writeMask)) ? (int)Styles.helpBoxHeight : 0; + } + } return height; } From 5545b174632a0fa6e45f9b5dcc20141ce58a0332 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 12:02:02 +0200 Subject: [PATCH 074/108] Fix function name conflict in URP sample buffer node --- .../Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs index e791a3b5d80..6d7fdef6a24 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs @@ -123,7 +123,7 @@ public override void CollectShaderProperties(PropertyCollector properties, Gener // } } - string GetFunctionName() => "Unity_Universal_SampleBuffer_$precision"; + string GetFunctionName() => $"Unity_Universal_SampleBuffer_{bufferType}_$precision"; public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) { From 88c6d9765d41c4c936a345ba6aced24ba3fa0bed Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 12:13:20 +0200 Subject: [PATCH 075/108] Fix function name conflicts in HDRP SG nodes --- .../Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs | 2 +- .../Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs index 8fedcf2f346..d0e8d0d25c7 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs @@ -127,7 +127,7 @@ public override void CollectShaderProperties(PropertyCollector properties, Gener } } - string GetFunctionName() => "Unity_HDRP_SampleBuffer_$precision"; + string GetFunctionName() => $"Unity_HDRP_SampleBuffer_{bufferType}_$precision"; public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) { diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs index 827a59781d7..40dd89ac8b9 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs @@ -71,11 +71,11 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener // Preview SG doesn't have access to HDRP depth buffer if (!generationMode.IsPreview()) { - registry.builder.AppendLine("StructuredBuffer _DepthPyramidMipLevelOffsets;"); - registry.builder.AppendLine("float4 _DepthPyramidBufferSize;"); registry.ProvideFunction(GetFunctionName(), s => { + registry.builder.AppendLine("StructuredBuffer _DepthPyramidMipLevelOffsets;"); + registry.builder.AppendLine("float4 _DepthPyramidBufferSize;"); s.AppendLine("$precision {0}($precision2 uv, $precision lod)", GetFunctionName()); using (s.BlockScope()) { From fe05237deb498ff6d8be66a0954aca5d188b57f0 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 15:50:38 +0200 Subject: [PATCH 076/108] Reorder fullscreen SG UI to match the material one --- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 2 + .../Targets/Fullscreen/FullscreenSubTarget.cs | 70 +++++++++---------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs index fac46900a21..b6ee3f63013 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -175,6 +175,8 @@ void SetStencilEnable(bool enabled) { stencilComp.floatValue = (float)CompareFunction.Always; stencilPass.floatValue = (float)StencilOp.Keep; + stencilFail.floatValue = (float)StencilOp.Keep; + stencilDepthFail.floatValue = (float)StencilOp.Keep; } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 905d8666e37..76917d2b94a 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -511,10 +511,10 @@ public void CollectRenderStateShaderProperties(PropertyCollector collector, Gene collector.AddEnumProperty(FullscreenUniforms.colorBlendOperationProperty, fullscreenData.colorBlendOperation); collector.AddEnumProperty(FullscreenUniforms.alphaBlendOperationProperty, fullscreenData.alphaBlendOperation); } - collector.AddFloatProperty(FullscreenUniforms.depthWriteProperty, fullscreenData.depthWrite ? 1 : 0); + collector.AddBoolProperty(FullscreenUniforms.depthWriteProperty, fullscreenData.depthWrite); if (fullscreenData.depthTestMode != CompareFunction.Disabled) - collector.AddFloatProperty(FullscreenUniforms.depthTestProperty, (float)fullscreenData.depthTestMode); + collector.AddEnumProperty(FullscreenUniforms.depthTestProperty, fullscreenData.depthTestMode); // When stencil is disabled, we can't override if (fullscreenData.enableStencil) @@ -635,6 +635,39 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac onChange(); }); + context.AddProperty("Depth Test", new EnumField(fullscreenData.depthTestMode) { value = fullscreenData.depthTestMode }, (evt) => + { + if (Equals(fullscreenData.depthTestMode, evt.newValue)) + return; + + registerUndo("Change Depth Test"); + fullscreenData.depthTestMode = (CompareFunction)evt.newValue; + onChange(); + }); + + context.AddProperty("Depth Write", new Toggle { value = fullscreenData.depthWrite }, (evt) => + { + if (Equals(fullscreenData.depthWrite, evt.newValue)) + return; + + registerUndo("Change Depth Write"); + fullscreenData.depthWrite = evt.newValue; + onChange(); + }); + + if (fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled) + { + context.AddProperty("Depth Write Mode", new EnumField(fullscreenData.depthWriteMode) { value = fullscreenData.depthWriteMode }, (evt) => + { + if (Equals(fullscreenData.depthWriteMode, evt.newValue)) + return; + + registerUndo("Change Depth Write Mode"); + fullscreenData.depthWriteMode = (FullscreenDepthWriteMode)evt.newValue; + onChange(); + }); + } + if (fullscreenData.enableStencil) { context.globalIndentLevel++; @@ -711,39 +744,6 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac context.globalIndentLevel--; } - - context.AddProperty("Depth Test", new EnumField(fullscreenData.depthTestMode) { value = fullscreenData.depthTestMode }, (evt) => - { - if (Equals(fullscreenData.depthTestMode, evt.newValue)) - return; - - registerUndo("Change Depth Test"); - fullscreenData.depthTestMode = (CompareFunction)evt.newValue; - onChange(); - }); - - context.AddProperty("Depth Write", new Toggle { value = fullscreenData.depthWrite }, (evt) => - { - if (Equals(fullscreenData.depthWrite, evt.newValue)) - return; - - registerUndo("Change Depth Write"); - fullscreenData.depthWrite = evt.newValue; - onChange(); - }); - - if (fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled) - { - context.AddProperty("Depth Write Mode", new EnumField(fullscreenData.depthWriteMode) { value = fullscreenData.depthWriteMode }, (evt) => - { - if (Equals(fullscreenData.depthWriteMode, evt.newValue)) - return; - - registerUndo("Change Depth Write Mode"); - fullscreenData.depthWriteMode = (FullscreenDepthWriteMode)evt.newValue; - onChange(); - }); - } } } From 8bb7dda170f957e83886b25a7a699ef887d814ef Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 15:56:36 +0200 Subject: [PATCH 077/108] Moved stencil toggle in the correct place --- .../Targets/Fullscreen/FullscreenSubTarget.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 76917d2b94a..09a78ab3fa2 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -625,16 +625,6 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac context.globalIndentLevel--; } - context.AddProperty("Enable Stencil", new Toggle { value = fullscreenData.enableStencil }, (evt) => - { - if (Equals(fullscreenData.enableStencil, evt.newValue)) - return; - - registerUndo("Change Enable Stencil"); - fullscreenData.enableStencil = evt.newValue; - onChange(); - }); - context.AddProperty("Depth Test", new EnumField(fullscreenData.depthTestMode) { value = fullscreenData.depthTestMode }, (evt) => { if (Equals(fullscreenData.depthTestMode, evt.newValue)) @@ -668,6 +658,16 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac }); } + context.AddProperty("Enable Stencil", new Toggle { value = fullscreenData.enableStencil }, (evt) => + { + if (Equals(fullscreenData.enableStencil, evt.newValue)) + return; + + registerUndo("Change Enable Stencil"); + fullscreenData.enableStencil = evt.newValue; + onChange(); + }); + if (fullscreenData.enableStencil) { context.globalIndentLevel++; From cdb885501abb51715e9083e85344256a7a5afe4e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 17:14:19 +0200 Subject: [PATCH 078/108] Give access to MV for other injection points --- .../Runtime/RenderPipeline/RenderPass/CustomPass/CustomPass.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPass.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPass.cs index 0c5ba5d7b8a..842da0cbfae 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPass.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPass.cs @@ -228,7 +228,7 @@ internal void ExecuteInternal(RenderGraph renderGraph, HDCamera hdCamera, Cullin if (customPass.currentRenderTarget.colorBufferRG.IsValid() && customPass.injectionPoint == CustomPassInjectionPoint.AfterPostProcess) ctx.cmd.SetGlobalTexture(HDShaderIDs._AfterPostProcessColorBuffer, customPass.currentRenderTarget.colorBufferRG); - if (customPass.currentRenderTarget.motionVectorBufferRG.IsValid() && (customPass.injectionPoint == CustomPassInjectionPoint.BeforePostProcess || customPass.injectionPoint == CustomPassInjectionPoint.AfterPostProcess)) + if (customPass.currentRenderTarget.motionVectorBufferRG.IsValid() && (customPass.injectionPoint != CustomPassInjectionPoint.BeforeRendering)) ctx.cmd.SetGlobalTexture(HDShaderIDs._CameraMotionVectorsTexture, customPass.currentRenderTarget.motionVectorBufferRG); if (customPass.currentRenderTarget.normalBufferRG.IsValid() && customPass.injectionPoint != CustomPassInjectionPoint.AfterPostProcess) From 784d71c5d17c93f519b6567ba41bb4033b6d3058 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 11:20:49 +0200 Subject: [PATCH 079/108] Fixed custom pass UI refresh bug --- .../CustomPass/FullScreenCustomPassDrawer.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index 4a87826d526..d16d013ed78 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -38,6 +38,7 @@ private class Styles SerializedProperty m_TargetDepthBuffer; bool m_ShowStencilWriteWarning = false; + bool m_ShowStencilInfoBox = false; CustomPass.TargetBuffer targetColorBuffer => (CustomPass.TargetBuffer)m_TargetColorBuffer.intValue; CustomPass.TargetBuffer targetDepthBuffer => (CustomPass.TargetBuffer)m_TargetDepthBuffer.intValue; @@ -88,12 +89,22 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) if (stencilEnabled) { + if (!m_ShowStencilInfoBox) + { + m_ShowStencilInfoBox = true; + GUI.changed = true; + } Rect helpBoxRect = rect; helpBoxRect.height = Styles.helpBoxHeight; helpBoxRect.xMin += Styles.indentPadding; EditorGUI.HelpBox(helpBoxRect, Styles.stencilHelpInfo, MessageType.Info); rect.y += Styles.helpBoxHeight; } + else if (m_ShowStencilInfoBox) + { + m_ShowStencilInfoBox = false; + GUI.changed = true; // Workaround to update the internal state of the ReorderableList and update the height of the element. + } if (DoesWriteMaskContainsReservedBits(writeMask)) { From 0554c1919c3ec918fa390df4ff4326fd24557b9b Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 11:33:35 +0200 Subject: [PATCH 080/108] Fix mip sampling in custom pass before post process injection point --- .../RenderPass/CustomPass/CustomPassSampling.hlsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl index 40561d630c7..8bb888254d1 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassSampling.hlsl @@ -20,7 +20,7 @@ float3 CustomPassSampleCameraColor(float2 uv, float lod, bool uvGuards = true) // there is no color pyramid yet for before transparent so we can't sample with mips. // Also, we don't use _RTHandleScaleHistory to sample because the color pyramid bound is the actual camera color buffer which is at the resolution of the camera case CUSTOMPASSINJECTIONPOINT_BEFORE_TRANSPARENT: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScaleHistory.xy, lod).rgb; - case CUSTOMPASSINJECTIONPOINT_BEFORE_POST_PROCESS: + case CUSTOMPASSINJECTIONPOINT_BEFORE_POST_PROCESS: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScale.xy, lod).rgb; case CUSTOMPASSINJECTIONPOINT_BEFORE_PRE_REFRACTION: return SAMPLE_TEXTURE2D_X_LOD(_ColorPyramidTexture, s_trilinear_clamp_sampler, uv * _RTHandleScale.xy, 0).rgb; case CUSTOMPASSINJECTIONPOINT_AFTER_POST_PROCESS: return SAMPLE_TEXTURE2D_X_LOD(_AfterPostProcessColorBuffer, s_trilinear_clamp_sampler, uv * _RTHandleScale.zw, 0).rgb; default: return SampleCameraColor(uv, lod); From 72eb715d8b859e081dbbd48a68e017d04dbedbd2 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 15:44:43 +0200 Subject: [PATCH 081/108] Fix scaling issue with HDSceneDepth node --- .../ShaderGraph/Nodes/HDSceneDepthNode.cs | 15 +++++---------- .../HDRenderPipeline.RenderGraph.cs | 1 - .../Runtime/RenderPipeline/HDStringConstants.cs | 1 - 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs index 40dd89ac8b9..42c0ae05aaa 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSceneDepthNode.cs @@ -74,20 +74,15 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener registry.ProvideFunction(GetFunctionName(), s => { - registry.builder.AppendLine("StructuredBuffer _DepthPyramidMipLevelOffsets;"); - registry.builder.AppendLine("float4 _DepthPyramidBufferSize;"); + registry.builder.AppendLine("StructuredBuffer _DepthPyramidMipLevelOffsets;"); s.AppendLine("$precision {0}($precision2 uv, $precision lod)", GetFunctionName()); using (s.BlockScope()) { s.AppendLine("#if defined(REQUIRE_DEPTH_TEXTURE) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT)"); - s.AppendLine("float2 uvOffset = _DepthPyramidMipLevelOffsets[int(lod)] * _DepthPyramidBufferSize.zw;"); - s.AppendLine("$precision2 UVScale = _RTHandleScale.xy * (_ScreenSize.xy / _DepthPyramidBufferSize.xy);"); - s.AppendLine("$precision lodScale = exp2(uint(lod));"); - s.AppendLine("$precision2 lodUV = (uv * UVScale) / lodScale;"); - s.AppendLine("$precision2 halfTextel = _DepthPyramidBufferSize.zw * 0.5;"); - s.AppendLine("$precision2 lodSize = _DepthPyramidBufferSize.zw * _ScreenSize.xy / lodScale;"); - s.AppendLine("$precision2 clampedUV = clamp(uvOffset + lodUV, uvOffset + halfTextel, uvOffset + lodSize - halfTextel);"); - s.AppendLine("return SAMPLE_TEXTURE2D_X(_CameraDepthTexture, s_linear_clamp_sampler, clampedUV).r;"); + s.AppendLine("int2 coord = int2(uv * _ScreenSize.xy);"); + s.AppendLine("int2 mipCoord = coord.xy >> int(lod);"); + s.AppendLine("int2 mipOffset = _DepthPyramidMipLevelOffsets[int(lod)];"); + s.AppendLine("return LOAD_TEXTURE2D_X(_CameraDepthTexture, mipOffset + mipCoord).r;"); s.AppendLine("#endif"); s.AppendLine("return 0.0;"); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index 8e8bea85a4b..b9f625e3930 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs @@ -42,7 +42,6 @@ void RecordRenderGraph(RenderRequest renderRequest, // Bind the depth pyramid offset info for the HDSceneDepth node in ShaderGraph. This can be used by users in custom passes. Shader.SetGlobalBuffer(HDShaderIDs._DepthPyramidMipLevelOffsets, hdCamera.depthBufferMipChainInfo.GetOffsetBufferData(m_DepthPyramidMipLevelOffsetsBuffer)); - Shader.SetGlobalVector(HDShaderIDs._DepthPyramidBufferSize, new Vector4(hdCamera.depthBufferMipChainInfo.textureSize.x, hdCamera.depthBufferMipChainInfo.textureSize.y, 1.0f / hdCamera.depthBufferMipChainInfo.textureSize.x, 1.0f / hdCamera.depthBufferMipChainInfo.textureSize.y)); #if UNITY_EDITOR var showGizmos = camera.cameraType == CameraType.Game diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs index 753ad9b59bc..ae72abf54ff 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStringConstants.cs @@ -391,7 +391,6 @@ static class HDShaderIDs public static readonly int _SsrClearCoatMaskTexture = Shader.PropertyToID("_SsrClearCoatMaskTexture"); public static readonly int _DepthPyramidMipLevelOffsets = Shader.PropertyToID("_DepthPyramidMipLevelOffsets"); public static readonly int _DepthPyramidFirstMipLevelOffset = Shader.PropertyToID("_DepthPyramidFirstMipLevelOffset"); - public static readonly int _DepthPyramidBufferSize = Shader.PropertyToID("_DepthPyramidBufferSize"); // Still used by ray tracing. From dd8da8b049a31f797fe20603245b1407cb5d2b92 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 15:45:57 +0200 Subject: [PATCH 082/108] Safe div 0 in FullscreenCommon SG --- .../Targets/Fullscreen/Includes/FullscreenCommon.hlsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index e440dc7199c..63ffe0d29a9 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -118,13 +118,13 @@ FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) #if defined(DEPTH_WRITE_MODE_EYE) // Reverse of LinearEyeDepth - float d = rcp(surfaceDescription.FullscreenEyeDepth); + float d = rcp(surfaceDescription.FullscreenEyeDepth + surfaceDescription.FullscreenEyeDepth == 0); // Safe div 0 output.depth = (d - _ZBufferParams.w) / _ZBufferParams.z; #endif #if defined(DEPTH_WRITE_MODE_LINEAR01) // Reverse of Linear01Depth - float d = rcp(surfaceDescription.FullscreenLinear01Depth); + float d = rcp(surfaceDescription.FullscreenLinear01Depth + surfaceDescription.FullscreenLinear01Depth == 0); // Safe div 0 output.depth = (d - _ZBufferParams.y) / _ZBufferParams.x; #endif From 7e5a42a0f876decb214a778718ccf239bab1fccb Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 16:13:40 +0200 Subject: [PATCH 083/108] Fixed default blend mode in shadergraph --- .../Targets/Fullscreen/FullscreenSubTarget.cs | 55 +++++++++++++++++-- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 09a78ab3fa2..aed0a5d130f 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -503,13 +503,56 @@ public void CollectRenderStateShaderProperties(PropertyCollector collector, Gene // When blend mode is disabled, we can't override if (fullscreenData.blendMode != FullscreenBlendMode.Disabled) { + BlendMode srcColorBlend = fullscreenData.srcColorBlendMode; + BlendMode srcAlphaBlend = fullscreenData.srcAlphaBlendMode; + BlendMode dstColorBlend = fullscreenData.dstColorBlendMode; + BlendMode dstAlphaBlend = fullscreenData.dstAlphaBlendMode; + BlendOp colorBlendOp = fullscreenData.colorBlendOperation; + BlendOp alphaBlendOp = fullscreenData.alphaBlendOperation; + + // Patch the default blend values depending on the Blend Mode: + if (fullscreenData.blendMode != FullscreenBlendMode.Custom) + { + colorBlendOp = BlendOp.Add; + alphaBlendOp = BlendOp.Add; + } + + if (fullscreenData.blendMode == FullscreenBlendMode.Alpha) + { + srcColorBlend = BlendMode.SrcAlpha; + dstColorBlend = BlendMode.OneMinusSrcAlpha; + srcAlphaBlend = BlendMode.One; + dstAlphaBlend = BlendMode.OneMinusSrcAlpha; + } + else if (fullscreenData.blendMode == FullscreenBlendMode.Premultiply) + { + srcColorBlend = BlendMode.One; + dstColorBlend = BlendMode.OneMinusSrcAlpha; + srcAlphaBlend = BlendMode.One; + dstAlphaBlend = BlendMode.OneMinusSrcAlpha; + } + else if (fullscreenData.blendMode == FullscreenBlendMode.Additive) + { + srcColorBlend = BlendMode.SrcAlpha; + dstColorBlend = BlendMode.One; + srcAlphaBlend = BlendMode.One; + dstAlphaBlend = BlendMode.One; + } + else if (fullscreenData.blendMode == FullscreenBlendMode.Multiply) + { + srcColorBlend = BlendMode.DstColor; + dstColorBlend = BlendMode.Zero; + srcAlphaBlend = BlendMode.One; + dstAlphaBlend = BlendMode.OneMinusSrcAlpha; + } + collector.AddEnumProperty(FullscreenUniforms.blendModeProperty, fullscreenData.blendMode); - collector.AddEnumProperty(FullscreenUniforms.srcColorBlendProperty, fullscreenData.srcColorBlendMode); - collector.AddEnumProperty(FullscreenUniforms.dstColorBlendProperty, fullscreenData.dstColorBlendMode); - collector.AddEnumProperty(FullscreenUniforms.srcAlphaBlendProperty, fullscreenData.srcAlphaBlendMode); - collector.AddEnumProperty(FullscreenUniforms.dstAlphaBlendProperty, fullscreenData.dstAlphaBlendMode); - collector.AddEnumProperty(FullscreenUniforms.colorBlendOperationProperty, fullscreenData.colorBlendOperation); - collector.AddEnumProperty(FullscreenUniforms.alphaBlendOperationProperty, fullscreenData.alphaBlendOperation); + collector.AddEnumProperty(FullscreenUniforms.srcColorBlendProperty, srcColorBlend); + collector.AddEnumProperty(FullscreenUniforms.dstColorBlendProperty, dstColorBlend); + collector.AddEnumProperty(FullscreenUniforms.srcAlphaBlendProperty, srcAlphaBlend); + collector.AddEnumProperty(FullscreenUniforms.dstAlphaBlendProperty, dstAlphaBlend); + collector.AddEnumProperty(FullscreenUniforms.colorBlendOperationProperty, colorBlendOp); + collector.AddEnumProperty(FullscreenUniforms.alphaBlendOperationProperty, alphaBlendOp); } collector.AddBoolProperty(FullscreenUniforms.depthWriteProperty, fullscreenData.depthWrite); From c4ca41af4fa2abedb94147ebceb9d246325ba626 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 16:23:35 +0200 Subject: [PATCH 084/108] Fixed clipping issue due to safe divide --- .../Targets/Fullscreen/Includes/FullscreenCommon.hlsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index 63ffe0d29a9..5b8e5f91d14 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -118,13 +118,13 @@ FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) #if defined(DEPTH_WRITE_MODE_EYE) // Reverse of LinearEyeDepth - float d = rcp(surfaceDescription.FullscreenEyeDepth + surfaceDescription.FullscreenEyeDepth == 0); // Safe div 0 + float d = rcp(max(surfaceDescription.FullscreenEyeDepth, 0.000000001)); output.depth = (d - _ZBufferParams.w) / _ZBufferParams.z; #endif #if defined(DEPTH_WRITE_MODE_LINEAR01) // Reverse of Linear01Depth - float d = rcp(surfaceDescription.FullscreenLinear01Depth + surfaceDescription.FullscreenLinear01Depth == 0); // Safe div 0 + float d = rcp(max(surfaceDescription.FullscreenLinear01Depth, 0.000000001)); output.depth = (d - _ZBufferParams.y) / _ZBufferParams.x; #endif From 2d7d0fd703abbfcf423c10a13ffef67ac76eec74 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 20:20:50 +0200 Subject: [PATCH 085/108] Fix infinite import loop with ShaderGraphs that don't have an HDMetaData asset --- .../Editor/AssetProcessors/MaterialPostProcessor.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/Editor/AssetProcessors/MaterialPostProcessor.cs b/com.unity.render-pipelines.high-definition/Editor/AssetProcessors/MaterialPostProcessor.cs index 784a3766c58..3dbb56982f3 100644 --- a/com.unity.render-pipelines.high-definition/Editor/AssetProcessors/MaterialPostProcessor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/AssetProcessors/MaterialPostProcessor.cs @@ -286,6 +286,7 @@ class MaterialPostprocessor : AssetPostprocessor { internal static List s_CreatedAssets = new List(); internal static List s_ImportedAssetThatNeedSaving = new List(); + internal static Dictionary s_ImportedMaterialCounter = new Dictionary(); internal static bool s_NeedsSavingAssets = false; // Important: This should only be called by the RegisterUpgraderReimport(), ie the shadegraph/material version @@ -371,6 +372,14 @@ static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAsse // we would miss re-importing that dependency. if (MaterialReimporter.CheckHDShaderGraphVersionsForUpgrade("", material.shader, ignoreNonHDRPShaderGraphs: false)) { + s_ImportedMaterialCounter.TryGetValue(asset, out var importCounter); + s_ImportedMaterialCounter[asset] = ++importCounter; + + // CheckHDShaderGraphVersionsForUpgrade always return true if a ShaderGraph don't have an HDMetaData attached + // we need a check to avoid importing the same assets over and over again. + if (importCounter > 2) + continue; + var shaderPath = AssetDatabase.GetAssetPath(material.shader.GetInstanceID()); AssetDatabase.ImportAsset(shaderPath); From d669e910783a3a7491b1d13a1426a8cfc007c4ff Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 20:33:00 +0200 Subject: [PATCH 086/108] Added Builtin Fullscreen SG test --- .../CommonAssets/Materials/BI-UV Map.mat | 180 ++ .../CommonAssets/Materials/BI-UV Map.mat.meta | 8 + .../Direct3D11/None/070_FullscreenEffects.png | 3 + .../None/070_FullscreenEffects.png.meta | 99 + .../Assets/Scenes/070_FullscreenEffects.meta | 8 + .../Assets/Scenes/070_FullscreenEffects.unity | 2219 +++++++++++++++++ .../Scenes/070_FullscreenEffects.unity.meta | 9 + .../BlueTint.renderTexture | 39 + .../BlueTint.renderTexture.meta | 8 + .../070_FullscreenEffects/CameraEffects.meta | 8 + .../CameraEffects/BlueTint.shadergraph | 894 +++++++ .../CameraEffects/BlueTint.shadergraph.meta | 10 + .../CameraEffects/Depth.shadergraph | 570 +++++ .../CameraEffects/Depth.shadergraph.meta | 10 + .../CameraEffects/Position.shadergraph | 549 ++++ .../CameraEffects/Position.shadergraph.meta | 10 + .../CameraEffects/ViewDIr.shadergraph | 548 ++++ .../CameraEffects/ViewDIr.shadergraph.meta | 10 + .../070_FullscreenEffects/Depth.renderTexture | 39 + .../Depth.renderTexture.meta | 8 + .../070_FullscreenEffects/ImageEffects.cs | 29 + .../ImageEffects.cs.meta | 11 + .../070_FullscreenEffects/LightingData.asset | Bin 0 -> 19456 bytes .../LightingData.asset.meta | 8 + .../Lightmap-0_comp_dir.png | 3 + .../Lightmap-0_comp_dir.png.meta | 99 + .../Lightmap-0_comp_light.exr | Bin 0 -> 232822 bytes .../Lightmap-0_comp_light.exr.meta | 99 + .../Position.renderTexture | 39 + .../Position.renderTexture.meta | 8 + .../ReflectionProbe-0.exr | Bin 0 -> 169803 bytes .../ReflectionProbe-0.exr.meta | 99 + .../ViewDir.renderTexture | 39 + .../ViewDir.renderTexture.meta | 8 + .../ProjectSettings/EditorBuildSettings.asset | 4 +- 35 files changed, 5674 insertions(+), 1 deletion(-) create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_light.exr create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_light.exr.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Position.renderTexture create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Position.renderTexture.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture.meta diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat new file mode 100644 index 00000000000..aa2441548f3 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat @@ -0,0 +1,180 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-2777798440943170135 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 639247ca83abc874e893eb93af2b5e44, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 0 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BI-UV Map + m_Shader: {fileID: -6465566751694194690, guid: 7e26e8f04c77cf7429bd7efa3d80141e, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AmbientOcclusion: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseMap: + m_Texture: {fileID: 2800000, guid: b4ea3eedbbeab5c4fb300fb5293a93c5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ClearCoatMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Cube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicSpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AlphaClip: 0 + - _BUILTIN_AlphaClip: 0 + - _BUILTIN_Blend: 0 + - _BUILTIN_CullMode: 2 + - _BUILTIN_DstBlend: 0 + - _BUILTIN_QueueControl: 0 + - _BUILTIN_QueueOffset: 0 + - _BUILTIN_SrcBlend: 1 + - _BUILTIN_Surface: 0 + - _BUILTIN_ZTest: 4 + - _BUILTIN_ZWrite: 1 + - _BUILTIN_ZWriteControl: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoat: 0 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossinessSource: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _QueueControl: -1 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _ReflectionSource: 0 + - _Shininess: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecSource: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _UVSec: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - Tiling: {r: 1, g: 1, b: 0, a: 0} + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 0.5, g: 0.5, b: 0.5, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _Offset: {r: 0, g: 0, b: 0, a: 0} + - _SpecColor: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] +--- !u!114 &2496664280657295510 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 5 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat.meta new file mode 100644 index 00000000000..c3d3533fc44 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 84ee8f1b8a5e55f498d61cd54afce293 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png new file mode 100644 index 00000000000..236a6f980d7 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e518e5ae8c5bc2ad003a3e3fd040c06120013e8dc928553852cf110f0e632ac +size 114578 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png.meta new file mode 100644 index 00000000000..02ed96fbafa --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 1298828cb3c693a47b96758986b57b38 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.meta new file mode 100644 index 00000000000..72f30335bb9 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 27fdebc771916e849aca4098892f878d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity new file mode 100644 index 00000000000..5ec638ecb5c --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity @@ -0,0 +1,2219 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18385503, g: 0.22906253, b: 0.30347347, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 0 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 112000002, guid: 0443133b73b356f449027ce62f5cc170, + type: 2} + m_LightingSettings: {fileID: 4890085278179872738, guid: 2c3dbc93abd102a4990ba5f7b15fc33e, + type: 2} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &55781357 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 55781358} + - component: {fileID: 55781361} + - component: {fileID: 55781360} + - component: {fileID: 55781359} + m_Layer: 0 + m_Name: Sphere (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &55781358 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55781357} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.08, y: -1, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &55781359 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55781357} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &55781360 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55781357} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &55781361 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55781357} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &75551322 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 75551323} + - component: {fileID: 75551326} + - component: {fileID: 75551325} + - component: {fileID: 75551324} + m_Layer: 0 + m_Name: Sphere (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &75551323 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75551322} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.6729999, y: -3.5, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &75551324 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75551322} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &75551325 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75551322} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &75551326 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75551322} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &132935364 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 132935365} + - component: {fileID: 132935367} + - component: {fileID: 132935366} + m_Layer: 5 + m_Name: BlueTint + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &132935365 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132935364} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 390770347} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &132935366 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132935364} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: c7402e76ade7cb54fabb71e9db1bde5a, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &132935367 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132935364} + m_CullTransparentMesh: 1 +--- !u!1 &324526213 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 324526214} + - component: {fileID: 324526217} + - component: {fileID: 324526216} + - component: {fileID: 324526215} + m_Layer: 0 + m_Name: Sphere (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &324526214 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324526213} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.577, y: -1.75, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &324526215 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324526213} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &324526216 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324526213} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &324526217 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324526213} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &390770346 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 390770347} + - component: {fileID: 390770349} + - component: {fileID: 390770348} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &390770347 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390770346} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 132935365} + - {fileID: 1184374070} + - {fileID: 1707275100} + - {fileID: 440491750} + m_Father: {fileID: 1849218150} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &390770348 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390770346} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 200, y: 200} + m_Spacing: {x: 0, y: 0} + m_Constraint: 0 + m_ConstraintCount: 2 +--- !u!222 &390770349 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390770346} + m_CullTransparentMesh: 1 +--- !u!1 &423064482 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 423064486} + - component: {fileID: 423064485} + - component: {fileID: 423064484} + - component: {fileID: 423064483} + m_Layer: 0 + m_Name: Position + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &423064483 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423064482} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2689fc717e65c94c88ced6e08e35908, type: 3} + m_Name: + m_EditorClassIdentifier: + material: {fileID: -876546973899608171, guid: 29291f02465ceda4fad2fa7d2422698e, + type: 3} +--- !u!81 &423064484 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423064482} + m_Enabled: 1 +--- !u!20 &423064485 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423064482} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 10 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 814843923a04487408e5e33ea06ceca4, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &423064486 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423064482} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.94, y: 2.11, z: -2.730823} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &440491749 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 440491750} + - component: {fileID: 440491752} + - component: {fileID: 440491751} + m_Layer: 5 + m_Name: ViewDIr + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &440491750 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440491749} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 390770347} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &440491751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440491749} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: ac88441584a4add4a9066ed004fde47b, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &440491752 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440491749} + m_CullTransparentMesh: 1 +--- !u!1 &584638284 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 584638288} + - component: {fileID: 584638287} + - component: {fileID: 584638286} + - component: {fileID: 584638285} + m_Layer: 0 + m_Name: ViewDir + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &584638285 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584638284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2689fc717e65c94c88ced6e08e35908, type: 3} + m_Name: + m_EditorClassIdentifier: + material: {fileID: -876546973899608171, guid: b5f611447d8b5f14a80b6d53bf04d1ba, + type: 3} +--- !u!81 &584638286 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584638284} + m_Enabled: 1 +--- !u!20 &584638287 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584638284} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 10 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: ac88441584a4add4a9066ed004fde47b, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &584638288 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584638284} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.0770967, y: 0.35829902, z: -2.730823} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &656724707 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 656724711} + - component: {fileID: 656724710} + - component: {fileID: 656724709} + - component: {fileID: 656724708} + m_Layer: 0 + m_Name: BlueTintCamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &656724708 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656724707} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2689fc717e65c94c88ced6e08e35908, type: 3} + m_Name: + m_EditorClassIdentifier: + material: {fileID: -876546973899608171, guid: 3ef4ebc2ab231ca4da3433365dfee29a, + type: 3} +--- !u!81 &656724709 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656724707} + m_Enabled: 1 +--- !u!20 &656724710 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656724707} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: c7402e76ade7cb54fabb71e9db1bde5a, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &656724711 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656724707} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.0770967, y: 0.35829902, z: -2.730823} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &687823239 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 687823240} + - component: {fileID: 687823243} + - component: {fileID: 687823242} + - component: {fileID: 687823241} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &687823240 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687823239} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.577, y: 0, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &687823241 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687823239} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &687823242 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687823239} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &687823243 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687823239} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &705939300 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705939301} + - component: {fileID: 705939304} + - component: {fileID: 705939303} + - component: {fileID: 705939302} + m_Layer: 0 + m_Name: Sphere (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &705939301 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705939300} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.923, y: -2, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &705939302 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705939300} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &705939303 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705939300} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &705939304 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705939300} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &971756569 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 971756575} + - component: {fileID: 971756574} + - component: {fileID: 971756572} + - component: {fileID: 971756571} + - component: {fileID: 971756570} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &971756570 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73231aa468d81ea49bc3d914080de185, type: 3} + m_Name: + m_EditorClassIdentifier: + ImageComparisonSettings: + TargetWidth: 640 + TargetHeight: 360 + PerPixelCorrectnessThreshold: 0.005 + PerPixelGammaThreshold: 0.003921569 + PerPixelAlphaThreshold: 0.003921569 + AverageCorrectnessThreshold: 0.001 + IncorrectPixelsThreshold: 0.0000038146973 + UseHDR: 0 + UseBackBuffer: 0 + ImageResolution: 0 + ActiveImageTests: 1 + ActivePixelTests: 7 + WaitFrames: 0 + XRCompatible: 1 +--- !u!81 &971756571 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_Enabled: 1 +--- !u!124 &971756572 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_Enabled: 1 +--- !u!20 &971756574 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.2509804, g: 0.2509804, b: 0.2509804, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 10 + field of view: 35 + orthographic: 0 + orthographic size: 1 + m_Depth: 1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &971756575 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -4} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1161206970 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1161206972} + - component: {fileID: 1161206971} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1161206971 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161206970} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.86381423, b: 0.5801887, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.802082 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1161206972 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161206970} + m_LocalRotation: {x: 0.24272357, y: -0.37172696, z: 0.10134439, w: 0.8902998} + m_LocalPosition: {x: 3.0529494, y: 0.4445052, z: 2.1566381} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 30.5, y: -45.324, z: 0} +--- !u!1 &1184374069 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1184374070} + - component: {fileID: 1184374072} + - component: {fileID: 1184374071} + m_Layer: 5 + m_Name: Depth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1184374070 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1184374069} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 390770347} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1184374071 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1184374069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 990b3546722118b458c4dcbf976c2565, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1184374072 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1184374069} + m_CullTransparentMesh: 1 +--- !u!1 &1401141290 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1401141291} + - component: {fileID: 1401141294} + - component: {fileID: 1401141293} + - component: {fileID: 1401141292} + m_Layer: 0 + m_Name: Sphere (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1401141291 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401141290} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.923, y: 0.25, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1401141292 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401141290} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1401141293 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401141290} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1401141294 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401141290} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1566265836 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1566265837} + - component: {fileID: 1566265840} + - component: {fileID: 1566265839} + - component: {fileID: 1566265838} + m_Layer: 0 + m_Name: Sphere (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1566265837 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566265836} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.577, y: -4, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1566265838 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566265836} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1566265839 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566265836} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1566265840 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566265836} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1586390644 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1586390645} + m_Layer: 0 + m_Name: Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1586390645 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586390644} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3.0829494, y: 2.5554948, z: -2.216638} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 687823240} + - {fileID: 75551323} + - {fileID: 55781358} + - {fileID: 705939301} + - {fileID: 324526214} + - {fileID: 1566265837} + - {fileID: 1883972696} + - {fileID: 1677414596} + - {fileID: 1401141291} + - {fileID: 1161206972} + - {fileID: 1590297430} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1590297426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1590297430} + - component: {fileID: 1590297429} + - component: {fileID: 1590297428} + - component: {fileID: 1590297427} + m_Layer: 0 + m_Name: Plane + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!64 &1590297427 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590297426} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1590297428 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590297426} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 84ee8f1b8a5e55f498d61cd54afce293, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 0.5 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1590297429 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590297426} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1590297430 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590297426} + m_LocalRotation: {x: -0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 3.0829494, y: -2.5554948, z: 4.236638} + m_LocalScale: {x: 2.12303, y: 3.0329003, z: 1.5164502} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} +--- !u!1 &1677414595 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1677414596} + - component: {fileID: 1677414599} + - component: {fileID: 1677414598} + - component: {fileID: 1677414597} + m_Layer: 0 + m_Name: Sphere (7) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1677414596 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1677414595} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4.077, y: 0, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1677414597 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1677414595} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1677414598 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1677414595} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1677414599 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1677414595} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1707275099 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1707275100} + - component: {fileID: 1707275102} + - component: {fileID: 1707275101} + m_Layer: 5 + m_Name: Position + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1707275100 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1707275099} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 390770347} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1707275101 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1707275099} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 814843923a04487408e5e33ea06ceca4, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1707275102 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1707275099} + m_CullTransparentMesh: 1 +--- !u!1 &1823639353 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1823639357} + - component: {fileID: 1823639356} + - component: {fileID: 1823639355} + - component: {fileID: 1823639354} + m_Layer: 0 + m_Name: DepthCamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1823639354 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823639353} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2689fc717e65c94c88ced6e08e35908, type: 3} + m_Name: + m_EditorClassIdentifier: + material: {fileID: -876546973899608171, guid: 0a4dbcc78ae8c684aa9954ed82a13c9f, + type: 3} +--- !u!81 &1823639355 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823639353} + m_Enabled: 1 +--- !u!20 &1823639356 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823639353} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 10 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 990b3546722118b458c4dcbf976c2565, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1823639357 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823639353} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.0770967, y: 0.35829902, z: -2.730823} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1849218146 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1849218150} + - component: {fileID: 1849218149} + - component: {fileID: 1849218148} + - component: {fileID: 1849218147} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1849218147 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849218146} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1849218148 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849218146} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1849218149 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849218146} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 971756574} + m_PlaneDistance: 1 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1849218150 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849218146} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 390770347} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1883972695 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1883972696} + - component: {fileID: 1883972699} + - component: {fileID: 1883972698} + - component: {fileID: 1883972697} + m_Layer: 0 + m_Name: Sphere (6) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1883972696 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883972695} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.8270001, y: -2.75, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1883972697 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883972695} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1883972698 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883972695} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1883972699 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883972695} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity.meta new file mode 100644 index 00000000000..9e92319b74d --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 973136f6e85b5aa408b497d12825f950 +labels: +- TestRunnerBake +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture new file mode 100644 index 00000000000..cb09e94e7b6 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BlueTint + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture.meta new file mode 100644 index 00000000000..f1bea06f2e6 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c7402e76ade7cb54fabb71e9db1bde5a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects.meta new file mode 100644 index 00000000000..f54deecb69b --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d0d472109b12b70479c91664abd96d7d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph new file mode 100644 index 00000000000..fde1b0cde95 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph @@ -0,0 +1,894 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "4703b42838ec4f37bc8d8070294bc32c", + "m_Properties": [ + { + "m_Id": "f966897221e1489d96fd269700e5cdc4" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "1516a5cc5e364eb2bb88883e73e795a0" + } + ], + "m_Nodes": [ + { + "m_Id": "d4f8fd4027964e4cb860c4bb25efbc48" + }, + { + "m_Id": "a3eadd8853e34a87a17bb5606c2354de" + }, + { + "m_Id": "61eeddf50f71431ebc58b73a051050e0" + }, + { + "m_Id": "bed70ebaaedb475baee4e125b3042634" + }, + { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + { + "m_Id": "491999b6539d4dbdb35e66b111dc2986" + }, + { + "m_Id": "e8ce1ee185774612ba37424b28d54de3" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "491999b6539d4dbdb35e66b111dc2986" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "61eeddf50f71431ebc58b73a051050e0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bed70ebaaedb475baee4e125b3042634" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d4f8fd4027964e4cb860c4bb25efbc48" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bed70ebaaedb475baee4e125b3042634" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e8ce1ee185774612ba37424b28d54de3" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + "m_SlotId": 2 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 156.0, + "y": 105.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 156.0, + "y": 305.0 + }, + "m_Blocks": [ + { + "m_Id": "d4f8fd4027964e4cb860c4bb25efbc48" + }, + { + "m_Id": "a3eadd8853e34a87a17bb5606c2354de" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "6ecd847a446e43d9b8e9d11cb120c9fd" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "0617bdbd40c441609f614b9bc22f821b", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.13568639755249024, + "y": 0.0, + "z": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "0920e1f93061432387aadce557d92dad", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0d74a81ce17d4c4b8bb700d42cc5a0d5", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "1516a5cc5e364eb2bb88883e73e795a0", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "f966897221e1489d96fd269700e5cdc4" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "15f45a152739428c8c76c5df8aab27f6", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "1c308cf1bf44498788c64fa67ef88cb4", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_depthWriteMode": 0, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "23d711cadcfa4342b839d4b869e1c466", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "35a1707d114d43dfa74fd8a2bc7dc504", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.ColorNode", + "m_ObjectId": "491999b6539d4dbdb35e66b111dc2986", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -397.0, + "y": 397.0, + "width": 208.0, + "height": 127.0 + } + }, + "m_Slots": [ + { + "m_Id": "15f45a152739428c8c76c5df8aab27f6" + } + ], + "synonyms": [ + "rgba" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Color": { + "color": { + "r": 0.14122533798217774, + "g": 0.0, + "b": 1.0, + "a": 0.0 + }, + "mode": 0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "5213e99ddce14ea9ae8bbad3d8008a96", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "61eeddf50f71431ebc58b73a051050e0", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -531.0, + "y": 149.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "0920e1f93061432387aadce557d92dad" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "f966897221e1489d96fd269700e5cdc4" + } +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInTarget", + "m_ObjectId": "6ecd847a446e43d9b8e9d11cb120c9fd", + "m_SubTargetData": [ + { + "m_Id": "1c308cf1bf44498788c64fa67ef88cb4" + } + ], + "m_ActiveSubTarget": { + "m_Id": "bea377201c734498a42e56bd7ab99191" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZWriteControl": 0, + "m_ZTestMode": 4, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "814f47bf328a4afbb3f3544176f48fe2", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "83e5719e54d143faa2a80753c0b8f7e8", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8cbe61b854c644e9a5ceec284f868d10", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "942e008c4be74b8daedd766ff9482432", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.LerpNode", + "m_ObjectId": "9961d6b5fb2947ac9285a35d8506cf62", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Lerp", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -87.0, + "y": 277.0, + "width": 130.0, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "f31f0eb970ec4f1a9c4766e3a16baf68" + }, + { + "m_Id": "814f47bf328a4afbb3f3544176f48fe2" + }, + { + "m_Id": "db0f2b9956f74b42821e02c5a8b718d7" + }, + { + "m_Id": "e7803a31502548ef89759bd3cfa2ff5e" + } + ], + "synonyms": [ + "mix", + "blend", + "linear interpolate" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a3eadd8853e34a87a17bb5606c2354de", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a9d3fccbc5c4457888de0c3cc7da46f6" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a9d3fccbc5c4457888de0c3cc7da46f6", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInFullscreenSubTarget", + "m_ObjectId": "bea377201c734498a42e56bd7ab99191" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "bed70ebaaedb475baee4e125b3042634", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -382.0, + "y": 115.0, + "width": 183.0, + "height": 251.0 + } + }, + "m_Slots": [ + { + "m_Id": "83e5719e54d143faa2a80753c0b8f7e8" + }, + { + "m_Id": "f978a2dac07e47159672a0763a63376c" + }, + { + "m_Id": "8cbe61b854c644e9a5ceec284f868d10" + }, + { + "m_Id": "35a1707d114d43dfa74fd8a2bc7dc504" + }, + { + "m_Id": "23d711cadcfa4342b839d4b869e1c466" + }, + { + "m_Id": "942e008c4be74b8daedd766ff9482432" + }, + { + "m_Id": "f2da9d5288d74471a2a0daf3bd5fad93" + }, + { + "m_Id": "5213e99ddce14ea9ae8bbad3d8008a96" + } + ], + "synonyms": [ + "tex2d" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "d4f8fd4027964e4cb860c4bb25efbc48", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "0617bdbd40c441609f614b9bc22f821b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "db0f2b9956f74b42821e02c5a8b718d7", + "m_Id": 2, + "m_DisplayName": "T", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "T", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e7803a31502548ef89759bd3cfa2ff5e", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1Node", + "m_ObjectId": "e8ce1ee185774612ba37424b28d54de3", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Float", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -325.0, + "y": 546.0, + "width": 126.0, + "height": 77.0 + } + }, + "m_Slots": [ + { + "m_Id": "f069b01a020b4b5cae9cb3158c34ab26" + }, + { + "m_Id": "0d74a81ce17d4c4b8bb700d42cc5a0d5" + } + ], + "synonyms": [ + "Vector 1", + "1", + "v1", + "vec1", + "scalar" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Value": 0.0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f069b01a020b4b5cae9cb3158c34ab26", + "m_Id": 1, + "m_DisplayName": "X", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "X", + "m_StageCapability": 3, + "m_Value": 0.5, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "f2da9d5288d74471a2a0daf3bd5fad93", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f31f0eb970ec4f1a9c4766e3a16baf68", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "f966897221e1489d96fd269700e5cdc4", + "m_Guid": { + "m_GuidSerialized": "cda9fee5-88a1-4a42-ac13-15c59000fafc" + }, + "m_Name": "_MainTex", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_MainTex", + "m_DefaultReferenceName": "_MainTex", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f978a2dac07e47159672a0763a63376c", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph.meta new file mode 100644 index 00000000000..58e013a2a1f --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3ef4ebc2ab231ca4da3433365dfee29a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph new file mode 100644 index 00000000000..ac156da1138 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph @@ -0,0 +1,570 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "d90f842bb50940d0898cc0b1672e40c7", + "m_Properties": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "bf9c98344459461d9b16983355e7bff6" + } + ], + "m_Nodes": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + }, + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + }, + { + "m_Id": "ffdbc5cb9ea346f5accac639490d4e10" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ffdbc5cb9ea346f5accac639490d4e10" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "18690e6cecb1442ea84378e37c34a182" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ScreenPositionMaterialSlot", + "m_ObjectId": "183dc11aec134074be2c7bb589938a72", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_ScreenSpaceType": 0 +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInTarget", + "m_ObjectId": "18690e6cecb1442ea84378e37c34a182", + "m_SubTargetData": [ + { + "m_Id": "c9a38d23340040689146bab6fa8db3d7" + } + ], + "m_ActiveSubTarget": { + "m_Id": "3a80f3c6e4f3468d9f7fc967ca907c32" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZWriteControl": 0, + "m_ZTestMode": 4, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "33540e5e9a35475a8e5712cd72467969", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInFullscreenSubTarget", + "m_ObjectId": "3a80f3c6e4f3468d9f7fc967ca907c32" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "5ddc3a5040794841b416534f8d7a7005", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "f1121601d4bb42e8b5d988d0c70a0e1d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "85e3c32d9692433aac48d1647db8dc5c", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "95faf0c60d83409e9a14d804800e2ef5", + "m_Guid": { + "m_GuidSerialized": "2891762a-caff-46b8-886a-a60f9076d254" + }, + "m_Name": "_CameraDepthNormalsTexture", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_CameraDepthNormalsTexture", + "m_DefaultReferenceName": "_CameraDepthNormalsTexture", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "9ec592304c3c45ceab688d3d116eaa8b", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a14a2592d34a41dc836eadbdb9c586cc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "9ec592304c3c45ceab688d3d116eaa8b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a7962bdeae494b5da074e4817f625114", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "85e3c32d9692433aac48d1647db8dc5c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b3fb6f13466b4b33a6471b91d5414fd5", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "bf9c98344459461d9b16983355e7bff6", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "c92cbbfb65a74873986c38a798c50f03", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d91a8a45275c4bcdabfa2a91d9164154" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "c9a38d23340040689146bab6fa8db3d7", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_depthWriteMode": 0, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "d91a8a45275c4bcdabfa2a91d9164154", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e5bc309f2e9441f79839f40d57b85928", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b3fb6f13466b4b33a6471b91d5414fd5" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "f1121601d4bb42e8b5d988d0c70a0e1d", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SceneDepthNode", + "m_ObjectId": "ffdbc5cb9ea346f5accac639490d4e10", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Scene Depth", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -335.0, + "y": 171.0, + "width": 145.0, + "height": 112.0 + } + }, + "m_Slots": [ + { + "m_Id": "183dc11aec134074be2c7bb589938a72" + }, + { + "m_Id": "33540e5e9a35475a8e5712cd72467969" + } + ], + "synonyms": [ + "zbuffer", + "zdepth" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_DepthSamplingMode": 0 +} + diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph.meta new file mode 100644 index 00000000000..544ba9d0cb9 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0a4dbcc78ae8c684aa9954ed82a13c9f +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph new file mode 100644 index 00000000000..137ac85aedd --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph @@ -0,0 +1,549 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "d90f842bb50940d0898cc0b1672e40c7", + "m_Properties": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "bf9c98344459461d9b16983355e7bff6" + } + ], + "m_Nodes": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + }, + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + }, + { + "m_Id": "fd6762317d3d47e9bdfc4ad861b48607" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "fd6762317d3d47e9bdfc4ad861b48607" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "18690e6cecb1442ea84378e37c34a182" + } + ] +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInTarget", + "m_ObjectId": "18690e6cecb1442ea84378e37c34a182", + "m_SubTargetData": [ + { + "m_Id": "c9a38d23340040689146bab6fa8db3d7" + } + ], + "m_ActiveSubTarget": { + "m_Id": "3a80f3c6e4f3468d9f7fc967ca907c32" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZWriteControl": 0, + "m_ZTestMode": 4, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInFullscreenSubTarget", + "m_ObjectId": "3a80f3c6e4f3468d9f7fc967ca907c32" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "5ddc3a5040794841b416534f8d7a7005", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "f1121601d4bb42e8b5d988d0c70a0e1d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "85e3c32d9692433aac48d1647db8dc5c", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "95faf0c60d83409e9a14d804800e2ef5", + "m_Guid": { + "m_GuidSerialized": "2891762a-caff-46b8-886a-a60f9076d254" + }, + "m_Name": "_CameraDepthNormalsTexture", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_CameraDepthNormalsTexture", + "m_DefaultReferenceName": "_CameraDepthNormalsTexture", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "9ec592304c3c45ceab688d3d116eaa8b", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a14a2592d34a41dc836eadbdb9c586cc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "9ec592304c3c45ceab688d3d116eaa8b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a7962bdeae494b5da074e4817f625114", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "85e3c32d9692433aac48d1647db8dc5c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b3fb6f13466b4b33a6471b91d5414fd5", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "b9d8fd7390bf46148db332b330856323", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "bf9c98344459461d9b16983355e7bff6", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "c92cbbfb65a74873986c38a798c50f03", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d91a8a45275c4bcdabfa2a91d9164154" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "c9a38d23340040689146bab6fa8db3d7", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_depthWriteMode": 0, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "d91a8a45275c4bcdabfa2a91d9164154", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e5bc309f2e9441f79839f40d57b85928", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b3fb6f13466b4b33a6471b91d5414fd5" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "f1121601d4bb42e8b5d988d0c70a0e1d", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.PositionNode", + "m_ObjectId": "fd6762317d3d47e9bdfc4ad861b48607", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -310.0, + "y": 226.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b9d8fd7390bf46148db332b330856323" + } + ], + "synonyms": [ + "location" + ], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Space": 4, + "m_PositionSource": 0 +} + diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph.meta new file mode 100644 index 00000000000..cd8a34d1234 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 29291f02465ceda4fad2fa7d2422698e +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph new file mode 100644 index 00000000000..9c57ad0563d --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph @@ -0,0 +1,548 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "d90f842bb50940d0898cc0b1672e40c7", + "m_Properties": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "bf9c98344459461d9b16983355e7bff6" + } + ], + "m_Nodes": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + }, + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + }, + { + "m_Id": "c1662016c9094f98ba5a18ee77b287cb" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c1662016c9094f98ba5a18ee77b287cb" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "18690e6cecb1442ea84378e37c34a182" + } + ] +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInTarget", + "m_ObjectId": "18690e6cecb1442ea84378e37c34a182", + "m_SubTargetData": [ + { + "m_Id": "c9a38d23340040689146bab6fa8db3d7" + } + ], + "m_ActiveSubTarget": { + "m_Id": "3a80f3c6e4f3468d9f7fc967ca907c32" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZWriteControl": 0, + "m_ZTestMode": 4, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInFullscreenSubTarget", + "m_ObjectId": "3a80f3c6e4f3468d9f7fc967ca907c32" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "5ddc3a5040794841b416534f8d7a7005", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "f1121601d4bb42e8b5d988d0c70a0e1d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "85e3c32d9692433aac48d1647db8dc5c", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "95faf0c60d83409e9a14d804800e2ef5", + "m_Guid": { + "m_GuidSerialized": "2891762a-caff-46b8-886a-a60f9076d254" + }, + "m_Name": "_CameraDepthNormalsTexture", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_CameraDepthNormalsTexture", + "m_DefaultReferenceName": "_CameraDepthNormalsTexture", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "9cef1273d9bd4433a743baec7d388179", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "9ec592304c3c45ceab688d3d116eaa8b", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a14a2592d34a41dc836eadbdb9c586cc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "9ec592304c3c45ceab688d3d116eaa8b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a7962bdeae494b5da074e4817f625114", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "85e3c32d9692433aac48d1647db8dc5c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b3fb6f13466b4b33a6471b91d5414fd5", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "bf9c98344459461d9b16983355e7bff6", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.ViewDirectionNode", + "m_ObjectId": "c1662016c9094f98ba5a18ee77b287cb", + "m_Group": { + "m_Id": "" + }, + "m_Name": "View Direction", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -297.0, + "y": 200.0, + "width": 208.0, + "height": 315.0 + } + }, + "m_Slots": [ + { + "m_Id": "9cef1273d9bd4433a743baec7d388179" + } + ], + "synonyms": [ + "eye direction" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Space": 2 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "c92cbbfb65a74873986c38a798c50f03", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d91a8a45275c4bcdabfa2a91d9164154" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "c9a38d23340040689146bab6fa8db3d7", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_depthWriteMode": 0, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "d91a8a45275c4bcdabfa2a91d9164154", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e5bc309f2e9441f79839f40d57b85928", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b3fb6f13466b4b33a6471b91d5414fd5" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "f1121601d4bb42e8b5d988d0c70a0e1d", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph.meta new file mode 100644 index 00000000000..1a22c2d08bd --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b5f611447d8b5f14a80b6d53bf04d1ba +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture new file mode 100644 index 00000000000..4e26bf7d993 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Depth + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture.meta new file mode 100644 index 00000000000..e4730383706 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 990b3546722118b458c4dcbf976c2565 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs new file mode 100644 index 00000000000..7c44c333da0 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs @@ -0,0 +1,29 @@ +using System; +using UnityEngine; +using UnityEngine.Rendering; + +[RequireComponent(typeof(Camera))] +[ExecuteInEditMode] +public class ImageEffects : MonoBehaviour +{ + public Material material; + + void Start() + { + if (null == material || null == material.shader || + !material.shader.isSupported) + { + enabled = false; + return; + } + GetComponent().depthTextureMode = DepthTextureMode.DepthNormals; + } + + void OnRenderImage(RenderTexture source, RenderTexture destination) + { + var cmd = new CommandBuffer(); + // cmd.SetGlobalTexture("_CameraDepthNormalsTexture", new RenderTargetIdentifier(BuiltinRenderTextureType.DepthNormals)); + cmd.Blit(source, destination, material, 1); + Graphics.ExecuteCommandBuffer(cmd); + } +} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs.meta new file mode 100644 index 00000000000..ead5c74314f --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a2689fc717e65c94c88ced6e08e35908 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset new file mode 100644 index 0000000000000000000000000000000000000000..d8dfe704a40bf3893c8e99c4b8fe2b7912137b85 GIT binary patch literal 19456 zcmeI43z!tumB*{+1^5CV2!h~%qJVHOl;zmZoE-`UQ%xV&|t{Y#8QPxCv&1;R4OwRw_d%Ej(&6)VE`+e(v z-(IJ0-MYWJ=f2K4x9V1*<7C3wnUpj04V|82vS#&S7Ac8DMutb0#KNPTzjSnTgz|~J zH{irPr=#PkcfPgj7u)g&h4(C6{+<25{$o!<74!?4!ebrBqaq#Z)H9iM2+@CE%Xhpd zLylLV&a-8375FK1oL=B~IOeH5icAPm&g&$5FrA}3nna=~)&YDZ$-kIRyVFnC;b}-Q zC%%c7s zpiX0aPX_l;iw-0|6sGaP4;*6{iu!rJ8o&M|17mY4xEd)gpYJTBvTNvvcAu8R=fxV` z+WFOM+?uqrU_m-rHoZ2UZc0vXO}mLyyeTo+X>NU zNTp+m8h5g)Z53M3(NWdDY5OGD`z z)FtT>jisnd6NvpSU1Ir?F0uUot}d~BNtamu=S`Pji}PvxR?!c73LoMRY%AP9IHt~Q zo%?rsfQOuyNzdykAGQEp2zeBlkZUVvQhq4P6m{9Qau#?Nlc&gc(sT}6xqyznb9jif z>M;3&>nR`ogVXhw4>^U(7P)_Y6!$3B0UW-J``4GU?fz@|w^BajpQAWMCgjTRNBMSn zTYmol*YfYCe8@jnaf(dHl|O*;yOKXJ!1eq*MERJX^T0idOvs&|V#@Doeg=V?vN&M= zF#ebyv>$7R%?qsYKVNZ=VjVDl{_)2g+x^q+e~R+a{vqHVMJD97|3b#=6qJmegsyr0t#<9A7b>$Q^g zcZA{|#X7)#{o^;1vUA4|Yx#SW5C40q;uM(x|L`%Tds3qs=vYEOyM1}iJ}Q4PWuiRn zq%$5dJRDzu{8_zTfb2 zfj@5eG=V>D_;i6EHhhM_pEG=>z<+4?EP?;TaR2=`T}orE=l4~^XA9-uGW_xY*Z%D| zarmD(;2uRLkbKMk%%yzW|JeR*9yk|P>3k=TZt&NT4z8ke+zZ&e!0Ac6AN}Be76iDx zelAqpqgV&{H^2W`MA^3gDR4d@|2l}|2;two%04U#jRAa*8!nY0bwN zzF6Sn3|}Jf35H)0;JSTf#L>Q`0dBW%nZUVyUl2IAZ@Iv^eJcXIz}ZIQS4HikKj%ut zDKY`;CwR5tS5bcM{9^pqoBpj-yx5e+wRZnj37q>E6FB#;THxHjngG}1zuB~}Ho)!n zxdP|*)d`&2w_4!bzWM+!aJJHO<}TB|xZ)I_`R^LuDDW2yPYC>HhBpcP4a1uSe%$b@1^%JoNr8WCcuL^;`MTe@*YB+VryAZO z@IHpG6Zjy**9-h&!&?PD+VHjj*Z%u5;_%-az&(mg$o1dXP<|-N6n(Y*_qE_ztoRC& z4gU@QbX|b!`{yKG)1BBxfp0Q=Q-Ft@TZ!FIKeXQiM`QxlH$2}xWBB!yZ}WU>ecB8j zHHDET|AhNbzCXS}<=OmuBpdyUQud7jUg)&Z^TjXe8mvz@1$dG5e6dAwk76A{PLZ`f z-Avi``c$aar{9o#jPEUq7gMYQ%I~AL@%prtvhDRrbM`-96gc~zZ31Wib8CR>^|y!? zN34&xDNd0I@IUZRJqe=y+v#WPPm$%HZWlQFryT-k|MVq+vwzwtaQ07k2%P=XE`hUu z`m(^;Kiw&C_D_E&aQ07M5jgv&y9Cbu>286uf7&f@_D_2R&i?5hfwOlZQF){h4T&ie5+fwO)*ByiS` zhXv01v0vb&F3svwl1xaMq7U1|&ryN1{d`y8Y(LKlobBg(0%!aAzQEajo)sU_KmJ+ZtRF85ob}@+fwO-6Sm3N5KM^?V$4>>$`th>BSwDUz zaMq815jg9|D*|Wz_*a3me!Lps+P^+Y`T_s?Z{Qw9Cgl3ppHqHU{`EC*F09h}`4s*Y z{)v2H4!56A-w-(K-&DZeZI`w*N9 zt8{_$Ba#jM>r3aq4RHPZ@&R2#f6nhZ;aFckA_)EceSq8k^A7@N{r#iBS%3da;H?h6K*~n(mkBgJj(>lt zSAg65OQ#E*_m|EHaNYh*ru}DvdztE~Eq43Q0+0H+-TvMI`F8uy4sg5ueFVmS`S$z!i@>8<0oXso^CRz14h_h+-`@`laNWN} zrhmf&_1pc!dvv>gyMLDiI3Z`3m)}z zd;G@*NCH} z8aLr8VfYeIozYR%)EH|{Ih;bBK0wK7@gzf(tdG?;t)Cl9t)-JG^Q+v}bW74r`HG~< zV>R_IzBNqgFAP=b1<9srH-)-=r+kJM%x$W5oyz8VHyN*qHOz`78=DgGn$(;KT{Jbe z)~%h=SRHp0X(gy4F(;mIV@W4fzr48QN_7b9Lqs1+^#_7X&bqH%I zVJ#)BrG&MVu$B_mQo>qFSW5|ODPb)oqNPN%l!%rR(NZE>N<>SEkd*BBH@mfq+(fOL zbdzcVtP?eVbKO+^WT#~vj!xQ5CS&o$w6;X7Fa;lsu0Q{k#D> zMdMsSwX{0cnYk>JNz#~CRxxy2n;YUaaXtK%ZhBUX+ELw>c2mo#&pJW9)(PsjPEgNv zg8Hr#)O($v{_6ydqfXFB>I99YPGC|@DkB?HWAZZ6F+nDeY9>`u{3>+ z>mZ7I2cFi&vKg4_4ze54K4W4TFs;$(f`tX}-SJP15Qtgtd`}}a1 z*P)}Gi9vp5^31wmoiA~d=&@SX@C-*cYpY*aa>mq+dmi05V#v|=U+s7uuip0OXP3XR zwCv%QOO^3dtRgIl|NqYqvj2Rd2aSsTO6~Lg&krzv71ZXX^uzr2#H@OVbigM8D=E2w ze&E=)v3b6_<-grw%+*|T98TdF}lj4?aAsx>OaQ#WZ!<3I(vfcv6 zt0?fZ1%BA@J_5(90F=kJmp|Z@DsBm}l?{H5A5xn6TZZ=&IJWXozQ4e+l>~lnCmh=t zc+@T-HXy*esZSd4sEYCf1&&8a@bd(YM?LUjf#XpOe2~ELs02P(;CPe)KVRVd$?*jO z$D;ts4-q(S)xj?m_+-N`68KcZ@#y6bAxDqz48w={A*C_@cx0YUoc^5QihC+XghwVk zGA|+s`??sJ9wHs+k|1`=9=-*x%KYUURKF*@Z)BH}u z#|!*E!zT#*VZ$d1{0YO$1pbWSlLUU$@W}$lC(-ohTqf|B4UY=^b;G9!{J7y$1^!#Z z%LRVI@M!`s%G2$iF7RH4&j@h6CDe~N^na$n&o_Klfa@*k;l!ceSWCOo@7dr{L^|Z^ z_vH+H+;6|+ODGhp7!mAyAJxeAJ6Dln6(eHK_B&6JVihA|&h|TBkzy4ig8hC-^2eC| zEyxg^$hBXr(f*LzzeRpXY4G#RmKWCc$^h5)yPMho`>hIa+kO`dob7jsz}bGU5IEZ} z?vwn1?Vs&;nIBS`Iot0S1kU!mT;OcKD+JE=d!@kHey^i{Gj1i3%uR%q`;3Fo)Y*m!_xwP$?z6|zhd}0f#a1e=4ZXY z-!Z&Z;O`sWCh*@Ij^`+U;PL&$@N4{#(#-SdSsd-VR^UAhzfR!24Bselyz+(oO#&Zi zxF_%-hF>r6OAOyE@KVEX5cmYcZwzp4-&2TV{k;j?%U+ag-&=s9es0_M%~_;Uuc{-t8sNJAEvEk40^F{Ddw|>Z z<2l|R;NRhYxc(h}NNMON`oGiE|D^!8>)#pRcKvsB!s&AXRey-st{kp**YqCdXZznL zWCfWWGj&jsY1h1pwr*qfZf!Ew5Z|D8g0Z>TWu}wiwAB_*)W&P{o;xRLXPlF?HO@)e z8&9~jsa)NZR6F$96S_WoLM5^%RAz20os74ZwvMWEXs4Qzj$2YfzcBqG^ec7TFrA0# zJWS_dI*-tKgw7*$9w~L=sU_4oY)#H;X=qp!YfG7T6K0Q?MuFZ7Vat?K73ysSUHW-` zo1izssY7a$n!17AZ`$|7{^-1>L}q$0r*5s)HF{q_7pcwF@+P;gj^3cqI|q6T(b;>h z|KsnnR4$vnf`NL&)jcwIb2hSsO`*}rtJqGob6rSHemCj z`wDe^J9dm5_t?A7l|P-=yS(*|;bV2~1J`XnaLe&!Gw$pE(%|)ZlXmFbn>PRMfe~N+ ze#Nuz-gD=c&CmTw=RQ(5es}+VKb^Vftnx)2Cx3WI=c2|>9ZsPu)##ab#hqfjc zaqaeZ4_*7zMP+?oe60P68~$8&)$MC0Hy#)|>CG)`+7qRXW$R~5DC<))uKmvH)n)5n zJkkF4A4X1kbJgz22k-u5(utkVx9|D!v9hmpf3WNaC0}hnc-OYFBiEEZ`&vWgB!3%p zQ#{&#z>h=jIbJ}N63352?lqjRkEo+6|5)yGk9|=mXDA1K-TOlJmS8rWFHX=Kv>EC# zwcF^Cts`3<|Nqs=2*QOY(XTK4j&^j68qu6|*Tr4Bxr_`X?S;-GH0#5sjsx=_*1FE~ qpDXBpYhH8P(bf6?+&J5F+}Swy=&B(;){W9b%Nv>!?l50&F!@*VV&O3W literal 0 HcmV?d00001 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset.meta new file mode 100644 index 00000000000..bf038f7bf6d --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0443133b73b356f449027ce62f5cc170 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 6475696996188705980 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png new file mode 100644 index 00000000000..908954c7c4a --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9313e05a8a7cc6802f826b59ce7579f3399eb80e37ea2ea86f172dff0d02ddc +size 122290 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png.meta new file mode 100644 index 00000000000..1d28d58a74c --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 4ad728ba888e9564f9b11d227720d309 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 1 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 3 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 12 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_light.exr b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_light.exr new file mode 100644 index 0000000000000000000000000000000000000000..70d1e7251ebca2c25c0a796b3ce5e0ce07c4a3a3 GIT binary patch literal 232822 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 ?cz8pn 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ƊY#AwVfuO8@Lc45ivHGs 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 vsLN1q1-vU`man)L&1LfV1EZ@>F04 z2M|nm=$T)BH#gT>f0^Fs8nre$D<7z!uHb_kxr$>#PKnc(5g_Pmj}5N|+z}cX83Zf{ zOtA0eES^3Lc=6@sh9}Jx=O4;uWbEuJXte%MH2kOf=pPClCxVhu3buM|XX+>w78LuF z2qg-_V8#epEPAX{`*|Yfd4g(p+!`HN=5h`hS?dm{$f2pGl*}Y_?+Rq8t~#GWGWXjEn$onp>CqARYAEQRlT8ZWmBG~o9t)0(1J_%)gCx<0|x+KAjB|%T96ypaNMJ#XJcVbR3mWh^m33=WcEDoYY z^t?YI+TZCcglBEgE_@Pbe|K*Np$fo0zEGrRN~DDh_BK0w*NbGJUzBV2F=sANu$BCp z!*?c?oSGj|vV}^VD_jXs(mhj+xk<*in7nDKEenLV}z+O;zlZ=z+K#-2`sTwEO92-d5kry=qrlJ zNrE-!h_W?Y+*N&~?mhJ{oM#$exY|7{l5B~*mkBnGi7pJU_+L(I-AerIZodRB?^uc( zs(_g%QjF#$kD1`*wEp6tsgE+8VAInN($o*rQQDV8xzHGMTSV(87)D|%Ss1g%8uaQKxLjSxzu|z3y1+)lLkN8B^u&zF_m^68TstBFb`f0ycJ+G zAmB|+bvTG(59dU4Lli2u=jsK0{E>dkdlKIOw4~?43rX3f5t$~xbW%@%vJ@+t~<8> zPap1~yPE$-+aR`=Vc22!!0Oubp_STM7xp2C%5ZRvkJ$UYn8Pn`P7QV1KR~R>1YSHl zQbZ1X_|oPeumw@^V2nBo(X734RT(_~i|TF@5E7?swz|y$WTrtZ?B!+Z;|ks@j5+C+?}M*$KjFg>Lq|>J7L1by9qB(dB*yJ?AZK$-l z#k9GYH6lXel8Ia?{Ih>{4wVkZFFf@>4!e7Zz=|naJu^(_am2ZdULQm4Q`PcO1M;T28G^jZE0=V z+IpC#5BqgBC0Lyk&#NWW9~S|;nK*#I?4_~nrF6`afJ1Yqkh;t3Ds@6sz6>FWCo@#f zE(o1lIvhq~PppDsyCcn#BPFRiJFFE@`mw9g44-3N)Cz0XF%Y}{d%)~@5brFzUtln; z>K$8{*4BErtzb}nZmr%50Zj;E zd?E?TiK;LUh*;;<7OXu*kkHZ@<7$SNV^8DYDN`a11#u~@ZwlkUN(E@KIhGneR5MtR z&5#OX>sZ%zI+k{I|B9i;!=2{ANt7f^;Yg%G7pW@qQDVzbacP*?b_{t9-<7$8SP{=v z21|HF*3Ae=-49k*zueCPO&|cpS4*eeh5_u_Gn`Y{{YfZrla`j2+8l(IskgVU7qm{l zH2FIHqV{eKXYz|))^Xg-y5ktn4lw}8n)pECKj+MuHX>f9y)h>%D^rj5Vg?XS8XP4? z!qzWF%-SzT!d^@I1o+qNy~bNl9Y7@LC7L8(nxnAUkhgD0sHv$*$-WWk=|cP3!kqT? zJu8N;X*w|S4euH@RyS0E`f^281!xJ|Fg!V#Zm5E~!`SWkfDX6UcCG5}_~*~{4WLln zGFe@N0ZJP*&P^_}cq=Ht`|L0HU@(VPklN;Bi3x#Plaf`IEaX4o@zF(^?4%aT zgyrx(Nmu}51R{v1OYPv@y1Dgnj|ky%jM6U|0=v@ph2O8n#|G#s{SyEFlWYjTY%t3!r3vocuA%&-G;c+!95gBi<;U_$Z#Iv8;V5u#_cJ zEUa<2u+zCt^MJ32vV9fWQQPWpMipd@igoQN-t$k_-W22T`6K&Kc6gq}47Uu?P`6le zf~^9wK9%hjf0QUAg9?1-F~<@~w*hDvBSnS7=1!N=uj9ZyB9}^)cP81Ln#0E??I?dg zeQ&UD1$xE+4G)3ZJuN|__E#&={D}cPZsyPj@V1bJe@S@A*M;*>bm^#4*3`i;Cj-Jf zZelrpicboq+Ex720+kfgsvd!T&1f*%L@4M#5tRLUG`T5~sDlhFDOJ=QCokqE41w=Q zxxc18kn|ju3sF!ANeQ+%0wpempev|d>I7A8H2d=ed18@h!yNX#(W2|;_dpw2F+s}YRU>_W9i=adXh!-3ydv78d3Ui=NH?%4>>dna#=i zC%STaL_DkRfxC2W&JbAGFF^?S2g5I>+pQurAshT4^wjoK8_8%pUDqdb5)RQ= zJBEC2K)szUFKgIo4Go*m{vy0N=rYqT7JdC11O%;H(_r@nXh5l`04@wM@_pdfpfAvL z=G-#Kn)Vw#P|lP$AzmHMzNt**cVlKiPQ1)-NueS!eck8f;prtIN%3YinzD z2Uwq7*AE(R+H!I-B{N?MQKF+yDsTmIPjlaK{CFcox|k(;{4x^->p4xLiCRWJBI?%w z{Z$W%nu$8i7Fo=hJ$c@n<4lhzxJVTdP)T!KVNPI1PX<2gC+GCiN*ur%u6}_!?Z>K& z?^81!#o?kDR5ShfNW)Gc2)7hg|ElZ#6rDCanZJM*j~bt!xQr@1`cXto5h!Zoa3ygF z9I=O3g;PAx{P+Rq_2I_~f$`8^Oa{Lj7_O?#rvfE7Gjx&}e-YbWuTGuYi z+O1pL6&+ih_S)s|iq(iiJM|@QL}FdfBMlENGVUxzAaHwCV)|b>STh3@RRx_~TGnEH z0PJ~q5IH6M=|l~xDU)=@L<2OMs2DCnMDpkbAxL%~kZx@b6f2PHwej&;D3CgMsTO%5 zRT2j%6KAoo)xPOcCp=Qtpw{3{!mUr&Ayy^AF?68LP>z0-0?l{Xqf|WONm^rOe!(h) zaH+Jui8AQE$BR@=BTXfX3C*U%Q?7lA{n}bEh0qk)Y!fOhNN+~`&L=G9ox^Q?<8&#W z41Nyn1TGGB-3nZOwKhiV8M$9Nf_vMt|T&03Ci)0S*EOP zR@VKMrd*AjoGi!7cC9b=i2xA|@D&sE&*Q)E$;a#OQ`mhvkdL=Jx=^w^08f!c(-7_C zcE$3&dP)3h;~S}FXvA@4uActM$te>}+w0e_ZPTtj{dUv^Z>K}qF@S7e$mTA80g&Ym z+G_6J1u)(SUZk}Sn0sSmm0$!21vT2{bZw&G)cR$Qc*hhFSwSek0D#}$4+;S#lzmW3 zf$lJe7!U|7G3TZsUon`>eq$|qORZpq{nw4db=R*xbX#KGIjM~BO|R|*&hn-N<#DN-{LruDDGHx>PqLF=|JbS z+5DJT4&BR~F*4HP?e6ZDH8(fk2&Vr~Xrxv(Dj^XHk&i@0v&0?i9=MIH{`}(hVfa!4 z$>DGTod6(4WQ~l~@>EVmqMV}c$1qV?-h6P}^#+U|ubF=eI+Nv5^=Ds#yd3){Kjr4@ z*dznZ6iljli9Oe%3d2Qz9=*3KBj8$QiYsJ}kM+_OeIr9aF&T~?801kD{hfjCXHSSN zkkNm^oPO4)pPwyoBaOUD%w~D7d*Ig-qe%)xqyc{^4YT3>h#un}7MqJ#hc|=Qy6*F9 zQfUoRaF;192U>6a6U*}6Ai~QF*TaIHS&nUu9PUfH6X993BjRN8ivPM!C%=qr-pvPo zSab|41WDZp6MpJ-p}QnPSKuS}uau)CEeZI4(u@=1?MsHGMD^i|&Rg5D!WrK85NF#g zzJ1PiTNn8@JIty1F-LPZWqyPxnKHwZ2(Y`1?s35-=IF#zTB zYxJyu`&rF^wzPflnL~j8FNZ(04DmI!3^|-S1h_vnb^dh$Gc^_IOsUOMRBIiTIfP{s zp&4deMT})^0xRWs`i~%GDza4eb{gT#3>XAj8@SHD9yRdlU*&Uo)GMSPkXk~;TSQ&V z$bPYNe)Q-!-T}{dWm&!}xQWRL@{FQS?3XDtya>4r||%Yn^bX#Zvu6)zZ;KSC+>e)kZfqGMYrW-tb2gQj@df@9-;hz zuPU?y8Fe&w!1}xano};NE%7_N?*Amqv}H+W7W!9$5JCh&W&HO~z+b+DTtXl0#ov;R z``)}CZ`XXF7-d382N!u1aR7JXeO2E5hiveUxSF@|UEbt@b?x>(;K}zOQtu#Y)`t*M zav`y!qXQ2jUo{HqxVl(bfr?p~3&;Te?J2JU3?D*&n!ie2fE8#wH@%UHS;JszPCC|V zPAWhfIkcne74dH^AjsC7VAfhssxK-4zwf}*NkG3_LLwmuUKypQB#+C?_6gZ_mlCZQ zZ&xoH_i3L(f1mt&qpaOTJb3*50Q^-)7m6r48?16kH7IMU)1Hu-*qrU+fvRqx^jBx> z@@%zqGuJOH#2e8{_d9o1(C3W}hl?*hUII-^de0;YnB;WMBy21gDJx-pK}Ly7lb z^Yrh-6_{q~FSJ8|ey(XTpp8iW6|hs8C54Lnfq}%6LYS^!>pQ$}+gKXA+qm?@3Rr5# zPr83IM^LfL5GGM4!URCkxj8$5S#$o;xC|TB@&mBTIfW>^qns;|Cz|WdD4V<>Rd(tzl6)oDaJ&OyBru);uFn8mrshWIn!5c} zkQq?2N$mLVZik)rekG)M9*AqV%1Ykl1{dra=3vlOhCQe3M;S0jQF1sP&AXwo^f;3! zfb74k?!X2%kjX&psV9n{8n?&{HNHWOGiNyQfD?TEiV4D;hk9L{Zf~8|%P$;$^j-J@ zi|cgokhYfSgo$Hyg(4Bm{4kU;J3oOcj%KI>$2+zg8p=q5o)j*AaQ{FG~y{z*x@TjB4)cBoH4F^y&~KSW;N7Wn)neBKhf{d_CfX0scZ679Mdz9c8af5#P!% zPuhtSA=m|}ID?$8iN47*VArZr5gPHQ!$Ai*5EkJ=a9q`idD)7=^+Bb!p zuT;}p;9xKLgf8ZJhGJ8Nb%j3AXGdUV=PBzGa^pn8s7x5NNvZkM@s1LTP<7z}289b|}L4V+${0Eca$2?9lMWVQ0kU8vR$8skM>d&&M@R&RH& z$Ii}gV>z1p(Zj2Qyak|gk^ALK=_uGc4Q-y-e2e;$%LMkIH2Vo(y~^|?7^tgN zo1n(=@S$%cP7l=l2Krp3rCmqnd>>>lKr+F?GJH}F{QXc5A+YzL8y&QxKPQr|0$cRJ z=Fg>OKR?8RQ&u@@!H_3$OeC6#y)}D{hN?a!W$*3F;uTq5zF8Neq}}YaVrgD>r{vI} z&85Sp_b}221q*4?ecKR@k4wM zZC3WXEAJ89{6wBIi05E{prujPZ>6NPPt!;;BqWJ*UJ| zUcBsAuI_|fZpJd$AT}YF$ian}wo{QQ+vEB1LsC&ze16A*S&{%U{C!#7Z9P_2Ru)xg zsdR$@%)_W>zU0@C7qqzMN)9$h+CUcXHn*U{{q|{V>+}KWWCeX2b9?)s^OT-U1vn%# zQ~lPyqSr3?0uIRwjC-j6X@9Gp*^2g9*7aZ#(Ad2M{?)*f$NAs^WW&kV(uZ~LNP@;t z;1iOWK!OJb+E8z$g2orKPmMxP`BbIEGPFy20YwLGaQE&R?lp)+R6{=L0PVlNJPRZ` zsL+0+im$BfrN($#?u&mVIq**sLQS85sygU|yOiTF;Nyd2xx;fz$iCIz9$5&;9lZ&k z4;z%_0jB`wcJ;q&TvSa0?KuIwu7Hkv1AiO>&Uk5F?vxL5zT^@=g8K0N_?aGGwi`6L z&Vlw*z}#NOKFtCM4Pg4qDv;tpECXU2*eJ3~2>kadQ%wHfs0YQs1=W!`sLi!m7}{R) zxVv7hj0zEXU#&b5#Z@nr`tiD{+(di03~Ibh2)$9DVVQWvGC@V4HZgGk+gZ2oEq)$> z-t!Q@*3Ol0+eW=#2`JJZMW!na0|HIAL{#jh%Q^Pw=N#a^*k&wA%K`eCro|uI1LaD) zS_(-B(!eG{x|^(}{P~i2#*{#u@0msg#-KlQ^~Wco<5W2~?G1sr8x>)1fRcFZ+@(>7 z94Cx_@)2xyB8L4wO0XCkW>w;vAJ-;xlxN_-AGyfiZgc!q?C2_VCk|t6cOeO#XR`+o zjLLvZpfY8sP)e2`?W_GeKRY`n;u?kx*RYn|P9b*)Fb62Qs$R76K>vDTe?QnehK$ddu#UX8l4{@1w#;M_QUx}))~vQgmcp@B1N!^gk6RzQ6iA0f5WMNJ~UU|zKkX9 zlAxbnbaeb>>3`|^HrNN)4w(9O&DwSi)PLT3`j%pbwC2?nYl?KTl!CC@P!nsZE^ZtL ztTO$m(zQa|N6RVPs1z<%u6%y59qw3iU{-P!QpfPyC_tXo%$-}i1QNK9KBFa+rv<;Af=>;iy z<@sWT#N)PrqxU|C<~rEpsk!<;9ZJHPZTTr zY#SXtL8A*W_eN$!42K3hk?J2ZW`P{iKOZHQevN+p=L*<^eO-DB>|0s@ikj=l2V6?9 zt-;vB!t@deJ?5Euvgcj`ajwNJtK`>TRIPBCD=mr0YFyovftow&p@!JDws!z$nSs%4 z%C-X2&r2#=dBYF>eE=}6w4#*-lYy@}7hwJ8mAXOeHh&R-lb_#%PuEm;j|1DD*MXE2 zMV4~Q%5p!WH%Td48&?*`P*0H+fWp3Q2MSeH}>G@YXeHnc*@VKlb0TIdlO4 z6=YliYghNVTus=(y2F~+J&Zc_oyyGd$n4zOWW<}03_Hp%;PL1LA~ zdQjkEj=Gp~iZ3M8VKmDIKcvn?i^aUAJM@~xh)A=z2yq&Xh#96;P&6<)d0CvT;^zui zRyF6v97n5*fJuCW>S?ziSOUDuM}S6r{Pnx>(XW4SZy&gu2|y7_&UG#EV@TpG2M_NiDqc4%;jb90Ape zqOFP*qa7(Z#RYDFH=up%vz3Aok5MXLF4sg z`#J+#b($A11P^yQ^Cyrw?zX^pZtVPe_-F^+Gz4Y=7|RaO zKmcR>e->E>`v8DbE-PPp<`DbPL!t0l0MQ6?fNmmsr66+9P4xKv`w!>eo&>bHfIJC# zolL)cul?;RSYG!o7geBjn{0^WQ|CRqi8|i}v1zDqO|^x3oH_7nRXvn!nG--ypHv5_ zn8#r!<~==HSMS&zb2@YRa{Ir(MkhSBX=$jffS17OT7SKPIbQLk>QlXma^rX=X`(0= zt8(?2d3B08UKmosE8=^ZaYGc&G>0kLmj6qlefG$nCt5`B;G%?H08Wp#;+!Ut zenp>+Lrj;gOnfX{R}`ByfSnP_Y0b7u0rIchm-vGKrH-j$R0Jq>jq&w(bxPHY>`WJ3i?{&dCvWQ$!tR{YDPc*;fDcl$s8rQ^PaHZ+CowF`!#0?7 zkSWz#IMPsZU?uU3w%E8Pyq*E-AfcQXjwVywduY<9(mIpyfZzAK2q3o&QOtV~pGZcj${Rm{cSoV0Fq0md_+qCjDMe?`Z zlvIfOl?>tMiRJZ2r5%(VEpsW|@ndf6fq9i`1-NoqM>VU{?-EX`mS17|Z=Q=96i+rL zE}w*c4cTRQ(upDO7=272F){k$WrQb3k?tKbf8)TJ@W3DRo$#1?oCGQ{YM8fgpa=iN z@wxAy+HkKEg^%QQqCBg51=gFDl_mVYzlekFF%1#8Cl4@9z)nttHbOI5o4N3rfAf|H zLat`?1q=n8YP*h<6%gOr$;kyRpYTr4Mn}?&XDyrnox1C72W=3hwbQeK6EfbKy|->P zSbrSf0=cpRP*VvSFFB7;s?ZwSfzv?jlT(^^I*;4Z0txPfC*-?a2DZ=wJASOR z7U2oPA+84J%&6{ScC>QRtpD0Op{u3gAHsTdaIHGHUeyY96+Y&t1Ho1~lch;YHJFdv zn7M7t#N1>1$n-|X+mTCFpJ0{My<-)slig&9t@ynNN%kb=HgGPI0u$^CJ z$7}abDK*QoN?EbW)alihe7|0Rd1M{^zfxrun^8}5;r!b z&cunGD`zpXPq}*SG200mkvhuF&E(1@?$lD_3!{B95*9LIDrZrLbDJz+gi>9U>%v_X zf_C=K;qyD^cc7|`kZRsmlO4o|9d-{C*?4Lx17zZgNnR2%1+=SShDF356^uA`HLIt5 z64n0l#R-9ViuRJ8Wi}5E^4zF(D4aK`2xT5x<}dof?wCE0;X5AAYCWJYEP^g&IBzbK zq|dTCmziNgDcWH4YE4zx4%r>405*2tRuaVn=z^^cBt&!Jv+2( z(7LwMxf(Rps58q1tJGH1(B%n=k;Icun&ZZV8ZR8J_%OEjx%TBxL*I|j{r>%XYgqyH zPi@!NC%{=uPtR{|g8Ml>$^BX5+uDO0M~~{8*KO~qnmnU#-rn+pX>6_zTCPxPB`>>U z$50=3156Gm9QQ8&Z$-X+_3G2uB$6#EEufeBeh1N%(K;9P9iZ#L3>)GAI0~akGrwrF z;017f;E`kd4rK(WBZEAYZwfIn5+S<+C{X~02Z6_JMY-)NRH1;Hi3AWxho$2j5%N?H zEYoV&PNyL*zJBm1i1(KjAG)CsB#T_%w0q&h(khX{O<2Boqc?ytOL@EUnMOx^D7w>#vJP$9|l>G96+12ptd_1-^w)B*+#M8T`c3& z9JC#7IOQ*N0?7CGAMSsgj%sH0@$+Bp^1s?KUn_|z3+h%moiony-l&J;y?@a!wwr%& z6}g=hTNlJ+e_rao@mA#8kOBR1?wB(9O_k`DxhJn^v(*Lq=W_NKhvNatt(Cgv8ESzW z_*9xT$g&c7$fbrh?~&r!uS-^yAI2-6QB4lk+NxYntbW1?2dyl_wOZ+Ned2zLd@kp} z%UB}LA~i0PSpC(G!*c?ZQ*9FP{B)yOPF#8EAE_Q^oXuUTTngLn@01%kI#f5RS?xYY zb(Q`sl8T$h*vHLFdk3(|8V;#Kb2)f7-SuC{yLa0K3Ibja-8$d-~XP6t|Zxn!4ntk9R9w&0~!ivqyBD3y?|pO z>U<>CVE3stNHpy|l{&c|GsbJjJ);A~FYFr%dQU*4VZKN+P_r;l<{B0go1`u4bBru~ z0`r`6Y-}A*t6O3R^2`Z&V*Fz1FLZGEDix9`REyut-ng6NX&tqt#B&p`3+Ana8=e+# z7A{z$OwBe8Q|HyUOu8+;>oyE< z7L$XVH_^C)-a{70h3%vAmy#Cn622|qy_)beIhaw_(u_VaK?X;JCV?7>5R!&BY6bx^ zT={825H+qR{a)GV2qJQ>YKMYppE&~|G)g&RvcWCT{QI{i`EBj)(cqHWmYG@ovX<7! ztao>E%uld`lepXtK*|Ttj$OW{u{Jyl5Xoy%T8LlV>sh-#eD8QTbXWmF4eKEm2j$bv zYSisU0Cn`WM`%~s8eif4i*RhHmuo`MW`Tw;@_E3^07`Y+_I8jhENjQfDbN)J6AudY ztYq(~b&)f5kZFPxSVJ0NPpoHu5-3|`Kmf@_#$P6*W-qWup#AI)HLbhkqSpVs?(QzV zv%MYXl5z0-?j3&(ju)y~0rJ3BLEDP}f|RBVNCP%R8PGEQ>vf003BCfz7#QA1^4?Uo zWF#ylEKH&CT?XFA@Uz|K{ISx7J3kZ|&qpE}HQCtb=k91~!25+d!M%8_M-u3WZp36C zX_@)-4X!UZ-g~Owp?dgJ6=~vUQrce?S`F0%=k?sJw%30N{=T2GnPMOc)sNlb9 ztaiazRU^q>BPk|`$e&d$lC0Tx^)>(bSpQ$KcH26VF=ZV3$LY(;sMz~rTP-2?Wt;aj z2@7K}4QF{eperTv>5lXk9QUjGKmAM&avaRHIjt``xz+D9A>^1Z=tK;&ReqvQGg-rU zT`UwgP*VL)VV`!;M)<_nobqa{D)2_(aHo8?;q`lYgX)D$SIowHi}ky#hwk)PC}Pf1 z_pmN@7zZ9>i)W>?XYSz<_cLCxSibYJ;Rg`8&h3pDQr1-JoqtRh>^0dxN||;V5RVz! z!o0^6mFA;(gZY!xS?L1yu%++`Q!DRc>qpSv&1Zke;P6S&=wQ*nG=g+I zlTULvxLs%%Z3B$#AT*W16h=CN3Y zfdm53RJ0Y$w53G0E=g~-iEQ1kSvA3>cJz<8UdS8YV{dUv2d<^^|4N=Nmk(U4iEw}bNR*Ls8q|W z)W{rN)-%r3g96C5^<$IEdk~TI=m1H@9YP3$SQ!oVLt$H>OdfLYZLz;FxxY$f7=i2A$*4z z9BSj@Zhn1x7^^vC!1?gtCd+@^(IR)<7QH@S zN*V<-yx@%kN0&`MkOcbGRK4atf|&pg%Nj5d9|v4lQNfzg(;pJ@=cpFWGg_#QeoHj&d93_f{|UU1I|`VrQ<>^g?;sl==IV*e|SW3(@cGot9QHy#oL@)bQ! zDAg1<5T}8YG~KfW1>fhuajtrG(1$MJ%g03PcBi3 zRrHke4knozrby$sFj3NM`IHn;lx9i>u63v31eSrsj$LsQqfFx*AmMCsX!D?tpN2QX z;YkB|rYn|W4LGy9O!j*a69e)KM6&0=ojnf)V?U#RrK)p&Rj54`o>j6tK}y*`H;RaH zy)&@;w4&75<4oiNq|Y0n8%_v5{_h)#;E_Q<;y2-OUDq z1FrU&0Eh(8B>Q}SfSU#voioN_Qur+7=m*D=!rBIzV1RJny$jH<_V%{D00;YNv)ft< zso{kBbUrkEeSJt3DDw7f0H*bzlYjs>U_@_OkI&wn(VnW=w;Omv>lcAWc9l?ec0daS zs$VGf{_yBGIr?t?<^g`0L8KDxMc|i(``@4IZ~DEbzvF=J#MZF+Qx7(k&8YPJUiEZ zO}DhAJ#u7bPQR?Z?%Nbx+yDI{kLiCVlW$tSW{JKNxN5AvPitI=?h3Og$MBHEeX_(0OC>n*@0jAhOLD)LU7`rt$I`qCjeZRDsk19(JSJv5K9Ok}#tg^P@XV(J z+IywJL$Ccd&{d3${ukR^SFKZk*D5TUb@vTg%e-dAEK{dZRy1DXYZVOt6qhWZKgqlP z+>hgHj(vr&QMs_uRgOVBVx_t-t$pqZ@$dz@g=Dw7mC^4>h%Q!p)Ol!r2>=eH;!)Vf@53w454fztvL8_ZOrGnA4M**irx@satj;K$) z-Z_ZkEHADVo)_Sg&x4!>;JnZ8fE1alOl_u}s=Nw2~$5klgH3@zx=g-avw$3%~r8yB*+I3;Tlrmx())i*K0??eo8cMUq|UDK9w=>@<0 zsS8sz*rV*S5_0~8Cn0tDjm~zCgY>SoR3GyoH{R+^x|y0^kjsI4%9PtIEz z+8*rnqkfyM19)yIzj$~=LL7)zr|tUsf8_WZ9@pt9^!s3y0jRR!hQBy!2DOmsN_NL4 z3Ks+<^=ys{^h<|_&4b);*nG@|y2$?bUU!68hnHA_htbPl|^=U4_s=f7kv(A@W_gL$)PlJcviBMyT|1pL#i#F)aR7Vf~GL#r??AY?bd{t)~e(r1Wr!1lKjgSPa( ziee|F*(#GM*{qGvGJq;47Sb@YAW7`$>SDg?B1TnR=~gK*inkmmp3`?2{-Pp^#I`KP z&QL|@4H*tA)OY==a7hTgCP~6a$layz3WzSvA<}r zv>B39?{4adoh0E&{_Hf@3!K1RPbr(q0F}7XhlD0=oHDh{5Hn>n{AhHD?(dO}qf~1G zIR{k7;uSTj+%>8w6hAXgXc;cjU!W7ZV{wqux~9zdXC3AeeMdB360L=uNtjS7tyX5A zooX26$lc%6SO30L`1kv^^6z4%7K&;_LhCxB7Kk&#ZK~%!mCEeIENiTofGXJ#Qd=SUSEG%^@AEl*J*j&qv~*_g(oj6|?YF$(d%6%GLHUu{4RB5RP9CL8w^$vzdrx{>~50$l7ov$L8ZGO?xd@HJ2+@PPo)P+d|vc&DXxS% zf-|<8NR%N_#v2M!Q)pF)8m5--k(Iw`m0nL>U^*3K+aUeD%Md)P~`fEbyYjFzNB--1B6T#NLi$%xAZmsJSm=?P-=_9}06sEw z#Ba`ricq^rA>@r0L|ddSESV~`aUaP#^vHGWKC|SMZyNj!iqB8JT1C<1I>^+kx7nh{ z-(kHzINJ?5of(T=Q4>|}Lm6(plJr?(nwh@Qui)gYp5^*hJIl9FJIi%L-vptdk#qh5 z)Ce~KdC%t8Ha5rr?aJ!IhmVeTVM4|&lmyRi0U={|h1fZgJiq}z*xPi=+RZXq8jL?2 zjNb`l_@PV<%HD0T*+4~P3Iek2^ZyIYcc4^#>ID==G6APej>`A%0EY)LMahUvH~|X{ zAez1%Z?#Q2Hng)wXT@EoGT)#V{U&bvEpx~}gPEdK zbleq+O=LA)B!GnoqqLfQ{Kdz%e%<;Y=| zjl64_hVQPLgtR&oHjS6j`T44W#7xoAjEd2;(Q%v#zp)!J=yFY$ba{^<3D>6qSp$X{uNGFXadR zi#>M8;o^!POYcpiw|HlN%W(l~n;?DB>a9Mf8X9LfCONLxN;we?ZDSbZ2-1I~Hxka5 zU$!D1$7yxnjABzy&)^X6=)Q5UtLO`l(Y<@+3k#zswjZ*TcTi07(3!K+ne(verKbuJ zE|))9JuGX<%ovsa5B&4Ly|0vixSuIfx?s$ExoEGt2&1hI=6H(hH->v(Z}HdIINT)&3gtCdMf<8}cB?HUS`8=Yf>bcn@}UIK$}| z6gqc+kGX?-$Iv zEUYCCNJUPYSUO( ze9(cRzMh3wQkIqat(WlL+w8YOu+L_fD9(7wxf6Q*Zsz0^T3A_&Nr;2TZZ$)`IxrK` zYLeEuDMN##gkh0j2%@2q^=VrO3^*TIXqMqscN;Ath5)3(C*SBLsmrQGb2s@RFp;E}u%CAiUn#%6b zVnPdg#(Bk2n$E6?UKo8qff#T?<`6$7D<-3A??~e=g z4P?3wGmTEGXZpe`M_Uk(uZJAY>;>H=Rj^|6+l6Wtn%P6%!a@Vm*xsyIDF0H6e^7r6 zE;G8)*Xv=92Wp+_{6lKKig!F8%P?vl1k$`mmlfk@90v)U+~oM zP(jsl;7G4v(kF4{JsH$r;-ADVc_*hH;2|=xbKB53Cv#9=FK~1otYx^!X+y*Lgp&)V zV)TRSIq~#cy=WI2v?0HQCF)B#RN$@U;|mo z(=aqz^Eu&U7oG)taYc{_#{)1#9TQ1K#N4CkpxSIcI>}i#jhNGdI&sifymiMSXJBTQ2Tr+zgTSOL=J>TQa5C4X8TD(}8cNnyvhh zFa>TL#!)>1f-~*|gQVb7w`ac|Vai%H5=KWPj07_Q?yU;>b)K$R-aYA|Mk~rc4OS8v zTOwr~P1GlfPGa4w7%8_CKJvNBm-E)j7co5r%JxOs(lnAJ12DU2_NQ=DaV0#%L6Xfc z&*O;=hyUfa=@cV4cHWyxx9LnDiNp>K zg(O`yp_nuEqL@u8<4O?Uhj%RQd5I<7FsM~{Kvf~Ok3gP3qH}(O?4nwxr_^l&ELnZ0_n81sf%sf%%T9MQcA}-Iww!5b^mGC#+Ji^zzCDr?51pZ#-c%z~2dlH-`c=(rZ z5o=>T+j}apiPa9c4?p>(f`Wo(+mV*&jT_+5!TQ16;m=X`U(@Yi^x*3!9bZ-!BKS3o z$Ol1)aU|M2K*s!_%|uWg{2R;n|~ff(hOg=LViNz)6xoW zo18=Iw-w{}A)Xm=J^ST9eUnLjGopH18-xI;jDa>*bVWnpbOi0Rum^lvQm%xH=!fWC zY9@uv{0hYeBcPu&gW`K|_E4aMD-FSiAE&O@`_eV4*?QVGeQGWVdd1U8EzUib_1>Jb z6buYSvbljqf7Iy=5-R9L7HMyvz&6>kWr=@I^LfK=+KW%mu;gLO5=eq`o?NOmSFc2R zj;)kPnMb}&Y=*auY!Azl8C#a3NR&_?F26Zmto61&u=^apG)g)!`1o!0ULQ}`ub?bj z62ELsG;BLuy{_Sp(foSJi@_W3CH3_% zulSP$9{14a)NYD*%Pn4v7p3mmN8Qt#9siD9B~nzR_0Bcx7k2sA8h`tRMkt?!N3^#spAMsC2L7^g~$ z31C4eZFf$ee~(t0Z6gC(C)ke0Q(L2NK5*V*yiBMchiz+?(Se{ zBYW2CSbK-YVJ{BX%JRuZXMQd*A|K~qqF5&}ps`NH$(ens&8Tv=Yf4`!rt~DoIW~iy zpp72puNOA(ly2ID=E;Ph)7Wv(N;gY0&Yo(+Z=61~P4;X$r+MO+?^f{7cCGu#B{TMQ z6vNn$np#PF8>u zZJW1_qR$*?K%$EV+0^x{v02C>-$k^;XpN9nRj_=hqQQ)rRiWo@v%28p638x^TnziC zn>C8KRX@Jz!)Bp-1+{bFksX$VhSf9w_wA@c#V!t3k@ns`V>#A7?X!VY@5{>^FH4dp zRkemQiBp-xSK#&|wJ$ia8tZ1eLID3}a-Uzgj=Q`2fwHm&WYrA~O}CnEfk48qtv0Z5 z>+#mfHsEfaNF+B~P>;L=n3jk%e8NOK8@BBkk zvtXYGc&A9kALQZZgvviG&Cn_jMF>{hKhEFRRKiEFhZmeyXYT_q`8}KiQo>4)@b%Rt zAnAug=^*`ZX7A;E^j1gSp<%w*yrNzv-f|KY(q|bGP|*h{2<@j|Bct zO{sWjBLZgnw4)zp7sUf>lPu7{;-L`02Kwc&)uMi4NT>2Vytq$L)>EFNP_gw1$4MEU z-fwZVT;}Y)`9;r?pxP2=jEmt)!sg{9`r86=89>Y#VkUgbvZ8CcLUM%>kYhq5fMALB z#mJ`Bb+e1#-n^2^ONfyH@UU3lWSUhBagUfb-A$$*Y>`_k=yOv#n^%=-R8d+QE?K%V z$uH#^o3!^L(2aheK&(ru{!R(AvM3%n}{Ph%bUt;SFv&HjZng?bA_dXTo zS@Da*?3qa~e3|_A{ez4AWlFzj)9+)Wh8_d)iGNXJ0ft=)_~>%NI4$gCsJULKnY``E z3j7tUv)Q#uH5yK{YC-|U0&et_7VFz{{%po^%tW(MZ)iIsSj;=G};r0S~m~Y~_ zknpp3X;OnMs#e@29jLD9B+V-uc#n$e7_af9>tSg#_Q5ZglaZ+ypt_{Q3NLI* z!O%?o1nk$Dnd*FAi}|#HNJCk|5VdFkn_hBJ8eA|AWr4Gr=?~FpF0s0vE=yPWX6l}g z@wO*=)^Ee8E=i@*>*>SeX?k&t&Xm$h5W6+ls_ z1s>o+NzL8-yJ$l#hRZw7)Fge6sdVr`AV zu1=FG{$L1H)S;yQ(9zolWdh*x17Y$OQe0XOJ~X`p zP97eF8}J7?dosHUhWnsW`@b7#Yxr+x=l5r{F@(**rI{71xXY%$|P>CB* z5KT2 zL+kK4v13Ce$lV%$mc3xKUfO{XXH3w_STS|g>I;#8>($+`aUX!3_>(etPp&!14vY(h*C1>iUj zE8J~pk?-sr2B7J|?H%ZpO91i^I&Oboe}|E52%h#2ccY%ApvI`DwNC3m0nM|cl#VNx zXc&j&>8*!4Bsfjue4M1|sl&^2oMf5yPhkr}y{ueZ*$bwyH427)W#!s->>@jxg&RE{ zpCljl+)Kldj2*C}av1Hn43TAlBq5V9Y*-jok)(_KsQ?yo6ND|FfK}i;b0B&q8_fsFe1#|nb3GUGt^sbw#T$Bss1C=ji3uo2bE$PyC68& zcjyHJPo@!tiW>We#pQvQnh(35EF_(MsoiWr0g`iXA%0D$KuLz@xm`PR6#fsZwc5otAXnn2&5RUE{J8asu5v7c!PHqJo9TUdiGA7A zGA&FYEyOx4Oi{8l;PJ~WiW~fWpTYO`E5nx29}?N$tSy*jcd|j(Lk5cRGX7yUPCTW` z-j$*mUM0T~kQ` zqHbjYv=ov)m>TjLlD!?|sv(?*Vtl?fdVlJvt_)z!xf~$z+yO7wo!!S1UaN*glZIr4 z0=x^!CIiW)3CL!QAQSQc)wLGK(q?w31!$VUj)hA5`o67jv5UUJ)oz8Wjk1^MDcC-S z*~+zHnjj1)K`Zp~t`1W%3gXu*A_CL=E`0utPz4v1VqY2C9OdtOf2{9QgkTdyZFQ$` z_ag+mm~tgeeeh$_X)1DJHW^sU+^fYDPxs^&3*=yCHQoqh*7d+x>tM5LO3%EIV6N+4rq&q#pUF7GFts9f9q1C4BDf(nsW|S8^Sa=n70M$;z!UZ z>gQ(kxoy1jp?w%n=p_r^7L=x3f;O!PWVdn5B&=9mNJoz$kHt-bmZ^#eHNi>DndBEY zN=izmm$qO6d2Hvrq>K0pG5igTf)N&txq&v5E&PcM4?Cg9`e5s0EX6u(H|_UyRbpom^Mrk@qjGW!OK-1W1+}s+C`FQxP;-5l(k__leNLz z25xolv?SK&=tZXL{Yn)1q*@%_K}6f8-n;cB9^(`-tTrx^7x?yAkR)yxKVpmTk*O}8 zsV>4i3<^+IbE1;5>k>KH(xnX0h=iX}T|WUSK;)05;DUMN!Bq@#Hv#$Y1O0W1nuL!O zCEfmpO4ZUiiXeK&$}XJ~CYFY&D<*X7B-CSA>SW91o%b7JxM&zCif+qtVbr};>R6q5 zoT-yRm%Scz*{>Vx{7o1*-XAtTi^jHr+UfkY z&;J1zPvwhsKn**89%PU2tbI5WQz98T^50bwP!Y+*rDL+B$~q9?zmOhV z{89f1IhcpjgN2WPUyOapTTNuJ>+Xcg{~JO(X!&I?!jSEXf`jxqLgRhgZYD;C z{raD7(=V_U=1kypL07%dNiM&wt`fI9h{uVm!kY6*AbhYP3#>K(28YW4BwNzt$P+wE zN=jn#uUrdSTXT9eA*Z~_YZ9y4im{W`OMD5H98XZYoe9q7ed@w|jNHWdj0y@H zIO^6MKETmHc|=hs7?sZ4bk8 z`6mxQOqIs3TI6-j`?eJHG$QZN~GzrcmBE3FW9XtH=I-+0~s6yuHHA}3-``}G0^li=Cf z$w`$86|rD(le>Hua%OQWYDw|T6(S}Popw(7z~TU`RxzaK&+W-$T#wIlf?aGsc!2l` zq1BODlN>OUdOr{I6XLw*e&)wd;1iGpC=-io>Qd(A0MCUMC>iU^%SVjjdNJ zPo5GocbGiI^`zech@GE-*%?J?x8c+RzZRAqJnqxqz9ISF2ieu&&kFaURM!9!L&!0i>JblfZh3z*_0JLn-pkC7@?6XB7-9 zXg0q_>RQb;%OLk(TVR6-IR_Sqhyt$EF<^d6Q-^m@D=&K#3W&Zh|FRHQnMeOL&H+C!(c1Z7 zs6%qRj92sI?Sm&^R%YU0242jf(%sYvSM8u+n3^K|ylTrrncLfm( z98QHgoH9N|U2p|H)R<0PF*-%De1n6BkSFqlGh*9S$3%s1^lGWl2w1aW@-T9t5#e)H zARB(ArFeK^bJvo;fsaFm381S9lQ3sZBt^L~a8Et_!Hd zt?SxXs#@Xe5%|ZKt1N!_(1LkDxb?JwJR96%lW|3(E#kyHU=0~E1l-qc!1<{txq|IQ?d~Z88C0K zz?ojVW(g&`2(qXt0N@@$jJ>nt66cZ!x@HK%3ZFr%9LW~>g5;X-w0;)xtu~5{Kix-L z3%rm2V2TI$zGIb0pXDdnn!%yMOikHzQsrxlZ6PvNJPL6`U^-WnzU`5^?KX2%QjY@g zUwc&aA3b$eE>J#!p=By%FQM&ZVNE*Z}dmbkkmUMHSu;Ds&xvp8dHT>QL zAf7dx{8s}GIfZ}8>bbFOp-3UGXY5-4zy7#hY@+h#Y~|Z}eO;ez%GU@7*c)!*-Cw|2 zuT@q^JXgmWe=^HrO)z)dO}x6kdOL|y=8vuh?He>+4U!PftCMHEr7spp%>g8YcW-$xhhma?uB04amkJKXis#8qy`32J?X4wUeA_V55tB zA*dC!!6crvCrF2^BILl6CiKBQIn0W)0wGKDpAeaRwqz}#LvH1Qm|yl*7ZH_O&f4zO z8qyp0a7Xp7of}5gjT`8F0>iJ;DFyRs2`a-90|xeB6H=k?vaKEXfS}LraTQ` zeM|7UTm+IdXp1V_t9`LciTGMx#wpDfugr8|q<8)p$b=PTn_*u*CrD&WeASCFS`*A+ z^E+lVFqaiL2cxmxP~JRdr7Jg{;vY`jGP_D4_VW^&a$RaJ%0Y+};e#qT6rj~Y&9nu= zG0PqPal%RhUKNI8hAOV!M24D#XB6OV%bmT6D$p_IcHy<*!MUbY%H;CkD@67{nwy3X zZ4d2p=ssQH!AXGj0Qbc;;cI$0}t>*nD$Qc0#12XaJ1b_NFA5SF-E*e}Ap?V?RX^ z<_OUZ$%R)J@Hq3-E7s9-89$={vCwLubF)I=L+uz}W4IvdoC$-eor~(@Jc({Z_qygJ zXKrV1&>v+%o$wcoBqxd*!(oSHz`GyxI#kzFv!Bb^4L^pdGsU}#*^o|}U91kI`DHGa z%(MXylD*mnsDQ1nzjM$AwLG#mFwC<&0z*E6)*(t9j0!BCSt=BKo;w~;N zE?slfF0CSiW845_*#bB>Xm)+j2f=G#PZUquA*eYN#ap3OuDJ>_4D|w#ACs0}Tatrl z2++eA$--l++AxNMlW(_O>k<$h2ebXc#WSUGT%O z!slP_<1!%|zJsR+L?6YoWa;qYXS!Fe+$Hn50P_NkZS#oEXS(JvJ^}u-+tAys+s>NE z;vWM=b6%5`+T`)$9Jtl*3=WeXEmgk~%JK z0TAZ*Bcf&3*q)DwUNsgmsbCW|PC89Vm+G@DLaKxjAHmpiWtpGMPaOraGv-h6UDq1! z?*pXsWSh)s$2hZ}QoZ*7rM~VU#dqQGUB#{y5lT zuatCao2Z+tadS9l9(ZD_-qzUa)>sAnX!6n$Z+beo;6`x3q<_%Rl>L3{KIQ!b|G|yj z=({LcWN4e*eY=JW+ig>)&iRC*yiuO%Nu4KO2C++>(SnsOSYPif*p>tRFoGa&$ zsgpcVz<#414`;cX;_ijGTQ+nge{6;gvFAO9T3K=RwyjKXi4$?WBxQ0^qqdkKLt4f0 z0PXY@N3KvGuC@zPk`~6M>|)q(G3-f#`Y5R}>C{PeCp+DJTA%(v9s10f)01`{Y9L>W zMoBJ!Ztb@tXTT=`O8Pl|J_q7qXF;@h{x_xeirC0Vc$Sj}8M&sKPqxhY4fyW%wFg5V zq{#hiZ8Y5r4WOA+f}h`F4Z)geu-4U2kn%Ne>~iqJ_>)uX8K= z33(eC`R%*Ry$IbhNEkMvPE01Cz3cTS8`LAa|Ib@4kx<;&dqA`&@19xq5=&S5a}jiTGm??;T9!yOL7e zDokYAvRo=lIC7~vvbs{F@T?Xqm&BWC{f-%EykY5^KPBLhjJqcrUYd$~rTCk*D3WrTkUY&^EWaAe+p)R1D z0JZpxEDM~)3P_J%kcf0ISTmM6Y;ewH6-IbH?g`%u;d7T6G0uJX92M0x6g-udXgW>i8;(p5qt2l|nAl zvrBd=*;t;uS+YjygU=nqr&^`q-8)BV1M>XdMiPA)mGVJ}J&k^#Bddq*c4^8on)VqZ z{<$nw&=6GACNVkX^(6^|2`amTzq%cgb0O5>DP(Fgr3#@mGF&nr#7a;WB&=PvaUgz3 z7z|FA-9vPXz(SOPQCpNAxJb7(z%L2 z+gtiDHv!eOP(4c;3RzB^6;|8^+IEFkbkI9Qh`x?6v%4#} zqkn@&(Z;x09f$!VDPI`iGmJWV(yKs*TYm%o*4ZqK^A`@gtrgFzb(SSbC#9C9;w?)> zwWuR!0B#ruqMR3&JDDv9g6&Kk!+}`@DY5SxRbjrOpJwH5pQ(N?(|+$|{V!DnI>?^J z(jC2FpHttguv_-w^Hv0Xy@C>C>GEp`vg18mZAr2p=?+Y>HQa=5reRy7)_sP{FygKT z0O{}eO)B`yuJP?N@5`R0xcKvPHIMX4dz`SAfDS#>)q1yuXcXKQErX*dE*37TNBDA7B3_j&~a>k3jhk3E_BwlP> zJ2&l;uUJ*mR$pGFuS^g#$2gyqUtjJRzd0dDh@BHM-Ut>#uNZGML1{D9dztM?4@@>Q z;Ub7-r-7S4X1V&HgHBfN;BM85xoEkJyS~i!7$3zk46K+`hl>J%^Rp1!FV#vBvoW^m)MSB* z`m(U68-2~);lddirrv4rcQ%CySMOB=^M>M`4+XLE>EX@Cy|1qFi=&L*Hf0o2g zqh~1KYb1<(0gqbxHUb%DEBU!BC0jPwcEB(UXV+{A04H)>TTPwj0}v|Rp!oy5;TvQI z2;jw!^AoMploe1X7#$i?P5K!l0ZwxsZtKt;x+_=kL?QSPjMP{=>JB6Er=CRHTB|KDeK}B2@!}>0urwRHXp?eVAN| zB0<&@wm;5=1fTwneDw-J*FSypHqxiR3D&3%4QYv9)bh0w$h-^lKM{EXC>I|A$_?Ad z^z_;fE!89tzdoZjEYJ?41CPzrhQiy`KBC$Vdko~ls*oN)1p!@9?YnRRzMj6Pd3nU< zACgfcdO+<-;E$l5o;uA>jsd~>VVrUR_~a?L=q=7i(SEpo<;rDk&})mPYS?e9LqA$! zqz5(SB&pHfWJ(_5RTHN1Aqqyd78B*4NfW}x>c2nIXjLoMjS z$}-IPUUtb7ycZKbN5$2Bj_SEE^bqs%=cQhyQUm}KEqZS1fcm9<^tpFL=Cdp?iyhu4 z4%Ic6%gV|_x9}kG0DzeufXkJa=W%5!;B}?wgiivX9xANJ>#1?~{RJuDQx0J;14(wM8@vX6S&2CK2QK z<&m_Z!JnE6UFP#}*TIINw-601o*hVwG9dv5(8vGB-e1N=^}gYw=+NB_f^>ID=g{3D zsb z^W4vM*LD4ffyC}CG)w^|#c`HS!57LmCg_CHb_OOlf)+PK=X>u--N=Zc z84BX0gut@_$qP*mx@=(0rvB?yg@|hR`;YJg(F;W*sUVp(gE@f*K|VohTGJ(RVX{Rs zQJfUFzW08hzezNBV=y)Z1hP?*P+U&Tr=5nMnvjpDL&$)70biDTeS0i5C~=U&DTv2N z1xeqQ#NmEatTLRZ1@KrAiX5jb_qRNiwvsVGx^uu$&u8X`J>;Wv%-NAX2 z9bQ7E8>O$ix7S2LYDQW1^5oL#dNT>~KEOfWVSD)&&4081G*|{j&7Z?=IlO6)Q=-MF z7$k2SB<~rVT7)IasfcN>;O^7e=Z`6{y$uwB5$9cz&E-|;|DpLbh8nP+kHyjuK3~kM zE(lQ9lCBlj38kH78vYuM5r!^o2uwr87?h0F*4Fy?Od)0f@rJwH7`ATzX9d8?_J@QJ zIIw=718IiwVfJH;;cf8q3>Ds@*{FdU_3s?euJ#FOw*p%MT^J5a8HixfDS(LtJLh>6 z=8s71EKT`;0{lH$?3w8YE9{(N|66~$@J8fy&5Kv$9>^^JL2}q91WyC5>?7nwUMaVs zYlI~Y2>%s9>FD&L0)Kc}S?NYsmsSLiLgMv6Qg&iklOa}_WWKG{sYKm^JP6@7*wi|w z#PZynJ1X`!i?LAv}g{Ko_0|Y-v*a?aJwk4Iz;IJ>LdKs^fBTI+3J;h^# z&S*@aU^->`O|{_}@KD{1_-^eu z8bSSJNj7TrMZ)^V1;)mi$wllmjC!QfVbork=7(pvwy$Z=d?l*txe3CY+xNKeL9Fba z6nPYe`4{0uZB&MmF}kiI#nD>pUVVbI1#VyE_b!m4CNlKEtCg+9fUWX(*+`H1nq@+`Ch#nbG`iS3O@kc`7h^@Aq7K~O`fANLXIZY$|mk&}~C9+!@#(~9!y-f_u_Y#I*kN`~ZZo#ZwKVhd{f#CV1D zUpNOH@Sf^Fu~&D7(xLTUAfLuj8$`f#n?X@z^C093e8^3Z$13Rt*Q4Z;qVdusxF9gk z-cGW0gg=De{*NkLw|VN4Y(kC1`9H9ICwO9J1*A_4iZVz4zRRZ!8CN0N9JZbrr&2h3 z%kmI(2x~=adxywy;adw*Pk|qrndmNPKB*vE?lWU1`~DLt$yOQu`wjA7A;|LjxD2g<;~bjzzUV8dmC^HA z_XF;mq#9H099-I)B(rh5IDwiTJ{BG*s5$P0lHu$14v?~pJ$CDZl%<=1s0HV1-fX<7 zM#pBN@yxuAe^k3Q=Z}c$b zJZ-32l2_)yOHF3R7z(A=xHpH(b=Ia)b-%nSz%QnnChufTe&bdrU(LglgB#ACQxj&M zXjcm)-Q4**W_PYT;r3sK?_2n^A{#`i!EIuE2r(_Kd%yqENq?@BRr*9PRA;GOAeujtYal_3LCFH?RczUgs{8A!Qc)-~EYds!`wq%V2#^o(5 zv0GPt-W=hEg%F#J9dgEiKv!up)tWNHU=XJmIt;4enVEQe6`>zaEB){)*Y;BajlP_E z@d~bb;W~gsPS(zjkOa`MzkmVKPTX;v!2(!?sZ!(l^r09I7YeO6oMd}sour2@CE61C zr19$j5uE#2U8;^1;f`c!O+NZel?f1fqG>I7Q}wga%-p)kRXWrX-1-^WylAo)Il9?> z(18If3aCdEge^bVihK7CxGZ-*9e?^5kbB64yeG7zt08@!eHF zcENEGfb4MQ0;Go*AUfTJcvdIBAb$j);Iyv-JC3xcOklZ$tIp_X2~)4(Yaem65uR;5 zPTEty@K-B7E|U;+W`bQqs?qY_;=!AZt=@_0;M?VQCDh{k*hzdo5r4z4Wx1VaCT1vbJI_Qwu)tE1 zAb=)T=w_@?QoLYNtYG9dL14pnc}IHZ!QkD`)O&W+Vd9d9SDCM?Y5cv-d0i{u=JUd+ zv-d@C7V6A__%qzZ{99k;La0_(Xk1r|TZ?}{gTGr;wzX!T66f;1|4;sZ6tdO$3be7* zZmYO&&Y;f6t>VsE&v16e?sJ!^ZL6mA#M8XNC@SIyIaL{iqjTn~w0{Vu|5A8*NUkPs z>Pv33TE72$_0BWb#6N>9pWPBKBYXUBfoEO^t1o(PW(N|ku2Sl#Xw;Eiqkq&#%JCNe z^A~&xtAU1JP6W@hy`^W{NS|Ahj=m5Q;H=5#atJpxvTPGOD|r3Zdxmv6pp>&iauDy} zo6cAPC;D8>`{SfB;)NnEVMi@=ixjsbMs`PvH3CB*WPYu_Z@@*^*p2Kae!@VvL|Po_ z@Aq*d1DyBo5iC;W5jKvxE$?56z8U$Da6A0zZ>9~>)gG;$d&mW}V;EvjOIBsj1*uSV z_7@!KrCg#y8dRhj)+(K2#PnTwySqvG3sfSF9JU3dx9f20q;D7)3etnP20>7zHXDu+ z>#7kO&Z2;uVgG2#T<6dZ^jgX{Y}?kPIS zQY{1V7+BT+TaYg&<^sk(*NF{Or43Tc2q8ALOwHnVwudr4^j<%87 zJcjC3BqBPS)Oy7Jtmi6KCH2KN8P6T?AH5J75HHb9=pYL2#no~$L2sJbhC;h^baX~W z#Knt39)726L>q$8DB*$7oDAnx!7T)?3xKN3uZ3Z3BhVd>ULtL`>Ruge0G|zZc6MeX z93xk0S-nfwgGavuM?%X4MOO>YDIQ zx8YVjSpfMYmq)&ioq@_`wsvB;I#ZxdiG0vYGT>M=ffc;=TU&;u&`8TT!Zr*v072g7 z^m;T(=?Vf}g6IEO6X1W2z_sbMRAcOy%w1hkb{Hp>-f%yH%@5h%&COVphM@QR8L~!Wn<2y z?`cpq(9kKydXReU5{U8fU#X)33-ihy>0cC7&;=qqa^tXlB^WyAk z(SNqa&qlZ+;mjvUt7PB9e?WC}^6xXi?q{F(iR*xS8#bw*obNztZfiR3yyE-{ z-~GV!diY&Zk2pFD_GElxc=JPH!s&;YYf~e*(lTwCgY&fLz3N#xW@0{_RNSf?Id{jB znDFHAgi%T6qV-fZOtyT`8*Ouw0L4d2_zExQ#$dc55h>1+MtlX?c%mI%=rfVWNXj4n zE}er?4+M@HhQ&@2_*y&ZL&UBu` z|7Hy9qgQZA@Y5$|`v_Wu49W8RcLft5Eb)Sw0FC_?WB*CS7q%a|q-|_Jc9rrJ94?&j z6a?z*&0r9_k%UFrRwRjs-CNVfG`5 zW!PN5$J!+?fD!MCwac=_aS?;rpPC|Q1P*iZ*I$%K|57lr)FKZ5m2+rPVv>XqhSfL9 zNvCf%lFB}kYG#b4iM0*c5i@Y*EEq+Z!U+e&$RSf)UMZ^xCxsF_=EY{LcZ%|d2>%oD zK`bFM_oaVDJp!*;aG1I32n?wor~qss9t*?@UUw|pt`W6-jJ*C9qLr{c_<4>P&Kz8# z5TB7lYo}#cp14E6v{l;25j6K^b|t$;_E(iI!D1H+*)G8xqbzN1a{}rB0;(_Z zU*>TLDN#3xh&3XkIG;SGdlG>EWo}jbucoyPvmN^gy}l{x@{XS7%^?>;^I<{L>pW`= z5TZrT674h>>bB$F&^i#LZ!$~}o~_h+4g0`hksZl3+;~5GV*imw zkx5#kqKQz9Zsn2^{U0viD)LZ14@_FGfA;lF9ErFEd4J_EgCUxJoAgyVe+ zTqaGU&TXNvG6E{Ar*!lC!V$Vp!#_BZcQ$Kbzk+9NYY5^QS>RcleQOglg6|cqJC`$X z@P{+3Aa(F|5H=~~k!mG460G2%*BH>XS-bJQP9Jo)6I7*eL+ZmFtwn6}Nb()bb*vjS z)E!^qj{Sar{qexrwpL=&*A-b!hZI+yw)~X4Q%dL6`*iP%A-&EJvJVF)NWHm$cCR41 zk{i!oV1N#q7EI*Dkjy%8x)(R$;nox2^x6&M7Vw*k*jWqPSqs`Q;)aP&XIayt{PI+JqMjN27yheC|1tDMcf(^iA`vb|W_^%AYqWvHI+!9>l4`xY6MjA}uJs5U~-g_4^ z`W_WdETsc(Tu(`sB1jHoxMesMtlZIo6mpg(NU?Br68eEN4pSY5s5F5t)KrbMm9UNk z7PAZu-Rx$V2^;KJ)^uTbWus|BV9lYS%JSa?*z9n4RDvXX*!6WVA~g1y@z*kk3Um3; z{>oP1FpC*EhRF*e6(UCTV{1j$h91)0R?zL_;3$#@6lGAB>EL8L9O%eU=}12;4NnNi zUSt|RB?~sRoQHxiBnd4h3I-e!&vZ}?Hi{I2(Lw5YXs8hW)-9SfVH%7ud;b4i_4e-ebk zm34PY6!ql2!=)&>hUhs*rU7UN%X+3eq)B;vn+M{Qafko-5kN--45N(VC_-frfpE+$ zlrI;(h9Ybv@9=J!dn(wo2)?TDezF=X9w}OD;z!oU=CY0T|DJwhnW@y4rVdCHLa0I0 z?;ECPj*;^QX-Su-lYS|R79@X+_iXd5E}p~<%>(lQ=#&1!d>tx}=s9Hw27LAfwI&Qk zFp_MpqTAJVWjK!sD}5nNyX302^OGu$HEy@k+=5e8zv@zrg(Q0}gG(wwA#Q4As97VE zJr$!cW(tW;gKv5*_TH#iiHdt~b@fM~cLuclezQFqK9T-(n0a;|w7X(C5&ZWr|JR zA={T%x<<4W|A}zz9J6pn&kINol-u!)<@u~GV zO7#!P^2l0o6zT`38yW2hYpkc=#V#qa0f#pJ=*-g1eKdh!#!#N|5MIZYOF7{N-i}KF ziAx??doK$#s8Lxub6KbI<3)H_G1@y-P}FK`Ws=4lbZf|6EA{8Zkg~(}{3!V|u z(N55)>hVZ(k{zIbMbYMg=ZAA4c8-{tLXvoloIgRj5sw}aN51}qyFw-ZQ=S{Y)rzQtNduZ`71_gh}|r+z0?E|zd((w3rt z{95PRBGT-?bV)30qy4n=e+o0}v zsEC1}))3-_i$aWxJw-I1wx-U?3i4QDz<%TifW6yxSh_y1Di3JN1Y3|+$8MqgDj*U? z>;OY4bY4J)dRWkkzN)7YC*1|6zoTtlmyn5)m6?^9nUQJZKI#5%_^x%4x|4P!-Udgs zftCug-eN?xlLHBoC66ifA$oS;&^*Q;Ob^N%6M)YnSot~hg$J8OS{n!Z!4%L|unZl^ z{I5iX;^J3?=;T)ftFdluBB1sXWvCp{J%~KTBnrPVxLmui{i zwBI8}V1oofEo}PZi}LXsr5&)CpVqhcmfeN5JW@q}0RrepVPSroekuKL&vK{G;IM4# zEOLFM`kwUb>p5|CC3>D@+B_2p!2%ae(R|KK$1GJ^vv?pdBP5ODzg|I7@t))k2w=P? zad}7L`i|tzJCcfbBpBYGGJX~VngQvk5oTVJjZ6#t{wkK>HJPI*wYvHn4s+DCb)1H? zRQv{#VZ~#(zT2dDN7TYJxgv4SHh4;Ugf`aXPw)*=hlpC|Iiu-kaUuk#Z#KBAQJYn& z(Q{U>s)RCI0Z1?iOpxYE7tUAElv>r(Bw4$H6Zq>L{<+U6@uvgC5bsVS7%YzP6A+^D zt0cDs?U4d!W|&C1`=H0i9GUZJP(Kt@I5cLt)ysOYsw? z=A86n__!rF%8Uc%!>wmAHt1BxIP{K`a73K@C$9Moehr;7WayD=o6QRyNPK&H1!7?k1)9Lli+{>N3KQRKoPoMc&x{-i4@5+csS4)td9EtpC2WVE zQ-Z?wc>!~gicd*?+Fayy|B0F}L!p#s{o6~P;LG|U=WKqfR(OL;wzh49@U&i1mE^R3 zBSZ2osh@B~7L?6~xz)k%dr}yNx~ho3&x` z>tJX_+;xQN&DWqCkMI-#feHBL&@a`J-*(!!2nF7T^i{nuuWb_oosdpOLr9F9lV7Bl zFx;K(1aw~8;4>Q$R#po@jopo5GanE-q&T^GhU}AQ%)yGVQDex}leWPPSI*GC1Re=J z^6n598sH0P+R0}{6R38esaz$^ReQlmGAk`Hple zzy<`$r$^-e|GWJ^;tITjPf66h0AuQO!$Cd7N1^1C2u~joYbG)WK4-p=cqZ^UXB-J{ zjsb6up|BPz+_b_6YL$Z-)Ip}kK9$PBl*;>=El zRyd?Wp4q3=*r&!pQEMDheL_)xrJUBJdTRa`buy5py)R3xfv=9Mfv>EIPmP1GtUaWv z{S{vwNBg8x-AH{OpZetF8{G`*B4`;GL**{O^gA?0kjIO`DCxcXf;g0qP>eIod zPOOSg1!oyB`-_9Gs!BCDqrGoUrM+);Laa$OWcCY&A)FFVy;E7^WMJkK)c_1ObM5^a zWepfYLn!V2;Aw?}8F&D@`u@!U^?jZJjYD;m3f{CP-i*efiYApA41WciXsmxIaGwK~PD)>|?crz*oe^m}qswk?x zgX#T4s?&KkpoveZiZ_W`&r(>QQCXi-#hX^yhxs=J^ABd83O=PGUMxIRIG9w#n?hzG zo~gnCybNBPg*?ALCA)5-uur9Na7z)-MCIU?#=42hdWOcjx$K;o?A(+hKBdCkEro+y zvg?_$bD0WodjJ#tbYIVqoHLf3qmV^rKVkzAV}RV6fJu-&wF;8YjQ(dNI>;r#U<{7K zF4zvnV@$Mz47r8-RpWwHX@XU$|Lwg0=Z;_%SepM|dz?OJ95H7OG2HUP9k5Br!&A!? zM|>u5g!w|!nZQJ5Gzw)CxHwT9+7>+>8Z_lv?(k|_bfaNu!nNE$gJE4_B!(t}Ta<5v zD4om?XEjb~t;&(rzS&jZLe*VOFW>uTvwI8{L^?6=loT&KtObhY>p z>KRRhEc5u+EMB7wO7tiJ37xwRri9BNXH$RTwiL=F*6pXnW64;&wfs~~6T>b}6sfHc ziD^p+<9thq+ioq2ltRvAE>s+pdic(>SQg&HSYdioJW@9~$)s+ttE4|+ZeexulDd77 zsL+y`-kw*Io~io2u(*yf%GpTENWnIIz}4el9~!gJ93fT~xP-OHH;1i!n-8G!f;er?Xh2aW}$5 za{I*+Vwo`N>5rISOCNge-{!(!#$Cp%Hws9dxy_}V+)ItKj63_S3BLe07k6HOx}cKC z+bFAS$SK)6zL(}uXM2F;_iodb-6v+pc3t0HWAjfHWlLrm#fKFPRG zV-0NyYc<{(~jarWR z_hOSmFI7s-5yfVOjJ~(NX8#lSVDROQ3#%6gILoC&7&)XvP&RW+n$GaIKYYy{xCcL^ z(<~wc!PN6Z_$y73mNhi!RxVrsjPmwG@g*LXG9c zHAU5h4`hvJ`H<8u8D7x-G zW;FXr!f5ueC3>+JTE+uuGKnDBc4R=ZWbeUx1@tDEbiWWpFUSquKFgAcdmRBp|V zBe=nqHjF`2IkP%E9uYeJBsFXz6L9j=7j=egL^J7NL!9Z*ozApaA6l#!ZPuYG6}nSc zHDGBl*Zl{{lDfc>p5TUP<524;caAKCw#OB{4E)uq@_fa~Y#JAQcU&45cE3kVo;Unn zyevK3^MG-tZ@62cEwQBsWOBuRU%vzKsP|>IjZhOu0jc4CB>B7F9b4?6-kL!3iP_xp zpLgG(wh(9wPC(T1*cIU&Iu3;lH>@-<$3Qmp-5H?^w>df4kuC@+h6|ReKP%c=)3{?K zxIrrL;cr>)mf+GunVqaHbd8}lR*VrFavojdOq(6zblDj#@{XTKH8b60tucI+b7GBRnqaP&LWBL!W*6ZTwc{fotnybz4AU z<2UR^?Z%{$ zvul>T^i8!)CpG2J_gEjOZ062y2FoexMwC{{85`tlbBj8m?LTu{2cyk0uNgEn(vk2T zOTMLlh2>e-zLi0#oI$E4-RY0MN*7Rqexn;GN2AL@n{LCRtEQEAm8cg=1Y}$XnL7a*dVrJuRnPebRO_YB9+o zS;k!JI&$W7oR3YC`-GF7nW($PxuUGJBrgn#UocOrTxHU>AY1bsaDRL|-QJIoT$maEt$W^04XNeS~Vf>4f`{ z$k30vkjZ6BE2{>6p>X{LgPWDLR%17X5}1=bMHiFF_#FAfvb`5BF~lvRl}6v4_zdaMZ(gMzhX}@#uGE@Xv-sh;%1ZZWmlF+j4NU_7sxM z)<4WBkRGugXK_Ubl4;F2YRt%zx8%2XZn$sDRBiW(r&M_t^QTl<@+W!cU0>}Bij4m# z;Gitv{#!uaWVH93uzu_?n_j0s$E<8LH?~;I?~i(W_Z_pl^OxIgnrdzD_UJw{l6dhW8ZC?;wow#?@^M1 zgy*}rFc6-c?B4&~1T3@&^YFb^%C^+qC%aFc{5yHl_+|IuZx|Tgx^1hENiBy)SrNnd zTdvx}%kXk;a~b+gnUwmey{Nw<^pNM5g%}+gD{F$>oJVXRK~;w=Vd`rFh88@{8kU(B zGB6X!^}x2UVn6X1U~?-JBE7mJz4MYPEk(DFa%&uQv*G;kM=a&49p!i&)w1>H;el$c zsdMQQgRtAR{~3yKpLr9;tYXc4f*K0KtPn9Wtxi=cog!AqgzI4sGk6SU{aFnDBssjj zdV#zOe{b$_si;77?ZPYf^6=Vnhqyy*hxKqUbpuNn6PGxe<|`9-PuiuyZx=iwtW$C* zJ{V^*&#tqfol?*`FVHRJv7?tJ<0Cm!*I=dAVFbJLOTq|8~;X>t_j716G(qpoL5 zYxSozYZuYJYQwmui|D(iY^QxqfWO|w?H;!^e1Cau8-+!6byFy6`1*|0`HaNQgDk8q z;o_xNZ&KQESh#_EpoEjCXI!MtDYJ*dr+&0fnyH4MKCMlTCXCZQ`5_Za80Y!;?q_a} z@r;#X&&&(f2woUv>koAHGZix0%MWx8Fs_OX&hyow?vq?*tP&q~ed%lyvk-dn^5u8e z|BqN_%nIo2F1&LMT>+8KA6I{bUR`+iBl_Ks1R`VhvN@)>juDB$uep`ub;8ySl9r@$ zBF-e4g(}3~G2idEFgN3C%`9Bvs}vkynZPw1{MMFJ5d(p_5IkmFF0Ia8y8ibX3I{p$ zj-`Tg!Ee4z(cdjzx~dQ?nseWMP-AddDlOgUYl8jwSJ4E%0L}XbF0!hBZ|y`~c7`1gLA3-wt>by3`H{1*iKQn5}ym%aw?l{2Zy zhdf=#EEJ-&F4T~)mXRd>uJz-`@O=Wig!_g++h+PJ9TO>4X54+cOMP40>^$jOF?5Bk zn6f<4Tky_q34Xrir8>hWG68BtOBZzlDYJH{v}=SlJ1Ou)yza4Y`_0yO`8e7X>^<^W zOf%t?MJAS7hW=}Lc>PgEff$&W2G;D(NZp#K*4K32tOOOW8Ns*|y}eq7wVm?bz1ZI( zEn1s?UnlB*mBLML>zm#Vj;TxkV!VF6j%z6ukedv4JXiWTgk<`SLO|6j*p$6utb9t5 z^k~sJeg~1{gcZQd>UrK%mvs?))HC+c%MhlkY`Po-OIngE3qbl4eo zg*7fB)i3_di%apFiisBrJ=qorph51m>fkS(W+UJdVT66HqR6Gm#;^;J2;s5%qbpx* zTu)qq=MeT&y#s{uF!cLMC;$_i6B}rH01)zSA?D=dm*e!ouG)0)#J5|U$Q84|jI&%6 z^=>KcGxjTyQUX)R@4n3MzB9U{Hu}rZD#dWNLLqGFq37bI63+v6i)ER=E%}{fnq@?q zGa(}Ay!-jz9@}HjtNVSM+HTSVGf)mDMn5E>VwQr_+lrANj6^hC+e^Aw`00#*gFl;Y zXY^UUnrQx@h1<=KbovZyn#3%%a_6_g4`j(SX2fu3{3&M|sI;*jy6wX}uT=}!Gy;C8 zc<)X%f4e2K%zAe&b!SJRu{>n``qvGk>_(qa+Mc20k;1GGtDIW%JlnoBhoLlv`j~T> zHRp1()(n&Dp7t0@?&oo>3bekWtE^AK2GUje(uUa4C@H7kVY8sE4&tUaSUamb?@l6s z(YhE!!@QSpjm=s}q!yDix=1>0y1%n|CHrjttZ)(=*Ey3c$GzwWnY;CNWji{A{%GE| zr4;f{g*lV;Hw}G5SMwu{o^c-sU`%QTc4UkxUrEIqq_Plw)8Udf$|@3I;gH?WtTLls z(a=U`KO$=C%(3q1j<3|gTB|PDWwk$TUTW4Ex+Jt_+p>?{8 ze_KqW;(L!sF9VfV@ADt>TECKItZRHcFzAdINm2sIcDK?kosAN7jt1;5$lwZR7*H4) z>XZ6l50*citBWf5J55*qz~IXjI@i0S(^J1xe@B%bHwtPFSlo=NIv()+yPJ9Tfyv5> zd{`O3S{wGm8N97e-^dOI&~atl4fC|tV@n*R&%5uit=KmX*J*VKEm1g}=Xt0+b)qatk;ok$KRHU*OWIa9XXQ9y}}o5rh-$IraBshH=K^#*!{gM94@tJ@+`6(E3y()Fs-_bAPqjO1mB1LeDtQCv4sFE-A*uthN~2! zRu|a49Nva|6@8BM0^{NrobR-=P z?|eR9fBzob6xe!%p*Zm-B+=j2^Vu2h*b!)&2O!l-iznY>j-y?_+a22=BEZN$U|m~0 z3vLRcfdXdX-6=onznD8-OW(`4!1U=kEQWf`Rv9BM2-f?)cOPwVDE`Q3xCFm@AHTyn z{ts_Ta{VfWz?JYU>fBPCJhSCDeeg%4h)825gq=vMlT9t4DL=SLY3iU@cnLmQ_(r8A zV?xDi3Qj0FytDK#x?;kvh&8)`4Ka)!DcJUr3~$6DZy(+A{;gWQLx=cy`321n3J$%@ znp^T4a6{Mu*L4bO&ouw)Xx^PVc&J*{Qs(8bQtt5ShTB@+zCb86ohwgvxjFo3+bC*q z_bd@%(fB(W#aH-JH*YkUwm+pE*Hr7TJ`K~wM6JJG*^IAnIcVqkX9`vswH)32NqnhQ z2OZS!R=HL?7iX;hQS`{CFGr6tOP`ftw4z2xt46aFv zzieG`dhs`3X`kZ5{P#g_xh$o8ukIv2q}kJX6`O+``9|nk#Rfx3E>lxyA;FS|^yURG z%Opfwad4js-RQutqiPi!3Z)5R-EBHKI+dh^@_~<(&3Mg9PoA9o`~C0p$>%?PpT9hO z{5kURz0cQA9!EaJEi)YE>dS9*40$?Ju#+}mr6zif!Ie?%I4O=0`?Owtr()s}_%dbiTjVF>48eA^Tr* z-#7p4`gw;*jZ7k~0&jh78|N}kqLWbX*> z8avx>ckSCm4bMo>H;3>E+HVgp+)BS=T}sA8-_tfMZa7z**~%HIXfK_S*IeU8rpQue z0p`Uv)Wd1lYD{^m{a!%nOWCSAuM*R%QhyuB)8?JL9~69BU~FH^*D2$lW!0^TJ}U~q z+and300p9LI;kSt8JwNhv73>1EWV$$I0Ag}&lWI@MkkxrOvl9M%x^7cEJlKbY*Tyf z6stY>l!PpFM-RQECbn|(J9d>!gY{$s_2{qU3pVJ6t18OyV`cc=!Ok?7aLp(8iKpr3 zrBq=5==q;%4%tLh1 za!j&=!oSc{_JXJEMO|5sBF8R?^N3(KppGY3-Y^ho0y;sIx`q1yz5pD7E}Ac2AQW6UzODR!8BD%xA7 z3cQr=G;iRh;p;XW4Ko@Immckv5g4;>uk%qH2`=@L5BBoAwWZOqnCT>}U_QoZ*`cyj z1fQzccB}Y6dJkI_^aru%DL1yxO7F*Ei=~{c*`}LbKA~H zm4QO#2+^mXobPYgG%^Y&3@o%%=AVP`h?g_rf-?16Q;oclFfOsoA%3YcS^j&qPo+Zd z6L=i;dls}@d#oJ)Utq-DNo)IVyvwtAr)TlbRK!TA#JG}0;$=EhXTQ^6Az9@r<1_P< z1?Onsf4urK`YM7)oB^$ZBXa_n1PIv?(Q*WptibB@<6Wk;ukNm+rJUtlRbxRp{ac?^ zo!uz2m?+ceyTe3V*DNF6olzV9Ms~Envq70cYNN#dxN?7}J@iI~^=`bt(p^?{ku{@+ z*VH9uT6lq-oKtUB>%v|oCfZJD7WkkWFc?9-z*HKA0rLyWI2Q5kR2Q?0D0Bol>wPqF zOawU^{ITN?pWS{i^5sj$9iOlLOsHKlYYp2`2X?33lmOHE5+WScKe5#W08nDFzg85l zU!6MZZ_rq5?p-%eJNNkglJX~#&sLaAd9O;B`4h~Bm4hrC9X!rViq;4fO*xJG^U0^b zX7i>GTY@1K7OL05Ic1m6kHk1?GC0yGsyb8hKXC+2Y_tf^`g6llsapf!xeD+$tA_Wl z>WQz_eF(PsJS{V>(lM?&?fpXymS7P_!kdT#b6YlKYX^Xdg7-Vc(k;af55jOWA*^o7 zFQt?vW&RHdyu9mwQ-s7ZrFDz`dEYL@KLk{AyI4vcljfZlxAalRHsc^HqkdVwI`SN_ z(yV35lqin%+QE9>r!pP<=4iS_r@r%dhA#Lo!s8CUuOXTWfz(Hy-HVpX=RH|6m^~5N z`Au8VN(fx3db2jHu8U7;iW-MPtw2>Hq8wJDi~>ARXm zjM=Qp=9ZR5qXkA)o~E8&B}cJ3RW>*E%(Xx7ZZD*Q}b9+MB#&I3^MlF+mf%l+|G5)h|MzeL><|IRI!i!1WR3Z3IC*6C!%#0T-V0~V_ z;So_l{4p-#Fn{M|fj#~vLH;gNO)Jp|iTNA87n;9m_hit{$pX60w=%>v65NZ&JdIiK ztr*EYFVa!Zlx-0-yfvlvSx}O=_S9UiAzY!i?lpd-={Y=~H~31S^eZxX#5Wnqtvfsv zn1kCf1;aO~rMZnV4Va_|Q|Ne&vmO#FqMcLi)7o&abAJ#Ybc$zP6(0_~T}AjJ4Qoad z!D%+)nt5&fYg`<#}xa_0{12XsUS6lKwxSz zJxyhTNVA1U&^aQtce`S}X5U~wuo@^y1 z>qf}%%Id}UzkjwJy<>b#bt|o+o{%(-z<%_++(kZ3+Gh8LoYn<MhIQw%*r9W|Y~J`_AVtZMe&_w#pXYD}oKXAV_yI`)pHJ2r3m{ZXDe zh1vaI5F>-&ZI$YWF!A2}P^;cM5%FdvypG*q@Lm_&XcY74@2VD1Gry!K>sxVG2Y`u@ z;D@7>Zqw0TJ_E+&JWW&8=RMz^7anko>3EvE2MU3=An&i++rs9#)D1`Y>GUsIdQ{^1 z>(Lo6#^BN=+suyMX~9Np3rnX}=kGK#Um-9w4U3N81$8+h;gXM`y$OY$ED41Ui5EQ; z^I7aW7%>wLX>yqmd_BWJpbo}n-}uzjynFED$4@@HrwB|j4{&0FMaIq!;UE4lP;vsp zBl;ys0z#e!$RT3h9fPwRvmq=~`Z}n2D;yjl>tH>_slZZrZ)^^a;2n1rWAFKU{_6HG z@tpTB-Eaic%G>z?e?9Se9(>FnXWbdm#%Vdsxj|v3qX&6G1y&s@({h;L5{Hkxo_tMW z9?e}kO$t+9%BBB;x)|EK0R$~Zdi8FGmti*mSS&(FI~?4=@D;!t8}Pg6JJ_QbZ#u-^ z)Q{k+ngWN+zUZtzvP#VQ3y3ax8J2b#I9x)`3*Ybgj^gdL#*B~NOD)yc>x50ltV;@~ z9P_HhWCWywq^K7N^+ zE=*&|mTa4r?9VVFms!R7{Dts~H*qCw?jkZpg`Yj8^PTQeTFnN#e-hxk8?CYOVB4(j zYqiNt`dkLlU;(* z-e*I6IzxPVff?Lupa(nj>Sz3mMk#*zH5#7FQn*H0>N&3-A3w!ELz?fKFT9Y>zU^VB zt<=ZTHREq3MPlsbPRG2bb&);U=>Ij*5$#_ z-JP$(B=1;N%}C6yq}&=uRoo3RGObid{iMX%;M4l)fuM|>@{JT#0rE^e&F_fT#^=GC&=F~8sZ?`Pv5 zv(#3{N*fzt2AipR8=EEun~#L!{Pv1AzDd+hcwJVFTu)_&?7DcbdWIBy>N5?q;iErV zDhXSvhCNbu(yU~9>WaGJ(BBP*&p``}4I+kBlLaAVJbE=50tPi@0{XMEX?o)nRZA|} zAO>U|sPWo?64hWd|69pK*=D|Ix2g+Ne2qoVgpwUV%B2YZKR zKC5+emj{>z=ms8FGBRL=T;$>{oy2S(lBy29j5C{4XC`8V856uI?qL7Llz}s10h7#P z#9z1jl4tL|OU0c&o}CbL?7URGxd>D3*P~)=89f_6R(^EewEenydq!T!?`XBE++8u9 z`YxGA0gin(z5qZxM7z2#6gp%uJAiG-D16l(=#eJnPbTFlI#K`B=m)qf=8&EF_wVn% zH3Jdh2>~$mJQaQfX<*A1+a?7{&!-?BnS>DrX{N9B&uvH2LU-}u{( zWO|uw-9Az+`JR9xX0}A8ZYe<^dah>5p?xYJ$>oki%tL>QQ{KjJHbc6$1dxesWVu(~ z)iR5fGK+<>Eo+Ei!NCEs5+RZ0*w2yq%`G06kfaQ{j7en4W$YIwBpR%PY#H}|x#o^j zr)HrR%tNfbm34V>!%pMJL7Q}u|7x}A^5y+?a!KwUQ&!$!!r zC^@E;5R#_g0MRo5ocW`c3T^d^%C4DaK9z#~R|sCTbtvPrk0ce9>dEcKT6 zQ8trZ*TBy>C&Osou6L1)dzq0ueTiRO*(GPd+Qq@e_YvPU)URm#$66AVOoOw&DjvjX zSvN*#-{=K0aWi1Vhaw?4h3e$1Bd~|JhGpVbfmn$#nbBC&xX7?Pi818`v1iUUHvXY6 zfwra#iU6P%0D&IS5L|l)h~wmHr1Qb?G~kb`@1j=T{0PG>G91R;5Md{|+!ErxlLpiY zqwfp$+x9O+IsOzG5RW1tTl?|!GENjq@3BM_lN-|j=4bDF=O||su|2_b+`-y&4NF1C zZQ(w*ZDIjq`uGB{77DdbFQz&XGR}9O*y0!juT0DCo5}9oEpYqnz;{73eRgSN;_(!} zo7j2tC0!{B}bVu!8^67Tgunh4zayGeg-=y@qnE8M<}zzWyI=q?aW- z$fPE`pG!?NJ7C_NPYb*(I-Dog2L4XN^=qdZIWdvf-}NY*+d2M&a4E%kL_Bg9UhwS# z>3FavfI&`cMiAco?*Lih8Khvu6%KHOq)nb^r4H1H?3LsOIn#b~rfoN&mDbgJ@rxf5 zRjW7&c_+a+*+~J}j`K(cO1>j~U3d$OgIDg^4IlHwL0SH=y)yegN%AL-{(#DFZR0rKuMcs+L#fxc59nBwwv376(Gyi$2{)i36)duUG=(PLkywphDis)!w?-Gr?(rYtM)$3E(mE6s!0{-3NgKx@*S&u zdDL#oxO{`p$TGXO&RyPLn#&+CtGfP0;2U@1+}1PqUuN2U9QpX#MX0X3$I@g@hkhlX zxOaF^Yx5;>+D<^+ ztLcD@gnul??G0B1tJ|4YU+M=`)J~~uWNl6tu8T`P72tHs&5{^>!Srfbkn?>Ug*9oH z*}xkrO%cQ5*Vc=(bq&>oOPvy4?JP27g??jUnqqk~aUEnXq~qV;H$T1|*Bc`d*A^oY zpYvxY4#FW22R+Ohs4bApm<6NPR{YQ;RH#*At(PDpMZ<|5YeB9 zTSTkyH#|lJ=)dfqdcwPZnwq{0{w~vZvuYrx{G3R1RqN0EzCI`dJTgmo@Duj~-2l`3 z9z1%wM#=@#dUfk59GX9|I&tr5&lcloE|t+c-_;TD#|{>VQ=PAS?mu_2?&x`jQC9dj zv6US0yFAkq`o%s5LEm!uy4@EeWpt0mGUhyx+vNlSx*okiqqz2Kbjf2@{hX@4@eE7=bPyl9kDj<>>-)Zl1qrKFzYt?~uHSU#=pvNO?vEw|B94TK=Ik-RZoAz~>A!KUM$zqg>sL z_#hJp3e{1sGwK&JWaLvRa@(VGza`{JCt8f9Pdil0=+6p4?M4Qe7qPQ?|1E#cOz0WN z1kV(ML$9peX+oMM*m4K^onxyA0ox1gTZ&Dd1pqIWx=OI7sj}u((RB4C=(-mzS$iqj z(&9QVdRbpA>bC3Zk1`sxo9b8T(6o!7RZ`r~^DJ?UvI6$V^Oa*<_y25}p(;4*8JyF1_#jeO~80*J}#3Tmvi(#Js@U z57GZiR||jrCg++^l}(dH{nKBtJ0-mAAOZQ;0%ityx&Hyi-d^AE?L}Z z+qb!$Q@FQN?>nbvW`0r9EEmbFO;blF&YkC+(Zv)xA3VUIaxm|%bU;Jm{X(+BBe^@Y zcoi_-PUzeg9_;u)(}7e*a@9(CRZs$}%{I{>C3)^!vKGihV4#2&FyfL>jl7YmcLgRO z-e}^)aN?(GpzO4SEwnUmXZR541zwGVqvth3?hF>Qk{}BaAPJIJn>}O{+PTxB4Q1RN zlT>cQ!?DK8XyegP-P-m0p<wjS(@C^}q1v%!8aC~&)B z?nQK10BT2|DrmqNt${WwNG>4d83|f^Uq@P+YiDaW7;dM0OtUM1&PS2qHeLIR(9a}f zR@-t?%c@;bU)uB4utoFFg*T^??R-W=iM43EkELfdI$vI~jJ*_oyTH%bU?yZI%fYZC zE-M$!OvptyzNC3Al{z!e@h;~g`wcN2`>zC3c$A5H!k6r`9-s9hm^#D6V1*YTrW;qQ zXB2glG@QXG?=8V4GH-9L8|+LbsuM8+%mg}x%$B;7H-ZR$h~h_A@Ti@o1^wzZ5QgaU zxjQeU+3K_d80+t_o|jE?Cv^PjFeSUZ3=g#ORH<9{!Z zq2>60n_Iqup#@-$@BdyzTssbZ`P%Yc=)HTP!J)51NJ%gc zc7-l&Sw6FJ^^ZMdyf1xSvpcCem#03JZGd2P&?L+)%QYab&N;!Yg zK)_Ezx@tt=mB9tR2)Pj|{xfl87z#R(TQn_LA+uKdRvJA*^TyoRs>nPmn%s6VQZJQ3 zcO9z{EAPgO^zrrEX5x|TuNjr5KRXR7E}U^QYSK3K|IX{bJk;RHQe3?!96S|z1NY^5 z;FKJ1Lb-c)lC}?r3GlmnbQY7VHut}-DOP~sqVXhs?y$l#>w0H;S--uw6Z-mx|&e(r1h5uGiMw3>HJ27iRwLBxIkUHP%V`~HXb z52BoP##dQ6w{1ALJ;qmACQP%wnA7ZGvugwlOe*9hphZXvv_-nIKdtHWRM{+ODpSeUpQvoY&WE&w zqZC%8nJtc2UASoU*fIrjP&}w^=g|;c!E;xGLQI+DS31{S{^x<%=L*|y0_{RUo1~qG z=e^2anxAWWMBmgv=N4d$vdP!U8RcYUz@DWjNR`wwj(1-eVsiAQ>KPox_lXcCCttUx zd%OLaCq@^K1z`{D|5>WSm%ZE-Jw9j0mj)Vu|xW$>YxBN|@K#y9HE z8$>_Nd*=A7axlp9Z1+VDXG^N~i_}4;t&Czl8nYXmVEup^bcteGYTu=Thj@m0w#2r zIukN;kpVJuOFXr~deZ$vBaQlE2Q8tc*zj&Wg2_h~7aEs{SNP1Bt`~ngBDFuy_E4SC z)qs<)SSG97b$GPK+tjC+?9WzsA=~pArIL3Xb_*FhB_@&&#S3jU80yMnY+Xp!yo+{M zrKV*?CJpoqYj|oGvdm;EZ&fXE>gKakd=ju?#_@=ssqw(7eP(NCNZUzd0-mw2570X`CHLCqD+}~wcZWn_v3`jv32$U-kb=c3p z_q0|IFT#YK6VP})h7%mXS26Vms zh`tgS8D#Q+mII`bpgEgm5pwYqGPb$jcyeFj@dv0hSEg%U2te=Eo^IfdRd3*t)N)VD z^p2e)8E3fa9d_S;ORb*Gso;Xq)&;A#W74u?(sFIDR54hA28mVO<)~7?S);V!z0_SU zLb0ZcHSLQ2k*`VEq9+U@8g(yUzJj;cJyLcIh??D^eHnn!9Hw0hm;4WA{R*t0{aF8Y z+;3#ZNb(0^X`l8F$~Bk|8d+Yqj0{e;z+V~E`|iT*?wAbRZ@6fnG}iMsfKsLW!nXH)=cEbKY+)i*~U7NdeRhpi+dyWf{QnM zf$V)Utuf7{hkKHPEX_R4WL;JDna@0GdNn63kvHw|MBW5s2Bzn<2fm;N_`CaN$CJ0o2Kj9w`znNH|55-FUX zcbO}pVi7v!U<>oJD0M}5)QF$gMKTbT--7&B>p=s61v+c55q?a$PFzboOYk4Tv5G+D z;bjjsJ=@@c^XYPLbNxH?+-Rld+wzHG=f)!k1;TfU$M2Vm4io50Hs|a8U)!N_`BGk_ zGH->tQEV^mr#w#i*oSA&?4`6_9I}nSrRSG(Lu7~u!!vHkDLVXwX6n6smFFhYp z1{~dACYXjo&MA}rd1|u4bunCP>QxIt$nl8Fc#y0f)UodnR zmkPh{Gh8kV4GvsGRAnOcpj4{;o4oqxlH2OhZIFX#SzDwB7QoIT;V`bxCqsi!sKLVT zLI(P&VgX!Y2ZB~WRiV|W)Kj1RrVk~?1HKUOB*o=Ui%SYf&~9sWhQs`Fp>ghS!~?h9 zLpB$9!a^DM`DBb4Zm&w?LYd2j0z~Rjoy4F$-l;lnO?cjF$Ua(UGL|2Xec$ILF ziK^*5dEj6DU8H~dQJ`@xU>j?ubuXc<`2Iu6 zrs-P!l1-EEL$R*DjUikINY1>+EIzFN{{0O?&JAz+L9{VYEw?Qy8g?@LZU$EDTE zFKV_cW}(csr+DY&CIRW$VU=jFDsb)X2SrD)?8}nXqX^KdSU^Ld21S=uvzS#A)T=^s z_Q@wH+I=GB^CFz?n3VE09?sKRvU*+RR_%M~iC%erYc>8=gMeb}oXK>c-P#P0*&Rh6 zfXse;@;vZ^(sK~?xp)b=zs|-Pw6>ZCnUr2l5DjK_HwAE-)+&jX&e?!{&U^qSqr@6$PbnOmsN`}+b>LJ^@+0oS_Ur$Sk)Z@M>u=bcufWm*wClf6 z#7y_+-%o=2geFt9(Ymq)vz5*MwvM1T&AUYwhB_mbBFdFjs!?pJaU5y7U0|y_Rv{&9 zC8Cbu!i%?-n=S1QzM2)Pifu}DRxzUv-sy?!VGRNvD}g<_G=HH%uJkgjk`r% zt$*Ok{?XVA#f+K~$Fv~BrgAT{IjMU0+?Ucif!Y8#nw1$fK^fIA zx#bor#!7Cf1)B`acBiT>Fr(E8$!$29(5*Vwp2JI~%KR!flW!XA)mAT_Gef`Gneq$S zn7;2-c6f~{texj&>7I0y1_&F0%Wwm!k=E)CB5Epjlk|6E9%0$Vnxyg9VA^xC_lngI zrjswYL@;Cq*{FA(8aVVRXAddoB=yu!3&G?GbjlzXPXjv&ER~1k2z2@L&jXm@-4OWS zBHev?IuKn4&ql|>XDkAHGLIip2e7IO-@9KMmc9|i zIQ}ic{Bb&p*$TOM0eAcxlqz3OVFbB~$8ZgHJO+y7@zT6nMGlwuO_{9=D@S9wN<~r5 z@|@O;+y*)mX6T{^7(M|PdC3m+3#p0}7&$ScTh{Al3r4C18dV$U4{BV<#hPcN zLuRCJ_*$T*Bs)l$cS<~Vi%`!czXz_UbS?b%LvCaFaN1#2p`)fiM}>bnh6kM|P9#q^ zaS>dumo|0dyolo7s9JJ0n-pXe5VzlO5y`sY6UolR=p-_FJ(Y%rSNnRVw6a&GRBEba z+Zkyzv+fM9^8Spho7;ubV+nyOY|%hvi8c1Q)Goh)jsM0s+4^9Ln|x%oBA7s1!T z)AHxu^%sAjA62{e=jFfGr$qeg@4=wi_?)6X zC}B}wi_^uIE3?U4Y&1Fh!lI5r&S8(S87n6O%G~p0@g$T?6w6VhHWC0Pcs5cAj{5N` zi`}8fLl-+&c}6-K)hP%p$()<6^R)4eS}UlN8#>>ReB?LPWv*{@qk7G!hK1aR&u4T| zntmf}v?xNx+~8L-pbvgkPLHZ7;}X!2X6c49n1G6>VZ1B0?XbDsq!kiFFADXMIb>p7EF@mOk8D2)IVPv zalbL_zHq2o$hZmJwtRULNJNoqqHwPJW}$WWO+;*|#XM52R^ z`yUxDz;N;nRHTMCZ%#IVq_|-~ZfyS(W#_`dujd^bNQLN=D{rEA2e>9#W`-ZMU4Z@` zyq2Cmcn8etJK4$ZfK92ntqPBX!29AyN@ahqw$p8Uacw6}Sm;hzpxc9XSOs=NJPKBu zeKc2}1j+)Rw0iLF#1c6&-%_AKNCKZqnY(n1wj^LhW-+BE$dtu$u5?c_2EH8U9+Kpq zo8m5teT;6uYcR2lP|l4tF6g=fV^cxvrb5^N!o0mXU~anTRNwyUw(M~_U%(BE@FFv8 zT^w^kkx@Zd9Es1kWM(hXt@Tv(^et)*A3qO$A4z$%hnSMXNMsF-x3e}@9kxPC1Ya1X zU}6ltx^nt9yUzI4tjbH`pa2cQ#Xomd&0Wo?>P=jDE-QF65qN@rP=vke6rq^hz412q zq0D?p4Gmx2a9E);i&ZbXOXdV2Q4W*#=mK72|HvRq@5mrs!Tg(4hv`VWv>-=r6HWdx zVaHf=s$y0X()IvSoJS&-cNp#BJ-i#(LC1VBLh5U*Y42~bTjZrUbLBx%;8mx(-ytNg zOpcYR{t}D%3B;HaU<++_H)C?)_NJ}3nn@ogUa-roFVFr;;4P`Kor<7PA`h>LgARH@ z)y8`wvf93UPhWIrGbzjz-`N)5S>Y6r0ON``aifez#v-rLqNcH#>W|fDK#2WA4Aj>_ zd%*^C>C4l8;T}>AmX`i~KMrpxy|13;m?)e2 zW?Xy8{-{qi{1wO5o0-=iCVrgxO#1ygt-Z~UTTQwHGuX@=asI zYL`|Ay^XO|O)>2h=<*?JvQ-Puy$|prB4w=IKb;Z+LBt44dya&{%%l&UdochIF1$P* zWZzQ2y?PO>oAB;#7Nsp2Rk~+^oVT!oyUQVFH8_*kM9NoTlnxhmUq;+370c;sf}Q?a z%>As!-N15S3pGfRR#8b<(IgAqay4h^M5ez8BI#_Q!K(#2r{X#D^5$R{8^O8Jo0>mi zd(hR;Hd+z)v5zP#{77 z_xd}qxd2+3dMdhbJBc{$rg{OQ30n@-uxo%nC9uf2pLO@=D57@<(HLBP#UQ#*2fg># zM}l>{wU_EHS^XVnP#$Mc%g+=C92SQKN89QtiJ>Po?fok4U<;(II}gx^;{;^j4E!zS zYobZuPe~}-3jymIC4#nqSq1KBBL_E}p2LPW3A%}t@;USQ+v@9l)>nar#_fSLJQvg| zU4`#t;ehSf?L#vIIQTC=B6Gp)l#K`(y}r&rAHRnNZd_5E@ZQ1GN<(ocnmS6P-KMJs zaps9m7ClVlQi;9P|7naz(m9F_o5NZeM;*eIpOQ)FEnv*5YLlqzkVD!CZdI^12vagK zfLdH+$e%QTeFDC%C#8+1Qgk$i!Kq^7xVuu_s7mcTj>jGW+}e5U1Za(wbof(*hOZ@lK`pXx_tN|K zZO08c-f)RpC#uFH^UK{-jO{&}cltZ$i1|}K7eT6sdFmq$oJ)@~8Ai~EW|3L>3@@fz z*h5~K;9RYTttTr(ciBVRfJicD{Y)0g@ktbKo2KhvzEdVjl9`s9bsWngoa7(Lpl+M^ zg=SmLDkbwG_;AkQXslRTgNUIlqVI<@$v8LFAl+JaQz3VH(}!~qK6>V0V@6V_t40^zrT+@KJ9(_=*ivRzwt~W z?e|3cM1qJ|M-8I4Mh)>um7IUDTw-`aAc!A?*Z!l|h(NV1xl~e^nF%l1ilveG_=boB z-qhRgQ63=B)KL(=!wBDuck6vjSwl5t^w(-KO<(>2Wm_dZH*Ys51fIbs;O;(~O74dN zw{s|I0EZmsH?2%YPS$1(JKugbF?^5Dfu*&3U9*%Q$?XZ%z{o>*ol%*5mi!GqJ|5Ul z%up71CABViV#?x?L{3|02IhYZ;o-lCYa#dm--`iZh^Ugt9en1`UWldT6Zdt7CuGg} z{P_Ik#Dt8w$|Mh$l_YKr&Jt;6A06Hdercd8pn0xgZ`t%&kRag*NRAI_JuzBjjtz#M?wk(gAd7)?$l?ZCDxb^LcKEQRIQ0-oFgF2@4!Cqua~MD6}3zwrcd!+}KwF~RA;Cs=r1Bi@vMe@tk(^%4KDYNZHe2H*_Jl@!QO7rv>Z zf(q2s$}V}A3sh=1SoDDMfEMU~A8anffrke*k}Jt~p7o0RtH5fv?t3mCvq+nEnn
LcjZhC5!aw>pA&jzt5&+<2EE#3nSmwQJg+6Hv=Db~Izi2Vc({Fhz3DQuwV z4!j&Y=+0>gQGTJ$=(#P;!wc3661ZP5zrpcGN>(^q>7LEG91Q8iZjkr4iE&S!cD633 z_iIJL@}_C;8t7{RjO}%>nXALN&7#!jtGMxBSGW{X62Gt{9G8s|yuv%)$4UZn`%xm*g|xOgZRXwj_luloe_3KFD{9BYzff}5j()aNyVVo_ z*-kb3SfHFaVte*jdXu&yp5w8}kX-U6+cW?3Zi*l}{3d14fmo$A7-EgoOa zq~Vv!QLAZ;KF#IGH^q-R7YR;T=2qv&SM)1qmx4u^n_p1m9gql1y***Y4?LG}eF>3% z{(*6o{`Ei5gThd94bF_?;8Rb^y-@ht_j@atW(}vDR0obh-;Cl{?EQx4!5Fgjd+Xso zekY|8&*Qo`U(PwiJ25AgcO|zyI{EbS!yUiBKX%rGf)4xSLWAy>OOJi!$C$(Juij0Q zyoQo*vjww7bg<*%`3*7$CB-PJRY4LmwTqhq8agfsU#^3Pyza{`e zN^Q=SzMGiF(1HGW){O1}=k^I-Ybi|D6&v3bpG!>2Pd2j}KkQmyms?feW!b{fG3S*O4;;5`7%lZhVI-@$Vi8w16l1i>O69 zG_?+lJkF>fR1)H9eTUS8uQ|2<6b%d`!%M@*b2u8fpu`Eoe>o6z^BrqS9S1wlTzS)S zB+$##5_W5Wsjme) zLSHgq%i_=H*1dJ#QpbX+8y-w~IeKEoR_EtTkz z_>eY$XOwe1@4_5o`8i>7;Y$u#kA)%fp)OqYO_E(!zZ^tA#5!2puYJqeBpDQlALu%( zteQjH#@%v;eh2fyl94f{;LCr0qkYPEZ;fmQ4vh_txDT4rm#^S&8uh-nXM9X~GhaZ= z;8&!6=SzN%?m^UA{F?7=B3sU{j6CT^=qXwT3QKVkjrT$??J@bJL_=HT4t9yGoR>B2 z6Z@Hz5nqa4CK0#Bcoj5H%IdahdsD*rb5C zx!wB{3^>^FX$S*C$KL~A+sn`w$DuD?hC*z|3z%=B#f?U6=|N7p*eY#hZzU1QPETkB0@y z`~o4ps>IM((XEl$`S&p$k40~388yl4yz-MbBnZuZQY6-0*6nj8o~&QPP{y>^)mB(I z`Zm8c%8i`cR^0>9W

Wi^*aY(r&!6@etDOtQVehLo&s-efSK_i@Sk=(a4vtQ=olU3X#B z7EN!PKEIN+$|`=vz{o(`FC{ZTB+ELRg|A%#q%IwLQu*tU(0!*tV5h_y7$8BN$+OEk z&i-T<6Wj}UQ#bds3bG<-zxdDwO1q^(xCtC&XmEgiT8xlAz66BP17oDP{rnpxYwwJm zue+GZ0%>LEkuWlJCWvDUtcyBM4f{2s)`6m{p(5R>Z+R265z|Tm5A{aP*=CRNq;K1< zHSYNfylDk)S`rV%J0DliFK|}yVwu}lv$qYIMWyqpo$AhJ`DZ$LME<<(H74}_)@H=z z3zw^&1+RU6MDB0}nv(WEk(;pxBnK?^{4GZLm#XCom|y6h&7>t!+eI_eV%uFc!)mne zn?4JDbw|UbZuS>xDNXKZtzp>kTT@JtPT;UlA6218>vK`D z_HI2#vE)rAwV}%ivDeP2ip9GU@_c*j{3M@($r}j|D-zC&pXdZie}1z7EGi*A_KzGc z-)MzZ=hwdvPeBk0($K$<9o6s@bQK~92>kE+!*7(T;6pN{%8YM_ zZc&jeqf>+=`3sU+*V%CDV}rQ63TdnICn=!&a)-WS)fz0Krz`I12Qa3r0hkDjVBiNi z17jmZ-~GjT7iVMz#&1Q)0)q22C{Ei3<{3AG>=O1lfh3dZ4#de}Bh?{|`%+>Ml&9X9 zmzkaMg+601EgEEA&SunYlzB#sdwBxZ06|hU3-iH(fUMG3G{oU|^$dSei!$ z8o0~SYXRL!hh@W(XEPG+0jeE14FD%?1-~pLFkMzfgV#y1+u$yR1UUpkMB8U=8?mLWQcyt-Z|NN*xYXHqyF`@jvF#noNF zh7Kuxbrc*yqLL9IFy8;k+azL1m7BQwg4Iyh?oTP?2Q zvZm)Chaa6+=8J4_qmb&&GiJTux{N>6&m5)^b|XA)CukvOByPa4nw$3$FGDtYD*0^A zmVO2~gV0K@wdw>lMmPoi)|uF=0m;RBjJh@Q#w^S;L$=PU(x&PduV=j;&1SK8j_&V!(18yed4<$|Ah=iVevgg&iKb z&+?K?S(W5Vf$BXxrAkMeQ~pL=2YfAOPk1WllN}{Fq>}Ecod~T&#-{dD|Hsnk4DPk#UX{SiMKuN%)I@;c#UJXw^#)r1v^VC#|t zD+9@tiADSeytPhgEBvBb*IFiXiU)R|2H)JcW&h)x)<_G%)~M(LASA$&MB+@^lqagr z@%xyLo>zKvj`4!QabRvppm=c#J8#7`=DRvPGAW3YQ=A6?&PFON-ZL z@WnqobRl-+d@WP0StaR?&~;KHa{8215^|Lr?w*}zXa=%c87+vaymN?h9DFTU8}RoU zr7iGRf$3>(bZtC4a-)7ggg$kNkZ@?s0|&c%Alc0Rrf zLC@dS?G{mfZO1&Bln$Da_6V2|1mY0D4PbQvhcJtQ%&zAw3Kft4I?GPcazjjzwB_V4 z5zf6nT5ai=2e3-^9s#!sjmG~z7{Bsf)o*u-1zpr_u2q4g;lzNPgBFe3!Y;``=w8z9 z1c>1@n}P&{XezV9f1XVV*6{Ol)^ThnB^^wr(XH{;@faB7*T}AO>#0_t{YkKhzF~^F+Zr@0b*k6S1MOfcAwO8JoHNZG!sSCdT zH;`{AM%l&!X9yztfwQHZ97+w8o5zHWX3(9uqRY);6Z9Y9mR=Q*|oc_jEJ zZwf52A$8&O$RH)b4HM?JPzIG&jwU9Km?X)Erah3RXarqSlsZR}n5s)*U{$i?3X}{S zd~$81c({l2{x32TWVsp~-Vp_>!TBk8(b=G(Bo;WzfY7}>H33$wN<`%O* zGNiiL#ZAwWxfU#veAvA*H$pn>d@`H0Je%psM<=Mqw&6XFD|Eby9p&;6RB6m(T9(Uz z@GRpvd3>JexJ|4y@t{wjS4`Y=b!_O{1LIQ{ObGr@o#fqA2ceBC`H2rBPqP=QMH6Q`VHjJ zs?g_3w{kOh5h%I{Q8MT@iZoyyLfYx0LGnf>rjOTrw72wf4x-3j>epSW%_&DEEmGQr z$L@y@+c+hDHG3<$h|_hQ$ZrvDzt8K4iym`SaT--g-{P21aJCjzO~Dium1Jj|&Ij0p zEYi?PR)$pVaB^lds%oBDBJOH$A|Iv6KT|Evlty9QM3;-}^lY(^vTS4(?uv;EX^gD5 zOx%BGrV%lwHECxcXDXOEl_n$QUr%2j&MM_|-o_=Pr6^7UJ&u~e#m|Ik&u`R*)0fR7 zx^ouF7beE4l)_6w^igGTMF#8DAJw z$3xV{yY(GIMnI;DNJD~bg{>W@SdgFzsd9ICdUv3FSSTPg^?^(nD7k>KF|R0sYz}i` zy6yjFOtHH2u#CoNH6fQA^dvy)yz<>I8L36-RbwGt^G@@gq$6G5>l>Uenn!@kUFwZ3M7|{ z8>O9u-vbPmr9-x&Xm=){IT#`iR(J0Sf^Kyl-uIB6B3z1V@0(SpCpZl?DiPJLu6m`y zrjE$G2sP@WYB_yIV?q`WzwS+OL{5s74(p=`Ibv`RM6NExr(wKjOv7{`?gWf*@_D6>n@4wD0|_^9)us~6QOhCdb=N|62?#Jn zCwZ&LL5c^Ls5(VM3I!WrBqRYIH>8P%Ie&1F?`a&nd{b||JU^GUQk82-pb-UXF%XCl zsIQU-h&s}*G&@dY?W#=i9K0_ixnZ4kqO*G0k@l5XNGO_(^eF#PpYtcx+OQF@ny?`` z={0^V3$@kz9)mo>-Y-k+XcfLzgSi)z`eb5PZzWn3_032BP-Wu#tY7IFn_f@Ya0 zr%i-ZNIAuSdEKKs@}+*4yn!T^?}Md zv7dhQdLlq3o0}r4K5e zxW#^+1c*B|KmKEW@A_*vjX)*x8d9Vn_7on3-UFND%YP8#0ojH3LZfL2&o~5GHJ)$5 zD*s3D1Fy$S%%Tih0m}VR&vh%72Ez8XtOg4S3*w=HRc|3em&j=NqP~TM)!C((E1P$0 zK8XvMl}nLaCh&M@YqMZMD({=$^C7ahy2eeO!QrD2a~^KeAr6a~+KJ0BOzmgWzMjF! zrI%Hymnvh_q%g6>Pib0j=&{5{wohMc0)g=NOxm>jm(rtUmy*?P5hq7Jv5^oraAeKL zrx7Qu7Q#iL$0@ehO>Jprvs!7%Mg=R)SQ|;k;#%asEU_0FIUL+1w?AVpWQQF&N4TZS z;yfQ8rMsS{aV-|z*0GarR5By&qem-Iv>!Mzxqw7%8r#gGIuaIP9Sj4LI1r`pqz%l< zt4;kXG$_ilzueXJOUeuo21AFlE&DbZyD`bQEXlZ;%6Ox0YVthN>2M&-O*jN3@7xA8 zc3Zimh5KPeq2N2yk{OF)STgyWO5G-&^M94EsF#~TBpIo5vY@6^8Sp7?^GU_RvhbAC_7RdTUIJNQW{(NHTL6gA~PXUbex4at!c(rFL7J*j_aPu&fw$G zE^%Q=GpGTeE(^@p;zDq@YHs&g3m?RIz>W|(W-ArmgJAh%}+K+b8`BI1;_q; zJ@V-Fl5Tg7Nk2mW)R{LR;o9J1_%$H+tO3@b4=sQDU>%Z!ap}XqUvN(y^B%u#%bE9d zI#Q$#;8h#9CQFo59y?J60m)dmQrU@8+lk`X%J+*~8!;IHblbd%vSj05vIBe#+C%i) zV^Ae-1rjo#LqE*}3oEhyua?;s%minIB*W(xv}C8*a28lf$5Es~EC(YT=+DabY@m}d z{#wPT?UT`dF2g-0qZXc;67VOM@oDM+QC&=#`fq+0iV7E5-CPe>++;Vz$bI-94*o$% zHzudO3p!B?_mlJj*^x7nZ$WrbT@v)RFKmOg%QUTKhh-Wkq;HZeVJa>P8|Rj9QgN6v zxjBI;rO1w9ev$VKg*3jobT$DtqWqI)-j^Syde}(qmUMAZ^`5aT@r>xvm5h~j8X>kM z>Kt(n@oKJJfo+!YEo%KVaXO}TYL%CB8tXx3;h}M%HMcy=Mn^&p%gpQD%{&Wf3+rk4 zg7c$iunDOz^HFyO7bm&M+V~T>@)xMmQW81yq~ETDa1^Csn*UUUk% zJ)Nb^oAm1~WM~0NuDmHK^Z0z?BxZ36oUPqt!#3E}wjg*O1EI9plMIVfTa>0$c(HFu$EgC2&w57D|iMk(dB5Q&=V*rQ3o0(c2Tvk#p@ zD~FevT3)0wc@yJAsWGVLbEX1fuz!V``Pyc|uj?Q*Fb{qW9M3-pMTG_GwIw_Nd=?lV zSgc-u|M!+Gj*JkMXBHPHXcng}@+mz+uC=l~Smi=}POM{}6`lEfX=(jZtZttbwGf{b zwcvXzL(9gqU0Drh-+dp-N-?6p?)oF>1Mf4gh=e9_Kh*#TNlhzLx@&CURb)}{j{e;a ztDXe4z4TkUx3wco_2Q~Z;u;2}W~QE+^*km@rh-{Cg(e!Na#@_oCTga-+PWUvhfAVK zqF4n+hcGJ>i@8KCrd^ebF5($}4{hj|Y)ZEWv5_Hdg@a`uOxWc{J~RLMEb^0$F8eTf zdS+z_w6+oF)=K<4nN%J8oa; zC;*|>?)2WPw7nOC#s;{(<5JtP`$DrM5pAsB={QYyS2LH21OD6@u2LlGDP=(_PXv#-71) z#RfIuZ@NNGw-5I5MVz--SL<9PeryCI+7=>O7UEp>3-)t(v*c&e1ntVx!9ltH(`l#5 z@(fA63#J_)*&v{aKT)=UD+*?vzb#NORN+3%$&gJ3BM-Qv{#%FafCb6&Dq8!CJy+Z< zib4fQ5~Y>Le*C^<1-D-biwb4C3Prco;LjJ|RX9CXgq+TH>0l%ZaKSKR+L7L@F>P-b zu5xJ4!iwfPKvM>hCy;`2l9qZ?AD%kUCopP!$tw7*18%ah$dq82O z6gR~^XIA!Al5xOqa@7%wvI$gqqe=8+u7?YHK^pV!R3wY^OlH1wCTYSi5b*caj6@Os z`>{fl&ob^p*!Tsb*}nSSUN=#LnOklyVuY1#D6Q0|%rrFLcwC7`@fxUoxndX126;rN zg_lIwBFTsr9Y5FIYVXmvyOw&Q`ps=FuTnANDf<`LbLDg1HogX=cZgSw8fK!@t!cTh zWJ)DV&@F4>@=(GZ_QUvt3&b1(Ix(fS?^DVe8t5Y9jeZ4^EOr-nQ7XKRA7CzMmbKOm znbCCF4L}j-y6>u`K03Qhv(1;0mmi5z&*+&8klPdwklPC0iJNcMviF0qj#ViE$@h}& z`2_w^{$anqe2bl+$=Xs_7PV-D za>JAd1e*9>gHjJ|>9hNaCgd=0+SlS2zvA$=gn0cXM=ekjg0?bNNe7nN86%>qok;;4 zqxOl!G&vrlp7gcEab$}m`wRla$GnuW57BIdx2rD`RE!!#mIh7CTEez6=hLxr;zMc3>M&6xFXo4G&c;b<|R^-pg9|$RnMk2Yd_?ugdF)rt& z@lNJLN^1D6^%v|;?20k7)7(`*9Wg!AF`PxC7&q*WLKP+;2CxhD4Xk<}k8=SJ=(aiy zi)I3gCuXwO}VDg?NxzF6Q%`| zY2o>_Ku_uEuXna&%8Pa({m=yhH7E*JA%A(2XAbnQT-*lec3bClejMzvti^9ED|?x< z8_*QhcDD145$Uy|r?+6IdbX91Y+JaXH??mtl`7sEj)J4=sUS%Qe~N&$o&cl?K=CYC zHLhYwF^0%yfyI4R-^J6CRKECetrzV*iR%zTjbMaF@}G>Hh?WJDe~w78z5AeMpFA3J zhs+0cn;{XvY`@Enk+{BAkdpjv&LmQe3LsMT9|R)8`>EHe<=-!WTzsLifr136@81R_ z7BP)iYFa{1&^4?W`M(FG8@WHoD4}~vwRq-WG>a^C3=P3+Y+H@NPLD(3mj3zW{m;i# z2MOwW2<(fMGf6j|v^M1L*7wenMJ3T`w;P=1t%m5e2Mt40A~5a!`bv340&NkZ3taTl z#CRb3SNLt1FS#Z~b>g_OZqVSXKo9`IdOlM+qoQ8J|tg6FgUL^%MWo6-zddASZdJ9#jvCWn0q7TuT;5dn&N`yiR%7plxV_X)En z-w^HhTS+(OTTzbEFcH3;vN}J-XG0~#)JS%@;||xQnxT~CA66ke_*1^p^sGLu=|0ub z#S*Pe3LUYjUk#XCdsTnSIWl4mhDFCWZum-HBXgKRe z|DI7`DDio-xpqrP06VbLTS$J0TXFO%9SoMaQL;<^WkIZGx|_o|B~`0iv22HOFEG94 z;v7K$_cnIIOt0Nk-ILQY6!+j%VnT7!30lHe_<=tU+gGhA)|(CMrT6y zVqzMVdz9MlSpG*gr=mc$R3FtQGLd8kfwzrs`_mfzlSN4vCCk{_sLO~;kCks2FbPYJ z@(n9xV6#!K`V-v-?ZLDMWiI4=lDh7xbEIV-)YdNnXd|uK#ZqAG>0?l1w4S?L0gRGH z-Qs?*^tX?nY{81B;%CtAL@|b-G$PRJoaT(YgCzLU*KqfT2-4=9?ovZ;0b5ISVVZMo zo$oz7o8}b^3@^p4G`G0bTrLV%EcTW5kc ztKB?vjYC?=Jv5z_bw;LbB;Eg&R=FZ|ZIUxOL6+0edHCm~DHh`0z?@K9h4HS?K#n`i ztq~YrL9~}EBJy1}2}*hyu8T#-LqvW=;&zC|B67gS6KP5o#ND zNyV}$r_{i7;lT6*vh9zxoku-{KS$2hRj=WnEZABK4=BBJQ#9l*HEVa6v|8XIY}83* zzI^#I!C+Ky_|DGwK%(aLG(pt1vMZQi`Stvwc~Og^LpF(LD>Ztuhiwzd_fjBa`4JUk z8)G^6Sd{OiiOOZ7ltnAinRT>QQHRMVwmb)s`};3!g1t(Wimj@)Kk?xol@op2O2gNl z4_SCl7Ay_L4!*7S zovv*=YEn+bPK?amWv#1S=VrE=3Hm}e93cR#Z-zIpBPpMCCz)4h-ZF}%pCeFer&d{> zr;IUfXHh1~k@K7Buw5*}3Xj+dk1DxX?q)S{HQwXL?N9P5TZp^fqXlUuA%rA{LMV$? zd8Ht=P%n$o0>o10-;tQSsgi@lSF^Xteg37Ff_A=3 zzPak=rqF@Hkd6AIuo&S4eMHCS`K58+xPpS+m(Pc`_AZO=1nn zK4exE$*B8G*-Qm9J{r0LJHiz%!WBsF*Du&erZ~I(F4{d~jwX>#$vrszAj}DO`@VMs z3_^fkIztwb7ngGio6&B9%-i^HLOp_3b*gb>OvP%tH168N;ncQN@2GcadFk9}KTDNe zrrFbR*J@)fW29z1Z%1*$>^BvkM3l?fz)47Bs$RgoU6hlxmkuT8t5X4Mr{HXpV}F{r zPg+|)Tu4rhq4&j4u8uRGF|Mm(DK;n`yK+VHYwe;ri&;4eeyf?2rv9c3lWR;(SX-H{C?~Wo7`YpAc7#z9I^+FK^4^mr;nh@ zI33_GienhLvS~{Gn`)k{PIi_f-WEl$KwdIH)cluuR)u(sg}5aZf{aW!<=8rz8&NBv zH@=k%4@o64a2w?~UL)=1!||<@&*rbB&nBpH4=Hi4%nv^{EHWCoVA^KMg1gezf9@bq zW_N;4t6WsAoSv$kp346(Kvjxmhv)f2)#}E&mD_o;kT8RZMMFrLYQMAnUzv*#bdNPI z@`46FE?2bcHJg*ZCR+%s)X6ldcBsZUI;rZZqPO&D4)mcOdYiPF(!0^Obv{dhSO+$% z{ir`mZ}>OXiD`X}tL0~djPWL5VTt8%tW{+Y*gAXbNGvHUj39+I zgI~vlm{cIq$ORqElj5y%tS@jT?pz%)8Rq@qv|{ZUy2BpQHDl$1jZ$4tS0d*bD^534 zCJw6}97RaTFh#C#C6V2o|3}kVz%{*p|DW#e(G7!v0|rtmjF24Nh_nob(t=4#OUDSw z(MpLJC@n25A$}1A0l{lxU;k&`-+zw{@4Sz@&+doM=e*DRob!6V#BZkN$37Ecr2L3k zj+aDwGjS|PaC2KHa?`v|_^gCw4_VOr!fiu6=_GLSw65oG;SY&>%II=2ainyho~=r^ z-XAGj1*aCkP&{tcu6Njf>7+9u)V*~4yi!=i4)XKn(q)zK6UDvd<7$Ol2&l?De;aS1 zI>2owYtESTJbhraC!@M2>HQjI1f~z@@vdNElkB%e`}vW_6HjHYJA7>q`cnVnv5_~R6b$p3WO#hSk5XF>rbr12(mLbxKQwRfGuNXk=%2bq zh*s41?|pws|Mc+v^=koCT#TNK|E#^@`9opwc&qQ@_k_yvI=jlu7@fY<>k%CL_VUys zhkYt}leL_Y zn1W|2N$X4suC|=G`O3P;dMxkGErx*O10p|T<@zy{LNrbB)y=V}Cf}B03WXFyO&csX zUr?^C^_P5pmvqC^mSfzZo*wg$Jlz{2jupA5iK#DXBLuF|(`^$(V(RH#Ziif~z{l;C zbtHT`QM}l1)UIBooLHFHg7>}xo~`zB)}`K8)56nwmb_jJAx1ytx#aD_eoDFvaABMQ ziL>%^HHO``{OEV-r(74|3)1HMr(-0H;F1F0L4393? ztkZ1O{GZSkAt>!zE4EukFAiOsYw&4!4{-B*Ljz1l90=-nlRp^Q5;xlVJ)GF zSYu(M?H+j4A2#q#z@NoY5PdZGOTV2jRCc6LX1N4TKaZ@2beCk8gg48k?tpJ~r$iki zg#25Y^_q7yUp|c@*O%sH^R>Qp*y*qfWuw-=gDcPJXtVNS6k|F2s6hCvg%7(Wc!jac3lxkwFjv!}y$Z zTc`IVRm`x`gU#grq7dO?bu;HJ`D-sZYb6P}z-sO=H!ade@Ub&0YsCCjjS>gUw3 z6B1!kFtZ!04=DFl$w^d|nP&vZd1!@bNc04*sxyq|c{J0rW9t)p`tC4BN%!P#DGikh zFqQC+p3S+EYT>M6=_e%a;wacc$D5!Yp4F-18p;X)}&*m?g94^7oUSN;P+K>KNIpDa&r^jLg9G* z>(@Wmzg}J6P_Wmn@=oE&SZIzIGrOlJCF1(N{}X?P7~e^*O8%2nnIFPmseib_v>~9! zY|Y|H5g+SEq11@zq@@Qy+Y-R zMyv}3O)Z^O;wT-527q1p3NjXB%@tW4sP@~5_j&2Y`<7skht?H_e%1R_f!cqP`400L zilXRY6I6p^bw0{ku=}kiw^Acvyo@9iQFB0b?cKYWL(v$&b81?t-@#F$JJsHlyr`;k zszNI_e&*jB`MOW-bzm%2PHcs3)E?U*YY>p+3;*WmMxky%*v#fr%<%w7FkISkNrK#~ zTtrS+4ncN7mIVZQ!mE^}8*zYfj=8ZUNYHC%8Zu4JW3tVx6P+|H23cf@A&I=xS}>}X z#f~c7+`Vcra)amiNYBgROF|afW!HViMW;`;e_>bI(Fq{TERD1>bt!n0kk&P67h zP#R~0J^`a4u*N)fLy5L=VEqP0c==3QZ_+RHvRB(vufjp~NUD0$y;+ zc>)u^olbv+t^LvT&JEXZEQneM44$C#Pf(&$U~AB>e3G=!+)9t(N8i&AOekgkL}xm< zl88*a%tgR^M^tB~*&{6!mYdU-)XOepwp`TwDr)^B^xqRz2U|xsf>~F24=!ZFuIij9 zG~2$@g^A>ZX^=@Os3NlP@#JXcO?M$pq$VcBpo%Hs*U8H7l}8E2h+Q=}$;*C~Q(gxH zECZ+k`++N)S;)<A`S*oFKlCQQnMmON1&p6b=Vtjsz zPaAZI z^_D`0h<6}5JXQOBu-5=9bG|ao+))uVSCDzXG_elNY2FxuFukozqkWX8&-9=uj^}Jh zyr@PPmA0`ewG;vof63V;k*3{@Gw(Foy(GVXq0>xImgu?nfN-pPO+U1$veVMq~kT4etBAozLJ=L^s;UrXFKK*OTi(QPT^}2MI^dz zBi?+Mm< zZ6{;SShveOFdE1$e_rB>4(N|!?>B z`SWERUe5F`piu(XzW@DY1^@3)d}y6gf>i2!ys38LhQFM383Qqrv7fF=r}A24ecz8y zR&nf?W0^-aDSpzn&@hcv(g-#>QgPbv$Bwv2wy9Q@I7=J+}WifX5jT#^jRW4q4B)+%zW?-OU$x+u#T6& zT5H13n?0=4dK)VB*0r2X_Sy`7$d^<|+9n!>W@kFHHAgzv?jU`>jwLF~AeqWSC+$9e z7u8C<Xq+ z;9H0-hjav04T1Oj2~8}To|S`1KUsJLQ0QgfVm)7szk-^ms#FJvd%-mv>0%ZJotkY0 zatUMs3-fhh>ba^$oGqD#3KG7;aRx6UvqF1WL!Ee4jQWprm2$}&4QV9&IuW2-IX>e< z&>r~d6}Y znpaXu9yaz`3+IFn(LrzE2pU#p;haa3gS*+jA z7AiQDVOESA=JO^gIxjsH*m>%FG|HVF#+!YRnRD>>H^VRKtMH#%dOQlsXLb19pAz(64T=2zU*$-f;GA8&1|?>AVpg(Du=D{>G;i4M|9#a5B@f zo7d#06*eE$To(3uDC!J08$uE*Y$=6C|4m!Ns?(vwu}dEr@%tsso0ByaeI@tn!~E4^ z*UmAkTRiWec;;O^X3jGruDWTK=-Mw5P5bfV_!s6mJ3SxSLaqgwS`x*Gg$bZok+F2l zR9iG7v^x}tkh)PfZ{jH37Vm-W3U-Kb$GYPfludYAUKd#F_ifu0`oAfUX zVO?6qJ48_D-oEt@W$(+1?KVL>BbCG!8H!Qg-qOkEofMBU?u(B|7gF%G6?(D*T=+1!a#k}eA&l^qUpAVue z`sUTN>Pqta2t;Gl^TH}BZOH>Q@Xuj*-G!O3Ff^x*cSS^aoY7C@tx`4$<@cfm&>J$w zFBUc6nhc{l%s~^1s~*{p_?!xzxO^d*)JfOCAZDV&~i@^-=hC|=g>C4 z`sex)&0EW^)_Nhzp1G(c&GI%xmVC(AQ+LYzt!d`@$CY%FDLe>mFACap(lNy=E)=wO zJJz~@f~BpVO-)y$OzUGBj_X)htZHiG-%on49P9m!rI^l&Z=D}WS-4p*9qJk@cwTSS z2iHYef3M>~--(M&d{M_E)1ef^|G?HL8ZQkRkMHH|tewsA7cz zdFA=!9c!tPX2Vjnvep!ydZ;)8)iQ;T0s>)^G8VuRS))cLOZlLW`HPPXVKJkC!ncXl z^VmsrG+k~UEej+<)REfv1hlAQHCL?{7M5uKaeUfLxgHs^K8>l8sS-^zjOa_bFL3++ytv(#$iQXlta4{?3hNnHQI+WRmjJ5 zHwZWdk!NPczj8u9H-S$;{+RU{f?^NnAx$KWkG^qyCM}EPuEYxlVR3@^`}oSZev=LP z{Df|{1-7jC$Ub~ODNf7t<&Y?X`d1aps8k6p$tz9o-ytCmlwK7zM<_d|3g6IWu5(;1 z=IzJ0Lv^@6V26cl>VwC_N?&yEJq!=G(Jo(KUthaaey<)z0`GtmAVexKF9z2@vK1I8 z9lR&U>c6%g9=?U4!CPR60DX8!j(C0plG4hxu@K5X>yQ~m*I<(vKg(fctxK>Tm?}BW zRn7oNS`r00ROmwK5}8<)X}@ASLMm&;^QpIDtE^cADYZQ36C7E?;^Xx$wq5MsPQm4i zwz135Wq^B`u zp$371Gk4M;&FVsKmNT(3f;lMpYYaWYV?AW7^RSK>*xt#pDi~13Hq^>B(m&VVu`U}D zKah}@D4}JHSB+O4(1PD+CM_}{budG-Z8N0Z%YR@!Y3=V3oiA!aP#b)4vJA7Fpn1bv zCS{3yRK%g~##5cVcwE#Q8uxcNI^QV^2E4mB9WyUy+`mR#l<$s9QBR)7(l&iztklc1 zBgMIvVD$8gE&7;gR-RK{;QH22EBH-sA~i!VE3?eAC@0^uEH4{Ti%(HgDbL2JmKUpc zc6%;QZ`1Ah7Ymb!P&Sa1bD^00-D@{cBeNBORc-hJM(;u1n zQXwQ$DY|nEWA&XIQrKEVEGhTzn+5QgHZD^dv9?jAs@L`D&iiFBHM~k;maj@-E|JLQ zK$VQru@GLbtP0q#fyvZUMk9Y zRDr&YUa0PdN2nWQ7Tpz%N3H|Q%+4X{0wIt=h4lWHLBV^8R|42Ea#fl<;`0aWo?M3E zkFTKdJ^SZ~t-zj**OEHO62r=RT(1NGQ>b~%c$+Cr#Mmm1k>;?T2757|iq{}buP^ec zKE>NKy^kb%z4%kq8}_}_l{Sy(`b3!yoq5o98#Yb8UGyDee3Y)YO(@#0=Eh2}b=uO7 z7b@se)TM<;nyz5zPMGWY+b=NepNn@a@qE_NR&Hs13bUqnG;c}$5NEB`wMczAxQF#N zrc6i}4@DomrdmDTM6I!W2B$sWH?p53o*8KXV)joP*RQ(ux#>2(S6rIwgRkF5>+`9V zitcW1pH8cP1H0Auu9!&4j2_Z=SAwU*njw;9jat3A(r96d3RhQYZr{c7`56}x@|7yC zM3i3TzX=B?Drfa8U?;*C|AqF2R)CVVOXVGX@eON&+zc`#c|dR=LHt#=NB+qST(;dX z-_TLwTka31xLpOI+-jNXJkRw;5F@?mkcl!cvlv?AZoyUQaJN{uoAb)?wx1Q;x-9Ix zB|J0Rj%a7CqDuI|-k@9gOrHpcGh<?yWo&L^U>}`KIQ2J%qcCJvqp+HU*e$E3^ za{Z;$J4)WU#ybm%U%L=iRdL4!BDy(1&&Z^_7BwT2ZqJQLj>b0K`)WE!;QB0R?%W*^vV4%LoWA! zqF?F%F~C@CWX9Q@_*>tEt~gvB8YsAE%I5hEI*2OD@hcFcZYd;pDxq$!#WX=5JQWoJ3SG zn^6%%Y#SJY7%nrUGk&wlmzHHZ;%iY_4)=-*>Getunb15pX!vUT#*)}3ZHlABa=N#% z42~kOf^Nj}(Xw*nlW$LZ@4Wt*R~SN_Y~5k%+n=M7_MJ=mjJQ?yL&gUm$3LjV_{BT` zYhijA<;~}>y~DB0=gjR?dyFn=J877AJ82+na{&JU?}egNLUk0!_C4ym4mQS7ip4i9 zoZ1b+N?9Uz$0!QlL4oKy7QtV^uS>;?y-Pu=a?Pf2P*_ObcW9tCD@ZficX&+Uy&AQE z0a#&vO_1opO3~}H67!lab)8Asl=Hj?IWEV16;wUO7;}R-&S%_{81m~$3`n;T9LRk{ z$*PXP)Dp9Mj39-n>_tZF!xWFDr%R%>XGUKg;~5M^oY`}%9f>V&q^vGjbA~~q3{ZUd zAk$Ur`Ctmx&didlWfs{bhNC^>eAq6dU2A~ho&xLS&qm97j77C=7|;AiCP1oL55sz@ z$QI0-rq)Hw90Csz=bq6+(W=Dp==3q(^j8ah4O2Dd*)Vcyk}gR|L~=_jjuMAxp8X-S z?;td7$b!gbgIj>!ITGU2`iAWFCqU%}s_vhk6j)a-Pig{X7llNnKob>+#jPo-t8&{U z7omoe1)v)0z`k`)%JKFxioS2X?>X-W`rjj8eK97`7r38DM+T(0x++1=O`2ab&g<0oYnG=X5@HycsQg+|2@7o z{@%G&-=hwbisr#!m%6$N(2BQeOl~dsGtGB{70L#}nb4E!57y6v{z8q;-=&}g6r@mh zBIVB!?E)h;YG8(pjqDQwz`W@@6mL0TCP;VF033T(oD={aNCtQLe{U7sHdCu{$=uN` z;UpUF2^#0rt{UgzwQ)J7aF#%@oxREx))dxqdg=PDZNk54twI?5Y1EAO={Z6t-X+Ma zdI@ke=hH7af-jkQQX?5k3OaV#1YYqjHI-@q9Uic2$j>+U;^hC0mC&@_Bw>HrLf;8WMGI zKJScg<@!YD<-n=nX5^ZqO?QXyI|~!x}1JebNJCA?6nIRJOsg$$Jk1&X=0UyY6xI+xHs1in+R*;j`r? zW73T?3JX)r%Y%8Jhk#$!_=n;xdox@gzZ4O&B@B|Ig{c$%u~u<)SYK8}t^!PhiIdro zLw=jFi$c4K{dkg}t%5|e52e--uB2fB@!zw)b_c(wrLGax<3?a0qoq_4uU0;psb4y2D$?>uk>->{~7bvgQX`^33I4D#}lL z*BWc=WK3ndl0mCRXH5NxPtjD-rA4lJk%xD#I=WA3UD_)a)Z2W%Y&KOq$`Ei}#{N0J)blTN|F(eIxQ+G~)5FuC~)jzd7$Z}n@&+rK@B2A<9NdmtExPyhy} z#%^6-PT=0X1F2R+opx!T_HzgT>`f31K1^#?J;r9#Bc_CH$eyZoyz-3&s-$y9+6oqU zqMyZdT1m^(+-mSi!j!@bjFP%CX8OBsjkZI%t2DY#VFRae*-@7p8N5#Bjn zLB=pb_16?(_Os*6HWm*QtXBAZOR@u*)ar?vJwEvCJil^9U>S+Xa8wpp`jGMC zox+$B9H0L=RPIxGyNq7Ro{6>u@Fcd7P&!8Ew_ULBREMUip(%I=lf#TgW6V1q*?pV@ zW)?oQfd$nEC5i{C%GLa_N&LCYljhrZ-`clEt*b=HXy5H2hE_V_b=*u>X&u+_4+7&{ z@rdbZ4bQG=jc~QhVswW^mh;4H++)=Py8(|B*0;G%-Mtdgf>mZ`+sqQ#kPTx*uQO;i z#=68+pzy{C-baMfbYb5Mn(xwn$oK0Ru*ZjKNxH|iq=uJ z5HM(v&V6I^;>)A#)qTZEsC0e%KF(xHb=xocGS)J@bWN*pb{LJ~Iz|*m0^`c9hwXR` zWIU@K(N|TVfo1t2XkwjDm#;MPsXK1Q3a?|S+1PgTaZpKFzbpP+;ZCuNxpZ4cQi>0` z^d|W$P6QFfNkB5k8Qzz;RIpv}%4nXx4kY*8AM)Nm_T9a*ms@CN!E+NGL5B=U7sn?K$rj5N(+pCit1t%fw=xD{Tc~MGp-;tmA^lc~bzp;{ws#G# zQPUOIYS_fvz=A`b=PRomvzx1MiO)aq1rI8L86p#Y}Q<7DD+xJa( z#4Et~r)w9ts(3`$zqu_~uU4ZCPbADaZ-c|m$5JC5qz!Hy=J(+y#{1Dfea6(&>it-~ z{caX2RVr#{XQyJl{P6H_{~FBG5HDW7^gpNqU%U14-aBT1L?k!_9-arpOeC?@p(&7Y zX%b2?e8BLo>*{nVR^x-5;?exV;lqdI5kj7NxE3Ilcwusf^+UIM)mh$lCo%AYn8%Fg z+jr_tXTa!VL%o(Aa<<}}pDtK&RGjmV3PK(hSMl!wkufd^aSHGd*O4eLjK=@ z;k|h&)1(*xuz``1;o;qiJ;MWv84Y>CaZVz?Jd}32!2SuMNJBrIG^FzpG)XR+8<}{3j)+fd=w=;cE=U7$D z2p1XE0XIRFK+tWPYAYh%`F&ovXB(*?#8TdU24FiQI%; z>L)97janEZ`aVMvvvmskeG13hA=;mmw8?#X9&;OW51unHw?@bI*Y*t*Hgt1r57*7u z@VhI==R}ytKQj6@6uoRxXZhgm!#j_rwq*CJeB7`jtu?ZxHG&`fUR1+OP0)$rZkKKT z&Mp3@Bj~Ixfv37&ova~*CmyP222?#Z->>qSRw30a7?H$)^Tat%!b3~OpyImt#!Kk~ zAAf!*emdeMV%)8r<6a<3xuoMv?^*z%;am28J@z5VDn7^UEu|qU-<4x?p+CfnzfFb1 zLe^1SvCiwqNI?p-jH7tJSt6}ti@sBz_>;#Hr*x^z4>ow#yOa1D+x4462&AZ|nWwW! zZzQeMbN(sLQ5rWd^p|#CK=W2z;?$6>7F4d=bp7cmhc1uZTPhcRXvJFbQn2^JO)(!z zRk{m273HRumfAKKqs#U$o>nf_mQ;-NjP>!CWXu#uG1l;w78v)ISGqU!_3JSGo7lka z4UvASAzs0F$<&3M{Jqh4Zi(<4>}>E?2i#u7UHLhjzJ|HCTzh%yurORR!NfN_7mQbK z<4;@6w1V22>=@dmpf{uThFws%^ML}8uWcS*DCxEx*8m7N{InT&yda25`2k5mzz_AB zIip&aGo4@AK!6MuSlbn|WF+Ko@|?W?%IzRya0vIm-zw6HEr-uWf};BbTXux-Z!MrN zl{j=}yac3m8VnXgOQaCw2j)mWAs8{M%O}d)keg5Aj&@_Wvu^RA{?4u0KDFWY(k=tG z?9Z^Wd*sH@y?c%O*DqDz*Vo@(`rpfYt-s%1C*SzwNBrXIxD%)cT0L%8mixh--(C1N zG9R`ZkbXILWZ-uy>VwzGn#%>K-jmDsf1o|o1b==%0<+=ZJP+Z=3f6VlLix>W+9{= zkN+d&B1XXJ9Dq6JO4dcrxxh~4W1$R~HbQ*-e3@*aL_1eg_um;HpO1)hNJtF$E*QCF z9RT=ZTMv9(!Q>d2Q`|-~4Tt)5#GU!lH+*0ay#Rc2KFTH_psF+F4^+9v<=!Zz3hg?a zzj`9<#np{)qOlPPCCvw>#vi#3#E&malY~ip0>`=RWm8k|o@_d?AQ&6--3{X~#JvNKhcPTGw{ zS1AqPIm5)=QtmMt^Av2D1I-TS>Ez+v%Zh3!PA;VS)|2R=z;9!o>Nn&&Si4ZyC-9+Y zQ$I%;+mf0qY4SkN1!ic8d+Bx0Gb(7+6^LYQ%}XfA6Kg*&Qd}nyo|_A|xI9(xZSSPy zRv-j~7FGKoE=g-~OH5qgUoBHs7D!tmYMKmSr@>_5c@ z0rh1IUNu11eeA5_%Iq)Eb2p$%CY@pd#aKNflR;@2AUH`CI5ez}gvtQjcr1D`V}lwD z6xqPxkA(wBxEvT^9ZHn|^huSgWt1`j$CMBXROcyuDY`!7 z=6)>ZVV-XcpjSG2w`dwZg=wjySSXY=MLDTBLaC$>-L5&cyPDbQim7p#>I_t`F+(=U zz22AgovfYQwA;(>VmcWDmVpQVXip1iOm&o!Zz%aHu=p+TQJlP4<9d=@tVo%oKKEA! zXfr~#!y|ikTs&8Dc*_NlZ-~bih_koxL>$~sB>QnQ#?KZ3z@@65-1OPA?&1SP47k~V zKKl~*bWU{?z!W`bfo#YwIxbl9PmI+VioNZE`YPodwXG_uXF&}4FT086itI7^IGo`TmAmaDj=bN*rHAx zcQSV=0mgSPuIt?)$e+}YL%ki^IZ2)(0Y$NqnZSeE0gMCL%o!7%_^o!g1SXUZ%&SNW zDxzx8ao=W4(=z*O_ycF9rOr>dF27SN^V5~h@JB%Pe)Q>N0bPXl3Br0uTG$zG)!@93 zd6FbNap!)sFn_?OkRMvan2E3)MIw8D$wj|T$vs8lVgms=!ncaAdSxd6|g#HhPy9KwY;20Sz4J6 z0m6ujyQ|W~M$Oy6ekQJ0^P*Zfz2joCc|mdXw7(Y#^MRqoWk}9=ETp=)9DUle9DUNf zw(Z*!QmXl~2{sqO7;=|WknfcU+P2R&smE~FHPIqH1)jLHO`hrs6-S+Hr`#C2kGP?* zr@peMtTM$KXd*2YI2XsiWqrCpzkfDFwP!0X&Irk3=10IB*YP@h=q+VIz;&aBkwO_J zCAx8+gAGMtVz}*na!Me_URYvZOYvT`xH*Y-BlMWuF{+5iucC#VutfH~#!%Yb^c+SN z1A!Xhk4(Al2_U8>j6^9veDJpW(;d4B(VTvt%h(ZOjo>c0^!VW>-IO}{I`13Jy{P_v zUM2C0_qW?B`DF=we0>^TK?#1VuX1;Q4kPCw)aFg(0(rGG$=36H35g7`lewLP=4GDZ zA0Ga?(L5K5 zTj_>xw$il|NP4e*M@PktQoZ}yfK%y>_HH|o5PRbKm6O+FF})WUaUBG^C?~_$`vHav z7Gie77_$oNrwTFD%tF41lF7+a=eRi~ky~7nq0!j`QPjrV1G0l5S@vDE=Slf#`}kR# zr3#)3{D%`qx46%4aC_Ddy?JxR_F4eFS#4}4&7Iu;-MjIwIpTE87q7j{68aIyJ6g|C z)OsOfD_V7`6~}q#ib}La>qGm-%O_PFUajM1V&{dp{O>2Gx_e8vcS{*Nj#~QZfP2MM zr~6VSr1SpW_SLyz*Q@{`D@Yb1+M8A546RSvYF9I>+DRG1>Zo1~0ir5jHBYrGWmO}y zsvE9P|NC`lh;%-ntvM1LYm1~BbUR9H!DY>r8^6-@wZJYsRh3w2oMXnu`Y8$ z0eQ3^9D`+~?owY8Q^%wyDnK+18kD zd5giBS)Z~#-o7R&#ATFA$jc2QPosfy!qyk>Us7WPVDqV#wc|CH|09pfLkMnYE_;I* z2_+|i#w$>)xE(}vxhp(# zU4aCGr&s3kEdOij&7SdT=G;nxjz&iqaZSB#d^XJydz{nIUgPN&e}=fEu2NJ@<6V`=)g;izNI!xOVOgX? zE(Wr=NA_Vgz;q~5Q*7bUTokEI$z@=QFgL@`8ZK)o+^7G_%==erP8=mn{q|o%MAOH_ z@I3B%>~xIc;FwgAbI}B{@>CJuE2B(h^s&ujhR!KZ1XM@PW=8n!QIfEqGgXd_vV`*2 zM5%r@RxW;cz62ZxoIf2Oz7t=A-)lM_hbz5J4B%7PE_9Khz3*EHWt=kwSKNU%8;==% zlcS1O$GUo{QO#2vS2ppOd+j^p>FILz4r+j&XTf($g%{1bmlQFQXU-g(X=&``lafx0!jB<|D_<;!D$S%MQ33CHvRvY4ga!SNEgj{<J@qb(`BC&*>nQN| zYs0)P!5$5Iqq`d_4$Piz6qBRO%Pf@wCp~K!T=V2M?N#j=jwhvV<0@i@@CKpXRh6eP zTc*9!jC|%Ln6YqiqjvY<5ye``SG^f`9GMy8x6+&b`6V!j+sGtPdpk z7LKlPrF_csLr&t2^X;q41zk+FP668z(whRqjGKm65_f-!S#O)HCigt&J#ZS@raCEQ zouipMlbP}@3Co(|e8XE*V)+IZRbA`rJh`Lb0$^lbTL7Ac5+P){BerL@Q9YaXT;LJPx00s=H zh$_jB>?CbbJFDKI9=q9|bwio$Tbzr|rVcnk5{ z2b0QLJAbfg+6J#sz0*0s3hWn45M48Agp3ht$~e z=1=d2)e*Dz%+)DN?#Z#tKa=+@Xf$Ya%U7PVh;Okz#-!L7Vl?z3&M3b;myO$%oNjdK(gN{3QV$Wv<2hEe4M824b^oj8g_uu?+{SQ;}47Ib5x6843@ zw?c+yf;}IvYumPc(;(M<2Rf&`9)#UtvhiNqz*_JPWjlQd?QVUZ=@J@l89S<*JM^jL ziGuu(dJxjD>5Qh1(Uin!MYDXq&rfapttfGK;zMFa$dK5`hzcK0MNlWhG3Cs2Y- zc9Y%9wolqwK2bBZCmyRTcV<0i{Y}Not3R*wpEg#XEr{?t!wjO=k1qzk#~5>c%#i6B zQLz%3#;KH*`N#@U=CQ^S2A%_(5952EM9n*WjI~(JlF^jt3^qgt5mOj-AkWzDn0le_ z8_foKr%d{6sbtlHb*Tb?bkqKUZpqts58&->fPaK!U#ehwHbr65H$rj5D8?yP@=E4s zgvrGS<4YBsXV%%*BR6_J-i!PGNiMF=ZNKlCVTeVpgUOTcM8(ltm zZ<-?*TPB&0D^rm3oN*(rBs2Qwt4!!t6}tK&T+BIqJT?Quh*cquXUzwbg(%v-JmPy< z{(kQW&A{G%#pK$>p&q4ID*Mr9mu_)+;9p7nj6EG+$ywk|h2m*2a%kc#z%`g&zoHkp zD3SV2jOmVctz>zqrj?ySTZU8MKnICEX_0T)E6jgTDo;ZM2BX)l=BS!F$ zYX_CAfb>7Y9xh;Vr=yd+vZ}dhbdsAKQv*SX7wHdgwp<6y+zLB*_et8Yi_g-F&3vg^ zXKRVc_LnxZ?C}4~eA77H!CiB3`KEkK=0e(n;%2v;Jj_!tbV+Wir}QLX>BOhyMoy&M zg3`l(Yz4$NxNbp!f?Hs~&G$Hc@J-ZZpM&dU8D#6!)QS2R^Yg^3CmQZ*d^yqE`^0L2 zA83|jP!wS5F7=*iUfgd4M-a0w57u0Q)Lkd+7r2#*2i<}qAty0cCqC-WDJZdBWWR8J zt@|D2Qt;Wc5IB}7m$V#UT>(;)!4I*mgP5!j+u7SPleYQK!N_%9!O#5f(@bqV1~+z- z&4cSD2SKljp0iyrkzhPhC~I9Y=`?&L$R}CquV52^Q#)(lQ%b&4duWtd6VmPtem$JS|03p zI01LhQ-vCoqA51ZF7)DcmTuGZbn&E$iSvuu{5bc~fNGwGkG8?4TA7?HARJYH`IT^c zQv_JI&a9X{*LRuc)$gdG?|Z#pM~D2M4b{bbMce%lI@z_A@o{@PRTWDgArAJAF$FcM z{a16Fo1Yn+R4LUtLt`8zKYK^`?N0kBKjrc3nW|AXRv2SukNp~pg zUR{3nKq;EvLp7Sl0J#65&iCKbsWXew8pSWhia9cSvXX{IWcM9hE4J$OcI}Pe#Yk%Y+86z#eBJ)v93z~z$-E*m9HF+^=#nfW#Oe1 zZtw<05X@<4C?NEh$CCs5UVj^>P}ft7+oeNO-i3h^hD8GzyHfx0pi}R%R*aeLd!c|zlMU;GXAygb{t>%E!rJZ;0AVo|I@6om{$vcUM<-P zaPnXpu6^=<%&GaMA2f>>e9}dn-vI=m?DEa_f8j2o8;zkIe5-A3hcmX;u~i?wVuzEr zz6H~y-^#K6GMnz3Nokg8b6MM>Gaql{YmbZ@xp8x6swfKL6jg*R41BG;ZL0q(!(yNq zYc?Kb8)%U{SvSj^{&ytUwa=iz}r91pi? zEcqF~(V*@QjWdu2ooQaOeF!|vsK22HY=}1M!kdB}TFSvq75cgA`JGPWUX1Ia^1HQ# z!wnICa=d}KqXwx;&ktMBG62G2ovnSCP35u1$im;wjBDsZt%h&6A0p!;^jr(=ItuL| z0HwJgXMe<<>DSi-rL+0alJ{NKWwKTrzUn>NbF|1LzQhM)Y4U;9FpEvqX`UUJ%MHhkrIKeW+M}q-ZM82_mY0Z zM2KpAt^KWIPlQB z_;B?Y%iFzZZ;$e5S4&$WXL|l^hRDNX47^jv=(mp^$)PJa5|g8`te4FP=mfJRd^Z`K zdj=9@QG;gbwxY;j6JOgpJrgH`8#b#VvuJ^A~oZ{K-z8y;oXoR?7-oXG>UEdqBwBr3-bVF0)g`Ia!|kFpeK9C zGlrAHy5cn+^As_j^AwSuRnZ#9toyi8!k%xt-#&Aj?!C|$bI)E!5qG!it^NE|u-?L< zQfcu>P`-=$a*Q0=-Pve2CFFL&|WnqfC1vK-VH;!3u4u z;}*4jiyB2NKo({+Z7=G#c(4-fN_^qZxll~+l1Wx{MAN&d|M?T|Wv8yU+L%@u={Qai z(^PJKO5ZBsHLD&wIxy~odsBQ^<08!$3kO;Uczu(JRXufq&Z+hN&`+ymUL|>k zFUua8GXM|Edz|D8v3GBm(hFqx%3%+ z*{5=A816E0Cn~P>GaS{*>4eZoHWtuGv+8l6)hSLj-PNbL?dQeT5$Pq^VHAh=k*UhG zQ}?QJXlCcdHJox%s1jxTAD1}(gUIg>Cw6dYj4yC9a>1I{%FRN?cV_$oFR?2GvNsQ| zyD;*JN!}$Lvk3?O(sB(y|T5X9c`D4xZ>G6?OqNeoXSfPkFsB z=ldvkR+el98kvu(A#a8FQX=%KzOa??3h^A+!wh|kBV4LJ?qu~dKwPp=fy=ea#T$8= zrRbGZ)>Na^3j48cNLZjkV_IC|`+YpT6c@0f-(jA}vqc)2N;}V_S)bN(CljJkOCHWNpBS^oQ9HdaU2^ehG* zf|-cxlt-sifAd{S{UBL4a7P<=X<1xtatLxRu_B3 z5e9GX8!{Tk7_JzZ8uu&>UvU}^pG_5X7s+zmuxwS6+ytn zkmSkGi&dE}(=j`)kC9Mh@dW}E6oYpl*;4PktTjzouhB?T;%>;Fl^nCn4JgP%F@F`a z(z&U@ps|3dgKL%Aa&h5^{wML>b}{?hn4$&&5qD`SA`>7W^eCfckHotiA|N*Y_&Kug zl$|+aQxP9O#YYb(_jVOt4C9y4x25jcM4BIXyoS;6-9B9>evl$x<4}}vAL<@X5SPd( zR&gIo5Jw{hre#AqX}FTokT9%zMm|m};iepQ$HlUkp+m~WdZD=P2KpygIy>96apNv4 zBa=+Y76LC)33}H|N~A&|ImwChOXR4-QddhCGJ|(C)tPuTS_{r1iUs$q2ei9yW6#Of zlDh9BLs%B(=Ds@>6~zV|JBH4QclR_OePFnxSgR5-e7Gf7@W^}rhJ}dh{!&TTma&rN zVpmmrdZ5rbHDm(5#8P*XL~B~yQD`_u>1}vlCMTT3Bc*2$gw6brIF-bky;mpI$aWDk zdia;6?>v`oqf$cOE+I*hDBEFjbuLiBQy9)qbMDMUWw(c(I|_)m*Fo+KWEW>JtGNyl zhxZ~}Try7Zmr#NE#`UfxGN@^tlJp_1zJQsRV#*$6zu6w&hnS#Klyz2frgm`-ye;F^ z(I(4BH(t~yq(C{>pzc^gG4&pKOQ4^JT7cqOpYo-JVkA|$emv2(QB#Eb!B%j6rRZAz z^Nq*~ytCP~r;_YB6k*esMyt$XSuH7rlMdP9?@b(Hp%(|kq4~HyUB)Fj`%1PZach+I z-S_g9Dsk>q!?9YRh(fxmxYGQXS#+NO?(Ye{#Ja|2D%&=N#l(UPKAM8qi_U^gS(J$s zm#%pJ%4Qa&{xo4fS?3yZN-k~~^v>*uS}&LA|2&TIr(rqRDfG9EXLBy;n&$IulJSLN zU_;glh}?9OvR%b|Rz+vt-LThge?5duna}9}+(Ifqt+OGoCklgD=eGI?YAIq`a$80>x62|S-NKX7u=B9bh<&``5^=- z*Ck_nzvjrpH8QfU^;$E(ZS^EW7W@uS}`N4r$Eqdm%0 zaH19xYJz6+-bswh<*CcJG;d)u)1nk+8qpJgm)-Qu$O9jQ0{LfTnhvzs451bl=Es?zSuUt8s?EQ{(n+6} zqME9j`Z2AzF)g}2ExJ*&8C#c02r_UF&OC@jlU3BCfc-7u8eKB(P&1T$+NE8!ur(nH zIMO5ivKzoL#u;_!zAlyaO_yF#9!QJHOOlhraj|yIn5YNSYF}XDt}m06J0FrzZh*da z&NkugaVdJ|y%hQ47kdBj4zaZedoTh>Unoz|oi(*pCPCXLHTGQHqe6y-?zw)BlAt)g z$Bqve+1`E@gVeGswEX@NNWi((mfxew zy{dUyb3Tq6XN{eYVEwtxpB|d6sTLR#TCtpvpp<=llq8PNY3MIWu#WdjFs&TA zKirpUc@@JkQEEv|tMt0>l&mI^c6BFD@2IzH=EQ9u4*m~MIV3i-#LZPLy%~>C0*N~+ z9SkJfP9_VI_ouE;&)mjEf?+thAu5vXZ=Q2_`1s}O{rd$|lef=DcCJYwv{-x_X*14w zE2l*#qco_YYveruY*wMcC+<)Tc}b+mu^@`6@fmL^ zbvyhjH=8!-{RkWMHySr$uH{odh$*LkLkbaFyGO-3VoCF(yt2j)!^Iz-c;!XEg!(w= zo<{W7mroLa${-f50h_D zKT@-fSUwAAgXh#`S_5nP{_(>}L}tREuD88UDnloiDp-bqS5Sd(v&@R>Shr)Kx<+`94@|shsbb%bhc}|StgBc^coQcAs!1V;Rx%)`H)MB z%QCkiZI-rb%O^Q0YFIY$7f=*RiI+mVyN|jXC!iW!_W#&>^ROhh?++9N1aU$|oDF9j zLnXzjz$rB(95OZS2Tp0JIhB=l0u*OW6Ac_X&S}#Z)5@{|aY#+gvN~2;nr4%k9Xr)I zR^CnLcYk;K>)z+N&vXB{Ta;IL-}Uab_S$Q&z2Ch)Yx3>qf23|un>5Efcr2a#ao5_~ zKOpM>w;n9<{FQ$0@=@)Jva>EmEJE?mm5O^iL@Gez3X|8r;*_}0y-x0f zqPEH#ACVkVpZ>luLgUK3f7dgL`O}+qclZ9CWEc7hQc#&q$}c);4fc<8c|C?GkIK`~ z?JfKv4P4+zLV`I{xjkW9VbMv!MrLI3JG&){d6doIF|8vc!Gi^lavP$$N~?E?VPb)* z=}>ri7Dk=MiutctdE?fUPFk!Q5%mbow+xbD??~NN7<9c>M#ZIMM-ZiLW|QJwrZR3k z?LGE!w0TrqVgGGBjL#cZ7HI4&dg&Ljw;BZJTuTdN1#B|OkmK&;+Tj5lL}cpq+BD)E$2#a z5xiCQ{as73*MEE?;;KupH9w4ba0H}p^dnkbw5NH|;=oFeu}PyTq>N@|S`idbv4`fl zQB{73w&guoG?u1e+Y7=m40^z(d+aS>nU>eS%RpT~_@cO8olmI`Z$#jg-l?~1I(JO$ zIIyq5d>%>Jex3P-7RY=vz_=NztuFrv;&@I|AoDkSNMe$0QolFcHWadWK1QU8Q}{0% ziWOUZ26r9u=i5Rye}37xyTiBAiHYgSS{<{%PTnJpK7nktFR4vzier!9ESq=tBLXvP z!%rh%2n>jF4z5SISMK#zIv=P5@Pto(%C0xxZ5yZtR+AhKg|1lLusQ_&G`CNDW#w|z zWe;`c-Vi%m$Z?{UfYT<9>fqk57DupI5VQ~CKQf)IO8*J8Iuy5{2sxAV`0-@*+P<`9 zChBhx?h-b-dyf%8*gxvi03OtO#8Uul(=qC@Ho=}%A{wA(%RdBo0*sLQPI5^7RpJ4{ z9==PTTi#>+E84_A`&?L))I9kQyurTioVJ03p58Huxd1q(%XM%WT~aVsq7AScKycsD zt^Gx+iGKY(s!OyE7p$#!>Ne~rFn9B5(9Q|TF@s5i3j4hE<_fc6EF%zW{Yo?^YNu|X z21@FXYKUPE-QGvYpxj*wC9*CG8JZDF@lN$!6DbqH_2;Pi6G4(Xgsh~Q!^uB7&@$wH9ZScM+s6*y(p6 z(mEzu7r+4nOxpwpx*VjQT-V*zcPo>^}oH zgE^O7Z#H+vYQc~3T#XjdS9BR6wbrA$b7?7k#AwklwJK#~A}ZclG&mcXLQXLsSC2PZ zvY_kIbjMX4G|nj4^7YAo6LrXVkAj*MvEd%!a2|gHZ39VLTWN_z z)+1}E@v`JeU<{Z`mVBPe?K`JXk-JL~r$3b-`q{4l!Xi72RIOC$yVzw(S2)_wGEjy4 z;iR{(WlSszI0*am>~F(^l*4hSi7x*M!r&4C@+Qe{5E=h80&b8k2U)|W%7AS0lzX{k z&S|YV*|xJ7e^D~t-+LNAEFT~fzL^+Rx*+RhR;Cs61ZJ-jqeyFwQ5=00r)2e^%*hUH zBpH9g_4Ojak7O*%m=8XKnP1hBF*_r^Rp-z7dW30X5c&jlx@IPr73xl|B@{hAw3)c4;zp zzEfN;{t~r-KgzKg4`Ggu$5Fr z@2wc|6MKKfz_-LWVQXhW@UosSUeI#mb)M?B3<=#@R~ z&F)L6VMZ^lct%We?Xm=_YTF3LPnIO!%y-N&YGWU5?gtVeE@c8}1U*^PYy^^odn%7r z7oCt)^38_4=+t;3LsTZurU&KsPTd#GFr8E$eAP@Kc!{9|>Ta-d`y;*D2Gs+Rl1pB!< zfXq~*^u}(ks?R}hN(vqDOgWJ>b)5ARAEgLvQj~T6w~7KqR0+yDZ!9m#>DpEQBv791 z%Brd1|Gxdq3*kS%#U54c=>bj?aGUhJ?|wr2ZL{c$|qkZw#fo+x+Ugz7Q?aCQjf=M8gT^yfYxyAS6cQF>#~ zi0j*gJgBvDk99ixu5zm)`RLSt(bf4pB-H1P8v*IfapQ8C2SrEfkH%p_&|xwg0rJI? z#kjhtgB(%2aa500*k?S~*f-p_)4#SIS0&MX$?*8A;ydo z?qE+r0f@Ms$jcALPjK=zv%$`SV1puxC>|6w zYBsJ??0y;qS)aEW$1ORDdda{@lH)}8SkkcPsf2j@E-ew56vxYYL~8zk^nJ{{fmnBY zbeFl&^yD6sLWYS@6xUm8C1(1ZGSf;U$_wsx46E$LXr?r8OgiF;$1SP+A-<-^mcN3i ze8=)*%Dmzv>jS_%_4D$gPbLzXcg9l-C$%8EI|_ZC_zcOanOZf2gk=gLiNZUUPL$}b zN%w!w%7kCvH3PYNv0`=Bsx{hGZ7Tsm6OEA`(4h2T+mpE_Z^Y&?8-2#@7MNCsR+34X zQHr0Wtk>^zK4qtSrMv^8jS?dAD~vDt1i83-H!A?#^_KC_tCFK^tC(CL!C*h4MoV*W zxCoCMePUlwtlfSgH10g6X4>lR%95kGl2Pvd90GgigaBK>(wW;-rAT&b$?gOO!OOqccfs`8I0ElrLfSv{p6v(LoO?;WTf!;!v zCoP{j;Bgib+J3-egc&Gv)9+41M(>IVlXzqnX8{fWRPo`KZLrKWfSQNb+zdZAzbVjC zOAOvMP1!Lk=&xQE&jd!jLD)+M6dqdBp^OJrlU@I?asD@+$@05oUYv_{8;5s&b&g$S z-#Pu-dW3`0Y!+bb1jq1nh1%vmRz@|1HZ!AdVtpLkew zv~KK5P3wgVH_w8{>|d=%wx4-O1HgDLt7k!&V`3liF=-7<>%K@~7o_Fi+_zvc+kE%g z`n`&gTNwL5KFY9PPt(pm+NUK9fj({m56mjF=P9d{l?fLT8jbWrYQz76rBnW(JfhUr z$JNtF3Vel5ZWO1AbCOfYDec|Jjp}U>n4Q-prqyC`XdPr2=N}43asaM_FX9tI14KYQcA72}WAHu)bo;(4F;XCxQX2=(z4gdY*$6lJGXGkU7R`?7OSz0PrAy-9HHS zNEA4jgq|YT0JqFBJPZEn8rg1qdX|6HO4a@<+3-xNz(Cj*BP(yBK$RJA!EC;?9j_l1 zfYK9?Z^+9kc_PyOk{7r8A0WXFZ}OWZ>@=rA9|#(Va+jAk!fLHA!fFHi;Y&e2uuDEu z>{WnC>}(rNPzUg#xK1x3lJsdD?tRz{hC6Jf5_G9n^^|q?!Ny+4GNgx@7Bpkn1!MiByI-FCP$bjA&8NKSb!7&*x3HBSPN`Aq{0|&bvz(zp zZwOk5vLlOAkUt7fK^}oeYTEa=;}zSDVqlyi9Nzy@)DSF{e_q^B`n?v|pm#!E-b}`7H|C;=dhE1Etj>(qX_9LNV z_8`OM+a}|uz^^LbC{1eVES>a;orgC<-s3>%Jq>o6KcV051$|mqZ`uBjOylqIXxwQ! ztihQF@o!_)BV~9NkR-w}AH^NkuCN^uBjQ9$;fkUO?GeZ3%BFf9%a~x8FnAxOK1_8& z|Exfa*miyvx(+XcA~{9%?hox#l=qr2kgpUfIPAI#cJ!4IjtcFKDruZ^qKe~mH#^gs z8^~uECV0u<>f$jOe?ikGFF@lbKd{%6UPF$W1=b@Q^MWDo8Sm@q&dLVg#Ku#{im8N-KrgE2hy{>#rI2^Idgrd8Dq)q9aP>gKTaz*|T)&^HC2$oUtFrLk$ z4~xC7SyIZ|-)NoE)UtecO|&OzwmJ7H%A)0P z+12t&@GOoNPnW>(Vz$)hByQlto+}@6W3JRdk5Mc z5yDCp#Khq3RKp7G3lEyVtTGR62g@HISHlsRgJ!YaFj8jxHG5|RF=%dmI=3Rr9x;QQbCuPOjopld1ZSmIw-vD zEvetetQ1A}5=V73vunkFj+)t{a;d(8aK3Y#ekW#8<+V2O@E)7J1dGw;Q|F?tSWf-t z%4Ejl8At!5X9s7lUUfdU`7Z!t)pcfj`wIZ&Q2QeH9jn0klff2o zMA@PoQLe;V5F{WAq@IsWXr!oI^p3I2{IhRqOTVsr2d+N>xUhRvU#p$b2dQB^s&yw` z=rA7h5`zKEja5*`cC1?dGP1p|c`kt*#89Eb(Pf!|ipyZkIjFdr-CX}Z`y#NqVE_e7 z3Tbl}`L{cckuTYZ)(j98i^>F6BO1h;tm9zaj8)o4>Roz?$oqny%98?a6=+rhShG=j zEd>IBw6{PYNr(pIo1efT_e0avn<;acdSANrqHCe+Bf~|i)+kX4j*EOq2+PN+FEDN+7@tcozeAm@(pkxmG}$k+t<~9+iV#Tx(rjyqV-^ z|7ExIjQ=Swj<0`A+W&QJ?ZVoR_21wBTs!r(=Z|CH{EwS&UtK--d+pknzt_ipzR!BP zoD4|4|L6A4|D8nEvi7&gBsKvJ`c`nA9d})wAop$G(pg5HzeoP8N0 z18Pa0KLIY?(%G}6^MvcHB6)sIN&|L+G~eR}!MLv8qr&K}aEueUEkqeI&!$MvS8|;f zyFoxjN?qsgftx^9OUd&Sl;wNiTfhlrMTtC52TTIasc!MQtAd92V}{sKtQFN zq}P^!ySu^4oM2_H^V?ll!TEsBJs?Ln*gaS2SEZoVpbp?JK(gQ}SE*P_N#I~X83+Ih zciYm1`3rUeFinNKf_l1s#(Yqka8p+P^h-i3^FY4$Tt9AytgZoRQGis|#rM9$*MVr2 zoFK~N)iUrsW&VdNY{FxuZyiWjd=JQg0^dx5D^o!AVQUl^+oK<_c<(#pv$RG20_?A@ zLqT;{*2T&mljBg>35Zn0zwYq!-pc$vARBNlxat#p3)B@hzVh?l2W2Uz9t%o9^q|gA zIK&M$@g2yN3IlB-Z6NYzWy6-xRwzQ)Bc}00k=Y$hz^ZB2Y z&r*Rx))`wm0r3;A%lH00BePes={DU0UA`Bm*=Kh!+DYv85Bp{U#=90W`pMmEpSJ z;tDGRwS+>HfOwXGGy!3_k`oMwP%KqZsZhkO(ze7vl>jpnRJe;&71kNjuOOK3ke||? z;0BZt^dq8a)P*6hmjTWB9<#0tbjV`` zi}`-^C!m!s-m;SZ-Q^Prv$Q^V;^&O={}`+P|KR__5{UcNf)|u~8GkDePDmRTKCAoz zSThI)=nxsU<~qOT`cvBHD6<&Xc{&*=Am}mk{^Utu<$-;tktY3#eTrZVAa*K%;lb+H zOFCLeM-CL83tmWF76wKen5zy{TeYPnYc+L54bTmBaO9kqZ!}+HA~u~?f1OKuoP>Rt zNE5#1I}DbRglEiXQ(CHlc4;1-gZcg{6(=e%)yj+cV(xb<~Gr3{%P_3e+M(*KI261|)UT&Nku_LOj z_~jsGio#TQjj1It(5roh`}~a`3xxN`4VQJubz@^4BHM-jnEsfBW{}8uOu5F$Ol3?} zdjrWQexomR-B>=G`f$QIF8i8DLelq@e5-YBxcq~emCLY!z ze1^K~lPz3>)g+DF-da(!Nb#klagN{iq?eYqRauuYyEP9>?j4~uTuP709Ud#!F(Db1 z7w2>LdYY6Y-3_er5r^XRWmy}w@;LSKQ=@K*GEue)Py%9Tn-VwFWGLv&@~&F~ zJ^*5SH~I`=e%nDKl3$;?PJrQ9o3k41CtWR98AF=*sxqEN z8!tbCzkXW2&>%`+T99K+^e^G23Cz63(KYbDh}%mb6K2q6fucJzpn&6Nh#==9yboJ37w_W3K8%sM;tu9_1@#5D&CMNvPO>Yu>RMZACDxjCZ0WaAmrVJN93mpJT#WzXS!p=&o<20n=qhx zz6qPIrn(e)_pURx?GmZ&x>co_?}(psaHIvP&eZGv&aZ1yFa9gLmk(m%e|}u=nbP1g zc8_teDJN=V<%rC&Yz4Xki)d#o9#zXJt~JgT>judR#ixj*x7l>@BpD{u^z-3#rXnr+A96xk@KPz=4qxmAeE82lY5#6ljL0+)zgx3M== zK}fm~3k!%V1F21M9ATsQ&?~_Za||S!4Gon&JZm2Uv!*~SQPmQ>$Ug+8ND-d53YIS* z*fh`HsF3-G4jHFI9?}*3n1kA~ZbVrLGtQTDnxv@4vEZ09Pm+C^ev>l0h(mr#vhB==&5DNj@l&!sB3lzG+d{sVfw&~TjE6J^;|#?YE1`=K zP*k_YycjVIQK^JzS;2DJ%m*kibWSV=k}i%vk5%U$6>XcMwdFLzP25*p1PhMJ2rO8VPQU}e<8X*(BP#x zX5|4%U#okRL2}q^rRCWW%9n(m-^Liq*qf^PM82$~Y{+}4Hb14@&h~*EWKJGaQclQE zEEyVA>Cn6I?8A?qgCCxKfMy%)fAR6f?caWWJ$~zJ%Kp0;W5oFeD8nY#lOvK3G7O#4 zWc3=Sz$kRR0ZPIE=a4lrG(xQ$qW9@ggaU*rldme+$*$BDii?8pBBx(dR2qV4r~w~> z$}U}zmuYbgREKs=q(bWN$MXsbE7+WhDl_Db+LQ@o+m_ino*1cl5S_9NE!B4~bK@LT z=A7T0eaKkW)(YJ=%i)j~xR39x{ahuZG84=812gI=+7711P>h*X{08@QV=;HQxPtRSj;WAR1MN_1py{*iVH5k6 znd-ft9g!lr`^H|Xy;n8!n~11}vK*2OcN0do{y}-cki^}cumKUDW0XVLG7OD3Lv$V0 zVAT_iC`L_`_`YvypLAsuHgg!N>9w-nX)fA zQ50$*q7D=4$GuW!>4_JWb4UDCUNUx}s2SSX5PMnI7<3wg=@sB1H#M53|yO^vU8=au`-z zyknFmwht1}Kl=pj?q@ECT2Wz5L?WTdM7Rp3v=a4_auI7373H|+=Es8v>9sREcI=?F z?w}osXEeAM8JJ54g>#jam1)I0?p`Y>$g>d^96sn>Vd8r-rtMO2yX{s#FhbmKd^2%; zeWsomy*!~wn%IewkbP7h;PE;2SCzSM>}9O%T50G)KuqNrGw6 zm3Vy*=4uVH%NMrnj{KYt`_9J%;5Wyx|51gXH>h9Y#cQvOD;?ijTY;#%iIS>I+RYmceh5g~ux# z>eq%EYtP})gkv&|#?S~Q@e3p)CA*&7`zyQg&IPz?0Dr*bL*&!teCnLHHR1J#Sj zan-B;4=hegJPKbS_ZG{y6+_)M*`^3_Fnkun6`Q@Rj~`%e_3q{9ARZ1`w@6&`t=hN} zhI*s;q_>Rb4I8hQC^4d*YS))|gdHkGpwMm_HBPb zn%frT&4M7c7Z9d*nQC#t=j_=2PyW+w^sM{-jF>U$KbV}*YhapS7ZfwdF>I}o38U2! zaULaEG)H*M+u|VYycA!91y^MKguX}HVR$`0 zpNnG2_ZzTHR8V)(53^vOhX}TWFVNUPwBlJecJRY2xYNV>-*DU_yN7ZJeqZsZ40~*2 z?}o^G8Ph8760Ygg(BPl!6E4_AGtCQH#Z{ALG(^M`JJunf2srF;g>nLDj&YzGo`Vh3 zsy>I6p>IgYvUmDa9-0x_cgTX{gANTuFj7=>y;8M^LvwY+2?3*3CrI&ao(6gkI!AIr zB9F2qy9db|OK<{@2!r7qHwj+g8DVXpmQv8|Ic>NXRRj0uK2X7-xZDl!C)_crJo8eh zdx&})TwT(^V)Tw>SIGV)JHSIrIMljqBh-1res8o$z^%rK&%sA=3_&(d4bO7t79m`d)hX>2;WL+jcpBt74iR~%pQnHC56*(pVn$(~amyCIh%7Rmg z`4Z!~1XKm038d+5Hl*Xq@@3+u#l4CO zYVYJ0RrrSeKEXVZIW-ww=1=)8XF?M%EVtDalzhy3UejZ`_{4Ds4PaM3+Ox-vL||kP z7<_(I@s5#eJ1t(tY4)5-TV~xIrM2~G1d<|6rAGF;4Zo?y-1lUYcZuvlkoNrQIJ zaqH`uKVAS-WKH~Y*k^NSprW`1p&1M|!2M!#ZnGdh<*^_+1+YmxlhRJJ)WwS~n8Amp z!gNr(cr`grM7pjTUt;)+%Vuj`YfUMa1w>C4hT$=7Fp5jW49c6pO{n3AsI?YT7NO>R zU4f%0iLnpN*Z1W7nG=iZP~o%#m5X@YVXbnVIh$4BzbaFc<1aB4cuoOj zV0Ptraq;zeB9AJ}V^lbIm@3DhoBZLHQqwGkk7QGRc*8a_}G zkFNKJM#~9^4T2Z-meX;LjmCANz z(`7E{470>;POHlZmlL&8JR{lUFsJQbfiQ5S8JR9hh{AES!DVgKwU!!GM@uyVb$^hv zg_K% z&-x+Ss*b7^UWIlEHKHx4v_@c)RZ7v8o!k`iVJWA`fq?ve9a_#}z*$ z>1x}eo=6>DC(IMwvJ6f>(nm8Vg_lnQ9&j(V=-7oXYx{xEyZ#es;McVuKW<<7@pC=v z1@xh4N)$A%Xa*06!>M>xhZ2xFp@e-v)}`S0aT2ppx0*{FtWv4G)Vp<`OxYQRw~!HV zHYYkKIwhdnyLH;g_ZQ#T=;TCf(4KC^=)`!#MZhaqc|xl=EpjLhsr7~0)o5mk06iuLw_^pqI#8jJF=kBL|U#x+&8ZtR3jK5Hi&O!Q0D%4@nCpi)GPo!vWX zbxRfVWLxF_g8!MVgDO`wBo?XEdgtHA8TM~gF|@Mnj!pTUMrzgZM;fM_BdL$$SgD6K?s_K0gPvlbWloZ<+WV>ZO=aYOUq8n{8XN+lPEpP30p|_{+h8oeve+~a{X*< z@JOtk@Lw;Hho=8)zhYl40t*&UkTW{k)~6K^6VT*)vT-4z2$95*2}0J`k#hPVP>*uZlK0ib&Ozvu5bmD3=@q?f`c{ zqKy8wQ$!WuMdz94m}i-1c^+^@ZXLH;cWz7~lpxXh!IE~#MfEbSyFB_2^qZX$369v2 zk|XJ*M)ZcHq`5lOY6q*mQ#h|V1#YC06I!IwNb+XkfJh4zlGTQD{$aKEvFaD%EyfU8 z2rdi7%yA#YDX1^0Ph4P7S#VyAMZ*rXfHGx1WiD{)eddPX2fRmn={JWQ5kEIi%(muo zwgsZYIpeV%OWmolgjeQlJ1yZZi^sFtZZnSBF4vQ5IL-c~G1H`8;jGp_(HfMw;b$?gqMSG6uB(O>;LYt29vc;eN}H@_N$qbZluX z?&;$XAC@LGZLemo^{n0e_`K%U$IRcpW?p{V)2(km;bd}JwAlHu@I`ty}2+i?3V1t%*=H9a!u=OteU^QZ%vBeUy$He-{#A45V>s;6x>lr}Ym-qa9iv2zkwrmqV9%9f^?|o+u7RcXuBu8`G%kkzcNu%)j6~K6kKOYM6B$7cIR_mgONQ@zTcOO#IQv(yFmY)i!?o=`S_dX#ip`QQS zeToggu_bWn_A;-IeMJ#rU|*~)H_BEtnh0!M5IVT8)@f)V*~_q^9IQlUEIx707(07* zrmimJV0wu(TpMemX7MWGZ0xI7uNHOtG-*krqu26?O{6fKU!_HGyJ^6KsM3IwV7A%# zb>=qMDDZ24!Pnz6KY&Sb|CmQk=UHU$&GyT->yIr4Si=_v%J<2K?$YoYw@H=3lW!68 zZP5ngJj_d7P-k_(M3j|R{&_>s5b%jdJ`LZG)AUx@2u}67zfV4D5SRj9sZ}a`s#p+5 zBULN5=fPOCIUp%oZ!h&SwS^^gx64J!W35=xMY_9i-IoWX_t{tso~uN-=hK1g^HdCt zP!~aK6ah~NRch$zsA3526d+41HiV&6WNeBWr>j`}VTLQ$c_e z_fke$5W%tCPq8pCJFt#=p@NYZBuWZub9B%N@4Y7E7Irh9YFjJfn7_|${uZB^o7c_g z=?-vC);TRm_ODPJ?#W$PloUA7Hnk4((CMrW`vjh0vLMZ$Bx$kBkTh&1IN9;Bg|V`O zPSo}tvX_Igeg|Y91?yDzUaQOAM!t~Hj*9na4rgc% zt;;$=(JapzQ|-w>R=WeuLC2r?yrxw*$UzWnnqX^n(AlK)JdNVI$xavtoDrY<-h}w( zCccT!>eQ>trE$?yPm6BUULy&>D@9P7&#)(Lw#1jAhm2)02Y zA3q(#G+T)|W)52n*58mmp*bm>d|KHM4Kwt7=Ev=;$uBi-=_)Y z-SJtuXEM=d{(VW4io>0`3vY8DzU8SV3iigmeIPXg^!H2FsTq+tQ9IAd zwc)XDDREw@`+aHmywaWM4*LSZK^Hx+E1^`hlzPXg-2Mc)WgywAs5U|}b;YX4aHxYv zvnXtAYvI|_7?S)(LTd01buYSQ;mhtz)n69u#^-qaxHfwD8xnGQE9nba`yuEL5p9JkuRw|uyN>q6ZL-2@ng?^b?O)E(z(sm zpC5bHzkE&gWV{r#nip26dnH>IPKV*VIuavZF5TAS@8^4s~GW%45QC10Cr_0${UR@&vTL z@*yDHh}1kyK(nBh*4Hrwgd2JwFBI&-NpqebE{q6%`Gth+`5`BrymVtFQ(0BUSy(A`A=r1 zaGjHDTIV7br=QiNbY#qs##(W{HMFO3CA{jml4^$pVrSsPw5s|`flm^z$m4dI1ERnK z6X1(Sdx*jIc0z&q(#V|53b)X55t*XzW7^u*)96c=nFpjlo{F ztCGZ3o0{TH)YX(LbWHJJ^zU2wyAkr8qBR8j1SLLnQSe~)69?&bN`3gJ_Db`Ps_x%> zF@v0y0#Ela%^Yu&@@twWDMY;T{Cm9eg3L=5JTE_|(d_b<&VxP2f1DnD{$kIE^{>xA zzL;6-`I^~tv*+iUG|ppur88h8ysDl@SlngJ9pI0|5_j4O6I;=PK|lnI(YtZXGnXUq zk=>N5S(4u~X66`x-_|*J#`H5FO<@;sZmfbF-U3E>rU_t7cfiGsNe}*QBgDz7J9d1W zRcnwr_gdB6SRz%6)*6Sd+6%<_?5Xb0iN%l0*ySJ77LktrGm;K4bUUJ7`;R$wNe0Gx z{+nh(HBBuj4)_Mm11j4~%^8=M&?kB`OL8fkwsN(e+pBZZ%J(FR_;8%H#jDyIeVT%Fo7lnm)b8ozxHwiZZCgh{!9lzEQqxqI!l+Z&0To(+ zVU)RUp_gG)l-W&3dQDAq#^TKIqagFj9U%v7hkth~t#i)!>Rw{*>l-tAO$bV^-C~fv zRUy5i1&q8_m8RY$+E&^47sn5-|9A?Mby!<}0*2g><&R$mYzVAheCI5gvIgx2ru+MQ z1Oh?2y)CGXqmD4z3RKAHaGb?JOYMyt{e42fcDhwuTx{_u?OLv_tXo4DMvwF^ziKP3u@LaQ zaif%L+IB3UBnZNKVftHHidB*?K`4b$>o``li@dhv@xX8d=t^F%-ZUYI^p*7vt-WKaks_0GIn!e37jl(=iB*wAQL&IDDCA4@D zY$CtHifqiA!)r{f=z1 z{WYz&x~%(F2kv;5lMb=zn{*w*614powapDqzFP^jBTq;6h55%!QtF1wO`~Fbo7>8q zWIUB949<}3kiSA+F5M1WJgHSUm?~h~(R{ITu|Bdx%^o>4ZwK%B`5ZLfj?ypd6Jv@J zoalVI{$cIum-UZX$6tJWy1sVv>;4y6V0g^Bopp2B$WGuH$2!87EQ&gWyu?wfeez*b zyF{IZ7t|i<&rcuuUeQ`0X+^)Fi;q=hdF*fp&i{T(qgq&~Il ztP+~U$X@+b>!2sTmQ8G9U$ieUP{Xr8883H#ND*r zHyv7M8{JtHIZg4O)M!oWcl0OrFAEdG5_VeK4Agd>l9qIZsK}y@5W>(UQk|I>m`wUP z`31L_mi@H6Ur%pxv3CePKSkX4Wj!c_@*p`T{t{YN1X{)Ns ztYYw~w{Lmla9~C|c%a>)+hP%TvbfTMUST|JXH#P8^&suiIO}f5K_YNIUkPsXR8>_* zJvbjZv=C@!6lJca;+ucE&XHc{oSvR2Jd@eu_O_?0W}QmN)qp z>Db$Kod8+&!YqR8aNb2m-X$7a!LYXWb^YK^u)Q^F{pXAQGwUDL_x<*9sz*KT(t`)% zkwtf%4j(?8Yx8Ql4;R%X#DNDY!yunb^Kc+Pjo7J_+2-23K zc7v<#+QwO1TZ5j}!UyU8!o%)vy9>&-!v&ed0gzbxl2t{M*Ga(c{|K$c>p|mNJ6eeb z;Z;P>sdP0ZDG@0dD?lT(s|#IWzSZuDX^`#+vpFtWD3lKwVeShP9*li@&g=Z+%eS-R zz$)hF8Aqkknlp#b_>WyrM#N5nITP*ewdTo`s@5dCjIma40O1Ojul?-!>DDJ>ZAV)b zmnMZm^trRDxqC0{+S?VmS9syO_75o?|Cv6ynaRxbooD>T=bV!hCe!x(GOyvnuHosY zF$FcWy0LB(RtG%A{EjDeLQBFNbj7g9+vOzjF(LU0KB@RTtgeqI!4w3Czm#cd>@DCA z*$GS&--6|Fx^V?YP0qM!q5gLa@=wV14a)tH^)j&hf5=mRkm{&~3@F>?O`VNXo*H!p zyLUDz7!cGttcczQ8;wvZ2KM%}OkJ|Xa{)U)HRPZ@wF^0Zso#Bt3@JAm% zx$H1@`wLk6|NZ#wtjHHD-U-D$^nsY*{4-m$r zzxe#6sV}>XM*>EI5H9AWmu2^UkR5N`WpDGi%eFK8@lVBlH@{|0_T>F>L^_F0noO~v z*HmXrSAyoL$+-^*#Z4O1p2oaweH9CE)+^I4hKGk#svA(tGYAt+K(XEcoeOO73m5@9 zSIln#vn{*eNDW~2N%5DIituj&Vj`L;^06Ov4 zN%6lj(A|$|(KGc6cn|}$HV||%n+oHh`x)`~n?NjpRd$m(7_+*%I;+ygLqfKKaY?P* zr#TR3V&X8^{O4hNwc&+7LrCD<^~8t!=L!+dReX^;0zZPK#C zSNqXr)|0zEPMLdbmKOD<@Aj1Tbgxd+ziO7;fp&0lk7;TZEqggTG33r zO?))-8?<9$eVXI8F39>A%c6`;QK1Fv`*wYm?uuA{{^cWxV%YcM;16kN35YMbee>h7 z#)G2O&;!EaPTSl#n|n6*HXbC74<0`4IQUHG#=%eHPIn@klE=x*^ZQe;Ce)3({rYja zb}G|u`Q;w}JEvb}ye)XdS`@t}B?*f+6^9ikMlD4PdK51g&*Xm8O-#FgcdN~OZR#@l zt4>zQ&C#2qJ=gNCa2AeDB{@#7!{q4V~aA1|&Z&-DEE@ynl=_-*%oRgrKV8z~F)U#hraW_}gT zZ!QH3K`#%?XuD3UFnnugBdwy8NpBv~JzHNY8J_XTHE&Bovk>Q=wP7<4ZNt-WFKPl^ zT}zvk;0(sM|AVCNw@97Df4P*B*Z?G>P}D5kNsu6b%dUP&D5P1&ZmPuD3E#2yImTak z78>@fFe`O?R(EGlPf_Gd-E{cdn==E+HJz<5ulg_76wWwi`VWlPw7%`;#O*TYCAP)| zp`ZB25-+tL3=SW?7l&Jmx^>awR+dKW%dkQteJ7dIVX?T0B3HG|3Imf(rbS( z32-jS_t>YWg7m0=Q)udX$WvFrwilk_V`J&#>yv8gbHG5iAxBTM zYs()qi-2fGtzzvj34%xV0RBdoT5+A5guGi*|GBE3`SM&(>VIudO?tlk@(=$flc~|I zOK-a`OlH-j?rL3r+s%G^?W+I4DA=@N*)HTut^|cOUI}tB=baymD+&{Sz#V*fdOGMu zk;~12iywiQ9ecVvCJ$yzhrGQx`7eQM(us}RiQhpBOXuod6AfNqIu2SHsF&7Ky3Mu8 zGr;f3Sd2`s{Yrfh13E)|K$ABQtt35v`{_4~=-2mt-+b)X#qK;=cOJM-!@CF!DW~ty z)6dXPzoyr|mQwiYT>@+@8a(%GkamKczgNM9Zud?)S*rSKmJCgm+Am- znXmgluHX6so-fR-W!(ac2tPmm{n-pu@#sH*zeb?h{|j4R0uSZ(#y^{}@3Jpr8%xqy zlBG15goelxp^K18u6-(XGYnZ$_H5I&B}CU!Stdoul0-_1$=w zkaO4a)QaV4Ua)^;oNF6OX(Q7Z-Zn$a>cYXom|+kP1bg?sWFBTem^fher~uixV;qQY zAl`i=ha2fzxUU=MLjCJ}o1W$^?7z6{@}q@lX7%m7%Vxg!Ep~U@M_v|0FV6bQo#R#H zUgrfbUuOD^b0$!(=)j|!myh@=Uv&6-X(8#T zrn~sks()fA(%evzRA47bFi}aK2oEqN`=shp?DwkLXA-RGy11*3%#3E@F^DgULL}P^ zaS|AY6U8&5|GqfUP~XtMFsnEN-!~Ovx+Ow8+95RpvG9hjb8U7NnMHo0von z(pR7RsdZu>O`r3c4KjcfWBQAQhuRLc?L(v(*ZcQ1-1{6}-;XvPaJ_tT`$o{)rMI{9 z7cAPiibJLcP@Puf!^nr!t5a8}zAv8o&OtiM;Hx%t%1B9{N1yrogUrzOdGm>R^XP@K zf`y^>`F-YXLv3RvD@eaeA>GZ7Sfk~s<#kIwINvUX6n6@0dKMaWE$Uj^a13;IRAE^3 z8*>;FPlkiq-$%`lAa)`-0d{GQ^tMKJqeeD(bnS#4Di;R$2Huoh+CvODY+U4M?6kPj zVKEj65zTPa6!-UD0y-5A=`cq~1*BQ+GMs|8eF-r%_LbL5UTs;4<$zB=J;}av27;S4 z+K1&e_6OGT8Z;5yDhvcRcf47i4sD;9_dyKMDeCG$X4I8^=I!rG?w8z;X`h-0f3KIs zzXHpC?<*-b(IMtdtn$9bH#A#jc-ibP>atS2)Q7@%8<5R zFN{b?IuvC1j9TTosW4Gp2ex9GVcTivG1mU^6yH1Fl33H6CGoHY7VE`Ict7V2a>@Za zO|yka0LrQ=w5Xb8=H5pR4Q~buAzNXvF*bB}qml0Tjn<^)8@E;CkW52UJ898NG>C<} zl@^ebDcHp+gl#IsLBY8=5vz{wd}T^Fe?cTAvFuhTSpnB+LQ)X1N#L9LO=d%-l#WQQ zkW~659dZ+vB3P=kUvHPAVc>%*>%z+ZF`||jAElhottQc*92npw>o1=2lJLS%6iX@; z#`ce-98tlSg>4a4^9+&bF3p$dO7R!k`3im)4J(1i`_1!BzjocbvVTF2_2 z6?fDx-}q~C?atcD4-P!w;{}J!hV{|#R~P{_+6(3s?8}A1-ctUc-#s{TgA})F&vGYY z=VYFbe@jAkw^kxHu*W($a84BnyLFsn#)!Pku_*iEb$Nr4)l)E6-&}PK2K#Tgd86(@ zNYdn5ig(BAi%-&=;*KTImO87L277#OU_EY81)GRf3vE|S{_SmpuUbv-uYvWyzjo8? zsX1c$QLv6x0;`F-T5`W0i7|X*kRSswVPvWY^O}Dct-S~S&~JYarr-X){(MXmGJd?3 zz}-!~@rH892q?LKt;IKHd>$!U`gRYDpYMA4_8I}U>XH1o1akMM?{ae6U<~9m!WbYH zX~jBTVzNz~{zGiz{JKe1p1fPgqsZKniqiX01z>|NjgITR3odX7CSrx+gds&~luAb|oT<>XYOiR|zvddP_s@$cn zM|p+kla22Z%p361VDr2)`w**}x+h zM0gu*uD6)DMPal9+FvpHwqx{$f-^`jiii#(TmaF%o*DiX`B!9pz=MGLfT2e>D~<>U z%J(-nDT!RLetdFY#pr3RL-x->XCrTYf9WhPH+rg>l^+Ymt_?s}{Vh2^98^QC;#wzS zquz@1`;d-)JO~D7@MIYAaqq81Ar{)sbOLv0nFyWC?dQ{Y%TsUmBVCBRqnI&I&D+2@ z+TYc-&wI=p&hPv6FQGT#%l3y5z`#2P;*jcW+gEy4giJg2Pgh0z2lycpF=nPhBw{>j z9{P0&;Dkjk*Po3SeklM;;)Qs|KC2QIlCYN81TjSP0tZY ziO4hk9?=R{XyntJdAMZ$A!5Ko+Xi84 z_~w!N%}4hi7+M_ity>&AFn+z|GqcU^AUp2bO4&;D}zH=WvQIn1^wS z&sM0R^Mq4u{7;(dlj!t__!2ppLg$IjP|{hPYL{YbqpA|7uLe`i_ZC*kdUQ;|WU&_Y z)H5^WOg%R<*p6yvq(OoI+u0ftHe_HYMn*=qXYjmq{mApIdY_Nqe?Ff7)3rrsI{)W^m0K)UGwWhBo4Iu}lu!UCzFrJs zYqQ<;~id=4NTL|ir2o|7*_J&fT-u1)q8Zm*mDE%}9 zb*vUz*pHv9EiB8mwY5X6<<--yu(e6r${FyfFVAlH``Gfvz*CysULgB2%kYNd_CiDUD&?};vSQ?U5+ z;lyf_bm_QN-5JX-?SHRd->1005RG~<&oWzrPYY*SG;>V80DSJNP<#Cfj9FpkPk&pR zx0AwWyKX8<^x-e}@3};dQ?`s#Hr{?gzOIN;T&!*~kX2l)p^+^iVb5=`m^rFrCV#Ky zLgf|{OP|vQ)z2^oUj{fZD%9Kp+yYO?Q^IVs6tXJq3RM$iRQ0WUEEn0U(;cjvKbDS8 zc0kU6m7^=GaUCmRlg%A3KCpi8c=0!NDCx?9GuxY&c9f3W99*_wKK*qK&p$^56pdDz zS~;{GM4pH5%&oi28vj|{Gk-Jj5c@*#pAYAw*2VokS+cVI3rO0=8BSzfTG`Hty1rh( zH>|c0@cv;f?$j#p`p5ULL1d;obS2oe_J3C)lR8{m8)FU@=Id1ZEEIXx^1J$c@WSr^ zZ5RYbU0Vn?0Cr6sf@dcFuV5|m7j&S0J2UjAYt0kr$w8#(fKR@?W`LGzX1@mFYYni% zTmv0;>S?l97w>-+sik3j#OY1JW99>cZI_N5IdV9o>e!2w4*N@QM=LAkA;>2-GwnG0@hgmskH-I`(3kwR)#M501EC06{xpt|*Kde-DS!wKx82 zobaXgh6f^9`?Jt?raM?C2=~NWA9MkyV_f0f4c{Y@Rk?cvSr{_^SJZ9jU2u#SJaYc2 zE20bYt3gemBdBBM({3B%isY?&FGu^6BuSS83gY2Z@DsZ8eUJ80ik`HZdCvANRY69> zJI$($LkkU0`o*TE3TGD+fySCU%5NranjMl-5?_)z@>_P|Kem#4!@IPwBTh<=ynDl! zsY(Og3)-i(L|@I0jO2#wBFahf%$g3B=w}G?cgcm$ zS4FXq?Rc^cVbPFxF%WpQnHkq5ql`BsHSIQs?^*qKHG>&%oRE$ zW!m(}^Yb9V>#(BBp?b+dHIcz99`{XJTvW|0gryFr7EI#hNScqFOH5u z#V)*hccc{`#c-4QeMRS4vtCh1*p=E>&y!0LVVMm@=FeM5$ZL6y+U7b9RGSx}6EyjI zEKIlQDbK!9Z-@h?vt5L~QiW;$D-k8dG?^w|+=IIS`K}WC;vW(!+3aWNh#E2x!1$HP zqpL#kH6-B#GHQ;b&_l*llCgngTqOZdLGd0W;|vMP3<7^8xiJ%WJcZB7R9^!nq~X^k zj#gB``!M7&sO%zq$q2UG?}-Ax6-lxW6MkIM19KE#(^+D=B}^iaewiX~f=}uyOWc7! zDfF(Z#Mv$jPnkKGFTs;25l%Wp-$3CjLbaC*rlDHY_=_3Z6E?0mHYueTeJ)h8+h59< z|5F3X#!A`*B}Nr5C-3b~Fri>mQcxibR3>ACApuKI5t;p{97wjbL!A*vV^vUIS|}e? zo*4!@H$^sq5O}sTR}7a~AfMn&yqDk{D*uxFv_bMRgGtJ{>s%mN*;P;F9|%8ufnT>X z&#EHP2A?J@(8csL;>W7R8`NS<8vH$Q!8m`v+m{3%p;*d-MYx_lj_jPOhq19Vlfl~B zt3l>W*D=`O?{_KFg#(qK0^msH2MoF2H%m5r?F`3$_KzSeybN2)g}ac0f#@6^?bn(* zWWVVN8ACtc)UK06o^J(wU8U;!s7Il)736zFTzr9C09oT6{ZA8NoZJd%uY!?9(qwdL z5ipTmT7E|+G=?RD@pU7T^Z4sCIf}TU8O;GKIov3jeBmO-*iGhcX?reDXDg;_hAf2X z^x^Gt#zmG|>_)v;LT%PYS-bJ7IxF&6IcW>HIG?M;I)6;7lalNVu0!$r8H{7a{YvU2 zgBS)@0-nTB!3b@Ajn4KQ%vUGD?<7)SXHQO|bg1l0a=!xJt$<(6&psp30^@=|-F3+? zL{&o*U!BQ+H@;Y#zXEOOM|8qXjBLq-29C_|YSQ($@!QYX4`GRJvXPy4axrRdd|uA` zGcgz+^`tIuJ#2q9hTj<*MZoiP@}_;;lLj zJj6F7gf%2r>z&6v09vZOp0K@(Mg#VdwOKshr_RsjJR!$PyR2?Yp7oy*80};Vb{h6} zg>J?MlK4YXM8$sRUED~=>!r+C_Y3bqOKnR~l8S$Drh~Y|wR8u+w(BVLr zrFY9qt6^T*dNKs8 zo50i1DICs_m=#h+RX_vd$xeiAIN48SovQQVYJ4ZeYvb*t$fXi786vm?A)^hp!DCch z!?RcM=j;nc)Ui}2zE);Nf&?E*va^U$O}cw-8!GB->0{-1lf;Q&3HqP}&s}Fcs>jm+ zbyH5@o}VxNU=P8&-yw@0qC%orYRQWbebcKB_&qz37)*54b#nVMUlON$;>$y`EixyA zh1;6(Z_e6hi1YVXT1U!>l>~OHnhqLm5PFcY^RADbvV>q}0q_X!ZdFxMxo}?0PAIcF z1)#BFAIB}tEz8k&as9jOG}Ix>?C+~*CgI3CL`Y73ZF+5K`o$WDr?m8Y_@-XIL3*^F z=6Q6yqIe&=Pf2vn&(NmpqcgfmOK>#Yyd33}G^6|yRm4|HD7!9^xev3+`x3?@s!p6f z9ItMip)Hg0k-w=URz-+z7mE81(QJ7q{$~pkJPhv zRy3@{`bobm`zIWWqbgH6gDA5fj|-bl_@~pyWpQs0h@v`)0kW254x$tL5{$hS`9@Z@ zi8pfM)fsYR&B6WgyWJ}2(((#aaou3y1QnCO0vx5FhGfaO$4~#Pr5hs3M@AVY1mka+ zCy|b0<&~{-x6^5&R@H$#DGuVe(v9kb9!=CPp=2zHH|vv&>=q5RNU@+49t}cW4(7I{ z_#@{F5}0vYoN1uo+a3)pDJ#{VC_3YU{U$Z@O}I5*c!q|Vk?EXE`X)!ZjrEXhh(&Ks z;Kfz*`HEQwp+D=2o*?h&jo-1G{!w3af9KarqJ~{BO*QRt)tSnM;U@+4W)4h%cH~do%e7&x8^=-s&T+RYCi=Adj0*WH~h5w2X(HE*hHbk{A@Ar<}7Sk#~tdhS2P*cmeVn>Ft@ zhVp09sT4YYR)UNsPK1BN0*wPZo(b&MHZ98(ObNn&w8l>z7YJ`vu=2A{@>f^pN6l=m zD79g9-pJ+qY^6kjGdqtxXm43QYrfx7FrUJAsPTs|3*$ZNg+hlg<%7vpuBbns;HLe= z$K5>=2-j~Ei1Tjg+_j>@iqElV?Hx-nkDdxyXch3j#q)hEe8W?dS;MF>%;SYt-}W%k zv8vgHew$W}k#EX2BMhbPhU2(Qk{Cnmju_9}j5HcoxAy@q!xe85B5;~2rB}`W-UxFn zM9su|QxV^ZBJTvHH{aB@_ix5I9>2%odoUJpwV28y{n25#IAK>*nDp?mE=}`r77%o! ze%+=MZZnaf)ZKbQ^ltc|w&=kGxqyJVrbT#iXl7^YKriLBvo3L4!RITLCk{TY$kpCE zrU5%DWD}~BlY^y$WRH!67KGe3q<#yb5+ux~Y!R(^ldO7D1FuThj4LzX%cZEoc1p=9 z%S=9-*?;IMlmu12a{+dCmMXU8vX3n<)G_ST!~hM0>BoM@vv030uPw)S<+IkS6jm=07{HHoUr2xt^sr%vz7mTak$-ZaWb}QW+SIKRo_~vOM|!bvvMNgxXA2` zL`bKNSYm7ZX6eMQs?z6l{iO5VjQ3+&2mNNfQJ42i7h}wVY(L=KLyG+@ylrFS7`Ao*wwTCGwZRLGE7NLXmWIWQ7L89oXZCD{ibO4{2 zu9dBTU8n&0l~%;IJyNF3Byo!C2Gd&Iv?;f{t&IkuzG8}GgfhU{4D5%ld*TSyqATfB z9G?h*f)|qo5O$+=Ykd+xr3>7pdi8YtZ3NVgGtZXjU=CnIh%+@wt$O~O@!CXGH!sRF z0g_U>BxEaKGR^p>_DD9A^@>xR?*fDqfhqS!1OynVofd&Naxr%B!RROX^Q?k!-!Bb-_B5h%&Jb!up%ZSAEZJpdV)izMbnHZ=`-c%>VFFH22L)~{63vd@lY>ewO{M~1xkqwsg1!aruOYNsBKxM_fs5b@Al>t;6!kN?x3@42xuK-umMnL8H1yhI-!H{ z6R`8aR7%e@;%>?M6=J0n=?9^Q{B5xz+6kEin<3~U7b$?h>+7VIUqJxl5k8&;H}xaX zJ#a6q;M8xjzygV2_{)-RlhWswf!9LzM<eRIg6BOIsmCT>1tEcFxRworIUqJ23VkU01zz4_R^UM?X=lDGz7qDn>SyXs7VQSQU zK}7njh@xpY>#SgFcx?EK#R8X(yBW{Ak2d+&Zz0ON26mf=&gMNX*t5Oc^_&krCy5n5 zA70SfxGk*!Gm5wT}wXd?PoggL`f zhui(zo(P{GmLCi3wmwQVs=6ZdSNJ6$G|0B@^dZ*7zk&KQwf)K8N<+*;Su!RN^A%#S z?TQsJY54t+-^_4VSCQf-q;FSo!e(Pq2oo3 z(~0kGDvV`((K#PPk}+}BDN+m_45o(!x9t14=@RGVF4(=td<9(QN9sOcQP2ycr^brI zOAvr6Rrqc&q(pe`k0u@)7&9&~cW_m_@AqQx;IkuGsllMfT}3rRRhZWZJ7KWO)fn?< z%Wq*kS81#aea;f95joJFDS(slvG6G0ttJbtK4vX&uC3q(#LL3#cQMq-oT_7_68>&N z31KdNNQb}mZJN(UAwjCRoV1KkFYdLSpnxELZ{n3SQN0s+iaok!b~R244{{)_-q`_L zz`B+#rUX#LMhlM1@w7g+6t+!t{$?qunt31<%_o6H?dHSn7BWP`jBYDq1GrY5v)$iO zzGA7kjj+dd_bbCrMa0JWZ%Y|0Ff+?g=gBeveoAaU_Tj_giwCP`0QYab1g9yqmAIuP z&I*lw1CFOJIR~sB;MAo&47@oou11PqGGc(g32B_2m zgy%97z%+hf9wu`Q5UOKX3W9GnDexv9Go+amC?tC;4my(`19wtes9X1@EB+=RXL%NK z2e0ea4L!h23=K_8f7JU4r{-*SXB(?Mtb}L`8ifZSOak6@GXfN-!lxP?Ml@MOJO-o> z>VblUIY}Xyif>Ah3X>;>jtw;y0677$cj`dvag-!|J<(TAlWhHER*PEx7NT&lX#|6Q zG1eTR0to|Y!N}mILWE%eqxW!njx14?A}!O<0enJISJKc%e;bkNW9RNog#{%~9lQ7P zyqV(po?&8Y#qhS5FbYpFK3O1E%lI^}oH_yH{0$iU#A2kG!g*U@ZA{7)7M`!tqIwjx z0b5ea+CNULnx3MVK(*$qbeM<2^SBpkZ@Rl1?H?Q4nH31I?sUM7H(dkTNPs_=4U%Ui zZwy#lYHo#8V70kEEH=uoYgc8+3dzNF`VINQ6Wgb0y&P53Bw1~rvi*#AN-l+k1(QI; zi0Ge+G*dd?GinS92$pR9zgh}|acCR(52F9Xt4P!Ch?@!rfq8P!phXE7DlIamT|HW2 z<^K_!vWgHOIk&+B^rVQ+lfrFliLy1{_74b_$N+o>jvdkfbN03 zh44X)^iA#^3?oL^q)qv}~cALW`uMe7dn>`@8Y6VqWDx z_2=IA=BJxBr|ZwnACd_p(NZkVDbEQ``7OTW4eVWth@{D|S{a-@>F$ z*u&e}H5S3YkaC`*#%j$ry&IwEd^hWp-AFXDYa&}?=CwDV>6%+^S-`5!y%l$Tx%vtV$L&OvqUo^%dU_2<;zMDvZ-~CIzx|Q zvXdYw+IO#S+|rK@>_$7~r!7CHf1ifY^A=NF(LRDh&cb8*j zZX|!qJ>y5-edvj2lLyLXtgnU%6RB5}$pj{85d(;OCf7R4#{tdze1 zchVCaEG}1I9qb=xBv@1y=jk_$s223wqfEN)+xs+qlXS!(Y2V)Q^cI=h1QsZyN2WDl zv7n1XurQ5ZSy!)G*xW`IFf4%Z0~Q4w9K@#DAVt(+uYHg@%BQlf5?L7|SHOAqG>67r zIGSiTvPUHZa{X^IS;t@ zdbp>VdB9exXJuXU#V8SAJw@puEF&W$Nl8f&AW|K$Jt3IcA1DNa=PMhCh;26=-#p=- z+Uzj_06A>gHrjioo;4u7p6KD;r`^F8xW$D)1c9k8AUih~h#YpK@m&`!$bNlnIPRoD zniXI!^}xG_+qO48VOtIF$+DyanzFC$bxCWpg*{+R*aZ$!tgEa5N%w-N_jeDOAtQm? zHlZMduLXpy6Cf(QQ@N5~RLJO4kCOOY=aS~&V6abTBWSFSdtH^v%U!Prs-c2TTc_Z> z8tx9{Dw&HHlO%P3RcJjJWJC%HGIHx;7G1U3Xrxmo`>gi5f%kRWpXz6XoK|lc!cja& zau|R{k{p0w&6bU|A8vI9wn0@vs3SmYN##LCh6UPQ)T&@%z42hbhev9YJ%U~RFWe|g z|CaHOEsZ^!wk8C1e7t`$j3Wn5_JzC>e3Bk7u)w*NQzzSlr#3sJQ(p6+3!IgERmnP{ z*8Z|xa&(uSQp(yCH)nUly9xaorcu>zw(oYWe$AiT^Qx!&)!lNJ&#n}htj+=Es_Ja_ z%r|Gzvt2c$5mHZSg#@Hyn)CGM4KZdaB8N5G*Y8#E5k026bfc z!9Jl_cu*o&zHb3{XdvH8@;(G{W>Ez*zPv9e=5EqhG|WgY#9~lb=w2{wZ7+8t8yll7 zWtIV7N}X)6dZaQbzxy$n0zTfi4(p z0NmOC)u9KtJ}!bAssMV=F5og$*a9*;GaA?phk=iv-3x>vgux+C&5$<+=0<*$i0?VG z6K6LQGYy22Qq&h6C|`kV8vP80$Sr1J-MiYW`%g5_4+9YJu@c@kxAN*m6O)&rCfzVS zsqcIgT}X7ut8SnQqdp{R1C2#fQtcljvT7gAOL%fegwCWn@7D4Vpd0s`+&r?ZjE&1TgQhOYS!p#umnAuuR{xE?BgdjZvM) zC5?8;RnRh;4bmHn8(wtB$zAWg+;;T-evd~_^JDXF-2jj+bE$WVVsWXX zCOO}Mu9v6!?TPA&iniq|EQ82sG|eyQaWkL>Xv=6P}3Dm!(T z#=29Tt6~MJ)P(6D9cw@C92b(?*z$92dTDJs?8RIhsc6Wo;id7hqM$mHaiimto)4;Y z^RKsTI_$msfY)>Hd;nMFpX!}@FokeL3_p+-Uxsl^76G=iohG%tSE%}naZH`b@Vzj2 zc};{Z9x4njc>MuU8dq~I`b(tm7eVd}mf6L_7l%4Pff4LJ=9Dvnp#^S$RaPnRxDlSi zx#jKW4_+}Cn_BpCWgT?~0IMs*TsXMdS8a2^xI&+S$r9c+Nokww0~Xa+Kp&t}qeu-% zKEXW)uK?`aV60#TLElX+BcJnTi&5Mv5M(Z5*I?{kyj)I3>8nLMx?pA_Kn{BtI&Cc` zZ;-3tiP4_eSjRCIabe;)(+Q6D0cbNm@9YRP1p#BGCIODNfHouCiNodyq82c~aV33iLrAM0Mgce$|GHp{ByH)(a4{+|Y&pDSCILw&|UtrQX zfv0B-jKQiUhYj>RVT&!)D$Ajp!NRdY`)^l;h+DFKTWiNZ{G*P5qFCL{fF6Cp;o$xQ zsIMXfgDO2-Tuh6kA=Ez1H|OJ}M2 z-4p(=cJ^tM0!_RyRN_CbL~2Qay(U3Z!hY9))pixpidj?mnA!Yt&Wg_`^K68kFIM7Mw|22Q-YhwBgpF8LOU4Tzq~t{qbzNTJq(bW0v%=7knFsrP3tPp# zy>6IH+1y~o&UCCGpmquU14_qP5Mr+yLj2KA<|7KMRcp zI5n6E)9k{f`Qd}e7>NG&iraQ*p`c@M~y z4L<{fOO*1w)4GW?jsbQ(4#2m|<}JX*FgssA4#>WBo`OUyF%l1}d|bi~P4z9tJ;T&j z0Q1VH-b>A4Sr8Z6VRBLckji}kKN?PfeS&QP)hPT zt+Llv&p=YcpX@sbJ|1`vS`X{FoXz>6as>Y5aY({ zwxbUFFYc}wU5GB;oqMYyX!FLw$dYTXl`bp4R;r0^vFGG81B#ZDGgZOLrvVLMczFNk zsT-F!IXten1*~cAq1;=SUz<7Yebkb7{fbW8uJ%2-v6U;kDjvm^|Ghc#Vjj43_7tPC zG}mv|G*df`5#cJpXe514kT~bes4PQ!`G3A{FRo!a=60;^aG_CH(V?7yJ(@X$9V(R5 zeS?`*);>u+%^05mzkqJ>#+-Bag+0j53D#~&{b}N6;(K-Y>E$Ux89qk>j}l1MJ@82M zwWZZFcOYTf>W#G@lRtib07mxoZQmmAyw{tcO>e)R^p;|2f`nH#p73@!;0kcs^N-*) z{7XvK?ANGka9=ndt(g)P|&kr#7c|3B(UXUjZ_yF6&|tJGU? zqwA2mm~k*PGnn(|&DM!9z|=X2^vWK{2oQCpaS>qR0QLr4G<4p~-*w;2T zKg=DEh=3)~$}5fk6A*#qj=x8UPMLq2$G~5psb4yBsy~m&f(U2;;PtU9a1XPwiFM+H z)4_jr^qvd!oSNT0;?LSYX0q5FI<%ZIc|DR{QM}dQpS~|L-_!qz0#GSyGHUCMH@;ij z!-A$+89;t$W!E1rj`hD89B2FCx!KVO)|O_KA=(>@D5WI@THLL$C0axajRic&L%@XO zEGcv>iT3iQ$>?s9;+ZKm5^&ytx0<;v$#>W9??4~t9l4Sl0umy-zE!^?jvA)Q4H(?m zlqzTZ%;<1wp_!Q~>AMd7J4f;fvkb&UOtJ=FgD6%Zala3jF(U+~aS1o}TV_3mA5 zEf;*c&)t2Wd7N^e!Ppg#dFcKY->3p$1N;jsE#X4`05OYTOSw+zS}hb^zraM9<}qO{ z=3MYC7uv`L+JbBS40vM$sna%|4^r$>D;FJ!k>F@|YZeh9%COLa+;~KQ5rSt1mX5S_ zdU=sCQyO8`0h%{@Vc}B0OLWL+DS+!ITc+7}?!cyMUezEwwr=(?>VJxG1F;YzcVZ%zjf~;{ zmb9unYrU9mq&j+3ee{{~1%?rs}EzD$a`vaG_HIFyepgckS!;jEs_X;Q{g~! znLw{Xk@S$SvAZfxDyR(4N45R)lV(x!{b}jn`j1a;jy~|VW8^e%`{rnKg{<6Mf^N!0 zuC~A3ACl$f%9J6Z#M$IzI|m1`4S6cMmA2KRfb)JCI%qspSh-MD*s`sNdVEz(N;NZ2 zElXOJx?A5MA~h@fplV}DaA0tmUYQW1Oej@tgIKwB&(0M4e!)zlW#Ca2NO`gO==0@{ zn=2hRUrZxf)t~09tN>hj`sWJpDsE&RLmKRjG+62I6o-ZYhojnl@Q%j946xo{8JgAe zvsRo$FMN}dbdyP0?C#5>Z@+xl!FCmrYxpcX4mI;-@9O|S1=|y;G~{q=dmS2-R_aK^&Z3mi*{>f4+N*?L~{lZN1g!_ z{V;ITfX6Q7y7SRxht$43CG*2f;B;MZgpg9*Hl6G@pz`yhtRa4_Wo;66IRIl0L*u5; zyl?1DZzaH)uQw+K8UY3dpYD(;#%&OYGF$@$+Rwiu3BCXh{ns!A8Y>`$xj%OYH23;- z)tnjHhDZV72OE*R>3!O>LMpqku)Nr4KfCqMmgP{|+BeS9${k67-2)5EofgM}o!w8~ zkR5>o$qXXAjdY5ejf`D`k9ysF$!48VT3-IP1W!eIIeBM=mgdX0V6lL<;ES-&VD-HT z;#1kQ)WPINa-bBiL6=ap%Iv5Vbwhw(&o)V*CXio1?CM(?gg!!aky8s2_a7jwDnLF( z`z%OAZ9Fj0+k>&BbBJJ25Gz5k7FT3w zQPj)?aIigbKrB^5wK~N?P4LqvMaHQkD!cANn!}XeT9$vG{Q30fG|WwFYiBr1XJ~g= z>=!GvY1Suiqb;zd9dfyDy!lwj%G#$F?79~goS#d5*Oq9frz0GZsMC?%3)>1?5i;Dq zU{|9fK}I`0f=m#l-F$F&b7d|LVK%VRz@f&qhjBK7(pI1dVqU;w0_QMP%Y^O( zz{+}mfN44X>KZUJSKZ;O<}g)yb9AT+4`w^Yp&q(j5FMG&(z1OTLY-Mb)n z*ME)RO(kcKR#yMSk#5f?$yt?$)zlHI%u6i+*O>i45<*ZK!Y&L1Dm(bXzeSRyM#~pm z0==}%qrX3SiUhies(_X3Ut3y3a;2<6ZXpwx$`StVo#p=^Vjyp7ZEb9j7c>A7WF3j^ zt&6m(5Sj!TNug~qU}Ec(pqh(F5hOx+mKO~2{ujCJs{7yXze*kQg~(*xoKHW)j|K-S zSk_FvAHKEz=0q8DXco+27IQeZ$zx)Ni zgJSb0NP$yOEULvKhCTj$c5DOEZTbrtckMoo z4Dj1qeGL(IF5hCCs-|&PA(%QgW?Zaba?JRlnh6CsT@IQ3X_>7YuSz*X8@8>MfWj|Na0i1z!kG(dJq{)qUbMjyM!#c@FO;q*&gOU!4u6=k8uuf7I&<@`dRU?^s+tc0*J~tNiD;Xn z@wQ1XJ46vyQ{zBAd^f)*S`jGf(rd`p7Catu4b1Vw&m|6^Tvm0s<^+v2wDiPz)7=JiP-2KW?Q14Lv&;9~1)xEkZ`UVjvk#+~}F8k%bgp;$fK z1*n?ttRRc%`lBvCFMK^yHu>k|pVMX26?dY;R@=A6b;!^-F6^;eS6M7pUf44y_Qw5> z&s+|Bd@Ss2*x9c;Dpt#vXeXVPY099hJWU{Aju-Q|A&QzDQ3sQnj2@zeRkotgl zuw3?CAH{`qAT?3!<0%E1Jkja`D?3^8_HuuzQT_NQ)MG}0Z|(&Tj2#So)8BtjBe3$I znlV3~!eCf?eyaxXkZrR6OfU(ae^u59$Bh^GRUgwOAm_mVH*db(Sw2R&dZ4uz>Uzp9 z73!%SV%|S)uT8i7F%9t|SmMtm?y^1Z&K=qxKc;Tft;-P?T_5LiqkYH7nUSAo|48p( zv$bd}L}o1-?SvznJ;=JvalaXQx%Tak>a|^e?-=>;@WaEUk)=`EA8*+!(P1kmoj9D& z#h@74X*TdOjC7vm9W{g=voJ)wALze%%R1!>I7YRQFagm%I5MQiY6_p%G7;ss7Zy4V zUG+lD_F0~5vkqdw{}zKDb2X|3e+h-$27_a3hpXIcgJbr&)@RsHJ!TH%1MB-;l zGVp(MuYI?Ey?;ONHGF;kkT}mUp_osi4c^*@;(k5rCZRe79ZdBLVGNWPUl%oI0SE4`Zge2)>_BJC! z%OrHI6y8n;t%E0rMCdWthLTZ%#5esZQ|D67+fr;_1@fvTXO{nL ze0q(`9sBFI-$1nY$i?>c-B%BEGA5H2!)X~`@ht&o&xyHm;5G}0SBIZ6PdxqWudBbV z+W*{+xw1d1xt{&BecGEH8^ye0!7^ml4aPR>JRiD(bP({Nj)wl?wEa@H+XGN=)gka< zT;qwYDSVduA=vdsq0@Mfg%?jX!ytx zr&pi%X*mD$hviGpaR>!Xhpnw0HM0$n)k#uHNwTezQxBx?iHzmi+rXQGONZf<+^M)~ zv2dVt!Em=Z@TP$$ZQefdP9#ZQ@54_Zs-A(z(V`PIz|4TI%351|;CjP@D+#pe3gWuz z4;}UXU(0~FSle8acj!nVvo;vScwTjgE5;KyWat#;zJo2tEB}hIUaaM)`w_4-BMUdK zBw%Morj|{k6285h01KlHwsS$Erk8t$wbK;EHm3U+Dk|pcIfk`(H6=gXuhUp%TxcHr z=B|g6T}Z*GnVFn{oEaK2OZOKr;FVHhk%POQs}(r=szhwm^t7=GfA{y&Z%*nt{6t2! z-*V_~EeZR3l-b84{Ug!F#>S#`*C~;oPW8kF>t^%}O154$n3pmw7d_=UoB5GWYIy$M z@o=sqHp?-?pz?uPO{tZ}tEyB-Nd*mKijyVPl4?X$BdQYBv_x@T`kI1cRx>4H1E#06 zM5}rt!@oJH3@{QRQcIVe3{5n0&ZTzO06~kye=nKtqN_zQEDsWM6j!jbhU{hXuW`LN zsoiyErM~C{qL_$Xq1|5k!uevNi9<;4vkD4h_HDc!fj@#Yl4~I;njJ4K&aa_*ilUK) z!%#HEc|LwSEg#>0;q2(gV&vnD9WJ8O(Y9OMbJ)ws)3~q`JFm9EQR6mPeO%+$uBxOnD$leQIlW!f|A!_i= zzh6;o^q!N@ArVD2W%J`DpA38ZQir9KbxnO5z2?S}t}yC8(Px>cDtOXh+3QT*_&J^t z{S!8WdS5clq|g{hYp{!W{jo!6A;rO@BJ`Nm*NNQ^@Hoq^|M(L%C^sc!9ZWP^AF1DK z%>6_8;K%ob@W->1f-tJ70-q#9m{dpI=qf1bSEL}gl`q0ni!yU5JAQMAu6mWa>MZ zm(gm@5*x6DaDzUqY`B3I{)&J`H>9-o$507}le`-0sd}!sp$QvR5o4@a3EoRv=(BUW z1nQ{CFes=>1@lb2ss#G0(w6VIa&kJlhvEkbQqLs8UGc4|CcSLp(j#M5wJH*uJZTDmUi$kc6do z3SY$s`Q6u++lP0tQgs%8ohaX+o`zQqPNhA62w6XZfj(LfQTmDNH7@XQD5~%Mky6OD zvojOsI4wA#M0oNh$O--Ol>$Zq`@AWT=J%0BM8U?P;}H&7*1 zr(sW557)3yGzsC~#;;2+_B7&6)GiIo#~q(hujZJbmxjsD6wW1M z_VU#d{w(L8Lx&tEUPUM22CR6Ut=u*^2*mJe!h>d>@JJ-OVkJT}@LlJPaq$xpl72%( zq0xrmT%kvP!`8MT@-q0-Wc$asEb>r^P%S;%*^m_Eh*it96U7+EllU>qnc~tsvnZcI zH2*f~=FSab7+kpCJ@Ow?=#QSfSmE~A3 zF?ns&Fa^I?H6)&R1-FTA=;^6Ps1>-(W1fI3z3d$3SMGeo&r2Xx6aBlsN;>XT!)bk? zuJ~m?jW;$UGdR*rj0`rKD1@F7a3T8&knf}=%=n-iN>UUlAK8fUyCa$ShmK&Qoy@GKV^XJl7n$F0E4{-se#Z2Q=q285 zpK<8tcEO#>4g|kE?IR7x9f<|oAUC9_d6=!J>c$-GkW-=QcHBY{woa0q%rk-i7$-FQ zk7AeNP6^azMiy>2=A#M@UBKh~*ux0Z1FR?dZv+Ju{34_C+Xh4NCX6dC$X5o^wB^`m zQ!C3uh-rN0yrpkTGo(Zu4<3FXTpV>Uxuj&TofFx_l5UXTL4<95TfTyn0m*C;G24oY zPoKJ$Rg_f&(6dGN%Kca5Q}nhyr-q0 zs#qyQpv>iS>Av0P&Y>LhITVbk8Ik;p>7)@>qRKf+*wEDNnNC2~@)= zX=_z0zKuA-wM<5Mu6iXwpoh>ZmcStken%PDIA;Ot^N2*|TjA^hT*l1f`RHjk@*{ss<-C2?my;TSvkC%UBOWBd%W*`x`4i*y`NV$52JKr65Uf*po>p5n{Zwd7tN5)Ca7ut}F0Ck=_zAQu~?H5n7aQs(d^kLMi2kP%FL@?vnAgDXwVoow zs$Y{=Zv0+I7zIkjz!D3z^;$oaj_UAK#iV z6K0Frn>6E$m9-aQq;wkCVl4e+4x+4gV;;GwUrsPh*?5`msVC4SwvmB6*m1~C(4J4M z9Oc`OKBIy$*}^Z5vbQBq;Q36-J_@uR$J|wpzj?NFbJ>)T-3hFzq;rfl7F*=36c|6F zfqz@7pw{_L4r^Ztb>Yvl3%Q&H{XOEQ~VccNyV z8&=m%?|PCs&Bim0jtY<77UKUDCLXbWQkzCwKG%PWP2t8^3N@A0t#4^u;+8=Eys;sj z$W1I%g1J=Ybj*XgXvw@wZ^BA=ChESF9~chYym>faxu$Nysnw6uYii5G;oyN0@et0Z zgMxn#Cwe_`((~nl`BZfw{t+@e1@{vbqD_UGqLlm%6K18|ogLiW4_T*I#CI3yS?Acdq8Mzke4R=em7~O3Vv|kZywOPG{9K%DI=plW!qBrdVj3l4mtZ#3dkE-g)T}MY zYTE2F>a_wadySRD3=}nZZC8aQiVkg;OnfPy8^ONKd?DJv!@12<-pF4>F;{NZF=XggH*2J z#HIl0y_+~^))k`7Hu1c4)A&p*V3)8>I^l`qHC037DzraFO?!)|3jCcPfgbWKkLnsH zNMHZ(M7q7XD(2zT_>E73yFa6LJ=rs`lTUnKorTO!fzBzel6L_rZEXJLEQFM;ml~HM zh3b#62P^BqsGLNN6z=1$w3f+sYb5+MMvKi?B@(8#O-0QkFn zxrPtW4r=NE^zV2676||{x&Q!J3m}%Ru1<|ur&w#%I^P7N!_i+j`<$YmOQ8?*%WdY1 zIxUJ$QsRa9^Dqf=+{4XR2f;1|B#6kQlp=q)Pc}eH&@$gcHeg(Y@bf$#K4479MH{ff zNdO6L9zWKe4I$$J*qo#h&leRcmbZ(m?;N^Y+}R*Hc<Y7G*A8h{($AKrEHzF&k- zMkZO>P9257tT3Aa@L-^gata;*?sThCw)rO4$B(0rGE&ujp2rxLOg00%BenCFIB4NQk9C#g2PSFN`eAm5K`{iFUI>klQg9Y1QPsf0NTS(6%u%URd&O&p;$H{yQ0<(TD6Qo)2a zyp5DNt{!}OsbLB`8wdDk;|iB2H3)(?>Xi8Im(`U02A?thFZ>T4Q_VsCYQNl{v3S*n z_R^;}Rjax9W-s=+G;N0UKs;kY8cp>9U5!Hh@J!C`Jgj3e#}%z!kX1 z)}~!I5%BZv$)yP1w-I2~5WJr6`0=Cd8cghP0?g1EKh^;g7)pURK6O-Ya!tzEN_q=m z8780(Ff*`d`~Jh1o`%4B2`<3WS_o4kOES1l!M~IR!#E*s^ilZ0O%S4c+K7J|T!$Pm zM0gqZb?=>{X%HF}0j3ths_#!puqJ#qz>@z^%6|;@9A5VUy^U2r30@+iU;EP#<(Ff9 zjaS`7L{tIa+=0*p_-KfAO-gq!0$>w@&|{Kj^`{~da6UV^l+NG5obIq8;(L+c^GE?f z%>6zT#!++u`?>eP(#qnb~O;x(V7En#4-;W!d{ zQS6N7b$(hEOU)Vo_Wllbg(`lhC!&Vm*HMhxq=A7Ywv_1x_o?a7ot=vzv0n#Z&dGB? z_*Tc(Bk($zBwjv_MwSt|zS2TWE-^sfEI~*t*NMeF4$o>6U@Ko?m9JmkyW{A$?Ui?= zUsE%BPEp50?o54- z3<-ZChQzLK@SXzbvVg)4yI7vyK3NBacFS&vTBiZ<$Xg~G0fH@JD!k){uZ;O^^V+*-?)jr_-GFL)6?j82Z2ytK=MTr! zwlDtSWf`*V>E5SD+7AX!U#%$CezeVNzujEbpM8ael7(T%4_dVz|6p$N86W= zJl*^1#lgUb-Kl?u1U@hSR5Nl=gw<387f-y5&%pWMjrs+mG`Fi~N1L?VHXG{={ATQt zsgslCpWepNCXr@M^dx(GG`Ynl5edYmn1cNVcx)hAgN+;-M`0V$krL!TcEQSMl(q4P zfs&jKqQK=oQ=1iT6FSbFl8R&i{Dlz?Tq_HWty;!(X4_VaLLqoLzM|Q7KYz6S<9-OM zy#L^pue)9aR{uE`vMtOq1j^*;zE@7KUf4|?p9hcx6ITosOO#Y{@qi(kIa$yqRo3C3hKSRPY(f} z9~v=N3Xs?BO|b6z0~?r~`AP~|=OaG_W_F3LPoiT^gut8>pyTPgy8ye>nEy16;G-cV z6*B4#;ZPw5uro1B#~>LZUS|>XDdd3}<`;4g6hR&?Eb0O}>38;lcmx&&J2Hrl1Xg8c z-wm)NeaoHa;C{I6%XDSJuCs<63*+JQTiO{aNbtzzgoyc_!OuGv!>&e55vIc-USjCK z$qcjB9jlOJ^qO&*p|H!VjW4D(r)yeNr=N^e*L?m`SK25cmL&-RA|*06;jGfHh(?{` z!bqz(vo~8SD;n>(Ss@l!tm_)5p(}~)NHfAoQl)T`>6hb;M=5`SCM8>F;j}Fj(zs$E zUO_8p&1OInXCyVYc4+Xk4)?$`N3te{^Yfydpd0q4BnPH-mg15WYXd+I3mCs#t6hN= zJf`W$nnqJFGzrVJ46Mx35A{k2AxupQ`4D+I<(ZLN1Q0%>!_4e&@iafPul; z4tu#MKU;DI5V*xbn#K34 zoDL&+i*I0ikr#rXaXQ@l>f!wx-uFKqe*ZlPDQT!UU0}7G?}PpGi;VC zcKsu#ZVG74{A`jP^xC&>-FmG2PuKWY$f5?Wm$r`;9B$otD23if59c54?!S0me&G;TtN2KmCnlG8(~a%Lg&OTyJW>g~ObwU@8iiMz!CPx6lJBsI$ zj`fc>(KpC?6M8yt_H!{t5Oc>s5gU-3Ss&;_$%G(*Vs$vc6o7>vlD zVGFl9D_|(mA?Pmc;)Fx>{^v|s$;8`6Ew<<1hb7Ei zVd{^rCAmJU7BB#y?iXNQ>YCk2CM#?pc<$eaanHL5+JiX+dbH=@4w$Nb_;K-X_y`js zhfw}|>>jxB+kIv}@8ADt`1_yC-hcLc%pa)tcQC9vqkbUL_Y+#2u{6z?ksVqL`J{h* zYH_+g@Zus&ftbk|T)A64Q17`u@Sy(cO7O70;Yz?XV|e!o#>K{$)74XpQG6k_%!JkN zzD}*gmOd%1JEN|mF2pL2P8)PTPLMbm+d?T4H^NfHjf~Zm)dQlA8jH@|=YOSZekd?X zZCl1xtE?*qRK7OW&!ETTOaWud{T9A$ZHgJq`*LLuR$x?qBepmul43^1*2oFQSfezG z!lh#S$c7l!C7Ave*Sd63GEo83AY8AWWXk2vGNmbS8%vIN89ue%%UA(cgSH=FD~1@1 zkVr-iBZ_bRVXt%E`oI&x6YHOh8SAX|jKP&8zwn`u=VB>qJHx9RmIrSg2&s-99iaI< zv0j*@leb1PFp&)METj6x$mW5;wIvmqU%rbWaVs?ju(lvF3=A(jk9+;SP|}BCaQa`a z(E|*^jl&MT_pbE@X>GuD059<$Hvp8Z_kzloH zWNsM58Y?bmtWC{GXjDZq7=Hu&4WZlPjFv;MN9BGdw*!~;=pnoY%nor%ufe!G46P$n zAZRk?=l${>`#XA(yuuy-GUh3uyBsFW{l^V0$3t{0e-s}%|LoVZUnNf8zXJ^7;>F;S zzx(f=|MhI~h|`TDIgE!$HU^bua42Nw7hLUxvkG}6x!FdHj2tCS%ekpCBA>9Xq%y( zUGQdWpc%=Xk~E@~D4ou7bi3I@qja`7c}X5KRan+RBQM~=Y5V9M+fC(E4Y$Zh-r1Ux zWbdk{>5}!OQyWAP7-oH;b{ztLgSLVh3Jg#*L4P|GAMQClec}jY2Ej&L41V;m=lF}N z(~Aecmjn1Ac)}Nu5kV6=K_BfN{v8C{@67!AHF?76e#oQZM?pa!d(IC*uJwAL>_MpS z2Sfb&(PH~@zdsBfs^h8HM2OY(}$*Nah)^u-_M?>`NI89jPY(Ibt@Ma3h>;Mqh zVgKGBO%PU4lSD;GQB18DH1NWWT(0tbF-2|hE}u>@%AxU&MA=>gE61n??ZYtWomi-t z`ox%6tYAz8Pekro9$225o~WkZoF3?$4qJRNu^4iz{4D)r%KHB{^S_g9lpGY*HIP_4 zkXfcpKn|xt(b!eqKp19&g?=YJeWT=HWr@d`LqA^sd*#75P)b%H*gaZI?((S2E|~KG z2v)&kJDiP3I*GLJ^}c;=5>!~>wyiDWy8GAHuixEyrSt6j4FukbD45Q3iv}@ryHf#9 z&3A6mSUZE+WZDMW7HNxHhCsgiJA2C!r3TLj4o6hR$7}zRcJw{MsK1~8Pp+7hBdm2F z;gf&!0h;AL{MCcWe@{8>D}MOnA);5FJ*y6$q{GTi@U7~IW95;cAcKb`J^c%n|1C|m z!$5UV5Ul=W@S*tL--!4<8@T^%!0ABR)vH+5aW1~H^z67y;dYIHdx4s$SawFLP_41f#3J~y4BkX?woX?9M41%5$ry^S+*t{#eFN+F-o3@keIxVw(<^_ zdo~N$?K|v$nF;JrHL}_vBLST{rB*AgfLowLph2AiXsa5=w~zlj;(}|O4irD^EPl2@ z+>Oc8&#oUia^!GvjT5|>**rx@U{()%oO*gEkJx?tG41oaL;>jLhm;~clEEy@#WP3y zdxJN`%AxloQ{GBEpe}qt*h>6Xb~(Ie1Vc)l-=c?T&Viqh&K~+w%luvIU==`OO3bjkKy z;T8r27lvkX+{Sakr0jASfY`&1eha~s*VmA6z7JklPk^2A({Nz=&H7@kB|ygu!v}_H_f~l<+^(vcXH@+(WaKfz z=cgA3rp?!<)&~EauC3*b{wx1;QC;cN82LuIoTA*)eV2LmvMsyV_%B#nk&~j%v7A2S zBZrpjjuDP_jTRa^q-j&pc2GO(m;2YW&0Dw1N+#6L+(=EtHH|io)-Ppw8p&h0+2k(3 ztW4o_SUr(!hD(iSwn{oq%QhEU&_px!*r) z7tc7n221b|p@>Nq^AKEFyTO#m>78r+z2)H!1HTg-?s?x2@>}9t3{w8Ew+f~So#~;M zPlg9yd^lNs{BF-FI|P5}<5U7V;F0gZk>bh{NC|@8Kk)1Zd_B|C1DZizIe&EPIA@1) zQETxgiA)goc33h*X-^#b-WQxEi3+kVr(_a#$Gz?KJH`FpZ_7R2Vs(tt(M_JhZE5&G zQOZHM3_-1OK-km7q@a>7OUWCJe1WNsX)9^`Y1brDlHBCp=A1&u$a?Zgu`ar5AqpzF%J{XhW)b>W#z>@lZaA?;8?&k@--N?~*f-{qQt+=z~F| zBB7_UBnZ1|K{(iV`te3*s%tLpEN8pmHXe-C~7UK^lPl>4k5EPeFI zOKX^cEn#lXo@sAuZy>%&T;hrdc8dV(rB>ERBrBlX5SI4+)XoP^qhLLGpTM5O9sNfo61 zCjq2_Yfz$V{X?++lxq+y88@{jpM*=M^npST+$MS@>z&j!DoGmjd7#c#MLcvV9v_8e z=G-42*|BqHh&_f;57HEUL zbf(hz4+0l~CXW@Qx#0~8$??Y|7^VMCU@b^`F!01{sQiwBM}ENXll{Gu5YH!lcXeLYzYhLt1C4#8Q%+4)Tj?c-`AG}&tkR~6(x!58 zDG+7ixzBm6*sbyvF~9Z__vl~Rp)=lmhq)JM3Tv9c5N()7{<*fSL`{X(3-9?2X?tBzz;4>3S22Y?7Vs9IJI>xCaH zPIUM+?b}NOI{T4JXM&M|hMNenprib1fLMC}5D26XEtm#=50Hm}{@0TrvMbE;qsy@>F5VZh6tNQ+4U#OMZ%G&U7 zN8}{!V}CDD0YZq-u->~?=Zr$3CLB-TZ- zKYsl$KZgF7GynG!A3~g}+H$!uC{`?rg}I|4BPbO4!}q`8?#Tc9Km5O@sP*x>tg1vt zv2bC@D0Ib9=HuXiMy0Z#P;pP-053MV1Z*^P*GWqGmy{oOXgBg}zvCy2q-aA#G*+_y zeClq2H@d7{#%vfPHX~yc#CB8wSm0$YVMqvT8bW$WX|1rUGR;BMM*E&Kath zF0!s0&X`7`cQOtcN*Xq<84c}Yln4syv+i5X6J#*FOlK<$8Gj3Qrv1O>>Hkmv|4j)@ zrmgN1Y)V_*D)7d1G?LA9M%&0(;O(rS;NJpoelReopO{G$##qpLX8z42N)WZ)W%N@J zxaP-vCvXs9J_Q(x@LoXw-9ExdGVqsrBcFOhyYl09rN@cjDZ)l`F?UXW6j~+KZIf)h zonG_lQsLlcN4G@=Ib(T3el)${<+umSQ5;p3BxR9qLVSulmV7zAfQ`1>V*Bps2jP;p zAF$mRQ7OARJtG{ct0kVTsp{^fF5D(X5{F5*+Lwe1yl}^;+R0>*s5$}{nS})_&sxV$ z9+qaU6JbHYcTO~lD+=V%h(+BDZ7q++3WKO%xsB4$O4>Z^WLq%-UKEChlbsx@EG>#s zCD`)ZHjXimPfXqH65}&6DKRB6G^qt-QyTo@gl`iR%I<(GmVB)5lmPS}I zmF1`c2`OhUQ5+QPF{&EwTxf%Os;r)#dXhqmh0sWU*$fTWJ{{7eo(4gi>+RIZ;L`Y z1@38bMcVJF5-`b4Sl-MWBR8{jUPd6nG_89xcb<|b<;tF|!e;3b*&^mb#sThL;_@Sx z&GSbcRK(0j+&nzoN7HAchx2)(KfA@5+~zvu!V`x%v`yyLdYIbQ(H9X%=M5PQtzQQ+ zMn7H8h*Vq+ZO{+>^5qNUNJdh^($Z17Xv|UpM%ex#Zg&BYT9HziDyt!#Dv<;&(2JCD`{lo(3sTPsKA%h+NrBSHR*^$-tNj&QTyX@{`cZ4w!8RhHV0%#YUG@fY!3MM z;O=1|nnbW^Xp=LSb5ARmJIaeoU}>nwkg+_hQCL0Bs9Xcis5ApEG})L9m4q=yVc9I% zP<66W{9JJj4aWYtl%u@dDcb(CFNHLUo>00~af-qs!ty530U9>M+$S#lQk(hX)86LY zj+c|m%~HoI3$aFXnTaU~ad4$$>=T7Kxp}!**;wM#mdCvxY0c{odUP4C&UcJu-%`G5 z>z=JS*6AL1e^bMfL&F`hBDRABy0_x4~->hnlWPNhzf1hc*T3 zGHWeWR!xMGB8QQiWiyaAP5a_1$(^T-i*?DDw^6!cl_;PfL`hf5eH;2%MeH(!^gMRC z`8Mz%376icaI!Qn&y6LI*q|P#AZMoRX+QEbY=X+zI&sU;kfEi;n7gpPh#wstYFiDR zeLKR{pnvY1i|lUN?etfbZhZ@gTrjiZh0qu-vscCo;XqjpSzX}6R0+!z;6Te%8HvM= z(llMSKc$OC!{IXXo|Li?M8L{=TWr%QO@aEZ8#l$+c}o;Kzu0ZE((uiDQ#gAhY!~V+ zN0q5mlQvD_vC(?><_r!JF3o#1?ey!IP2S=*Kh%DxzK(w6{4i8)No|hjtNNjNUTOw! z29+1DP32PvBx+|U5QSLkG5Xvwbq1WMQUNqdnjp)9(P#D72i2L29JsI)HY2jVJPTHz z)mfhtHKWPL66LHf%FiRMEG@>`7?&h2t?VC7c=F_}O|BFo>V)!k3zpCv$}m!3W0GUZ8Na%b8F`)48@G=f`M#&qjjGj=+h zbI^F|BOQUn)j;C1q?>@KKM1wSW6%O7PY$QHj6Cp2Mf9C4qWqczvLymW5j`njU?HZT zK4*yhg{Bxuh&_%aO8tT?H@a1t!)R21W%!&ROYV8jC=50lWyHnDO1>Z%HS8?N&k-A) z=YoA=Z5H|&4RhZ_&ElIA6PsSL{pFe;Yjw!_5#u zXxc0x`m3)KQS+M3(qW+8HPuH(U0SFHmY>ZUl0e5_=J|YH^i7E*vs`9>gd@6ryUVdZ z;>5HR2#raEMuping|;n8%1T)_X^)9EZq10XQK|H)l&0P9DVBY3o>@U&ZhhYzWxRuE zbdY?+(jwMutk^A+?v@Gm=uhcXH?T?lmiDu~dgt`r%DX{UsGOEXPV#X07uVWUZT#W<$YO zBTke|R2`PJ4sA4pi5ixPG0L)LM?1eMyI?^-e~j0C-Jf5KEaQnxa* z!sFOXTr@<6rZ*2wi?2r}Pct?zkIshSu4`!&v}tE`lc-^M5|YK|Qq!krf-K8uGm(s$ zNL&upKS1ku7H=uIN6l+Vff_d`u`G6`U!-&HYF>;Q>YCY=Q?A7sXcYz}K}yEW={R3# z(lWOqA)-mz4%9|JoACQyOy9qvY#af5m)q_sHi^(g>5)Z^$K2t3u3;wambayaF1 zs%*C&Y~6j|_xe;oDlb|6qnqT5F6nq4*vK?E_Y3l*w#J5v1y;>aKKE7X0B%D zLW%ON72d~nR4tmDJE#^ZIyyQeVt?QFeZW=j%DxCkwRh>yXGU&gFsyEU)tx~2X<3&r z`;9J5>!J0RwV(d)k8h#r0R=uOw0>JKeBbD&`^IQMqD{LrZFkuu4H}l-;W9oc6~IY! zFE8Tk2w^n>^w2Cdwb?2tDT^tfTA)@^H8Qmnlmm$k=}QfWkdEY>jT4bX92noXBxS8e zXxzr{hBgem3G))RS_)K4P4(8*Fohf!x6v?#*`-c-9+O6vdgokCLE~ZfEv)1xGOXlM z8P>WY*{ER?POLu$^b;Ej^pd~6wv;e$9Ghi|kSxJ0kYE+y()7|i&fHu+IzQIh-d0JQ zkiZ)+AfddOUmQ_MQqlwqAqgQl97$Lj_WgK5wg@{cVsKr@`y*(g>pFgh`i%LmWe*b7 zJsVG=9#8{ygizkQE9pvvUdxDf#D7w5VXNLcu|B>ft zAdRoq#w1P6X7`gRBnkUv*ky@OaFWorrQ7w5RRSNRy8Y?)r;oyeaJPO(86OoIT?T3Y z!=3_0#I8lfa(m167FypzdT;vsl#~h(WaQ!{{!N#Jj2l0HIlo090rM9q9!%?g5fkEm z;n=(e78@p;2q`65$R_fOOQ~%}Ubxo!va)iGa^Nz$moKo#Rn=p2W9?&xs~ueo%?mlm z>-vzQVhQs29;kiLH+H&qyJ^s9hh}>UEwjb8h52wA@Gsp5bYl;2g>s4kK!UF2et4n7eBjaK&Wrchl#_OE96FIw?A+`z4RsDYZ0Oy%N40@PiZN}L^Od}GNtngb!_(XW%ZPp-< zUu76}&C=$(47=u6Cpt2TA9Zm#S>1bab58|VwTO;ESsHjM?1C$x}1N%eL-|0?x=t94&F%KiKJ=Cj)vN}HmXUYas#qI<;lo8 zGz!+C-G>G&;sc6;9@*}b>Lr7)N2VT9#J_it(v-v1j5#n%-@SgHO)%%U^wKpZp^}#aD5h`zVs-<+gb7Qjs_N(vAwbMIr_GzCEYb_LR0<1e zdUv&eI}jbBKfi3%wc61Jk=7Lz@r!M3lfRz>)vs$e&1i?ZFM%8WCF(ucs-CjeG5ZC2 zEwC*pG{mSP?=6;yFs0s}O@uE$gHi|eLAu&QK_nW|I}Igl4M99WlJrPO!cQS^{PG=s zJGym5Kn#%On$n0oJz?^Qgn1N+Mgl;`Hv{YJ_CoY~n25sai1KqUqoM?aWsy%@@ zjuwJ3brgZ9IulN#87ynAzXWSclrg(eckW5p+#QrT%=7EKk6q@x%yan?_vLt=cvE&$ zF3%_4+MeFJd{V*^!g4rsVKYkBUjZ6Te}TT$-_Q~fVG|QK!zOO6431HMD+#>i+ogG# z<~;_fEpK}bx1`WoK+(acqXrPWG-n~2+Co^~0?KW|`y%8c0CeWoE%26cTTInhS`8dD zlqHT^LaT z766rC?wa-!I#+pbzIbcsLDgR0Z?kTn%r?TU{|Suer|c6}lt7LIOD{+4Yi!mdQt4h<*huXbf@)=I;ZHfsdB z1;T=VPcVYe}RFk{QgDrVx=NQ8$wm8~tg^|c}~H+(RX zaY;mf{b)`$-nH8*{qX^S_BEv!)ZOwv`Otv2E7dvrQDo}cI@j5*QQxy#xHP<#_e&&~ zc-PV9HWuG6uON-hkMq$25dD2Pmhfn{ge-vOcQN1~w}HEAwLwYT!3h zY*d2JfC^JBEYJ}n;zJuVrJR=$mD+x(>CMswLV{^tk++Uiyr~=kbU^~EKZ%>d$z+4w zf(dC$7Yw$*x=#fEK5zR&-sxopURt_fCf;{=sWJ7yshp=5CK#^{Fy74to}CUK9bFjM zfjpz1Mh{^=y?+j=_kZ`(U>$%CI1`+SeE2&0l#TbTMj*of)756hFC12`{&BT@ODYJy z^vGz0?ni~bdG84QmH@q7}wd$#?%!V2(n=H1kuC(_S&qarv=b6{?7JNp3F_`a#WsYDNfm(+*(v` zq`VFExgbW2KmKxjV|;wt7ynYC{}mkJJdSV;m)I0fNs-q!OY{gs+67(uT{;mF-d$a~ z`pbcfswbdnV3n=VadAt^B*^m8q>K+j>S9g1#?rVY0g>Pz5md{9uwu|(PktG0u?$%8 z^FdOmd4P`7Z5heAfao~cYwsK!nFThONspYQefX#F2E0n3+$w!&Q}js2WYr}6s8XTP z1GfmsHR&m7TQlp^KsLb?davrx-Dr|m7cnN_jXvSz|*YiMbx1V0Zq znrpw5kcc!9k5{+C%5Rs)2+7L{DfsQ2SOz^5d40BKBy6HBxeI?Gd-Ns=IzM=loRfcX zU&{`ji*Y;M7+aP)!NyOFFeIRdaBp1nK-#^wI1;X*vb3b{;I~cZoaboJ2~#ht_v~i(mrg zOYU2fKSWHS%_mJbEft?v+P9C(SQ~4?rN}ny!%d->VU{kKV9mI|!C~4W5Z_2Srze|W z{<5Q^b4R6@x3{;~wkyv&K*LX{-MTWD4H`Zpd$*yY!Lsh|DqJR=*?xGIxmLSCXZX>N zGU@nKj5HSE>v_lS>0d_}XWGMmpSLr#Gn94vvU<@DBvsa@T=vt`@T&!gG`B8*FyEl| zt=X?4Cj46sTz6Z19--?O{;nW>=_lB4BoWo9Pf1CdBWhHZoAo7mc*cg8kC#1~+`5~U zT&D~58NeB39XdQL5yQ!WdM;s1R^zD8Rpm6UGZWyBi{2BxkJa_9zmA$Xt9+g-`IwC; zD@(eO<~C7Q*XaD{eEIrD)6b*&p8lVe_VFdA;1hW%@(N}|%3F!_@h%`f*24inNkfm-sMpUqC;bb3HgLDs6zY=D&FB2umw)rNxSvV4}I}35rPF z$_sIwmt$5eBnXrd1RFjpXR4*^TV-+Ejg;NCx1;me(^G0W%biCVjCsYo;}Hig$7&Ih9y&bzU9~SVe^yV@hT5Gfmx0nh1AE%p>0ptAt1t2} z);C42Z(1JhP|Lm!enh!)AZDX`? z1}`flh@P3zmgQh^HWNWLsf&mR3v+Ry>ddh6Vj$gU3N+{)TFU9*6A)w6ZeC?P}x()B%mZeP9fkL2N>xU*&=1^fRSjYakwOS?*e5&-h1O1~C+H~Q7 z8k|{sq_Pfn@=srfr(zOH>P8f~nZIO2#5Y~ahsJwe>p5L+IT#p;B^q=^wDp8>gP5$%v2uGiGpW?uhif8@6i}c8g|q;p&-SR z(;kRDzN)tWM*Ey4uzH9>wrn@?mww9!Fo7$B3x3G;z_F?0HwbG~Lz2Rc)(K%_7o#jC zXMMy-69vRLDJ&FwXM1H)4&zeKO&shjbr-~9P@&?m5Vs@;>dOue@|PW)s5+?_a*~vk z7fJw zGS-xkhk*}yoWB2@jDTs{DBMB8{4@bcPuDn*?3_WAM1oG}>iFw{IB znQeFhk!_ud-tO-{RfR))&pXj0=wmC9w8!+*;|@3tUrtOm_OV8KW27ij%e zD#t1%J#MQt6pt*Xu118e&Q7;1L+k3s$b#EEST6L>YOq=e|)AFwWKFN3}|^Vuv-w1dSY2<+t;Q3W}obb3^lxPtT&z zd!hoOs4pPim$-P)QO0N^t3%o*Ak}WM9fZ)^$4?7Csw7TuI{S<7u(k_m@K(_`l>gpVrd z7PZe5UWk}o9+^jS3{(FKT6VQ8E6n--E|SM*_LdZ?R9#eApSn7=67k{cN+h_CeI2SC zoP4%{vJdH=n!39F;p$|Blyr%=m2Zo{RSa=kJDwxD{X_>tYd)uZ zO!4b(L#@@WIYgf6Q2Aa#wM?droD92AxqN1he!8Unh)Q8^H{C0;YUSC9DyVw3g%9A& zbIg2b`60CjnEv|UTFvzNbIVV|=L5&CcN52t6{PY@|2!`H;LHeNXJB4iN zDutXgW@+~Jo7wqbBou}Rn8w;x9j~tJyh%cohXr#?j1ASQ%vta6EXZo@$!A=o&4KOH z<}@z#-^7u?9&K{_5<1;vJ4c)=Iqd<2a=R2&2ESf%<>LPk<>Gm1Vv-+SK(xmxW6ao_ zT;<){x7$QSQ?JI6kivaSBZJYwD?NMa`~{z`xzE%bC$+KnB}zAV6$VAD5CSx@p6MH2J!jFHY0BEwLN zxLBeEMoz*go{J&?Vh*l2aM{Ah67VG;4J;He@-{XOs@l-*@-EcUyo!kMT+aI0v7EaT z+N*6}4NfiJTKGgIRc*aPyHf4oxK=yRy*6}pGVDZVZB>ZgZJJY(inQ5@{SzFPe;}= z>h>)&G!JNLp>;Lgz0(WQy%fM}osDI4ext;XmeA&Asbh&EQdo|T5;!n4V#bIGa8bCV_G(bjdmjYhF}6s+vNiyzfT;O8Xk z2(lUv%Wy^;53~P;$|CbN8Ec?8O;Dcdtm&wqH@4eXs~n-V zJj76;^;FRw1Sy{jQVvonOabgf>-}w_W+sg;rQJ;Di#gkytWa1S*NiL4Kn|18WF7~t zyiJ#0ay_v7W0U--gLZNsZ)~Asz5R|QNDk;e?PpYe z1Z{J>$J}lc+EU#JZAsv;lJ!ZYgEwkqb_twSq|{8eE2(ZUhWN@tI!s}kg!?H;jUVv7 z2A(&a7HAD49ylazV9QsHukI-U2@VFL9@9 z_-Aupj{O{C>JnYA(O@Pb&M$#ALmQ9ki^)=0n&eSsEb;9YgC8k;}^r zM!VrE){ zBxzmi`5#M1W*&V$7}~bfF`A^9b!b(YN{XWfnoL{2n0YvRW5h6NnrD5}>K{vo<|W&3 z?xW2jQY4->yqJ3%uOcqmxem|I%MOkG?YwMg=UjU%A1aoU94o{gjTMf)oQa}r zbrxJ?XD;#{HgYL}Bf9RGm>{pQ(M+j;C9j0Ge;L_5p!pK-rDQH{wpe1C6;Yk2Zj~6% zofun3!JDFz)QQ?$(Jn4nEH^(lYRNx06o=&#VrybILu;V)jYKd~SZLv=W5|>zo;dj+ z#(LQFZpOs&dgQHTHT?|Dh<(&B81fTa;hlzohL-=9oze6RTr(*{0tOx)lj5?qconJQ z5#n^7b*-hY5yQB%;G2)+$;oP?y5YvvvvG0mIm&HWNA=UeE20~u3YNAXQ3iCMnkrh! z$;n9oy}$;;|3zc(pIvp@>*b5|`)Gsx?SW$tDmM!LW&T^@1M5rXLPUS-eE`JTBV?jv zf-xpo>08KC@`XfA6a>xWSV~7UekpNT!-A1l9J+# z&6FeOmLqd&yT-CuBo!DDYb(o!KbR`uo73KhRknjnjy+lFbF%&D8PHKQ82E-wA#-8T zwtJAyyy|!w+Jz?{falix+^H?8Zi_V_5-r!=UYCtCr6SW%HhrZ@nmS zFgX-KG>#kfMOa!09jX9sDsB$edi6u1+;O?NIvUdasS-lc)&b~1Z6gaD4rhkI3Zesy zopaPZUHCTfN#m46Vw+=Mntq<;iZupzjS0?7Oy11cRRiOnWHdCkbNuyk?M^5Q?#Q;B z7gl4dFRYraB6g>?T&K&rb%fCjy*G5iLPt1Io2k1&ZJ5HSOS2~^#zmTbOV)fSqBu4@ z__iJAj{=}1#kOt#=!I0=g`{0J?RHl~Y`-~xZGM)Cxapqyo$ft8IM_|!i(ImWa^Jf* z+z%MS&!_lw@3G3v$GxB{UgnqCZWB$+48QBKwWR0#Z z+|I02Eqwp%n}g%tjVDhQ+db}eXtx7)E2#_*55MOX9z+ALJ@gJTdy0>qQOhg=b0I#( zV2@mku4dFnGU_j^&hzS0+qBr-S3Bx2bhK$2N372rVTArsyDH9D6(42PTXton*^zW{ zqhf)ic^s>=J+uSTpa~G=oU1R!N`?cfRg8WyY zgivYRs3K`rV`r|0`g&&pPF`sVf_>fFD7WYqX-_`37_+)JS$e%EIC$@J1QL`PGNDCYk-ylADama)*8C^tU?${8aa(<#sN;ydB!Ru z@+Jd5*2DDY@m3vkR&Dxi239kU>#LjS|719Vv~FzKr3G1<*J7Vn%)p5cBE=E6cx$+p zG5q4}E$r>l(d_8Q2ePx&vK8^fv8rH@nnfqy!m408-7j;jy}t@xV07u#%o3*G^8uK} zWR=RK15)b_?LL>~3v88O&d@%Q#3qWTH8J+H5;4}23wsTmI?m)IXd@yW`dFic{4)Cr zKwZku0_4cs`L zHqI>&mEtuvCO=W;W2vtT#jq#=0An{B>KsNIgUB>0Nr;b=#l_PeukVc4kl<*xi21Uug?p(Mh~%^jO3XOzPnjiHz!3)6$+-ON%Lb}5_~UVHESD#&xk zVC2ND)tiy4OdPCon);^&84_+UG**LM|4 z^Jw7MB&hSb4Zm;sX`fu*sgztX9lVL$0OV6{qW46 zH6YG49}e1f1EV2|pe4*MMr7!`!9j|T z&DdESJq&T9$z(3_46iXt2>sazkzY2f8DO>n0_Lv7n%Sz35)}~@6cG?)$6fGwt0dBYeY+9Ce z8csI63-E=2D4vE9^{(tN#pTBbG!Njqa4l6y<1nP~9q`% z%BwY#4((%;bIaYJrtg7P^zsV#VK8Wepc9XVA3dWI{KVbrnC&(ZsPFwsW`6|`oa=J7 za-}8VV&%9@F!5Ym@){DcdXjuFj0Wpzt5bL{UB3LX^{KeDgYsqh*+4b%|IyWzfHirg z>+I~10AfT$5+kBTHc_Lc5+GOzG!pe}T-(_+=C zRhmFSL9w9tj5`4Z(R-_58)8b5bKgI9mV12=<$(U@eEaf#=b!c4`oBKdapg6$%_ALj zSJf=zplM_e`7|`~8!#J!7i#aW+&>3pg^^gb_0gloN4L*58vi`^5}DY(>A&9p+onyY ze%dfM2acF3MO{5YRittUX53noFm^F-=95E^ITt!vi@6CSL_;Nj4MVCns ziaRhgL6MW#MQUvW;w%nbJ|uR~59^2gnY~I^$#4^m54D9imWQFXx^5cdZ;bhplGOe5 z6`2iFe0+nwd?xwucmhG#p+I=tR;EDR^tJRc4j<1G29+%H+$T&ZZOCn6Dr%l)K}DmZ z$)IJ_Jg@(k4cGfS%V$!(yB^c!-PnDP=|Eyd$olr=v6t(scjHLoJ;R7EDqnBh@A!38 z+HyW$GxPZvH1kmp?pT6bMZ|Qj;*F5Cjoc8|vQqB{wC~j$#6daFxd%hbk1&P34k(J$50fV;@&b9T) z(yF)q@yD0qi&Kw&qU)>}u_@3Dt2wb*VU8}R*p+wb{G}f&8t<$}_w5C`Z)lsGt2lT6 z#m5!UOz7-;>s~is?*m1%-ki7Y+dCY?fu5|Mp$rotujaLzZK%GwwYPOw1^=>iWZD1u zrlpD;+_}>&B6;(&kY!ieJ7|}=bZ!8xnoD;KrX^8HwTMmc)pFI!A(=a)iI&PnyzI>g z$aYorvIBB~YoW<=p`o;135%A?kYu~5^mEv1M|bzd^o@&sN+h(6&9O~_G=bb_zmp5S zRz56oXpRXF@ONbjl#^Kqr|Atzj`{2sCQDx;6A9@o2|Q?>fX9o07j@sqDo{>!V#M^$ z^+G3h!@uXNO*bkU@Jo@kg-&}By>s{-A0(=QuzO*IBWdOK~3{_5)doyogJXJ$>U z3fun5dd6zxC=`U`N7d8}24)02ET45SF=EHX^6s3Rm17Y2v6btONw#N}wO_QwlQB2UW9crTrSveJzi(yJX9OWjV+b@B_tsNxP#1hvIFTTO2-b zTR^dz!z!)vp5(K?ZaDXHX7^j6f7pI?@@Joog3$o*9MW^!U2AlP_6e&I&s=GOp}j@W z+}utk-v8U`>-Vn@j5H?RGUcqiWomrA$@`7}wQ3!d@{LC0cF44$(P*$`<&7?zJu~8~ zCx;r}><-O)KxyKU9zrZVU!8s4eR*fa#oU3}z^#b`{;8B4wN~4e;>~wfH_OkW5-#b= z^iVzXXX-z8Q2xb(!&GurZGMa)vB;TmP4$sB^<#Enoj!GSFuPULz$<1usc2PRj{A!C z7PI=oCC&Vhz{sRxH^h${!}%0=IkxEuvsLQ2?+i>T;L}IBZxnipZ|qcBw6#jR$S|AXiJX>44Lg+%%g5Jm)|6-Cyq9Vf&z6bhYD&X@=o|Wz&)A6Fp@5QFLbyEDSXrjcN}sIQ&7? z@Ms{tUd+_z%KRAt62};tA6uhV_R4(NbbWo02V40n$lsaGzzVZB)r+aG^aIj>DFM7h zCFz~Y#BK6Qi36P*387F9qWcPMhY2dm}4Xir`zSOI7(V*M9C+NA z_y~@Jyf6@R7D^_01AqD6bmN^K(6-S?5<&5;#O@+YPY#CEFpQYWxNuv$*FZRPQ(QOJ{(h@08_A265M@(@oF8*x)iHxYxjvdF=hs3uT zqDBWSx(dt5Xh7x3yS8$~u8qbM#&;eiCiajq9Uk$LN zyV^pxHlCuqNK_BmY(0ZG^fHw12{N~bC-boBJU9|XqYbg(15>E!^OaS3Gv9o8l8Fk0 z*jY6c<)UUNmDwTAZtMU`@qB&MYWXp5Cx)s?K8?|=(gt%%GhOIixz74NeeX1;IzSuN z6}Cun;cTia`cJ_@K7p**52Sj{J6?=%aU~yDt9o<qk=;+q5?$rJA~M@8!Z^KXGpT zZVw->uV~vnUFYbim(VZro*mzlskL?FK#uCXHll3^YYHCvy;cJ_f%2NG5o1% zV&RJ;J*MMN$E}FNBdBkDlh>W|-b$0r@Y@=6o2)v@L~afJf~9T8dpb#@;;|)xs&83Q?{H_%cDK}XfcKR ztL+D~rZ_dHgIPt~yUNlZKUh}t*Rc<$`l8*Wv$N}|VjvoQWYR&7LH`=NbD(}-R!rnr z@nGHfo$%o!?@fb9x zCK^|*2X;%ZbwV>a*vHwSP$iLxgXtPsSddd8GgcprqEi<)Um4{=3wKa{;!i8_rw`?F zdbNw_jK#EV!J=S{S2;5nX?5}xq?Pn~Aieki|Ijllvn!=Z(v$?WnF0cR1HC*^vwnsl zm@uiQJ6)dZ>%n$p#L_~!PEKydw+6{80~yp=&`y__UP(IFCqQ!JkU)j z2zj9}XMOR7;f*&Msa3>>WI{)fE7 z6f1CIGo+qse8?hW1kHjzK>MQh3Wjc~3L^MafO;44&t73HBAxP%v2~O8mz_TSed1{6 zk_~2ZZI?M&@x0s`O`?s6Epr;@!;Xgh{$wkp>ZkV+)O5d>bK=AcgEbT-Xq|1%09bzA z5SrKXpof@r_t5Y)T-;?Fh%lXaZ#JchS$jwifkGe(z=8aX=+sVux!LXc)G`Au5dT7 z+@qtr&1Wq4&=fq{Y3>BSsM(SvcxdAu>k$JCifM_7^q*MYo^)b87W4k^k;a#Aia`J9 z8%VeAw{;|k43O&^Y@o@iRqK9Vo=`kjfO!u#nDg#myJjq(`Y$EaUN|Nz7Vd};i7`tg zbW{tt1s8z^F?;@fgzbPm!oM@asKQvGGJPRzbem9}8z$c&jc6{viZO9IJo`cI7D#%=g8M(}= zb-yZ}SP$d@d}%aISgVbuCAPPZe$W}-J`Yagv@r{dHuA|4>nvMx=hdSL{Z*n}OFZ9} zq-QtCILclRD)Ym%ZUBpx?c)!%Qx2s@1_cN4y%|H=%$44*&a{X4!l4kp&#g(RiQ;?E zwYki$T!f-aotdR>tv|QY>!5V}eMS4q!urD8T7E8Mvsv*H4!c^6TnXFm?4VX%K`g~VG zL6|+U(A-3wAMsDTs3sl}&Be*W;qRBPg)Kz`=McH3u%#oKv1M2Ro&*!;hbqo1#&lyp z+$ZPAz<0(^M!vuF=Y@GaMrfM>_^S%?f;5g^yY?D*LGr9e$iwq5*OJEPJ*FS3@}PTr zh(VX3vplqAksHSCXU|?s-x^K(Y2?W)dF00!l;d*)yo3C3mIuL zZBmF2JGQA-J}qCC>k#lN%Au(*Og4Fvvo|9=B9LA1Sed#qklo5DF2E?o&xMcsnuoLd zaxW+^V5Bf@2T#`bb1Spk$(;}g|r zGcSNepn4ReS)&R>%RTouMNl5lMBuQ=%QdDDMbB5pyblju+wvz<8C%; z2R#g+1Kwi~Q77jqdQ?@#GYT9)^a#GRwWSPL_L-gte;rF=cxb%FJF@9uj<(E6vzN_@ zb9|i&Y>a(eVCRgmEcOlW{Vprg*GGO9-*yob5x&4dqO^1}+MHo|T4S9>P7>IH@)IXa zd3cGt4xxz&*Z552^_W+sJTm6p!d*=Ulft&aat`rRp5cu-j2fyZ=`G=2RjwfOIy)`w zMg4;!5>?HPCYUM@QVI^xz9vWC?R@2&UTw=LKe&gsghETu`B6-L7dxP93P-t;0y&`% z%2DYZRlSiOG;cfJIe37p)_Zm8NtMC{rSta!fkV z-uLA&m11`$UGJdMF7>48Ma;f1jt7}QqjiWC-peM0n4{=>p?_pV@*bi3s~QG>$T`~F zZz0MP%Q_d$GSBLrO>BhFrF7R^_H+xz`RK{JK?RZZw>4vzjvL5!rJ!^H9NNg82j;9> zhU1Sy$n!txxos|6VO6sRzB`?I>JMI04aLlTJbp<$Ps$yWBvJKpwnObu|AK(Xl+;z; z(zavCD5hS7g~Y^D`Mkw%M^f#vl-bUOwQ;d+DZ%*xZSx4}Bxa@HOD{qcqxIA)Y|>nV@=Pvx!V#k=Vwb?-@8B zvMV{jL)D}mR(4e`aC2goW=p3zu;^`KxBROhU#>n|;uqlJ?p(-HtBdH`vp(!1p0ct@ z6uCacH`Lc(C~akL1lS=pWp!|fP`XspvUHy`zU6JMuWtxHENpG0k8d1Z)zBs17Uk;~ zr|caLs}v&3Wkt-R#YIFDOD7q(HvVe(6&WUUNJo0U3Vry)z%Nj!@hp;OqGI5OoWeg4?3PG8DL8kQbJ7<2d+B2rwB(4dnqLhjk;i)fUiRwj=1!JD&Tf;aBx^ z%rTZe(`YGMCgnK9^|fvB4++}W(st_o;1JYJ5JQ}qH&2xL_}Q&hS4%Jri?_h|#A;7x zr%wqbW(Bdy9XD;J70Hap4LQ~jl-BSp1A)F&fcaUsjOU?G_C>_^WZbrT;se8L2L+fy z&t?K|^}PS;uUB;nofU2iZzR2Zqw^SPzqKdo-ht}UFrWsb_`nHvO$VB2iyLyW$@xmH zILMdYo9o=9k93C{D$R7I>m%F&Y8cWAoY^Iu5_Tc&RCaAy^A)GPD(zaaOzgUsA<)Xjnb}i3==$CW ze}7K~?Jy;2Zz%s##IndA)3NS{K5k;DvkB$N}l#}e5J>rT;SMP-DVXjqJe_cP{et=SiMn~=^>^>yT1ZZ8`#chApb5&4Ch*;a zs{8Jkg+CQ!rJZj8R#KD}JbR6+@uX}zVnF47nQO{1I&fM2c% z@@7+@_qr?!iQ`N{4(1ZW6GEoLn^=kY0O`1DHa{Uz!$f!0rZ|8#8?jvNG*{Z*?VN5N z1dpH=kCcLgJ`haM2pVD4Sz)@1AgZud#dQUggOF-U&?IkJf&MSBm6(u~CZUrqEK4}H z!W&iK{`Id}Gc}?Tt+WrPPMwiwdGW&{XLaFEU7U?`p-R_ zx556Kezl8JH^k|=;s~)`uK_aumQn~GKPbdiH^16z;+^xoCr|eAnS=o}URqje!v!E&)95Yi z0!L*-fizX3DSft+5A6>~L)?spiG{{{I_nX;`?{ED z>8704zc$`8rZXM4eMqcEoR7-oZavVAK5^MUc%|nG+u=t9wO+*E3i9GI71NL2WlWh@ z-7~Hj4Egj(Pacw#-LQ*Q=Ej$wB5%ueQEDBVYQs{6F7)11p{pOCrBa4*RAF+!PaS9< zxxxI)!kqGHf_$1bGCLFa@)jUXyDEd+{aj{zzIZX~jcKy5NZHyXq#)u{+1k{Uq|}5Y zp-`-x%H?rcEkZh-mj)0?eJ0;MPT98Gof*sAtBx6lBH%}O&K``Wy*kSFlebV~-3=Yj zB9?L#>P$!fz0sPB<5|05My-Po-;71rI<-O&PbLyd!Y4z?595Eq`6~#1WG}LSabgkh zP+8KH*<~E9(3Tb6Z+YORinrVal$293tT3}A!CvkySvE=dWGM!fUQZ;1ya$>aUQ#l2=C^_v5 z$J+sig!PhjlO6Y$WmjIfxr4VOZO4jKWxa~)!`19}Y>974*yrJk8kFEBYl*+OBnGh0 zI0skI)1v2gl|VfSWxk0KyIgTX0T(nt?aE{{fJ|TSvO$>Vl9vQp3IUVffghmqI#BV1 zp4;J!L)uoqLhEP06W*t6r{i)Ut-^t?z))0Q%UkYyi&3-_;y#9!jVt&EVe1nh<)W1f zFiCxstuH)|nQ>kk8;KUDZw8 zRJKGf1ji;bYZFrPYM7Bw7g{+4mOK*V-9xFP%fX zy*34zbjn(1T#&_&Oj^rf)M40B8W_N6q9sWj5cLZ;A_thpW92LT_R>pxC+$_$;^u{f zDE3C$HVN%vlyiX|7s%9}r1q)jUOj*__ji&}(WoUIvAhCDA0CC;=E578UWE zOeBzVh*cgfPWbUhx}6n}tD$L(4^)!r47EfS=w_F9PYzcuox)+!zs{%Koy(y&r29HC z1N0#-m~3&J_P?h;4RI_ip`M z+rP*|gNu)r`UiRO`9b_5g-t=8j?&`7Uk5YfjACNp#6rmUtdqpP9c<5lMF^djfs*>; zzgvs*=*AT4Kv6hID0jEQ1pQ`zXZa2$q&W<2YIk9=7EjDXCr8^pTM z8lvZ3b0Gr?JR4aAo{bc)eT_YwqFgy;rSFYwdw7Nn9EHM8bjlqwMCF@J(Y8+gG*y6; zvf4=r81Y&*Z7JeKIycn=pX9w=cnx!I7?0yl%?Si^7y)`&usfR;i<7NqxR?Ix8;h2 zkrGd?3ztzF)(aewK$|kpVj`rHF{KuVJGh%1#Mv&xJZ?@-zt>np&cJ6<276vc#I~MJ zau1SavYVCrP#hB0hvrEY>)ZC0Y&LlIU=dGyik6F~eOg_ZhDXChCl=)C~lPGe*TGWD_~ zXI4{vSRn9KJWh;?wwBN31T-vg_48pj#nB~8f%-`Cj*&}U^J#5iQ9+{0Wnq;+Mh1q$ zZWlVMPOqHfRNSg&+?1ErH#F31FO*&=Nm!e(55uLe)c$+-6}h^4y9(;k3Km9Fj_^h$ zgKsYHAOyO99Tgv&eTV1GC&`WLZ~b$__Ajq(KooF^78msfND7gj&`scIcR=ZZSXr?h z1nDPDT|Ns0(;P(X!Q*G!JBw3L{w{6Ht;989(l(H@PAc62^el*uA1dQ(8}21-%NneF zd@~c(fwEl{R0-g-Y68KPJAQD0^gq|Z2q^_M6_oM51e#LDyib8RWJ~lY$VwpO7YX2^ zwv40EZ`uB}rmMMOUt6+lL54D%A(;U{n>K+V58}`&S-mn^lrycwm!^d1$|q6M98AIA zB(BURxdTm`n~G{&pFA5)Lpm*p%U1fU(aL8@^b#K?SG$q*SK3f!{e{e%;quJ-(t2sC zG?o6UUekb%M2e@6r;n4fX1@c9r}VOb(o#tjQ1YjuP#eX3R3Kd==M^!TxWbF0LZge) zP)POc4uo9 zhG*wVOPMEpY+2BS?s@+>?gI#8KX8l?515oCyT}-7KO0Cpj0(BS;6Glo{T$e(BVSN4 z%LH1viBK~Yfl2$-1c@gE$!8MXb=yPi{hs}m3NYQ|;|;J-Rir&}XgWhCV(OPMB#T*H zzso*eUPMLXwAC(X1!^0@oMZJDR{OAH ze*%)Opdu=Qz=>G8qs_AwHpDGBlaYK3G2A>zW`>e?$SpY9Y4-S7dE%Fyvk;$z-~Omme!> zka*)lC_f(;YSyzp*w2159laq{9D=)B&6sQ%AY|_Q9gABF z3Y8n@2JsaBpqP5_=D|>)Dp6=%oU3vc*3T#Tr~- zC=7os_V!9N}3zEyGxWwwaR=F_gnW>Y3v|l@kt;$aE!KYOC0eNY#G)NR8Zjh`F z=J`PEZ^|{NeVm{G8(UH_M6cf125et_!_61~7%KIZrRkAL5&WR3?%r;DVPFQK%j#7G z4HX51+=NY@3_(aT4{nv(od1X3WN6 zq^h)Jh9kECIS|*68igHOjF24@>?j3kKC)waHZs(4nifY5QMt4z$w% literal 0 HcmV?d00001 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr.meta new file mode 100644 index 00000000000..e915df2f02b --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 58283f4ad2597c94db7ed96968285c9f +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 1 + seamlessCubemap: 1 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 2 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 100 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture new file mode 100644 index 00000000000..efeba5b999b --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ViewDir + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture.meta new file mode 100644 index 00000000000..7b34b59f729 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ac88441584a4add4a9066ed004fde47b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/ProjectSettings/EditorBuildSettings.asset b/TestProjects/BuiltInGraphicsTest_Foundation/ProjectSettings/EditorBuildSettings.asset index f7ac0a0b9b7..a182cc8fe2e 100644 --- a/TestProjects/BuiltInGraphicsTest_Foundation/ProjectSettings/EditorBuildSettings.asset +++ b/TestProjects/BuiltInGraphicsTest_Foundation/ProjectSettings/EditorBuildSettings.asset @@ -71,4 +71,6 @@ EditorBuildSettings: - enabled: 1 path: Assets/Scenes/063_Lighting_BasicVertexPosition.unity guid: e2daf39e5a0f09744a2a6851d38e7081 - m_configObjects: {} + - enabled: 1 + path: Assets/Scenes/070_FullscreenEffects.unity + guid: 973136f6e85b5aa408b497d12825f950 From cf1a5328e9276e65197a765cb2ebdee267e53ea2 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 15:50:38 +0200 Subject: [PATCH 087/108] Reorder fullscreen SG UI to match the material one --- .../Targets/Fullscreen/FullscreenShaderGUI.cs | 2 + .../Targets/Fullscreen/FullscreenSubTarget.cs | 70 +++++++++---------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs index fac46900a21..b6ee3f63013 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs @@ -175,6 +175,8 @@ void SetStencilEnable(bool enabled) { stencilComp.floatValue = (float)CompareFunction.Always; stencilPass.floatValue = (float)StencilOp.Keep; + stencilFail.floatValue = (float)StencilOp.Keep; + stencilDepthFail.floatValue = (float)StencilOp.Keep; } } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index a19902ad289..35d0cdc7de7 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -474,10 +474,10 @@ public void CollectRenderStateShaderProperties(PropertyCollector collector, Gene collector.AddEnumProperty(FullscreenUniforms.colorBlendOperationProperty, fullscreenData.colorBlendOperation); collector.AddEnumProperty(FullscreenUniforms.alphaBlendOperationProperty, fullscreenData.alphaBlendOperation); } - collector.AddFloatProperty(FullscreenUniforms.depthWriteProperty, fullscreenData.depthWrite ? 1 : 0); + collector.AddBoolProperty(FullscreenUniforms.depthWriteProperty, fullscreenData.depthWrite); if (fullscreenData.depthTestMode != CompareFunction.Disabled) - collector.AddFloatProperty(FullscreenUniforms.depthTestProperty, (float)fullscreenData.depthTestMode); + collector.AddEnumProperty(FullscreenUniforms.depthTestProperty, fullscreenData.depthTestMode); // When stencil is disabled, we can't override if (fullscreenData.enableStencil) @@ -598,6 +598,39 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac onChange(); }); + context.AddProperty("Depth Test", new EnumField(fullscreenData.depthTestMode) { value = fullscreenData.depthTestMode }, (evt) => + { + if (Equals(fullscreenData.depthTestMode, evt.newValue)) + return; + + registerUndo("Change Depth Test"); + fullscreenData.depthTestMode = (CompareFunction)evt.newValue; + onChange(); + }); + + context.AddProperty("Depth Write", new Toggle { value = fullscreenData.depthWrite }, (evt) => + { + if (Equals(fullscreenData.depthWrite, evt.newValue)) + return; + + registerUndo("Change Depth Write"); + fullscreenData.depthWrite = evt.newValue; + onChange(); + }); + + if (fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled) + { + context.AddProperty("Depth Write Mode", new EnumField(fullscreenData.depthWriteMode) { value = fullscreenData.depthWriteMode }, (evt) => + { + if (Equals(fullscreenData.depthWriteMode, evt.newValue)) + return; + + registerUndo("Change Depth Write Mode"); + fullscreenData.depthWriteMode = (FullscreenDepthWriteMode)evt.newValue; + onChange(); + }); + } + if (fullscreenData.enableStencil) { context.globalIndentLevel++; @@ -674,39 +707,6 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac context.globalIndentLevel--; } - - context.AddProperty("Depth Test", new EnumField(fullscreenData.depthTestMode) { value = fullscreenData.depthTestMode }, (evt) => - { - if (Equals(fullscreenData.depthTestMode, evt.newValue)) - return; - - registerUndo("Change Depth Test"); - fullscreenData.depthTestMode = (CompareFunction)evt.newValue; - onChange(); - }); - - context.AddProperty("Depth Write", new Toggle { value = fullscreenData.depthWrite }, (evt) => - { - if (Equals(fullscreenData.depthWrite, evt.newValue)) - return; - - registerUndo("Change Depth Write"); - fullscreenData.depthWrite = evt.newValue; - onChange(); - }); - - if (fullscreenData.depthWrite || fullscreenData.depthTestMode != CompareFunction.Disabled) - { - context.AddProperty("Depth Write Mode", new EnumField(fullscreenData.depthWriteMode) { value = fullscreenData.depthWriteMode }, (evt) => - { - if (Equals(fullscreenData.depthWriteMode, evt.newValue)) - return; - - registerUndo("Change Depth Write Mode"); - fullscreenData.depthWriteMode = (FullscreenDepthWriteMode)evt.newValue; - onChange(); - }); - } } } From e7879aa2d7d47cf4624eb0849c5b25a9ed6973a4 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 15:56:36 +0200 Subject: [PATCH 088/108] Moved stencil toggle in the correct place --- .../Targets/Fullscreen/FullscreenSubTarget.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 35d0cdc7de7..ed4404fd4c0 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -588,16 +588,6 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac context.globalIndentLevel--; } - context.AddProperty("Enable Stencil", new Toggle { value = fullscreenData.enableStencil }, (evt) => - { - if (Equals(fullscreenData.enableStencil, evt.newValue)) - return; - - registerUndo("Change Enable Stencil"); - fullscreenData.enableStencil = evt.newValue; - onChange(); - }); - context.AddProperty("Depth Test", new EnumField(fullscreenData.depthTestMode) { value = fullscreenData.depthTestMode }, (evt) => { if (Equals(fullscreenData.depthTestMode, evt.newValue)) @@ -631,6 +621,16 @@ public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Ac }); } + context.AddProperty("Enable Stencil", new Toggle { value = fullscreenData.enableStencil }, (evt) => + { + if (Equals(fullscreenData.enableStencil, evt.newValue)) + return; + + registerUndo("Change Enable Stencil"); + fullscreenData.enableStencil = evt.newValue; + onChange(); + }); + if (fullscreenData.enableStencil) { context.globalIndentLevel++; From afe4c2a1fa9ef3a70efc000fcc2dbe3e450f8725 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 15:45:57 +0200 Subject: [PATCH 089/108] Safe div 0 in FullscreenCommon SG # Conflicts: # com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl --- .../Fullscreen/Includes/FullscreenCommon.hlsl | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index cf8b48c4f35..63ffe0d29a9 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -111,8 +111,27 @@ FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) output.color.rgb = surfaceDescription.BaseColor; output.color.a = surfaceDescription.Alpha; -#ifdef DEPTH_WRITE - output.depth = surfaceDescription.FullscreenDepth; +#if defined(DEPTH_WRITE) + + float n = _ProjectionParams.y; + float f = _ProjectionParams.z; + +#if defined(DEPTH_WRITE_MODE_EYE) + // Reverse of LinearEyeDepth + float d = rcp(surfaceDescription.FullscreenEyeDepth + surfaceDescription.FullscreenEyeDepth == 0); // Safe div 0 + output.depth = (d - _ZBufferParams.w) / _ZBufferParams.z; +#endif + +#if defined(DEPTH_WRITE_MODE_LINEAR01) + // Reverse of Linear01Depth + float d = rcp(surfaceDescription.FullscreenLinear01Depth + surfaceDescription.FullscreenLinear01Depth == 0); // Safe div 0 + output.depth = (d - _ZBufferParams.y) / _ZBufferParams.x; +#endif + +#if defined(DEPTH_WRITE_MODE_RAW) + output.depth = surfaceDescription.FullscreenRawDepth; +#endif + #endif return output; From 18484b64c82b320f1857a34fce5e45bc2913dbf5 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 16:13:40 +0200 Subject: [PATCH 090/108] Fixed default blend mode in shadergraph --- .../Targets/Fullscreen/FullscreenSubTarget.cs | 55 +++++++++++++++++-- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index ed4404fd4c0..30112c46d97 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -466,13 +466,56 @@ public void CollectRenderStateShaderProperties(PropertyCollector collector, Gene // When blend mode is disabled, we can't override if (fullscreenData.blendMode != FullscreenBlendMode.Disabled) { + BlendMode srcColorBlend = fullscreenData.srcColorBlendMode; + BlendMode srcAlphaBlend = fullscreenData.srcAlphaBlendMode; + BlendMode dstColorBlend = fullscreenData.dstColorBlendMode; + BlendMode dstAlphaBlend = fullscreenData.dstAlphaBlendMode; + BlendOp colorBlendOp = fullscreenData.colorBlendOperation; + BlendOp alphaBlendOp = fullscreenData.alphaBlendOperation; + + // Patch the default blend values depending on the Blend Mode: + if (fullscreenData.blendMode != FullscreenBlendMode.Custom) + { + colorBlendOp = BlendOp.Add; + alphaBlendOp = BlendOp.Add; + } + + if (fullscreenData.blendMode == FullscreenBlendMode.Alpha) + { + srcColorBlend = BlendMode.SrcAlpha; + dstColorBlend = BlendMode.OneMinusSrcAlpha; + srcAlphaBlend = BlendMode.One; + dstAlphaBlend = BlendMode.OneMinusSrcAlpha; + } + else if (fullscreenData.blendMode == FullscreenBlendMode.Premultiply) + { + srcColorBlend = BlendMode.One; + dstColorBlend = BlendMode.OneMinusSrcAlpha; + srcAlphaBlend = BlendMode.One; + dstAlphaBlend = BlendMode.OneMinusSrcAlpha; + } + else if (fullscreenData.blendMode == FullscreenBlendMode.Additive) + { + srcColorBlend = BlendMode.SrcAlpha; + dstColorBlend = BlendMode.One; + srcAlphaBlend = BlendMode.One; + dstAlphaBlend = BlendMode.One; + } + else if (fullscreenData.blendMode == FullscreenBlendMode.Multiply) + { + srcColorBlend = BlendMode.DstColor; + dstColorBlend = BlendMode.Zero; + srcAlphaBlend = BlendMode.One; + dstAlphaBlend = BlendMode.OneMinusSrcAlpha; + } + collector.AddEnumProperty(FullscreenUniforms.blendModeProperty, fullscreenData.blendMode); - collector.AddEnumProperty(FullscreenUniforms.srcColorBlendProperty, fullscreenData.srcColorBlendMode); - collector.AddEnumProperty(FullscreenUniforms.dstColorBlendProperty, fullscreenData.dstColorBlendMode); - collector.AddEnumProperty(FullscreenUniforms.srcAlphaBlendProperty, fullscreenData.srcAlphaBlendMode); - collector.AddEnumProperty(FullscreenUniforms.dstAlphaBlendProperty, fullscreenData.dstAlphaBlendMode); - collector.AddEnumProperty(FullscreenUniforms.colorBlendOperationProperty, fullscreenData.colorBlendOperation); - collector.AddEnumProperty(FullscreenUniforms.alphaBlendOperationProperty, fullscreenData.alphaBlendOperation); + collector.AddEnumProperty(FullscreenUniforms.srcColorBlendProperty, srcColorBlend); + collector.AddEnumProperty(FullscreenUniforms.dstColorBlendProperty, dstColorBlend); + collector.AddEnumProperty(FullscreenUniforms.srcAlphaBlendProperty, srcAlphaBlend); + collector.AddEnumProperty(FullscreenUniforms.dstAlphaBlendProperty, dstAlphaBlend); + collector.AddEnumProperty(FullscreenUniforms.colorBlendOperationProperty, colorBlendOp); + collector.AddEnumProperty(FullscreenUniforms.alphaBlendOperationProperty, alphaBlendOp); } collector.AddBoolProperty(FullscreenUniforms.depthWriteProperty, fullscreenData.depthWrite); From 28ee67036e4b51c0bd599c6e849f00a659b48577 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 16:23:35 +0200 Subject: [PATCH 091/108] Fixed clipping issue due to safe divide --- .../Targets/Fullscreen/Includes/FullscreenCommon.hlsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl index 63ffe0d29a9..5b8e5f91d14 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl @@ -118,13 +118,13 @@ FragOutput DefaultFullscreenFragmentShader(PackedVaryings packedInput) #if defined(DEPTH_WRITE_MODE_EYE) // Reverse of LinearEyeDepth - float d = rcp(surfaceDescription.FullscreenEyeDepth + surfaceDescription.FullscreenEyeDepth == 0); // Safe div 0 + float d = rcp(max(surfaceDescription.FullscreenEyeDepth, 0.000000001)); output.depth = (d - _ZBufferParams.w) / _ZBufferParams.z; #endif #if defined(DEPTH_WRITE_MODE_LINEAR01) // Reverse of Linear01Depth - float d = rcp(surfaceDescription.FullscreenLinear01Depth + surfaceDescription.FullscreenLinear01Depth == 0); // Safe div 0 + float d = rcp(max(surfaceDescription.FullscreenLinear01Depth, 0.000000001)); output.depth = (d - _ZBufferParams.y) / _ZBufferParams.x; #endif From cf8059a2059ad9e5947a531dca19961b09c36a8b Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 20:33:00 +0200 Subject: [PATCH 092/108] Added Builtin Fullscreen SG test --- .../CommonAssets/Materials/BI-UV Map.mat | 180 ++ .../CommonAssets/Materials/BI-UV Map.mat.meta | 8 + .../Direct3D11/None/070_FullscreenEffects.png | 3 + .../None/070_FullscreenEffects.png.meta | 99 + .../Assets/Scenes/070_FullscreenEffects.meta | 8 + .../Assets/Scenes/070_FullscreenEffects.unity | 2219 +++++++++++++++++ .../Scenes/070_FullscreenEffects.unity.meta | 9 + .../BlueTint.renderTexture | 39 + .../BlueTint.renderTexture.meta | 8 + .../070_FullscreenEffects/CameraEffects.meta | 8 + .../CameraEffects/BlueTint.shadergraph | 894 +++++++ .../CameraEffects/BlueTint.shadergraph.meta | 10 + .../CameraEffects/Depth.shadergraph | 570 +++++ .../CameraEffects/Depth.shadergraph.meta | 10 + .../CameraEffects/Position.shadergraph | 549 ++++ .../CameraEffects/Position.shadergraph.meta | 10 + .../CameraEffects/ViewDIr.shadergraph | 548 ++++ .../CameraEffects/ViewDIr.shadergraph.meta | 10 + .../070_FullscreenEffects/Depth.renderTexture | 39 + .../Depth.renderTexture.meta | 8 + .../070_FullscreenEffects/ImageEffects.cs | 29 + .../ImageEffects.cs.meta | 11 + .../070_FullscreenEffects/LightingData.asset | Bin 0 -> 19456 bytes .../LightingData.asset.meta | 8 + .../Lightmap-0_comp_dir.png | 3 + .../Lightmap-0_comp_dir.png.meta | 99 + .../Lightmap-0_comp_light.exr | Bin 0 -> 232822 bytes .../Lightmap-0_comp_light.exr.meta | 99 + .../Position.renderTexture | 39 + .../Position.renderTexture.meta | 8 + .../ReflectionProbe-0.exr | Bin 0 -> 169803 bytes .../ReflectionProbe-0.exr.meta | 99 + .../ViewDir.renderTexture | 39 + .../ViewDir.renderTexture.meta | 8 + .../ProjectSettings/EditorBuildSettings.asset | 4 +- 35 files changed, 5674 insertions(+), 1 deletion(-) create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_light.exr create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_light.exr.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Position.renderTexture create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Position.renderTexture.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr.meta create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture create mode 100644 TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture.meta diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat new file mode 100644 index 00000000000..aa2441548f3 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat @@ -0,0 +1,180 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-2777798440943170135 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 639247ca83abc874e893eb93af2b5e44, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 0 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BI-UV Map + m_Shader: {fileID: -6465566751694194690, guid: 7e26e8f04c77cf7429bd7efa3d80141e, + type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AmbientOcclusion: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseMap: + m_Texture: {fileID: 2800000, guid: b4ea3eedbbeab5c4fb300fb5293a93c5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ClearCoatMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Cube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicSpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AlphaClip: 0 + - _BUILTIN_AlphaClip: 0 + - _BUILTIN_Blend: 0 + - _BUILTIN_CullMode: 2 + - _BUILTIN_DstBlend: 0 + - _BUILTIN_QueueControl: 0 + - _BUILTIN_QueueOffset: 0 + - _BUILTIN_SrcBlend: 1 + - _BUILTIN_Surface: 0 + - _BUILTIN_ZTest: 4 + - _BUILTIN_ZWrite: 1 + - _BUILTIN_ZWriteControl: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoat: 0 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossinessSource: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _QueueControl: -1 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _ReflectionSource: 0 + - _Shininess: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecSource: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _UVSec: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - Tiling: {r: 1, g: 1, b: 0, a: 0} + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 0.5, g: 0.5, b: 0.5, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _Offset: {r: 0, g: 0, b: 0, a: 0} + - _SpecColor: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] +--- !u!114 &2496664280657295510 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 5 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat.meta new file mode 100644 index 00000000000..c3d3533fc44 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/CommonAssets/Materials/BI-UV Map.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 84ee8f1b8a5e55f498d61cd54afce293 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png new file mode 100644 index 00000000000..236a6f980d7 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e518e5ae8c5bc2ad003a3e3fd040c06120013e8dc928553852cf110f0e632ac +size 114578 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png.meta new file mode 100644 index 00000000000..02ed96fbafa --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D11/None/070_FullscreenEffects.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 1298828cb3c693a47b96758986b57b38 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.meta new file mode 100644 index 00000000000..72f30335bb9 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 27fdebc771916e849aca4098892f878d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity new file mode 100644 index 00000000000..5ec638ecb5c --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity @@ -0,0 +1,2219 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18385503, g: 0.22906253, b: 0.30347347, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 0 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 112000002, guid: 0443133b73b356f449027ce62f5cc170, + type: 2} + m_LightingSettings: {fileID: 4890085278179872738, guid: 2c3dbc93abd102a4990ba5f7b15fc33e, + type: 2} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &55781357 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 55781358} + - component: {fileID: 55781361} + - component: {fileID: 55781360} + - component: {fileID: 55781359} + m_Layer: 0 + m_Name: Sphere (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &55781358 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55781357} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.08, y: -1, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &55781359 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55781357} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &55781360 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55781357} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &55781361 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 55781357} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &75551322 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 75551323} + - component: {fileID: 75551326} + - component: {fileID: 75551325} + - component: {fileID: 75551324} + m_Layer: 0 + m_Name: Sphere (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &75551323 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75551322} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.6729999, y: -3.5, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &75551324 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75551322} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &75551325 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75551322} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &75551326 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 75551322} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &132935364 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 132935365} + - component: {fileID: 132935367} + - component: {fileID: 132935366} + m_Layer: 5 + m_Name: BlueTint + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &132935365 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132935364} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 390770347} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &132935366 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132935364} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: c7402e76ade7cb54fabb71e9db1bde5a, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &132935367 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132935364} + m_CullTransparentMesh: 1 +--- !u!1 &324526213 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 324526214} + - component: {fileID: 324526217} + - component: {fileID: 324526216} + - component: {fileID: 324526215} + m_Layer: 0 + m_Name: Sphere (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &324526214 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324526213} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.577, y: -1.75, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &324526215 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324526213} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &324526216 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324526213} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &324526217 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324526213} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &390770346 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 390770347} + - component: {fileID: 390770349} + - component: {fileID: 390770348} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &390770347 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390770346} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 132935365} + - {fileID: 1184374070} + - {fileID: 1707275100} + - {fileID: 440491750} + m_Father: {fileID: 1849218150} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &390770348 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390770346} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 200, y: 200} + m_Spacing: {x: 0, y: 0} + m_Constraint: 0 + m_ConstraintCount: 2 +--- !u!222 &390770349 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390770346} + m_CullTransparentMesh: 1 +--- !u!1 &423064482 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 423064486} + - component: {fileID: 423064485} + - component: {fileID: 423064484} + - component: {fileID: 423064483} + m_Layer: 0 + m_Name: Position + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &423064483 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423064482} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2689fc717e65c94c88ced6e08e35908, type: 3} + m_Name: + m_EditorClassIdentifier: + material: {fileID: -876546973899608171, guid: 29291f02465ceda4fad2fa7d2422698e, + type: 3} +--- !u!81 &423064484 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423064482} + m_Enabled: 1 +--- !u!20 &423064485 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423064482} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 10 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 814843923a04487408e5e33ea06ceca4, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &423064486 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423064482} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.94, y: 2.11, z: -2.730823} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &440491749 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 440491750} + - component: {fileID: 440491752} + - component: {fileID: 440491751} + m_Layer: 5 + m_Name: ViewDIr + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &440491750 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440491749} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 390770347} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &440491751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440491749} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: ac88441584a4add4a9066ed004fde47b, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &440491752 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440491749} + m_CullTransparentMesh: 1 +--- !u!1 &584638284 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 584638288} + - component: {fileID: 584638287} + - component: {fileID: 584638286} + - component: {fileID: 584638285} + m_Layer: 0 + m_Name: ViewDir + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &584638285 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584638284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2689fc717e65c94c88ced6e08e35908, type: 3} + m_Name: + m_EditorClassIdentifier: + material: {fileID: -876546973899608171, guid: b5f611447d8b5f14a80b6d53bf04d1ba, + type: 3} +--- !u!81 &584638286 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584638284} + m_Enabled: 1 +--- !u!20 &584638287 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584638284} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 10 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: ac88441584a4add4a9066ed004fde47b, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &584638288 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584638284} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.0770967, y: 0.35829902, z: -2.730823} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &656724707 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 656724711} + - component: {fileID: 656724710} + - component: {fileID: 656724709} + - component: {fileID: 656724708} + m_Layer: 0 + m_Name: BlueTintCamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &656724708 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656724707} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2689fc717e65c94c88ced6e08e35908, type: 3} + m_Name: + m_EditorClassIdentifier: + material: {fileID: -876546973899608171, guid: 3ef4ebc2ab231ca4da3433365dfee29a, + type: 3} +--- !u!81 &656724709 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656724707} + m_Enabled: 1 +--- !u!20 &656724710 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656724707} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: c7402e76ade7cb54fabb71e9db1bde5a, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &656724711 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656724707} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.0770967, y: 0.35829902, z: -2.730823} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &687823239 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 687823240} + - component: {fileID: 687823243} + - component: {fileID: 687823242} + - component: {fileID: 687823241} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &687823240 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687823239} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.577, y: 0, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &687823241 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687823239} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &687823242 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687823239} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &687823243 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687823239} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &705939300 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705939301} + - component: {fileID: 705939304} + - component: {fileID: 705939303} + - component: {fileID: 705939302} + m_Layer: 0 + m_Name: Sphere (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &705939301 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705939300} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.923, y: -2, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &705939302 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705939300} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &705939303 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705939300} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &705939304 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705939300} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &971756569 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 971756575} + - component: {fileID: 971756574} + - component: {fileID: 971756572} + - component: {fileID: 971756571} + - component: {fileID: 971756570} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &971756570 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73231aa468d81ea49bc3d914080de185, type: 3} + m_Name: + m_EditorClassIdentifier: + ImageComparisonSettings: + TargetWidth: 640 + TargetHeight: 360 + PerPixelCorrectnessThreshold: 0.005 + PerPixelGammaThreshold: 0.003921569 + PerPixelAlphaThreshold: 0.003921569 + AverageCorrectnessThreshold: 0.001 + IncorrectPixelsThreshold: 0.0000038146973 + UseHDR: 0 + UseBackBuffer: 0 + ImageResolution: 0 + ActiveImageTests: 1 + ActivePixelTests: 7 + WaitFrames: 0 + XRCompatible: 1 +--- !u!81 &971756571 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_Enabled: 1 +--- !u!124 &971756572 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_Enabled: 1 +--- !u!20 &971756574 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.2509804, g: 0.2509804, b: 0.2509804, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 10 + field of view: 35 + orthographic: 0 + orthographic size: 1 + m_Depth: 1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &971756575 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 971756569} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -4} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1161206970 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1161206972} + - component: {fileID: 1161206971} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1161206971 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161206970} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.86381423, b: 0.5801887, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.802082 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1161206972 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161206970} + m_LocalRotation: {x: 0.24272357, y: -0.37172696, z: 0.10134439, w: 0.8902998} + m_LocalPosition: {x: 3.0529494, y: 0.4445052, z: 2.1566381} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 30.5, y: -45.324, z: 0} +--- !u!1 &1184374069 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1184374070} + - component: {fileID: 1184374072} + - component: {fileID: 1184374071} + m_Layer: 5 + m_Name: Depth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1184374070 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1184374069} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 390770347} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1184374071 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1184374069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 990b3546722118b458c4dcbf976c2565, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1184374072 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1184374069} + m_CullTransparentMesh: 1 +--- !u!1 &1401141290 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1401141291} + - component: {fileID: 1401141294} + - component: {fileID: 1401141293} + - component: {fileID: 1401141292} + m_Layer: 0 + m_Name: Sphere (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1401141291 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401141290} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.923, y: 0.25, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1401141292 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401141290} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1401141293 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401141290} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1401141294 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1401141290} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1566265836 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1566265837} + - component: {fileID: 1566265840} + - component: {fileID: 1566265839} + - component: {fileID: 1566265838} + m_Layer: 0 + m_Name: Sphere (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1566265837 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566265836} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.577, y: -4, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1566265838 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566265836} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1566265839 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566265836} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1566265840 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566265836} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1586390644 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1586390645} + m_Layer: 0 + m_Name: Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1586390645 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586390644} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3.0829494, y: 2.5554948, z: -2.216638} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 687823240} + - {fileID: 75551323} + - {fileID: 55781358} + - {fileID: 705939301} + - {fileID: 324526214} + - {fileID: 1566265837} + - {fileID: 1883972696} + - {fileID: 1677414596} + - {fileID: 1401141291} + - {fileID: 1161206972} + - {fileID: 1590297430} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1590297426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1590297430} + - component: {fileID: 1590297429} + - component: {fileID: 1590297428} + - component: {fileID: 1590297427} + m_Layer: 0 + m_Name: Plane + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!64 &1590297427 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590297426} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1590297428 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590297426} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 84ee8f1b8a5e55f498d61cd54afce293, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 0.5 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1590297429 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590297426} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1590297430 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590297426} + m_LocalRotation: {x: -0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 3.0829494, y: -2.5554948, z: 4.236638} + m_LocalScale: {x: 2.12303, y: 3.0329003, z: 1.5164502} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} +--- !u!1 &1677414595 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1677414596} + - component: {fileID: 1677414599} + - component: {fileID: 1677414598} + - component: {fileID: 1677414597} + m_Layer: 0 + m_Name: Sphere (7) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1677414596 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1677414595} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4.077, y: 0, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1677414597 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1677414595} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1677414598 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1677414595} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1677414599 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1677414595} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1707275099 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1707275100} + - component: {fileID: 1707275102} + - component: {fileID: 1707275101} + m_Layer: 5 + m_Name: Position + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1707275100 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1707275099} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 390770347} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1707275101 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1707275099} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 8400000, guid: 814843923a04487408e5e33ea06ceca4, type: 2} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1707275102 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1707275099} + m_CullTransparentMesh: 1 +--- !u!1 &1823639353 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1823639357} + - component: {fileID: 1823639356} + - component: {fileID: 1823639355} + - component: {fileID: 1823639354} + m_Layer: 0 + m_Name: DepthCamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1823639354 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823639353} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2689fc717e65c94c88ced6e08e35908, type: 3} + m_Name: + m_EditorClassIdentifier: + material: {fileID: -876546973899608171, guid: 0a4dbcc78ae8c684aa9954ed82a13c9f, + type: 3} +--- !u!81 &1823639355 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823639353} + m_Enabled: 1 +--- !u!20 &1823639356 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823639353} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 10 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 990b3546722118b458c4dcbf976c2565, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1823639357 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823639353} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.0770967, y: 0.35829902, z: -2.730823} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1849218146 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1849218150} + - component: {fileID: 1849218149} + - component: {fileID: 1849218148} + - component: {fileID: 1849218147} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1849218147 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849218146} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1849218148 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849218146} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1849218149 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849218146} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 971756574} + m_PlaneDistance: 1 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1849218150 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849218146} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 390770347} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1883972695 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1883972696} + - component: {fileID: 1883972699} + - component: {fileID: 1883972698} + - component: {fileID: 1883972697} + m_Layer: 0 + m_Name: Sphere (6) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1883972696 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883972695} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.8270001, y: -2.75, z: 3.674} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1586390645} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1883972697 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883972695} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1883972698 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883972695} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1883972699 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883972695} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity.meta new file mode 100644 index 00000000000..9e92319b74d --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects.unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 973136f6e85b5aa408b497d12825f950 +labels: +- TestRunnerBake +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture new file mode 100644 index 00000000000..cb09e94e7b6 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BlueTint + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture.meta new file mode 100644 index 00000000000..f1bea06f2e6 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/BlueTint.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c7402e76ade7cb54fabb71e9db1bde5a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects.meta new file mode 100644 index 00000000000..f54deecb69b --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d0d472109b12b70479c91664abd96d7d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph new file mode 100644 index 00000000000..fde1b0cde95 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph @@ -0,0 +1,894 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "4703b42838ec4f37bc8d8070294bc32c", + "m_Properties": [ + { + "m_Id": "f966897221e1489d96fd269700e5cdc4" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "1516a5cc5e364eb2bb88883e73e795a0" + } + ], + "m_Nodes": [ + { + "m_Id": "d4f8fd4027964e4cb860c4bb25efbc48" + }, + { + "m_Id": "a3eadd8853e34a87a17bb5606c2354de" + }, + { + "m_Id": "61eeddf50f71431ebc58b73a051050e0" + }, + { + "m_Id": "bed70ebaaedb475baee4e125b3042634" + }, + { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + { + "m_Id": "491999b6539d4dbdb35e66b111dc2986" + }, + { + "m_Id": "e8ce1ee185774612ba37424b28d54de3" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "491999b6539d4dbdb35e66b111dc2986" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "61eeddf50f71431ebc58b73a051050e0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bed70ebaaedb475baee4e125b3042634" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d4f8fd4027964e4cb860c4bb25efbc48" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bed70ebaaedb475baee4e125b3042634" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e8ce1ee185774612ba37424b28d54de3" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9961d6b5fb2947ac9285a35d8506cf62" + }, + "m_SlotId": 2 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 156.0, + "y": 105.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 156.0, + "y": 305.0 + }, + "m_Blocks": [ + { + "m_Id": "d4f8fd4027964e4cb860c4bb25efbc48" + }, + { + "m_Id": "a3eadd8853e34a87a17bb5606c2354de" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "6ecd847a446e43d9b8e9d11cb120c9fd" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "0617bdbd40c441609f614b9bc22f821b", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.13568639755249024, + "y": 0.0, + "z": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "0920e1f93061432387aadce557d92dad", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0d74a81ce17d4c4b8bb700d42cc5a0d5", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "1516a5cc5e364eb2bb88883e73e795a0", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "f966897221e1489d96fd269700e5cdc4" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "15f45a152739428c8c76c5df8aab27f6", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "1c308cf1bf44498788c64fa67ef88cb4", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_depthWriteMode": 0, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "23d711cadcfa4342b839d4b869e1c466", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "35a1707d114d43dfa74fd8a2bc7dc504", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.ColorNode", + "m_ObjectId": "491999b6539d4dbdb35e66b111dc2986", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -397.0, + "y": 397.0, + "width": 208.0, + "height": 127.0 + } + }, + "m_Slots": [ + { + "m_Id": "15f45a152739428c8c76c5df8aab27f6" + } + ], + "synonyms": [ + "rgba" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Color": { + "color": { + "r": 0.14122533798217774, + "g": 0.0, + "b": 1.0, + "a": 0.0 + }, + "mode": 0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "5213e99ddce14ea9ae8bbad3d8008a96", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "61eeddf50f71431ebc58b73a051050e0", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -531.0, + "y": 149.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "0920e1f93061432387aadce557d92dad" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "f966897221e1489d96fd269700e5cdc4" + } +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInTarget", + "m_ObjectId": "6ecd847a446e43d9b8e9d11cb120c9fd", + "m_SubTargetData": [ + { + "m_Id": "1c308cf1bf44498788c64fa67ef88cb4" + } + ], + "m_ActiveSubTarget": { + "m_Id": "bea377201c734498a42e56bd7ab99191" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZWriteControl": 0, + "m_ZTestMode": 4, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "814f47bf328a4afbb3f3544176f48fe2", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "83e5719e54d143faa2a80753c0b8f7e8", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8cbe61b854c644e9a5ceec284f868d10", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "942e008c4be74b8daedd766ff9482432", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.LerpNode", + "m_ObjectId": "9961d6b5fb2947ac9285a35d8506cf62", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Lerp", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -87.0, + "y": 277.0, + "width": 130.0, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "f31f0eb970ec4f1a9c4766e3a16baf68" + }, + { + "m_Id": "814f47bf328a4afbb3f3544176f48fe2" + }, + { + "m_Id": "db0f2b9956f74b42821e02c5a8b718d7" + }, + { + "m_Id": "e7803a31502548ef89759bd3cfa2ff5e" + } + ], + "synonyms": [ + "mix", + "blend", + "linear interpolate" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a3eadd8853e34a87a17bb5606c2354de", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a9d3fccbc5c4457888de0c3cc7da46f6" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a9d3fccbc5c4457888de0c3cc7da46f6", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInFullscreenSubTarget", + "m_ObjectId": "bea377201c734498a42e56bd7ab99191" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "bed70ebaaedb475baee4e125b3042634", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -382.0, + "y": 115.0, + "width": 183.0, + "height": 251.0 + } + }, + "m_Slots": [ + { + "m_Id": "83e5719e54d143faa2a80753c0b8f7e8" + }, + { + "m_Id": "f978a2dac07e47159672a0763a63376c" + }, + { + "m_Id": "8cbe61b854c644e9a5ceec284f868d10" + }, + { + "m_Id": "35a1707d114d43dfa74fd8a2bc7dc504" + }, + { + "m_Id": "23d711cadcfa4342b839d4b869e1c466" + }, + { + "m_Id": "942e008c4be74b8daedd766ff9482432" + }, + { + "m_Id": "f2da9d5288d74471a2a0daf3bd5fad93" + }, + { + "m_Id": "5213e99ddce14ea9ae8bbad3d8008a96" + } + ], + "synonyms": [ + "tex2d" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "d4f8fd4027964e4cb860c4bb25efbc48", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "0617bdbd40c441609f614b9bc22f821b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "db0f2b9956f74b42821e02c5a8b718d7", + "m_Id": 2, + "m_DisplayName": "T", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "T", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e7803a31502548ef89759bd3cfa2ff5e", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1Node", + "m_ObjectId": "e8ce1ee185774612ba37424b28d54de3", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Float", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -325.0, + "y": 546.0, + "width": 126.0, + "height": 77.0 + } + }, + "m_Slots": [ + { + "m_Id": "f069b01a020b4b5cae9cb3158c34ab26" + }, + { + "m_Id": "0d74a81ce17d4c4b8bb700d42cc5a0d5" + } + ], + "synonyms": [ + "Vector 1", + "1", + "v1", + "vec1", + "scalar" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Value": 0.0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f069b01a020b4b5cae9cb3158c34ab26", + "m_Id": 1, + "m_DisplayName": "X", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "X", + "m_StageCapability": 3, + "m_Value": 0.5, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "f2da9d5288d74471a2a0daf3bd5fad93", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f31f0eb970ec4f1a9c4766e3a16baf68", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "f966897221e1489d96fd269700e5cdc4", + "m_Guid": { + "m_GuidSerialized": "cda9fee5-88a1-4a42-ac13-15c59000fafc" + }, + "m_Name": "_MainTex", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_MainTex", + "m_DefaultReferenceName": "_MainTex", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f978a2dac07e47159672a0763a63376c", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph.meta new file mode 100644 index 00000000000..58e013a2a1f --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/BlueTint.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3ef4ebc2ab231ca4da3433365dfee29a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph new file mode 100644 index 00000000000..ac156da1138 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph @@ -0,0 +1,570 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "d90f842bb50940d0898cc0b1672e40c7", + "m_Properties": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "bf9c98344459461d9b16983355e7bff6" + } + ], + "m_Nodes": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + }, + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + }, + { + "m_Id": "ffdbc5cb9ea346f5accac639490d4e10" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ffdbc5cb9ea346f5accac639490d4e10" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "18690e6cecb1442ea84378e37c34a182" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ScreenPositionMaterialSlot", + "m_ObjectId": "183dc11aec134074be2c7bb589938a72", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [], + "m_ScreenSpaceType": 0 +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInTarget", + "m_ObjectId": "18690e6cecb1442ea84378e37c34a182", + "m_SubTargetData": [ + { + "m_Id": "c9a38d23340040689146bab6fa8db3d7" + } + ], + "m_ActiveSubTarget": { + "m_Id": "3a80f3c6e4f3468d9f7fc967ca907c32" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZWriteControl": 0, + "m_ZTestMode": 4, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "33540e5e9a35475a8e5712cd72467969", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInFullscreenSubTarget", + "m_ObjectId": "3a80f3c6e4f3468d9f7fc967ca907c32" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "5ddc3a5040794841b416534f8d7a7005", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "f1121601d4bb42e8b5d988d0c70a0e1d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "85e3c32d9692433aac48d1647db8dc5c", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "95faf0c60d83409e9a14d804800e2ef5", + "m_Guid": { + "m_GuidSerialized": "2891762a-caff-46b8-886a-a60f9076d254" + }, + "m_Name": "_CameraDepthNormalsTexture", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_CameraDepthNormalsTexture", + "m_DefaultReferenceName": "_CameraDepthNormalsTexture", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "9ec592304c3c45ceab688d3d116eaa8b", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a14a2592d34a41dc836eadbdb9c586cc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "9ec592304c3c45ceab688d3d116eaa8b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a7962bdeae494b5da074e4817f625114", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "85e3c32d9692433aac48d1647db8dc5c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b3fb6f13466b4b33a6471b91d5414fd5", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "bf9c98344459461d9b16983355e7bff6", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "c92cbbfb65a74873986c38a798c50f03", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d91a8a45275c4bcdabfa2a91d9164154" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "c9a38d23340040689146bab6fa8db3d7", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_depthWriteMode": 0, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "d91a8a45275c4bcdabfa2a91d9164154", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e5bc309f2e9441f79839f40d57b85928", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b3fb6f13466b4b33a6471b91d5414fd5" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "f1121601d4bb42e8b5d988d0c70a0e1d", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SceneDepthNode", + "m_ObjectId": "ffdbc5cb9ea346f5accac639490d4e10", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Scene Depth", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -335.0, + "y": 171.0, + "width": 145.0, + "height": 112.0 + } + }, + "m_Slots": [ + { + "m_Id": "183dc11aec134074be2c7bb589938a72" + }, + { + "m_Id": "33540e5e9a35475a8e5712cd72467969" + } + ], + "synonyms": [ + "zbuffer", + "zdepth" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_DepthSamplingMode": 0 +} + diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph.meta new file mode 100644 index 00000000000..544ba9d0cb9 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Depth.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0a4dbcc78ae8c684aa9954ed82a13c9f +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph new file mode 100644 index 00000000000..137ac85aedd --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph @@ -0,0 +1,549 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "d90f842bb50940d0898cc0b1672e40c7", + "m_Properties": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "bf9c98344459461d9b16983355e7bff6" + } + ], + "m_Nodes": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + }, + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + }, + { + "m_Id": "fd6762317d3d47e9bdfc4ad861b48607" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "fd6762317d3d47e9bdfc4ad861b48607" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "18690e6cecb1442ea84378e37c34a182" + } + ] +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInTarget", + "m_ObjectId": "18690e6cecb1442ea84378e37c34a182", + "m_SubTargetData": [ + { + "m_Id": "c9a38d23340040689146bab6fa8db3d7" + } + ], + "m_ActiveSubTarget": { + "m_Id": "3a80f3c6e4f3468d9f7fc967ca907c32" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZWriteControl": 0, + "m_ZTestMode": 4, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInFullscreenSubTarget", + "m_ObjectId": "3a80f3c6e4f3468d9f7fc967ca907c32" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "5ddc3a5040794841b416534f8d7a7005", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "f1121601d4bb42e8b5d988d0c70a0e1d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "85e3c32d9692433aac48d1647db8dc5c", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "95faf0c60d83409e9a14d804800e2ef5", + "m_Guid": { + "m_GuidSerialized": "2891762a-caff-46b8-886a-a60f9076d254" + }, + "m_Name": "_CameraDepthNormalsTexture", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_CameraDepthNormalsTexture", + "m_DefaultReferenceName": "_CameraDepthNormalsTexture", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "9ec592304c3c45ceab688d3d116eaa8b", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a14a2592d34a41dc836eadbdb9c586cc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "9ec592304c3c45ceab688d3d116eaa8b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a7962bdeae494b5da074e4817f625114", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "85e3c32d9692433aac48d1647db8dc5c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b3fb6f13466b4b33a6471b91d5414fd5", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "b9d8fd7390bf46148db332b330856323", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "bf9c98344459461d9b16983355e7bff6", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "c92cbbfb65a74873986c38a798c50f03", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d91a8a45275c4bcdabfa2a91d9164154" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "c9a38d23340040689146bab6fa8db3d7", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_depthWriteMode": 0, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "d91a8a45275c4bcdabfa2a91d9164154", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e5bc309f2e9441f79839f40d57b85928", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b3fb6f13466b4b33a6471b91d5414fd5" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "f1121601d4bb42e8b5d988d0c70a0e1d", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.PositionNode", + "m_ObjectId": "fd6762317d3d47e9bdfc4ad861b48607", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -310.0, + "y": 226.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b9d8fd7390bf46148db332b330856323" + } + ], + "synonyms": [ + "location" + ], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Space": 4, + "m_PositionSource": 0 +} + diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph.meta new file mode 100644 index 00000000000..cd8a34d1234 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/Position.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 29291f02465ceda4fad2fa7d2422698e +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph new file mode 100644 index 00000000000..9c57ad0563d --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph @@ -0,0 +1,548 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "d90f842bb50940d0898cc0b1672e40c7", + "m_Properties": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "bf9c98344459461d9b16983355e7bff6" + } + ], + "m_Nodes": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + }, + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + }, + { + "m_Id": "c1662016c9094f98ba5a18ee77b287cb" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c1662016c9094f98ba5a18ee77b287cb" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "c92cbbfb65a74873986c38a798c50f03" + }, + { + "m_Id": "5ddc3a5040794841b416534f8d7a7005" + }, + { + "m_Id": "a14a2592d34a41dc836eadbdb9c586cc" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "a7962bdeae494b5da074e4817f625114" + }, + { + "m_Id": "e5bc309f2e9441f79839f40d57b85928" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "18690e6cecb1442ea84378e37c34a182" + } + ] +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInTarget", + "m_ObjectId": "18690e6cecb1442ea84378e37c34a182", + "m_SubTargetData": [ + { + "m_Id": "c9a38d23340040689146bab6fa8db3d7" + } + ], + "m_ActiveSubTarget": { + "m_Id": "3a80f3c6e4f3468d9f7fc967ca907c32" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZWriteControl": 0, + "m_ZTestMode": 4, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CustomEditorGUI": "" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInFullscreenSubTarget", + "m_ObjectId": "3a80f3c6e4f3468d9f7fc967ca907c32" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "5ddc3a5040794841b416534f8d7a7005", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "f1121601d4bb42e8b5d988d0c70a0e1d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "85e3c32d9692433aac48d1647db8dc5c", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "95faf0c60d83409e9a14d804800e2ef5", + "m_Guid": { + "m_GuidSerialized": "2891762a-caff-46b8-886a-a60f9076d254" + }, + "m_Name": "_CameraDepthNormalsTexture", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_CameraDepthNormalsTexture", + "m_DefaultReferenceName": "_CameraDepthNormalsTexture", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "9cef1273d9bd4433a743baec7d388179", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "9ec592304c3c45ceab688d3d116eaa8b", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a14a2592d34a41dc836eadbdb9c586cc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "9ec592304c3c45ceab688d3d116eaa8b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a7962bdeae494b5da074e4817f625114", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "85e3c32d9692433aac48d1647db8dc5c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b3fb6f13466b4b33a6471b91d5414fd5", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "bf9c98344459461d9b16983355e7bff6", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "95faf0c60d83409e9a14d804800e2ef5" + } + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.ViewDirectionNode", + "m_ObjectId": "c1662016c9094f98ba5a18ee77b287cb", + "m_Group": { + "m_Id": "" + }, + "m_Name": "View Direction", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -297.0, + "y": 200.0, + "width": 208.0, + "height": 315.0 + } + }, + "m_Slots": [ + { + "m_Id": "9cef1273d9bd4433a743baec7d388179" + } + ], + "synonyms": [ + "eye direction" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Space": 2 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "c92cbbfb65a74873986c38a798c50f03", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d91a8a45275c4bcdabfa2a91d9164154" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Fullscreen.ShaderGraph.FullscreenData", + "m_ObjectId": "c9a38d23340040689146bab6fa8db3d7", + "m_Version": 0, + "m_fullscreenMode": 0, + "m_BlendMode": 0, + "m_SrcColorBlendMode": 0, + "m_DstColorBlendMode": 1, + "m_ColorBlendOperation": 0, + "m_SrcAlphaBlendMode": 0, + "m_DstAlphaBlendMode": 1, + "m_AlphaBlendOperation": 0, + "m_EnableStencil": false, + "m_StencilReference": 0, + "m_StencilReadMask": 255, + "m_StencilWriteMask": 255, + "m_StencilCompareFunction": 8, + "m_StencilPassOperation": 0, + "m_StencilFailOperation": 0, + "m_StencilDepthFailOperation": 0, + "m_DepthWrite": false, + "m_depthWriteMode": 0, + "m_AllowMaterialOverride": false, + "m_DepthTestMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "d91a8a45275c4bcdabfa2a91d9164154", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e5bc309f2e9441f79839f40d57b85928", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b3fb6f13466b4b33a6471b91d5414fd5" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "f1121601d4bb42e8b5d988d0c70a0e1d", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph.meta new file mode 100644 index 00000000000..1a22c2d08bd --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/CameraEffects/ViewDIr.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b5f611447d8b5f14a80b6d53bf04d1ba +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture new file mode 100644 index 00000000000..4e26bf7d993 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Depth + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture.meta new file mode 100644 index 00000000000..e4730383706 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Depth.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 990b3546722118b458c4dcbf976c2565 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs new file mode 100644 index 00000000000..7c44c333da0 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs @@ -0,0 +1,29 @@ +using System; +using UnityEngine; +using UnityEngine.Rendering; + +[RequireComponent(typeof(Camera))] +[ExecuteInEditMode] +public class ImageEffects : MonoBehaviour +{ + public Material material; + + void Start() + { + if (null == material || null == material.shader || + !material.shader.isSupported) + { + enabled = false; + return; + } + GetComponent().depthTextureMode = DepthTextureMode.DepthNormals; + } + + void OnRenderImage(RenderTexture source, RenderTexture destination) + { + var cmd = new CommandBuffer(); + // cmd.SetGlobalTexture("_CameraDepthNormalsTexture", new RenderTargetIdentifier(BuiltinRenderTextureType.DepthNormals)); + cmd.Blit(source, destination, material, 1); + Graphics.ExecuteCommandBuffer(cmd); + } +} diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs.meta new file mode 100644 index 00000000000..ead5c74314f --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ImageEffects.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a2689fc717e65c94c88ced6e08e35908 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset new file mode 100644 index 0000000000000000000000000000000000000000..d8dfe704a40bf3893c8e99c4b8fe2b7912137b85 GIT binary patch literal 19456 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 literal 0 HcmV?d00001 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset.meta new file mode 100644 index 00000000000..bf038f7bf6d --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/LightingData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0443133b73b356f449027ce62f5cc170 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 6475696996188705980 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png new file mode 100644 index 00000000000..908954c7c4a --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9313e05a8a7cc6802f826b59ce7579f3399eb80e37ea2ea86f172dff0d02ddc +size 122290 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png.meta new file mode 100644 index 00000000000..1d28d58a74c --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_dir.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 4ad728ba888e9564f9b11d227720d309 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 1 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 3 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 12 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_light.exr b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/Lightmap-0_comp_light.exr new file mode 100644 index 0000000000000000000000000000000000000000..70d1e7251ebca2c25c0a796b3ce5e0ce07c4a3a3 GIT binary patch literal 232822 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 ?cz8pn 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ƊY#AwVfuO8@Lc45ivHGs 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 vsLN1q1-vU`man)L&1LfV1EZ@>F04 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 literal 0 HcmV?d00001 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr.meta new file mode 100644 index 00000000000..e915df2f02b --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ReflectionProbe-0.exr.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 58283f4ad2597c94db7ed96968285c9f +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 1 + seamlessCubemap: 1 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 2 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 100 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture new file mode 100644 index 00000000000..efeba5b999b --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ViewDir + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 + m_Width: 256 + m_Height: 256 + m_AntiAliasing: 1 + m_MipCount: -1 + m_DepthStencilFormat: 0 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture.meta b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture.meta new file mode 100644 index 00000000000..7b34b59f729 --- /dev/null +++ b/TestProjects/BuiltInGraphicsTest_Foundation/Assets/Scenes/070_FullscreenEffects/ViewDir.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ac88441584a4add4a9066ed004fde47b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 8400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/BuiltInGraphicsTest_Foundation/ProjectSettings/EditorBuildSettings.asset b/TestProjects/BuiltInGraphicsTest_Foundation/ProjectSettings/EditorBuildSettings.asset index f7ac0a0b9b7..a182cc8fe2e 100644 --- a/TestProjects/BuiltInGraphicsTest_Foundation/ProjectSettings/EditorBuildSettings.asset +++ b/TestProjects/BuiltInGraphicsTest_Foundation/ProjectSettings/EditorBuildSettings.asset @@ -71,4 +71,6 @@ EditorBuildSettings: - enabled: 1 path: Assets/Scenes/063_Lighting_BasicVertexPosition.unity guid: e2daf39e5a0f09744a2a6851d38e7081 - m_configObjects: {} + - enabled: 1 + path: Assets/Scenes/070_FullscreenEffects.unity + guid: 973136f6e85b5aa408b497d12825f950 From cf7b6ea3af0e05f0d43a4412aba1c865c2add493 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 13:05:44 +0100 Subject: [PATCH 093/108] Fix custom pass stencil message displayed when target depth buffer is Custom --- .../RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs index d16d013ed78..110384bac8b 100644 --- a/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs +++ b/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs @@ -87,7 +87,7 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) GetStencilInfo(mat, out bool stencilEnabled, out int writeMask); - if (stencilEnabled) + if (stencilEnabled && targetDepthBuffer != CustomPass.TargetBuffer.Custom) { if (!m_ShowStencilInfoBox) { @@ -128,8 +128,6 @@ protected override void DoPassGUI(SerializedProperty customPass, Rect rect) } } - - bool DoesWriteMaskContainsReservedBits(int writeMask) { if (targetDepthBuffer == CustomPass.TargetBuffer.Custom) From 34b1dc2db49b1018187428f83c51f20871331308 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 13:08:40 +0100 Subject: [PATCH 094/108] Remove GLES 2 support + fix DX12 API --- .../Targets/Fullscreen/FullscreenSubTarget.cs | 20 +++++++++++++++---- .../Includes/FullscreenDrawProcedural.hlsl | 4 ---- .../Templates/SharedCode.template.hlsl | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index aed0a5d130f..14995304dc6 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -353,6 +353,20 @@ protected virtual DefineCollection GetPassDefines(FullscreenCompatibility compat protected virtual KeywordCollection GetPassKeywords(FullscreenCompatibility compatibility) => new KeywordCollection(); + static StructDescriptor GetFullscreenAttributes() + { + return new StructDescriptor() + { + name = "Attributes", + packFields = false, + fields = new FieldDescriptor[] + { + StructFields.Attributes.instanceID, + StructFields.Attributes.vertexID, + } + }; + } + public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility compatibility) { var fullscreenPass = new PassDescriptor @@ -383,7 +397,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com // Fields structs = new StructCollection { - { Structs.Attributes }, + { GetFullscreenAttributes() }, { Structs.SurfaceDescriptionInputs }, { Varyings }, { Structs.VertexDescriptionInputs }, @@ -391,9 +405,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com fieldDependencies = FieldDependencies.Default, requiredFields = new FieldCollection { - StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code - StructFields.Attributes.positionOS, - StructFields.Varyings.texCoord0, + StructFields.Varyings.texCoord0, // Always need texCoord0 to calculate the other properties in fullscreen node code StructFields.Varyings.texCoord1, // We store the view direction computed in the vertex in the texCoord1 StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case }, diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl index fa2ff9ab93f..9c52204af53 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl @@ -1,11 +1,7 @@ PackedVaryings vert(Attributes input) { Varyings output = (Varyings)0; -#if SHADER_API_GLES - output.positionCS = float4(input.positionOS.xyz, 1); -#else output.positionCS = GetDrawProceduralVertexPosition(input.vertexID); -#endif BuildVaryings(input, output); PackedVaryings packedOutput = PackVaryings(output); return packedOutput; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index 246dd3d15ee..b69be33c3a2 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -3,7 +3,7 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) SurfaceDescriptionInputs output; ZERO_INITIALIZE(SurfaceDescriptionInputs, output); - // Normal is not available yet, TODO: add a node to sample the normal buffer if it exists + // Normal is not available yet through ShaderGraph inputs. It needs to be sampled in RenderPipeline specific nodes float3 normalWS = float3(0, 0, 1); float4 tangentWS = float4(0, 1, 0, 0); // We can't access the tangent in screen space From 1a38bc6c4d32e3bd06658dceadb0089c8522170f Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 14:59:08 +0100 Subject: [PATCH 095/108] Removed BakedGINode for Fullscreen target --- .../Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs index 4e154364767..8b2fa09e02b 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fullscreen/ShaderGraph/HDFullscreenSubtarget.cs @@ -30,6 +30,13 @@ public override void Setup(ref TargetSetupContext context) { CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph } }; + public override bool IsNodeAllowedBySubTarget(Type nodeType) + { + if (nodeType == typeof(BakedGINode)) + return false; + return base.IsNodeAllowedBySubTarget(nodeType); + } + // We don't need the save context / update materials for now public override object saveContext => null; From 75b5357eefd0996ad7e45faa69577ca6f918cec0 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 17:40:10 +0100 Subject: [PATCH 096/108] Added reference images for Fullscreen SG --- .../IPhonePlayer/Metal/None/Fullscreen.png | 3 + .../Metal/None/Fullscreen.png.meta | 99 +++++++++++++++++++ .../LinuxPlayer/Vulkan/None/Fullscreen.png | 3 + .../Vulkan/None/Fullscreen.png.meta | 99 +++++++++++++++++++ .../Direct3D11/None/Fullscreen.png | 3 + .../Direct3D11/None/Fullscreen.png.meta | 99 +++++++++++++++++++ 6 files changed, 306 insertions(+) create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png.meta create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png.meta create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png.meta diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png new file mode 100644 index 00000000000..cc1fb9d108a --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:561826874c3c607d291fecde6eec1acf4a9726748dbb3aa6b8de9bcc68d0aeb2 +size 15364 diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png.meta b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png.meta new file mode 100644 index 00000000000..8d3fefecce2 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 2cf07196957a85d49b59d9b054e1499d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png new file mode 100644 index 00000000000..eba76015e39 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b936b49ea69ef35140c92c12d8f7cb4b07bd596be89302e6ec451bdcf316766 +size 15556 diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png.meta b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png.meta new file mode 100644 index 00000000000..e97fe9fae75 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 2637faaeac8ba03429e503bd67a16297 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png new file mode 100644 index 00000000000..eba76015e39 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b936b49ea69ef35140c92c12d8f7cb4b07bd596be89302e6ec451bdcf316766 +size 15556 diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png.meta b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png.meta new file mode 100644 index 00000000000..df358d9f821 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 2a49cd2e9d90ed746885af7ee937f653 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: From 1bcb2163b078f6366a1838eb1d9d9be588dea6ce Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 17:44:09 +0100 Subject: [PATCH 097/108] Added reference images for HDRP tests --- .../Vulkan/None/8210_Fullscreen.png | 3 + .../Vulkan/None/8210_Fullscreen.png.meta | 111 ++++++++++++++++++ .../Direct3D12/None/8210_Fullscreen.png | 3 + .../Direct3D12/None/8210_Fullscreen.png.meta | 111 ++++++++++++++++++ .../Vulkan/None/8210_Fullscreen.png | 3 + .../Vulkan/None/8210_Fullscreen.png.meta | 111 ++++++++++++++++++ 6 files changed, 342 insertions(+) create mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/LinuxEditor/Vulkan/None/8210_Fullscreen.png create mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/LinuxEditor/Vulkan/None/8210_Fullscreen.png.meta create mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D12/None/8210_Fullscreen.png create mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D12/None/8210_Fullscreen.png.meta create mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Vulkan/None/8210_Fullscreen.png create mode 100644 TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Vulkan/None/8210_Fullscreen.png.meta diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/LinuxEditor/Vulkan/None/8210_Fullscreen.png b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/LinuxEditor/Vulkan/None/8210_Fullscreen.png new file mode 100644 index 00000000000..b1c16e329c9 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/LinuxEditor/Vulkan/None/8210_Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e21d4c9073daddde69fbe1d20c8d95ff8f0ad21ec7ac44fb062c0e04a8246cd +size 26816 diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/LinuxEditor/Vulkan/None/8210_Fullscreen.png.meta b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/LinuxEditor/Vulkan/None/8210_Fullscreen.png.meta new file mode 100644 index 00000000000..35dfe82e4a7 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/LinuxEditor/Vulkan/None/8210_Fullscreen.png.meta @@ -0,0 +1,111 @@ +fileFormatVersion: 2 +guid: 2512e7fdafff73b428791800089880ba +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D12/None/8210_Fullscreen.png b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D12/None/8210_Fullscreen.png new file mode 100644 index 00000000000..4b5ae66d2b8 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D12/None/8210_Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0953af27454fe3424cc02bee4274b708f2dc29307462f52d3e7a55c09962d99a +size 26842 diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D12/None/8210_Fullscreen.png.meta b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D12/None/8210_Fullscreen.png.meta new file mode 100644 index 00000000000..526bced6808 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Direct3D12/None/8210_Fullscreen.png.meta @@ -0,0 +1,111 @@ +fileFormatVersion: 2 +guid: 30e6ead0d76fe1b4ba95468b563b9a52 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Vulkan/None/8210_Fullscreen.png b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Vulkan/None/8210_Fullscreen.png new file mode 100644 index 00000000000..b1c16e329c9 --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Vulkan/None/8210_Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e21d4c9073daddde69fbe1d20c8d95ff8f0ad21ec7ac44fb062c0e04a8246cd +size 26816 diff --git a/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Vulkan/None/8210_Fullscreen.png.meta b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Vulkan/None/8210_Fullscreen.png.meta new file mode 100644 index 00000000000..c89f3a951ad --- /dev/null +++ b/TestProjects/HDRP_Tests/Assets/ReferenceImages/Linear/WindowsEditor/Vulkan/None/8210_Fullscreen.png.meta @@ -0,0 +1,111 @@ +fileFormatVersion: 2 +guid: 28b894bb56375fe4196e073e8dda6d78 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: From ea3a457e7c0f8efc49a1e3f3bce3e9212a1eb1b4 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 11:17:47 +0100 Subject: [PATCH 098/108] Removed BlitSource input in the HDSampleBuffer node + fix codegen for OSX --- .../8210_CustomPP1.shadergraph | 1 + .../8210_CustomPP2.shadergraph | 1 + .../ShaderGraph/Nodes/HDSampleBufferNode.cs | 39 ++----------------- 3 files changed, 6 insertions(+), 35 deletions(-) diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph index 5c1a2e452ec..e7ca5143234 100644 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP1.shadergraph @@ -468,6 +468,7 @@ "m_StencilFailOperation": 0, "m_StencilDepthFailOperation": 0, "m_DepthWrite": false, + "m_depthWriteMode": 0, "m_AllowMaterialOverride": false, "m_DepthTestMode": 0 } diff --git a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph index 8f02bacf237..1bfcc45e0ce 100644 --- a/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph +++ b/TestProjects/HDRP_Tests/Assets/GraphicTests/Scenes/8x_ShaderGraph/8210_Fullscreen/8210_CustomPP2.shadergraph @@ -316,6 +316,7 @@ "m_StencilFailOperation": 0, "m_StencilDepthFailOperation": 0, "m_DepthWrite": false, + "m_depthWriteMode": 0, "m_AllowMaterialOverride": false, "m_DepthTestMode": 0 } diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs index d0e8d0d25c7..b001c970d8b 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/Nodes/HDSampleBufferNode.cs @@ -29,7 +29,6 @@ public enum BufferType Roughness, MotionVectors, PostProcessInput, - BlitSource, } [SerializeField] @@ -84,7 +83,6 @@ public sealed override void UpdateNodeAfterDeserialization() channelCount = 2; break; case BufferType.PostProcessInput: - case BufferType.BlitSource: AddSlot(new ColorRGBAMaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Color.black, ShaderStageCapability.Fragment)); channelCount = 4; break; @@ -98,35 +96,6 @@ public sealed override void UpdateNodeAfterDeserialization() }); } - public override void CollectShaderProperties(PropertyCollector properties, GenerationMode generationMode) - { - if (generationMode.IsPreview()) - return; - - if (bufferType == BufferType.BlitSource) - { - properties.AddShaderProperty(new Texture2DArrayShaderProperty - { - overrideReferenceName = "_MainTex", - displayName = "_MainTex", - hidden = true, - generatePropertyBlock = true, - isMainTexture = true, - }); - } - else if (bufferType == BufferType.PostProcessInput) - { - properties.AddShaderProperty(new Texture2DArrayShaderProperty - { - overrideReferenceName = nameof(HDShaderIDs._CustomPostProcessInput), - displayName = nameof(HDShaderIDs._CustomPostProcessInput), - hidden = true, - generatePropertyBlock = true, - isMainTexture = true, - }); - } - } - string GetFunctionName() => $"Unity_HDRP_SampleBuffer_{bufferType}_$precision"; public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) @@ -139,6 +108,10 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/NormalBuffer.hlsl\""); s.AppendLine("#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Builtin/BuiltinData.hlsl\""); + // Declare post process input here because the property collector don't support TEXTURE_X type + s.AppendLine($"TEXTURE2D_X({nameof(HDShaderIDs._CustomPostProcessInput)});"); + s.AppendLine($"SAMPLER(sampler{nameof(HDShaderIDs._CustomPostProcessInput)});"); + s.AppendLine("$precision{1} {0}($precision2 uv, SamplerState samplerState)", GetFunctionName(), channelCount); using (s.BlockScope()) { @@ -168,9 +141,6 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener case BufferType.PostProcessInput: s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); break; - case BufferType.BlitSource: - s.AppendLine($"return SAMPLE_TEXTURE2D_X_LOD(_MainTex, samplerState, uv, 0); "); - break; default: s.AppendLine("return 0.0;"); break; @@ -197,7 +167,6 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener s.AppendLine("return uv.x;"); break; case BufferType.PostProcessInput: - case BufferType.BlitSource: default: s.AppendLine("return 0.0;"); break; From 1034364b68018a308451640353265f5caa5fd432 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 11:31:04 +0100 Subject: [PATCH 099/108] Remove is main texture on 2D array --- .../Editor/Data/Graphs/Texture2DArrayShaderProperty.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs b/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs index f7a75d6ab30..ff6d8bab4d4 100644 --- a/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs +++ b/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs @@ -18,13 +18,9 @@ internal Texture2DArrayShaderProperty() internal override bool isExposable => true; internal override bool isRenamable => true; - [SerializeField] - internal bool isMainTexture = false; internal string modifiableTagString => modifiable ? "" : "[NonModifiableTextureData]"; - internal string mainTextureString => isMainTexture ? "[MainTexture]" : ""; - internal override string GetPropertyBlockString() { return $"{hideTagString}{modifiableTagString}[NoScaleOffset]{referenceName}(\"{displayName}\", 2DArray) = \"\" {{}}"; @@ -85,7 +81,6 @@ internal override ShaderInput Copy() { displayName = displayName, value = value, - isMainTexture = isMainTexture }; } } From 66e55358b9ec3bbe5b44267a220c0cd3278362c9 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 13:08:40 +0100 Subject: [PATCH 100/108] Remove GLES 2 support + fix DX12 API # Conflicts: # com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl --- .../Targets/Fullscreen/FullscreenSubTarget.cs | 20 +++++++++++++++---- .../Includes/FullscreenDrawProcedural.hlsl | 4 ---- .../Templates/SharedCode.template.hlsl | 1 + 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 30112c46d97..e0208dadcf8 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -327,6 +327,20 @@ protected virtual DefineCollection GetPassDefines(FullscreenCompatibility compat protected virtual KeywordCollection GetPassKeywords(FullscreenCompatibility compatibility) => new KeywordCollection(); + static StructDescriptor GetFullscreenAttributes() + { + return new StructDescriptor() + { + name = "Attributes", + packFields = false, + fields = new FieldDescriptor[] + { + StructFields.Attributes.instanceID, + StructFields.Attributes.vertexID, + } + }; + } + public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility compatibility) { var fullscreenPass = new PassDescriptor @@ -355,7 +369,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com // Fields structs = new StructCollection { - { Structs.Attributes }, + { GetFullscreenAttributes() }, { Structs.SurfaceDescriptionInputs }, { Varyings }, { Structs.VertexDescriptionInputs }, @@ -363,9 +377,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com fieldDependencies = FieldDependencies.Default, requiredFields = new FieldCollection { - StructFields.Attributes.uv0, // Always need uv0 to calculate the other properties in fullscreen node code - StructFields.Attributes.positionOS, - StructFields.Varyings.texCoord0, + StructFields.Varyings.texCoord0, // Always need texCoord0 to calculate the other properties in fullscreen node code StructFields.Varyings.texCoord1, // We store the view direction computed in the vertex in the texCoord1 StructFields.Attributes.vertexID, // Need the vertex Id for the DrawProcedural case }, diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl index fa2ff9ab93f..9c52204af53 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl @@ -1,11 +1,7 @@ PackedVaryings vert(Attributes input) { Varyings output = (Varyings)0; -#if SHADER_API_GLES - output.positionCS = float4(input.positionOS.xyz, 1); -#else output.positionCS = GetDrawProceduralVertexPosition(input.vertexID); -#endif BuildVaryings(input, output); PackedVaryings packedOutput = PackVaryings(output); return packedOutput; diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl index 3f74a2f7ac7..b69be33c3a2 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl @@ -3,6 +3,7 @@ SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input) SurfaceDescriptionInputs output; ZERO_INITIALIZE(SurfaceDescriptionInputs, output); + // Normal is not available yet through ShaderGraph inputs. It needs to be sampled in RenderPipeline specific nodes float3 normalWS = float3(0, 0, 1); float4 tangentWS = float4(0, 1, 0, 0); // We can't access the tangent in screen space From 61b2f419dcd9f72ae44e6ee59349f9e91959c2ce Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 17:40:10 +0100 Subject: [PATCH 101/108] Added reference images for Fullscreen SG --- .../IPhonePlayer/Metal/None/Fullscreen.png | 3 + .../Metal/None/Fullscreen.png.meta | 99 +++++++++++++++++++ .../LinuxPlayer/Vulkan/None/Fullscreen.png | 3 + .../Vulkan/None/Fullscreen.png.meta | 99 +++++++++++++++++++ .../Direct3D11/None/Fullscreen.png | 3 + .../Direct3D11/None/Fullscreen.png.meta | 99 +++++++++++++++++++ 6 files changed, 306 insertions(+) create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png.meta create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png.meta create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png create mode 100644 TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png.meta diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png new file mode 100644 index 00000000000..cc1fb9d108a --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:561826874c3c607d291fecde6eec1acf4a9726748dbb3aa6b8de9bcc68d0aeb2 +size 15364 diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png.meta b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png.meta new file mode 100644 index 00000000000..8d3fefecce2 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/IPhonePlayer/Metal/None/Fullscreen.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 2cf07196957a85d49b59d9b054e1499d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png new file mode 100644 index 00000000000..eba76015e39 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b936b49ea69ef35140c92c12d8f7cb4b07bd596be89302e6ec451bdcf316766 +size 15556 diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png.meta b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png.meta new file mode 100644 index 00000000000..e97fe9fae75 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/LinuxPlayer/Vulkan/None/Fullscreen.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 2637faaeac8ba03429e503bd67a16297 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png new file mode 100644 index 00000000000..eba76015e39 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b936b49ea69ef35140c92c12d8f7cb4b07bd596be89302e6ec451bdcf316766 +size 15556 diff --git a/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png.meta b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png.meta new file mode 100644 index 00000000000..df358d9f821 --- /dev/null +++ b/TestProjects/ShaderGraph/Assets/ReferenceImages/Linear/WindowsPlayer/Direct3D11/None/Fullscreen.png.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 2a49cd2e9d90ed746885af7ee937f653 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: From acedacd6e39725c307bd34e28578fceaa1fe88c9 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 11:31:04 +0100 Subject: [PATCH 102/108] Remove is main texture on 2D array --- .../Editor/Data/Graphs/Texture2DArrayShaderProperty.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs b/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs index f7a75d6ab30..ff6d8bab4d4 100644 --- a/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs +++ b/com.unity.shadergraph/Editor/Data/Graphs/Texture2DArrayShaderProperty.cs @@ -18,13 +18,9 @@ internal Texture2DArrayShaderProperty() internal override bool isExposable => true; internal override bool isRenamable => true; - [SerializeField] - internal bool isMainTexture = false; internal string modifiableTagString => modifiable ? "" : "[NonModifiableTextureData]"; - internal string mainTextureString => isMainTexture ? "[MainTexture]" : ""; - internal override string GetPropertyBlockString() { return $"{hideTagString}{modifiableTagString}[NoScaleOffset]{referenceName}(\"{displayName}\", 2DArray) = \"\" {{}}"; @@ -85,7 +81,6 @@ internal override ShaderInput Copy() { displayName = displayName, value = value, - isMainTexture = isMainTexture }; } } From 42b3523d62fbba278fe4d8e9bb2b6173e4aa06ca Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 12:14:37 +0100 Subject: [PATCH 103/108] Fix fullscreen SG on builtin --- .../Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 14995304dc6..6080766d012 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -383,7 +383,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com // Port Mask validVertexBlocks = new BlockFieldDescriptor[] { - BlockFields.VertexDescription.Position + // BlockFields.VertexDescription.Position }, validPixelBlocks = new BlockFieldDescriptor[] { From 0a3c91ef6307a96ec4c7416ce7af5a476e4fa49a Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 12:40:33 +0100 Subject: [PATCH 104/108] Fix active blocks in builtin target --- .../Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs | 2 ++ .../Editor/ShaderGraph/Targets/BuiltInSubTarget.cs | 9 +++++++++ .../BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs | 6 ------ .../Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs | 2 ++ .../Generation/Targets/Fullscreen/FullscreenSubTarget.cs | 5 +---- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs index 9ef5126cd3a..b4aa94cbdd5 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs @@ -95,6 +95,8 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { + base.GetActiveBlocks(ref context); + context.AddBlock(BlockFields.SurfaceDescription.Smoothness); context.AddBlock(BlockFields.SurfaceDescription.NormalOS, normalDropOffSpace == NormalDropOffSpace.Object); context.AddBlock(BlockFields.SurfaceDescription.NormalTS, normalDropOffSpace == NormalDropOffSpace.Tangent); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInSubTarget.cs index 14a0f97c5bc..f0c686c7d52 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInSubTarget.cs @@ -23,6 +23,15 @@ public virtual ScriptableObject GetMetadataObject() return bultInMetadata; } + public override void GetActiveBlocks(ref TargetActiveBlockContext context) + { + // Core blocks + context.AddBlock(BlockFields.VertexDescription.Position); + context.AddBlock(BlockFields.VertexDescription.Normal); + context.AddBlock(BlockFields.VertexDescription.Tangent); + context.AddBlock(BlockFields.SurfaceDescription.BaseColor); + } + public override object saveContext { get diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs index 84929a5548f..eac0f3d2ba2 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs @@ -282,12 +282,6 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { - // Core blocks - context.AddBlock(BlockFields.VertexDescription.Position); - context.AddBlock(BlockFields.VertexDescription.Normal); - context.AddBlock(BlockFields.VertexDescription.Tangent); - context.AddBlock(BlockFields.SurfaceDescription.BaseColor); - // SubTarget blocks m_ActiveSubTarget.value.GetActiveBlocks(ref context); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs index 78c98e214a0..2b4bc82aa52 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs @@ -66,6 +66,8 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { + base.GetActiveBlocks(ref context); + context.AddBlock(BlockFields.SurfaceDescription.Alpha, (target.surfaceType == SurfaceType.Transparent || target.alphaClip) || target.allowMaterialOverride); context.AddBlock(BlockFields.SurfaceDescription.AlphaClipThreshold, target.alphaClip || target.allowMaterialOverride); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index 6080766d012..cd89a849ba6 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -381,10 +381,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com sharedTemplateDirectories = kSharedTemplateDirectories, // Port Mask - validVertexBlocks = new BlockFieldDescriptor[] - { - // BlockFields.VertexDescription.Position - }, + validVertexBlocks = null, validPixelBlocks = new BlockFieldDescriptor[] { BlockFields.SurfaceDescription.BaseColor, From 614d793b56798c67b747d7eae977d4f6c6f1cfca Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 15:38:10 +0100 Subject: [PATCH 105/108] Fix CRT node issues --- .../Targets/CustomRenderTexture/CustomTextureNodes.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs index 1bca4b6c16d..c8ed3184395 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -89,10 +89,9 @@ public override string GetVariableNameForSlot(int slotId) { case OutputSlotCubeFaceId: return "_CustomRenderTextureCubeFace"; + default: case OutputSlot3DSliceId: return "_CustomRenderTexture3DSlice"; - default: - return "_CustomRenderTextureWidth"; } } @@ -109,7 +108,6 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener [Title("Custom Render Texture", "Self")] [SubTargetFilter(typeof(CustomTextureSubTarget))] - class CustomTextureSelf : AbstractMaterialNode, IGeneratesFunction { private const string kOutputSlotSelf2DName = "Self Texture 2D"; From 61266aec45ecdf53efde0e9c4004f6278fd91ac3 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 15:38:10 +0100 Subject: [PATCH 106/108] Fix CRT node issues --- .../Targets/CustomRenderTexture/CustomTextureNodes.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs index 1bca4b6c16d..c8ed3184395 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs @@ -89,10 +89,9 @@ public override string GetVariableNameForSlot(int slotId) { case OutputSlotCubeFaceId: return "_CustomRenderTextureCubeFace"; + default: case OutputSlot3DSliceId: return "_CustomRenderTexture3DSlice"; - default: - return "_CustomRenderTextureWidth"; } } @@ -109,7 +108,6 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener [Title("Custom Render Texture", "Self")] [SubTargetFilter(typeof(CustomTextureSubTarget))] - class CustomTextureSelf : AbstractMaterialNode, IGeneratesFunction { private const string kOutputSlotSelf2DName = "Self Texture 2D"; From cc6689cf1683dac4497ba825137d95868bf25575 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 12:40:33 +0100 Subject: [PATCH 107/108] Fix active blocks in builtin target # Conflicts: # com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs --- .../Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs | 2 ++ .../Editor/ShaderGraph/Targets/BuiltInSubTarget.cs | 9 +++++++++ .../BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs | 6 ------ .../Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs | 2 ++ .../Generation/Targets/Fullscreen/FullscreenSubTarget.cs | 5 +---- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs index 9ef5126cd3a..b4aa94cbdd5 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInLitSubTarget.cs @@ -95,6 +95,8 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { + base.GetActiveBlocks(ref context); + context.AddBlock(BlockFields.SurfaceDescription.Smoothness); context.AddBlock(BlockFields.SurfaceDescription.NormalOS, normalDropOffSpace == NormalDropOffSpace.Object); context.AddBlock(BlockFields.SurfaceDescription.NormalTS, normalDropOffSpace == NormalDropOffSpace.Tangent); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInSubTarget.cs index 14a0f97c5bc..f0c686c7d52 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInSubTarget.cs @@ -23,6 +23,15 @@ public virtual ScriptableObject GetMetadataObject() return bultInMetadata; } + public override void GetActiveBlocks(ref TargetActiveBlockContext context) + { + // Core blocks + context.AddBlock(BlockFields.VertexDescription.Position); + context.AddBlock(BlockFields.VertexDescription.Normal); + context.AddBlock(BlockFields.VertexDescription.Tangent); + context.AddBlock(BlockFields.SurfaceDescription.BaseColor); + } + public override object saveContext { get diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs index 84929a5548f..eac0f3d2ba2 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInTarget.cs @@ -282,12 +282,6 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { - // Core blocks - context.AddBlock(BlockFields.VertexDescription.Position); - context.AddBlock(BlockFields.VertexDescription.Normal); - context.AddBlock(BlockFields.VertexDescription.Tangent); - context.AddBlock(BlockFields.SurfaceDescription.BaseColor); - // SubTarget blocks m_ActiveSubTarget.value.GetActiveBlocks(ref context); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs index 78c98e214a0..2b4bc82aa52 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltInUnlitSubTarget.cs @@ -66,6 +66,8 @@ public override void GetFields(ref TargetFieldContext context) public override void GetActiveBlocks(ref TargetActiveBlockContext context) { + base.GetActiveBlocks(ref context); + context.AddBlock(BlockFields.SurfaceDescription.Alpha, (target.surfaceType == SurfaceType.Transparent || target.alphaClip) || target.allowMaterialOverride); context.AddBlock(BlockFields.SurfaceDescription.AlphaClipThreshold, target.alphaClip || target.allowMaterialOverride); } diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs index e0208dadcf8..e58a51d2de5 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs @@ -355,10 +355,7 @@ public virtual PassDescriptor GenerateFullscreenPass(FullscreenCompatibility com sharedTemplateDirectories = kSharedTemplateDirectories, // Port Mask - validVertexBlocks = new BlockFieldDescriptor[] - { - BlockFields.VertexDescription.Position - }, + validVertexBlocks = null, validPixelBlocks = new BlockFieldDescriptor[] { BlockFields.SurfaceDescription.BaseColor, From 983953a3edeb40248f00d22ed05a5e2949bc6435 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 17:14:37 +0100 Subject: [PATCH 108/108] Added HDRP what's new --- .../Images/HDRP-Fullscreen-Frost-Effect.png | 3 +++ .../Documentation~/whats-new-13.md | 9 +++++++++ 2 files changed, 12 insertions(+) create mode 100644 com.unity.render-pipelines.high-definition/Documentation~/Images/HDRP-Fullscreen-Frost-Effect.png diff --git a/com.unity.render-pipelines.high-definition/Documentation~/Images/HDRP-Fullscreen-Frost-Effect.png b/com.unity.render-pipelines.high-definition/Documentation~/Images/HDRP-Fullscreen-Frost-Effect.png new file mode 100644 index 00000000000..e1333101d04 --- /dev/null +++ b/com.unity.render-pipelines.high-definition/Documentation~/Images/HDRP-Fullscreen-Frost-Effect.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba548a536f6a31e2e312acee234d1659dd9ecab79bac54686ff77cf541eda227 +size 1044863 diff --git a/com.unity.render-pipelines.high-definition/Documentation~/whats-new-13.md b/com.unity.render-pipelines.high-definition/Documentation~/whats-new-13.md index e5b87d8a890..4b3ffdae633 100644 --- a/com.unity.render-pipelines.high-definition/Documentation~/whats-new-13.md +++ b/com.unity.render-pipelines.high-definition/Documentation~/whats-new-13.md @@ -4,4 +4,13 @@ This page contains an overview of new features, improvements, and issues resolve ## Added +### Fullscreen Shader Graph + +![](Images/HDRP-Fullscreen-Frost-Effect.png) + +HDRP 13.0 introduces a new material type in ShaderGraph to create fullscreen effects. +Shaders of the fullscreen type can be used in fullscreen custom passes, custom post processes and C# scripting. + +For more details on how to use fulscreen shaders, see [FullScreen Shader Graph](Fullscreen-Shader-Graph.md). + ## Updated