From 397ab273d382ef243b5e25f2826065b505088221 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 16 Sep 2021 15:39:22 +0200 Subject: [PATCH 001/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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/107] 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 23117c707a2b5f0ea36bd2f5721786035327ab1a Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 22 Oct 2021 12:22:53 +0200 Subject: [PATCH 047/107] 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 048/107] 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 049/107] 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 16c3af742c59fe2be959ea0594736fcb01797559 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 26 Oct 2021 10:36:01 +0200 Subject: [PATCH 050/107] Cleanup for HDRP PR --- .../CHANGELOG.md | 36 ++- .../Documentation~/Images/scene-templates.png | 3 + .../Documentation~/TableOfContents.md | 1 + .../Documentation~/scene-templates.md | 12 + .../UniversalSpriteCustomLitSubTarget.cs | 18 +- .../Targets/UniversalSpriteLitSubTarget.cs | 18 +- .../Targets/UniversalSpriteUnlitSubTarget.cs | 14 +- .../Editor/Decal/DecalPass.template | 5 +- .../Editor/Decal/DecalProjectorEditor.cs | 4 +- .../Editor/EditorUtils.cs | 12 + .../UniversalRenderPipelineLightUI.Skin.cs | 4 +- .../DrawFullscreenFeatureEditor.cs | 94 -------- .../CreateFullscreenShaderGraph.cs | 25 --- .../CreateFullscreenShaderGraph.cs.meta | 11 - .../ShaderGraph/Includes/DepthOnlyPass.hlsl | 2 +- .../ShaderGraph/Includes/ShaderPassDecal.hlsl | 8 + .../Editor/ShaderGraph/Nodes.meta | 8 - .../Nodes/UniversalSampleBufferNode.cs | 210 ------------------ .../Nodes/UniversalSampleBufferNode.cs.meta | 11 - .../Targets/UniversalDecalSubTarget.cs | 10 +- .../Targets/UniversalFullscreenSubTarget.cs | 55 ----- .../ShaderGraph/Targets/UniversalTarget.cs | 93 +------- .../Editor/ShaderUtils.cs | 15 ++ ...UniversalRenderPipelineMaterialUpgrader.cs | 12 +- .../UniversalSpeedTree8MaterialUpgrader.cs | 41 ++++ ...iversalSpeedTree8MaterialUpgrader.cs.meta} | 2 +- .../VFXGraph/Shaders/VFXPasses.template | 5 +- .../Runtime/2D/Light2D.cs | 2 +- .../Runtime/2D/Light2DShape.cs | 1 - .../Runtime/2D/Renderer2D.cs | 4 +- ...iversalRenderPipelineEditorResources.asset | 24 +- .../UniversalRenderPipelineEditorResources.cs | 2 +- .../Debug/DebugDisplaySettingsCommon.cs | 18 +- .../Debug/DebugDisplaySettingsLighting.cs | 32 ++- .../Debug/DebugDisplaySettingsMaterial.cs | 180 ++++++++++----- .../Debug/DebugDisplaySettingsRendering.cs | 171 +++++++++----- .../Runtime/Debug/DebugDisplayStats.cs | 44 ++++ .../Debug/DebugDisplayStats.cs.meta} | 2 +- .../Runtime/Debug/DebugHandler.cs | 68 +++--- .../Runtime/Debug/DebugRenderSetup.cs | 14 +- ...ersalRenderPipelineDebugDisplaySettings.cs | 53 ++--- .../ScreenSpace/DecalGBufferRenderPass.cs | 16 +- .../Runtime/DeferredLights.cs | 10 +- .../Runtime/NativeRenderPass.cs | 37 ++- .../Runtime/Passes/CopyDepthPass.cs | 26 ++- .../Runtime/Passes/DeferredPass.cs | 2 +- .../Runtime/Passes/DepthOnlyPass.cs | 16 +- .../Runtime/Passes/FinalBlitPass.cs | 2 +- .../Runtime/Passes/GBufferPass.cs | 10 +- .../Runtime/Passes/PostProcessPass.cs | 20 +- .../Passes/ScreenSpaceShadowResolvePass.cs | 87 -------- .../ScreenSpaceShadowResolvePass.cs.meta | 11 - .../Runtime/Passes/ScriptableRenderPass.cs | 27 ++- .../RendererFeatures/DecalRendererFeature.cs | 10 + .../RendererFeatures/DrawFullscreenPass.cs | 149 ------------- .../DrawFullscreenPass.cs.meta | 11 - .../Runtime/ScriptableRenderer.cs | 8 +- .../Runtime/ShaderUtils.cs | 4 +- .../Runtime/UniversalAdditionalCameraData.cs | 1 + .../Runtime/UniversalRenderPipeline.cs | 12 +- .../Runtime/UniversalRenderPipelineCore.cs | 1 - .../Runtime/UniversalRenderer.cs | 9 +- .../Runtime/VFXGraph/Shaders/VFXDefines.hlsl | 8 + .../Runtime/XR/XRPass.cs | 35 +++ .../ShaderLibrary/GlobalIllumination.hlsl | 20 +- .../Shaders/BakedLit.shader | 4 +- .../Shaders/ComplexLit.shader | 4 +- .../Shaders/DepthOnlyPass.hlsl | 4 +- .../Shaders/Lit.shader | 4 +- .../Shaders/Nature/SpeedTree7.shader | 2 +- .../Shaders/Nature/SpeedTree7Billboard.shader | 2 +- .../Nature/SpeedTree7CommonPasses.hlsl | 2 +- .../Shaders/Nature/SpeedTree8.shader | 2 +- .../Shaders/Nature/SpeedTree8Passes.hlsl | 2 +- .../Particles/ParticlesDepthOnlyPass.hlsl | 4 +- .../Shaders/Particles/ParticlesLit.shader | 2 +- .../Particles/ParticlesSimpleLit.shader | 2 +- .../Shaders/Particles/ParticlesUnlit.shader | 2 +- .../Shaders/PostProcessing/UberPost.shader | 14 ++ .../Shaders/SimpleLit.shader | 4 +- .../Shaders/Terrain/TerrainDetailLit.shader | 2 +- .../Shaders/Terrain/TerrainLit.shader | 2 +- .../Shaders/Terrain/TerrainLitBase.shader | 2 +- .../Shaders/Terrain/TerrainLitPasses.hlsl | 2 +- .../Shaders/Terrain/WavingGrass.shader | 2 +- .../Terrain/WavingGrassBillboard.shader | 16 +- .../Terrain/WavingGrassDepthNormalsPass.hlsl | 4 + .../Shaders/Terrain/WavingGrassInput.hlsl | 52 ++--- .../Shaders/Terrain/WavingGrassPasses.hlsl | 29 +-- .../Shaders/Unlit.shader | 4 +- .../Shaders/Utils/CopyDepth.shader | 3 +- .../Shaders/Utils/CopyDepthPass.hlsl | 4 + .../Tests/Runtime/Light2DTests.cs | 3 + .../ValidationExceptions.json | 4 +- .../package.json | 7 +- 95 files changed, 898 insertions(+), 1168 deletions(-) create mode 100644 com.unity.render-pipelines.universal/Documentation~/Images/scene-templates.png create mode 100644 com.unity.render-pipelines.universal/Documentation~/scene-templates.md delete mode 100644 com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs 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 create mode 100644 com.unity.render-pipelines.universal/Editor/UniversalSpeedTree8MaterialUpgrader.cs rename com.unity.render-pipelines.universal/Editor/{ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta => UniversalSpeedTree8MaterialUpgrader.cs.meta} (83%) create mode 100644 com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplayStats.cs rename com.unity.render-pipelines.universal/{Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta => Runtime/Debug/DebugDisplayStats.cs.meta} (83%) delete mode 100644 com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceShadowResolvePass.cs delete mode 100644 com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceShadowResolvePass.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/CHANGELOG.md b/com.unity.render-pipelines.universal/CHANGELOG.md index 9c8cf0745cc..70b7aaf8fe3 100644 --- a/com.unity.render-pipelines.universal/CHANGELOG.md +++ b/com.unity.render-pipelines.universal/CHANGELOG.md @@ -4,13 +4,31 @@ All notable changes to this package will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## [13.1.0] - 2021-09-24 +## [13.1.1] - 2021-10-04 ### Added -- Added public api and updated docs for Light2D shape properties. - Added Depth Texture setting for Overlay Camera. - Added Depth Priming support for Vulkan with MSAA. - Added Shadows and Additional Lights off variants stripping. +- Exposed public API for DebugDisplaySettings. +- Added Display Stats panel to Rendering Debugger that displays CPU/GPU frame timings and bottlenecks. + +### Changed +- Main light shadow, additional light shadow and additional light keywords are now enabled based on urp setting instead of existence in scene. This allows better variant stripping. +- Now using the SpeedTree8 PBRLit shadergraph as the default SpeedTree8 shader for Universal. + +### Fixed +- Fixed a regression where ShaderGraph screen position was not correct in game view and when using XR [1369450] +- Fixed overwriting of preview camera background color. [case 1357004](https://issuetracker.unity3d.com/product/unity/issues/guid/1361557/) +- Fixed ShadowCaster now requires varying normalWS to include changed normals from vertex shader in shader graph. +- Fixed typo in numIterationsEnclosingSphere api name +- Fix for rendering thumbnails. [case 1348209](https://issuetracker.unity3d.com/issues/preview-of-assets-do-not-show-in-the-project-window) +- Fixed a regression bug where XR camera postion can not be modified in beginCameraRendering [case 1365000] +- Fixed an issue in where installing the Adaptive Performance package caused errors to the inspector UI [1368161](https://issuetracker.unity3d.com/issues/urp-package-throws-compilation-error-cs1525-when-imported-together-with-adaptive-performance-package) + +## [13.1.0] - 2021-09-24 +### Added +- Added public api and updated docs for Light2D shape properties. ### Changed @@ -18,12 +36,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - MaterialReimporter.ReimportAllMaterials now batches the asset database changes to improve performance. ### Fixed +- Fixed post processing with Pixel Perfect camera [case 1363763](https://issuetracker.unity3d.com/product/unity/issues/guid/1363763/) - Fixed the LensFlare flicker with TAA on SceneView (case 1356734). - Fixed an issue where Unlit and ParticlesUnlit shaders did not have HDR color selection for albedo [case 1283767](https://issuetracker.unity3d.com/issues/built-in-unlit-particle-shader-has-hdr-color-selection-for-albedo-urp-unlit-particles-do-not) -- Fixed a regression where ShaderGraph screen position was not correct in game view and when using XR [1369450] -- Fixed overwriting of preview camera background color. [case 1357004](https://issuetracker.unity3d.com/product/unity/issues/guid/1361557/) -- Fixed ShadowCaster now requires varying normalWS to include changed normals from vertex shader in shader graph. -- Fixed typo in numIterationsEnclosingSphere api name + ## [13.0.0] - 2021-09-01 ### Added @@ -34,7 +50,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed - Removed experimental tile deferred code. - VFX: New shadergraph support directly on Universal target. -- Main light shadow, additional light shadow and additional light keywords are now enabled based on urp setting instead of existence in scene. This allows better variant stripping. ### Fixed - Added warning for lit shader detailed abledo, if texture is not linear. [1342011](https://issuetracker.unity3d.com/issues/detail-maps-packed-differently-in-built-in-vs-urp) @@ -44,9 +59,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Added "Conservative Enclosing Sphere" setting to fix shadow frustum culling issue where shadows are erroneously culled in corners of cascades [case 1153151](https://issuetracker.unity3d.com/issues/lwrp-shadows-are-being-culled-incorrectly-in-the-corner-of-the-camera-viewport-when-the-far-clip-plane-is-small) - Fixed memory leak with XR combined occlusion meshes. [case 1366173] - Fixed a bug with Sprite Targets in ShaderGraph not rendering correctly in game view [1352225] -- Fix for rendering thumbnails. [case 1348209](https://issuetracker.unity3d.com/issues/preview-of-assets-do-not-show-in-the-project-window) -- Fixed a regression bug where XR camera postion can not be modified in beginCameraRendering [case 1365000] -- Fixed an issue in where installing the Adaptive Performance package caused errors to the inspector UI [1368161](https://issuetracker.unity3d.com/issues/urp-package-throws-compilation-error-cs1525-when-imported-together-with-adaptive-performance-package) + +### Changed +- Remove use of deprecated UNITY_USE_NATIVE_HDR keyword in shaders. ## [12.0.0] - 2021-01-11 ### Added @@ -219,6 +234,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Support undo of URP Global Settings asset assignation (case 1342987). - Removed unsupported fields from Presets of Light and Camera [case 1335979]. - Fixed graphical artefact when terrain height map is used with rendering layer mask for lighting. +- Fixed URP's vignette effect to respect XR's view center, since with Asymmetric FOV, the center of the view is not always the center of the texture [case 1358336](https://issuetracker.unity3d.com/issues/xr-sdk-urp-vignette-post-processing-effect-is-overlapping-between-eyes) - Fixed an issue where screen space shadows has flickering with deferred mode [case 1354681](https://issuetracker.unity3d.com/issues/screen-space-shadows-flicker-in-scene-view-when-using-deferred-rendering) - Fixed shadowCascadeBlendCullingFactor to be 1.0 - Fixed missing property values in a RendererFeature of screen space shadows by adding tooltip for it instead of showing them. [case 1327356] diff --git a/com.unity.render-pipelines.universal/Documentation~/Images/scene-templates.png b/com.unity.render-pipelines.universal/Documentation~/Images/scene-templates.png new file mode 100644 index 00000000000..a7f523a3296 --- /dev/null +++ b/com.unity.render-pipelines.universal/Documentation~/Images/scene-templates.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0c2138a70bb54f44cd90c17d4d19e35d02c19374a6d238b3e92deb74385fe3b +size 54021 diff --git a/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md b/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md index ae3125282bf..f9dabc40614 100644 --- a/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md +++ b/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md @@ -9,6 +9,7 @@ * [Install URP into an existing Project](InstallURPIntoAProject.md) * [Package samples](package-samples.md) * [URP Package Samples](package-sample-urp-package-samples.md) + * [Scene Templates](scene-templates.md) * [Render Pipeline Concepts](urp-concepts.md) * [The URP Asset](universalrp-asset.md) * [URP Global Settings](urp-global-settings.md) diff --git a/com.unity.render-pipelines.universal/Documentation~/scene-templates.md b/com.unity.render-pipelines.universal/Documentation~/scene-templates.md new file mode 100644 index 00000000000..bba1ff87a1b --- /dev/null +++ b/com.unity.render-pipelines.universal/Documentation~/scene-templates.md @@ -0,0 +1,12 @@ +# Universal Render Pipeline Scene Templates + +You can use [Scene Templates](https://docs.unity3d.com/Manual/scene-templates.html) to quickly create scenes that include pre-configured URP-specific settings and post-processing effects. For information on how to create a new scene from a Scene Template, see [Creating a new scene from the New Scene dialog](https://docs.unity3d.com/Manual/scenes-working-with.html#creating-a-new-scene-from-the-new-scene-dialog). + +![](Images/scene-templates.png) + +> *The New Scene dialog displaying Scene Templates.* + +The following Scene Templates are available for URP: + +* **Basic (URP)**: A scene that contains a [Camera](camera-component-reference.md) and a [Light](light-component.md). This is the URP equivalent of Unity's default scene. +* **Standard (URP)**: A scene that contains a Camera, a Light, and a global [Volume](Volumes.md) with various post-processing effects. **Note**: If you create a scene using the Standard (URP) Scene Template, Unity creates a new [Volume Profile](VolumeProfile.md) to store the post-processing effects. diff --git a/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteCustomLitSubTarget.cs b/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteCustomLitSubTarget.cs index f830cfaee1f..20adcfcee8d 100644 --- a/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteCustomLitSubTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteCustomLitSubTarget.cs @@ -2,10 +2,11 @@ using System.Linq; using UnityEditor.ShaderGraph; +using Unity.Rendering.Universal; namespace UnityEditor.Rendering.Universal.ShaderGraph { - sealed class UniversalSpriteCustomLitSubTarget : SubTarget + sealed class UniversalSpriteCustomLitSubTarget : UniversalSubTarget { static readonly GUID kSourceCodeGuid = new GUID("69e608b3e7e0405bbc2f259ad9cfa196"); // UniversalUnlitSubTarget.cs @@ -14,10 +15,13 @@ public UniversalSpriteCustomLitSubTarget() displayName = "Sprite Custom Lit"; } + protected override ShaderUtils.ShaderID shaderID => ShaderUtils.ShaderID.SG_SpriteCustomLit; + public override bool IsActive() => true; public override void Setup(ref TargetSetupContext context) { + base.Setup(ref context); context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); context.AddSubShader(SubShaders.SpriteLit(target)); } @@ -115,8 +119,8 @@ static class SpriteLitPasses useInPreview = true, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, @@ -143,8 +147,8 @@ static class SpriteLitPasses useInPreview = true, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, @@ -170,8 +174,8 @@ static class SpriteLitPasses useInPreview = true, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, diff --git a/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteLitSubTarget.cs b/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteLitSubTarget.cs index 56cb58f62d5..0d4f25e11db 100644 --- a/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteLitSubTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteLitSubTarget.cs @@ -4,10 +4,11 @@ using UnityEditor.ShaderGraph; using UnityEditor.ShaderGraph.Legacy; +using Unity.Rendering.Universal; namespace UnityEditor.Rendering.Universal.ShaderGraph { - sealed class UniversalSpriteLitSubTarget : SubTarget, ILegacyTarget + sealed class UniversalSpriteLitSubTarget : UniversalSubTarget, ILegacyTarget { static readonly GUID kSourceCodeGuid = new GUID("ea1514729d7120344b27dcd67fbf34de"); // UniversalSpriteLitSubTarget.cs @@ -18,8 +19,11 @@ public UniversalSpriteLitSubTarget() public override bool IsActive() => true; + protected override ShaderUtils.ShaderID shaderID => ShaderUtils.ShaderID.SG_SpriteLit; + public override void Setup(ref TargetSetupContext context) { + base.Setup(ref context); context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); context.AddSubShader(SubShaders.SpriteLit(target)); } @@ -137,8 +141,8 @@ static class SpriteLitPasses useInPreview = true, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, @@ -168,8 +172,8 @@ static class SpriteLitPasses useInPreview = true, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, @@ -198,8 +202,8 @@ static class SpriteLitPasses useInPreview = true, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, diff --git a/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteUnlitSubTarget.cs b/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteUnlitSubTarget.cs index 182eaca6f28..8c7d7e20ec6 100644 --- a/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteUnlitSubTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Targets/UniversalSpriteUnlitSubTarget.cs @@ -4,10 +4,11 @@ using UnityEditor.ShaderGraph; using UnityEditor.ShaderGraph.Legacy; +using Unity.Rendering.Universal; namespace UnityEditor.Rendering.Universal.ShaderGraph { - sealed class UniversalSpriteUnlitSubTarget : SubTarget, ILegacyTarget + sealed class UniversalSpriteUnlitSubTarget : UniversalSubTarget, ILegacyTarget { static readonly GUID kSourceCodeGuid = new GUID("ed7c0aacec26e9646b45c96fb318e5a3"); // UniversalSpriteUnlitSubTarget.cs @@ -16,10 +17,13 @@ public UniversalSpriteUnlitSubTarget() displayName = "Sprite Unlit"; } + protected override ShaderUtils.ShaderID shaderID => ShaderUtils.ShaderID.SG_SpriteUnlit; + public override bool IsActive() => true; public override void Setup(ref TargetSetupContext context) { + base.Setup(ref context); context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); context.AddSubShader(SubShaders.SpriteUnlit(target)); } @@ -132,8 +136,8 @@ static class SpriteUnlitPasses useInPreview = true, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, @@ -163,8 +167,8 @@ static class SpriteUnlitPasses useInPreview = true, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, diff --git a/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template b/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template index a2f5629f52d..f7e020aaa62 100644 --- a/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template +++ b/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template @@ -63,7 +63,10 @@ Pass #ifdef SCENEPICKINGPASS float4 _SelectionID; #endif - + #if _RENDER_PASS_ENABLED + #define GBUFFER3 0 + FRAMEBUFFER_INPUT_HALF(GBUFFER3); + #endif // Includes $splice(PreGraphIncludes) diff --git a/com.unity.render-pipelines.universal/Editor/Decal/DecalProjectorEditor.cs b/com.unity.render-pipelines.universal/Editor/Decal/DecalProjectorEditor.cs index 493eb96348f..5649ddf4f13 100644 --- a/com.unity.render-pipelines.universal/Editor/Decal/DecalProjectorEditor.cs +++ b/com.unity.render-pipelines.universal/Editor/Decal/DecalProjectorEditor.cs @@ -528,9 +528,7 @@ public override void OnInspectorGUI() bool isDecalSupported = DecalProjector.isSupported; if (!isDecalSupported) - { - EditorGUILayout.HelpBox("No renderer has a Decal Renderer Feature added.", MessageType.Warning); - } + EditorUtils.FeatureHelpBox("The current renderer has no Decal Renderer Feature added.", MessageType.Warning); EditorGUI.BeginChangeCheck(); { diff --git a/com.unity.render-pipelines.universal/Editor/EditorUtils.cs b/com.unity.render-pipelines.universal/Editor/EditorUtils.cs index 75357a60373..c00f485f7e5 100644 --- a/com.unity.render-pipelines.universal/Editor/EditorUtils.cs +++ b/com.unity.render-pipelines.universal/Editor/EditorUtils.cs @@ -1,3 +1,6 @@ +using UnityEngine; +using UnityEngine.Rendering.Universal; + namespace UnityEditor.Rendering.Universal.Internal { /// @@ -23,5 +26,14 @@ internal class Styles //Measurements public static float defaultLineSpace = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; } + + internal static void FeatureHelpBox(string message, MessageType type) + { + CoreEditorUtils.DrawFixMeBox(message, type, "Open", () => + { + Selection.activeObject = UniversalRenderPipeline.asset.scriptableRendererData; + GUIUtility.ExitGUI(); + }); + } } } diff --git a/com.unity.render-pipelines.universal/Editor/Lighting/UniversalRenderPipelineLightUI.Skin.cs b/com.unity.render-pipelines.universal/Editor/Lighting/UniversalRenderPipelineLightUI.Skin.cs index bdb51c2f3f7..ca473d4d792 100644 --- a/com.unity.render-pipelines.universal/Editor/Lighting/UniversalRenderPipelineLightUI.Skin.cs +++ b/com.unity.render-pipelines.universal/Editor/Lighting/UniversalRenderPipelineLightUI.Skin.cs @@ -25,8 +25,8 @@ static class Styles public static readonly GUIContent ShadowRealtimeSettings = EditorGUIUtility.TrTextContent("Realtime Shadows", "Settings for realtime direct shadows."); public static readonly GUIContent ShadowStrength = EditorGUIUtility.TrTextContent("Strength", "Controls how dark the shadows cast by the light will be."); public static readonly GUIContent ShadowNearPlane = EditorGUIUtility.TrTextContent("Near Plane", "Controls the value for the near clip plane when rendering shadows. Currently clamped to 0.1 units or 1% of the lights range property, whichever is lower."); - public static readonly GUIContent ShadowNormalBias = EditorGUIUtility.TrTextContent("Normal", "Controls the distance shadow caster vertices are offset along their normals when rendering shadow maps. Currently ignored for Point Lights."); - public static readonly GUIContent ShadowDepthBias = EditorGUIUtility.TrTextContent("Depth", "Determines the distance at which Unity pushes shadows away from the shadow-casting GameObject along the line from the Light."); + public static readonly GUIContent ShadowNormalBias = EditorGUIUtility.TrTextContent("Normal", "Determines the bias this Light applies along the normal of surfaces it illuminates. This is ignored for point lights."); + public static readonly GUIContent ShadowDepthBias = EditorGUIUtility.TrTextContent("Depth", "Determines the bias at which shadows are pushed away from the shadow-casting Game Object along the line from the Light."); // Resolution (default or custom) public static readonly GUIContent ShadowResolution = EditorGUIUtility.TrTextContent("Resolution", $"Sets the rendered resolution of the shadow maps. A higher resolution increases the fidelity of shadows at the cost of GPU performance and memory usage. Rounded to the next power of two, and clamped to be at least {UniversalAdditionalLightData.AdditionalLightsShadowMinimumResolution}."); 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/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/Includes/DepthOnlyPass.hlsl b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DepthOnlyPass.hlsl index 26e80370a59..996ecb1f75a 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DepthOnlyPass.hlsl +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DepthOnlyPass.hlsl @@ -21,7 +21,7 @@ half4 frag(PackedVaryings packedInput) : SV_TARGET clip(surfaceDescription.Alpha - surfaceDescription.AlphaClipThreshold); #endif - return 0; + return packedInput.positionCS.z; } #endif diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPassDecal.hlsl b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPassDecal.hlsl index f32803419a1..4dc1d7ddb05 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPassDecal.hlsl +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPassDecal.hlsl @@ -181,12 +181,20 @@ void Frag(PackedVaryings packedInput, #if defined(DECAL_PROJECTOR) #if UNITY_REVERSED_Z +#if _RENDER_PASS_ENABLED + float depth = LOAD_FRAMEBUFFER_INPUT(GBUFFER3, input.positionCS.xy); +#else float depth = LoadSceneDepth(input.positionCS.xy); +#endif +#else +#if _RENDER_PASS_ENABLED + float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, LOAD_FRAMEBUFFER_INPUT(GBUFFER3, input.positionCS.xy)); #else // Adjust z to match NDC for OpenGL float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, LoadSceneDepth(input.positionCS.xy)); #endif #endif +#endif #if defined(DECAL_RECONSTRUCT_NORMAL) #if defined(_DECAL_NORMAL_BLEND_HIGH) 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 e791a3b5d80..00000000000 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Nodes/UniversalSampleBufferNode.cs +++ /dev/null @@ -1,210 +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", "URP 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 = "URP 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 Texture2DShaderProperty - { - // 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: - 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(_BlitTexture, 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/UniversalDecalSubTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalDecalSubTarget.cs index 50ed2eacf84..d0ab95a61c1 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalDecalSubTarget.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalDecalSubTarget.cs @@ -3,16 +3,17 @@ using System.Collections.Generic; using UnityEngine; using UnityEditor.ShaderGraph; -using UnityEngine.Rendering; +using Unity.Rendering.Universal; using UnityEditor.UIElements; using UnityEngine.UIElements; using UnityEditor.ShaderGraph.Legacy; using UnityEngine.Rendering.Universal; using UnityEditor.ShaderGraph.Internal; +using ShaderUtils = Unity.Rendering.Universal.ShaderUtils; namespace UnityEditor.Rendering.Universal.ShaderGraph { - sealed class UniversalDecalSubTarget : SubTarget + sealed class UniversalDecalSubTarget : UniversalSubTarget { static readonly GUID kSourceCodeGuid = new GUID("f6cdcb0f9c306bf4895b74013d29ed47"); // UniversalDecalSubTarget.cs @@ -74,8 +75,11 @@ public UniversalDecalSubTarget() public override bool IsActive() => true; + protected override ShaderUtils.ShaderID shaderID => ShaderUtils.ShaderID.SG_Decal; + public override void Setup(ref TargetSetupContext context) { + base.Setup(ref context); context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency); context.AddCustomEditorForRenderPipeline("UnityEditor.Rendering.Universal.DecalShaderGraphGUI", typeof(UnityEngine.Rendering.Universal.UniversalRenderPipelineAsset)); // TODO: This should be owned by URP @@ -977,6 +981,7 @@ static class Descriptors { CoreKeywordDescriptors.MixedLightingSubtractive }, { Descriptors.DecalsNormalBlend }, { CoreKeywordDescriptors.GBufferNormalsOct }, + { CoreKeywordDescriptors.RenderPassEnabled }, { Descriptors.LodCrossFade, new FieldCondition(Fields.LodCrossFade, true) }, }; @@ -986,6 +991,7 @@ static class Descriptors { CoreKeywordDescriptors.ShadowsSoft }, { Descriptors.DecalsNormalBlend }, { CoreKeywordDescriptors.GBufferNormalsOct }, + { CoreKeywordDescriptors.RenderPassEnabled }, }; } #endregion 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/UniversalTarget.cs b/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs index bb57d0b579f..4da2a4aec36 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() @@ -1039,8 +964,8 @@ public static PassDescriptor _2DSceneSelection(UniversalTarget target) useInPreview = false, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, @@ -1077,8 +1002,8 @@ public static PassDescriptor _2DScenePicking(UniversalTarget target) useInPreview = false, // Template - passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"), - sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(), + passTemplatePath = UniversalTarget.kUberTemplatePath, + sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask validVertexBlocks = CoreBlockMasks.Vertex, @@ -1317,7 +1242,7 @@ public static RenderStateCollection DepthOnly(UniversalTarget target) { RenderState.ZTest(ZTest.LEqual) }, { RenderState.ZWrite(ZWrite.On) }, { UberSwitchedCullRenderState(target) }, - { RenderState.ColorMask("ColorMask 0") }, + { RenderState.ColorMask("ColorMask R") }, }; return result; diff --git a/com.unity.render-pipelines.universal/Editor/ShaderUtils.cs b/com.unity.render-pipelines.universal/Editor/ShaderUtils.cs index 43bbbd6358c..065fa602314 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderUtils.cs +++ b/com.unity.render-pipelines.universal/Editor/ShaderUtils.cs @@ -29,6 +29,10 @@ internal enum ShaderID // ShaderGraph IDs start at 1000, correspond to subtargets SG_Unlit = 1000, // UniversalUnlitSubTarget SG_Lit, // UniversalLitSubTarget + SG_Decal, // UniversalDecalSubTarget + SG_SpriteUnlit, // UniversalSpriteUnlitSubTarget + SG_SpriteLit, // UniversalSpriteLitSubTarget + SG_SpriteCustomLit // UniversalSpriteCustomLitSubTarget } internal static bool IsShaderGraph(this ShaderID id) @@ -90,12 +94,23 @@ internal static void UpdateMaterial(Material material, MaterialUpdateType update case ShaderID.ParticlesUnlit: ParticlesUnlitShader.SetMaterialKeywords(material, null, ParticleGUI.SetMaterialKeywords); break; + case ShaderID.SpeedTree8: + ShaderGraphLitGUI.UpdateMaterial(material, updateType); + break; case ShaderID.SG_Lit: ShaderGraphLitGUI.UpdateMaterial(material, updateType); break; case ShaderID.SG_Unlit: ShaderGraphUnlitGUI.UpdateMaterial(material, updateType); break; + case ShaderID.SG_Decal: + break; + case ShaderID.SG_SpriteUnlit: + break; + case ShaderID.SG_SpriteLit: + break; + case ShaderID.SG_SpriteCustomLit: + break; default: break; } diff --git a/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineMaterialUpgrader.cs b/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineMaterialUpgrader.cs index 5121ecbb5fd..7538375feb4 100644 --- a/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineMaterialUpgrader.cs +++ b/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineMaterialUpgrader.cs @@ -4,7 +4,9 @@ using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; +using System.Runtime.CompilerServices; +[assembly: InternalsVisibleTo("MaterialPostprocessor")] namespace UnityEditor.Rendering.Universal { internal sealed class UniversalRenderPipelineMaterialUpgrader : RenderPipelineConverter @@ -68,6 +70,7 @@ private static void GetShaderNamesToIgnore(ref HashSet shadersToIgnore) shadersToIgnore.Add("Universal Render Pipeline/Nature/SpeedTree7"); shadersToIgnore.Add("Universal Render Pipeline/Nature/SpeedTree7 Billboard"); shadersToIgnore.Add("Universal Render Pipeline/Nature/SpeedTree8"); + shadersToIgnore.Add("Universal Render Pipeline/Nature/SpeedTree8_PBRLit"); shadersToIgnore.Add("Universal Render Pipeline/2D/Sprite-Lit-Default"); shadersToIgnore.Add("Universal Render Pipeline/Terrain/Lit"); shadersToIgnore.Add("Universal Render Pipeline/Unlit"); @@ -168,7 +171,7 @@ private static void GetUpgraders(ref List upgraders) upgraders.Add(new TerrainUpgrader("Nature/Terrain/Standard")); upgraders.Add(new SpeedTreeUpgrader("Nature/SpeedTree")); upgraders.Add(new SpeedTreeBillboardUpgrader("Nature/SpeedTree Billboard")); - upgraders.Add(new SpeedTree8Upgrader("Nature/SpeedTree8")); + upgraders.Add(new UniversalSpeedTree8Upgrader("Nature/SpeedTree8")); //////////////////////////////////// // Particle Upgraders // @@ -544,13 +547,6 @@ internal SpeedTreeBillboardUpgrader(string oldShaderName) RenameShader(oldShaderName, ShaderUtils.GetShaderPath(ShaderPathID.SpeedTree7Billboard)); } } - internal class SpeedTree8Upgrader : MaterialUpgrader - { - internal SpeedTree8Upgrader(string oldShaderName) - { - RenameShader(oldShaderName, ShaderUtils.GetShaderPath(ShaderPathID.SpeedTree8)); - } - } public class ParticleUpgrader : MaterialUpgrader { diff --git a/com.unity.render-pipelines.universal/Editor/UniversalSpeedTree8MaterialUpgrader.cs b/com.unity.render-pipelines.universal/Editor/UniversalSpeedTree8MaterialUpgrader.cs new file mode 100644 index 00000000000..96848f1029f --- /dev/null +++ b/com.unity.render-pipelines.universal/Editor/UniversalSpeedTree8MaterialUpgrader.cs @@ -0,0 +1,41 @@ +using System; +using UnityEngine.Rendering.Universal; +using UnityEngine; +using UnityEngine.Rendering; + +namespace UnityEditor.Rendering.Universal +{ + class UniversalSpeedTree8Upgrader : SpeedTree8MaterialUpgrader + { + internal UniversalSpeedTree8Upgrader(string oldShaderName) + : base(oldShaderName, ShaderUtils.GetShaderPath(ShaderPathID.SpeedTree8), UniversalSpeedTree8MaterialFinalizer) + { + RenameFloat("_TwoSided", Property.CullMode); + } + static public void UniversalSpeedTree8MaterialFinalizer(Material mat) + { + SpeedTree8MaterialFinalizer(mat); + + if (mat.HasFloat("_TwoSided")) + mat.SetFloat(Property.CullMode, mat.GetFloat("_TwoSided")); + + Unity.Rendering.Universal.ShaderUtils.UpdateMaterial(mat, + Unity.Rendering.Universal.ShaderUtils.MaterialUpdateType.CreatedNewMaterial, + Unity.Rendering.Universal.ShaderUtils.ShaderID.SpeedTree8); + } + } + + class UniversalSpeedTree8PostProcessor : AssetPostprocessor + { + void OnPostprocessSpeedTree(GameObject speedTree) + { + context.DependsOnCustomDependency("srp/default-pipeline"); + + if (RenderPipelineManager.currentPipeline is UniversalRenderPipeline) + { + SpeedTreeImporter stImporter = assetImporter as SpeedTreeImporter; + SpeedTree8MaterialUpgrader.PostprocessSpeedTree8Materials(speedTree, stImporter, UniversalSpeedTree8Upgrader.UniversalSpeedTree8MaterialFinalizer); + } + } + } +} diff --git a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta b/com.unity.render-pipelines.universal/Editor/UniversalSpeedTree8MaterialUpgrader.cs.meta similarity index 83% rename from com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta rename to com.unity.render-pipelines.universal/Editor/UniversalSpeedTree8MaterialUpgrader.cs.meta index 13dd7fc214c..f561425a50a 100644 --- a/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalFullscreenSubTarget.cs.meta +++ b/com.unity.render-pipelines.universal/Editor/UniversalSpeedTree8MaterialUpgrader.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 48080a5025a54a84087e882e2f988642 +guid: a699ef0a455ff0440a0fe9b1689ec566 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/com.unity.render-pipelines.universal/Editor/VFXGraph/Shaders/VFXPasses.template b/com.unity.render-pipelines.universal/Editor/VFXGraph/Shaders/VFXPasses.template index 0515d737096..ab6d76d401a 100644 --- a/com.unity.render-pipelines.universal/Editor/VFXGraph/Shaders/VFXPasses.template +++ b/com.unity.render-pipelines.universal/Editor/VFXGraph/Shaders/VFXPasses.template @@ -86,6 +86,9 @@ void frag(ps_input i #if VFX_PASSDEPTH == VFX_PASSDEPTH_ACTUAL #if defined(WRITE_NORMAL_BUFFER) , out float4 outNormalBuffer : SV_Target0 + , out float4 outDepthColor : SV_Target1 + #else + , out float4 outDepthColor : SV_Target0 #endif #elif VFX_PASSDEPTH == VFX_PASSDEPTH_SELECTION , out float4 outColor : SV_Target0 @@ -130,7 +133,7 @@ void frag(ps_input i // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly outColor = float4(_ObjectId, _PassValue, 1.0, 1.0); #elif VFX_PASSDEPTH == VFX_PASSDEPTH_ACTUAL - //void + outDepthColor = float4(i.VFX_VARYING_POSCS.z, 0,0,0); #elif VFX_PASSDEPTH == VFX_PASSDEPTH_SHADOW //void #else diff --git a/com.unity.render-pipelines.universal/Runtime/2D/Light2D.cs b/com.unity.render-pipelines.universal/Runtime/2D/Light2D.cs index 39182277dfb..7f582520ccd 100644 --- a/com.unity.render-pipelines.universal/Runtime/2D/Light2D.cs +++ b/com.unity.render-pipelines.universal/Runtime/2D/Light2D.cs @@ -254,7 +254,7 @@ public LightType lightType /// /// The Sprite that's used by the Sprite Light type to control the shape light /// - public Sprite lightCookieSprite { get { return m_LightType != LightType.Point ? m_LightCookieSprite : m_DeprecatedPointLightCookieSprite; } } + public Sprite lightCookieSprite { get => m_LightCookieSprite; set => m_LightCookieSprite = value; } /// /// Controls the brightness and distance of the fall off (edge) of the light /// diff --git a/com.unity.render-pipelines.universal/Runtime/2D/Light2DShape.cs b/com.unity.render-pipelines.universal/Runtime/2D/Light2DShape.cs index facd770a204..caab50fd9e6 100644 --- a/com.unity.render-pipelines.universal/Runtime/2D/Light2DShape.cs +++ b/com.unity.render-pipelines.universal/Runtime/2D/Light2DShape.cs @@ -60,7 +60,6 @@ public Vector3[] shapePath public void SetShapePath(Vector3[] path) { m_ShapePath = path; - UpdateMesh(true); } } } diff --git a/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs b/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs index e442f29482e..deb45b6e0c1 100644 --- a/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs +++ b/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs @@ -150,7 +150,7 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re if (DebugHandler != null) { #if UNITY_EDITOR - UnityEditorInternal.SpriteMaskUtility.EnableDebugMode(DebugHandler.DebugDisplaySettings.MaterialSettings.DebugMaterialModeData == DebugMaterialMode.SpriteMask); + UnityEditorInternal.SpriteMaskUtility.EnableDebugMode(DebugHandler.DebugDisplaySettings.materialSettings.materialDebugMode == DebugMaterialMode.SpriteMask); #endif if (DebugHandler.AreAnySettingsActive) { @@ -187,7 +187,7 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re renderingData.cameraData.camera.orthographicSize = ppc.orthographicSize; colorTextureFilterMode = FilterMode.Point; - ppcUpscaleRT = ppc.gridSnapping == PixelPerfectCamera.GridSnapping.UpscaleRenderTexture; + ppcUpscaleRT = ppc.gridSnapping == PixelPerfectCamera.GridSnapping.UpscaleRenderTexture || ppc.requiresUpscalePass; } } diff --git a/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineEditorResources.asset b/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineEditorResources.asset index cb268b27106..1a296dc499a 100644 --- a/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineEditorResources.asset +++ b/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineEditorResources.asset @@ -13,22 +13,14 @@ MonoBehaviour: m_Name: UniversalRenderPipelineEditorResources m_EditorClassIdentifier: shaders: - autodeskInteractivePS: {fileID: 4800000, guid: 0e9d5a909a1f7e84882a534d0d11e49f, - type: 3} - autodeskInteractiveTransparentPS: {fileID: 4800000, guid: 5c81372d981403744adbdda4433c9c11, - type: 3} - autodeskInteractiveMaskedPS: {fileID: 4800000, guid: 80aa867ac363ac043847b06ad71604cd, - type: 3} - terrainDetailLitPS: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, - type: 3} - terrainDetailGrassPS: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, - type: 3} - terrainDetailGrassBillboardPS: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, - type: 3} - defaultSpeedTree7PS: {fileID: 4800000, guid: 0f4122b9a743b744abe2fb6a0a88868b, - type: 3} - defaultSpeedTree8PS: {fileID: 4800000, guid: 99134b1f0c27d54469a840832a28fadf, - type: 3} + autodeskInteractivePS: {fileID: 4800000, guid: 0e9d5a909a1f7e84882a534d0d11e49f, type: 3} + autodeskInteractiveTransparentPS: {fileID: 4800000, guid: 5c81372d981403744adbdda4433c9c11, type: 3} + autodeskInteractiveMaskedPS: {fileID: 4800000, guid: 80aa867ac363ac043847b06ad71604cd, type: 3} + terrainDetailLitPS: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3} + terrainDetailGrassPS: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3} + terrainDetailGrassBillboardPS: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3} + defaultSpeedTree7PS: {fileID: 4800000, guid: 0f4122b9a743b744abe2fb6a0a88868b, type: 3} + defaultSpeedTree8PS: {fileID: -6465566751694194690, guid: 9920c1f1781549a46ba081a2a15a16ec, type: 3} materials: lit: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} particleLit: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} diff --git a/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineEditorResources.cs b/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineEditorResources.cs index d94861a54e8..6175fcf8736 100644 --- a/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineEditorResources.cs +++ b/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineEditorResources.cs @@ -28,7 +28,7 @@ public sealed class ShaderResources [Reload("Shaders/Nature/SpeedTree7.shader")] public Shader defaultSpeedTree7PS; - [Reload("Shaders/Nature/SpeedTree8.shader")] + [Reload("Shaders/Nature/SpeedTree8_PBRLit.shadergraph")] public Shader defaultSpeedTree8PS; } diff --git a/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsCommon.cs b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsCommon.cs index 74934bf51e8..c80ef8e30e4 100644 --- a/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsCommon.cs +++ b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsCommon.cs @@ -34,7 +34,7 @@ public SettingsPanel() AddWidget(WidgetFactory.CreateMissingDebugShadersWarning()); var debugDisplaySettings = UniversalRenderPipelineDebugDisplaySettings.Instance; - var materialSettingsData = debugDisplaySettings.MaterialSettings; + var materialSettingsData = debugDisplaySettings.materialSettings; AddWidget(new DebugUI.Foldout { displayName = "Material Filters", @@ -54,7 +54,7 @@ public SettingsPanel() } }); - var lightingSettingsData = debugDisplaySettings.LightingSettings; + var lightingSettingsData = debugDisplaySettings.lightingSettings; AddWidget(new DebugUI.Foldout { displayName = "Lighting Debug Modes", @@ -75,7 +75,7 @@ public SettingsPanel() } }); - var renderingSettingsData = debugDisplaySettings.RenderingSettings; + var renderingSettingsData = debugDisplaySettings.renderingSettings; AddWidget(new DebugUI.Foldout { displayName = "Rendering Debug", @@ -103,11 +103,13 @@ public SettingsPanel() } #region IDebugDisplaySettingsData - UniversalRenderPipelineDebugDisplaySettings debugDisplaySettings => UniversalRenderPipelineDebugDisplaySettings.Instance; - public bool AreAnySettingsActive => debugDisplaySettings.AreAnySettingsActive; - public bool IsPostProcessingAllowed => debugDisplaySettings.IsPostProcessingAllowed; - public bool IsLightingActive => debugDisplaySettings.IsLightingActive; - public bool TryGetScreenClearColor(ref Color color) => debugDisplaySettings.TryGetScreenClearColor(ref color); + + // All common settings are owned by another panel, so they are treated as inactive here. + + public bool AreAnySettingsActive => false; + public bool IsPostProcessingAllowed => true; + public bool IsLightingActive => true; + public bool TryGetScreenClearColor(ref Color _) => false; public IDebugDisplaySettingsPanelDisposable CreatePanel() { diff --git a/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsLighting.cs b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsLighting.cs index 6dce156a8ce..d3a46ec9893 100644 --- a/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsLighting.cs +++ b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsLighting.cs @@ -3,10 +3,20 @@ namespace UnityEngine.Rendering.Universal { - class DebugDisplaySettingsLighting : IDebugDisplaySettingsData + /// + /// Lighting-related Rendering Debugger settings. + /// + public class DebugDisplaySettingsLighting : IDebugDisplaySettingsData { - internal DebugLightingMode DebugLightingMode { get; private set; } - internal DebugLightingFeatureFlags DebugLightingFeatureFlagsMask { get; private set; } + /// + /// Current debug lighting mode. + /// + public DebugLightingMode lightingDebugMode { get; set; } + + /// + /// Current debug lighting feature flags mask that allows selective disabling individual lighting components. + /// + public DebugLightingFeatureFlags lightingFeatureFlags { get; set; } static class Strings { @@ -20,17 +30,17 @@ internal static class WidgetFactory { nameAndTooltip = Strings.LightingDebugMode, autoEnum = typeof(DebugLightingMode), - getter = () => (int)data.DebugLightingMode, + getter = () => (int)data.lightingDebugMode, setter = (value) => { }, - getIndex = () => (int)data.DebugLightingMode, - setIndex = (value) => data.DebugLightingMode = (DebugLightingMode)value + getIndex = () => (int)data.lightingDebugMode, + setIndex = (value) => data.lightingDebugMode = (DebugLightingMode)value }; internal static DebugUI.Widget CreateLightingFeatures(DebugDisplaySettingsLighting data) => new DebugUI.BitField { nameAndTooltip = Strings.LightingFeatures, - getter = () => data.DebugLightingFeatureFlagsMask, - setter = (value) => data.DebugLightingFeatureFlagsMask = (DebugLightingFeatureFlags)value, + getter = () => data.lightingFeatureFlags, + setter = (value) => data.lightingFeatureFlags = (DebugLightingFeatureFlags)value, enumType = typeof(DebugLightingFeatureFlags), }; } @@ -58,9 +68,9 @@ public SettingsPanel(DebugDisplaySettingsLighting data) } #region IDebugDisplaySettingsData - public bool AreAnySettingsActive => (DebugLightingMode != DebugLightingMode.None) || (DebugLightingFeatureFlagsMask != DebugLightingFeatureFlags.None); + public bool AreAnySettingsActive => (lightingDebugMode != DebugLightingMode.None) || (lightingFeatureFlags != DebugLightingFeatureFlags.None); - public bool IsPostProcessingAllowed => (DebugLightingMode != DebugLightingMode.Reflections && DebugLightingMode != DebugLightingMode.ReflectionsWithSmoothness); + public bool IsPostProcessingAllowed => (lightingDebugMode != DebugLightingMode.Reflections && lightingDebugMode != DebugLightingMode.ReflectionsWithSmoothness); public bool IsLightingActive => true; @@ -69,7 +79,7 @@ public bool TryGetScreenClearColor(ref Color color) return false; } - public IDebugDisplaySettingsPanelDisposable CreatePanel() + IDebugDisplaySettingsPanelDisposable IDebugDisplaySettingsData.CreatePanel() { return new SettingsPanel(this); } diff --git a/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsMaterial.cs b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsMaterial.cs index 8310ee6b93f..0b94f8346e4 100644 --- a/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsMaterial.cs +++ b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsMaterial.cs @@ -3,10 +3,17 @@ namespace UnityEngine.Rendering.Universal { - class DebugDisplaySettingsMaterial : IDebugDisplaySettingsData + /// + /// Material-related Rendering Debugger settings. + /// + public class DebugDisplaySettingsMaterial : IDebugDisplaySettingsData { #region Material validation - internal enum AlbedoDebugValidationPreset + + /// + /// Builtin presets for debug albedo validation. + /// + public enum AlbedoDebugValidationPreset { DefaultLuminance, BlackAcrylicPaint, @@ -22,6 +29,7 @@ internal enum AlbedoDebugValidationPreset FreshSnow, BlueSky, Foliage, + Custom } struct AlbedoDebugValidationPresetData @@ -134,50 +142,100 @@ struct AlbedoDebugValidationPresetData minLuminance = new Color(91f / 255f, 108f / 255f, 65f / 255f).linear.maxColorComponent - 0.05f, maxLuminance = new Color(91f / 255f, 108f / 255f, 65f / 255f).linear.maxColorComponent + 0.05f }, + new AlbedoDebugValidationPresetData() + { + name = "Custom", + color = new Color(127f / 255f, 127f / 255f, 127f / 255f), + minLuminance = 0.01f, + maxLuminance = 0.90f + }, }; - AlbedoDebugValidationPreset m_AlbedoDebugValidationPreset; - internal AlbedoDebugValidationPreset albedoDebugValidationPreset + AlbedoDebugValidationPreset m_AlbedoValidationPreset; + + /// + /// Current albedo debug validation preset. + /// + public AlbedoDebugValidationPreset albedoValidationPreset { - get => m_AlbedoDebugValidationPreset; + get => m_AlbedoValidationPreset; set { - m_AlbedoDebugValidationPreset = value; + m_AlbedoValidationPreset = value; AlbedoDebugValidationPresetData presetData = m_AlbedoDebugValidationPresetData[(int)value]; - AlbedoMinLuminance = presetData.minLuminance; - AlbedoMaxLuminance = presetData.maxLuminance; - AlbedoCompareColor = presetData.color; + albedoMinLuminance = presetData.minLuminance; + albedoMaxLuminance = presetData.maxLuminance; + albedoCompareColor = presetData.color; } } - internal float AlbedoMinLuminance = 0.01f; - internal float AlbedoMaxLuminance = 0.90f; + /// + /// Current minimum luminance threshold value for albedo validation. + /// Any albedo luminance values below this value will be considered invalid and will appear red on screen. + /// + public float albedoMinLuminance { get; set; } = 0.01f; + + /// + /// Current maximum luminance threshold value for albedo validation. + /// Any albedo luminance values above this value will be considered invalid and will appear blue on screen. + /// + public float albedoMaxLuminance { get; set; } = 0.90f; float m_AlbedoHueTolerance = 0.104f; - internal float AlbedoHueTolerance + + /// + /// Current hue tolerance value for albedo validation. + /// + public float albedoHueTolerance { - get => m_AlbedoDebugValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance ? 1.0f : m_AlbedoHueTolerance; - private set => m_AlbedoHueTolerance = value; + get => m_AlbedoValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance ? 1.0f : m_AlbedoHueTolerance; + set => m_AlbedoHueTolerance = value; } float m_AlbedoSaturationTolerance = 0.214f; - internal float AlbedoSaturationTolerance + + /// + /// Current saturation tolerance value for albedo validation. + /// + public float albedoSaturationTolerance { - get => m_AlbedoDebugValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance ? 1.0f : m_AlbedoSaturationTolerance; - private set => m_AlbedoSaturationTolerance = value; + get => m_AlbedoValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance ? 1.0f : m_AlbedoSaturationTolerance; + set => m_AlbedoSaturationTolerance = value; } - internal Color AlbedoCompareColor = new Color(127f / 255f, 127f / 255f, 127f / 255f, 255f / 255f); + /// + /// Current target color value for albedo validation. + /// + public Color albedoCompareColor { get; set; } = new Color(127f / 255f, 127f / 255f, 127f / 255f, 255f / 255f); + + /// + /// Current minimum threshold value for metallic validation. + /// Any metallic values below this value will be considered invalid and will appear red on screen. + /// + public float metallicMinValue { get; set; } = 0.0f; - internal float MetallicMinValue = 0.0f; - internal float MetallicMaxValue = 0.9f; + /// + /// Current maximum threshold value for metallic validation. + /// Any metallic values above this value will be considered invalid and will appear blue on screen. + /// + public float metallicMaxValue { get; set; } = 0.9f; - internal DebugMaterialValidationMode MaterialValidationMode; + /// + /// Current material validation mode. + /// + public DebugMaterialValidationMode materialValidationMode { get; set; } #endregion - internal DebugMaterialMode DebugMaterialModeData { get; private set; } - internal DebugVertexAttributeMode DebugVertexAttributeIndexData { get; private set; } + /// + /// Current debug material mode. + /// + public DebugMaterialMode materialDebugMode { get; set; } + + /// + /// Current debug vertex attribute mode. + /// + public DebugVertexAttributeMode vertexAttributeDebugMode { get; set; } static class Strings { @@ -188,6 +246,7 @@ static class Strings public static readonly NameAndTooltip VertexAttribute = new() { name = "Vertex Attribute", tooltip = "Use the drop-down to select a 3D GameObject attribute, like Texture Coordinates or Vertex Color, to visualize on screen." }; public static readonly NameAndTooltip MaterialValidationMode = new() { name = "Material Validation Mode", tooltip = "Debug and validate material properties." }; public static readonly NameAndTooltip ValidationPreset = new() { name = "Validation Preset", tooltip = "Validate using a list of preset surfaces and inputs based on real-world surfaces." }; + public static readonly NameAndTooltip AlbedoCustomColor = new() { name = "Target Color", tooltip = "Custom target color for albedo validation." }; public static readonly NameAndTooltip AlbedoMinLuminance = new() { name = "Min Luminance", tooltip = "Any values set below this field are invalid and appear red on screen." }; public static readonly NameAndTooltip AlbedoMaxLuminance = new() { name = "Max Luminance", tooltip = "Any values set above this field are invalid and appear blue on screen." }; public static readonly NameAndTooltip AlbedoHueTolerance = new() { name = "Hue Tolerance", tooltip = "Validate a material based on a specific hue." }; @@ -202,30 +261,30 @@ internal static class WidgetFactory { nameAndTooltip = Strings.MaterialOverride, autoEnum = typeof(DebugMaterialMode), - getter = () => (int)data.DebugMaterialModeData, + getter = () => (int)data.materialDebugMode, setter = (value) => { }, - getIndex = () => (int)data.DebugMaterialModeData, - setIndex = (value) => data.DebugMaterialModeData = (DebugMaterialMode)value + getIndex = () => (int)data.materialDebugMode, + setIndex = (value) => data.materialDebugMode = (DebugMaterialMode)value }; internal static DebugUI.Widget CreateVertexAttribute(DebugDisplaySettingsMaterial data) => new DebugUI.EnumField { nameAndTooltip = Strings.VertexAttribute, autoEnum = typeof(DebugVertexAttributeMode), - getter = () => (int)data.DebugVertexAttributeIndexData, + getter = () => (int)data.vertexAttributeDebugMode, setter = (value) => { }, - getIndex = () => (int)data.DebugVertexAttributeIndexData, - setIndex = (value) => data.DebugVertexAttributeIndexData = (DebugVertexAttributeMode)value + getIndex = () => (int)data.vertexAttributeDebugMode, + setIndex = (value) => data.vertexAttributeDebugMode = (DebugVertexAttributeMode)value }; internal static DebugUI.Widget CreateMaterialValidationMode(DebugDisplaySettingsMaterial data) => new DebugUI.EnumField { nameAndTooltip = Strings.MaterialValidationMode, autoEnum = typeof(DebugMaterialValidationMode), - getter = () => (int)data.MaterialValidationMode, + getter = () => (int)data.materialValidationMode, setter = (value) => { }, - getIndex = () => (int)data.MaterialValidationMode, - setIndex = (value) => data.MaterialValidationMode = (DebugMaterialValidationMode)value, + getIndex = () => (int)data.materialValidationMode, + setIndex = (value) => data.materialValidationMode = (DebugMaterialValidationMode)value, onValueChanged = (_, _) => DebugManager.instance.ReDrawOnScreenDebug() }; @@ -233,60 +292,68 @@ internal static class WidgetFactory { nameAndTooltip = Strings.ValidationPreset, autoEnum = typeof(AlbedoDebugValidationPreset), - getter = () => (int)data.albedoDebugValidationPreset, + getter = () => (int)data.albedoValidationPreset, setter = (value) => { }, - getIndex = () => (int)data.albedoDebugValidationPreset, - setIndex = (value) => data.albedoDebugValidationPreset = (AlbedoDebugValidationPreset)value, + getIndex = () => (int)data.albedoValidationPreset, + setIndex = (value) => data.albedoValidationPreset = (AlbedoDebugValidationPreset)value, onValueChanged = (_, _) => DebugManager.instance.ReDrawOnScreenDebug() }; + internal static DebugUI.Widget CreateAlbedoCustomColor(DebugDisplaySettingsMaterial data) => new DebugUI.ColorField() + { + nameAndTooltip = Strings.AlbedoCustomColor, + getter = () => data.albedoCompareColor, + setter = (value) => data.albedoCompareColor = value, + isHiddenCallback = () => data.albedoValidationPreset != AlbedoDebugValidationPreset.Custom + }; + internal static DebugUI.Widget CreateAlbedoMinLuminance(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField { nameAndTooltip = Strings.AlbedoMinLuminance, - getter = () => data.AlbedoMinLuminance, - setter = (value) => data.AlbedoMinLuminance = value, + getter = () => data.albedoMinLuminance, + setter = (value) => data.albedoMinLuminance = value, incStep = 0.01f }; internal static DebugUI.Widget CreateAlbedoMaxLuminance(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField { nameAndTooltip = Strings.AlbedoMaxLuminance, - getter = () => data.AlbedoMaxLuminance, - setter = (value) => data.AlbedoMaxLuminance = value, + getter = () => data.albedoMaxLuminance, + setter = (value) => data.albedoMaxLuminance = value, incStep = 0.01f }; internal static DebugUI.Widget CreateAlbedoHueTolerance(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField { nameAndTooltip = Strings.AlbedoHueTolerance, - getter = () => data.AlbedoHueTolerance, - setter = (value) => data.AlbedoHueTolerance = value, + getter = () => data.albedoHueTolerance, + setter = (value) => data.albedoHueTolerance = value, incStep = 0.01f, - isHiddenCallback = () => data.albedoDebugValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance + isHiddenCallback = () => data.albedoValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance }; internal static DebugUI.Widget CreateAlbedoSaturationTolerance(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField { nameAndTooltip = Strings.AlbedoSaturationTolerance, - getter = () => data.AlbedoSaturationTolerance, - setter = (value) => data.AlbedoSaturationTolerance = value, + getter = () => data.albedoSaturationTolerance, + setter = (value) => data.albedoSaturationTolerance = value, incStep = 0.01f, - isHiddenCallback = () => data.albedoDebugValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance + isHiddenCallback = () => data.albedoValidationPreset == AlbedoDebugValidationPreset.DefaultLuminance }; internal static DebugUI.Widget CreateMetallicMinValue(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField { nameAndTooltip = Strings.MetallicMinValue, - getter = () => data.MetallicMinValue, - setter = (value) => data.MetallicMinValue = value, + getter = () => data.metallicMinValue, + setter = (value) => data.metallicMinValue = value, incStep = 0.01f }; internal static DebugUI.Widget CreateMetallicMaxValue(DebugDisplaySettingsMaterial data) => new DebugUI.FloatField { nameAndTooltip = Strings.MetallicMaxValue, - getter = () => data.MetallicMaxValue, - setter = (value) => data.MetallicMaxValue = value, + getter = () => data.metallicMaxValue, + setter = (value) => data.metallicMaxValue = value, incStep = 0.01f }; } @@ -320,10 +387,11 @@ public SettingsPanel(DebugDisplaySettingsMaterial data) new DebugUI.Container() { displayName = Strings.AlbedoSettingsContainerName, - isHiddenCallback = () => data.MaterialValidationMode != DebugMaterialValidationMode.Albedo, + isHiddenCallback = () => data.materialValidationMode != DebugMaterialValidationMode.Albedo, children = { WidgetFactory.CreateAlbedoPreset(data), + WidgetFactory.CreateAlbedoCustomColor(data), WidgetFactory.CreateAlbedoMinLuminance(data), WidgetFactory.CreateAlbedoMaxLuminance(data), WidgetFactory.CreateAlbedoHueTolerance(data), @@ -333,7 +401,7 @@ public SettingsPanel(DebugDisplaySettingsMaterial data) new DebugUI.Container() { displayName = Strings.MetallicSettingsContainerName, - isHiddenCallback = () => data.MaterialValidationMode != DebugMaterialValidationMode.Metallic, + isHiddenCallback = () => data.materialValidationMode != DebugMaterialValidationMode.Metallic, children = { WidgetFactory.CreateMetallicMinValue(data), @@ -345,11 +413,11 @@ public SettingsPanel(DebugDisplaySettingsMaterial data) } } - #region IDebugDisplaySettingsData + #region IDebugDisplaySettingsQuery public bool AreAnySettingsActive => - (DebugMaterialModeData != DebugMaterialMode.None) || - (DebugVertexAttributeIndexData != DebugVertexAttributeMode.None) || - (MaterialValidationMode != DebugMaterialValidationMode.None); + (materialDebugMode != DebugMaterialMode.None) || + (vertexAttributeDebugMode != DebugVertexAttributeMode.None) || + (materialValidationMode != DebugMaterialValidationMode.None); public bool IsPostProcessingAllowed => !AreAnySettingsActive; public bool IsLightingActive => !AreAnySettingsActive; @@ -358,7 +426,7 @@ public bool TryGetScreenClearColor(ref Color color) return false; } - public IDebugDisplaySettingsPanelDisposable CreatePanel() + IDebugDisplaySettingsPanelDisposable IDebugDisplaySettingsData.CreatePanel() { return new SettingsPanel(this); } diff --git a/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsRendering.cs b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsRendering.cs index eacc16634c7..77bf2550a07 100644 --- a/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsRendering.cs +++ b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplaySettingsRendering.cs @@ -4,21 +4,35 @@ namespace UnityEngine.Rendering.Universal { - class DebugDisplaySettingsRendering : IDebugDisplaySettingsData + /// + /// Debug wireframe modes. + /// + public enum DebugWireframeMode { - // Under the hood, the implementation uses a single enum (DebugSceneOverrideMode). For UI, we have split - // this enum into WireframeMode and a separate Overdraw boolean. + /// No wireframe. + None, + /// Unfilled wireframe. + Wireframe, + /// Solid, filled wireframe. + SolidWireframe, + /// Solid, shaded wireframe. + ShadedWireframe, + } - enum WireframeMode - { - None, - Wireframe, - SolidWireframe, - ShadedWireframe, - } + /// + /// Rendering-related Rendering Debugger settings. + /// + public class DebugDisplaySettingsRendering : IDebugDisplaySettingsData + { + // Under the hood, the implementation uses a single enum (DebugSceneOverrideMode). For UI & public API, + // we have split this enum into WireframeMode and a separate Overdraw boolean. - WireframeMode m_WireframeMode = WireframeMode.None; - WireframeMode wireframeMode + DebugWireframeMode m_WireframeMode = DebugWireframeMode.None; + + /// + /// Current debug wireframe mode. + /// + public DebugWireframeMode wireframeMode { get => m_WireframeMode; set @@ -30,7 +44,10 @@ WireframeMode wireframeMode bool m_Overdraw = false; - bool overdraw + /// + /// Whether debug overdraw mode is active. + /// + public bool overdraw { get => m_Overdraw; set @@ -44,36 +61,72 @@ void UpdateDebugSceneOverrideMode() { switch (wireframeMode) { - case WireframeMode.Wireframe: - debugSceneOverrideMode = DebugSceneOverrideMode.Wireframe; + case DebugWireframeMode.Wireframe: + sceneOverrideMode = DebugSceneOverrideMode.Wireframe; break; - case WireframeMode.SolidWireframe: - debugSceneOverrideMode = DebugSceneOverrideMode.SolidWireframe; + case DebugWireframeMode.SolidWireframe: + sceneOverrideMode = DebugSceneOverrideMode.SolidWireframe; break; - case WireframeMode.ShadedWireframe: - debugSceneOverrideMode = DebugSceneOverrideMode.ShadedWireframe; + case DebugWireframeMode.ShadedWireframe: + sceneOverrideMode = DebugSceneOverrideMode.ShadedWireframe; break; default: - debugSceneOverrideMode = overdraw ? DebugSceneOverrideMode.Overdraw : DebugSceneOverrideMode.None; + sceneOverrideMode = overdraw ? DebugSceneOverrideMode.Overdraw : DebugSceneOverrideMode.None; break; } } - internal DebugFullScreenMode debugFullScreenMode { get; private set; } = DebugFullScreenMode.None; - internal int debugFullScreenModeOutputSizeScreenPercent { get; private set; } = 50; - internal DebugSceneOverrideMode debugSceneOverrideMode { get; private set; } = DebugSceneOverrideMode.None; - internal DebugMipInfoMode debugMipInfoMode { get; private set; } = DebugMipInfoMode.None; + /// + /// Current debug fullscreen overlay mode. + /// + public DebugFullScreenMode fullScreenDebugMode { get; set; } = DebugFullScreenMode.None; + + /// + /// Size of the debug fullscreen overlay, as percentage of the screen size. + /// + public int fullScreenDebugModeOutputSizeScreenPercent { get; set; } = 50; + + internal DebugSceneOverrideMode sceneOverrideMode { get; set; } = DebugSceneOverrideMode.None; + internal DebugMipInfoMode mipInfoMode { get; set; } = DebugMipInfoMode.None; - internal DebugPostProcessingMode debugPostProcessingMode { get; private set; } = DebugPostProcessingMode.Auto; - internal bool enableMsaa { get; private set; } = true; - internal bool enableHDR { get; private set; } = true; + /// + /// Current debug post processing mode. + /// + public DebugPostProcessingMode postProcessingDebugMode { get; set; } = DebugPostProcessingMode.Auto; + + /// + /// Whether MSAA is enabled. + /// + public bool enableMsaa { get; set; } = true; + + /// + /// Whether HDR is enabled. + /// + public bool enableHDR { get; set; } = true; #region Pixel validation - internal DebugValidationMode validationMode { get; private set; } - internal PixelValidationChannels validationChannels { get; private set; } = PixelValidationChannels.RGB; - internal float ValidationRangeMin { get; private set; } = 0.0f; - internal float ValidationRangeMax { get; private set; } = 1.0f; + /// + /// Current debug pixel validation mode. + /// + public DebugValidationMode validationMode { get; set; } + + /// + /// Current validation channels for DebugValidationMode.HighlightOutsideOfRange. + /// + public PixelValidationChannels validationChannels { get; set; } = PixelValidationChannels.RGB; + + /// + /// Current minimum threshold value for pixel validation. + /// Any values below this value will be considered invalid and will appear red on screen. + /// + public float validationRangeMin { get; set; } = 0.0f; + + /// + /// Current maximum threshold value for pixel validation. + /// Any values above this value will be considered invalid and will appear blue on screen. + /// + public float validationRangeMax { get; set; } = 1.0f; static class Strings { @@ -101,10 +154,10 @@ internal static class WidgetFactory { nameAndTooltip = Strings.MapOverlays, autoEnum = typeof(DebugFullScreenMode), - getter = () => (int)data.debugFullScreenMode, + getter = () => (int)data.fullScreenDebugMode, setter = (value) => { }, - getIndex = () => (int)data.debugFullScreenMode, - setIndex = (value) => data.debugFullScreenMode = (DebugFullScreenMode)value + getIndex = () => (int)data.fullScreenDebugMode, + setIndex = (value) => data.fullScreenDebugMode = (DebugFullScreenMode)value }; internal static DebugUI.Widget CreateMapOverlaySize(DebugDisplaySettingsRendering data) => new DebugUI.Container() @@ -114,8 +167,8 @@ internal static class WidgetFactory new DebugUI.IntField { nameAndTooltip = Strings.MapSize, - getter = () => data.debugFullScreenModeOutputSizeScreenPercent, - setter = value => data.debugFullScreenModeOutputSizeScreenPercent = value, + getter = () => data.fullScreenDebugModeOutputSizeScreenPercent, + setter = value => data.fullScreenDebugModeOutputSizeScreenPercent = value, incStep = 10, min = () => 0, max = () => 100 @@ -126,11 +179,11 @@ internal static class WidgetFactory internal static DebugUI.Widget CreateAdditionalWireframeShaderViews(DebugDisplaySettingsRendering data) => new DebugUI.EnumField { nameAndTooltip = Strings.AdditionalWireframeModes, - autoEnum = typeof(WireframeMode), + autoEnum = typeof(DebugWireframeMode), getter = () => (int)data.wireframeMode, setter = (value) => { }, getIndex = () => (int)data.wireframeMode, - setIndex = (value) => data.wireframeMode = (WireframeMode)value, + setIndex = (value) => data.wireframeMode = (DebugWireframeMode)value, onValueChanged = (_, _) => DebugManager.instance.ReDrawOnScreenDebug() }; @@ -148,7 +201,7 @@ internal static class WidgetFactory case GraphicsDeviceType.OpenGLES2: case GraphicsDeviceType.OpenGLES3: case GraphicsDeviceType.Vulkan: - return data.wireframeMode == WireframeMode.None; + return data.wireframeMode == DebugWireframeMode.None; default: return true; } @@ -167,10 +220,10 @@ internal static class WidgetFactory { nameAndTooltip = Strings.PostProcessing, autoEnum = typeof(DebugPostProcessingMode), - getter = () => (int)data.debugPostProcessingMode, - setter = (value) => data.debugPostProcessingMode = (DebugPostProcessingMode)value, - getIndex = () => (int)data.debugPostProcessingMode, - setIndex = (value) => data.debugPostProcessingMode = (DebugPostProcessingMode)value + getter = () => (int)data.postProcessingDebugMode, + setter = (value) => data.postProcessingDebugMode = (DebugPostProcessingMode)value, + getIndex = () => (int)data.postProcessingDebugMode, + setIndex = (value) => data.postProcessingDebugMode = (DebugPostProcessingMode)value }; internal static DebugUI.Widget CreateMSAA(DebugDisplaySettingsRendering data) => new DebugUI.BoolField @@ -211,16 +264,16 @@ internal static class WidgetFactory internal static DebugUI.Widget CreatePixelValueRangeMin(DebugDisplaySettingsRendering data) => new DebugUI.FloatField { nameAndTooltip = Strings.ValueRangeMin, - getter = () => data.ValidationRangeMin, - setter = (value) => data.ValidationRangeMin = value, + getter = () => data.validationRangeMin, + setter = (value) => data.validationRangeMin = value, incStep = 0.01f }; internal static DebugUI.Widget CreatePixelValueRangeMax(DebugDisplaySettingsRendering data) => new DebugUI.FloatField { nameAndTooltip = Strings.ValueRangeMax, - getter = () => data.ValidationRangeMax, - setter = (value) => data.ValidationRangeMax = value, + getter = () => data.validationRangeMax, + setter = (value) => data.validationRangeMax = value, incStep = 0.01f }; } @@ -276,24 +329,24 @@ public SettingsPanel(DebugDisplaySettingsRendering data) } #region IDebugDisplaySettingsData - public bool AreAnySettingsActive => (debugPostProcessingMode != DebugPostProcessingMode.Auto) || - (debugFullScreenMode != DebugFullScreenMode.None) || - (debugSceneOverrideMode != DebugSceneOverrideMode.None) || - (debugMipInfoMode != DebugMipInfoMode.None) || + public bool AreAnySettingsActive => (postProcessingDebugMode != DebugPostProcessingMode.Auto) || + (fullScreenDebugMode != DebugFullScreenMode.None) || + (sceneOverrideMode != DebugSceneOverrideMode.None) || + (mipInfoMode != DebugMipInfoMode.None) || (validationMode != DebugValidationMode.None) || !enableMsaa || !enableHDR; - public bool IsPostProcessingAllowed => (debugPostProcessingMode != DebugPostProcessingMode.Disabled) && - (debugSceneOverrideMode == DebugSceneOverrideMode.None) && - (debugMipInfoMode == DebugMipInfoMode.None); + public bool IsPostProcessingAllowed => (postProcessingDebugMode != DebugPostProcessingMode.Disabled) && + (sceneOverrideMode == DebugSceneOverrideMode.None) && + (mipInfoMode == DebugMipInfoMode.None); - public bool IsLightingActive => (debugSceneOverrideMode == DebugSceneOverrideMode.None) && - (debugMipInfoMode == DebugMipInfoMode.None); + public bool IsLightingActive => (sceneOverrideMode == DebugSceneOverrideMode.None) && + (mipInfoMode == DebugMipInfoMode.None); public bool TryGetScreenClearColor(ref Color color) { - switch (debugSceneOverrideMode) + switch (sceneOverrideMode) { case DebugSceneOverrideMode.None: case DebugSceneOverrideMode.ShadedWireframe: @@ -310,10 +363,10 @@ public bool TryGetScreenClearColor(ref Color color) default: throw new ArgumentOutOfRangeException(nameof(color)); - } // End of switch. + } } - public IDebugDisplaySettingsPanelDisposable CreatePanel() + IDebugDisplaySettingsPanelDisposable IDebugDisplaySettingsData.CreatePanel() { return new SettingsPanel(this); } diff --git a/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplayStats.cs b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplayStats.cs new file mode 100644 index 00000000000..c3e2be614c1 --- /dev/null +++ b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplayStats.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace UnityEngine.Rendering.Universal +{ + class DebugDisplayStats : IDebugDisplaySettingsData + { + DebugFrameTiming m_DebugFrameTiming = new DebugFrameTiming(); + + private class StatsPanel : DebugDisplaySettingsPanel + { + public override string PanelName => "Display Stats"; + public override DebugUI.Flags Flags => DebugUI.Flags.RuntimeOnly; + + public StatsPanel(DebugFrameTiming frameTiming) + { + var list = new List(); + frameTiming.RegisterDebugUI(list); + + foreach (var w in list) + AddWidget(w); + } + } + + public void UpdateFrameTiming() + { + m_DebugFrameTiming.UpdateFrameTiming(); + } + + #region IDebugDisplaySettingsData + + public bool AreAnySettingsActive => false; + public bool IsPostProcessingAllowed => true; + public bool IsLightingActive => true; + public bool TryGetScreenClearColor(ref Color _) => false; + + public IDebugDisplaySettingsPanelDisposable CreatePanel() + { + return new StatsPanel(m_DebugFrameTiming); + } + + #endregion + } +} diff --git a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplayStats.cs.meta similarity index 83% rename from com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta rename to com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplayStats.cs.meta index 95be10b6fb2..aeb47ac4f13 100644 --- a/com.unity.render-pipelines.universal/Editor/RendererFeatures/DrawFullscreenFeatureEditor.cs.meta +++ b/com.unity.render-pipelines.universal/Runtime/Debug/DebugDisplayStats.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 22ef3eb47947de44f9295df3cbc3de75 +guid: cd017e26c44959440b65ae797d9d4d90 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/com.unity.render-pipelines.universal/Runtime/Debug/DebugHandler.cs b/com.unity.render-pipelines.universal/Runtime/Debug/DebugHandler.cs index 6f12571e5f7..12867a6b029 100644 --- a/com.unity.render-pipelines.universal/Runtime/Debug/DebugHandler.cs +++ b/com.unity.render-pipelines.universal/Runtime/Debug/DebugHandler.cs @@ -57,9 +57,9 @@ class DebugHandler : IDebugDisplaySettingsQuery readonly UniversalRenderPipelineDebugDisplaySettings m_DebugDisplaySettings; - DebugDisplaySettingsLighting LightingSettings => m_DebugDisplaySettings.LightingSettings; - DebugDisplaySettingsMaterial MaterialSettings => m_DebugDisplaySettings.MaterialSettings; - DebugDisplaySettingsRendering RenderingSettings => m_DebugDisplaySettings.RenderingSettings; + DebugDisplaySettingsLighting LightingSettings => m_DebugDisplaySettings.lightingSettings; + DebugDisplaySettingsMaterial MaterialSettings => m_DebugDisplaySettings.materialSettings; + DebugDisplaySettingsRendering RenderingSettings => m_DebugDisplaySettings.renderingSettings; #region IDebugDisplaySettingsQuery @@ -69,12 +69,12 @@ class DebugHandler : IDebugDisplaySettingsQuery // These modes would require putting custom data into gbuffer, so instead we just disable deferred mode. internal bool IsActiveModeUnsupportedForDeferred => - m_DebugDisplaySettings.LightingSettings.DebugLightingMode != DebugLightingMode.None || - m_DebugDisplaySettings.LightingSettings.DebugLightingFeatureFlagsMask != DebugLightingFeatureFlags.None || - m_DebugDisplaySettings.RenderingSettings.debugSceneOverrideMode != DebugSceneOverrideMode.None || - m_DebugDisplaySettings.MaterialSettings.DebugMaterialModeData != DebugMaterialMode.None || - m_DebugDisplaySettings.MaterialSettings.DebugVertexAttributeIndexData != DebugVertexAttributeMode.None || - m_DebugDisplaySettings.MaterialSettings.MaterialValidationMode != DebugMaterialValidationMode.None; + m_DebugDisplaySettings.lightingSettings.lightingDebugMode != DebugLightingMode.None || + m_DebugDisplaySettings.lightingSettings.lightingFeatureFlags != DebugLightingFeatureFlags.None || + m_DebugDisplaySettings.renderingSettings.sceneOverrideMode != DebugSceneOverrideMode.None || + m_DebugDisplaySettings.materialSettings.materialDebugMode != DebugMaterialMode.None || + m_DebugDisplaySettings.materialSettings.vertexAttributeDebugMode != DebugVertexAttributeMode.None || + m_DebugDisplaySettings.materialSettings.materialValidationMode != DebugMaterialValidationMode.None; public bool TryGetScreenClearColor(ref Color color) { @@ -100,7 +100,7 @@ internal bool IsRenderPassSupported { get { - return RenderingSettings.debugSceneOverrideMode == DebugSceneOverrideMode.None || RenderingSettings.debugSceneOverrideMode == DebugSceneOverrideMode.Overdraw; + return RenderingSettings.sceneOverrideMode == DebugSceneOverrideMode.None || RenderingSettings.sceneOverrideMode == DebugSceneOverrideMode.Overdraw; } } @@ -125,15 +125,15 @@ internal bool TryGetFullscreenDebugMode(out DebugFullScreenMode debugFullScreenM internal bool TryGetFullscreenDebugMode(out DebugFullScreenMode debugFullScreenMode, out int textureHeightPercent) { - debugFullScreenMode = RenderingSettings.debugFullScreenMode; - textureHeightPercent = RenderingSettings.debugFullScreenModeOutputSizeScreenPercent; + debugFullScreenMode = RenderingSettings.fullScreenDebugMode; + textureHeightPercent = RenderingSettings.fullScreenDebugModeOutputSizeScreenPercent; return debugFullScreenMode != DebugFullScreenMode.None; } [Conditional("DEVELOPMENT_BUILD"), Conditional("UNITY_EDITOR")] internal void SetupShaderProperties(CommandBuffer cmd, int passIndex = 0) { - if (LightingSettings.DebugLightingMode == DebugLightingMode.ShadowCascades) + if (LightingSettings.lightingDebugMode == DebugLightingMode.ShadowCascades) { // we disable cubemap reflections, too distracting (in TemplateLWRP for ex.) cmd.EnableShaderKeyword("_DEBUG_ENVIRONMENTREFLECTIONS_OFF"); @@ -143,7 +143,7 @@ internal void SetupShaderProperties(CommandBuffer cmd, int passIndex = 0) cmd.DisableShaderKeyword("_DEBUG_ENVIRONMENTREFLECTIONS_OFF"); } - switch (RenderingSettings.debugSceneOverrideMode) + switch (RenderingSettings.sceneOverrideMode) { case DebugSceneOverrideMode.Overdraw: { @@ -179,19 +179,19 @@ internal void SetupShaderProperties(CommandBuffer cmd, int passIndex = 0) } } - switch (MaterialSettings.MaterialValidationMode) + switch (MaterialSettings.materialValidationMode) { case DebugMaterialValidationMode.Albedo: - cmd.SetGlobalFloat(k_DebugValidateAlbedoMinLuminanceId, MaterialSettings.AlbedoMinLuminance); - cmd.SetGlobalFloat(k_DebugValidateAlbedoMaxLuminanceId, MaterialSettings.AlbedoMaxLuminance); - cmd.SetGlobalFloat(k_DebugValidateAlbedoSaturationToleranceId, MaterialSettings.AlbedoSaturationTolerance); - cmd.SetGlobalFloat(k_DebugValidateAlbedoHueToleranceId, MaterialSettings.AlbedoHueTolerance); - cmd.SetGlobalColor(k_DebugValidateAlbedoCompareColorId, MaterialSettings.AlbedoCompareColor.linear); + cmd.SetGlobalFloat(k_DebugValidateAlbedoMinLuminanceId, MaterialSettings.albedoMinLuminance); + cmd.SetGlobalFloat(k_DebugValidateAlbedoMaxLuminanceId, MaterialSettings.albedoMaxLuminance); + cmd.SetGlobalFloat(k_DebugValidateAlbedoSaturationToleranceId, MaterialSettings.albedoSaturationTolerance); + cmd.SetGlobalFloat(k_DebugValidateAlbedoHueToleranceId, MaterialSettings.albedoHueTolerance); + cmd.SetGlobalColor(k_DebugValidateAlbedoCompareColorId, MaterialSettings.albedoCompareColor.linear); break; case DebugMaterialValidationMode.Metallic: - cmd.SetGlobalFloat(k_DebugValidateMetallicMinValueId, MaterialSettings.MetallicMinValue); - cmd.SetGlobalFloat(k_DebugValidateMetallicMaxValueId, MaterialSettings.MetallicMaxValue); + cmd.SetGlobalFloat(k_DebugValidateMetallicMinValueId, MaterialSettings.metallicMinValue); + cmd.SetGlobalFloat(k_DebugValidateMetallicMaxValueId, MaterialSettings.metallicMaxValue); break; } } @@ -236,12 +236,12 @@ internal void UpdateShaderGlobalPropertiesForFinalValidationPass(CommandBuffer c cmd.SetGlobalInteger(k_DebugRenderTargetSupportsStereo, m_DebugRenderTargetSupportsStereo ? 1 : 0); } - var renderingSettings = m_DebugDisplaySettings.RenderingSettings; + var renderingSettings = m_DebugDisplaySettings.renderingSettings; if (renderingSettings.validationMode == DebugValidationMode.HighlightOutsideOfRange) { cmd.SetGlobalInteger(k_ValidationChannelsId, (int)renderingSettings.validationChannels); - cmd.SetGlobalFloat(k_RangeMinimumId, renderingSettings.ValidationRangeMin); - cmd.SetGlobalFloat(k_RangeMaximumId, renderingSettings.ValidationRangeMax); + cmd.SetGlobalFloat(k_RangeMinimumId, renderingSettings.validationRangeMin); + cmd.SetGlobalFloat(k_RangeMaximumId, renderingSettings.validationRangeMax); } } @@ -255,22 +255,22 @@ internal void Setup(ScriptableRenderContext context, ref CameraData cameraData) cmd.EnableShaderKeyword(ShaderKeywordStrings.DEBUG_DISPLAY); // Material settings... - cmd.SetGlobalFloat(k_DebugMaterialModeId, (int)MaterialSettings.DebugMaterialModeData); - cmd.SetGlobalFloat(k_DebugVertexAttributeModeId, (int)MaterialSettings.DebugVertexAttributeIndexData); + cmd.SetGlobalFloat(k_DebugMaterialModeId, (int)MaterialSettings.materialDebugMode); + cmd.SetGlobalFloat(k_DebugVertexAttributeModeId, (int)MaterialSettings.vertexAttributeDebugMode); - cmd.SetGlobalInteger(k_DebugMaterialValidationModeId, (int)MaterialSettings.MaterialValidationMode); + cmd.SetGlobalInteger(k_DebugMaterialValidationModeId, (int)MaterialSettings.materialValidationMode); // Rendering settings... - cmd.SetGlobalInteger(k_DebugMipInfoModeId, (int)RenderingSettings.debugMipInfoMode); - cmd.SetGlobalInteger(k_DebugSceneOverrideModeId, (int)RenderingSettings.debugSceneOverrideMode); - cmd.SetGlobalInteger(k_DebugFullScreenModeId, (int)RenderingSettings.debugFullScreenMode); + cmd.SetGlobalInteger(k_DebugMipInfoModeId, (int)RenderingSettings.mipInfoMode); + cmd.SetGlobalInteger(k_DebugSceneOverrideModeId, (int)RenderingSettings.sceneOverrideMode); + cmd.SetGlobalInteger(k_DebugFullScreenModeId, (int)RenderingSettings.fullScreenDebugMode); cmd.SetGlobalInteger(k_DebugValidationModeId, (int)RenderingSettings.validationMode); cmd.SetGlobalColor(k_DebugValidateBelowMinThresholdColorPropertyId, Color.red); cmd.SetGlobalColor(k_DebugValidateAboveMaxThresholdColorPropertyId, Color.blue); // Lighting settings... - cmd.SetGlobalFloat(k_DebugLightingModeId, (int)LightingSettings.DebugLightingMode); - cmd.SetGlobalInteger(k_DebugLightingFeatureFlagsId, (int)LightingSettings.DebugLightingFeatureFlagsMask); + cmd.SetGlobalFloat(k_DebugLightingModeId, (int)LightingSettings.lightingDebugMode); + cmd.SetGlobalInteger(k_DebugLightingFeatureFlagsId, (int)LightingSettings.lightingFeatureFlags); // Set-up any other persistent properties... cmd.SetGlobalColor(k_DebugColorInvalidModePropertyId, Color.red); @@ -302,7 +302,7 @@ private class Enumerator : IEnumerator public Enumerator(DebugHandler debugHandler, ScriptableRenderContext context, CommandBuffer commandBuffer) { - DebugSceneOverrideMode sceneOverrideMode = debugHandler.DebugDisplaySettings.RenderingSettings.debugSceneOverrideMode; + DebugSceneOverrideMode sceneOverrideMode = debugHandler.DebugDisplaySettings.renderingSettings.sceneOverrideMode; m_DebugHandler = debugHandler; m_Context = context; diff --git a/com.unity.render-pipelines.universal/Runtime/Debug/DebugRenderSetup.cs b/com.unity.render-pipelines.universal/Runtime/Debug/DebugRenderSetup.cs index fb386dce8df..59286947ba0 100644 --- a/com.unity.render-pipelines.universal/Runtime/Debug/DebugRenderSetup.cs +++ b/com.unity.render-pipelines.universal/Runtime/Debug/DebugRenderSetup.cs @@ -9,13 +9,13 @@ class DebugRenderSetup : IDisposable private readonly CommandBuffer m_CommandBuffer; private readonly int m_Index; - private DebugDisplaySettingsMaterial MaterialSettings => m_DebugHandler.DebugDisplaySettings.MaterialSettings; - private DebugDisplaySettingsRendering RenderingSettings => m_DebugHandler.DebugDisplaySettings.RenderingSettings; - private DebugDisplaySettingsLighting LightingSettings => m_DebugHandler.DebugDisplaySettings.LightingSettings; + private DebugDisplaySettingsMaterial MaterialSettings => m_DebugHandler.DebugDisplaySettings.materialSettings; + private DebugDisplaySettingsRendering RenderingSettings => m_DebugHandler.DebugDisplaySettings.renderingSettings; + private DebugDisplaySettingsLighting LightingSettings => m_DebugHandler.DebugDisplaySettings.lightingSettings; private void Begin() { - DebugSceneOverrideMode sceneOverrideMode = RenderingSettings.debugSceneOverrideMode; + DebugSceneOverrideMode sceneOverrideMode = RenderingSettings.sceneOverrideMode; switch (sceneOverrideMode) { @@ -46,7 +46,7 @@ private void Begin() private void End() { - DebugSceneOverrideMode sceneOverrideMode = RenderingSettings.debugSceneOverrideMode; + DebugSceneOverrideMode sceneOverrideMode = RenderingSettings.sceneOverrideMode; switch (sceneOverrideMode) { @@ -82,7 +82,7 @@ internal DebugRenderSetup(DebugHandler debugHandler, ScriptableRenderContext con internal DrawingSettings CreateDrawingSettings(DrawingSettings drawingSettings) { - bool usesReplacementMaterial = (MaterialSettings.DebugVertexAttributeIndexData != DebugVertexAttributeMode.None); + bool usesReplacementMaterial = (MaterialSettings.vertexAttributeDebugMode != DebugVertexAttributeMode.None); if (usesReplacementMaterial) { @@ -100,7 +100,7 @@ internal DrawingSettings CreateDrawingSettings(DrawingSettings drawingSettings) internal RenderStateBlock GetRenderStateBlock(RenderStateBlock renderStateBlock) { - DebugSceneOverrideMode sceneOverrideMode = RenderingSettings.debugSceneOverrideMode; + DebugSceneOverrideMode sceneOverrideMode = RenderingSettings.sceneOverrideMode; // Potentially override parts of the RenderStateBlock switch (sceneOverrideMode) diff --git a/com.unity.render-pipelines.universal/Runtime/Debug/UniversalRenderPipelineDebugDisplaySettings.cs b/com.unity.render-pipelines.universal/Runtime/Debug/UniversalRenderPipelineDebugDisplaySettings.cs index d4e7c0eeed2..1c6121f830c 100644 --- a/com.unity.render-pipelines.universal/Runtime/Debug/UniversalRenderPipelineDebugDisplaySettings.cs +++ b/com.unity.render-pipelines.universal/Runtime/Debug/UniversalRenderPipelineDebugDisplaySettings.cs @@ -9,40 +9,24 @@ public class UniversalRenderPipelineDebugDisplaySettings : DebugDisplaySettings< /// /// Material-related Rendering Debugger settings. /// - internal DebugDisplaySettingsMaterial MaterialSettings { get; private set; } + public DebugDisplaySettingsMaterial materialSettings { get; private set; } /// /// Rendering-related Rendering Debugger settings. /// - internal DebugDisplaySettingsRendering RenderingSettings { get; private set; } + public DebugDisplaySettingsRendering renderingSettings { get; private set; } /// /// Lighting-related Rendering Debugger settings. /// - internal DebugDisplaySettingsLighting LightingSettings { get; private set; } - - #region IDebugDisplaySettingsQuery + public DebugDisplaySettingsLighting lightingSettings { get; private set; } /// - /// Returns true if any of the debug settings are currently active. + /// Display stats. /// - public override bool AreAnySettingsActive => MaterialSettings.AreAnySettingsActive || - LightingSettings.AreAnySettingsActive || - RenderingSettings.AreAnySettingsActive; - - public override bool TryGetScreenClearColor(ref Color color) - { - return MaterialSettings.TryGetScreenClearColor(ref color) || - RenderingSettings.TryGetScreenClearColor(ref color) || - LightingSettings.TryGetScreenClearColor(ref color); - } + internal DebugDisplayStats DisplayStats { get; private set; } - /// - /// Returns true if lighting is active for current state of debug settings. - /// - public override bool IsLightingActive => MaterialSettings.IsLightingActive && - RenderingSettings.IsLightingActive && - LightingSettings.IsLightingActive; + #region IDebugDisplaySettingsQuery /// /// Returns true if the current state of debug settings allows post-processing. @@ -51,7 +35,7 @@ public override bool IsPostProcessingAllowed { get { - DebugPostProcessingMode debugPostProcessingMode = RenderingSettings.debugPostProcessingMode; + DebugPostProcessingMode debugPostProcessingMode = renderingSettings.postProcessingDebugMode; switch (debugPostProcessingMode) { @@ -62,10 +46,11 @@ public override bool IsPostProcessingAllowed case DebugPostProcessingMode.Auto: { - // Only enable post-processing if we aren't using certain debug-views... - return MaterialSettings.IsPostProcessingAllowed && - RenderingSettings.IsPostProcessingAllowed && - LightingSettings.IsPostProcessingAllowed; + // Only enable post-processing if we aren't using certain debug-views. + bool postProcessingAllowed = true; + foreach (IDebugDisplaySettingsData setting in m_Settings) + postProcessingAllowed &= setting.IsPostProcessingAllowed; + return postProcessingAllowed; } case DebugPostProcessingMode.Enabled: @@ -84,16 +69,24 @@ public override bool IsPostProcessingAllowed public UniversalRenderPipelineDebugDisplaySettings() { + Reset(); } public override void Reset() { m_Settings.Clear(); + DisplayStats = Add(new DebugDisplayStats()); CommonSettings = Add(new DebugDisplaySettingsCommon()); - MaterialSettings = Add(new DebugDisplaySettingsMaterial()); - LightingSettings = Add(new DebugDisplaySettingsLighting()); - RenderingSettings = Add(new DebugDisplaySettingsRendering()); + materialSettings = Add(new DebugDisplaySettingsMaterial()); + lightingSettings = Add(new DebugDisplaySettingsLighting()); + renderingSettings = Add(new DebugDisplaySettingsRendering()); + } + + internal void UpdateFrameTiming() + { + if (DisplayStats != null) + DisplayStats.UpdateFrameTiming(); } } } diff --git a/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs b/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs index 50d65c9dccd..d87ae624318 100644 --- a/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs @@ -17,6 +17,7 @@ internal class DecalGBufferRenderPass : ScriptableRenderPass private DecalDrawGBufferSystem m_DrawSystem; private DecalScreenSpaceSettings m_Settings; private DeferredLights m_DeferredLights; + private RenderTargetIdentifier[] m_GbufferAttachments; public DecalGBufferRenderPass(DecalScreenSpaceSettings settings, DecalDrawGBufferSystem drawSystem) { @@ -41,7 +42,20 @@ internal void Setup(DeferredLights deferredLights) public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { - ConfigureTarget(m_DeferredLights.GbufferAttachmentIdentifiers, m_DeferredLights.DepthAttachmentIdentifier); + if (m_DeferredLights != null && m_DeferredLights.UseRenderPass) + { + if (m_GbufferAttachments == null) + m_GbufferAttachments = new RenderTargetIdentifier[] + { + m_DeferredLights.GbufferAttachmentIdentifiers[0], m_DeferredLights.GbufferAttachmentIdentifiers[1], + m_DeferredLights.GbufferAttachmentIdentifiers[2], m_DeferredLights.GbufferAttachmentIdentifiers[3] + }; + ConfigureInputAttachments(m_DeferredLights.DepthCopyTextureIdentifier, false); + } + else + m_GbufferAttachments = m_DeferredLights.GbufferAttachmentIdentifiers; + + ConfigureTarget(m_GbufferAttachments, m_DeferredLights.DepthAttachmentIdentifier); } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) diff --git a/com.unity.render-pipelines.universal/Runtime/DeferredLights.cs b/com.unity.render-pipelines.universal/Runtime/DeferredLights.cs index 7ea78e2d28f..1888441f080 100644 --- a/com.unity.render-pipelines.universal/Runtime/DeferredLights.cs +++ b/com.unity.render-pipelines.universal/Runtime/DeferredLights.cs @@ -188,6 +188,7 @@ internal bool AccurateGbufferNormals // Output lighting result. internal RenderTargetHandle[] GbufferAttachments { get; set; } internal RenderTargetIdentifier[] DeferredInputAttachments { get; set; } + internal bool[] DeferredInputIsTransient { get; set; } // Input depth texture, also bound as read-only RT internal RenderTargetHandle DepthAttachment { get; set; } // @@ -402,12 +403,17 @@ public void Setup(ref RenderingData renderingData, this.GbufferAttachmentIdentifiers[i] = this.GbufferAttachments[i].Identifier(); this.GbufferFormats[i] = this.GetGBufferFormat(i); } - if (this.DeferredInputAttachments == null && this.UseRenderPass && this.GbufferAttachments.Length >= 5) + if (this.DeferredInputAttachments == null && this.UseRenderPass && this.GbufferAttachments.Length >= 3) { this.DeferredInputAttachments = new RenderTargetIdentifier[4] { this.GbufferAttachmentIdentifiers[0], this.GbufferAttachmentIdentifiers[1], - this.GbufferAttachmentIdentifiers[2], this.GbufferAttachmentIdentifiers[4] + this.GbufferAttachmentIdentifiers[2], this.DepthCopyTextureIdentifier + }; + + this.DeferredInputIsTransient = new bool[4] + { + true, true, true, false }; } this.DepthAttachmentIdentifier = depthAttachment.Identifier(); diff --git a/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs b/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs index 4a117d6b681..2dc8e24140c 100644 --- a/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs @@ -29,6 +29,11 @@ public partial class ScriptableRenderer }; AttachmentDescriptor m_ActiveDepthAttachmentDescriptor; + bool[] m_IsActiveColorAttachmentTransient = new bool[] + { + false, false, false, false, false, false, false, false + }; + internal RenderBufferStoreAction[] m_FinalColorStoreAction = new RenderBufferStoreAction[] { RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, @@ -200,6 +205,7 @@ internal void SetNativeRenderPassMRTAttachmentList(ScriptableRenderPass renderPa UpdateFinalStoreActions(currentMergeablePasses, cameraData); int currentAttachmentIdx = 0; + bool hasInput = false; foreach (var passIdx in currentMergeablePasses) { if (passIdx == -1) @@ -248,7 +254,10 @@ internal void SetNativeRenderPassMRTAttachmentList(ScriptableRenderPass renderPa } if (PassHasInputAttachments(pass)) + { + hasInput = true; SetupInputAttachmentIndices(pass); + } // TODO: this is redundant and is being setup for each attachment. Needs to be done only once per mergeable pass list (we need to make sure mergeable passes use the same depth!) m_ActiveDepthAttachmentDescriptor = new AttachmentDescriptor(SystemInfo.GetGraphicsFormat(DefaultFormat.DepthStencil)); @@ -260,6 +269,9 @@ internal void SetNativeRenderPassMRTAttachmentList(ScriptableRenderPass renderPa if (m_UseOptimizedStoreActions) m_ActiveDepthAttachmentDescriptor.storeAction = m_FinalDepthStoreAction; } + + if (hasInput) + SetupTransientInputAttachments(m_RenderPassesAttachmentCount[currentPassHash]); } } @@ -504,6 +516,7 @@ internal void ExecuteNativeRenderPass(ScriptableRenderContext context, Scriptabl for (int i = 0; i < m_ActiveColorAttachmentDescriptors.Length; ++i) { m_ActiveColorAttachmentDescriptors[i] = RenderingUtils.emptyAttachment; + m_IsActiveColorAttachmentTransient[i] = false; } m_ActiveDepthAttachmentDescriptor = RenderingUtils.emptyAttachment; @@ -523,11 +536,25 @@ internal void SetupInputAttachmentIndices(ScriptableRenderPass pass) continue; } - // Assume input attachment has to be transient as ScriptableRenderPass currently has only setters for StoreAction - // We also change the target of the descriptor for it to be initialized engine-side as a transient resource. - m_ActiveColorAttachmentDescriptors[pass.m_InputAttachmentIndices[i]].loadAction = RenderBufferLoadAction.DontCare; - m_ActiveColorAttachmentDescriptors[pass.m_InputAttachmentIndices[i]].storeAction = RenderBufferStoreAction.DontCare; - m_ActiveColorAttachmentDescriptors[pass.m_InputAttachmentIndices[i]].loadStoreTarget = BuiltinRenderTextureType.None; + // Only update it as long as it has default value - if it was changed once, we assume it'll be memoryless in the whole RenderPass + if (!m_IsActiveColorAttachmentTransient[pass.m_InputAttachmentIndices[i]]) + { + m_IsActiveColorAttachmentTransient[pass.m_InputAttachmentIndices[i]] = pass.IsInputAttachmentTransient(i); + } + } + } + + internal void SetupTransientInputAttachments(int attachmentCount) + { + for (int i = 0; i < attachmentCount; ++i) + { + if (!m_IsActiveColorAttachmentTransient[i]) + continue; + + m_ActiveColorAttachmentDescriptors[i].loadAction = RenderBufferLoadAction.DontCare; + m_ActiveColorAttachmentDescriptors[i].storeAction = RenderBufferStoreAction.DontCare; + // We change the target of the descriptor for it to be initialized engine-side as a transient resource. + m_ActiveColorAttachmentDescriptors[i].loadStoreTarget = BuiltinRenderTextureType.None; } } diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs index 55ece56250b..e469b0256b2 100644 --- a/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs @@ -18,6 +18,9 @@ public class CopyDepthPass : ScriptableRenderPass private RenderTargetHandle destination { get; set; } internal bool AllocateRT { get; set; } internal int MssaSamples { get; set; } + // In some cases (Scene view, XR and etc.) we actually want to output to depth buffer + // So this variable needs to be set to true to enable the correct copy shader semantic + internal bool CopyToDepth { get; set; } Material m_CopyDepthMaterial; internal bool m_CopyResolvedDepth; @@ -26,6 +29,7 @@ public CopyDepthPass(RenderPassEvent evt, Material copyDepthMaterial) { base.profilingSampler = new ProfilingSampler(nameof(CopyDepthPass)); AllocateRT = true; + CopyToDepth = false; m_CopyDepthMaterial = copyDepthMaterial; renderPassEvent = evt; m_CopyResolvedDepth = false; @@ -47,14 +51,25 @@ public void Setup(RenderTargetHandle source, RenderTargetHandle destination) public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { var descriptor = renderingData.cameraData.cameraTargetDescriptor; - descriptor.colorFormat = RenderTextureFormat.Depth; - descriptor.depthBufferBits = 32; //TODO: do we really need this. double check; + descriptor.graphicsFormat = GraphicsFormat.R32_SFloat; +#if UNITY_EDITOR + descriptor.depthBufferBits = 16; + +#else + descriptor.depthBufferBits = 0; + +#endif descriptor.msaaSamples = 1; if (this.AllocateRT) cmd.GetTemporaryRT(destination.id, descriptor, FilterMode.Point); + var target = new RenderTargetIdentifier(destination.Identifier(), 0, CubemapFace.Unknown, -1); +#if UNITY_EDITOR + ConfigureTarget(target, target, GraphicsFormat.R32_SFloat, descriptor.width, descriptor.height, descriptor.msaaSamples); +#else // On Metal iOS, prevent camera attachments to be bound and cleared during this pass. - ConfigureTarget(new RenderTargetIdentifier(destination.Identifier(), 0, CubemapFace.Unknown, -1), descriptor.depthStencilFormat, descriptor.width, descriptor.height, descriptor.msaaSamples, true); + ConfigureTarget(target, GraphicsFormat.R32_SFloat, descriptor.width, descriptor.height, descriptor.msaaSamples, false); +#endif ConfigureClear(ClearFlag.None, Color.black); } @@ -112,6 +127,11 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData break; } + if (CopyToDepth) + cmd.EnableShaderKeyword("_OUTPUT_DEPTH"); + else + cmd.DisableShaderKeyword("_OUTPUT_DEPTH"); + cmd.SetGlobalTexture("_CameraDepthAttachment", source.Identifier()); diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs index bdcb7f891a0..a78ddccedb9 100644 --- a/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs @@ -29,7 +29,7 @@ public override void Configure(CommandBuffer cmd, RenderTextureDescriptor camera RenderTargetIdentifier lightingAttachmentId = m_DeferredLights.GbufferAttachmentIdentifiers[m_DeferredLights.GBufferLightingIndex]; RenderTargetIdentifier depthAttachmentId = m_DeferredLights.DepthAttachmentIdentifier; if (m_DeferredLights.UseRenderPass) - ConfigureInputAttachments(m_DeferredLights.DeferredInputAttachments); + ConfigureInputAttachments(m_DeferredLights.DeferredInputAttachments, m_DeferredLights.DeferredInputIsTransient); // TODO: change to m_DeferredLights.GetGBufferFormat(m_DeferredLights.GBufferLightingIndex) when it's not GraphicsFormat.None // TODO: Cannot currently bind depth texture as read-only! diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs index 00b3a1aa512..a20015a5356 100644 --- a/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs @@ -31,6 +31,7 @@ public DepthOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, Lay base.profilingSampler = new ProfilingSampler(nameof(DepthOnlyPass)); m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask); renderPassEvent = evt; + useNativeRenderPass = false; } /// @@ -41,7 +42,8 @@ public void Setup( RenderTargetHandle depthAttachmentHandle) { this.depthAttachmentHandle = depthAttachmentHandle; - baseDescriptor.colorFormat = RenderTextureFormat.Depth; + baseDescriptor.graphicsFormat = GraphicsFormat.R32_SFloat; + // Even though this texture is going to be a color texture, we need depth buffer to correctly render it (ZTest and all) baseDescriptor.depthBufferBits = k_DepthBufferBits; // Depth-Only pass don't use MSAA @@ -61,16 +63,18 @@ public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderin // When depth priming is in use the camera target should not be overridden so the Camera's MSAA depth attachment is used. if (renderingData.cameraData.renderer.useDepthPriming && (renderingData.cameraData.renderType == CameraRenderType.Base || renderingData.cameraData.clearDepth)) { - ConfigureTarget(renderingData.cameraData.renderer.cameraDepthTarget, descriptor.depthStencilFormat, desc.width, desc.height, 1, true); + ConfigureTarget(renderingData.cameraData.renderer.cameraDepthTarget, desc.depthStencilFormat, desc.width, desc.height, 1, true); + // Only clear depth here so we don't clear any bound color target. It might be unused by this pass but that doesn't mean we can just clear it. (e.g. in case of overlay cameras + depth priming) + ConfigureClear(ClearFlag.Depth, Color.black); } // When not using depth priming the camera target should be set to our non MSAA depth target. else { - ConfigureTarget(new RenderTargetIdentifier(depthAttachmentHandle.Identifier(), 0, CubemapFace.Unknown, -1), descriptor.depthStencilFormat, desc.width, desc.height, 1, true); + useNativeRenderPass = true; + var target = new RenderTargetIdentifier(depthAttachmentHandle.Identifier(), 0, CubemapFace.Unknown, -1); + ConfigureTarget(target, target, GraphicsFormat.R32_SFloat, desc.width, desc.height, 1); + ConfigureClear(ClearFlag.All, Color.black); } - - // Only clear depth here so we don't clear any bound color target. It might be unused by this pass but that doesn't mean we can just clear it. (e.g. in case of overlay cameras + depth priming) - ConfigureClear(ClearFlag.Depth, Color.black); } /// diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs index 3b1f0cfb827..6dcd1926258 100644 --- a/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs @@ -109,7 +109,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData cameraTarget, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, - ClearFlag.None, + ClearFlag.Depth, Color.black); Camera camera = cameraData.camera; diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs index 9eb4cfd3649..7e9992d20a3 100644 --- a/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs @@ -57,6 +57,11 @@ public override void Configure(CommandBuffer cmd, RenderTextureDescriptor camera if (cmd != null) { + if (m_DeferredLights.UseRenderPass) + { + m_DeferredLights.GbufferAttachments[m_DeferredLights.GbufferDepthIndex] = m_DeferredLights.DepthCopyTexture; + m_DeferredLights.GbufferAttachmentIdentifiers[m_DeferredLights.GbufferDepthIndex] = m_DeferredLights.DepthCopyTextureIdentifier; + } // Create and declare the render targets used in the pass for (int i = 0; i < gbufferAttachments.Length; ++i) { @@ -70,14 +75,15 @@ public override void Configure(CommandBuffer cmd, RenderTextureDescriptor camera continue; // No need to setup temporaryRTs if we are using input attachments as they will be Memoryless - if (m_DeferredLights.UseRenderPass && i != m_DeferredLights.GBufferShadowMask && i != m_DeferredLights.GBufferRenderingLayers) + if (m_DeferredLights.UseRenderPass && i != m_DeferredLights.GBufferShadowMask && i != m_DeferredLights.GBufferRenderingLayers && (i != m_DeferredLights.GbufferDepthIndex && !m_DeferredLights.HasDepthPrepass)) continue; RenderTextureDescriptor gbufferSlice = cameraTextureDescriptor; gbufferSlice.depthBufferBits = 0; // make sure no depth surface is actually created gbufferSlice.stencilFormat = GraphicsFormat.None; gbufferSlice.graphicsFormat = m_DeferredLights.GetGBufferFormat(i); - cmd.GetTemporaryRT(m_DeferredLights.GbufferAttachments[i].id, gbufferSlice); + + cmd.GetTemporaryRT(m_DeferredLights.GbufferAttachments[i].id, gbufferSlice, FilterMode.Point); } } diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs index 26a0fb5649c..b18dcb6429a 100644 --- a/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs @@ -510,7 +510,7 @@ void Swap(ref ScriptableRenderer r) // Setup other effects constants SetupLensDistortion(m_Materials.uber, isSceneViewCamera); SetupChromaticAberration(m_Materials.uber); - SetupVignette(m_Materials.uber); + SetupVignette(m_Materials.uber, cameraData.xr); SetupColorGrading(cmd, ref renderingData, m_Materials.uber); // Only apply dithering & grain if there isn't a final pass. @@ -593,7 +593,7 @@ void Swap(ref ScriptableRenderer r) cameraData.renderer.ConfigureCameraTarget(cameraTarget, cameraTarget); cmd.SetViewProjectionMatrices(Matrix4x4.identity, Matrix4x4.identity); - if ((m_Destination == RenderTargetHandle.CameraTarget && !m_UseSwapBuffer) || m_ResolveToScreen) + if ((m_Destination == RenderTargetHandle.CameraTarget && !m_UseSwapBuffer) || (m_ResolveToScreen && m_UseSwapBuffer)) cmd.SetViewport(cameraData.pixelRect); cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, m_Materials.uber); @@ -1265,12 +1265,25 @@ void SetupChromaticAberration(Material material) #region Vignette - void SetupVignette(Material material) + void SetupVignette(Material material, XRPass xrPass) { var color = m_Vignette.color.value; var center = m_Vignette.center.value; var aspectRatio = m_Descriptor.width / (float)m_Descriptor.height; + +#if ENABLE_VR && ENABLE_XR_MODULE + if (xrPass != null && xrPass.enabled) + { + if (xrPass.singlePassEnabled) + material.SetVector(ShaderConstants._Vignette_ParamsXR, xrPass.ApplyXRViewCenterOffset(center)); + else + // In multi-pass mode we need to modify the eye center with the values from .xy of the corrected + // center since the version of the shader that is not single-pass will use the value in _Vignette_Params2 + center = xrPass.ApplyXRViewCenterOffset(center); + } +#endif + var v1 = new Vector4( color.r, color.g, color.b, m_Vignette.rounded.value ? aspectRatio : 1f @@ -1533,6 +1546,7 @@ static class ShaderConstants public static readonly int _Chroma_Params = Shader.PropertyToID("_Chroma_Params"); public static readonly int _Vignette_Params1 = Shader.PropertyToID("_Vignette_Params1"); public static readonly int _Vignette_Params2 = Shader.PropertyToID("_Vignette_Params2"); + public static readonly int _Vignette_ParamsXR = Shader.PropertyToID("_Vignette_ParamsXR"); public static readonly int _Lut_Params = Shader.PropertyToID("_Lut_Params"); public static readonly int _UserLut_Params = Shader.PropertyToID("_UserLut_Params"); public static readonly int _InternalLut = Shader.PropertyToID("_InternalLut"); diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceShadowResolvePass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceShadowResolvePass.cs deleted file mode 100644 index 89551e54246..00000000000 --- a/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceShadowResolvePass.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using UnityEngine.Experimental.Rendering; - -namespace UnityEngine.Rendering.Universal.Internal -{ - /// - /// Resolves shadows in a screen space texture. - /// - public class ScreenSpaceShadowResolvePass : ScriptableRenderPass - { - Material m_ScreenSpaceShadowsMaterial; - RenderTargetHandle m_ScreenSpaceShadowmap; - RenderTextureDescriptor m_RenderTextureDescriptor; - - public ScreenSpaceShadowResolvePass(RenderPassEvent evt, Material screenspaceShadowsMaterial) - { - base.profilingSampler = new ProfilingSampler(nameof(ScreenSpaceShadowResolvePass)); - - m_ScreenSpaceShadowsMaterial = screenspaceShadowsMaterial; - m_ScreenSpaceShadowmap.Init("_ScreenSpaceShadowmapTexture"); - renderPassEvent = evt; - } - - public void Setup(RenderTextureDescriptor baseDescriptor) - { - m_RenderTextureDescriptor = baseDescriptor; - m_RenderTextureDescriptor.depthBufferBits = 0; - m_RenderTextureDescriptor.msaaSamples = 1; - m_RenderTextureDescriptor.graphicsFormat = RenderingUtils.SupportsGraphicsFormat(GraphicsFormat.R8_UNorm, FormatUsage.Linear | FormatUsage.Render) - ? GraphicsFormat.R8_UNorm - : GraphicsFormat.B8G8R8A8_UNorm; - } - - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - cmd.GetTemporaryRT(m_ScreenSpaceShadowmap.id, m_RenderTextureDescriptor, FilterMode.Bilinear); - - RenderTargetIdentifier screenSpaceOcclusionTexture = m_ScreenSpaceShadowmap.Identifier(); - ConfigureTarget(screenSpaceOcclusionTexture); - ConfigureClear(ClearFlag.All, Color.white); - } - - /// - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - if (m_ScreenSpaceShadowsMaterial == null) - { - Debug.LogErrorFormat("Missing {0}. {1} render pass will not execute. Check for missing reference in the renderer resources.", m_ScreenSpaceShadowsMaterial, GetType().Name); - return; - } - - if (renderingData.lightData.mainLightIndex == -1) - return; - - Camera camera = renderingData.cameraData.camera; - - CommandBuffer cmd = CommandBufferPool.Get(); - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.ResolveShadows))) - { - if (!renderingData.cameraData.xr.enabled) - { - cmd.SetViewProjectionMatrices(Matrix4x4.identity, Matrix4x4.identity); - cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, m_ScreenSpaceShadowsMaterial); - cmd.SetViewProjectionMatrices(camera.worldToCameraMatrix, camera.projectionMatrix); - } - else - { - // Avoid setting and restoring camera view and projection matrices when in stereo. - RenderTargetIdentifier screenSpaceOcclusionTexture = m_ScreenSpaceShadowmap.Identifier(); - Blit(cmd, screenSpaceOcclusionTexture, screenSpaceOcclusionTexture, m_ScreenSpaceShadowsMaterial); - } - } - - context.ExecuteCommandBuffer(cmd); - CommandBufferPool.Release(cmd); - } - - /// - public override void OnCameraCleanup(CommandBuffer cmd) - { - if (cmd == null) - throw new ArgumentNullException("cmd"); - - cmd.ReleaseTemporaryRT(m_ScreenSpaceShadowmap.id); - } - } -} diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceShadowResolvePass.cs.meta b/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceShadowResolvePass.cs.meta deleted file mode 100644 index 1d89cb1e58c..00000000000 --- a/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceShadowResolvePass.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 129fea61da31162458736c967c9d98ae -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs index 2c2fd432499..2cd48776f3f 100644 --- a/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs @@ -227,6 +227,7 @@ public Color clearColor internal GraphicsFormat[] renderTargetFormat { get; set; } RenderTargetIdentifier[] m_ColorAttachments = new RenderTargetIdentifier[] { BuiltinRenderTextureType.CameraTarget }; internal RenderTargetIdentifier[] m_InputAttachments = new RenderTargetIdentifier[8]; + internal bool[] m_InputAttachmentIsTransient = new bool[8]; RenderTargetIdentifier m_DepthAttachment = BuiltinRenderTextureType.CameraTarget; ScriptableRenderPassInput m_Input = ScriptableRenderPassInput.None; ClearFlag m_ClearFlag = ClearFlag.None; @@ -245,6 +246,7 @@ public ScriptableRenderPass() renderPassEvent = RenderPassEvent.AfterRenderingOpaques; m_ColorAttachments = new RenderTargetIdentifier[] { BuiltinRenderTextureType.CameraTarget, 0, 0, 0, 0, 0, 0, 0 }; m_InputAttachments = new RenderTargetIdentifier[] { -1, -1, -1, -1, -1, -1, -1, -1 }; + m_InputAttachmentIsTransient = new bool[] { false, false, false, false, false, false, false, false }; m_DepthAttachment = BuiltinRenderTextureType.CameraTarget; m_ColorStoreActions = new RenderBufferStoreAction[] { RenderBufferStoreAction.Store, 0, 0, 0, 0, 0, 0, 0 }; m_DepthStoreAction = RenderBufferStoreAction.Store; @@ -314,9 +316,10 @@ public void ConfigureDepthStoreAction(RenderBufferStoreAction storeAction) m_OverriddenDepthStoreAction = true; } - internal void ConfigureInputAttachments(RenderTargetIdentifier input) + internal void ConfigureInputAttachments(RenderTargetIdentifier input, bool isTransient = false) { m_InputAttachments[0] = input; + m_InputAttachmentIsTransient[0] = isTransient; } internal void ConfigureInputAttachments(RenderTargetIdentifier[] inputs) @@ -324,6 +327,22 @@ internal void ConfigureInputAttachments(RenderTargetIdentifier[] inputs) m_InputAttachments = inputs; } + internal void ConfigureInputAttachments(RenderTargetIdentifier[] inputs, bool[] isTransient) + { + ConfigureInputAttachments(inputs); + m_InputAttachmentIsTransient = isTransient; + } + + internal void SetInputAttachmentTransient(int idx, bool isTransient) + { + m_InputAttachmentIsTransient[idx] = isTransient; + } + + internal bool IsInputAttachmentTransient(int idx) + { + return m_InputAttachmentIsTransient[idx]; + } + /// /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. /// This method should be called inside Configure. @@ -402,6 +421,12 @@ internal void ConfigureTarget(RenderTargetIdentifier colorAttachment, GraphicsFo renderTargetFormat[0] = format; } + internal void ConfigureTarget(RenderTargetIdentifier colorAttachment, RenderTargetIdentifier depthAttachment, GraphicsFormat format, int width, int height, int sampleCount) + { + m_DepthAttachment = depthAttachment; + ConfigureTarget(colorAttachment, format, width, height, sampleCount); + } + /// /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. /// This method should be called inside Configure. diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DecalRendererFeature.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DecalRendererFeature.cs index 7dd94364e29..2b6174b66a6 100644 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DecalRendererFeature.cs +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DecalRendererFeature.cs @@ -392,7 +392,10 @@ private void RecreateSystemsIfNeeded(ScriptableRenderer renderer, in CameraData m_ForwardEmissivePass = new DecalForwardEmissivePass(m_DecalDrawForwardEmissiveSystem); if (universalRenderer.actualRenderingMode == RenderingMode.Deferred) + { m_DBufferRenderPass.deferredLights = universalRenderer.deferredLights; + m_DBufferRenderPass.deferredLights.DisableFramebufferFetchInput(); + } break; } @@ -473,6 +476,8 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD new RenderTargetHandle(m_DBufferRenderPass.cameraDepthTextureIndentifier), new RenderTargetHandle(m_DBufferRenderPass.dBufferDepthIndentifier) ); + + m_CopyDepthPass.CopyToDepth = true; } m_CopyDepthPass.MssaSamples = 1; @@ -483,6 +488,11 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD } } + internal override bool SupportsNativeRenderPass() + { + return m_Technique == DecalTechnique.GBuffer || m_Technique == DecalTechnique.ScreenSpace; + } + protected override void Dispose(bool disposing) { CoreUtils.Destroy(m_CopyDepthMaterial); 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 03e7ad64d79..00000000000 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DrawFullscreenPass.cs +++ /dev/null @@ -1,149 +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); // 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 - && 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/ScriptableRenderer.cs b/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs index a69f7b6d9d2..a95dcb4bd33 100644 --- a/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs +++ b/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs @@ -495,9 +495,9 @@ internal static void ConfigureActiveTarget(RenderTargetIdentifier colorAttachmen public ScriptableRenderer(ScriptableRendererData data) { - if (Debug.isDebugBuild) - DebugHandler = new DebugHandler(data); - +#if DEVELOPMENT_BUILD || UNITY_EDITOR + DebugHandler = new DebugHandler(data); +#endif profilingExecute = new ProfilingSampler($"{nameof(ScriptableRenderer)}.{nameof(ScriptableRenderer.Execute)}: {data.name}"); foreach (var feature in data.rendererFeatures) @@ -610,7 +610,7 @@ public virtual void FinishRendering(CommandBuffer cmd) public void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { // Disable Gizmos when using scene overrides. Gizmos break some effects like Overdraw debug. - bool drawGizmos = UniversalRenderPipelineDebugDisplaySettings.Instance.RenderingSettings.debugSceneOverrideMode == DebugSceneOverrideMode.None; + bool drawGizmos = UniversalRenderPipelineDebugDisplaySettings.Instance.renderingSettings.sceneOverrideMode == DebugSceneOverrideMode.None; m_IsPipelineExecuting = true; ref CameraData cameraData = ref renderingData.cameraData; diff --git a/com.unity.render-pipelines.universal/Runtime/ShaderUtils.cs b/com.unity.render-pipelines.universal/Runtime/ShaderUtils.cs index c7cba826f4d..cb74612abb4 100644 --- a/com.unity.render-pipelines.universal/Runtime/ShaderUtils.cs +++ b/com.unity.render-pipelines.universal/Runtime/ShaderUtils.cs @@ -33,7 +33,7 @@ public static class ShaderUtils "Universal Render Pipeline/Baked Lit", "Universal Render Pipeline/Nature/SpeedTree7", "Universal Render Pipeline/Nature/SpeedTree7 Billboard", - "Universal Render Pipeline/Nature/SpeedTree8", + "Universal Render Pipeline/Nature/SpeedTree8_PBRLit", }; public static string GetShaderPath(ShaderPathID id) @@ -71,7 +71,7 @@ public static bool IsLWShader(Shader shader) "0ca6dca7396eb48e5849247ffd444914", "0f4122b9a743b744abe2fb6a0a88868b", "5ec81c81908db34429b4f6ddecadd3bd", - "99134b1f0c27d54469a840832a28fadf", + "9920c1f1781549a46ba081a2a15a16ec", }; /// diff --git a/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalCameraData.cs b/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalCameraData.cs index cedebad9c04..f0546ef80ac 100644 --- a/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalCameraData.cs +++ b/com.unity.render-pipelines.universal/Runtime/UniversalAdditionalCameraData.cs @@ -17,6 +17,7 @@ public enum CameraOverrideOption { Off, On, + [InspectorName("Use settings from Render Pipeline Asset")] UsePipelineSettings, } diff --git a/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs b/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs index be5915726cf..80e93fb0f5d 100644 --- a/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs +++ b/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs @@ -255,6 +255,11 @@ protected override void Render(ScriptableRenderContext renderContext, Camera[] c } #endif +#if DEVELOPMENT_BUILD || UNITY_EDITOR + if (DebugManager.instance.isAnyDebugUIActive) + UniversalRenderPipelineDebugDisplaySettings.Instance.UpdateFrameTiming(); +#endif + SortCameras(cameras); #if UNITY_2021_1_OR_NEWER for (int i = 0; i < cameras.Count; ++i) @@ -396,10 +401,11 @@ static void RenderSingleCamera(ScriptableRenderContext context, CameraData camer #if UNITY_EDITOR // Emit scene view UI if (isSceneViewCamera) - { ScriptableRenderContext.EmitWorldGeometryForSceneView(camera); - } + else #endif + if (cameraData.camera.targetTexture != null && cameraData.cameraType != CameraType.Preview) + ScriptableRenderContext.EmitGeometryForCamera(camera); var cullResults = context.Cull(ref cullingParameters); InitializeRenderingData(asset, ref cameraData, ref cullResults, anyPostProcessingEnabled, out var renderingData); @@ -1234,7 +1240,7 @@ static void CheckAndApplyDebugSettings(ref RenderingData renderingData) if (debugDisplaySettings.AreAnySettingsActive && !cameraData.isPreviewCamera) { - DebugDisplaySettingsRendering renderingSettings = debugDisplaySettings.RenderingSettings; + DebugDisplaySettingsRendering renderingSettings = debugDisplaySettings.renderingSettings; int msaaSamples = cameraData.cameraTargetDescriptor.msaaSamples; if (!renderingSettings.enableMsaa) 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 } diff --git a/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs b/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs index e55c91b7d64..95a553ad5f0 100644 --- a/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs +++ b/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs @@ -712,7 +712,9 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re } // If a depth texture was created we necessarily need to copy it, otherwise we could have render it to a renderbuffer. - if (requiresDepthCopyPass) + // Also skip if Deferred+RenderPass as CameraDepthTexture is used and filled by the GBufferPass + // however we might need the depth texture with Forward-only pass rendered to it, so enable the copy depth in that case + if (requiresDepthCopyPass && !(this.actualRenderingMode == RenderingMode.Deferred && useRenderPassEnabled && !renderPassInputs.requiresDepthTexture)) { m_CopyDepthPass.Setup(m_ActiveCameraDepthAttachment, m_DepthTexture); @@ -842,6 +844,7 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re if (!depthTargetResolved && cameraData.xr.copyDepth) { m_XRCopyDepthPass.Setup(m_ActiveCameraDepthAttachment, RenderTargetHandle.GetCameraTarget(cameraData.xr)); + m_XRCopyDepthPass.CopyToDepth = true; EnqueuePass(m_XRCopyDepthPass); } } @@ -855,11 +858,11 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re } #if UNITY_EDITOR - if (isSceneViewCamera || isGizmosEnabled) + if (isSceneViewCamera || (isGizmosEnabled && lastCameraInTheStack)) { // Scene view camera should always resolve target (not stacked) - Assertions.Assert.IsTrue(lastCameraInTheStack, "Editor camera must resolve target upon finish rendering."); m_FinalDepthCopyPass.Setup(m_DepthTexture, RenderTargetHandle.CameraTarget); + m_FinalDepthCopyPass.CopyToDepth = true; m_FinalDepthCopyPass.MssaSamples = 0; EnqueuePass(m_FinalDepthCopyPass); } diff --git a/com.unity.render-pipelines.universal/Runtime/VFXGraph/Shaders/VFXDefines.hlsl b/com.unity.render-pipelines.universal/Runtime/VFXGraph/Shaders/VFXDefines.hlsl index 14ff9418069..c2677e2e8c7 100644 --- a/com.unity.render-pipelines.universal/Runtime/VFXGraph/Shaders/VFXDefines.hlsl +++ b/com.unity.render-pipelines.universal/Runtime/VFXGraph/Shaders/VFXDefines.hlsl @@ -3,6 +3,14 @@ #define USE_FOG 1 #endif +#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) +#define CameraBuffer Texture2DArray +#define VFXSamplerCameraBuffer VFXSampler2DArray +#else +#define CameraBuffer Texture2D +#define VFXSamplerCameraBuffer VFXSampler2D +#endif + // this is only necessary for the old VFXTarget pathway // it defines the macro used to access hybrid instanced properties // (new HDRP/URP Target pathway overrides the type so this is never used) diff --git a/com.unity.render-pipelines.universal/Runtime/XR/XRPass.cs b/com.unity.render-pipelines.universal/Runtime/XR/XRPass.cs index 2fcdb1f0ee7..0cb049c1520 100644 --- a/com.unity.render-pipelines.universal/Runtime/XR/XRPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/XR/XRPass.cs @@ -38,6 +38,7 @@ internal struct XRView internal readonly Rect viewport; internal readonly Mesh occlusionMesh; internal readonly int textureArraySlice; + internal readonly Vector2 eyeCenterUV; internal XRView(Matrix4x4 proj, Matrix4x4 view, Rect vp, int dstSlice) { @@ -46,6 +47,8 @@ internal XRView(Matrix4x4 proj, Matrix4x4 view, Rect vp, int dstSlice) viewport = vp; occlusionMesh = null; textureArraySlice = dstSlice; + + eyeCenterUV = ComputeEyeCenterUV(proj); } internal XRView(XRDisplaySubsystem.XRRenderPass renderPass, XRDisplaySubsystem.XRRenderParameter renderParameter) @@ -61,6 +64,18 @@ internal XRView(XRDisplaySubsystem.XRRenderPass renderPass, XRDisplaySubsystem.X viewport.width *= renderPass.renderTargetDesc.width; viewport.y *= renderPass.renderTargetDesc.height; viewport.height *= renderPass.renderTargetDesc.height; + + eyeCenterUV = ComputeEyeCenterUV(projMatrix); + } + + private static Vector2 ComputeEyeCenterUV(Matrix4x4 proj) + { + var projectionParameters = proj.decomposeProjection; + float left = Math.Abs(projectionParameters.left); + float right = Math.Abs(projectionParameters.right); + float top = Math.Abs(projectionParameters.top); + float bottom = Math.Abs(projectionParameters.bottom); + return new Vector2(left / (right + left), top / (top + bottom)); } } @@ -436,6 +451,26 @@ internal void RenderOcclusionMesh(CommandBuffer cmd) } } + // Take a point that is center-relative (0.5, 0.5) and modify it to be placed relative to the view's center instead, + // respecting the asymmetric FOV (if it is used) + internal Vector4 ApplyXRViewCenterOffset(Vector2 center) + { + Vector4 result = Vector4.zero; + float centerDeltaX = 0.5f - center.x; + float centerDeltaY = 0.5f - center.y; + + result.x = views[0].eyeCenterUV.x - centerDeltaX; + result.y = views[0].eyeCenterUV.y - centerDeltaY; + if (singlePassEnabled) + { + // With single-pass XR, we need to add the data for the 2nd view + result.z = views[1].eyeCenterUV.x - centerDeltaX; + result.w = views[1].eyeCenterUV.y - centerDeltaY; + } + + return result; + } + // Store array to avoid allocating every frame private Matrix4x4[] stereoProjectionMatrix = new Matrix4x4[2]; private Matrix4x4[] stereoViewMatrix = new Matrix4x4[2]; diff --git a/com.unity.render-pipelines.universal/ShaderLibrary/GlobalIllumination.hlsl b/com.unity.render-pipelines.universal/ShaderLibrary/GlobalIllumination.hlsl index 62a65b668a9..a61f658dc82 100644 --- a/com.unity.render-pipelines.universal/ShaderLibrary/GlobalIllumination.hlsl +++ b/com.unity.render-pipelines.universal/ShaderLibrary/GlobalIllumination.hlsl @@ -220,11 +220,7 @@ half3 CalculateIrradianceFromReflectionProbes(half3 reflectVector, float3 positi half4 encodedIrradiance = half4(SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0, reflectVector, mip)); -#if defined(UNITY_USE_NATIVE_HDR) - irradiance += weightProbe0 * encodedIrradiance.rbg; -#else irradiance += weightProbe0 * DecodeHDREnvironment(encodedIrradiance, unity_SpecCube0_HDR); -#endif // UNITY_USE_NATIVE_HDR } // Sample the second reflection probe @@ -235,11 +231,11 @@ half3 CalculateIrradianceFromReflectionProbes(half3 reflectVector, float3 positi #endif // _REFLECTION_PROBE_BOX_PROJECTION half4 encodedIrradiance = half4(SAMPLE_TEXTURECUBE_LOD(unity_SpecCube1, samplerunity_SpecCube1, reflectVector, mip)); -#if defined(UNITY_USE_NATIVE_HDR) || defined(UNITY_DOTS_INSTANCING_ENABLED) +#if defined(UNITY_DOTS_INSTANCING_ENABLED) irradiance += weightProbe1 * encodedIrradiance.rbg; #else irradiance += weightProbe1 * DecodeHDREnvironment(encodedIrradiance, unity_SpecCube1_HDR); -#endif // UNITY_USE_NATIVE_HDR || UNITY_DOTS_INSTANCING_ENABLED +#endif // UNITY_DOTS_INSTANCING_ENABLED } // Use any remaining weight to blend to environment reflection cube map @@ -247,11 +243,11 @@ half3 CalculateIrradianceFromReflectionProbes(half3 reflectVector, float3 positi { half4 encodedIrradiance = half4(SAMPLE_TEXTURECUBE_LOD(_GlossyEnvironmentCubeMap, sampler_GlossyEnvironmentCubeMap, originalReflectVector, mip)); -#if defined(UNITY_USE_NATIVE_HDR) || defined(UNITY_DOTS_INSTANCING_ENABLED) +#if defined(UNITY_DOTS_INSTANCING_ENABLED) irradiance += (1.0f - totalWeight) * encodedIrradiance.rbg; #else irradiance += (1.0f - totalWeight) * DecodeHDREnvironment(encodedIrradiance, _GlossyEnvironmentCubeMap_HDR); -#endif // UNITY_USE_NATIVE_HDR || UNITY_DOTS_INSTANCING_ENABLED +#endif // UNITY_DOTS_INSTANCING_ENABLED } return irradiance; @@ -271,11 +267,7 @@ half3 GlossyEnvironmentReflection(half3 reflectVector, float3 positionWS, half p half mip = PerceptualRoughnessToMipmapLevel(perceptualRoughness); half4 encodedIrradiance = half4(SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0, reflectVector, mip)); -#if defined(UNITY_USE_NATIVE_HDR) - irradiance = encodedIrradiance.rgb; -#else irradiance = DecodeHDREnvironment(encodedIrradiance, unity_SpecCube0_HDR); -#endif // UNITY_USE_NATIVE_HDR #endif // _REFLECTION_PROBE_BLENDING return irradiance * occlusion; #else @@ -290,11 +282,7 @@ half3 GlossyEnvironmentReflection(half3 reflectVector, half perceptualRoughness, half mip = PerceptualRoughnessToMipmapLevel(perceptualRoughness); half4 encodedIrradiance = half4(SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0, reflectVector, mip)); -#if defined(UNITY_USE_NATIVE_HDR) - irradiance = encodedIrradiance.rgb; -#else irradiance = DecodeHDREnvironment(encodedIrradiance, unity_SpecCube0_HDR); -#endif // UNITY_USE_NATIVE_HDR return irradiance * occlusion; #else diff --git a/com.unity.render-pipelines.universal/Shaders/BakedLit.shader b/com.unity.render-pipelines.universal/Shaders/BakedLit.shader index 9cbef2157a8..7c1f1a1fb84 100644 --- a/com.unity.render-pipelines.universal/Shaders/BakedLit.shader +++ b/com.unity.render-pipelines.universal/Shaders/BakedLit.shader @@ -82,7 +82,7 @@ Shader "Universal Render Pipeline/Baked Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R HLSLPROGRAM #pragma exclude_renderers gles gles3 glcore @@ -280,7 +280,7 @@ Shader "Universal Render Pipeline/Baked Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R HLSLPROGRAM #pragma only_renderers gles gles3 glcore d3d11 diff --git a/com.unity.render-pipelines.universal/Shaders/ComplexLit.shader b/com.unity.render-pipelines.universal/Shaders/ComplexLit.shader index 7ebfcbf20e8..75d11157f9a 100644 --- a/com.unity.render-pipelines.universal/Shaders/ComplexLit.shader +++ b/com.unity.render-pipelines.universal/Shaders/ComplexLit.shader @@ -191,7 +191,7 @@ Shader "Universal Render Pipeline/Complex Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull[_Cull] HLSLPROGRAM @@ -420,7 +420,7 @@ Shader "Universal Render Pipeline/Complex Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull[_Cull] HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl b/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl index 7c00bd3d336..d7d12c64e5d 100644 --- a/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl +++ b/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl @@ -29,11 +29,11 @@ Varyings DepthOnlyVertex(Attributes input) return output; } -half4 DepthOnlyFragment(Varyings input) : SV_TARGET +half DepthOnlyFragment(Varyings input) : SV_TARGET { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); Alpha(SampleAlbedoAlpha(input.uv, TEXTURE2D_ARGS(_BaseMap, sampler_BaseMap)).a, _BaseColor, _Cutoff); - return 0; + return input.positionCS.z; } #endif diff --git a/com.unity.render-pipelines.universal/Shaders/Lit.shader b/com.unity.render-pipelines.universal/Shaders/Lit.shader index fb085b39a26..da4ea8dc5da 100644 --- a/com.unity.render-pipelines.universal/Shaders/Lit.shader +++ b/com.unity.render-pipelines.universal/Shaders/Lit.shader @@ -260,7 +260,7 @@ Shader "Universal Render Pipeline/Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull[_Cull] HLSLPROGRAM @@ -495,7 +495,7 @@ Shader "Universal Render Pipeline/Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull[_Cull] HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7.shader b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7.shader index b719ebe8896..a3a9e0164fc 100644 --- a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7.shader +++ b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7.shader @@ -168,7 +168,7 @@ Shader "Universal Render Pipeline/Nature/SpeedTree7" Name "DepthOnly" Tags{"LightMode" = "DepthOnly"} - ColorMask 0 + ColorMask R HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7Billboard.shader b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7Billboard.shader index a2a1e8ec143..349ad68e1a1 100644 --- a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7Billboard.shader +++ b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7Billboard.shader @@ -116,7 +116,7 @@ Shader "Universal Render Pipeline/Nature/SpeedTree7 Billboard" Name "DepthOnly" Tags{"LightMode" = "DepthOnly"} - ColorMask 0 + ColorMask R HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7CommonPasses.hlsl b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7CommonPasses.hlsl index 8d09d387219..24b06077f78 100644 --- a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7CommonPasses.hlsl +++ b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree7CommonPasses.hlsl @@ -243,7 +243,7 @@ half4 SpeedTree7FragDepth(SpeedTreeVertexDepthOutput input) : SV_Target // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly return half4(_ObjectId, _PassValue, 1.0, 1.0); #else - return half4(0, 0, 0, 0); + return half4(input.clipPos.z, 0, 0, 0); #endif } diff --git a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree8.shader b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree8.shader index 47c24003005..3e768e0b56b 100644 --- a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree8.shader +++ b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree8.shader @@ -197,7 +197,7 @@ Shader "Universal Render Pipeline/Nature/SpeedTree8" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree8Passes.hlsl b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree8Passes.hlsl index 20e664e417c..c80cf5372e2 100644 --- a/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree8Passes.hlsl +++ b/com.unity.render-pipelines.universal/Shaders/Nature/SpeedTree8Passes.hlsl @@ -512,7 +512,7 @@ half4 SpeedTree8FragDepth(SpeedTreeVertexDepthOutput input) : SV_Target // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly return half4(_ObjectId, _PassValue, 1.0, 1.0); #else - return half4(0, 0, 0, 0); + return half4(input.clipPos.z, 0, 0, 0); #endif } diff --git a/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesDepthOnlyPass.hlsl b/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesDepthOnlyPass.hlsl index 548e095990c..517e7414e4e 100644 --- a/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesDepthOnlyPass.hlsl +++ b/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesDepthOnlyPass.hlsl @@ -30,7 +30,7 @@ VaryingsDepthOnlyParticle DepthOnlyVertex(AttributesDepthOnlyParticle input) return output; } -half4 DepthOnlyFragment(VaryingsDepthOnlyParticle input) : SV_TARGET +half DepthOnlyFragment(VaryingsDepthOnlyParticle input) : SV_TARGET { UNITY_SETUP_INSTANCE_ID(input); UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); @@ -57,7 +57,7 @@ half4 DepthOnlyFragment(VaryingsDepthOnlyParticle input) : SV_TARGET AlphaDiscard(albedo.a, _Cutoff); #endif - return 0; + return input.clipPos.z; } #endif // UNIVERSAL_PARTICLES_LIT_DEPTH_ONLY_PASS_INCLUDED diff --git a/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLit.shader b/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLit.shader index 59dd8a3af5e..f5480d1bb5c 100644 --- a/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLit.shader +++ b/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLit.shader @@ -211,7 +211,7 @@ Shader "Universal Render Pipeline/Particles/Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull[_Cull] HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesSimpleLit.shader b/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesSimpleLit.shader index 756c1c10d03..5b59ab8c30d 100644 --- a/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesSimpleLit.shader +++ b/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesSimpleLit.shader @@ -204,7 +204,7 @@ Shader "Universal Render Pipeline/Particles/Simple Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull[_Cull] HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesUnlit.shader b/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesUnlit.shader index c43b3e776bd..aeb87df6ed8 100644 --- a/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesUnlit.shader +++ b/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesUnlit.shader @@ -115,7 +115,7 @@ Shader "Universal Render Pipeline/Particles/Unlit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull[_Cull] HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/PostProcessing/UberPost.shader b/com.unity.render-pipelines.universal/Shaders/PostProcessing/UberPost.shader index 1b52f04e263..11416a8aab5 100644 --- a/com.unity.render-pipelines.universal/Shaders/PostProcessing/UberPost.shader +++ b/com.unity.render-pipelines.universal/Shaders/PostProcessing/UberPost.shader @@ -46,6 +46,9 @@ Shader "Hidden/Universal Render Pipeline/UberPost" float _Chroma_Params; half4 _Vignette_Params1; float4 _Vignette_Params2; + #ifdef USING_STEREO_MATRICES + float4 _Vignette_ParamsXR; + #endif float2 _Grain_Params; float4 _Grain_TilingParams; float4 _Bloom_Texture_TexelSize; @@ -68,7 +71,12 @@ Shader "Hidden/Universal Render Pipeline/UberPost" #define LensDirtIntensity _LensDirt_Intensity.x #define VignetteColor _Vignette_Params1.xyz + #ifdef USING_STEREO_MATRICES + #define VignetteCenterEye0 _Vignette_ParamsXR.xy + #define VignetteCenterEye1 _Vignette_ParamsXR.zw + #else #define VignetteCenter _Vignette_Params2.xy + #endif #define VignetteIntensity _Vignette_Params2.z #define VignetteSmoothness _Vignette_Params2.w #define VignetteRoundness _Vignette_Params1.w @@ -191,6 +199,12 @@ Shader "Hidden/Universal Render Pipeline/UberPost" UNITY_BRANCH if (VignetteIntensity > 0) { + #ifdef USING_STEREO_MATRICES + // With XR, the views can use asymmetric FOV which will have the center of each + // view be at a different location. + const float2 VignetteCenter = unity_StereoEyeIndex == 0 ? VignetteCenterEye0 : VignetteCenterEye1; + #endif + color = ApplyVignette(color, uvDistorted, VignetteCenter, VignetteIntensity, VignetteRoundness, VignetteSmoothness, VignetteColor); } diff --git a/com.unity.render-pipelines.universal/Shaders/SimpleLit.shader b/com.unity.render-pipelines.universal/Shaders/SimpleLit.shader index 96f8516e45b..38f827ac723 100644 --- a/com.unity.render-pipelines.universal/Shaders/SimpleLit.shader +++ b/com.unity.render-pipelines.universal/Shaders/SimpleLit.shader @@ -214,7 +214,7 @@ Shader "Universal Render Pipeline/Simple Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull[_Cull] HLSLPROGRAM @@ -417,7 +417,7 @@ Shader "Universal Render Pipeline/Simple Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull[_Cull] HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainDetailLit.shader b/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainDetailLit.shader index 9c2d7d2f2b4..1bbfce5ef73 100644 --- a/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainDetailLit.shader +++ b/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainDetailLit.shader @@ -175,7 +175,7 @@ Shader "Hidden/TerrainEngine/Details/UniversalPipeline/Vertexlit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R HLSLPROGRAM #pragma target 2.0 diff --git a/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLit.shader b/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLit.shader index e7149778059..13186d2dac3 100644 --- a/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLit.shader +++ b/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLit.shader @@ -182,7 +182,7 @@ Shader "Universal Render Pipeline/Terrain/Lit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R HLSLPROGRAM #pragma target 2.0 diff --git a/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitBase.shader b/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitBase.shader index 4b8a96e510b..36a42ebc5df 100644 --- a/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitBase.shader +++ b/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitBase.shader @@ -152,7 +152,7 @@ Shader "Hidden/Universal Render Pipeline/Terrain/Lit (Base Pass)" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R HLSLPROGRAM #pragma target 2.0 diff --git a/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitPasses.hlsl b/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitPasses.hlsl index e581f71cfce..890fcf65cfe 100644 --- a/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitPasses.hlsl +++ b/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitPasses.hlsl @@ -507,7 +507,7 @@ half4 DepthOnlyFragment(VaryingsLean IN) : SV_TARGET // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly return half4(_ObjectId, _PassValue, 1.0, 1.0); #endif - return 0; + return IN.clipPos.z; } #endif diff --git a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrass.shader b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrass.shader index 4870e7f3206..00a26314eac 100644 --- a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrass.shader +++ b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrass.shader @@ -60,7 +60,7 @@ Shader "Hidden/TerrainEngine/Details/UniversalPipeline/WavingDoublePass" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull Off HLSLPROGRAM diff --git a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassBillboard.shader b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassBillboard.shader index 3a447789a35..cd032c73802 100644 --- a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassBillboard.shader +++ b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassBillboard.shader @@ -40,8 +40,9 @@ Shader "Hidden/TerrainEngine/Details/UniversalPipeline/BillboardWavingDoublePass // GPU Instancing #pragma multi_compile_instancing - #pragma vertex WavingGrassBillboardVert + #pragma vertex WavingGrassVert #pragma fragment LitPassFragmentGrass + #define _BILLBOARD_VERT #define _ALPHATEST_ON #include "Packages/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassInput.hlsl" @@ -55,7 +56,7 @@ Shader "Hidden/TerrainEngine/Details/UniversalPipeline/BillboardWavingDoublePass Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R Cull Off HLSLPROGRAM @@ -66,6 +67,7 @@ Shader "Hidden/TerrainEngine/Details/UniversalPipeline/BillboardWavingDoublePass // ------------------------------------- // Material Keywords + #define _BILLBOARD_VERT #define _ALPHATEST_ON #pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA @@ -78,10 +80,11 @@ Shader "Hidden/TerrainEngine/Details/UniversalPipeline/BillboardWavingDoublePass ENDHLSL } + // This pass is used when drawing to a _CameraNormalsTexture texture with the forward renderer or the depthNormal prepass with the deferred renderer. Pass { - Name "DepthNormals" - Tags{"LightMode" = "DepthNormals"} + Name "DepthNormalsOnly" + Tags{"LightMode" = "DepthNormalsOnly"} ZWrite On Cull Off @@ -94,9 +97,14 @@ Shader "Hidden/TerrainEngine/Details/UniversalPipeline/BillboardWavingDoublePass // ------------------------------------- // Material Keywords + #define _BILLBOARD_VERT #define _ALPHATEST_ON #pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA + // ------------------------------------- + // Unity defined keywords + #pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT // forward-only variant + //-------------------------------------- // GPU Instancing #pragma multi_compile_instancing diff --git a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassDepthNormalsPass.hlsl b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassDepthNormalsPass.hlsl index e94a38298cd..0a2f84acdc4 100644 --- a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassDepthNormalsPass.hlsl +++ b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassDepthNormalsPass.hlsl @@ -29,6 +29,10 @@ GrassVertexDepthNormalOutput DepthNormalOnlyVertex(GrassVertexDepthNormalInput v UNITY_TRANSFER_INSTANCE_ID(v, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); +#if defined(_BILLBOARD_VERT) + TerrainBillboardGrass(v.vertex, v.tangent.xy); +#endif + // MeshGrass v.color.a: 1 on top vertices, 0 on bottom vertices // _WaveAndDistance.z == 0 for MeshLit float waveAmount = v.color.a * _WaveAndDistance.z; diff --git a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassInput.hlsl b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassInput.hlsl index 5e3ec81d248..c4160b0bfe7 100644 --- a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassInput.hlsl +++ b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassInput.hlsl @@ -34,22 +34,23 @@ float4 _MainTex_MipInfo; // val: the 4 input values - each must be in the range (0 to 1) // s: The sine of each of the 4 values // c: The cosine of each of the 4 values -void FastSinCos (float4 val, out float4 s, out float4 c) { +void FastSinCos(float4 val, out float4 s, out float4 c) +{ val = val * 6.408849 - 3.1415927; - // powers for taylor series - float4 r5 = val * val; // wavevec ^ 2 - float4 r6 = r5 * r5; // wavevec ^ 4; - float4 r7 = r6 * r5; // wavevec ^ 6; - float4 r8 = r6 * r5; // wavevec ^ 8; - float4 r1 = r5 * val; // wavevec ^ 3 - float4 r2 = r1 * r5; // wavevec ^ 5; - float4 r3 = r2 * r5; // wavevec ^ 7; + // powers for taylor series + float4 r5 = val * val; // wavevec ^ 2 + float4 r6 = r5 * r5; // wavevec ^ 4; + float4 r7 = r6 * r5; // wavevec ^ 6; + float4 r8 = r6 * r5; // wavevec ^ 8; + float4 r1 = r5 * val; // wavevec ^ 3 + float4 r2 = r1 * r5; // wavevec ^ 5; + float4 r3 = r2 * r5; // wavevec ^ 7; //Vectors for taylor's series expansion of sin and cos - float4 sin7 = {1, -0.16161616, 0.0083333, -0.00019841}; - float4 cos8 = {-0.5, 0.041666666, -0.0013888889, 0.000024801587}; + float4 sin7 = {1.0, -0.16161616, 0.0083333, -0.00019841}; + float4 cos8 = {-0.5, 0.041666666, -0.0013888889, 0.000024801587}; // sin s = val + r1 * sin7.y + r2 * sin7.z + r3 * sin7.w; @@ -58,52 +59,51 @@ void FastSinCos (float4 val, out float4 s, out float4 c) { c = 1 + r5 * cos8.x + r6 * cos8.y + r7 * cos8.z + r8 * cos8.w; } -half4 TerrainWaveGrass (inout float4 vertex, float waveAmount, half4 color) +half4 TerrainWaveGrass(inout float4 vertex, float waveAmount, half4 color) { half4 _waveXSize = half4(0.012, 0.02, 0.06, 0.024) * _WaveAndDistance.y; - half4 _waveZSize = half4 (0.006, .02, 0.02, 0.05) * _WaveAndDistance.y; - half4 waveSpeed = half4 (1.2, 2, 1.6, 4.8); + half4 _waveZSize = half4(0.006, 0.02, 0.02, 0.05) * _WaveAndDistance.y; + half4 _waveSpeed = half4(1.2, 2.0, 1.6, 4.8); half4 _waveXmove = half4(0.024, 0.04, -0.12, 0.096); - half4 _waveZmove = half4 (0.006, .02, -0.02, 0.1); + half4 _waveZmove = half4(0.006, 0.02, -0.02, 0.1); float4 waves; - waves = vertex.x * _waveXSize; + waves = vertex.x * _waveXSize; waves += vertex.z * _waveZSize; // Add in time to model them over time - waves += _WaveAndDistance.x * waveSpeed; + waves += _WaveAndDistance.x * _waveSpeed; float4 s, c; - waves = frac (waves); - FastSinCos (waves, s,c); + waves = frac(waves); + FastSinCos(waves, s,c); s = s * s; - s = s * s; - half lighting = dot (s, normalize (half4 (1,1,.4,.2))) * 0.7; + half lighting = dot(s, normalize (half4(1.0, 1.0, 0.4, 0.2))) * 0.7; s = s * waveAmount; half3 waveMove = 0; - waveMove.x = dot (s, _waveXmove); - waveMove.z = dot (s, _waveZmove); + waveMove.x = dot(s, _waveXmove); + waveMove.z = dot(s, _waveZmove); vertex.xz -= waveMove.xz * _WaveAndDistance.z; // apply color animation - half3 waveColor = lerp (real3(0.5, 0.5, 0.5), _WavingTint.rgb, lighting); + half3 waveColor = lerp(real3(0.5, 0.5, 0.5), _WavingTint.rgb, lighting); // Fade the grass out before detail distance. // Saturate because Radeon HD drivers on OS X 10.4.10 don't saturate vertex colors properly. half3 offset = vertex.xyz - _CameraPosition.xyz; - color.a = saturate (2 * (_WaveAndDistance.w - dot (offset, offset)) * _CameraPosition.w); + color.a = saturate(2 * (_WaveAndDistance.w - dot (offset, offset)) * _CameraPosition.w); return half4(2 * waveColor * color.rgb, color.a); } -void TerrainBillboardGrass( inout float4 pos, float2 offset ) +void TerrainBillboardGrass(inout float4 pos, float2 offset) { float3 grasspos = pos.xyz - _CameraPosition.xyz; if (dot(grasspos, grasspos) > _WaveAndDistance.w) diff --git a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassPasses.hlsl b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassPasses.hlsl index 8ecf5cfa9ae..9a3855de574 100644 --- a/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassPasses.hlsl +++ b/com.unity.render-pipelines.universal/Shaders/Terrain/WavingGrassPasses.hlsl @@ -147,27 +147,14 @@ GrassVertexOutput WavingGrassVert(GrassVertexInput v) UNITY_TRANSFER_INSTANCE_ID(v, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); +#if defined(_BILLBOARD_VERT) + TerrainBillboardGrass(v.vertex, v.tangent.xy); +#endif + // MeshGrass v.color.a: 1 on top vertices, 0 on bottom vertices // _WaveAndDistance.z == 0 for MeshLit float waveAmount = v.color.a * _WaveAndDistance.z; - o.color = TerrainWaveGrass (v.vertex, waveAmount, v.color); - - InitializeVertData(v, o); - - return o; -} - -GrassVertexOutput WavingGrassBillboardVert(GrassVertexInput v) -{ - GrassVertexOutput o = (GrassVertexOutput)0; - UNITY_SETUP_INSTANCE_ID(v); - UNITY_TRANSFER_INSTANCE_ID(v, o); - UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); - - TerrainBillboardGrass (v.vertex, v.tangent.xy); - // wave amount defined by the grass height - float waveAmount = v.tangent.y; - o.color = TerrainWaveGrass (v.vertex, waveAmount, v.color); + o.color = TerrainWaveGrass(v.vertex, waveAmount, v.color); InitializeVertData(v, o); @@ -254,6 +241,10 @@ GrassVertexDepthOnlyOutput DepthOnlyVertex(GrassVertexDepthOnlyInput v) UNITY_TRANSFER_INSTANCE_ID(v, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); +#if defined(_BILLBOARD_VERT) + TerrainBillboardGrass(v.vertex, v.tangent.xy); +#endif + // MeshGrass v.color.a: 1 on top vertices, 0 on bottom vertices // _WaveAndDistance.z == 0 for MeshLit float waveAmount = v.color.a * _WaveAndDistance.z; @@ -267,6 +258,6 @@ GrassVertexDepthOnlyOutput DepthOnlyVertex(GrassVertexDepthOnlyInput v) half4 DepthOnlyFragment(GrassVertexDepthOnlyOutput input) : SV_TARGET { Alpha(SampleAlbedoAlpha(input.uv, TEXTURE2D_ARGS(_MainTex, sampler_MainTex)).a, input.color, _Cutoff); - return 0; + return input.clipPos.z; } #endif diff --git a/com.unity.render-pipelines.universal/Shaders/Unlit.shader b/com.unity.render-pipelines.universal/Shaders/Unlit.shader index 6913ce7d09c..2be70754509 100644 --- a/com.unity.render-pipelines.universal/Shaders/Unlit.shader +++ b/com.unity.render-pipelines.universal/Shaders/Unlit.shader @@ -69,7 +69,7 @@ Shader "Universal Render Pipeline/Unlit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R HLSLPROGRAM #pragma exclude_renderers gles gles3 glcore @@ -188,7 +188,7 @@ Shader "Universal Render Pipeline/Unlit" Tags{"LightMode" = "DepthOnly"} ZWrite On - ColorMask 0 + ColorMask R HLSLPROGRAM #pragma only_renderers gles gles3 glcore d3d11 diff --git a/com.unity.render-pipelines.universal/Shaders/Utils/CopyDepth.shader b/com.unity.render-pipelines.universal/Shaders/Utils/CopyDepth.shader index 89b7fe022ab..cb21d0b9e5f 100644 --- a/com.unity.render-pipelines.universal/Shaders/Utils/CopyDepth.shader +++ b/com.unity.render-pipelines.universal/Shaders/Utils/CopyDepth.shader @@ -7,7 +7,7 @@ Shader "Hidden/Universal Render Pipeline/CopyDepth" Pass { Name "CopyDepth" - ZTest Always ZWrite On ColorMask 0 + ZTest Always ZWrite On ColorMask R Cull Off HLSLPROGRAM @@ -16,6 +16,7 @@ Shader "Hidden/Universal Render Pipeline/CopyDepth" #pragma multi_compile _ _DEPTH_MSAA_2 _DEPTH_MSAA_4 _DEPTH_MSAA_8 #pragma multi_compile _ _USE_DRAW_PROCEDURAL + #pragma multi_compile _ _OUTPUT_DEPTH #include "Packages/com.unity.render-pipelines.universal/Shaders/Utils/CopyDepthPass.hlsl" diff --git a/com.unity.render-pipelines.universal/Shaders/Utils/CopyDepthPass.hlsl b/com.unity.render-pipelines.universal/Shaders/Utils/CopyDepthPass.hlsl index e2686609b08..b1beca642cf 100644 --- a/com.unity.render-pipelines.universal/Shaders/Utils/CopyDepthPass.hlsl +++ b/com.unity.render-pipelines.universal/Shaders/Utils/CopyDepthPass.hlsl @@ -106,7 +106,11 @@ float SampleDepth(float2 uv) #endif } +#if defined(_OUTPUT_DEPTH) float frag(Varyings input) : SV_Depth +#else +float frag(Varyings input) : SV_Target +#endif { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); return SampleDepth(input.uv); diff --git a/com.unity.render-pipelines.universal/Tests/Runtime/Light2DTests.cs b/com.unity.render-pipelines.universal/Tests/Runtime/Light2DTests.cs index 4b8915246a7..0a7750f23dd 100644 --- a/com.unity.render-pipelines.universal/Tests/Runtime/Light2DTests.cs +++ b/com.unity.render-pipelines.universal/Tests/Runtime/Light2DTests.cs @@ -110,6 +110,7 @@ public void CachedMeshDataIsUpdatedOnChange() light.lightType = Light2D.LightType.Freeform; light.SetShapePath(shapePath); + light.UpdateMesh(true); Assert.AreEqual(true, light.hasCachedMesh); } @@ -121,6 +122,7 @@ public void CachedMeshDataIsOverriddenByRuntimeChanges() var light = m_TestObjectCached.AddComponent(); light.lightType = Light2D.LightType.Freeform; light.SetShapePath(shapePath); + light.UpdateMesh(true); int vertexCount = 0, triangleCount = 0; @@ -132,6 +134,7 @@ public void CachedMeshDataIsOverriddenByRuntimeChanges() // Simulate Runtime Behavior. var shapePathChanged = new Vector3[5] { new Vector3(0, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 1, 0), new Vector3(0.5f, 1.5f, 0), new Vector3(0, 1, 0) }; light.SetShapePath(shapePathChanged); + light.UpdateMesh(true); // Check if Cached Data and the actual data are no longer the same. (We don't save cache on Runtime) Assert.AreNotEqual(vertexCount, light.lightMesh.triangles.Length); diff --git a/com.unity.render-pipelines.universal/ValidationExceptions.json b/com.unity.render-pipelines.universal/ValidationExceptions.json index b8b49664a36..8f7bf3e7fda 100644 --- a/com.unity.render-pipelines.universal/ValidationExceptions.json +++ b/com.unity.render-pipelines.universal/ValidationExceptions.json @@ -2,8 +2,8 @@ "Exceptions": [ { "ValidationTest": "Package Lifecycle Validation", - "ExceptionError": "Package com.unity.render-pipelines.universal@13.1.0 depends on package com.unity.burst@1.5.0 which is in an invalid track for release purposes. Release versions can only depend on Release versions.", - "PackageVersion": "13.1.0" + "ExceptionError": "Package com.unity.render-pipelines.universal@13.1.1 depends on package com.unity.burst@1.5.0 which is in an invalid track for release purposes. Release versions can only depend on Release versions.", + "PackageVersion": "13.1.1" } ] } diff --git a/com.unity.render-pipelines.universal/package.json b/com.unity.render-pipelines.universal/package.json index 815954cdd92..a1ea8fdd418 100644 --- a/com.unity.render-pipelines.universal/package.json +++ b/com.unity.render-pipelines.universal/package.json @@ -1,15 +1,14 @@ { "name": "com.unity.render-pipelines.universal", "description": "The Universal Render Pipeline (URP) is a prebuilt Scriptable Render Pipeline, made by Unity. URP provides artist-friendly workflows that let you quickly and easily create optimized graphics across a range of platforms, from mobile to high-end consoles and PCs.", - "version": "13.1.0", + "version": "13.1.1", "unity": "2022.1", - "unityRelease": "0a11", "displayName": "Universal RP", "dependencies": { "com.unity.mathematics": "1.2.1", "com.unity.burst": "1.5.0", - "com.unity.render-pipelines.core": "13.1.0", - "com.unity.shadergraph": "13.1.0" + "com.unity.render-pipelines.core": "13.1.1", + "com.unity.shadergraph": "13.1.1" }, "keywords": [ "graphics", From f90918b6553017d892e74a75db4e080db6e8199e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 26 Oct 2021 11:49:52 +0200 Subject: [PATCH 051/107] 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 3c13598c0e7ec8a61948a0a4b1fd0470b6556983 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 26 Oct 2021 12:38:51 +0200 Subject: [PATCH 052/107] Cleanup for HDRP PR --- com.unity.shadergraph/CHANGELOG.md | 35 +- .../Editor/Data/Graphs/ShaderKeyword.cs | 1 + .../Graphs/Texture2DArrayShaderProperty.cs | 5 - .../Editor/Data/Implementation/GraphObject.cs | 19 + .../Controllers/ShaderInputViewController.cs | 11 + .../ShaderInputPropertyDrawer.cs | 10 + .../Editor/Drawing/MaterialGraphEditWindow.cs | 17 + .../Editor/Drawing/PreviewManager.cs | 36 + .../Editor/Drawing/Views/GraphEditorView.cs | 2 +- .../Editor/Extensions/StencilExtensions.cs | 2 - .../Descriptors/StencilDescriptor.cs | 1 - .../Editor/Generation/Processors/Generator.cs | 12 +- .../Editor/Generation/SubTarget.cs | 1 - .../CreateFullscreenShaderGraph.cs | 25 - .../CreateFullscreenShaderGraph.cs.meta | 11 - .../Editor/ShaderGraph/BuiltInProperties.cs | 3 +- .../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 - .../BuiltIn/ShaderLibrary/Lighting.hlsl | 2 +- .../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 | 215 ----- .../CustomTextureNodes.cs.meta | 11 - .../CustomTextureSubShader.template | 89 -- .../CustomTextureSubShader.template.meta | 7 - .../CustomTextureSubTarget.cs | 56 -- .../CustomTextureSubTarget.cs.meta | 11 - .../CustomRenderTexture/ShaderGraphRef.asmref | 3 - .../ShaderGraphRef.asmref.meta | 7 - .../Editor/Generation/Targets/Fullscreen.meta | 8 - .../Targets/Fullscreen/FullscreenData.cs | 181 ----- .../Targets/Fullscreen/FullscreenData.cs.meta | 11 - .../Targets/Fullscreen/FullscreenMetaData.cs | 19 - .../Fullscreen/FullscreenMetaData.cs.meta | 11 - .../Targets/Fullscreen/FullscreenShaderGUI.cs | 240 ------ .../Fullscreen/FullscreenShaderGUI.cs.meta | 11 - .../Targets/Fullscreen/FullscreenSubTarget.cs | 759 ------------------ .../Fullscreen/FullscreenSubTarget.cs.meta | 11 - .../Targets/Fullscreen/Includes.meta | 8 - .../Includes/CustomRenderTexture.hlsl | 17 - .../Includes/CustomRenderTexture.hlsl.meta | 7 - .../Fullscreen/Includes/FullscreenBlit.hlsl | 17 - .../Includes/FullscreenBlit.hlsl.meta | 7 - .../Fullscreen/Includes/FullscreenCommon.hlsl | 121 --- .../Includes/FullscreenCommon.hlsl.meta | 7 - .../Includes/FullscreenDrawProcedural.hlsl | 17 - .../FullscreenDrawProcedural.hlsl.meta | 7 - .../Includes/FullscreenShaderPass.cs | 12 - .../Includes/FullscreenShaderPass.cs.hlsl | 14 - .../FullscreenShaderPass.cs.hlsl.meta | 7 - .../Includes/FullscreenShaderPass.cs.meta | 11 - .../Targets/Fullscreen/Templates.meta | 8 - .../Fullscreen/Templates/ShaderPass.template | 113 --- .../Templates/ShaderPass.template.meta | 7 - .../Templates/SharedCode.template.hlsl | 75 -- .../Templates/SharedCode.template.hlsl.meta | 7 - ...BuildVertexDescriptionInputs.template.hlsl | 2 +- .../ShaderGraphAssetPostProcessor.cs | 15 +- .../Editor/Importers/ShaderGraphImporter.cs | 6 + .../Importers/ShaderGraphImporterEditor.cs | 25 + .../Editor/Interface/IRequiresData.cs | 9 - .../Editor/Interface/IRequiresData.cs.meta | 11 - .../Nature/SpeedTree8Billboard.shadersubgraph | 47 +- .../SpeedTree8ColorAlpha.shadersubgraph | 61 +- com.unity.shadergraph/package.json | 5 +- 77 files changed, 270 insertions(+), 3045 deletions(-) delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs.meta 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 delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template.meta delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl delete mode 100644 com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl.meta delete mode 100644 com.unity.shadergraph/Editor/Interface/IRequiresData.cs delete mode 100644 com.unity.shadergraph/Editor/Interface/IRequiresData.cs.meta diff --git a/com.unity.shadergraph/CHANGELOG.md b/com.unity.shadergraph/CHANGELOG.md index 70873f65c1e..cbd7ce2f84b 100644 --- a/com.unity.shadergraph/CHANGELOG.md +++ b/com.unity.shadergraph/CHANGELOG.md @@ -4,29 +4,40 @@ All notable changes to this package are documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## [13.1.0] - 2021-09-24 +## [13.1.1] - 2021-10-04 ### Added - Adding ability to automatically cast Bools to Vector types in ShaderGraph [1359160] + - Added ShaderGraph import warning to old nodes and properties, and ability to dismiss the warning if old behavior is desired. + - Added normal transforms to the Transform node + - Added an automatically generated material subasset on ShaderGraphs. + +### Changed + - Changed the title suffix on old nodes and properties rom "Deprecated" to "Legacy". + +### Fixed + - Fixed Triplanar ShaderGraph node to handle arbitrary input and output coordinate spaces [1346477] (https://issuetracker.unity3d.com/issues/shader-graph-rotating-gameobject-get-material-stretched-when-using-triplanar-node) + - Fixed a bug that Parallax Mapping and Parallax Occlusion Mapping nodes don't use the same channel to sample heightmap by adding drop-downs for channel selecting to both of the nodes. [1347270] (https://fogbugz.unity3d.com/f/cases/1347270/) + - Fixed errors in the ShaderGraph Transform node [1368082] + - Fixed the Scene Depth node so it returns proper results in Eye space when using an orthographic camera [1311272] + - Fixed a bug where node preview doesn't update when a texture is changed in the explorer [1363784](https://issuetracker.unity3d.com/product/unity/issues/guid/1363784/) + - Fixed missing shader keyword stage during keyword copying. + - Fixed a ShaderGraph warning when connecting a node using Object Space BiTangent to the vertex stage [1361512] (https://issuetracker.unity3d.com/issues/shader-graph-cross-implicit-truncation-of-vector-type-errors-are-thrown-when-connecting-transform-node-to-vertex-block) + + +## [13.1.0] - 2021-09-24 ### Fixed - Fixed bug where an exception was thrown on undo operation after adding properties to a category [1348910] (https://fogbugz.unity3d.com/f/cases/1348910/) - Fixed the sticky-note editable title text size in shader graph not matching the set font size [1357657]. - Fixed unhandled exception when loading a subgraph with duplicate slots [1366200] (https://issuetracker.unity3d.com/product/unity/issues/guid/1366200/) - - Fixed Triplanar ShaderGraph node to handle arbitrary input and output coordinate spaces [1346477] (https://issuetracker.unity3d.com/issues/shader-graph-rotating-gameobject-get-material-stretched-when-using-triplanar-node) - - Fixed a bug that Parallax Mapping and Parallax Occlusion Mapping nodes don't use the same channel to sample heightmap by adding drop-downs for channel selecting to both of the nodes. [1347270] (https://fogbugz.unity3d.com/f/cases/1347270/) ## [13.0.0] - 2021-09-01 - -Version Updated -The version number for this package has increased due to a version update of a related graphics package. +### Changed +- Remove use of deprecated UNITY_USE_NATIVE_HDR keyword in shaders. ### Added - Adding control of anisotropic settings on inline Sampler state nodes in ShaderGraph. - - Added ShaderGraph import warning to old nodes and properties, and ability to dismiss the warning if old behavior is desired. - -### Changed - - Changed the title suffix on old nodes and properties rom "Deprecated" to "Legacy". ### Fixed - Fixed bug where it was not possible to switch to Graph Settings tab in Inspector if multiple nodes and an edge was selected [1357648] (https://fogbugz.unity3d.com/f/cases/1357648/) @@ -40,10 +51,9 @@ The version number for this package has increased due to a version update of a r - Fixed an issue where ShaderGraph "view shader" commands were opening in individual windows, and blocking Unity from closing [1367188] - Improved screenspace position accuracy in the fragment shader by using VPOS [1352662] (https://issuetracker.unity3d.com/issues/shadergraph-dither-node-results-in-artifacts-when-far-from-origin-caused-by-screen-position-breaking-down) - Fixed the node searcher results to prefer names over synonyms [1366058] - - Fixed the Scene Depth node so it returns proper results in Eye space when using an orthographic camera [1311272] + - Fixed the sticky-note editable title text size in shader graph not matching the set font size [1357657]. - Fixed how graph errors were displayed when variant limits were reached [1355815] - - Fixed errors in the ShaderGraph Transform node [1368082] ## [12.0.0] - 2021-01-11 @@ -78,7 +88,6 @@ The version number for this package has increased due to a version update of a r - Added visible errors for invalid stage capability connections to shader graph. - Added a ShaderGraph animated preview framerate throttle. - Added many node synonyms for the Create Node search so that it's easier to find nodes. - - Added normal transforms to the Transform node ### Changed - Properties and Keywords are no longer separated by type on the blackboard. Categories allow for any combination of properties and keywords to be grouped together as the user defines. diff --git a/com.unity.shadergraph/Editor/Data/Graphs/ShaderKeyword.cs b/com.unity.shadergraph/Editor/Data/Graphs/ShaderKeyword.cs index c1efb09737a..afa25a15ca0 100644 --- a/com.unity.shadergraph/Editor/Data/Graphs/ShaderKeyword.cs +++ b/com.unity.shadergraph/Editor/Data/Graphs/ShaderKeyword.cs @@ -196,6 +196,7 @@ internal override ShaderInput Copy() keywordDefinition = keywordDefinition, keywordScope = keywordScope, entries = entries, + keywordStages = keywordStages }; } 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 }; } } diff --git a/com.unity.shadergraph/Editor/Data/Implementation/GraphObject.cs b/com.unity.shadergraph/Editor/Data/Implementation/GraphObject.cs index df826594406..9fa1127b988 100644 --- a/com.unity.shadergraph/Editor/Data/Implementation/GraphObject.cs +++ b/com.unity.shadergraph/Editor/Data/Implementation/GraphObject.cs @@ -74,6 +74,23 @@ public GraphData graph } } + Material m_MaterialArtifact; + + /// + /// The Material artifact generated by the import process. + /// Every modification to this material will be lost when the graph is saved. + /// for. + /// + public Material materialArtifact + { + get + { + if (m_MaterialArtifact == null) + m_MaterialArtifact = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(AssetGuid)); + return m_MaterialArtifact; + } + } + // this value stores whether an undo operation has been registered (which indicates a change has been made to the graph) // and is used to trigger the MaterialGraphEditWindow to update it's title public bool isDirty @@ -85,6 +102,8 @@ public bool isDirty public virtual void RegisterCompleteObjectUndo(string actionName) { Undo.RegisterCompleteObjectUndo(this, actionName); + if (materialArtifact) + Undo.RecordObject(m_MaterialArtifact, actionName); m_SerializedVersion++; m_DeserializedVersion++; m_IsDirty = true; diff --git a/com.unity.shadergraph/Editor/Drawing/Controllers/ShaderInputViewController.cs b/com.unity.shadergraph/Editor/Drawing/Controllers/ShaderInputViewController.cs index e49add88ab9..f4c3ae4b49e 100644 --- a/com.unity.shadergraph/Editor/Drawing/Controllers/ShaderInputViewController.cs +++ b/com.unity.shadergraph/Editor/Drawing/Controllers/ShaderInputViewController.cs @@ -46,37 +46,48 @@ void ChangePropertyValue(GraphData graphData) AssertHelpers.IsNotNull(shaderInputReference, "ShaderPropertyReference is null while carrying out ChangePropertyValueAction"); // The Undos are currently handled in ShaderInputPropertyDrawer but we want to move that out from there and handle here //graphData.owner.RegisterCompleteObjectUndo("Change Property Value"); + var material = graphData.owner.materialArtifact; switch (shaderInputReference) { case BooleanShaderProperty booleanProperty: booleanProperty.value = ((ToggleData)newShaderInputValue).isOn; + if (material) material.SetFloat(shaderInputReference.referenceName, booleanProperty.value ? 1.0f : 0.0f); break; case Vector1ShaderProperty vector1Property: vector1Property.value = (float)newShaderInputValue; + if (material) material.SetFloat(shaderInputReference.referenceName, vector1Property.value); break; case Vector2ShaderProperty vector2Property: vector2Property.value = (Vector2)newShaderInputValue; + if (material) material.SetVector(shaderInputReference.referenceName, vector2Property.value); break; case Vector3ShaderProperty vector3Property: vector3Property.value = (Vector3)newShaderInputValue; + if (material) material.SetVector(shaderInputReference.referenceName, vector3Property.value); break; case Vector4ShaderProperty vector4Property: vector4Property.value = (Vector4)newShaderInputValue; + if (material) material.SetVector(shaderInputReference.referenceName, vector4Property.value); break; case ColorShaderProperty colorProperty: colorProperty.value = (Color)newShaderInputValue; + if (material) material.SetColor(shaderInputReference.referenceName, colorProperty.value); break; case Texture2DShaderProperty texture2DProperty: texture2DProperty.value.texture = (Texture)newShaderInputValue; + if (material) material.SetTexture(shaderInputReference.referenceName, texture2DProperty.value.texture); break; case Texture2DArrayShaderProperty texture2DArrayProperty: texture2DArrayProperty.value.textureArray = (Texture2DArray)newShaderInputValue; + if (material) material.SetTexture(shaderInputReference.referenceName, texture2DArrayProperty.value.textureArray); break; case Texture3DShaderProperty texture3DProperty: texture3DProperty.value.texture = (Texture3D)newShaderInputValue; + if (material) material.SetTexture(shaderInputReference.referenceName, texture3DProperty.value.texture); break; case CubemapShaderProperty cubemapProperty: cubemapProperty.value.cubemap = (Cubemap)newShaderInputValue; + if (material) material.SetTexture(shaderInputReference.referenceName, cubemapProperty.value.cubemap); break; case Matrix2ShaderProperty matrix2Property: matrix2Property.value = (Matrix4x4)newShaderInputValue; diff --git a/com.unity.shadergraph/Editor/Drawing/Inspector/PropertyDrawers/ShaderInputPropertyDrawer.cs b/com.unity.shadergraph/Editor/Drawing/Inspector/PropertyDrawers/ShaderInputPropertyDrawer.cs index 7c479f82847..9c879060f89 100644 --- a/com.unity.shadergraph/Editor/Drawing/Inspector/PropertyDrawers/ShaderInputPropertyDrawer.cs +++ b/com.unity.shadergraph/Editor/Drawing/Inspector/PropertyDrawers/ShaderInputPropertyDrawer.cs @@ -1327,6 +1327,11 @@ void BuildBooleanKeywordField(PropertySheet propertySheet, ShaderKeyword keyword { this._preChangeValueCallback("Change property value"); keyword.value = newValue.isOn ? 1 : 0; + if (graphData.owner.materialArtifact) + { + graphData.owner.materialArtifact.SetFloat(keyword.referenceName, keyword.value); + MaterialEditor.ApplyMaterialPropertyDrawers(graphData.owner.materialArtifact); + } this._postChangeValueCallback(false, ModificationScope.Graph); }, new ToggleData(keyword.value == 1), @@ -1345,6 +1350,11 @@ void BuildEnumKeywordField(PropertySheet propertySheet, ShaderKeyword keyword) { this._preChangeValueCallback("Change Keyword Value"); keyword.value = field.index; + if (graphData.owner.materialArtifact) + { + graphData.owner.materialArtifact.SetFloat(keyword.referenceName, field.index); + MaterialEditor.ApplyMaterialPropertyDrawers(graphData.owner.materialArtifact); + } this._postChangeValueCallback(false, ModificationScope.Graph); }); diff --git a/com.unity.shadergraph/Editor/Drawing/MaterialGraphEditWindow.cs b/com.unity.shadergraph/Editor/Drawing/MaterialGraphEditWindow.cs index 82d62c5a746..492983e580e 100644 --- a/com.unity.shadergraph/Editor/Drawing/MaterialGraphEditWindow.cs +++ b/com.unity.shadergraph/Editor/Drawing/MaterialGraphEditWindow.cs @@ -307,6 +307,15 @@ void Update() if (m_ChangedFileDependencyGUIDs.Count > 0 && graphObject != null && graphObject.graph != null) { bool reloadedSomething = false; + foreach (var guid in m_ChangedFileDependencyGUIDs) + { + if (AssetDatabase.GUIDToAssetPath(guid) != null) + { + // update preview for changed textures + graphEditorView?.previewManager?.ReloadChangedFiles(guid); + } + } + var subGraphNodes = graphObject.graph.GetNodes(); foreach (var subGraphNode in subGraphNodes) { @@ -516,6 +525,14 @@ void OnDestroy() Undo.ClearUndo(graphObject); } + // Discard any unsaved modification on the generated material + if (graphObject && graphObject.materialArtifact && EditorUtility.IsDirty(graphObject.materialArtifact)) + { + var material = new Material(AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(graphObject.AssetGuid))); + graphObject.materialArtifact.CopyPropertiesFromMaterial(material); + CoreUtils.Destroy(material); + } + graphObject = null; graphEditorView = null; diff --git a/com.unity.shadergraph/Editor/Drawing/PreviewManager.cs b/com.unity.shadergraph/Editor/Drawing/PreviewManager.cs index 8a1c39029c7..c413b8ee84a 100644 --- a/com.unity.shadergraph/Editor/Drawing/PreviewManager.cs +++ b/com.unity.shadergraph/Editor/Drawing/PreviewManager.cs @@ -43,6 +43,8 @@ class PreviewManager : IDisposable HashSet m_MasterNodeTempBlocks = new HashSet(); // temp blocks used by the most recent master node preview generation. + // used to detect when texture assets have been modified + HashSet m_PreviewTextureGUIDs = new HashSet(); PreviewSceneResources m_SceneResources; Texture2D m_ErrorTexture; Vector2? m_NewMasterPreviewSize; @@ -312,6 +314,16 @@ static void ForeachConnectedNode(AbstractMaterialNode node, PropagationDirection } } + public void ReloadChangedFiles(string ChangedFileDependencyGUIDs) + { + if (m_PreviewTextureGUIDs.Contains(ChangedFileDependencyGUIDs)) + { + // have to setup the textures on the MaterialPropertyBlock again + // easiest is to just mark everything as needing property update + m_NodesPropertyChanged.UnionWith(m_RenderDatas.Keys); + } + } + public void HandleGraphChanges() { foreach (var node in m_Graph.addedNodes) @@ -395,6 +407,30 @@ void CollectPreviewProperties(IEnumerable nodesToCollect, { previewProperty.SetValueOnMaterialPropertyBlock(m_SharedPreviewPropertyBlock); + // record guids for any texture properties + if ((previewProperty.propType >= PropertyType.Texture2D) && (previewProperty.propType <= PropertyType.Cubemap)) + { + + if (previewProperty.propType != PropertyType.Cubemap) + { + if (previewProperty.textureValue != null) + if (AssetDatabase.TryGetGUIDAndLocalFileIdentifier(previewProperty.textureValue, out string guid, out long localID)) + { + // Note, this never gets cleared, so we accumulate texture GUIDs over time, if the user keeps changing textures + m_PreviewTextureGUIDs.Add(guid); + } + } + else + { + if (previewProperty.cubemapValue != null) + if (AssetDatabase.TryGetGUIDAndLocalFileIdentifier(previewProperty.cubemapValue, out string guid, out long localID)) + { + // Note, this never gets cleared, so we accumulate texture GUIDs over time, if the user keeps changing textures + m_PreviewTextureGUIDs.Add(guid); + } + } + + } // virtual texture assignments must be pushed to the materials themselves (MaterialPropertyBlocks not supported) if ((previewProperty.propType == PropertyType.VirtualTexture) && (previewProperty.vtProperty?.value?.layers != null)) diff --git a/com.unity.shadergraph/Editor/Drawing/Views/GraphEditorView.cs b/com.unity.shadergraph/Editor/Drawing/Views/GraphEditorView.cs index a8fa60d8959..a4331f6e495 100644 --- a/com.unity.shadergraph/Editor/Drawing/Views/GraphEditorView.cs +++ b/com.unity.shadergraph/Editor/Drawing/Views/GraphEditorView.cs @@ -97,7 +97,7 @@ public MaterialGraphView graphView get { return m_GraphView; } } - PreviewManager previewManager + internal PreviewManager previewManager { get { return m_PreviewManager; } set { m_PreviewManager = value; } diff --git a/com.unity.shadergraph/Editor/Extensions/StencilExtensions.cs b/com.unity.shadergraph/Editor/Extensions/StencilExtensions.cs index 6b5b86ade5f..efb194a2f6c 100644 --- a/com.unity.shadergraph/Editor/Extensions/StencilExtensions.cs +++ b/com.unity.shadergraph/Editor/Extensions/StencilExtensions.cs @@ -15,8 +15,6 @@ 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 d54a3c15bf9..2e6e80c757b 100644 --- a/com.unity.shadergraph/Editor/Generation/Descriptors/StencilDescriptor.cs +++ b/com.unity.shadergraph/Editor/Generation/Descriptors/StencilDescriptor.cs @@ -3,7 +3,6 @@ namespace UnityEditor.ShaderGraph [GenerationAPI] internal struct StencilDescriptor { - public string ReadMask; public string WriteMask; public string Ref; public string Comp; diff --git a/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs b/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs index bfa38c22eb0..5463c4f8b64 100644 --- a/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs +++ b/com.unity.shadergraph/Editor/Generation/Processors/Generator.cs @@ -219,16 +219,18 @@ 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}\""); } - var customEditor = context.defaultShaderGUI; - if (customEditor != null) - m_Builder.AppendLine("CustomEditor \"" + customEditor + "\""); - else - m_Builder.AppendLine("CustomEditor \"" + typeof(GenericShaderGraphMaterialGUI).FullName + "\""); + m_Builder.AppendLine("CustomEditor \"" + typeof(GenericShaderGraphMaterialGUI).FullName + "\""); } m_Builder.AppendLine(@"FallBack ""Hidden/Shader Graph/FallbackError"""); diff --git a/com.unity.shadergraph/Editor/Generation/SubTarget.cs b/com.unity.shadergraph/Editor/Generation/SubTarget.cs index 47df99aa966..d7ee0739266 100644 --- a/com.unity.shadergraph/Editor/Generation/SubTarget.cs +++ b/com.unity.shadergraph/Editor/Generation/SubTarget.cs @@ -22,7 +22,6 @@ 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/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs deleted file mode 100644 index fa2d1bac838..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/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.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[] - { - BlockFields.SurfaceDescription.BaseColor, - BlockFields.SurfaceDescription.Alpha, - }; - - GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); - } - } -} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta deleted file mode 100644 index 1899ab157c3..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/AssetCallbacks/CreateFullscreenShaderGraph.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b21e44f5d6b2a2f41bda30a18a433533 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: 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 a5898a85bc5..92419fa78d2 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, bool generatePropertyBlock = true) + internal static void AddFloatProperty(this PropertyCollector collector, string referenceName, float defaultValue, HLSLDeclaration declarationType = HLSLDeclaration.DoNotDeclare) { collector.AddShaderProperty(new Vector1ShaderProperty { @@ -80,7 +80,6 @@ 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/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl deleted file mode 100644 index 4ef6e47bd2e..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 6603adc2824..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenBlit.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index eff46a4e977..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 69695c04ee7..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/FullscreenDrawProcedural.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -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 6786986f024..ee227802fed 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,10 +81,6 @@ 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; @@ -126,7 +122,6 @@ 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 @@ -252,7 +247,6 @@ 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 @@ -322,7 +316,6 @@ public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Acti registerUndo("Change Material"); m_ActiveSubTarget = m_SubTargets[m_SubTargetField.index]; - ProcessSubTargetDatas(m_ActiveSubTarget.value); onChange(); }); @@ -432,7 +425,6 @@ public bool TrySetActiveSubTarget(Type subTargetType) if (subTarget.GetType().Equals(subTargetType)) { m_ActiveSubTarget = subTarget; - ProcessSubTargetDatas(m_ActiveSubTarget); return true; } } @@ -440,62 +432,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(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 deleted file mode 100644 index 96298f38ad0..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs +++ /dev/null @@ -1,50 +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.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 deleted file mode 100644 index 6492eb439a4..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Targets/BuiltinFullscreenSubTarget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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/BuiltIn/ShaderLibrary/Lighting.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Lighting.hlsl index e5b153a4301..1a6eb564076 100644 --- a/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Lighting.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Lighting.hlsl @@ -647,7 +647,7 @@ half3 GlossyEnvironmentReflection(half3 reflectVector, half perceptualRoughness, half4 encodedIrradiance = SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0, reflectVector, mip); //TODO:DOTS - we need to port probes to live in c# so we can manage this manually. -#if defined(UNITY_USE_NATIVE_HDR) || defined(UNITY_DOTS_INSTANCING_ENABLED) +#if defined(UNITY_DOTS_INSTANCING_ENABLED) half3 irradiance = encodedIrradiance.rgb; #else half3 irradiance = DecodeHDREnvironment(encodedIrradiance, unity_SpecCube0_HDR); diff --git a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture.meta deleted file mode 100644 index 6fcda6fe46d..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture.meta +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index 8f9a429f0f8..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs +++ /dev/null @@ -1,24 +0,0 @@ -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 deleted file mode 100644 index 3f5277f5e28..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CreateCustomRenderTextureShaderGraph.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 4b0737e2d8c..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs +++ /dev/null @@ -1,247 +0,0 @@ -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 deleted file mode 100644 index b2178d23fff..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomRenderTextureTarget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index f091eb959a9..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl +++ /dev/null @@ -1,303 +0,0 @@ -// 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 deleted file mode 100644 index 6a2dc397e15..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTexture.hlsl.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 36981dd1bfc..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl +++ /dev/null @@ -1,40 +0,0 @@ -#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 deleted file mode 100644 index d4b4100c917..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureGraph.hlsl.meta +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 9006037f519..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs +++ /dev/null @@ -1,215 +0,0 @@ -using UnityEngine; -using UnityEditor.ShaderGraph; -using UnityEditor.Graphing; -using UnityEditor.ShaderGraph.Internal; - -namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph -{ - [Title("Custom Render Texture", "Size")] - [SubTargetFilter(typeof(CustomTextureSubTarget))] - 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 1.0"); - registry.builder.AppendLine("#define _CustomRenderTextureWidth 1.0"); - registry.builder.AppendLine("#define _CustomRenderTextureDepth 1.0"); - } - } - } - - [Title("Custom Render Texture", "Slice Index / Cubemap Face")] - [SubTargetFilter(typeof(CustomTextureSubTarget))] - 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 = "Slice Index / Cubemap Face"; - 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")] - [SubTargetFilter(typeof(CustomTextureSubTarget))] - - 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("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;"); - } - } - } - - [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/CustomTextureNodes.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs.meta deleted file mode 100644 index ae900600b2c..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureNodes.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 589abe64d1a..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template +++ /dev/null @@ -1,89 +0,0 @@ -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 Includes - $splice(GraphIncludes) - - // 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 deleted file mode 100644 index fed3124f382..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubShader.template.meta +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 76345338bd0..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs +++ /dev/null @@ -1,56 +0,0 @@ -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 deleted file mode 100644 index 763bcc9d552..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 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: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen.meta deleted file mode 100644 index 29be796022a..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b08719eeefb3f464f9c08fa512667b40 -folderAsset: yes -DefaultImporter: - 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 deleted file mode 100644 index ede3b7e30be..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs +++ /dev/null @@ -1,181 +0,0 @@ -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.Disabled; - 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 deleted file mode 100644 index 93ea57f7f22..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenData.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 96afacbe506..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using UnityEngine; -using UnityEditor.Rendering.BuiltIn; - -namespace UnityEditor.Rendering.Fullscreen.ShaderGraph -{ - [Serializable] - sealed class FullscreenMetaData : ScriptableObject - { - [SerializeField] - FullscreenMode m_FullscreenMode; - - public FullscreenMode fullscreenMode - { - get => m_FullscreenMode; - set => m_FullscreenMode = 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 deleted file mode 100644 index 900c66d7336..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenMetaData.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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/FullscreenShaderGUI.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs deleted file mode 100644 index f6ae849ad5f..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs +++ /dev/null @@ -1,240 +0,0 @@ -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(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); - 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(FullscreenUniforms.depthWriteProperty)) - m_MaterialEditor.ShaderProperty(depthWrite, Styles.depthWrite); - if (material.HasProperty(FullscreenUniforms.depthTestProperty)) - m_MaterialEditor.ShaderProperty(depthTest, Styles.depthTest); - - if (material.HasProperty(FullscreenUniforms.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) - { - if (!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 deleted file mode 100644 index 31e63d4a781..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenShaderGUI.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index d7c984fa359..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs +++ /dev/null @@ -1,759 +0,0 @@ -using UnityEditor.ShaderGraph; -using UnityEngine; -using System; -using UnityEditor.ShaderGraph.Internal; -using System.Linq; -using BlendMode = UnityEngine.Rendering.BlendMode; -using BlendOp = UnityEditor.ShaderGraph.BlendOp; -using UnityEngine.UIElements; -using UnityEditor.UIElements; -using UnityEngine.Rendering; - -namespace UnityEditor.Rendering.Fullscreen.ShaderGraph -{ - [GenerateBlocks("Fullscreen")] - 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); - } - - [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 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 - protected static readonly string kFullscreenCommon = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl"; - protected static readonly string kTemplatePath = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template"; - protected static readonly string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; - protected static readonly string kColor = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"; - protected static readonly string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"; - protected static readonly string kInstancing = "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"; - protected static readonly string kFullscreenShaderPass = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl"; - protected static readonly string kSpaceTransforms = "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"; - protected static readonly string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"; - protected static readonly string kTextureStack = "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"; - protected virtual string fullscreenDrawProceduralInclude => "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; - - 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); - context.SetDefaultShaderGUI(GetDefaultShaderGUI().FullName); - context.AddSubShader(GenerateSubShader()); - } - - protected virtual IncludeCollection pregraphIncludes => new IncludeCollection(); - protected abstract string pipelineTag { get; } - - protected virtual Type GetDefaultShaderGUI() => typeof(FullscreenShaderGUI); - - public virtual string identifier => GetType().Name; - public virtual ScriptableObject GetMetadataObject() - { - var bultInMetadata = ScriptableObject.CreateInstance(); - 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(CompareFunctionToZTest(fullscreenData.depthTestMode).ToString())); - result.Add(RenderState.ZWrite(fullscreenData.depthWrite ? ZWrite.On.ToString() : ZWrite.Off.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)); - } - - if (fullscreenData.enableStencil) - { - 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 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 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() - { - generatesPreview = true, - passes = new PassCollection(), - pipelineTag = pipelineTag, - }; - - result.passes.Add(GenerateFullscreenPass(FullscreenCompatibility.DrawProcedural)); - result.passes.Add(GenerateFullscreenPass(FullscreenCompatibility.Blit)); - - 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 - { kFullscreenShaderPass, IncludeLocation.Pregraph }, // For VR - { 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.texCoord1, - StructFields.Varyings.instanceID, - } - }; - - 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 - { - // 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[] - { - BlockFields.SurfaceDescription.BaseColor, - BlockFields.SurfaceDescription.Alpha, - 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.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 - }, - - // 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)}, - GetPassDefines(compatibility), - }, - keywords = GetPassKeywords(compatibility), - includes = new IncludeCollection - { - // Pre-graph - GetPreGraphIncludes(), - - // Post-graph - GetPostGraphIncludes(), - }, - }; - - switch (compatibility) - { - default: - case FullscreenCompatibility.Blit: - fullscreenPass.includes.Add(fullscreenBlitInclude, IncludeLocation.Postgraph); - break; - case FullscreenCompatibility.DrawProcedural: - fullscreenPass.includes.Add(fullscreenDrawProceduralInclude, IncludeLocation.Postgraph); - break; - } - - return fullscreenPass; - } - - // We don't need the save context / update materials for now - public override object saveContext => null; - - public FullscreenSubTarget() - { - displayName = "Fullscreen"; - } - - 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; - if (interfaces.Contains(typeof(IMayRequireVertexSkinning))) - allowed = false; - - return allowed; - } - - public override bool IsActive() => true; - - public override void GetFields(ref TargetFieldContext context) - { - context.AddField(UnityEditor.ShaderGraph.Fields.GraphPixel); - 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 || fullscreenData.depthTestMode != CompareFunction.Disabled); - } - - public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) - { - if (fullscreenData.allowMaterialOverride) - { - base.CollectShaderProperties(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) - { - 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); - } - - public void GetRenderStatePropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) - { - 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(); - }); - - if (fullscreenData.blendMode == FullscreenBlendMode.Custom) - { - context.globalIndentLevel++; - context.AddLabel("Color Blend Mode", 0); - - 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; - - 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; - - 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(); - }); - - } - } - - 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, - }); - } - - 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/FullscreenSubTarget.cs.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs.meta deleted file mode 100644 index 9e73e96aec6..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/FullscreenSubTarget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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/Includes.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes.meta deleted file mode 100644 index d54446ba6a3..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 67b87f1c65c508c429e1d957b33776b3 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl deleted file mode 100644 index 240e35c4d7b..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index 6f01210d18d..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/CustomRenderTexture.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 51687b19aeb..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl +++ /dev/null @@ -1,17 +0,0 @@ -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; -} - -FragOutput frag(PackedVaryings packedInput) -{ - return DefaultFullscreenFragmentShader(packedInput); -} 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 deleted file mode 100644 index b723e6b0d59..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenBlit.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c1931467a12255f489f3c72e4aa99ade -ShaderIncludeImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl deleted file mode 100644 index cf8b48c4f35..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl +++ /dev/null @@ -1,121 +0,0 @@ -// Provies missing variables for the FullScreen pass -#ifndef FULLSCREEN_COMMON_INCLUDED -#define FULLSCREEN_COMMON_INCLUDED - -struct FragOutput -{ - float4 color : SV_TARGET; -#ifdef DEPTH_WRITE - float depth : SV_DEPTH; -#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); - - 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 - output.texCoord1.xyz = GetWorldSpaceViewDir(p); -} - -float4 GetDrawProceduralVertexPosition(uint vertexID) -{ - return GetFullScreenTriangleVertexPosition(vertexID, UNITY_NEAR_CLIP_VALUE); -} - -float4 GetBlitVertexPosition(uint vertexID) -{ - float4 positionCS = GetQuadVertexPosition(vertexID); - positionCS.xy = positionCS.xy * 2 - 1; - return positionCS; -} - -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.rgb = surfaceDescription.BaseColor; - output.color.a = surfaceDescription.Alpha; -#ifdef DEPTH_WRITE - output.depth = surfaceDescription.FullscreenDepth; -#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 deleted file mode 100644 index 4ad2cc4d974..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenCommon.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index fa2ff9ab93f..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl +++ /dev/null @@ -1,17 +0,0 @@ -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; -} - -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 deleted file mode 100644 index 550351971fc..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenDrawProcedural.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: fa5319f2d61c4df44b77220af2406147 -ShaderIncludeImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs deleted file mode 100644 index 5e516d71d7f..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs +++ /dev/null @@ -1,12 +0,0 @@ -//----------------------------------------------------------------------------- -// structure definition -//----------------------------------------------------------------------------- -namespace UnityEngine.Rendering.HighDefinition -{ - [GenerateHLSL(PackingRules.Exact)] - enum FullscreenShaderPass - { - Blit, - DrawProcedural, - } -} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl deleted file mode 100644 index 3a2cce9b07d..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl +++ /dev/null @@ -1,14 +0,0 @@ -// -// This file was automatically generated. Please don't edit by hand. Execute Editor command [ Edit > 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 deleted file mode 100644 index 2cc5c6c56fc..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index c57335a26a5..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Includes/FullscreenShaderPass.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -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.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates.meta deleted file mode 100644 index 729c6c9354f..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c131f605e2f659045adf332f0f0f876f -folderAsset: yes -DefaultImporter: - 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 deleted file mode 100644 index 8c4fda36803..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template +++ /dev/null @@ -1,113 +0,0 @@ -Pass -{ - $splice(PassName) - -// Render State -$splice(RenderState) - -// Debug -$splice(Debug) - -// -------------------------------------------------- -// Pass - -HLSLPROGRAM - -// Pragmas -$splice(PassPragmas) -// #pragma enable_d3d11_debug_symbols - -$splice(DotsInstancingOptions) -$splice(HybridV1InjectedBuiltinProperties) - -// Keywords -$splice(PassKeywords) -$splice(GraphKeywords) - -#define FULLSCREEN_SHADERGRAPH - -// 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 - -// 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) - -// 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 deleted file mode 100644 index 6de4d479d90..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/ShaderPass.template.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 0ed3a57e16f0259448e5b68a210e991a -DefaultImporter: - 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 deleted file mode 100644 index 246dd3d15ee..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl +++ /dev/null @@ -1,75 +0,0 @@ -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 - - $SurfaceDescriptionInputs.WorldSpaceNormal: // must use interpolated tangent, bitangent and normal before they are normalized in the pixel shader. - $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 = (tangentWS.w > 0.0 ? 1.0 : -1.0)* GetOddNegativeScale(); - $SurfaceDescriptionInputs.WorldSpaceBiTangent: float3 bitang = crossSign * cross(normalWS.xyz, tangentWS.xyz); - - $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 * tangentWS.xyz; - $SurfaceDescriptionInputs.WorldSpaceBiTangent: output.WorldSpaceBiTangent = renormFactor * bitang; - - 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 camearDistance = linearDepth / dot(viewDirWS, cameraForward); - float3 positionWS = viewDirWS * camearDistance + GetCameraPositionWS(); - - $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(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 = 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(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(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; - $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 -#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; -} diff --git a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl.meta b/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl.meta deleted file mode 100644 index feddaf9fe66..00000000000 --- a/com.unity.shadergraph/Editor/Generation/Targets/Fullscreen/Templates/SharedCode.template.hlsl.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 16201fed0715efa48a8908fedb361bf0 -ShaderIncludeImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.shadergraph/Editor/Generation/Templates/BuildVertexDescriptionInputs.template.hlsl b/com.unity.shadergraph/Editor/Generation/Templates/BuildVertexDescriptionInputs.template.hlsl index a3079ddb7b3..cc19a3efdc8 100644 --- a/com.unity.shadergraph/Editor/Generation/Templates/BuildVertexDescriptionInputs.template.hlsl +++ b/com.unity.shadergraph/Editor/Generation/Templates/BuildVertexDescriptionInputs.template.hlsl @@ -11,7 +11,7 @@ VertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input) $VertexDescriptionInputs.WorldSpaceTangent: output.WorldSpaceTangent = TransformObjectToWorldDir(input.tangentOS.xyz); $VertexDescriptionInputs.ViewSpaceTangent: output.ViewSpaceTangent = TransformWorldToViewDir(output.WorldSpaceTangent); $VertexDescriptionInputs.TangentSpaceTangent: output.TangentSpaceTangent = float3(1.0f, 0.0f, 0.0f); - $VertexDescriptionInputs.ObjectSpaceBiTangent: output.ObjectSpaceBiTangent = normalize(cross(input.normalOS, input.tangentOS) * (input.tangentOS.w > 0.0f ? 1.0f : -1.0f) * GetOddNegativeScale()); + $VertexDescriptionInputs.ObjectSpaceBiTangent: output.ObjectSpaceBiTangent = normalize(cross(input.normalOS, input.tangentOS.xyz) * (input.tangentOS.w > 0.0f ? 1.0f : -1.0f) * GetOddNegativeScale()); $VertexDescriptionInputs.WorldSpaceBiTangent: output.WorldSpaceBiTangent = TransformObjectToWorldDir(output.ObjectSpaceBiTangent); $VertexDescriptionInputs.ViewSpaceBiTangent: output.ViewSpaceBiTangent = TransformWorldToViewDir(output.WorldSpaceBiTangent); $VertexDescriptionInputs.TangentSpaceBiTangent: output.TangentSpaceBiTangent = float3(0.0f, 1.0f, 0.0f); diff --git a/com.unity.shadergraph/Editor/Importers/ShaderGraphAssetPostProcessor.cs b/com.unity.shadergraph/Editor/Importers/ShaderGraphAssetPostProcessor.cs index 046582212c4..66045696e55 100644 --- a/com.unity.shadergraph/Editor/Importers/ShaderGraphAssetPostProcessor.cs +++ b/com.unity.shadergraph/Editor/Importers/ShaderGraphAssetPostProcessor.cs @@ -86,11 +86,20 @@ static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAsse window.CheckForChanges(); } } - // moved or imported subgraphs or HLSL files should notify open shadergraphs that they need to handle them var changedFileGUIDs = movedAssets.Concat(importedAssets).Concat(deletedAssets) - .Where(x => x.EndsWith(ShaderSubGraphImporter.Extension, StringComparison.InvariantCultureIgnoreCase) - || CustomFunctionNode.s_ValidExtensions.Contains(Path.GetExtension(x))) + .Where(x => + { + if (x.EndsWith(ShaderSubGraphImporter.Extension, StringComparison.InvariantCultureIgnoreCase) || CustomFunctionNode.s_ValidExtensions.Contains(Path.GetExtension(x))) + { + return true; + } + else + { + var asset = AssetDatabase.GetMainAssetTypeAtPath(x); + return asset is null || asset.IsSubclassOf(typeof(Texture)); + } + }) .Select(AssetDatabase.AssetPathToGUID) .Distinct() .ToList(); diff --git a/com.unity.shadergraph/Editor/Importers/ShaderGraphImporter.cs b/com.unity.shadergraph/Editor/Importers/ShaderGraphImporter.cs index b0a361c9c6f..7947e808447 100644 --- a/com.unity.shadergraph/Editor/Importers/ShaderGraphImporter.cs +++ b/com.unity.shadergraph/Editor/Importers/ShaderGraphImporter.cs @@ -197,6 +197,12 @@ public override void OnImportAsset(AssetImportContext ctx) } #endif + if (shader != null) + { + Material material = new Material(shader) { name = Path.GetFileNameWithoutExtension(path) + " Material" }; + ctx.AddObjectToAsset("Material", material); + } + Texture2D texture = Resources.Load("Icons/sg_graph_icon"); ctx.AddObjectToAsset("MainAsset", mainObject, texture); ctx.SetMainObject(mainObject); diff --git a/com.unity.shadergraph/Editor/Importers/ShaderGraphImporterEditor.cs b/com.unity.shadergraph/Editor/Importers/ShaderGraphImporterEditor.cs index 1b243fc650b..c7114c1d52e 100644 --- a/com.unity.shadergraph/Editor/Importers/ShaderGraphImporterEditor.cs +++ b/com.unity.shadergraph/Editor/Importers/ShaderGraphImporterEditor.cs @@ -18,6 +18,7 @@ namespace UnityEditor.ShaderGraph class ShaderGraphImporterEditor : ScriptedImporterEditor { protected override bool needsApplyRevert => false; + MaterialEditor materialEditor = null; public override void OnInspectorGUI() { @@ -115,6 +116,30 @@ GraphData GetGraphData(AssetImporter importer) } ApplyRevertGUI(); + + if (materialEditor) + { + EditorGUILayout.Space(); + materialEditor.DrawHeader(); + using (new EditorGUI.DisabledGroupScope(true)) + materialEditor.OnInspectorGUI(); + } + } + + public override void OnEnable() + { + base.OnEnable(); + AssetImporter importer = target as AssetImporter; + var material = AssetDatabase.LoadAssetAtPath(importer.assetPath); + if (material) + materialEditor = (MaterialEditor)CreateEditor(material); + } + + public override void OnDisable() + { + base.OnDisable(); + if (materialEditor != null) + DestroyImmediate(materialEditor); } internal static bool ShowGraphEditWindow(string path) diff --git a/com.unity.shadergraph/Editor/Interface/IRequiresData.cs b/com.unity.shadergraph/Editor/Interface/IRequiresData.cs deleted file mode 100644 index b42a554ae7e..00000000000 --- a/com.unity.shadergraph/Editor/Interface/IRequiresData.cs +++ /dev/null @@ -1,9 +0,0 @@ -using UnityEditor.ShaderGraph.Serialization; - -namespace UnityEditor.ShaderGraph -{ - interface IRequiresData where T : JsonObject - { - T data { get; set; } - } -} diff --git a/com.unity.shadergraph/Editor/Interface/IRequiresData.cs.meta b/com.unity.shadergraph/Editor/Interface/IRequiresData.cs.meta deleted file mode 100644 index 0fb7e9a32ac..00000000000 --- a/com.unity.shadergraph/Editor/Interface/IRequiresData.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0d47693329d2b0048b119eea3e618040 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.shadergraph/ShaderGraphLibrary/Nature/SpeedTree8Billboard.shadersubgraph b/com.unity.shadergraph/ShaderGraphLibrary/Nature/SpeedTree8Billboard.shadersubgraph index 032dbfe3a22..ad67008d27e 100644 --- a/com.unity.shadergraph/ShaderGraphLibrary/Nature/SpeedTree8Billboard.shadersubgraph +++ b/com.unity.shadergraph/ShaderGraphLibrary/Nature/SpeedTree8Billboard.shadersubgraph @@ -17,7 +17,12 @@ } ], "m_Keywords": [], - "m_CategoryData": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "081705fd59894b1e9b0f80f52ba23cdf" + } + ], "m_Nodes": [ { "m_Id": "97529629eeb67083922a3aa87bf21b66" @@ -1069,7 +1074,8 @@ "serializedMesh": { "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", "m_Guid": "" - } + }, + "preventRotation": false }, "m_Path": "SpeedTree", "m_GraphPrecision": 0, @@ -1117,6 +1123,8 @@ "m_DefaultReferenceName": "Vector1_2E103E32", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -1218,6 +1226,27 @@ } } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "081705fd59894b1e9b0f80f52ba23cdf", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "cc88b4710cbfeb8ea3bb7bf9a07fbc12" + }, + { + "m_Id": "25c34ca0a45daf8e8b1042f8ec1a30bb" + }, + { + "m_Id": "038009d79142698bb76607e0466409a7" + }, + { + "m_Id": "140e9fdcda3d1a82ad9a7337e1d5c8ec" + } + ] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", @@ -1522,7 +1551,7 @@ "m_SlotType": 0, "m_Hidden": false, "m_ShaderOutputName": "NormalTangentSpace", - "m_StageCapability": 2, + "m_StageCapability": 3, "m_Value": { "x": 0.0, "y": 0.0, @@ -1645,6 +1674,8 @@ "m_DefaultReferenceName": "Boolean_1A7045BA", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -2154,6 +2185,8 @@ "m_DefaultReferenceName": "Vector3_F863C863", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -2562,7 +2595,7 @@ } { - "m_SGVersion": 0, + "m_SGVersion": 1, "m_Type": "UnityEditor.ShaderGraph.TransformNode", "m_ObjectId": "3a5f67d6e979e88c908d521e864c0a7e", "m_Group": { @@ -3301,7 +3334,7 @@ "m_SlotType": 0, "m_Hidden": false, "m_ShaderOutputName": "NormalWorldSpace", - "m_StageCapability": 2, + "m_StageCapability": 3, "m_Value": { "x": 0.0, "y": 0.0, @@ -3884,7 +3917,7 @@ } { - "m_SGVersion": 0, + "m_SGVersion": 1, "m_Type": "UnityEditor.ShaderGraph.TransformNode", "m_ObjectId": "77d1caddbcfb888d91c90ef23934b7d7", "m_Group": { @@ -5673,6 +5706,8 @@ "m_DefaultReferenceName": "Vector1_B7478AA2", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, diff --git a/com.unity.shadergraph/ShaderGraphLibrary/Nature/SpeedTree8ColorAlpha.shadersubgraph b/com.unity.shadergraph/ShaderGraphLibrary/Nature/SpeedTree8ColorAlpha.shadersubgraph index 7640bc75c47..18a79cc808b 100644 --- a/com.unity.shadergraph/ShaderGraphLibrary/Nature/SpeedTree8ColorAlpha.shadersubgraph +++ b/com.unity.shadergraph/ShaderGraphLibrary/Nature/SpeedTree8ColorAlpha.shadersubgraph @@ -26,7 +26,12 @@ } ], "m_Keywords": [], - "m_CategoryData": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "41610b9c955045e4985b2a7a3c250128" + } + ], "m_Nodes": [ { "m_Id": "a7cc8110386a4246aca9cd7d92f4547b" @@ -1036,7 +1041,8 @@ "serializedMesh": { "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", "m_Guid": "" - } + }, + "preventRotation": false }, "m_Path": "SpeedTree", "m_GraphPrecision": 1, @@ -1154,6 +1160,8 @@ "m_DefaultReferenceName": "Use_Old_Hue_Variation_Behavior", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -1431,7 +1439,7 @@ } { - "m_SGVersion": 0, + "m_SGVersion": 1, "m_Type": "UnityEditor.ShaderGraph.TransformNode", "m_ObjectId": "16910a20060c43f889cace1d074fd2ca", "m_Group": { @@ -1766,6 +1774,8 @@ "m_DefaultReferenceName": "Hue_Variation_Color", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -2075,6 +2085,8 @@ "m_DefaultReferenceName": "Enable_Hue_Variation", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -2237,6 +2249,36 @@ } } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "41610b9c955045e4985b2a7a3c250128", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "c107c2c9d7004f2995cfb371ea5b9db8" + }, + { + "m_Id": "57f38263249544e3a8912cfa07ee9ec1" + }, + { + "m_Id": "36feafe2c1ab4fd89b8933f1368493ae" + }, + { + "m_Id": "206346d0fe4b4f2f85011c7e43dbaa9c" + }, + { + "m_Id": "068628585360489693fabc221e160d34" + }, + { + "m_Id": "be4498ae834e45b880f9a673b5a1c985" + }, + { + "m_Id": "836bcfd67ee943c3879453a549013794" + } + ] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", @@ -2686,6 +2728,8 @@ "m_DefaultReferenceName": "Color_Tint", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -3464,6 +3508,8 @@ "m_DefaultReferenceName": "Crossfade", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -4534,6 +4580,8 @@ "m_DefaultReferenceName": "Is_Billboard", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -4665,6 +4713,8 @@ "m_DefaultReferenceName": "Base_Map", "m_OverrideReferenceName": "", "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", "m_Precision": 0, "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, @@ -4673,6 +4723,8 @@ "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", "m_Guid": "" }, + "isMainTexture": false, + "useTilingAndOffset": false, "m_Modifiable": true, "m_DefaultType": 0 } @@ -5833,7 +5885,8 @@ "m_SerializableColors": [] }, "m_TextureType": 0, - "m_NormalMapSpace": 0 + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true } { diff --git a/com.unity.shadergraph/package.json b/com.unity.shadergraph/package.json index fe7d6041238..aab0aa536e1 100644 --- a/com.unity.shadergraph/package.json +++ b/com.unity.shadergraph/package.json @@ -1,12 +1,11 @@ { "name": "com.unity.shadergraph", "description": "The Shader Graph package adds a visual Shader editing tool to Unity. You can use this tool to create Shaders in a visual way instead of writing code. Specific render pipelines can implement specific graph features. Currently, both the High Definition Rendering Pipeline and the Universal Rendering Pipeline support Shader Graph.", - "version": "13.1.0", + "version": "13.1.1", "unity": "2022.1", - "unityRelease": "0a11", "displayName": "Shader Graph", "dependencies": { - "com.unity.render-pipelines.core": "13.1.0", + "com.unity.render-pipelines.core": "13.1.1", "com.unity.searcher": "4.8.0" }, "samples": [ From e404553b2fa8423a4a0400c7274bfc1616620dea Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 26 Oct 2021 15:16:09 +0200 Subject: [PATCH 053/107] 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 054/107] 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 055/107] 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 056/107] 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 057/107] 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 058/107] 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 c11b0a7dfa023d18dd7b99365f5d8ec765195a33 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 26 Oct 2021 15:16:09 +0200 Subject: [PATCH 059/107] 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 f72970e7cc8fef1a5b7881dd190eb8b10b1d1068 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 11:33:21 +0200 Subject: [PATCH 060/107] 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 dac13e0d6d326f510c37202fd3780ee0e3f9a425 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 11:43:03 +0200 Subject: [PATCH 061/107] 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 b54a050403a25e5b7be5eaddfa2254237dc570b9 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 18:40:33 +0200 Subject: [PATCH 062/107] 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 063/107] 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 064/107] 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 065/107] 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 e1fd74b391bb43bb54ca56fbf1d9d4dfb7ff1bbf Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 27 Oct 2021 18:40:33 +0200 Subject: [PATCH 066/107] 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 b53d85fb499d95692a49bfcbc362ac51c5f8429a Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 10:45:18 +0200 Subject: [PATCH 067/107] 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 068/107] 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 069/107] 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 070/107] 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 071/107] 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 072/107] 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 073/107] 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 074/107] 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 075/107] 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 076/107] 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 077/107] 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 078/107] 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 079/107] 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 080/107] 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 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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 fba52e4e367f8d03b5fd4d86c30d2935ec9cf8d1 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 10:45:18 +0200 Subject: [PATCH 081/107] 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 65346d0007c2af67be044e101ef8de039d063236 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 12:13:20 +0200 Subject: [PATCH 082/107] 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 4c8e22fbeb0ede7a40d9a7658f6d8abb1f8dbc48 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Thu, 28 Oct 2021 17:14:19 +0200 Subject: [PATCH 083/107] 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 0d789085a3fbf7edc4e033ad855ad1bf6d77f49b Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 11:20:49 +0200 Subject: [PATCH 084/107] 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 3f3d27530cc7f25a922d0e4ff12009e013611ec5 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 11:33:35 +0200 Subject: [PATCH 085/107] 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 899c40f8641d7f6225390e8eb889f2029611b0de Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 15:44:43 +0200 Subject: [PATCH 086/107] 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 b4904a396e361420725a7220d1a784b1d80cc6c2 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Fri, 29 Oct 2021 20:20:50 +0200 Subject: [PATCH 087/107] 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 cf7b6ea3af0e05f0d43a4412aba1c865c2add493 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 13:05:44 +0100 Subject: [PATCH 088/107] 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 089/107] 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 090/107] 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 091/107] 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 092/107] 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 093/107] 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 094/107] 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 e2115fa6d9980725e19e21c63c5fff366eabd17a Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 13:05:44 +0100 Subject: [PATCH 095/107] 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 d9faa93fede11bd7b7287282981864e1a1381092 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 14:59:08 +0100 Subject: [PATCH 096/107] 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 713191cf18e2f69b4ac7cb660b8281e7e3b6b84f Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Tue, 2 Nov 2021 17:44:09 +0100 Subject: [PATCH 097/107] 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 131362e254be0b4417567a020218cbf720dd986e Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 11:17:47 +0100 Subject: [PATCH 098/107] 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 42b3523d62fbba278fe4d8e9bb2b6173e4aa06ca Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 12:14:37 +0100 Subject: [PATCH 099/107] 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 100/107] 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 101/107] 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 983953a3edeb40248f00d22ed05a5e2949bc6435 Mon Sep 17 00:00:00 2001 From: Antoine Lelievre Date: Wed, 3 Nov 2021 17:14:37 +0100 Subject: [PATCH 102/107] 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 From 48df35bf6aae2db74b24dbaefa322d1f59974d45 Mon Sep 17 00:00:00 2001 From: alelievr Date: Thu, 4 Nov 2021 14:05:20 +0100 Subject: [PATCH 103/107] HDRP PR fixes --- .../HDRP_Tests/ProjectSettings/EditorBuildSettings.asset | 1 - .../RenderPipeline/CustomPass/FullScreenCustomPassDrawer.cs | 4 ++-- .../Runtime/Debug/DebugLightVolumes.shader | 1 - .../Runtime/Debug/DebugVTBlit.shader | 1 - .../Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs | 2 +- .../Runtime/RenderPipeline/HDStencilUsage.cs | 4 +++- .../RenderPipeline/RenderPass/DrawRenderersCustomPass.cs | 4 ++-- 7 files changed, 8 insertions(+), 9 deletions(-) diff --git a/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset b/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset index 41e915132de..cb8aa8ceadf 100644 --- a/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset +++ b/TestProjects/HDRP_Tests/ProjectSettings/EditorBuildSettings.asset @@ -824,4 +824,3 @@ EditorBuildSettings: - enabled: 1 path: Assets/GraphicTests/Scenes/2x_Lighting/2319_Mixed_Cached_ShadowMap_Area.unity guid: 7e722454fc2b45846bf45661cc490359 - m_configObjects: {} 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 110384bac8b..6f3aeba439e 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 @@ -26,7 +26,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); + 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.AllUserBits); 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}"; } @@ -133,7 +133,7 @@ bool DoesWriteMaskContainsReservedBits(int writeMask) if (targetDepthBuffer == CustomPass.TargetBuffer.Custom) return false; - return ((writeMask & (int)~(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1)) != 0); + return ((writeMask & (int)~UserStencilUsage.AllUserBits) != 0); } void GetStencilInfo(Material material, out bool stencilEnabled, out int writeMaskValue) 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..13136d580c3 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" 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/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index fadd5353955..a5cdc8b8e04 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 @@ -41,7 +41,7 @@ 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, hdCamera.depthBufferMipChainInfo.GetOffsetBufferData(m_DepthPyramidMipLevelOffsetsBuffer)); + commandBuffer.SetGlobalBuffer(HDShaderIDs._DepthPyramidMipLevelOffsets, hdCamera.depthBufferMipChainInfo.GetOffsetBufferData(m_DepthPyramidMipLevelOffsetsBuffer)); #if UNITY_EDITOR var showGizmos = camera.cameraType == CameraType.Game 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..5a72e18407f 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDStencilUsage.cs @@ -59,6 +59,8 @@ public enum UserStencilUsage ///

User stencil bit 0. UserBit0 = StencilUsage.UserBit0, /// User stencil bit 1. - UserBit1 = StencilUsage.UserBit1 + UserBit1 = StencilUsage.UserBit1, + /// The mask of all the user bits. + AllUserBits = UserBit0 | UserBit1, } } 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 76bfafe445c..dfcfc586f10 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 @@ -79,12 +79,12 @@ public enum ShaderPass /// /// Write mask of the stencil. /// - public int stencilWriteMask = (int)(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1); + public int stencilWriteMask = (int)(UserStencilUsage.AllUserBits); /// /// Read mask of the stencil /// - public int stencilReadMask = (int)(UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1); + public int stencilReadMask = (int)(UserStencilUsage.AllUserBits); /// /// Comparison operation between the stencil buffer and the reference value. From 1a184ffb58e113042c9cea8cc07981527339672b Mon Sep 17 00:00:00 2001 From: alelievr Date: Thu, 4 Nov 2021 14:17:41 +0100 Subject: [PATCH 104/107] revert motion vector buffer in custom passes --- .../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 842da0cbfae..0c5ba5d7b8a 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.BeforeRendering)) + if (customPass.currentRenderTarget.motionVectorBufferRG.IsValid() && (customPass.injectionPoint == CustomPassInjectionPoint.BeforePostProcess || customPass.injectionPoint == CustomPassInjectionPoint.AfterPostProcess)) ctx.cmd.SetGlobalTexture(HDShaderIDs._CameraMotionVectorsTexture, customPass.currentRenderTarget.motionVectorBufferRG); if (customPass.currentRenderTarget.normalBufferRG.IsValid() && customPass.injectionPoint != CustomPassInjectionPoint.AfterPostProcess) From 734d68c62cde0c6c674fae072fe6a9877e24aa3a Mon Sep 17 00:00:00 2001 From: alelievr Date: Thu, 4 Nov 2021 14:18:20 +0100 Subject: [PATCH 105/107] HDRP PR fixes --- .../RenderPipeline/CustomPass/DrawRenderersCustomPassDrawer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e1549b01218..21b324ecc39 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 @@ -402,7 +402,7 @@ void DrawStencilIntField(ref Rect rect, SerializedProperty property, GUIContent EditorGUI.BeginChangeCheck(); var e = ConvertToUserStencilUsage((UserStencilUsageWorkaround)EditorGUI.EnumFlagsField(rect, label, ConvertToUserStencilUsageWorkaround(userStencilBits))); if (EditorGUI.EndChangeCheck()) - property.intValue = (int)(e & (UserStencilUsage.UserBit0 | UserStencilUsage.UserBit1)); + property.intValue = (int)(e & UserStencilUsage.AllUserBits); } else { From 9fbc658f75b88805b54983ae10bb8f6d7812baa6 Mon Sep 17 00:00:00 2001 From: alelievr Date: Thu, 4 Nov 2021 14:57:16 +0100 Subject: [PATCH 106/107] Added IsSky function --- .../ShaderGraph/Nodes/HDSampleBufferNode.cs | 32 ++++++++++++------- .../ShaderLibrary/ShaderVariables.hlsl | 11 +++++++ 2 files changed, 31 insertions(+), 12 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 b001c970d8b..346bdcc593d 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 @@ -28,6 +28,7 @@ public enum BufferType NormalWorldSpace, Roughness, MotionVectors, + IsSky, PostProcessInput, } @@ -54,7 +55,7 @@ public BufferType bufferType public HDSampleBufferNode() { name = "HD Sample Buffer"; - synonyms = new string[] { "normal", "motion vector", "roughness", "postprocessinput", "blit" }; + synonyms = new string[] { "normal", "motion vector", "roughness", "postprocessinput", "blit", "issky"}; UpdateNodeAfterDeserialization(); } @@ -82,6 +83,10 @@ public sealed override void UpdateNodeAfterDeserialization() AddSlot(new Vector2MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Vector2.zero, ShaderStageCapability.Fragment)); channelCount = 2; break; + case BufferType.IsSky: + AddSlot(new Vector1MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, 0, ShaderStageCapability.Fragment)); + channelCount = 1; + break; case BufferType.PostProcessInput: AddSlot(new ColorRGBAMaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, Color.black, ShaderStageCapability.Fragment)); channelCount = 4; @@ -103,14 +108,17 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener // Preview SG doesn't have access to HDRP depth buffer if (!generationMode.IsPreview()) { + registry.RequiresIncludePath("Packages/com.unity.render-pipelines.high-definition/Runtime/Material/NormalBuffer.hlsl"); + registry.RequiresIncludePath("Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Builtin/BuiltinData.hlsl"); + 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\""); - - // 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)});"); + if (bufferType == BufferType.PostProcessInput) + { + // 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()) @@ -121,23 +129,23 @@ public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode gener 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;"); + s.AppendLine("return IsSky(pixelCoords) ? 0 : normalData.normalWS;"); 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;"); + s.AppendLine("return IsSky(pixelCoords) ? 0 : PerceptualRoughnessToRoughness(normalData.perceptualRoughness);"); 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.IsSky: + s.AppendLine("return IsSky(uv) ? 1 : 0;"); + break; case BufferType.PostProcessInput: s.AppendLine("return SAMPLE_TEXTURE2D_X_LOD(_CustomPostProcessInput, samplerState, uv * _RTHandlePostProcessScale.xy, 0);"); break; 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..4f094ac7e6d 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl @@ -281,6 +281,17 @@ float SampleCustomDepth(float2 uv) return LoadCustomDepth(uint2(uv * _ScreenSize.xy)); } +bool IsSky(uint2 pixelCoord) +{ + float deviceDepth = LoadCameraDepth(pixelCoord); + return deviceDepth == 0; // We assume the sky is the part of the depth buffer that haven't been written. +} + +bool IsSky(float2 uv) +{ + return IsSky(uint2(uv * _ScreenSize.xy)); +} + float4x4 OptimizeProjectionMatrix(float4x4 M) { // Matrix format (x = non-constant value). From c8522e4f254c2b463b5a94ab5c2de14ae01f3d47 Mon Sep 17 00:00:00 2001 From: alelievr Date: Thu, 4 Nov 2021 16:06:16 +0100 Subject: [PATCH 107/107] Remove SG project from HDRP PR --- .../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 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: 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: {}