From 9a8d61b870c2c1e3f6308c91798e66d180c4db3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Leli=C3=A8vre?= Date: Wed, 1 Oct 2025 09:31:48 +0000 Subject: [PATCH 001/115] Improve DoF heuristic --- .../PostProcessing/Shaders/DoFCombine.compute | 5 --- .../Shaders/DoFComputeSlowTiles.compute | 11 ++++--- .../PostProcessing/Shaders/DoFGather.compute | 11 ++++--- .../Shaders/DoFGatherUtils.hlsl | 3 +- .../HDRenderPipeline.PostProcess.cs | 32 +++++++++++-------- 5 files changed, 35 insertions(+), 27 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFCombine.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFCombine.compute index 4738f7df8cf..1136dccd849 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFCombine.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFCombine.compute @@ -15,16 +15,11 @@ #define GROUP_SIZE (GROUP_RES * GROUP_RES) CBUFFER_START(cb0) -float4 _Params; float4 _Params2; uint _DebugTileClassification; uint3 _Padding; CBUFFER_END -#define NumRings _Params.x -#define MaxCoCRadius _Params.y -#define Anamorphism _Params.z - // Out-of-focus areas, computed at lower res TEXTURE2D_X(_InputNearTexture); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFComputeSlowTiles.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFComputeSlowTiles.compute index 6e9900c3e9c..5e403298948 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFComputeSlowTiles.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFComputeSlowTiles.compute @@ -18,9 +18,10 @@ float4 _Params; float4 _Params2; CBUFFER_END -#define NumRings _Params.x -#define MaxCoCRadius _Params.y -#define Anamorphism _Params.z +#define NearNumRings _Params.x +#define FarNumRings _Params.y +#define MaxCoCRadius _Params.z +#define Anamorphism _Params.w // Here we write the final output RW_TEXTURE2D_X(CTYPE, _OutputTexture); @@ -50,8 +51,10 @@ void ComputeSlowTiles(uint3 dispatchThreadId : SV_DispatchThreadID) centerSample.color = output; centerSample.CoC = GetCoCRadius(posInputs.positionSS); + uint numRings = centerSample.CoC > 0 ? FarNumRings : NearNumRings; + DoFTile tileData; - LoadTileData(posInputs.positionSS, centerSample, NumRings, tileData); + LoadTileData(posInputs.positionSS, centerSample, numRings, tileData); float4 outColor; float outAlpha; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFGather.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFGather.compute index 2d42dcc683d..00821c337d9 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFGather.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFGather.compute @@ -18,9 +18,10 @@ float4 _Params2; float4 _Params3; CBUFFER_END -#define NumRings _Params.x -#define MaxCoCRadius _Params.y -#define Anamorphism _Params.z +#define NearNumRings _Params.x +#define FarNumRings _Params.y +#define MaxCoCRadius _Params.z +#define Anamorphism _Params.w #define MaxCoCMipLevel _Params2.x #define MaxColorMip _Params2.y #define OneOverResScale _Params2.z @@ -55,8 +56,10 @@ void KMain(uint3 dispatchThreadId : SV_DispatchThreadID) return; } + uint numRings = centerSample.CoC > 0 ? FarNumRings : NearNumRings; + DoFTile tileData; - LoadTileData(posInputs.positionSS, centerSample, NumRings, tileData); + LoadTileData(posInputs.positionSS, centerSample, numRings, tileData); float4 outColor; float outAlpha; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFGatherUtils.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFGatherUtils.hlsl index 5309ddf66c2..9350b3c8c1a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFGatherUtils.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/DoFGatherUtils.hlsl @@ -140,7 +140,8 @@ void LoadTileData(float2 sampleTC, SampleData centerSample, float rings, inout D #ifdef ADAPTIVE_SAMPLING float minRadius = min(cocRanges.minFarCoC, -cocRanges.minNearCoC) * OneOverResScale; - tileData.numSamples = (int)ceil((minRadius / tileData.maxRadius < 0.1) ? tileData.numSamples * AdaptiveSamplingWeights.x : tileData.numSamples * AdaptiveSamplingWeights.y); + float ratio = saturate(minRadius / tileData.maxRadius); + tileData.numSamples = (int)ceil(tileData.numSamples * lerp(AdaptiveSamplingWeights.x, AdaptiveSamplingWeights.y, ratio)); #endif // By default split the fg and bg layers at 0 diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs index 61ad8ca0604..a3699be0007 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.PostProcess.cs @@ -3405,11 +3405,10 @@ static void DoPhysicallyBasedDepthOfField(in DepthOfFieldParameters dofParameter { cs = dofParameters.dofComputeSlowTilesCS; kernel = dofParameters.dofComputeSlowTilesKernel; - float sampleCount = Mathf.Max(dofParameters.nearSampleCount, dofParameters.farSampleCount); float anamorphism = dofParameters.physicalCameraAnamorphism / 4f; float mipLevel = 1 + Mathf.Ceil(Mathf.Log(maxCoc, 2)); - cmd.SetComputeVectorParam(cs, HDShaderIDs._Params, new Vector4(sampleCount, maxCoc, anamorphism, 0.0f)); + cmd.SetComputeVectorParam(cs, HDShaderIDs._Params, new Vector4(dofParameters.nearSampleCount, dofParameters.farSampleCount, maxCoc, anamorphism)); cmd.SetComputeVectorParam(cs, HDShaderIDs._Params2, new Vector4(dofParameters.adaptiveSamplingWeights.x, dofParameters.adaptiveSamplingWeights.y, (float)dofParameters.resolution, 1.0f/(float)dofParameters.resolution)); cmd.SetComputeTextureParam(cs, kernel, HDShaderIDs._InputTexture, source); cmd.SetComputeTextureParam(cs, kernel, HDShaderIDs._InputCoCTexture, fullresCoC); @@ -3452,11 +3451,10 @@ static void DoPhysicallyBasedDepthOfField(in DepthOfFieldParameters dofParameter { cs = dofParameters.pbDoFGatherCS; kernel = dofParameters.pbDoFGatherKernel; - float sampleCount = Mathf.Max(dofParameters.nearSampleCount, dofParameters.farSampleCount); float anamorphism = dofParameters.physicalCameraAnamorphism / 4f; float mipLevel = 1 + Mathf.Ceil(Mathf.Log(maxCoc, 2)); - cmd.SetComputeVectorParam(cs, HDShaderIDs._Params, new Vector4(sampleCount, maxCoc, anamorphism, 0.0f)); + cmd.SetComputeVectorParam(cs, HDShaderIDs._Params, new Vector4(dofParameters.nearSampleCount, dofParameters.farSampleCount, maxCoc, anamorphism)); cmd.SetComputeVectorParam(cs, HDShaderIDs._Params2, new Vector4(mipLevel, 3, 1.0f / (float)dofParameters.resolution, (float)dofParameters.resolution)); cmd.SetComputeVectorParam(cs, HDShaderIDs._Params3, new Vector4(dofParameters.adaptiveSamplingWeights.x, dofParameters.adaptiveSamplingWeights.y, 0.0f, 0.0f)); cmd.SetComputeTextureParam(cs, kernel, HDShaderIDs._InputTexture, sourcePyramid != null ? sourcePyramid : source); @@ -3478,11 +3476,9 @@ static void DoPhysicallyBasedDepthOfField(in DepthOfFieldParameters dofParameter { cs = dofParameters.pbDoFCombineCS; kernel = dofParameters.pbDoFCombineKernel; - float sampleCount = Mathf.Max(dofParameters.nearSampleCount, dofParameters.farSampleCount); float anamorphism = dofParameters.physicalCameraAnamorphism / 4f; float mipLevel = 1 + Mathf.Ceil(Mathf.Log(maxCoc, 2)); - cmd.SetComputeVectorParam(cs, HDShaderIDs._Params, new Vector4(sampleCount, maxCoc, anamorphism, 0.0f)); cmd.SetComputeVectorParam(cs, HDShaderIDs._Params2, new Vector4(dofParameters.adaptiveSamplingWeights.x, dofParameters.adaptiveSamplingWeights.y, (float)dofParameters.resolution, 1.0f/(float)dofParameters.resolution)); cmd.SetComputeTextureParam(cs, kernel, HDShaderIDs._InputTexture, source); cmd.SetComputeTextureParam(cs, kernel, HDShaderIDs._InputCoCTexture, fullresCoC); @@ -3560,6 +3556,9 @@ TextureHandle DepthOfFieldPass(RenderGraph renderGraph, HDCamera hdCamera, Textu var prevCoCHandle = renderGraph.ImportTexture(prevCoC); var nextCoCHandle = renderGraph.ImportTexture(nextCoC); + TextureHandle debugCocTexture; + Vector2 debugCocTextureScales; + using (var builder = renderGraph.AddUnsafePass("Depth of Field", out var passData, ProfilingSampler.Get(HDProfileId.DepthOfField))) { passData.source = source; @@ -3638,8 +3637,8 @@ TextureHandle DepthOfFieldPass(RenderGraph renderGraph, HDCamera hdCamera, Textu { format = k_CoCFormat, enableRandomWrite = true, name = "Full res CoC" }); builder.UseTexture(passData.fullresCoC, AccessFlags.ReadWrite); - var debugCocTexture = passData.fullresCoC; - var debugCocTextureScales = hdCamera.postProcessRTScales; + debugCocTexture = passData.fullresCoC; + debugCocTextureScales = hdCamera.postProcessRTScales; if (passData.taaEnabled) { debugCocTexture = passData.nextCoC; @@ -3696,15 +3695,14 @@ TextureHandle DepthOfFieldPass(RenderGraph renderGraph, HDCamera hdCamera, Textu source = passData.destination; - PushFullScreenDebugTexture(renderGraph, debugCocTexture, debugCocTextureScales, FullScreenDebugMode.DepthOfFieldCoc); } else { passData.fullresCoC = GetPostprocessOutputHandle(renderGraph, "Full res CoC", k_CoCFormat, false); builder.UseTexture(passData.fullresCoC, AccessFlags.ReadWrite); - var debugCocTexture = passData.fullresCoC; - var debugCocTextureScales = hdCamera.postProcessRTScales; + debugCocTexture = passData.fullresCoC; + debugCocTextureScales = hdCamera.postProcessRTScales; if (passData.taaEnabled) { debugCocTexture = passData.nextCoC; @@ -3738,8 +3736,6 @@ TextureHandle DepthOfFieldPass(RenderGraph renderGraph, HDCamera hdCamera, Textu }); source = passData.destination; - PushFullScreenDebugTexture(renderGraph, debugCocTexture, debugCocTextureScales, FullScreenDebugMode.DepthOfFieldCoc); - PushFullScreenDebugTexture(renderGraph, passData.destination, hdCamera.postProcessRTScales, FullScreenDebugMode.DepthOfFieldTileClassification); } } @@ -3762,6 +3758,16 @@ TextureHandle DepthOfFieldPass(RenderGraph renderGraph, HDCamera hdCamera, Textu { hdCamera.dofHistoryIsValid = false; } + if (!m_DepthOfField.physicallyBased) + { + + PushFullScreenDebugTexture(renderGraph, debugCocTexture, debugCocTextureScales, FullScreenDebugMode.DepthOfFieldCoc); + } + else + { + PushFullScreenDebugTexture(renderGraph, debugCocTexture, debugCocTextureScales, FullScreenDebugMode.DepthOfFieldCoc); + PushFullScreenDebugTexture(renderGraph, source, hdCamera.postProcessRTScales, FullScreenDebugMode.DepthOfFieldTileClassification); + } } if (!postDoFTAAEnabled) From 8725af3ac95d5b7bc9f0e8df64adde8e1842319d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Carr=C3=A8re?= Date: Wed, 1 Oct 2025 09:31:50 +0000 Subject: [PATCH 002/115] docg-7352: Fix World to Screen code --- Packages/com.unity.shadergraph/Documentation~/Transform-Node.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.shadergraph/Documentation~/Transform-Node.md b/Packages/com.unity.shadergraph/Documentation~/Transform-Node.md index c3ec4cbdbfa..f83183eb4f2 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Transform-Node.md +++ b/Packages/com.unity.shadergraph/Documentation~/Transform-Node.md @@ -83,7 +83,7 @@ float3 _Transform_Out = GetAbsolutePositionWS(In); **World > Screen** ``` -float4 hclipPosition = TransformWorldToHClipDir(In); +float4 hclipPosition = TransformWorldToHClip(In); float3 screenPos = hclipPosition.xyz / hclipPosition.w; float3 _Transform_Out = float3(screenPos.xy * 0.5 + 0.5, screenPos.z); ``` From f62fe478207e653d3b168646d949173698109c85 Mon Sep 17 00:00:00 2001 From: Vincent Breysse Date: Wed, 1 Oct 2025 09:31:55 +0000 Subject: [PATCH 003/115] Disable GPUResidentDrawer on VisionOS --- .../Runtime/GPUDriven/GPUResidentDrawer.Validator.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.Validator.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.Validator.cs index bf5d886f7ef..5461f541963 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.Validator.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.Validator.cs @@ -18,6 +18,7 @@ static class Strings public static readonly string batchRendererGroupShaderStrippingModeInvalid = $"{nameof(GPUResidentDrawer)} \"BatchRendererGroup Variants\" setting must be \"Keep All\". " + " The current setting will cause errors when building a player because all DOTS instancing shaders will be stripped" + " To fix, modify Graphics settings and set \"BatchRendererGroup Variants\" to \"Keep All\"."; + public static readonly string visionOSNotSupported = $"{nameof(GPUResidentDrawer)} Disabled on VisionOS as it is non applicable. This platform uses a custom rendering path and doesn't go through the resident drawer."; } internal static bool IsProjectSupported() @@ -30,6 +31,13 @@ internal static bool IsProjectSupported(out string message, out LogType severity message = string.Empty; severity = LogType.Log; + if (Application.platform == RuntimePlatform.VisionOS) + { + message = Strings.visionOSNotSupported; + severity = LogType.Log; + return false; + } + // The GPUResidentDrawer only has support when the RawBuffer path of providing data // ConstantBuffer path and any other unsupported platforms early out here if (BatchRendererGroup.BufferTarget != BatchBufferTarget.RawBuffer) From dd229d7b02abb00b45de1021372bda1337092876 Mon Sep 17 00:00:00 2001 From: Daniel Kierkegaard Andersen Date: Wed, 1 Oct 2025 20:44:05 +0000 Subject: [PATCH 004/115] EntityId public API changes (ObjectChangeEvents, EndNameEditAction, AudioProfiler) --- .../AssetCallbacks/AssetCreationUtil.cs | 4 +-- .../Editor/LookDev/EnvironmentLibrary.cs | 6 ++--- .../PostProcessing/LensFlareEditorUtils.cs | 4 +-- ...PipelineGlobalSettingsEndNameEditAction.cs | 1 + .../CreateUnifiedRTShaderMenuItem.cs | 4 +-- .../Editor/Volume/VolumeProfileFactory.cs | 8 +++--- .../PBRSky/ShaderGraph/PBRSkySubTarget.cs | 4 +-- .../ShaderGraph/CreateWaterShaderGraph.cs | 4 +-- .../Editor/RenderPipeline/HDAssetFactory.cs | 4 +-- .../HDRenderPipelineMenuItems.cs | 4 +-- .../PhysicallyBasedSkyEditor.cs | 4 +-- .../Editor/2D/Renderer2DMenus.cs | 10 +++---- .../NewPostProcessTemplateDropdownItems.cs | 4 +-- .../Runtime/Data/PostProcessData.cs | 4 +-- .../Data/UniversalRenderPipelineAsset.cs | 10 +++---- .../Runtime/UniversalRendererData.cs | 4 +-- .../AssetCallbacks/CreateShaderSubGraph.cs | 4 +-- .../Editor/Data/Util/GraphUtil.cs | 12 ++++----- .../Editor/VFXAssetEditorUtility.cs | 26 +++++++++---------- 19 files changed, 61 insertions(+), 60 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/AssetCallbacks/AssetCreationUtil.cs b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/AssetCallbacks/AssetCreationUtil.cs index 664137243cc..618d21e7b9d 100644 --- a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/AssetCallbacks/AssetCreationUtil.cs +++ b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/AssetCallbacks/AssetCreationUtil.cs @@ -95,12 +95,12 @@ static void CreateAsset(string name, Action callback = null, string exte ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, assetCreationCallback, name, icon, null, false); } - class AssetCreationCallback : ProjectWindowCallback.EndNameEditAction + class AssetCreationCallback : ProjectWindowCallback.AssetCreationEndAction { public Action callback; public string extension; - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { string path = AssetDatabase.GenerateUniqueAssetPath(pathName + $".{extension}"); callback?.Invoke(path); diff --git a/Packages/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs b/Packages/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs index 830560fc5b9..712c92f4d91 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/LookDev/EnvironmentLibrary.cs @@ -158,17 +158,17 @@ void Update() public sealed override void OnInspectorGUI() { } } - class EnvironmentLibraryCreator : ProjectWindowCallback.EndNameEditAction + class EnvironmentLibraryCreator : ProjectWindowCallback.AssetCreationEndAction { ObjectField m_Field = null; public void SetField(ObjectField field) => m_Field = field; - public override void Cancelled(int instanceId, string pathName, string resourceFile) + public override void Cancelled(EntityId entityId, string pathName, string resourceFile) => m_Field = null; - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var newAsset = CreateInstance(); newAsset.name = Path.GetFileName(pathName); diff --git a/Packages/com.unity.render-pipelines.core/Editor/PostProcessing/LensFlareEditorUtils.cs b/Packages/com.unity.render-pipelines.core/Editor/PostProcessing/LensFlareEditorUtils.cs index 7854462f83b..8b24f9eed68 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/PostProcessing/LensFlareEditorUtils.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/PostProcessing/LensFlareEditorUtils.cs @@ -16,9 +16,9 @@ internal static class Icons } #region Asset Factory - class LensFlareDataSRPCreator : UnityEditor.ProjectWindowCallback.EndNameEditAction + class LensFlareDataSRPCreator : UnityEditor.ProjectWindowCallback.AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { LensFlareDataSRP asset = ScriptableObject.CreateInstance(); UnityEngine.Assertions.Assert.IsNotNull(asset, $"failed to create instance of {nameof(LensFlareDataSRP)}"); diff --git a/Packages/com.unity.render-pipelines.core/Editor/Settings/RenderPipelineGlobalSettingsEndNameEditAction.cs b/Packages/com.unity.render-pipelines.core/Editor/Settings/RenderPipelineGlobalSettingsEndNameEditAction.cs index f8fb019974c..a8a4e2fef03 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Settings/RenderPipelineGlobalSettingsEndNameEditAction.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Settings/RenderPipelineGlobalSettingsEndNameEditAction.cs @@ -7,6 +7,7 @@ namespace UnityEditor.Rendering /// /// for /// + [Obsolete("RenderPipelineGlobalSettingsEndNameEditAction is no longer used and will be removed in a future release.")] public class RenderPipelineGlobalSettingsEndNameEditAction : ProjectWindowCallback.EndNameEditAction { private Type renderPipelineType { get; set; } diff --git a/Packages/com.unity.render-pipelines.core/Editor/UnifiedRayTracing/CreateUnifiedRTShaderMenuItem.cs b/Packages/com.unity.render-pipelines.core/Editor/UnifiedRayTracing/CreateUnifiedRTShaderMenuItem.cs index 1efe4f53b09..2c8e8331131 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/UnifiedRayTracing/CreateUnifiedRTShaderMenuItem.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/UnifiedRayTracing/CreateUnifiedRTShaderMenuItem.cs @@ -14,9 +14,9 @@ internal static void CreateNewUnifiedRayTracingShader() ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, action, "NewUnifiedRayTracingShader.urtshader", null, null); } - internal class DoCreateUnifiedRayTracingShader : EndNameEditAction + internal class DoCreateUnifiedRayTracingShader : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { string fullPath = Path.GetFullPath(pathName); File.WriteAllText(fullPath, shaderContent); diff --git a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileFactory.cs b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileFactory.cs index 293f7676163..c51ca454d89 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileFactory.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeProfileFactory.cs @@ -118,18 +118,18 @@ public static T CreateVolumeComponent(VolumeProfile profile, bool overrides = } } - class CreateVolumeProfileAction : EndNameEditAction + class CreateVolumeProfileAction : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var profile = VolumeProfileFactory.CreateVolumeProfileAtPath(pathName); ProjectWindowUtil.ShowCreatedAsset(profile); } } - class CreateVolumeProfileWithCallbackAction : EndNameEditAction + class CreateVolumeProfileWithCallbackAction : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var profile = VolumeProfileFactory.CreateVolumeProfileAtPath(pathName); ProjectWindowUtil.ShowCreatedAsset(profile); diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/PBRSky/ShaderGraph/PBRSkySubTarget.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/PBRSky/ShaderGraph/PBRSkySubTarget.cs index e2fca31b489..aa649966b60 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/PBRSky/ShaderGraph/PBRSkySubTarget.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/PBRSky/ShaderGraph/PBRSkySubTarget.cs @@ -285,9 +285,9 @@ public PassDescriptor GeneratePass(bool cubemap) } - class DoCreatePBRSkyShaderGraph : ProjectWindowCallback.EndNameEditAction + class DoCreatePBRSkyShaderGraph : ProjectWindowCallback.AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var material = GraphicsSettings.GetRenderPipelineSettings().pbrSkyMaterial; AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(material), pathName); diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Water/ShaderGraph/CreateWaterShaderGraph.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Water/ShaderGraph/CreateWaterShaderGraph.cs index 6bd69dd27fc..15295623e31 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Water/ShaderGraph/CreateWaterShaderGraph.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Water/ShaderGraph/CreateWaterShaderGraph.cs @@ -36,9 +36,9 @@ public static void CreateWaterGraph() GraphUtil.CreateNewGraphWithOutputs(new[] { target }, blockDescriptors); } - class DoCreateNewWaterShaderGraph : ProjectWindowCallback.EndNameEditAction + class DoCreateNewWaterShaderGraph : ProjectWindowCallback.AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var shader = GraphicsSettings.GetRenderPipelineSettings().waterPS; AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(shader), pathName); diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDAssetFactory.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDAssetFactory.cs index afee8048564..43612223180 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDAssetFactory.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDAssetFactory.cs @@ -9,9 +9,9 @@ namespace UnityEditor.Rendering.HighDefinition static partial class HDAssetFactory { - class DoCreateNewAssetHDRenderPipeline : ProjectWindowCallback.EndNameEditAction + class DoCreateNewAssetHDRenderPipeline : ProjectWindowCallback.AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var newAsset = CreateInstance(); newAsset.name = Path.GetFileName(pathName); diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs index 91ff18191f2..b22953031bd 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineMenuItems.cs @@ -233,9 +233,9 @@ internal static void ConvertLoadedObjectsToAPV() } } - class DoCreateNewAsset : ProjectWindowCallback.EndNameEditAction where TAssetType : ScriptableObject + class DoCreateNewAsset : ProjectWindowCallback.AssetCreationEndAction where TAssetType : ScriptableObject { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var newAsset = CreateInstance(); newAsset.name = Path.GetFileName(pathName); diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/PhysicallyBasedSky/PhysicallyBasedSkyEditor.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/PhysicallyBasedSky/PhysicallyBasedSkyEditor.cs index 6ec7c5a1fe0..58debd81be5 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/PhysicallyBasedSky/PhysicallyBasedSkyEditor.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/PhysicallyBasedSky/PhysicallyBasedSkyEditor.cs @@ -238,11 +238,11 @@ internal void MaterialFieldWithButton(SerializedDataParameter prop, GUIContent l } } - class DoCreatePBRSkyDefaultMaterial : ProjectWindowCallback.EndNameEditAction + class DoCreatePBRSkyDefaultMaterial : ProjectWindowCallback.AssetCreationEndAction { public PhysicallyBasedSky physicallyBasedSky; public Material material = null; - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var shader = GraphicsSettings.GetRenderPipelineSettings().pbrSkyMaterial; material = new Material(shader); diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DMenus.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DMenus.cs index 9e9981e7e2b..f5614e03e86 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DMenus.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Renderer2DMenus.cs @@ -19,11 +19,11 @@ static void Create2DRendererData(Action onCreatedCallback) ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, instance, "New 2D Renderer Data.asset", CoreUtils.GetIconForType(), null); } - class Create2DRendererDataAsset : EndNameEditAction + class Create2DRendererDataAsset : AssetCreationEndAction { public event Action onCreated; - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var instance = CreateRendererAsset(pathName, RendererType._2DRenderer, false) as Renderer2DData; Selection.activeObject = instance; @@ -187,9 +187,9 @@ static bool CreateLight2DValidation() } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812")] - internal class CreateUniversalPipelineAsset : EndNameEditAction + internal class CreateUniversalPipelineAsset : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { //Create asset AssetDatabase.CreateAsset(UniversalRenderPipelineAsset.Create(CreateRendererAsset(pathName, RendererType._2DRenderer)), pathName); @@ -199,7 +199,7 @@ public override void Action(int instanceId, string pathName, string resourceFile [MenuItem("Assets/Create/Rendering/URP Asset (with 2D Renderer)", priority = CoreUtils.Sections.section2 + CoreUtils.Priorities.assetsCreateRenderingMenuPriority)] static void CreateUniversalPipeline() { - ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, ScriptableObject.CreateInstance(), + ProjectWindowUtil.StartNameEditingIfProjectWindowExists(EntityId.None, ScriptableObject.CreateInstance(), "New Universal Render Pipeline Asset.asset", CoreUtils.GetIconForType(), null); } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessTemplateDropdownItems.cs b/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessTemplateDropdownItems.cs index 463beb07c96..f164566b529 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessTemplateDropdownItems.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessTemplateDropdownItems.cs @@ -33,9 +33,9 @@ static Object CreateScriptAssetFromTemplate(string templatePath, string targetPa return ProjectWindowUtil.CreateScriptAssetWithContent(targetPath, PreprocessScriptTemplate(content, featureType, volumeType, displayName)); } - internal class CreateCombinedScriptTemplateAssetsAction : ProjectWindowCallback.EndNameEditAction + internal class CreateCombinedScriptTemplateAssetsAction : ProjectWindowCallback.AssetCreationEndAction { - public override void Action(int instanceId, string userPath, string resourceFile) + public override void Action(EntityId entityId, string userPath, string resourceFile) { string directoryPath = Path.GetDirectoryName(userPath); string enteredName = Path.GetFileNameWithoutExtension(userPath); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Data/PostProcessData.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Data/PostProcessData.cs index c681abdecb8..5422f622894 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Data/PostProcessData.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Data/PostProcessData.cs @@ -20,9 +20,9 @@ public class PostProcessData : ScriptableObject { #if UNITY_EDITOR [SuppressMessage("Microsoft.Performance", "CA1812")] - internal class CreatePostProcessDataAsset : EndNameEditAction + internal class CreatePostProcessDataAsset : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var instance = CreateInstance(); AssetDatabase.CreateAsset(instance, pathName); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs index 95087950abe..a8e53d0a0bc 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs @@ -729,9 +729,9 @@ public static UniversalRenderPipelineAsset Create(ScriptableRendererData rendere } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812")] - internal class CreateUniversalPipelineAsset : EndNameEditAction + internal class CreateUniversalPipelineAsset : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { //Create asset AssetDatabase.CreateAsset(Create(CreateRendererAsset(pathName, RendererType.UniversalRenderer)), pathName); @@ -741,7 +741,7 @@ public override void Action(int instanceId, string pathName, string resourceFile [MenuItem("Assets/Create/Rendering/URP Asset (with Universal Renderer)", priority = CoreUtils.Sections.section2 + CoreUtils.Priorities.assetsCreateRenderingMenuPriority + 1)] static void CreateUniversalPipeline() { - ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, CreateInstance(), + ProjectWindowUtil.StartNameEditingIfProjectWindowExists(EntityId.None, CreateInstance(), "New Universal Render Pipeline Asset.asset", CoreUtils.GetIconForType(), null); } @@ -1916,7 +1916,7 @@ public void OnAfterDeserialize() k_AssetPreviousVersion = k_AssetVersion; k_AssetVersion = 12; } - + if (k_AssetVersion < 13) { k_AssetPreviousVersion = k_AssetVersion; @@ -1986,7 +1986,7 @@ static void UpgradeAsset(EntityId assetInstanceID) #pragma warning restore CS0618 // Type or member is obsolete asset.k_AssetPreviousVersion = 12; } - + if (asset.k_AssetPreviousVersion < 13) { asset.k_AssetPreviousVersion = 13; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererData.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererData.cs index 57d74aa93d2..d3caa2fdabb 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererData.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererData.cs @@ -110,9 +110,9 @@ public partial class UniversalRendererData : ScriptableRendererData, ISerializat { #if UNITY_EDITOR [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812")] - internal class CreateUniversalRendererAsset : EndNameEditAction + internal class CreateUniversalRendererAsset : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var instance = UniversalRenderPipelineAsset.CreateRendererAsset(pathName, RendererType.UniversalRenderer, false) as UniversalRendererData; Selection.activeObject = instance; diff --git a/Packages/com.unity.shadergraph/Editor/AssetCallbacks/CreateShaderSubGraph.cs b/Packages/com.unity.shadergraph/Editor/AssetCallbacks/CreateShaderSubGraph.cs index 993d415b7cc..b1c66aa48a6 100644 --- a/Packages/com.unity.shadergraph/Editor/AssetCallbacks/CreateShaderSubGraph.cs +++ b/Packages/com.unity.shadergraph/Editor/AssetCallbacks/CreateShaderSubGraph.cs @@ -5,7 +5,7 @@ namespace UnityEditor.ShaderGraph { - class CreateShaderSubGraph : EndNameEditAction + class CreateShaderSubGraph : AssetCreationEndAction { [MenuItem("Assets/Create/Shader Graph/Sub Graph", priority = CoreUtils.Sections.section1 + CoreUtils.Priorities.assetsCreateShaderMenuPriority + 1)] public static void CreateMaterialSubGraph() @@ -14,7 +14,7 @@ public static void CreateMaterialSubGraph() string.Format("New Shader Sub Graph.{0}", ShaderSubGraphImporter.Extension), ShaderSubGraphImporter.GetIcon(), null); } - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var graph = new GraphData { isSubGraph = true }; var outputNode = new SubGraphOutputNode(); diff --git a/Packages/com.unity.shadergraph/Editor/Data/Util/GraphUtil.cs b/Packages/com.unity.shadergraph/Editor/Data/Util/GraphUtil.cs index bce4b48a529..a6a6ea9bdba 100644 --- a/Packages/com.unity.shadergraph/Editor/Data/Util/GraphUtil.cs +++ b/Packages/com.unity.shadergraph/Editor/Data/Util/GraphUtil.cs @@ -99,7 +99,7 @@ public PreprocessorIf(string conditional) } } - class NewGraphAction : EndNameEditAction + class NewGraphAction : AssetCreationEndAction { Target[] m_Targets; public Target[] targets @@ -117,7 +117,7 @@ public BlockFieldDescriptor[] blocks public Action callback { get; set; } - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var graph = new GraphData(); graph.AddContexts(); @@ -138,7 +138,7 @@ public override void Action(int instanceId, string pathName, string resourceFile } } - class NewGraphFromTemplateAction : EndNameEditAction + class NewGraphFromTemplateAction : AssetCreationEndAction { string TemplatePath { get; set; } @@ -155,7 +155,7 @@ public void CreateAndRenameGraphFromTemplate(string templatePath, string assetPa } TemplatePath = templatePath; - EndNameEditAction endNameEditAction = this; + AssetCreationEndAction endNameEditAction = this; if (templatePath == string.Empty) // Template browser's "empty template" used { @@ -168,7 +168,7 @@ public void CreateAndRenameGraphFromTemplate(string templatePath, string assetPa if (assetPath == null) // template window didn't not provide a target path { ProjectWindowUtil.StartNameEditingIfProjectWindowExists( - 0, + EntityId.None, endNameEditAction, $"{Filename}.{ShaderGraphImporter.Extension}", ShaderGraphImporter.GetIcon(), @@ -181,7 +181,7 @@ public void CreateAndRenameGraphFromTemplate(string templatePath, string assetPa } } - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var templateFullPath = Path.GetFullPath(TemplatePath); if (File.Exists(templateFullPath)) diff --git a/Packages/com.unity.visualeffectgraph/Editor/VFXAssetEditorUtility.cs b/Packages/com.unity.visualeffectgraph/Editor/VFXAssetEditorUtility.cs index 6ad54f8c5e0..ef0e7893ee3 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/VFXAssetEditorUtility.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/VFXAssetEditorUtility.cs @@ -118,7 +118,7 @@ void OnTemplateCreate(string templateFilePath, string assetPath) var texture = EditorGUIUtility.FindTexture(typeof(VisualEffectAsset)); var action = ScriptableObject.CreateInstance(); action.templatePath = templateFilePath; - ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, action, "New VFX.vfx", texture, null); + ProjectWindowUtil.StartNameEditingIfProjectWindowExists(EntityId.None, action, "New VFX.vfx", texture, null); } } @@ -172,11 +172,11 @@ public static void CreateTemplateAsset(string pathName, string templateFilePath) AssetDatabase.ImportAsset(pathName); } - internal class DoCreateNewVFX : EndNameEditAction + internal class DoCreateNewVFX : AssetCreationEndAction { public string templatePath { get; set; } - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { CreateTemplateAsset(pathName, templatePath); var resource = VisualEffectResource.GetResourceAtPath(pathName); @@ -184,27 +184,27 @@ public override void Action(int instanceId, string pathName, string resourceFile } } - internal class DoCreateNewSubgraphOperator : EndNameEditAction + internal class DoCreateNewSubgraphOperator : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var sg = CreateNew(pathName); ProjectWindowUtil.FrameObjectInProjectWindow(sg.GetInstanceID()); } } - internal class DoCreateNewSubgraphBlock : EndNameEditAction + internal class DoCreateNewSubgraphBlock : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { var sg = CreateNew(pathName); - ProjectWindowUtil.FrameObjectInProjectWindow(sg.GetInstanceID()); + ProjectWindowUtil.FrameObjectInProjectWindow(sg.GetEntityId()); } } - internal class DoCreateHLSLFile : EndNameEditAction + internal class DoCreateHLSLFile : AssetCreationEndAction { - public override void Action(int instanceId, string pathName, string resourceFile) + public override void Action(EntityId entityId, string pathName, string resourceFile) { File.Create(pathName).Close(); @@ -212,7 +212,7 @@ public override void Action(int instanceId, string pathName, string resourceFile var asset = AssetDatabase.LoadAssetAtPath(pathName); - ProjectWindowUtil.FrameObjectInProjectWindow(asset.GetInstanceID()); + ProjectWindowUtil.FrameObjectInProjectWindow(asset.GetEntityId()); } } @@ -233,7 +233,7 @@ public static void CreateVisualEffectSubgraphBlock() CreateVisualEffectSubgraph(fileName, templateBlockSubgraphAssetName); } - public static void CreateVisualEffectSubgraph(string fileName, string templateName) where U : EndNameEditAction + public static void CreateVisualEffectSubgraph(string fileName, string templateName) where U : AssetCreationEndAction { string templateString = ""; @@ -249,7 +249,7 @@ public static void CreateVisualEffectSubgraph(string fileName, string temp Debug.LogError("Couldn't read template for new visual effect subgraph : " + e.Message); var action = ScriptableObject.CreateInstance(); - ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, action, fileName, texture, null); + ProjectWindowUtil.StartNameEditingIfProjectWindowExists(EntityId.None, action, fileName, texture, null); return; } From 40cd57d44692ec304eaa09c61d11859235f37663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Chapelain?= Date: Wed, 1 Oct 2025 20:44:06 +0000 Subject: [PATCH 005/115] [HDRP] Adds a Water caustics mesh resolution to HDRP asset settings --- .../RenderPipeline/HDRenderPipelineUI.Skin.cs | 1 + .../RenderPipeline/HDRenderPipelineUI.cs | 3 +++ .../SerializedRenderPipelineSettings.cs | 2 ++ .../Settings/RenderPipelineSettings.cs | 4 +++ ...HDRenderPipeline.WaterSystem.Simulation.cs | 26 +++++++++++++++++-- .../Water/HDRenderPipeline.WaterSystem.cs | 4 ++- .../Water/WaterSurface/WaterSurface.cs | 4 +-- .../Runtime/Water/WaterSystemDef.cs | 4 --- .../Editor/HDAnalyticsTests_Defaults.txt | 1 + 9 files changed, 40 insertions(+), 9 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.Skin.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.Skin.cs index 54cc0482719..99eb168fe30 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.Skin.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.Skin.cs @@ -128,6 +128,7 @@ public class Styles public static readonly GUIContent foamAtlasSizeContent = EditorGUIUtility.TrTextContent("Foam Atlas Size", "Specifies the size of the atlas used to store texture water foam."); public static readonly GUIContent supportWaterExclusionContent = EditorGUIUtility.TrTextContent("Exclusion", "When enabled, HDRP allocates a stencil bit to support water excluders."); public static readonly GUIContent supportWaterHorizontalDeformationContent = EditorGUIUtility.TrTextContent("Horizontal Deformation", "When enabled, HDRP allocates additional memory to support water horizontal deformation. Enabling this property limits compatibility with other water system features (like scripts interactions or underwater), refer to the documentation for more details."); + public static readonly GUIContent waterCausticsMeshResolutionContent = EditorGUIUtility.TrTextContent("Caustics Mesh Resolution", "Specifies the resolution of the mesh used to render the caustics texture. For better efficiency, this needs to be lower than the caustics resolution texture in your water surface. A higher resolution increases the number of vertices in the scene."); // High Quality Line Rendering public static readonly GUIContent highQualityLineRenderingSubTitle = EditorGUIUtility.TrTextContent("High Quality Line Rendering"); diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.cs index 75cc2e4d7b6..0bf16de80f6 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineUI.cs @@ -1175,6 +1175,9 @@ static void Drawer_SectionWaterSettings(SerializedHDRenderPipelineAsset serializ EditorGUI.indentLevel--; } + // Caustics Mesh Resolution + EditorGUILayout.PropertyField(serialized.renderPipelineSettings.waterCausticsMeshResolution, Styles.waterCausticsMeshResolutionContent); + } --EditorGUI.indentLevel; } diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/SerializedRenderPipelineSettings.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/SerializedRenderPipelineSettings.cs index 39ea34382bf..0953a72f359 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/SerializedRenderPipelineSettings.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/Settings/SerializedRenderPipelineSettings.cs @@ -41,6 +41,7 @@ class SerializedRenderPipelineSettings public SerializedProperty maximumWaterDecalCount; public SerializedProperty waterScriptInteractionsMode; public SerializedProperty waterFullCPUSimulation; + public SerializedProperty waterCausticsMeshResolution; public SerializedProperty supportComputeThickness; public SerializedProperty computeThicknessResolution; @@ -135,6 +136,7 @@ public SerializedRenderPipelineSettings(SerializedProperty root) maximumWaterDecalCount = root.Find((RenderPipelineSettings s) => s.maximumWaterDecalCount); waterScriptInteractionsMode = root.Find((RenderPipelineSettings s) => s.waterScriptInteractionsMode); waterFullCPUSimulation = root.Find((RenderPipelineSettings s) => s.waterFullCPUSimulation); + waterCausticsMeshResolution = root.Find((RenderPipelineSettings s) => s.waterCausticsMeshResolution); supportComputeThickness = root.Find((RenderPipelineSettings s) => s.supportComputeThickness); computeThicknessResolution = root.Find((RenderPipelineSettings s) => s.computeThicknessResolution); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/RenderPipelineSettings.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/RenderPipelineSettings.cs index 7c2ae3f6bc3..2a473413fa0 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/RenderPipelineSettings.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/RenderPipelineSettings.cs @@ -178,6 +178,7 @@ internal static RenderPipelineSettings NewDefault() waterScriptInteractionsMode = WaterScriptInteractionsMode.GPUReadback, waterFullCPUSimulation = false, + waterCausticsMeshResolution = WaterCausticsMeshResolution.Medium256, supportScreenSpaceLensFlare = true, supportDataDrivenLensFlare = true, @@ -305,6 +306,9 @@ public ReflectionProbeResolutionScalableSetting(CubeReflectionResolution[] value /// Defines if the CPU simulation should be evaluated at full resolution or half resolution. [Tooltip("Defines if the CPU simulation should be evaluated at full resolution or half resolution.")] public bool waterFullCPUSimulation; + /// Specifies the resolution of the mesh used to render the caustics texture. For better efficiency, this needs to be lower than the caustics resolution texture in your water surface. A higher resolution increases the number of vertices in the scene. + [Tooltip("Specifies the resolution of the mesh used to render the caustics texture. For better efficiency, this needs to be lower than the caustics resolution texture in your water surface. A higher resolution increases the number of vertices in the scene. .")] + public WaterCausticsMeshResolution waterCausticsMeshResolution; // Compute Thickness /// Sample Compute Thickness algorithm. diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/HDRenderPipeline.WaterSystem.Simulation.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/HDRenderPipeline.WaterSystem.Simulation.cs index 560ac8e2cc1..5026c3e6467 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/HDRenderPipeline.WaterSystem.Simulation.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/HDRenderPipeline.WaterSystem.Simulation.cs @@ -38,6 +38,25 @@ public enum WaterSimulationResolution High256 = 256, } + /// + /// Enum that defines the sets of resolution at which the mesh used for the generating the caustics texture is generated. + /// + public enum WaterCausticsMeshResolution + { + /// + /// The caustics texture will be renderer from a mesh with a resolution of 128x128 vertices. + /// + Low128 = 128, + /// + /// The caustics texture will be renderer from a mesh with a resolution of 256x256 vertices.. + /// + Medium256 = 256, + /// + /// The caustics texture will be renderer from a mesh with a resolution of 512x512 vertices. + /// + High512 = 512, + } + internal class WaterSimulationResourcesGPU { // Texture that holds the Phillips spectrum @@ -485,8 +504,11 @@ void EvaluateWaterCaustics(CommandBuffer cmd, WaterSurface currentWater) { using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.WaterSurfaceCaustics))) { + // Initialize the indices buffer - int meshResolution = WaterConsts.k_WaterCausticsMeshResolution; + int meshResolution = (int) m_RenderPipeline.asset.currentPlatformRenderPipelineSettings.waterCausticsMeshResolution; + int meshNumQuads = meshResolution * meshResolution; + if (!m_CausticsBufferGeometryInitialized) { int meshTileCount = (meshResolution + 7) / 8; @@ -510,7 +532,7 @@ void EvaluateWaterCaustics(CommandBuffer cmd, WaterSurface currentWater) // Render the caustics CoreUtils.SetRenderTarget(cmd, currentWater.simulation.gpuBuffers.causticsBuffer, clearFlag: ClearFlag.Color, Color.black); - cmd.DrawProcedural(m_CausticsGeometry, Matrix4x4.identity, m_CausticsMaterial, 0, MeshTopology.Triangles, WaterConsts.k_WaterCausticsMeshNumQuads * 6, 1, m_WaterMaterialPropertyBlock); + cmd.DrawProcedural(m_CausticsGeometry, Matrix4x4.identity, m_CausticsMaterial, 0, MeshTopology.Triangles, meshNumQuads * 6, 1, m_WaterMaterialPropertyBlock); // Make sure the mip-maps are generated currentWater.simulation.gpuBuffers.causticsBuffer.rt.Create(); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/HDRenderPipeline.WaterSystem.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/HDRenderPipeline.WaterSystem.cs index b372df087cc..8ba7b0c24f0 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/HDRenderPipeline.WaterSystem.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/HDRenderPipeline.WaterSystem.cs @@ -121,7 +121,9 @@ internal void Initialize(HDRenderPipeline hdPipeline) InitializeInstancingData(); // Create the caustics water geometry - m_CausticsGeometry = new GraphicsBuffer(GraphicsBuffer.Target.Raw | GraphicsBuffer.Target.Index, WaterConsts.k_WaterCausticsMeshNumQuads * 6, sizeof(int)); + int waterCausticsMeshResolution = (int)hdPipeline.asset.currentPlatformRenderPipelineSettings.waterCausticsMeshResolution; + int waterCausticsMeshNumQuads = waterCausticsMeshResolution * waterCausticsMeshResolution; + m_CausticsGeometry = new GraphicsBuffer(GraphicsBuffer.Target.Raw | GraphicsBuffer.Target.Index, waterCausticsMeshNumQuads * 6, sizeof(int)); m_CausticsBufferGeometryInitialized = false; m_CausticsMaterial = CoreUtils.CreateEngineMaterial(m_RuntimeResources.waterCausticsPS); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterSurface/WaterSurface.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterSurface/WaterSurface.cs index d10d843c247..abec4991a27 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterSurface/WaterSurface.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterSurface/WaterSurface.cs @@ -329,9 +329,9 @@ public enum WaterCausticsResolution } /// - /// Specifies the resolution at which the water caustics are rendered (simulation only). + /// Specifies the resolution at which the water caustics texture is rendered. /// - [Tooltip("Specifies the resolution at which the water caustics are rendered (simulation only).")] + [Tooltip("Specifies the resolution at which the water caustics texture is rendered. For better definition, you can also change the Caustics Mesh Resolution in the water settings asset.")] public WaterCausticsResolution causticsResolution = WaterCausticsResolution.Caustics256; /// diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterSystemDef.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterSystemDef.cs index 7216543546b..1888ef88773 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterSystemDef.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Water/WaterSystemDef.cs @@ -24,10 +24,6 @@ internal class WaterConsts // Maximum wind speed that the system allows for the agitation (in km/h) public const float k_AgitationMaximumWindSpeed = 50.0f; - // Resolution of the mesh used to render the caustics grid - public const int k_WaterCausticsMeshResolution = 256; - public const int k_WaterCausticsMeshNumQuads = k_WaterCausticsMeshResolution * k_WaterCausticsMeshResolution; - // Resolution of the mesh used to render the tessellated water surface public const int k_WaterTessellatedMeshResolution = 128; public const int k_WaterTessellatedMeshNumQuads = k_WaterTessellatedMeshResolution * k_WaterTessellatedMeshResolution; diff --git a/Packages/com.unity.render-pipelines.high-definition/Tests/Editor/HDAnalyticsTests_Defaults.txt b/Packages/com.unity.render-pipelines.high-definition/Tests/Editor/HDAnalyticsTests_Defaults.txt index ba7c26be958..a04a4546cc8 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Tests/Editor/HDAnalyticsTests_Defaults.txt +++ b/Packages/com.unity.render-pipelines.high-definition/Tests/Editor/HDAnalyticsTests_Defaults.txt @@ -22,6 +22,7 @@ {"maximumWaterDecalCount":"48"}, {"waterScriptInteractionsMode":"GPUReadback"}, {"waterFullCPUSimulation":"False"}, +{"waterCausticsMeshResolution":"Medium256"}, {"supportComputeThickness":"False"}, {"computeThicknessResolution":"Half"}, {"supportDistortion":"True"}, From 25a54c4a4aed8475f26eb0e8c7a3cadd23d2d587 Mon Sep 17 00:00:00 2001 From: Jesper Mortensen Date: Wed, 1 Oct 2025 20:44:09 +0000 Subject: [PATCH 006/115] UUM-120032: Avoid warnings when changing build target to Web --- .../Runtime/PathTracing/Shaders/BlitCookie.compute | 1 + .../Runtime/PathTracing/Shaders/BlitCubemap.compute | 1 + .../Runtime/PathTracing/Shaders/BuildLightGrid.compute | 2 +- .../Runtime/PathTracing/Shaders/ComputeHelpers.compute | 1 + .../Runtime/PathTracing/Shaders/ExpansionHelpers.compute | 1 + .../PathTracing/Shaders/LightmapAOIntegration.urtshader | 1 + .../PathTracing/Shaders/LightmapDirectIntegration.urtshader | 1 + .../Runtime/PathTracing/Shaders/LightmapGBufferDebug.urtshader | 1 + .../PathTracing/Shaders/LightmapGBufferIntegration.urtshader | 1 + .../PathTracing/Shaders/LightmapIndirectIntegration.urtshader | 3 +-- .../PathTracing/Shaders/LightmapNormalIntegration.urtshader | 1 + .../Runtime/PathTracing/Shaders/LightmapOccupancy.compute | 1 + .../Shaders/LightmapShadowMaskIntegration.urtshader | 3 +-- .../PathTracing/Shaders/LightmapValidityIntegration.urtshader | 1 + .../PathTracing/Shaders/Lightmapping/BilinearOverlaps.compute | 2 +- .../Runtime/PathTracing/Shaders/LiveGI.urtshader | 2 +- .../PathTracing/Shaders/PathTracingSkySamplingData.compute | 2 +- .../PathTracing/Shaders/ProbeIntegrationDirect.urtshader | 3 +-- .../PathTracing/Shaders/ProbeIntegrationIndirect.urtshader | 3 +-- .../PathTracing/Shaders/ProbeIntegrationOcclusion.urtshader | 3 +-- .../PathTracing/Shaders/ProbeIntegrationValidity.urtshader | 1 + .../Shaders/ProbeOcclusionLightIndexMapping.compute | 1 + .../Runtime/PathTracing/Shaders/ProbePostProcessing.compute | 1 + .../Runtime/PathTracing/Shaders/ResolveAccumulation.compute | 1 + .../Runtime/PathTracing/Shaders/SegmentedReduction.compute | 1 + .../Runtime/PathTracing/Shaders/SetAlphaChannel.compute | 1 + 26 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BlitCookie.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BlitCookie.compute index d5bc3e62af2..d2eed9ea54f 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BlitCookie.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BlitCookie.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define GROUP_SIZE_X 8 #define GROUP_SIZE_Y 8 diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BlitCubemap.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BlitCubemap.compute index 20fdb1f8002..204cd8e39da 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BlitCubemap.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BlitCubemap.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define GROUP_SIZE_X 8 #define GROUP_SIZE_Y 8 diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BuildLightGrid.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BuildLightGrid.compute index 08e2f5c7d9d..b40ba665ba4 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BuildLightGrid.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/BuildLightGrid.compute @@ -1,4 +1,4 @@ - +#pragma only_renderers d3d11 vulkan metal glcore #pragma multi_compile _ SPARSE_GRID #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ComputeHelpers.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ComputeHelpers.compute index 63986d8fe14..0d992dd0996 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ComputeHelpers.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ComputeHelpers.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore RWTexture2D g_TextureInOut; int g_TextureWidth; int g_TextureHeight; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ExpansionHelpers.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ExpansionHelpers.compute index 38f8290fe5c..cb19d504a68 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ExpansionHelpers.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ExpansionHelpers.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_BACKEND_COMPUTE #define UNIFIED_RT_GROUP_SIZE_X 16 #define UNIFIED_RT_GROUP_SIZE_Y 8 diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapAOIntegration.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapAOIntegration.urtshader index a04dff6bf1d..158bc80653e 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapAOIntegration.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapAOIntegration.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 64 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC AccumulateInternal diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapDirectIntegration.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapDirectIntegration.urtshader index b99fa2d4295..672f13ce618 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapDirectIntegration.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapDirectIntegration.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 64 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC AccumulateInternal diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapGBufferDebug.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapGBufferDebug.urtshader index c8a5958a712..6541a6e7674 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapGBufferDebug.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapGBufferDebug.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 64 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC AccumulateInternal diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapGBufferIntegration.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapGBufferIntegration.urtshader index 0b99eee8adb..4e8ecc867ba 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapGBufferIntegration.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapGBufferIntegration.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 64 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC AccumulateInternal diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapIndirectIntegration.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapIndirectIntegration.urtshader index 53c3fdf24a6..8d01ba0b010 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapIndirectIntegration.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapIndirectIntegration.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 64 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC AccumulateInternal @@ -5,8 +6,6 @@ #include "PathTracing.hlsl" #include "LightmapIntegrationHelpers.hlsl" -#pragma exclude_renderers switch switch2 - int g_AccumulateDirectional; int g_SampleOffset; float g_PushOff; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapNormalIntegration.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapNormalIntegration.urtshader index 8afdad73b27..416291a6fee 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapNormalIntegration.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapNormalIntegration.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 64 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC AccumulateInternal diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapOccupancy.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapOccupancy.compute index 8e89fa331b1..f10b20d6e49 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapOccupancy.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapOccupancy.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore RWTexture2D g_LightmapInOut; Texture2D g_UvFallback; int g_InstanceOffsetX; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapShadowMaskIntegration.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapShadowMaskIntegration.urtshader index e4dd40053de..30e667ccef1 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapShadowMaskIntegration.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapShadowMaskIntegration.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 64 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC AccumulateInternal @@ -5,8 +6,6 @@ #include "PathTracing.hlsl" #include "LightmapIntegrationHelpers.hlsl" -#pragma exclude_renderers switch switch2 - int g_SampleOffset; uint g_ReceiveShadows; float g_PushOff; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapValidityIntegration.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapValidityIntegration.urtshader index b500f06ff5c..b7d46655588 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapValidityIntegration.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LightmapValidityIntegration.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 64 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC AccumulateInternal diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/Lightmapping/BilinearOverlaps.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/Lightmapping/BilinearOverlaps.compute index 0cd39147e24..09dfdd15c74 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/Lightmapping/BilinearOverlaps.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/Lightmapping/BilinearOverlaps.compute @@ -1,4 +1,4 @@ -#pragma exclude_renderers webgpu // No atomics +#pragma only_renderers d3d11 vulkan metal glcore #pragma kernel MarkBilinearOverlaps diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LiveGI.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LiveGI.urtshader index e7c7ef8f41a..aee8cd084a9 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LiveGI.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/LiveGI.urtshader @@ -1,4 +1,4 @@ -#pragma exclude_renderers switch switch2 +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 16 #define UNIFIED_RT_GROUP_SIZE_Y 8 diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/PathTracingSkySamplingData.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/PathTracingSkySamplingData.compute index 4674ea29b13..7ec6461e9b5 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/PathTracingSkySamplingData.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/PathTracingSkySamplingData.compute @@ -1,5 +1,5 @@ // This implementation is adapted from BuildProbabilityTables.compute - +#pragma only_renderers d3d11 vulkan metal glcore #define COMPUTE_PATH_TRACING_SKY_SAMPLING_DATA #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationDirect.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationDirect.urtshader index a8425298d98..af5e0fc2687 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationDirect.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationDirect.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 128 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC IntegrateDirectRadiance @@ -7,8 +8,6 @@ #include "PathTracing.hlsl" #include "SphericalHarmonicsUtils.hlsl" -#pragma exclude_renderers switch switch2 - RWStructuredBuffer g_Positions; RWStructuredBuffer g_RadianceShl2; uint g_PositionsOffset; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationIndirect.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationIndirect.urtshader index f7c8c6b10fd..838b18915bf 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationIndirect.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationIndirect.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 128 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC IntegrateIndirectRadiance @@ -5,8 +6,6 @@ #include "PathTracing.hlsl" #include "SphericalHarmonicsUtils.hlsl" -#pragma exclude_renderers switch switch2 - RWStructuredBuffer g_Positions; RWStructuredBuffer g_RadianceShl2; uint g_PositionsOffset; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationOcclusion.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationOcclusion.urtshader index dc862555226..7b066134748 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationOcclusion.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationOcclusion.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 128 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC IntegrateOcclusion @@ -5,8 +6,6 @@ #include "PathTracing.hlsl" #include "LightSampling.hlsl" -#pragma exclude_renderers switch switch2 - RWStructuredBuffer g_Positions; RWStructuredBuffer g_PerProbeLightIndices; RWStructuredBuffer g_Occlusion; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationValidity.urtshader b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationValidity.urtshader index 8c445ef25ab..d586f01ca0b 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationValidity.urtshader +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeIntegrationValidity.urtshader @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define UNIFIED_RT_GROUP_SIZE_X 128 #define UNIFIED_RT_GROUP_SIZE_Y 1 #define UNIFIED_RT_RAYGEN_FUNC IntegrateValidity diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeOcclusionLightIndexMapping.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeOcclusionLightIndexMapping.compute index 84f66596901..6ff80b1f591 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeOcclusionLightIndexMapping.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbeOcclusionLightIndexMapping.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore // See UnityComputeProbeIntegrator.IntegrateOcclusion() #pragma kernel MapIndices diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbePostProcessing.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbePostProcessing.compute index e163dc416cb..a4ed9adc0d5 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbePostProcessing.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ProbePostProcessing.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #define UNIFIED_RT_BACKEND_COMPUTE diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ResolveAccumulation.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ResolveAccumulation.compute index 034b8e734f7..90fda0df62c 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ResolveAccumulation.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/ResolveAccumulation.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore RWTexture2D g_LightmapInOut; int g_TextureWidth; int g_TextureHeight; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/SegmentedReduction.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/SegmentedReduction.compute index 04572c8e319..152de15202e 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/SegmentedReduction.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/SegmentedReduction.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore // This shader computes a strided segmented reduction - essentially N reductions in parallel, in a single pass. // A very simple approach is used, where each thread just computes the i'th reduction sequentially. // Each segment is assumed to be the same length. The shader adds to its output, so zero-initialize it if needed. diff --git a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/SetAlphaChannel.compute b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/SetAlphaChannel.compute index a9a459a00c2..3930a5dc449 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/SetAlphaChannel.compute +++ b/Packages/com.unity.render-pipelines.core/Runtime/PathTracing/Shaders/SetAlphaChannel.compute @@ -1,3 +1,4 @@ +#pragma only_renderers d3d11 vulkan metal glcore #define GROUP_SIZE_X 8 #define GROUP_SIZE_Y 8 From 80f644cd76d81094add64d80b2d8536b9a114663 Mon Sep 17 00:00:00 2001 From: Ludovic Theobald Date: Wed, 1 Oct 2025 20:44:12 +0000 Subject: [PATCH 007/115] [VFX][Fix] Remove VFXEdgeDragInfo --- .../GraphView/Elements/VFXEdgeConnector.cs | 29 ---- .../GraphView/Elements/VFXEdgeDragInfo.cs | 144 ------------------ .../Elements/VFXEdgeDragInfo.cs.meta | 11 -- .../Editor/GraphView/Views/VFXView.cs | 86 +---------- .../UIResources/uss/VFXEdgeDragInfo.uss | 24 --- .../UIResources/uss/VFXEdgeDragInfo.uss.meta | 11 -- 6 files changed, 1 insertion(+), 304 deletions(-) delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXEdgeDragInfo.cs delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXEdgeDragInfo.cs.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXEdgeDragInfo.uss delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXEdgeDragInfo.uss.meta diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXEdgeConnector.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXEdgeConnector.cs index f346686a53f..eac939b6243 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXEdgeConnector.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXEdgeConnector.cs @@ -33,35 +33,6 @@ protected override void OnMouseMove(MouseMoveEvent e) s_PickedList.Clear(); view.panel.PickAll(e.mousePosition, s_PickedList); - - VFXDataAnchor anchor = s_PickedList.OfType().FirstOrDefault(); - - if (anchor != null) - view.StartEdgeDragInfo(this.edgeDragHelper.draggedPort as VFXDataAnchor, anchor); - else - view.StopEdgeDragInfo(); - } - - protected override void OnMouseUp(MouseUpEvent e) - { - base.OnMouseUp(e); - - if (!e.isPropagationStopped) - return; - - VFXView view = m_Anchor.GetFirstAncestorOfType(); - if (view == null) - return; - view.StopEdgeDragInfo(); - } - - protected override void Abort() - { - base.Abort(); - if (m_Anchor.GetFirstAncestorOfType() is { } view) - { - view.StopEdgeDragInfo(); - } } static List s_PickedList = new List(); diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXEdgeDragInfo.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXEdgeDragInfo.cs deleted file mode 100644 index eef2ca4f544..00000000000 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXEdgeDragInfo.cs +++ /dev/null @@ -1,144 +0,0 @@ -//#define OLD_COPY_PASTE -using System; -using System.Linq; -using System.Collections; -using System.Collections.Generic; -using UnityEditor.Experimental.GraphView; -using UnityEngine; -using UnityEngine.Rendering; -using UnityEditor.Experimental.VFX; -using UnityEngine.Experimental.VFX; -using UnityEngine.UIElements; -using UnityEngine.Profiling; -using System.Reflection; - -using PositionType = UnityEngine.UIElements.Position; - -namespace UnityEditor.VFX.UI -{ - class VFXEdgeDragInfo : VisualElement - { - VFXView m_View; - public VFXEdgeDragInfo(VFXView view) - { - m_View = view; - var tpl = VFXView.LoadUXML("VFXEdgeDragInfo"); - tpl.CloneTree(this); - - this.styleSheets.Add(VFXView.LoadStyleSheet("VFXEdgeDragInfo")); - - m_Text = this.Q [SupportedOnRenderPipeline(typeof(HDRenderPipelineAsset))] [Serializable, VolumeComponentMenu("Rendering/High Quality Lines")] + [HDRPHelpURL("Override-High-Quality-Lines")] [DisplayInfo(name = "High Quality Line Rendering")] public class HighQualityLineRenderingVolumeComponent : VolumeComponent { From 3ea982d7789d5cb713a085a0b1d360df7a891ab0 Mon Sep 17 00:00:00 2001 From: Lisha Li Date: Thu, 2 Oct 2025 11:15:47 +0000 Subject: [PATCH 010/115] UITk docs: Added docs for the UITK custom shader support --- .../Documentation~/Input-Nodes.md | 7 ++++ .../Documentation~/Node-Library.md | 1 + .../Documentation~/TableOfContents.md | 13 ++++++++ .../default-bitmap-text-node.md | 24 ++++++++++++++ .../Documentation~/default-gradient-node.md | 26 +++++++++++++++ .../Documentation~/default-sdf-text-node.md | 24 ++++++++++++++ .../Documentation~/default-solid-node.md | 25 +++++++++++++++ .../Documentation~/default-texture-node.md | 26 +++++++++++++++ .../Documentation~/element-layout-uv-node.md | 20 ++++++++++++ .../element-texture-size-node.md | 31 ++++++++++++++++++ .../Documentation~/element-texture-uv-node.md | 26 +++++++++++++++ .../Documentation~/include_note_uitk.md | 2 ++ .../Documentation~/render-type-branch-node.md | 32 +++++++++++++++++++ .../Documentation~/render-type-node.md | 23 +++++++++++++ .../sample-element-texture-node.md | 28 ++++++++++++++++ .../Documentation~/ui-nodes.md | 20 ++++++++++++ 16 files changed, 328 insertions(+) create mode 100644 Packages/com.unity.shadergraph/Documentation~/default-bitmap-text-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/default-gradient-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/default-sdf-text-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/default-solid-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/default-texture-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/element-layout-uv-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/element-texture-size-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/element-texture-uv-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/include_note_uitk.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/render-type-branch-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/render-type-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/sample-element-texture-node.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/ui-nodes.md diff --git a/Packages/com.unity.shadergraph/Documentation~/Input-Nodes.md b/Packages/com.unity.shadergraph/Documentation~/Input-Nodes.md index 5983f8dc84c..65296db3cee 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Input-Nodes.md +++ b/Packages/com.unity.shadergraph/Documentation~/Input-Nodes.md @@ -100,3 +100,10 @@ Supply shaders with essential data such as constants, mesh attributes, gradients | [Texture 2D Array Asset](Texture-2D-Array-Asset-Node.md) | Defines a constant Texture 2D Array Asset for use in the shader. | | [Texture 2D Asset](Texture-2D-Asset-Node.md) | Defines a constant Texture 2D Asset for use in the shader. | | [Texture 3D Asset](Texture-3D-Asset-Node.md) | Defines a constant Texture 3D Asset for use in the shader. | + +## UI +| **Topic** | **Description** | +|-------------|------------------| +| [Element Texture UV](element-texture-uv-node.md) | Provides the texture coordinates (UV) typically used to sample the texture assigned to a UI element. | +| [Element Layout UV](element-layout-uv-node.md) | Provides the layout UV coordinates within a UI element's layout rectangle. | +| [Element Texture Size](element-texture-size-node.md) | Provides the size of the texture assigned to a UI element. | \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/Node-Library.md b/Packages/com.unity.shadergraph/Documentation~/Node-Library.md index 9d773bda455..762a150fae7 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Node-Library.md +++ b/Packages/com.unity.shadergraph/Documentation~/Node-Library.md @@ -12,6 +12,7 @@ Explore nodes that enable color and channel manipulation, mathematical and proce | [Input](Input-Nodes.md) | Learn about values, mesh attributes, gradients, matrices, deformation data, PBR parameters, scene information, and texture sampling options. | | [Math](Math-Nodes.md) | Learn about mathematical operations. | | [Procedural](Procedural-Nodes.md) | Learn about creating patterns, noise textures, and geometric shapes. | +| [UI](UI-Nodes.md) | Learn about nodes specifically designed for UI elements, including render type handling, element texture sampling, and layout-based UVs. | | [Utility](Utility-Nodes.md) | Learn about basic preview, sub-graph referencing, and essential logic operations. | | [UV](UV-Nodes.md) | Learn about manipulation and mapping effects, enabling advanced texture animations, coordinate transformations, and warping techniques. | diff --git a/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md b/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md index caf762d022f..779abadb1a6 100644 --- a/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md +++ b/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md @@ -162,6 +162,10 @@ * [Texture 2D Asset](Texture-2D-Asset-Node.md) * [Texture 3D Asset](Texture-3D-Asset-Node.md) * [Texture Size](Texture-Size-Node.md) + * UI + * [Element Layout UV](element-layout-uv-node.md) + * [Element Texture Size](element-texture-size-node.md) + * [Element Texture UV](element-texture-uv-node.md) * [Math](Math-Nodes.md) * Advanced * [Absolute](Absolute-Node.md) @@ -252,6 +256,15 @@ * [Rounded Polygon](Rounded-Polygon-Node.md) * [Rounded Rectangle](Rounded-Rectangle-Node.md) * [Checkerboard](Checkerboard-Node.md) + * [UI](ui-nodes.md) + * [Default Bitmap Text](default-bitmap-text-node.md) + * [Default Gradient](default-gradient-node.md) + * [Default SDF Text](default-sdf-text-node.md) + * [Default Solid](default-solid-node.md) + * [Default Texture](default-texture-node.md) + * [Render Type](render-type-node.md) + * [Render Type Branch](render-type-branch-node.md) + * [Sample Element Texture](sample-element-texture-node.md) * [Utility](Utility-Nodes.md) * Logic * [All](All-Node.md) diff --git a/Packages/com.unity.shadergraph/Documentation~/default-bitmap-text-node.md b/Packages/com.unity.shadergraph/Documentation~/default-bitmap-text-node.md new file mode 100644 index 00000000000..32d7a504746 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/default-bitmap-text-node.md @@ -0,0 +1,24 @@ +--- +uid: default-bitmap-text +--- + +# Default Bitmap Text node + +[!include[](include_note_uitk.md)] + +Outputs the text color set for bitmap text rendering and includes a tint input you can use to modify the color of the text. For example, if you connect a **Color** node to the tint input and set it to red, and connect the output to bitmap text render type, the text color of your bitmap text becomes red. + +## Ports + +| Name | Direction | Type | Description | +|:----------- |:--------------------|:------|:------------| +| Tint | Input | Color | The color tint to apply to the text. | +| Bitmap text| Output | Texture| The rendered bitmap of the text. | + +## Additional resources + +- [Default Solid node](xref:default-solid-node) +- [Default Gradient node](xref:default-gradient-node) +- [Default Texture node](xref:default-texture-node) +- [Default SDF Text node](xref:default-sdf-text-node) +- [Render Type Branch node](xref:render-type-branch-node) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/default-gradient-node.md b/Packages/com.unity.shadergraph/Documentation~/default-gradient-node.md new file mode 100644 index 00000000000..259bff845ee --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/default-gradient-node.md @@ -0,0 +1,26 @@ +--- +uid: default-gradient-node +--- + +# Default Gradient node + +[!include[](include_note_uitk.md)] + +Outputs the gradient specified for your UI elements. For example, if you set the background image of a button to use a vector graphic with a linear gradient from top red to bottom green, the Default Gradient node outputs that gradient for the button. + +You can use the Default Gradient node combined with other nodes to create custom effects for the gradient render type. For example, you can multiply the output of this node with a **Color** node to filter unwanted colors from the gradient. + +## Ports + +| Name | Direction | Type | Description | +|----------|-----------|---------|--------------------------------------| +| Gradient | Output | Gradient| The gradient specified for the UI element. | + + +## Additional resources + +- [Default Solid node](xref:default-solid-node) +- [Default Texture node](xref:default-texture-node) +- [Default SDF Text node](xref:default-sdf-text-node) +- [Default Bitmap Text node](xref:default-bitmap-text-node) +- [Render Type Branch node](xref:render-type-branch-node) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/default-sdf-text-node.md b/Packages/com.unity.shadergraph/Documentation~/default-sdf-text-node.md new file mode 100644 index 00000000000..efc9550749e --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/default-sdf-text-node.md @@ -0,0 +1,24 @@ +--- +uid: default-sdf-text-node +--- + +# Default SDF Text node + +[!include[](include_note_uitk.md)] + +Outputs the text color for SDF text rendering and includes a tint input you can use to modify the color of the text. For example, if you connect a **Color** node to the tint input and set it to red, and connect the output to SDF text render type, the text color of your SDF text becomes red. + +## Ports + +| Name | Direction | Type | Description | +|----------|-----------|---------|--------------------------------------| +| Tint | Input | Color | The tint color to apply to the text. | +| SDF Text | Output | Texture | The rendered SDF text as a texture. | + +## Additional resources + +- [Default Solid node](xref:default-solid-node) +- [Default Gradient node](xref:default-gradient-node) +- [Default Texture node](xref:default-texture-node) +- [Default Bitmap Text node](xref:default-bitmap-text-node) +- [Render Type Branch node](xref:render-type-branch-node) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/default-solid-node.md b/Packages/com.unity.shadergraph/Documentation~/default-solid-node.md new file mode 100644 index 00000000000..fa0a33496d5 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/default-solid-node.md @@ -0,0 +1,25 @@ +--- +uid: default-solid-node +--- + +# Default Solid node + +[!include[](include_note_uitk.md)] + +Outputs the solid color specified for your UI elements, such as the background color of a button. For example, if you set the background color of a button to yellow, the **Default Solid** node outputs yellow for that button. + +You can use this node combined with other nodes to create custom effects for the Solid color render type. For example, you can multiply the output of this node with a **Color** node to filter unwanted colors. + +## Ports + +| Name | Direction | Type | Description | +|----------|-----------|---------|--------------------------------------| +| Solid | Output | Color | The solid color specified for the UI element. | + +## Additional resources + +- [Default Gradient node](xref:default-gradient-node) +- [Default Texture node](xref:default-texture-node) +- [Default SDF Text node](xref:default-sdf-text-node) +- [Default Bitmap Text node](xref:default-bitmap-text-node) +- [Render Type Branch node](xref:render-type-branch-node) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/default-texture-node.md b/Packages/com.unity.shadergraph/Documentation~/default-texture-node.md new file mode 100644 index 00000000000..4c4bf54e5c6 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/default-texture-node.md @@ -0,0 +1,26 @@ +--- +uid: default-texture-node +--- + +# Default Texture node + +[!include[](include_note_uitk.md)] + +Provides the texture assigned to the UI element. + +You can use this node to access the texture assigned to a UI element, such as a Texture 2D background image. The node includes UV and tint inputs that allow you to modify how the texture is applied. For example, you can connect a **Tiling and Offset** node to the UV input to create a repeating effect for the background image, or connect a **Color** node to the tint input to adjust the tint color of the background image. + +## Ports + +| Name | Direction | Type | Description | +|----------|-----------|---------|--------------------------------------| +| UV | Input | Vector2 | The UV coordinates for the texture. | +| Tint | Input | Color | The tint color to apply to the texture. | +| Texture | Output | Texture | The resulting texture. | + +## Additional resources + +- [Default Solid node](xref:default-solid-node) +- [Default Gradient node](xref:default-gradient-node) +- [Default SDF Text node](xref:default-sdf-text-node) +- [Default Bitmap Text node](xref:default-bitmap-text) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/element-layout-uv-node.md b/Packages/com.unity.shadergraph/Documentation~/element-layout-uv-node.md new file mode 100644 index 00000000000..e13d1d67bad --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/element-layout-uv-node.md @@ -0,0 +1,20 @@ +--- +uid: element-layout-uv-node +--- + +# Element Layout UV node + +[!include[](include_note_uitk.md)] + +Outputs the geometric coordinates (UV) relative to the UI element, such as a button. It allows you to determine your position within the element itself, regardless of the texture applied. It represents the relative coordinates within the layout rect of the visual element, where `(0,0)` is the bottom-left corner and `(1,1)` is the top-right corner. + +## Ports + +| Name | Direction | Type | Description | +|--------------------|-----------|---------|--------------------------------------| +| Layout UV | Output | Vector2 | The UV coordinates for the element. | + +## Additional resources + +- [Element Texture UV node](xref:element-texture-uv-node) +- [Element Texture Size node](xref:element-texture-size-node) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/element-texture-size-node.md b/Packages/com.unity.shadergraph/Documentation~/element-texture-size-node.md new file mode 100644 index 00000000000..58623497a19 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/element-texture-size-node.md @@ -0,0 +1,31 @@ +--- +uid: element-texture-size-node +--- + +# Element Texture Size node + +[!include[](include_note_uitk.md)] + +Outputs the texture size that's assigned to the UI element. The output is undefined if the render type is solid. + +This node is similar to the [**Texture Size**](Texture-Size-node.md) node, but it specifically retrieves the size of the texture assigned to the UI element. This is important because UI elements can have textures assigned through styles or images, and these textures might differ from the material's main texture. For example, a button might have a background image set through its style, which is different from the material's texture. + +Follow these guidelines to decide which node to use: + +- Use the **Texture Size** node if you want to apply a texture-based effect that's not element-specific (for example, a soft mask). In this case, set the texture explicitly on the material and use the Texture Size node to get its size. +- Use the **Element Texture Size** node if you need the size of the texture assigned to a specific VisualElement, such as a background image or an image element. This includes textures set via styles or textures used in custom meshes drawn with `MeshGenerationContext.DrawMesh(texture)`. + +## Ports + +| Name | Direction | Type | Description | +|--------------------|-----------|---------|--------------------------------------| +| Width | Output | Float | The width of the texture. | +| Height | Output | Float | The height of the texture. | +| Texel Width | Output | Float | The texel width of the texture. | +| Texel Height | Output | Float | The texel height of the texture. | + +## Additional resources + +- [Element Texture UV node](xref:element-texture-uv-node) +- [Element Layout UV node](xref:element-layout-uv-node) +- [Texture Size node](Texture-Size-node.md) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/element-texture-uv-node.md b/Packages/com.unity.shadergraph/Documentation~/element-texture-uv-node.md new file mode 100644 index 00000000000..6fbae88b9db --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/element-texture-uv-node.md @@ -0,0 +1,26 @@ +--- +uid: element-texture-uv-node +--- + +# Element Texture UV node + +[!include[](include_note_uitk.md)] + +Outputs the texture coordinates (UV) of the texture mapped onto a UI element. + +This node might output different coordinates than the [**Element Layout UV**](xref:element-layout-uv-node) node, which provides coordinates within the element's bounding rectangle. The coordinates are more likely to be different if you tile, offset, or transform the texture. + +If the texture is part of an atlas, its UV coordinates only map to a specific region within the atlas. If you repeat UV coordinates or sample outside them, the data comes from other textures in the atlas. Use texture coordinates (UV) when you need precise control over how a texture appears on a UI element, and be mindful of atlas constraints. + +The texture UV can also originate from a custom mesh when you call [`MeshGenerationContext.DrawMesh`](xref:UnityEngine.UIElements.MeshGenerationContext.DrawMesh). In such cases, the UV values might vary depending on the mesh data. + +## Ports + +| Name | Direction | Type | Description | +|-----------------|-----------|---------|--------------------------------------| +| Texture UV | Output | Vector2 | The UV coordinates for the texture. | + +## Additional resources + +- [Element Layout UV node](xref:element-layout-uv-node) +- [Element Texture Size node](xref:element-texture-size-node) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/include_note_uitk.md b/Packages/com.unity.shadergraph/Documentation~/include_note_uitk.md new file mode 100644 index 00000000000..29add04c898 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/include_note_uitk.md @@ -0,0 +1,2 @@ +> [!NOTE] +> Use this node only in shaders with **Material** set to **UI** for UI Toolkit. Using it elsewhere can lead to unexpected behavior or errors. For information on how to create shaders for UI Toolkit, refer to [UI Shader Graph](xref:uie-ui-shader-graph). \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/render-type-branch-node.md b/Packages/com.unity.shadergraph/Documentation~/render-type-branch-node.md new file mode 100644 index 00000000000..1d0f66862cd --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/render-type-branch-node.md @@ -0,0 +1,32 @@ +--- +uid: render-type-branch-node +--- + +# Render Type Branch node + +[!include[](include_note_uitk.md)] + +The Render Type Branch node routes inputs based on the current render type and outputs the appropriate results for the Fragment node. You can connect the inputs to various nodes to define how each render type is processed. + +UI Shader Graph provides default nodes, such as the [Default Solid node](xref:default-solid-node) or [Default Texture node](xref:default-texture-node), for each render type. You can use these nodes as starting points when customizing your shaders. For best performance, if you want an input to use its default value for a render type, leave it disconnected rather than connecting it to a default node. The Render Type Branch node automatically uses the default values for that input and handles branching more efficiently when you disconnect inputs. Only connect these default nodes if you want to customize the shader’s behavior. + +## Ports + +| Name | Direction | Type | Description | +|------------|-----------|---------|--------------------------------------| +| Solid | Input | Color | The color to use for backgrounds and borders. | +| Texture | Input | Texture | The texture to use for texture graphics. | +| SDF Text | Input | Texture | The texture to use for SDF text. | +| Bitmap Text| Input | Texture | The texture to use for bitmap text. | +| Gradient | Input | Texture | The texture to use for vector graphic gradients.| +| Color | Output | Color | The output color. | +| Alpha | Output | Float | The output alpha value. | + +## Additional resources + +- [Render Type node](xref:render-type-node) +- [Default Solid node](xref:default-solid-node) +- [Default Texture node](xref:default-texture-node) +- [Default SDF Text node](xref:default-sdf-text-node) +- [Default Bitmap Text node](xref:default-bitmap-text-node) +- [Default Gradient node](xref:default-gradient-node) diff --git a/Packages/com.unity.shadergraph/Documentation~/render-type-node.md b/Packages/com.unity.shadergraph/Documentation~/render-type-node.md new file mode 100644 index 00000000000..8cd7243b431 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/render-type-node.md @@ -0,0 +1,23 @@ +--- +uid: render-type-node +--- + +# Render Type node + +[!include[](include_note_uitk.md)] + +The Render Type node outputs the current render type the shader is processing. You can use this node to create custom logic based on the render type. For example, you can use the output of the Render Type node to control logic that changes behavior depending on the render type. + +## Ports + +| Name | Direction | Type | Description | +|------------|-----------|---------|--------------------------------------| +| Solid | Output | Boolean | True when the shader is processing the Solid render type. | +| Texture | Output | Boolean | True when the shader is processing the Texture render type. | +| SDF Text | Output | Boolean | True when the shader is processing the SDF Text render type. | +| Bitmap Text| Output | Boolean | True when the shader is processing the Bitmap Text render type. | +| Gradient | Output | Boolean | True when the shader is processing the Gradient render type. | + +## Additional resources + +- [Render Type Branch node](xref:render-type-branch-node) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/sample-element-texture-node.md b/Packages/com.unity.shadergraph/Documentation~/sample-element-texture-node.md new file mode 100644 index 00000000000..1b7077916de --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/sample-element-texture-node.md @@ -0,0 +1,28 @@ +--- +uid: sample-element-texture-node +--- + +# Sample Element Texture node + +[!include[](include_note_uitk.md)] + +The Sample Element Texture node samples a texture at specific UV coordinates. You can use this node to get multiple samples of the texture assigned to the element, for example to create complex visual effects or manipulate the texture. + +Sampling multiple times with this node is more efficient than using several separate nodes for individual samples. This is because each node introduces overhead by traversing internal branches to select the correct texture slot. By combining multiple samples into a single node, you reduce this overhead and improve performance. + +## Ports + +| Name | Direction | Type | Description | +|---------|-----------|---------|--------------------------------------| +| UV 0 | Input | Vector2 | The UV coordinates to sample. | +| UV 1 | Input | Vector2 | The second set of UV coordinates to sample. | +| UV 2 | Input | Vector2 | The third set of UV coordinates to sample. | +| UV 3 | Input | Vector2 | The fourth set of UV coordinates to sample. | +| Color 0 | Output | Color | The sampled color from UV 0. | +| Color 1 | Output | Color | The sampled color from UV 1. | +| Color 2 | Output | Color | The sampled color from UV 2. | +| Color 3 | Output | Color | The sampled color from UV 3. | + +## Additional resources + +- [Create and apply custom shaders](xref:uie-create-apply-custom-shaders) diff --git a/Packages/com.unity.shadergraph/Documentation~/ui-nodes.md b/Packages/com.unity.shadergraph/Documentation~/ui-nodes.md new file mode 100644 index 00000000000..148d671143d --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/ui-nodes.md @@ -0,0 +1,20 @@ +--- +uid: ui-nodes +--- + +# UI nodes + +| **Topic** | **Description** | +|-------------|------------------| +| [Default Solid](default-solid-node.md) | Outputs the solid color specified for your UI elements. | +| [Default Texture](default-texture-node.md) | Provides a pre-defined texture for your UI elements. | +| [Default SDF Text](default-sdf-text-node.md) | Provides the text color set for SDF text rendering and includes a tint input to modify the color of the text. | +| [Default Bitmap Text](default-bitmap-text-node.md) | Provides the text color set for bitmap text rendering and includes a tint input to modify the color of the text. | +| [Default Gradient](default-gradient-node.md) | Outputs the gradient specified for your UI elements. | +| [Render Type](render-type-node.md) | Outputs the current render type for conditional logic in the shader. | +| [Render Type Branch](render-type-branch-node.md) | Routes inputs based on the current render type and outputs the appropriate result. | +| [Sample Element Texture](sample-element-texture-node.md) | Samples a texture at specific UV coordinates. | + +## Additional resources + +- [Create and apply custom shaders](xref:uie-create-apply-custom-shaders) \ No newline at end of file From 34307f5a9221de5ead1648537aa7f21781ebf678 Mon Sep 17 00:00:00 2001 From: Karl Jones Date: Thu, 2 Oct 2025 11:15:48 +0000 Subject: [PATCH 011/115] [content automatically redacted] touching PlatformDependent folder --- .../Editor/Drawing/Views/ResizableElement.cs | 3 ++- .../Editor/GraphView/BoundsRecorder/VFXBoundsRecorderField.cs | 3 ++- .../Editor/GraphView/BoundsRecorder/VFXBoundsSelector.cs | 3 ++- .../Editor/GraphView/VFXComponentBoard.cs | 4 +++- .../Editor/Utils/VFXContextBorder.cs | 3 ++- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Packages/com.unity.shadergraph/Editor/Drawing/Views/ResizableElement.cs b/Packages/com.unity.shadergraph/Editor/Drawing/Views/ResizableElement.cs index 84a545d8cc0..23e59532534 100644 --- a/Packages/com.unity.shadergraph/Editor/Drawing/Views/ResizableElement.cs +++ b/Packages/com.unity.shadergraph/Editor/Drawing/Views/ResizableElement.cs @@ -9,7 +9,8 @@ namespace UnityEditor.ShaderGraph.Drawing class ResizableElementFactory : UxmlFactory { } - class ResizableElement : VisualElement + [UxmlElement] + partial class ResizableElement : VisualElement { Dictionary m_Resizers = new Dictionary(); diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/BoundsRecorder/VFXBoundsRecorderField.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/BoundsRecorder/VFXBoundsRecorderField.cs index dcc1b3f33e8..b1132f70d70 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/BoundsRecorder/VFXBoundsRecorderField.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/BoundsRecorder/VFXBoundsRecorderField.cs @@ -14,7 +14,8 @@ namespace UnityEditor.VFX.UI { - class VFXBoundsRecorderField : VisualElement, ISelectable + [UxmlElement] + partial class VFXBoundsRecorderField : VisualElement, ISelectable { private Button m_Button; private VisualElement m_Divider; diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/BoundsRecorder/VFXBoundsSelector.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/BoundsRecorder/VFXBoundsSelector.cs index 01e9d7fd682..1646c584d30 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/BoundsRecorder/VFXBoundsSelector.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/BoundsRecorder/VFXBoundsSelector.cs @@ -5,7 +5,8 @@ namespace UnityEditor.VFX.UI { - class VFXBoundsSelector : VisualElement, ISelection + [UxmlElement] + partial class VFXBoundsSelector : VisualElement, ISelection { [Obsolete("VFXBoundsSelectorFactory is deprecated and will be removed. Use UxmlElementAttribute instead.", false)] class VFXBoundsSelectorFactory : UxmlFactory diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/VFXComponentBoard.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/VFXComponentBoard.cs index 6ed0767b61c..75c801a5368 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/VFXComponentBoard.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/VFXComponentBoard.cs @@ -797,7 +797,9 @@ public void OnResized() [System.Obsolete("VFXComponentBoardEventUIFactory is deprecated and will be removed. Use UxmlElementAttribute instead.", false)] class VFXComponentBoardEventUIFactory : UxmlFactory { } - class VFXComponentBoardEventUI : VisualElement + + [UxmlElement] + partial class VFXComponentBoardEventUI : VisualElement { public VFXComponentBoardEventUI() { diff --git a/Packages/com.unity.visualeffectgraph/Editor/Utils/VFXContextBorder.cs b/Packages/com.unity.visualeffectgraph/Editor/Utils/VFXContextBorder.cs index 49a46bd8749..12ededf8920 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Utils/VFXContextBorder.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Utils/VFXContextBorder.cs @@ -12,7 +12,8 @@ namespace UnityEditor.VFX.UI class VFXContextBorderFactory : UxmlFactory { } - class VFXContextBorder : ImmediateModeElement, IDisposable + [UxmlElement] + partial class VFXContextBorder : ImmediateModeElement, IDisposable { Material m_Mat; From a4e4eeab8922095e0f61ad548efd943081bb6fb9 Mon Sep 17 00:00:00 2001 From: Erik Hakala Date: Thu, 2 Oct 2025 11:15:56 +0000 Subject: [PATCH 012/115] Fix stale texture handle in ColorGradingLutPass --- .../2D/Rendergraph/Renderer2DRendergraph.cs | 2 +- .../Runtime/Passes/ColorGradingLutPass.cs | 43 ++++++------------- .../Runtime/UniversalRendererRenderGraph.cs | 17 ++++---- 3 files changed, 21 insertions(+), 41 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs index de6ceb86ebd..82a1281f938 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs @@ -731,7 +731,7 @@ private void OnMainRendering(RenderGraph renderGraph) if (requiredColorGradingLutPass) { TextureHandle internalColorLut = TextureHandle.nullHandle; - m_ColorGradingLutPassRenderGraph.Render(renderGraph, frameData, ref internalColorLut); + m_ColorGradingLutPassRenderGraph.Render(renderGraph, frameData, out internalColorLut); commonResourceData.internalColorLut = internalColorLut; } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ColorGradingLutPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ColorGradingLutPass.cs index 4aebdea7336..07d6bf46e81 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ColorGradingLutPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ColorGradingLutPass.cs @@ -25,19 +25,6 @@ public partial class ColorGradingLutPass : ScriptableRenderPass bool m_AllowColorGradingACESHDR = true; - private TextureHandle m_ColorLutTexture; - - /// - /// Set the texture to render the color grading LUT into. - /// If this is not set, the pass will create its own internal texture. - /// If the pass creates its own internal texture, it can be accessed through this property. - /// - internal TextureHandle colorLutTexture - { - get => m_ColorLutTexture; - set => m_ColorLutTexture = value; - } - /// /// Creates a new ColorGradingLutPass instance. /// @@ -159,7 +146,7 @@ private class PassData internal Material lutBuilderLdr; internal Material lutBuilderHdr; - internal TextureHandle colorLutTarget; + internal TextureHandle internalColorLut; internal int lutSize; internal bool hdrGrading; internal bool allowColorGradingACESHDR; @@ -295,24 +282,20 @@ private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RTHa } } - internal void Render(RenderGraph renderGraph, ContextContainer frameData, ref TextureHandle colorLutTarget) + internal void Render(RenderGraph renderGraph, ContextContainer frameData, out TextureHandle internalColorLut) { UniversalCameraData cameraData = frameData.Get(); UniversalPostProcessingData postProcessingData = frameData.Get(); - // If the LUT target is not set, we create a new one. Otherwise, reuse the external one. - if (!colorLutTarget.IsValid()) - { - this.ConfigureDescriptor(in postProcessingData, out var lutDesc, out var filterMode); - colorLutTarget = UniversalRenderer.CreateRenderGraphTexture(renderGraph, lutDesc, k_InternalColorLutName, true, filterMode); - } + this.ConfigureDescriptor(in postProcessingData, out var lutDesc, out var filterMode); + internalColorLut = UniversalRenderer.CreateRenderGraphTexture(renderGraph, lutDesc, k_InternalColorLutName, true, filterMode); using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { passData.cameraData = cameraData; - passData.colorLutTarget = colorLutTarget; - builder.SetRenderAttachment(colorLutTarget, 0, AccessFlags.WriteAll); + passData.internalColorLut = internalColorLut; + builder.SetRenderAttachment(internalColorLut, 0, AccessFlags.WriteAll); passData.lutBuilderLdr = m_LutBuilderLdr; passData.lutBuilderHdr = m_LutBuilderHdr; passData.allowColorGradingACESHDR = m_AllowColorGradingACESHDR; @@ -324,7 +307,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, ref Te builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => { - ExecutePass(context.cmd, data, data.colorLutTarget); + ExecutePass(context.cmd, data, data.internalColorLut); }); return; @@ -334,14 +317,12 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, ref Te /// public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - Render(renderGraph, frameData, ref m_ColorLutTexture); - - // It is publicly documented that the LUT pass writes to resourceData.internalColorLut. - // This behavior is kept for backwards compatibility. It is also a simplifying helper for the common case of single LUT. - // In the case of multiple LUTs users are expected to use the 'colorLutTexture' property to get (and/or set) each LUT.separately. - // By default, this will only write the last rendered LUT into the internalColorLut. var resourceData = frameData.Get(); - resourceData.internalColorLut = m_ColorLutTexture; + + TextureHandle colorLut; + Render(renderGraph, frameData, out colorLut); + + resourceData.internalColorLut = colorLut; } /// diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index 29587c6f9e0..7b9ef6af09a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -277,14 +277,14 @@ internal static void GetTextureDesc(in RenderTextureDescriptor desc, out Texture rgDesc.bindTextureMS = desc.bindMS; rgDesc.format = (desc.depthStencilFormat != GraphicsFormat.None) ? desc.depthStencilFormat : desc.graphicsFormat; rgDesc.isShadowMap = desc.shadowSamplingMode != ShadowSamplingMode.None && desc.depthStencilFormat != GraphicsFormat.None; - rgDesc.slices = desc.volumeDepth; - rgDesc.msaaSamples = (MSAASamples)desc.msaaSamples; - rgDesc.enableRandomWrite = desc.enableRandomWrite; - rgDesc.enableShadingRate = desc.enableShadingRate; - rgDesc.useDynamicScale = desc.useDynamicScale; - rgDesc.useDynamicScaleExplicit = desc.useDynamicScaleExplicit; - rgDesc.vrUsage = desc.vrUsage; - } + rgDesc.slices = desc.volumeDepth; + rgDesc.msaaSamples = (MSAASamples)desc.msaaSamples; + rgDesc.enableRandomWrite = desc.enableRandomWrite; + rgDesc.enableShadingRate = desc.enableShadingRate; + rgDesc.useDynamicScale = desc.useDynamicScale; + rgDesc.useDynamicScaleExplicit = desc.useDynamicScaleExplicit; + rgDesc.vrUsage = desc.vrUsage; + } internal static TextureHandle CreateRenderGraphTexture(RenderGraph renderGraph, in TextureDesc desc, string name, bool clear, Color clearColor, FilterMode filterMode = FilterMode.Point, TextureWrapMode wrapMode = TextureWrapMode.Clamp, bool discardOnLastUse = false) @@ -764,7 +764,6 @@ private void OnBeforeRendering(RenderGraph renderGraph) if (requiredColorGradingLutPass) { m_ColorGradingLutPassRenderGraph.RecordRenderGraph(renderGraph, frameData); - resourceData.internalColorLut = m_ColorGradingLutPassRenderGraph.colorLutTexture; } } From 424bee2e1ccac9f147b5e0fb39b97a032a679efe Mon Sep 17 00:00:00 2001 From: Trudy Spiller Date: Thu, 2 Oct 2025 11:15:57 +0000 Subject: [PATCH 013/115] Revert Vector operators --- .../Runtime/UnifiedRayTracing/Common/AccelStructAdapter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/Common/AccelStructAdapter.cs b/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/Common/AccelStructAdapter.cs index 4b9bb1e8e8e..a14bccf7ed8 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/Common/AccelStructAdapter.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/Common/AccelStructAdapter.cs @@ -132,7 +132,7 @@ void AddTrees(TerrainDesc terrainDesc, ref List instanceHandles) { TerrainData terrainData = terrainDesc.terrain.terrainData; float4x4 terrainLocalToWorld = terrainDesc.localToWorldMatrix; - float3 positionScale = new float3((float)terrainData.heightmapResolution, 1.0f, (float)terrainData.heightmapResolution) * (float3)(terrainData.heightmapScale); + float3 positionScale = new float3((float)terrainData.heightmapResolution, 1.0f, (float)terrainData.heightmapResolution) * terrainData.heightmapScale; float3 positionOffset = new float3(terrainLocalToWorld[3].x, terrainLocalToWorld[3].y, terrainLocalToWorld[3].z); foreach (var treeInstance in terrainData.treeInstances) From 68fca9c7ed3103da201b24801f45f2399a1489ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Chapelain?= Date: Thu, 2 Oct 2025 11:16:02 +0000 Subject: [PATCH 014/115] [SRP] Fix missing reference script error in RSUV LookDev Scene --- .../Scenes/LookDev.unity | 109 +++++------------- .../Scenes/LookDev.unity | 88 ++++---------- 2 files changed, 48 insertions(+), 149 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Samples~/RendererShaderUserValueSamples/Scenes/LookDev.unity b/Packages/com.unity.render-pipelines.high-definition/Samples~/RendererShaderUserValueSamples/Scenes/LookDev.unity index a56a8cf7b99..450b9d273a9 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Samples~/RendererShaderUserValueSamples/Scenes/LookDev.unity +++ b/Packages/com.unity.render-pipelines.high-definition/Samples~/RendererShaderUserValueSamples/Scenes/LookDev.unity @@ -500,6 +500,18 @@ PrefabInstance: propertyPath: m_Layer value: 2 objectReference: {fileID: 0} + - target: {fileID: 8553631396527524258, guid: eeab7b6e71b7483489dd15b45d828c30, type: 3} + propertyPath: m_LocalScale.x + value: 0.9458514 + objectReference: {fileID: 0} + - target: {fileID: 8553631396527524258, guid: eeab7b6e71b7483489dd15b45d828c30, type: 3} + propertyPath: m_LocalScale.y + value: 0.9458514 + objectReference: {fileID: 0} + - target: {fileID: 8553631396527524258, guid: eeab7b6e71b7483489dd15b45d828c30, type: 3} + propertyPath: m_LocalScale.z + value: 0.9458514 + objectReference: {fileID: 0} - target: {fileID: 8553631396527524258, guid: eeab7b6e71b7483489dd15b45d828c30, type: 3} propertyPath: m_LocalPosition.x value: 0 @@ -881,51 +893,6 @@ Transform: m_Children: [] m_Father: {fileID: 59383918} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1045504573 -GameObject: - m_ObjectHideFlags: 19 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1045504575} - - component: {fileID: 1045504574} - m_Layer: 0 - m_Name: SceneIDMap - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1045504574 -MonoBehaviour: - m_ObjectHideFlags: 19 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1045504573} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1642155417} - m_Name: - m_EditorClassIdentifier: - m_Entries: [] ---- !u!4 &1045504575 -Transform: - m_ObjectHideFlags: 19 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1045504573} - serializedVersion: 2 - 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1191974066 GameObject: m_ObjectHideFlags: 0 @@ -1135,21 +1102,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!115 &1642155417 -MonoScript: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - serializedVersion: 7 - m_DefaultReferences: {} - m_Icon: {fileID: 0} - m_Type: 0 - m_ExecutionOrder: 0 - m_ClassName: SceneObjectIDMapSceneAsset - m_Namespace: UnityEngine.Rendering.HighDefinition - m_AssemblyName: Unity.RenderPipelines.HighDefinition.Runtime --- !u!1 &119734848978804391 GameObject: m_ObjectHideFlags: 0 @@ -1232,7 +1184,7 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1659505970839723442} m_Enabled: 1 - serializedVersion: 12 + serializedVersion: 13 m_Type: 0 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 318.31006 @@ -1284,7 +1236,7 @@ Light: m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 0 m_ForceVisible: 0 - m_ShadowRadius: 0.025 + m_ShapeRadius: 0.025 m_ShadowAngle: 0 m_LightUnit: 0 m_LuxAtDistance: 1 @@ -1620,6 +1572,7 @@ MonoBehaviour: m_ShapeWidth: -1 m_ShapeHeight: -1 m_AspectRatio: 1 + m_ShapeRadius: -1 m_SpotIESCutoffPercent: 100 m_LightDimmer: 1 m_VolumetricDimmer: 1 @@ -1628,7 +1581,6 @@ MonoBehaviour: m_AffectDiffuse: 1 m_AffectSpecular: 1 m_NonLightmappedOnly: 0 - m_ShapeRadius: 0.025 m_SoftnessScale: 1 m_UseCustomSpotLightShadowCone: 1 m_CustomSpotLightShadowCone: 100 @@ -1666,7 +1618,6 @@ MonoBehaviour: m_FilterTracedShadow: 1 m_FilterSizeTraced: 16 m_SunLightConeAngle: 0.5 - m_LightShadowRadius: 0.5 m_SemiTransparentShadow: 0 m_ColorShadow: 1 m_DistanceBasedFiltering: 0 @@ -1734,7 +1685,7 @@ MonoBehaviour: m_AreaLightEmissiveMeshShadowCastingMode: 0 m_AreaLightEmissiveMeshMotionVectorGenerationMode: 0 m_AreaLightEmissiveMeshLayer: -1 - m_Version: 14 + m_Version: 15 m_ObsoleteShadowResolutionTier: 1 m_ObsoleteUseShadowQualitySettings: 0 m_ObsoleteCustomShadowResolution: 512 @@ -1810,7 +1761,7 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 927598970997111942} m_Enabled: 1 - serializedVersion: 12 + serializedVersion: 13 m_Type: 0 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 92.96667 @@ -1862,7 +1813,7 @@ Light: m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 m_ForceVisible: 0 - m_ShadowRadius: 0.025 + m_ShapeRadius: 0.025 m_ShadowAngle: 0 m_LightUnit: 0 m_LuxAtDistance: 1 @@ -1941,6 +1892,7 @@ MonoBehaviour: m_ShapeWidth: -1 m_ShapeHeight: -1 m_AspectRatio: 1 + m_ShapeRadius: -1 m_SpotIESCutoffPercent: 100 m_LightDimmer: 1 m_VolumetricDimmer: 1 @@ -1949,7 +1901,6 @@ MonoBehaviour: m_AffectDiffuse: 1 m_AffectSpecular: 1 m_NonLightmappedOnly: 0 - m_ShapeRadius: 0.025 m_SoftnessScale: 1 m_UseCustomSpotLightShadowCone: 0 m_CustomSpotLightShadowCone: 30 @@ -1987,7 +1938,6 @@ MonoBehaviour: m_FilterTracedShadow: 1 m_FilterSizeTraced: 16 m_SunLightConeAngle: 0.5 - m_LightShadowRadius: 0.5 m_SemiTransparentShadow: 0 m_ColorShadow: 1 m_DistanceBasedFiltering: 0 @@ -2055,7 +2005,7 @@ MonoBehaviour: m_AreaLightEmissiveMeshShadowCastingMode: 0 m_AreaLightEmissiveMeshMotionVectorGenerationMode: 0 m_AreaLightEmissiveMeshLayer: -1 - m_Version: 14 + m_Version: 15 m_ObsoleteShadowResolutionTier: 1 m_ObsoleteUseShadowQualitySettings: 0 m_ObsoleteCustomShadowResolution: 512 @@ -2644,6 +2594,7 @@ MonoBehaviour: m_ShapeWidth: -1 m_ShapeHeight: -1 m_AspectRatio: 1 + m_ShapeRadius: -1 m_SpotIESCutoffPercent: 100 m_LightDimmer: 1 m_VolumetricDimmer: 1 @@ -2652,7 +2603,6 @@ MonoBehaviour: m_AffectDiffuse: 1 m_AffectSpecular: 1 m_NonLightmappedOnly: 0 - m_ShapeRadius: 0.025 m_SoftnessScale: 1 m_UseCustomSpotLightShadowCone: 0 m_CustomSpotLightShadowCone: 30 @@ -2690,7 +2640,6 @@ MonoBehaviour: m_FilterTracedShadow: 1 m_FilterSizeTraced: 16 m_SunLightConeAngle: 0.5 - m_LightShadowRadius: 0.5 m_SemiTransparentShadow: 0 m_ColorShadow: 1 m_DistanceBasedFiltering: 0 @@ -2758,7 +2707,7 @@ MonoBehaviour: m_AreaLightEmissiveMeshShadowCastingMode: 0 m_AreaLightEmissiveMeshMotionVectorGenerationMode: 0 m_AreaLightEmissiveMeshLayer: -1 - m_Version: 14 + m_Version: 15 m_ObsoleteShadowResolutionTier: 1 m_ObsoleteUseShadowQualitySettings: 0 m_ObsoleteCustomShadowResolution: 512 @@ -2787,7 +2736,7 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1935158662385014115} m_Enabled: 1 - serializedVersion: 12 + serializedVersion: 13 m_Type: 0 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 160.46211 @@ -2839,7 +2788,7 @@ Light: m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 m_ForceVisible: 0 - m_ShadowRadius: 0.025 + m_ShapeRadius: 0.025 m_ShadowAngle: 0 m_LightUnit: 0 m_LuxAtDistance: 1 @@ -3185,6 +3134,7 @@ MonoBehaviour: m_ShapeWidth: -1 m_ShapeHeight: -1 m_AspectRatio: 1 + m_ShapeRadius: -1 m_SpotIESCutoffPercent: 100 m_LightDimmer: 1 m_VolumetricDimmer: 1 @@ -3193,7 +3143,6 @@ MonoBehaviour: m_AffectDiffuse: 1 m_AffectSpecular: 1 m_NonLightmappedOnly: 0 - m_ShapeRadius: 0.025 m_SoftnessScale: 1 m_UseCustomSpotLightShadowCone: 0 m_CustomSpotLightShadowCone: 30 @@ -3231,7 +3180,6 @@ MonoBehaviour: m_FilterTracedShadow: 1 m_FilterSizeTraced: 16 m_SunLightConeAngle: 0.5 - m_LightShadowRadius: 0.5 m_SemiTransparentShadow: 0 m_ColorShadow: 1 m_DistanceBasedFiltering: 0 @@ -3299,7 +3247,7 @@ MonoBehaviour: m_AreaLightEmissiveMeshShadowCastingMode: 0 m_AreaLightEmissiveMeshMotionVectorGenerationMode: 0 m_AreaLightEmissiveMeshLayer: -1 - m_Version: 14 + m_Version: 15 m_ObsoleteShadowResolutionTier: 1 m_ObsoleteUseShadowQualitySettings: 0 m_ObsoleteCustomShadowResolution: 512 @@ -4012,7 +3960,7 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8598119875628110629} m_Enabled: 1 - serializedVersion: 12 + serializedVersion: 13 m_Type: 0 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 352.14642 @@ -4064,7 +4012,7 @@ Light: m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 m_ForceVisible: 0 - m_ShadowRadius: 0.025 + m_ShapeRadius: 0.025 m_ShadowAngle: 0 m_LightUnit: 0 m_LuxAtDistance: 1 @@ -4536,7 +4484,6 @@ SceneRoots: - {fileID: 450753641} - {fileID: 7057516004932664435} - {fileID: 59383918} - - {fileID: 1045504575} - {fileID: 1191974067} - {fileID: 1522427161} - {fileID: 1276148452} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/RendererShaderUserValueSamples/Scenes/LookDev.unity b/Packages/com.unity.render-pipelines.universal/Samples~/RendererShaderUserValueSamples/Scenes/LookDev.unity index 4cd0de9ea43..a188c480a23 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/RendererShaderUserValueSamples/Scenes/LookDev.unity +++ b/Packages/com.unity.render-pipelines.universal/Samples~/RendererShaderUserValueSamples/Scenes/LookDev.unity @@ -184,6 +184,18 @@ PrefabInstance: propertyPath: eyebrowsStyle value: 0 objectReference: {fileID: 0} + - target: {fileID: 8553631396527524258, guid: eeab7b6e71b7483489dd15b45d828c30, type: 3} + propertyPath: m_LocalScale.x + value: 1.0618654 + objectReference: {fileID: 0} + - target: {fileID: 8553631396527524258, guid: eeab7b6e71b7483489dd15b45d828c30, type: 3} + propertyPath: m_LocalScale.y + value: 1.0618654 + objectReference: {fileID: 0} + - target: {fileID: 8553631396527524258, guid: eeab7b6e71b7483489dd15b45d828c30, type: 3} + propertyPath: m_LocalScale.z + value: 1.0618654 + objectReference: {fileID: 0} - target: {fileID: 8553631396527524258, guid: eeab7b6e71b7483489dd15b45d828c30, type: 3} propertyPath: m_LocalPosition.x value: 0 @@ -446,50 +458,6 @@ Transform: m_Children: [] m_Father: {fileID: 59383918} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1045504573 -GameObject: - m_ObjectHideFlags: 19 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1045504575} - - component: {fileID: 1045504574} - m_Layer: 0 - m_Name: SceneIDMap - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1045504574 -MonoBehaviour: - m_ObjectHideFlags: 19 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1045504573} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1642155417} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1045504575 -Transform: - m_ObjectHideFlags: 19 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1045504573} - serializedVersion: 2 - 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1143907757 GameObject: m_ObjectHideFlags: 0 @@ -681,21 +649,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!115 &1642155417 -MonoScript: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - serializedVersion: 7 - m_DefaultReferences: {} - m_Icon: {fileID: 0} - m_Type: 0 - m_ExecutionOrder: 0 - m_ClassName: SceneObjectIDMapSceneAsset - m_Namespace: UnityEngine.Rendering.HighDefinition - m_AssemblyName: Unity.RenderPipelines.HighDefinition.Runtime --- !u!1 &119734848978804391 GameObject: m_ObjectHideFlags: 0 @@ -778,7 +731,7 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1659505970839723442} m_Enabled: 1 - serializedVersion: 12 + serializedVersion: 13 m_Type: 0 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 30 @@ -830,7 +783,7 @@ Light: m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 0 m_ForceVisible: 0 - m_ShadowRadius: 0.025 + m_ShapeRadius: 0.025 m_ShadowAngle: 0 m_LightUnit: 0 m_LuxAtDistance: 1 @@ -1214,7 +1167,7 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 927598970997111942} m_Enabled: 1 - serializedVersion: 12 + serializedVersion: 13 m_Type: 0 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 1.98 @@ -1266,7 +1219,7 @@ Light: m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 m_ForceVisible: 0 - m_ShadowRadius: 0.025 + m_ShapeRadius: 0.025 m_ShadowAngle: 0 m_LightUnit: 0 m_LuxAtDistance: 1 @@ -1935,7 +1888,7 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1935158662385014115} m_Enabled: 1 - serializedVersion: 12 + serializedVersion: 13 m_Type: 0 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 15 @@ -1987,7 +1940,7 @@ Light: m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 m_ForceVisible: 0 - m_ShadowRadius: 0.025 + m_ShapeRadius: 0.025 m_ShadowAngle: 0 m_LightUnit: 0 m_LuxAtDistance: 1 @@ -2667,7 +2620,7 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8598119875628110629} m_Enabled: 1 - serializedVersion: 12 + serializedVersion: 13 m_Type: 0 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 7.5 @@ -2719,7 +2672,7 @@ Light: m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 m_ForceVisible: 0 - m_ShadowRadius: 0.025 + m_ShapeRadius: 0.025 m_ShadowAngle: 0 m_LightUnit: 0 m_LuxAtDistance: 1 @@ -3220,7 +3173,6 @@ SceneRoots: - {fileID: 450753641} - {fileID: 7057516004932664435} - {fileID: 59383918} - - {fileID: 1045504575} - {fileID: 1191974067} - {fileID: 1522427161} - {fileID: 1276148452} From fe8f27c99e96e06c5bae9ab6a8c560a95baea7d4 Mon Sep 17 00:00:00 2001 From: Erik Hakala Date: Thu, 2 Oct 2025 11:16:04 +0000 Subject: [PATCH 015/115] Clean up post process legacy variables. --- .../DepthOfFieldGaussianPostProcessPass.cs | 3 +- .../LensFlareDataDrivenPostProcessPass.cs | 3 +- .../PostProcess/MotionBlurPostProcessPass.cs | 1 - .../Passes/PostProcess/StpPostProcessPass.cs | 1 - .../Runtime/PostProcess.cs | 108 ++++++++---------- 5 files changed, 49 insertions(+), 67 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/DepthOfFieldGaussianPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/DepthOfFieldGaussianPostProcessPass.cs index 9c42c4d3989..c68fd8a209a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/DepthOfFieldGaussianPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/DepthOfFieldGaussianPostProcessPass.cs @@ -62,7 +62,6 @@ private class DoFGaussianPassData { // Setup internal int downsample; - internal RenderingData renderingData; internal Vector3 cocParams; internal bool highQualitySamplingValue; internal bool enableAlphaOutput; @@ -74,7 +73,7 @@ private class DoFGaussianPassData // Pass textures internal TextureHandle halfCoCTexture; internal TextureHandle fullCoCTexture; - internal TextureHandle pingTexture; // TODO: pingpong texture idiom is common, we should have a helper abstraction in core. + internal TextureHandle pingTexture; internal TextureHandle pongTexture; internal RenderTargetIdentifier[] multipleRenderTargets = new RenderTargetIdentifier[2]; // Output textures diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/LensFlareDataDrivenPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/LensFlareDataDrivenPostProcessPass.cs index 60ceb5a4e59..d9241fc6b5b 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/LensFlareDataDrivenPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/LensFlareDataDrivenPostProcessPass.cs @@ -71,7 +71,6 @@ void LensFlareDataDrivenComputeOcclusion(RenderGraph renderGraph, UniversalResou { using (var builder = renderGraph.AddUnsafePass("Lens Flare Compute Occlusion", out var passData, ProfilingSampler.Get(URPProfileId.LensFlareDataDrivenComputeOcclusion))) { - RTHandle occH = LensFlareCommonSRP.occlusionRT; TextureHandle occlusionHandle = renderGraph.ImportTexture(LensFlareCommonSRP.occlusionRT); passData.destinationTexture = occlusionHandle; builder.UseTexture(occlusionHandle, AccessFlags.Write); @@ -80,7 +79,7 @@ void LensFlareDataDrivenComputeOcclusion(RenderGraph renderGraph, UniversalResou passData.material = m_Material; passData.width = (float)dstDesc.width; passData.height = (float)dstDesc.height; - if (paniniProjection.IsActive()) // TODO: panini pass dependency! Should be outside of this pass. + if (paniniProjection.IsActive()) { passData.usePanini = true; passData.paniniDistance = paniniProjection.distance.value; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/MotionBlurPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/MotionBlurPostProcessPass.cs index e724144f9a5..38c329bb7d0 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/MotionBlurPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/MotionBlurPostProcessPass.cs @@ -95,7 +95,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer UpdateMotionBlurMatrices(data.material, data.camera, data.xr); - //PostProcessUtils.SetGlobalShaderSourceSize(cmd, sourceTextureHdl); var sourceSize = PostProcessUtils.CalcShaderSourceSize(sourceTextureHdl); data.material.SetVector(ShaderConstants._SourceSize, sourceSize); data.material.SetFloat(ShaderConstants._Intensity, data.intensity); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/StpPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/StpPostProcessPass.cs index 19cae360cd7..1f30a95b9cb 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/StpPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/StpPostProcessPass.cs @@ -48,7 +48,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer Debug.Assert(motionVectors.IsValid(), "MotionVectors are invalid. STP requires a motion vector texture."); - // TODO: should this be set externally? What if simulation is paused. FrameDebugger or the same frame is rendered multiple times? int frameIndex = Time.frameCount; var noiseTexture = m_BlueNoise16LTex[frameIndex & (m_BlueNoise16LTex.Length - 1)]; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs index a1d094e0271..2af08a64adc 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs @@ -7,20 +7,6 @@ namespace UnityEngine.Rendering.Universal { internal sealed class PostProcess : IDisposable { - // Builtin effects settings (VolumeComponents) - DepthOfField m_DepthOfField; - MotionBlur m_MotionBlur; - PaniniProjection m_PaniniProjection; - Bloom m_Bloom; - ScreenSpaceLensFlare m_LensFlareScreenSpace; - LensDistortion m_LensDistortion; - ChromaticAberration m_ChromaticAberration; - Vignette m_Vignette; - ColorLookup m_ColorLookup; - ColorAdjustments m_ColorAdjustments; - Tonemapping m_Tonemapping; - FilmGrain m_FilmGrain; - // Passes StopNanPostProcessPass m_StopNanPostProcessPass; SmaaPostProcessPass m_SmaaPostProcessPass; @@ -138,9 +124,9 @@ Texture2D GetNextDitherTexture() return m_Resources.textures.blueNoise16LTex[GetNextDitherIndex()]; } - TextureHandle TryGetCachedUserLutTextureHandle(RenderGraph renderGraph) + TextureHandle TryGetCachedUserLutTextureHandle(RenderGraph renderGraph, ColorLookup colorLookup) { - if (m_ColorLookup.texture.value == null) + if (colorLookup.texture.value == null) { if (m_UserLut != null) { @@ -150,10 +136,10 @@ TextureHandle TryGetCachedUserLutTextureHandle(RenderGraph renderGraph) } else { - if (m_UserLut == null || m_UserLut.externalTexture != m_ColorLookup.texture.value) + if (m_UserLut == null || m_UserLut.externalTexture != colorLookup.texture.value) { m_UserLut?.Release(); - m_UserLut = RTHandles.Alloc(m_ColorLookup.texture.value); + m_UserLut = RTHandles.Alloc(colorLookup.texture.value); } } return m_UserLut != null ? renderGraph.ImportTexture(m_UserLut) : TextureHandle.nullHandle; @@ -176,18 +162,18 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame UniversalPostProcessingData postProcessingData = frameData.Get(); var stack = VolumeManager.instance.stack; - m_DepthOfField = stack.GetComponent(); - m_MotionBlur = stack.GetComponent(); - m_PaniniProjection = stack.GetComponent(); - m_Bloom = stack.GetComponent(); - m_LensFlareScreenSpace = stack.GetComponent(); - m_LensDistortion = stack.GetComponent(); - m_ChromaticAberration = stack.GetComponent(); - m_Vignette = stack.GetComponent(); - m_ColorLookup = stack.GetComponent(); - m_ColorAdjustments = stack.GetComponent(); - m_Tonemapping = stack.GetComponent(); - m_FilmGrain = stack.GetComponent(); + var depthOfField = stack.GetComponent(); + var motionBlur = stack.GetComponent(); + var paniniProjection = stack.GetComponent(); + var bloom = stack.GetComponent(); + var lensFlareScreenSpace = stack.GetComponent(); + var lensDistortion = stack.GetComponent(); + var chromaticAberration = stack.GetComponent(); + var vignette = stack.GetComponent(); + var colorLookup = stack.GetComponent(); + var colorAdjustments = stack.GetComponent(); + var tonemapping = stack.GetComponent(); + var filmGrain = stack.GetComponent(); m_HasFinalPass = hasFinalPass; // TODO: should this be external configuration property rather than a param? @@ -200,17 +186,17 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame //We blit back and forth without msaa untill the last blit. bool useStopNan = cameraData.isStopNaNEnabled && m_StopNanPostProcessPass.IsValid(); bool useSubPixelMorpAA = (cameraData.antialiasing == AntialiasingMode.SubpixelMorphologicalAntiAliasing) && m_SmaaPostProcessPass.IsValid(); - bool useDepthOfField = m_DepthOfField.IsActive() && !isSceneViewCamera && (m_DepthOfFieldGaussianPass.IsValid() || m_DepthOfFieldBokehPass.IsValid()); + bool useDepthOfField = depthOfField.IsActive() && !isSceneViewCamera && (m_DepthOfFieldGaussianPass.IsValid() || m_DepthOfFieldBokehPass.IsValid()); bool useLensFlare = !LensFlareCommonSRP.Instance.IsEmpty() && supportDataDrivenLensFlare; - bool useLensFlareScreenSpace = m_LensFlareScreenSpace.IsActive() && supportScreenSpaceLensFlare; - bool useMotionBlur = m_MotionBlur.IsActive() && !isSceneViewCamera && m_MotionBlurPass.IsValid(); - bool usePaniniProjection = m_PaniniProjection.IsActive() && !isSceneViewCamera && m_PaniniProjectionPass.IsValid(); + bool useLensFlareScreenSpace = lensFlareScreenSpace.IsActive() && supportScreenSpaceLensFlare; + bool useMotionBlur = motionBlur.IsActive() && !isSceneViewCamera && m_MotionBlurPass.IsValid(); + bool usePaniniProjection = paniniProjection.IsActive() && !isSceneViewCamera && m_PaniniProjectionPass.IsValid(); // Disable MotionBlur in EditMode, so that editing remains clear and readable. // NOTE: HDRP does the same via CoreUtils::AreAnimatedMaterialsEnabled(). // Disable MotionBlurMode.CameraAndObjects on renderers that do not support motion vectors useMotionBlur = useMotionBlur && Application.isPlaying; - if (useMotionBlur && m_MotionBlur.mode.value == MotionBlurMode.CameraAndObjects) + if (useMotionBlur && motionBlur.mode.value == MotionBlurMode.CameraAndObjects) { ScriptableRenderer renderer = cameraData.renderer; useMotionBlur &= renderer.SupportsMotionVectors(); @@ -270,16 +256,16 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame if (useDepthOfField) { var doFTarget = PostProcessUtils.CreateCompatibleTexture(renderGraph, currentSource, DepthOfFieldGaussianPostProcessPass.k_TargetName, true, FilterMode.Bilinear); - if(m_DepthOfField.mode.value == DepthOfFieldMode.Gaussian) + if(depthOfField.mode.value == DepthOfFieldMode.Gaussian) { - m_DepthOfFieldGaussianPass.depthOfField = m_DepthOfField; + m_DepthOfFieldGaussianPass.depthOfField = depthOfField; m_DepthOfFieldGaussianPass.sourceTexture = currentSource; m_DepthOfFieldGaussianPass.destinationTexture = doFTarget; m_DepthOfFieldGaussianPass.RecordRenderGraph(renderGraph, frameData); } else { - m_DepthOfFieldBokehPass.depthOfField = m_DepthOfField; + m_DepthOfFieldBokehPass.depthOfField = depthOfField; m_DepthOfFieldBokehPass.useFastSRGBLinearConversion = useFastSRGBLinearConversion; m_DepthOfFieldBokehPass.sourceTexture = currentSource; m_DepthOfFieldBokehPass.destinationTexture = doFTarget; @@ -328,7 +314,7 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame { var motionTarget = PostProcessUtils.CreateCompatibleTexture(renderGraph, currentSource, MotionBlurPostProcessPass.k_TargetName, true, FilterMode.Bilinear); - m_MotionBlurPass.motionBlur = m_MotionBlur; + m_MotionBlurPass.motionBlur = motionBlur; m_MotionBlurPass.sourceTexture = currentSource; m_MotionBlurPass.destinationTexture = motionTarget; m_MotionBlurPass.RecordRenderGraph(renderGraph, frameData); @@ -339,7 +325,7 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame { var paniniTarget = PostProcessUtils.CreateCompatibleTexture(renderGraph, currentSource, PaniniProjectionPostProcessPass.k_TargetName, true, FilterMode.Bilinear); - m_PaniniProjectionPass.paniniProjection = m_PaniniProjection; + m_PaniniProjectionPass.paniniProjection = paniniProjection; m_PaniniProjectionPass.sourceTexture = currentSource; m_PaniniProjectionPass.destinationTexture = paniniTarget; m_PaniniProjectionPass.RecordRenderGraph(renderGraph, frameData); @@ -352,12 +338,12 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame // Bloom goes first TextureHandle bloomTexture = TextureHandle.nullHandle; - bool bloomActive = m_Bloom.IsActive() || useLensFlareScreenSpace; + bool bloomActive = bloom.IsActive() || useLensFlareScreenSpace; //Even if bloom is not active we need the texture if the lensFlareScreenSpace pass is active. if (bloomActive) { // NOTE: bloom destination texture is some texture in the bloom mip pyramid. It's not explicitly set beforehand. - m_BloomPass.bloom = m_Bloom; + m_BloomPass.bloom = bloom; m_BloomPass.sourceTexture = currentSource; m_BloomPass.RecordRenderGraph(renderGraph, frameData); bloomTexture = m_BloomPass.destinationTexture; @@ -368,8 +354,8 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame // We need to take into account how many valid mips the bloom pass produced. int bloomMipCount = mipPyramid.mipCount; - int maxBloomMip = Mathf.Clamp(bloomMipCount - 1, 0, m_Bloom.maxIterations.value / 2); - int useBloomMip = Mathf.Clamp(m_LensFlareScreenSpace.bloomMip.value, 0, maxBloomMip); + int maxBloomMip = Mathf.Clamp(bloomMipCount - 1, 0, bloom.maxIterations.value / 2); + int useBloomMip = Mathf.Clamp(lensFlareScreenSpace.bloomMip.value, 0, maxBloomMip); TextureHandle bloomMipFlareSource = mipPyramid.GetResultMip(useBloomMip); // Flare source and Flare target is the same texture. BloomMip[0] @@ -377,13 +363,13 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame // Kawase blur does not use the mip pyramid. // It is safe to pass the same texture to both input/output. - if (m_Bloom.filter.value == BloomFilterMode.Kawase) + if (bloom.filter.value == BloomFilterMode.Kawase) { bloomMipFlareSource = bloomTexture; sameBloomSrcDestTex = true; } - m_LensFlareScreenSpacePass.lensFlareScreenSpace = m_LensFlareScreenSpace; + m_LensFlareScreenSpacePass.lensFlareScreenSpace = lensFlareScreenSpace; m_LensFlareScreenSpacePass.sameSourceDestinationTexture = sameBloomSrcDestTex; m_LensFlareScreenSpacePass.colorBufferTextureDesc = colorSrcDesc; m_LensFlareScreenSpacePass.sourceTexture = bloomMipFlareSource; @@ -395,20 +381,20 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame if (useLensFlare) { // Lens Flares are procedurally generated and blended to the destination texture. - m_LensFlareDataDrivenPass.paniniProjection = m_PaniniProjection; + m_LensFlareDataDrivenPass.paniniProjection = paniniProjection; m_LensFlareDataDrivenPass.destinationTexture = currentSource; m_LensFlareDataDrivenPass.RecordRenderGraph(renderGraph, frameData); } // Settings - m_UberPass.colorLookup = m_ColorLookup; - m_UberPass.colorAdjustments = m_ColorAdjustments; - m_UberPass.tonemapping = m_Tonemapping; - m_UberPass.bloom = m_Bloom; - m_UberPass.lensDistortion = m_LensDistortion; - m_UberPass.chromaticAberration = m_ChromaticAberration; - m_UberPass.vignette = m_Vignette; - m_UberPass.filmGrain = m_FilmGrain; + m_UberPass.colorLookup = colorLookup; + m_UberPass.colorAdjustments = colorAdjustments; + m_UberPass.tonemapping = tonemapping; + m_UberPass.bloom = bloom; + m_UberPass.lensDistortion = lensDistortion; + m_UberPass.chromaticAberration = chromaticAberration; + m_UberPass.vignette = vignette; + m_UberPass.filmGrain = filmGrain; m_UberPass.isFinalPass = !m_HasFinalPass; m_UberPass.requireSRGBConversionBlit = RequireSRGBConversionBlitToBackBuffer(cameraData, enableColorEncodingIfNeeded); @@ -430,7 +416,7 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame // Input m_UberPass.sourceTexture = currentSource; m_UberPass.internalLutTexture = internalColorLutTexture; - m_UberPass.userLutTexture = TryGetCachedUserLutTextureHandle(renderGraph); + m_UberPass.userLutTexture = TryGetCachedUserLutTextureHandle(renderGraph, colorLookup); m_UberPass.bloomTexture = bloomTexture; m_UberPass.overlayUITexture = activeOverlayUITexture; m_UberPass.ditherTexture = cameraData.isDitheringEnabled ? GetNextDitherTexture() : null; @@ -447,8 +433,8 @@ public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer UniversalCameraData cameraData = frameData.Get(); var stack = VolumeManager.instance.stack; - m_Tonemapping = stack.GetComponent(); - m_FilmGrain = stack.GetComponent(); + var tonemapping = stack.GetComponent(); + var filmGrain = stack.GetComponent(); // TODO RENDERGRAPH: when we remove the old path we should review the naming of these variables... // m_HasFinalPass is used to let FX passes know when they are not being called by the actual final pass, so they can skip any "final work" @@ -506,7 +492,7 @@ public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer var scalingSetupTarget = PostProcessUtils.CreateCompatibleTexture(renderGraph, scalingSetupDesc, ScalingSetupPostProcessPass.k_TargetName, true, FilterMode.Point); - m_ScalingSetupFinalPostProcessPass.tonemapping = m_Tonemapping; + m_ScalingSetupFinalPostProcessPass.tonemapping = tonemapping; m_ScalingSetupFinalPostProcessPass.hdrOperations = hdrOperations; m_ScalingSetupFinalPostProcessPass.sourceTexture = currentSource; @@ -569,8 +555,8 @@ public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer bool renderOverlayUI = requireHDROutput && enableColorEncodingIfNeeded && cameraData.rendersOverlayUI; - m_FinalPostProcessPass.tonemapping = m_Tonemapping; - m_FinalPostProcessPass.filmGrain = m_FilmGrain; + m_FinalPostProcessPass.tonemapping = tonemapping; + m_FinalPostProcessPass.filmGrain = filmGrain; m_FinalPostProcessPass.samplingOperation = samplingOperation; m_FinalPostProcessPass.applyFxaa = applyFxaa; From eb9428c4cc3d074102c82c8eb1b1e594f9683665 Mon Sep 17 00:00:00 2001 From: Jesper Mortensen Date: Thu, 2 Oct 2025 11:16:10 +0000 Subject: [PATCH 016/115] UUM-114563: Virtual Offset baking broken on AMD --- .../ProbeGIBaking.VirtualOffset.cs | 2 +- .../TraceVirtualOffset.urtshader | 25 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs index 29588cad039..aa6ac50f95b 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs @@ -109,7 +109,7 @@ public override void Initialize(ProbeVolumeBakingSet bakingSet, NativeArray DOT_THRESHOLD) + float distanceDiff = hit.hitDistance - minDist; + if (distanceDiff < DISTANCE_THRESHOLD) { - outDirection = ray.direction; - maxDotSurface = dotSurface; - minDist = hit.hitDistance; + UnifiedRT::HitGeomAttributes attributes = UnifiedRT::FetchHitGeomAttributes(hit, UnifiedRT::kGeomAttribFaceNormal); + float dotSurface = dot(ray.direction, attributes.faceNormal); + + // If new distance is smaller by at least kDistanceThreshold, or if ray is at least DOT_THRESHOLD more colinear with normal + if (distanceDiff < -DISTANCE_THRESHOLD || dotSurface - maxDotSurface > DOT_THRESHOLD) + { + outDirection = ray.direction; + maxDotSurface = dotSurface; + minDist = hit.hitDistance; + } } } } From 5fbe13f65ebd857a02e726f9fc65dbd0b6e0ff7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Carr=C3=A8re?= Date: Thu, 2 Oct 2025 19:30:37 +0000 Subject: [PATCH 017/115] docg-7771: Reflection probe: new scene view overlays and gizmo menu integration --- .../Images/ReflectionProbeGizmo1.png | Bin 691 -> 11313 bytes .../Images/ReflectionProbeGizmo2.png | Bin 900 -> 11106 bytes .../Images/ReflectionProbeGizmo3.png | Bin 926 -> 11478 bytes .../Images/ReflectionProbeGizmo4.png | Bin 1031 -> 9013 bytes .../Images/ReflectionProbeGizmo5.png | Bin 1164 -> 4287 bytes .../Images/ReflectionProbeGizmo6.png | Bin 1131 -> 2183 bytes .../Documentation~/Planar-Reflection-Probe.md | 2 +- .../Documentation~/Reflection-Probe.md | 8 ++++---- 8 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/ReflectionProbeGizmo1.png b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/ReflectionProbeGizmo1.png index c280c6934467542c672a898ec0aae0a247000a48..24afa0d13be2582be3e91d41415c0fa34905fb3f 100644 GIT binary patch literal 11313 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 literal 900 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 literal 926 zcmV;P17ZA$P)g9{00009a7bBm000id z000id0mpBsWB>pIP)S5VRCwC$nN3TgQ5c4GvR)C%piHK~S``&mRLC#`Q9(wn+srIl z2rZ&r{eXT%|Dc5}a$zeMLPTG*C{X({%A{{fiazPP=HfkZikW5>lkmPT)3dmFQp3x; zbIx-g%NiUU?C9v|>FN2dgw(7&4SouGUesvnRHxcvl+EmEU2O=&(JL` zEuVEdSYT?b8|Bmiya&s(3F&v7yuejlv!Z4T50qPE!-U$ z8JU@xIXyj1r_*I+W$}2NW_)~{2k-CiGvazCp@qA3TAmLVIeROohC?-O*x3_BmJvlik!&hZxrPMcz6A(=#5-151)e^d|udk`8X=rF@ zeSJL?3SmFSN2Af&+FE{ua$sN}7!0ngtgu4r>+9K|oZnARPvWh$frbNRd!eA9rKP1P z(8AZn#YLIXNc1A9q1r=#RqLBtfk1#0aCmr_CBZ2HJ!@LrLBucW1^RWd+r$+^7%y36 z=@DA^9f?Hh>gs+c)+w~8v9U4s+?!8*K>rWW^YinJ2@(a<&gpbAq7_B?6Ex30JUo!7 znCfP;*qsN;u^3=QnUtK_g@uLv{r&$&oUuGD2A;4mKR+J@3k8~)Lc=GK`A&FGQq}kp;8Clp zs)|#2X=w>KyeEfjZEexxE~y&JySuxIC=Cq_?;+0c&E@9i23=cQlh(55Y&M&8m)qAb zi(Y$ZMJ?gFS1q=t-|ug0YZDKO7wG+a51bZ9ijlso$v83hdGf8nzJN5?x2EiJ&U+RH zS3BaaF`!>h)0h7QB=lVy8ym@Fk~MvHcE;rT2@_vRzkE1BvH$=807*qoM6N<$f?^QC AI{*Lx diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/ReflectionProbeGizmo4.png b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/ReflectionProbeGizmo4.png index 5282b9facf4ff16b6002cb05c1928fbcfb85ddc3..ace602cfc024ebc5fc509c8d45ccb8f216a492e1 100644 GIT binary patch literal 9013 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 literal 1031 zcmV+i1o-=jP)g9{00009a7bBm000id z000id0mpBsWB>pIxk*GpRCwCencGWZQ543_V@Vf;3d`xLBn1)lRLp~~{tM-tpa<#A zzpK9>2zu$E5~`OTq8J37BDxs~b`i@<^XshXV3P{kw%PMNEY99}PM_aid#!IDjosbd zm6esn#l_|2<%NX>(=>nR2h&0{8iiym7BgV%a5$cypNYj{(V->U+S-UNmy76jyA3pk zaaUJYdwY8@7#tiN93CG2rWw3mFU0csJR~0<9}NVDJ_Dl1;~_eoPTiC)m&?Ta`+H)c zP%y}2vI31^jQ&a(Z*Fe>vJeOal#q5>=;`T!L4q@j_zE?Ku3V@hU8#3Eoi^B; zT#?607;kKBB$LVQ?d_A3lhe~vb_+w6QK8Z=y zUtb^9^t%NT+Axfcj*dtq!q96$T7zDsOQn*1ol2#M@b>%t_N0!aT@^?q5<+@vYRaC} zaU)j3Catz^e3rD-3i6n&_^4tX(oauM+#*$_Ii;E>EwzH}RW(`bke1Y!s`7QDrRPzP ziByKFq$$ke&TtD=Nw2Q1ayx#liGJA(X{p4bbS=_i$Hd}PCC$l$==1rS=$DO=7VoyR zvqP7jot-5&xS%8_D*(%fhlin|A?z5}=jZ2qfvv5r#2Zo;dV70mK>PdqJmKZ#r6E7q z7-{it*dQXbBy0crjEH9oERxHzeDrHFFSWe2q>)yvto-BhdoYi3a+mqyJzKPoNrHfd6Yczu0cHM6nvEmt~V0gF5~Hgki#)HcJ+fD!~e1R$;lewubz3b8`&C;c!D|g;rG$5x6o>{#o@9h+tG=G_KWLsN$pq zr33A&lIF{BdngoYqR+RgBg$&9FKdzh>W*k{I8e*J)gdjn$nAQ$ygH=yvZi9+1X30u zJw85ePwIYhu}RD6P~Vda7MbmZeWRR-&n^@S>+9pk~d7IX=1flP*(Hvuk)l|(!l)|@D&Of7mGzm zzP^C`FW;I*qfv@cKA*?1cXoCvDX4)rsG=)PfW&|#%lPh>06B3ee6gYm(gegjzWx#r zi^be-H(TfK?v7f^PC7n5{;3%_Rzi%NhUCD&z;C@KoY{8fbVvXI002ovPDHLkV1nGy B`z8PY diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/ReflectionProbeGizmo5.png b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/ReflectionProbeGizmo5.png index b08422451f0746c3cb38e062445e32a3ce8e0b1c..87c3686fa95ae87103b2f5e69132f056463a3d30 100644 GIT binary patch literal 4287 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 literal 1164 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 OzgHJWcWSkLP|82TI)GFF literal 1131 zcmV-x1eE)UP)pJ9Z5t%RCwCenafKXQ51)x(Zsi+MlCAh12p)iL82n~0yl!VQJO^- z!Cn3#SAt7dE?l`ND3X|kwt`qgqawZyD!%L6e%@=QDQ#(zv6JZ!daTJz=JU+C=l;&b z==1qTMn;B*hn-I6(9n>>;rO64IfPs;7ldxN8(Jg(3~gTa?f zvpo4h9jhdMe0+Rkj? zk4a5UCDzr|5#tO^3U_vP#>dAO7Z-1Y{&eIwp#`Db+}z#WT~<+ipdnUr9J%W2>*dnd z8v5Yi;PUcvY;0_GbyYT_$Q1|#IIFR-@%s8YJw07JXo!jP^Ycmvja<@2w6(PnHHDs@ zo~8$HZf-_PEIT^F25oI^S*=#>pt-+9t{QV6C@U)?Y6?9yHFa`wB8wz8VSV_7_V#w| zpgkUsQrWR7Gc%K@DRfFoN<~Elb}=U>2WugHdL;gVBPk5d>g?>~6QaGYDrhVsQSn1j z%^=c^$ePv^8dFQR>g(&X+wC149o^mC^xf9hRu)!sb8~rlxiutS2Nj1zNx*t~dU|_%i|M1HCMPGoUN4v5*x2AEXa|i$QfBy~q9P(TUvYCX zDppB}vfCUU9xBIZ3QYkN6cpg{@cUndJ_&h*K8DFF^jRn%bRpE!)59l3YnxO-%f7+w zj=4|A=JixTmz0#0mX=bKm}54!sLrjfuBP+{1_okqr>dakM2Mp&Mhguw(Pp!0?WYrj zYHDg|&v-p{IQqk1&#J7f82PU{Mz#J^7{HZHps6h;c%d$ xrXj=_Li_sdmYgG`>y^GjKawj=PCfVq;& Date: Thu, 2 Oct 2025 19:30:48 +0000 Subject: [PATCH 018/115] Document missing parameters in Shader Graph Property reference page --- .../Documentation~/Keywords-reference.md | 2 +- .../com.unity.shadergraph/Documentation~/Property-Types.md | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.shadergraph/Documentation~/Keywords-reference.md b/Packages/com.unity.shadergraph/Documentation~/Keywords-reference.md index 98dc40b4c9c..c7577407f91 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Keywords-reference.md +++ b/Packages/com.unity.shadergraph/Documentation~/Keywords-reference.md @@ -9,7 +9,7 @@ Parameters that all keyword types have in common. | **Name** | **Description** | | :--- | :--- | | **Name** | The display name of the keyword. Unity shows this name in the title bar of nodes that reference the corresponding keyword, and also in the Material Inspector if you expose that keyword. | -| **Reference** | The internal name for the keyword in the shader.

If you overwrite this parameter, be aware of the following:
  • A Keyword **Reference** has to be in full capitals. Unity converts any lowercase letters to uppercase.
  • If **Reference** contains any characters that HLSL does not support, Unity replaces those characters with underscores.
  • You can revert to the default **Reference**: right-click on the **Reference** field label, and select **Reset Reference**.
| +| **Reference** | The internal name for the keyword in the shader. Use this **Reference** name instead of the display **Name** when you reference the keyword in a script.

If you overwrite this parameter, be aware of the following:
  • A Keyword **Reference** has to be in full capitals. Unity converts any lowercase letters to uppercase.
  • If the string contains any characters that HLSL does not support, Unity replaces those characters with underscores.
  • You can revert to the default value: right-click on the **Reference** field label, and select **Reset Reference**.
| | **Definition** | Sets the keyword declaration type, which determines how Unity compiles the shader code. This allows you to [optimize the balance between build time, runtime, and file sizes](Keywords-concepts.md#keyword-impact-optimization).

The options are:
  • **Shader Feature**: Unity only compiles shader variants for keyword combinations used by materials in your build, and removes other shader variants.
  • **Multi Compile**: Unity compiles shader variants for all keyword combinations regardless of whether the build uses these variants.
  • **Predefined**: Specifies that the target/sub-target already defines the keyword and you just want to reuse it. Predefined Keywords can either use a [built-in macro](https://docs.unity3d.com/Manual/shader-branching-built-in-macros.html), which results in static branching at build time, or any of the keywords already defined by the Shader Graph Target (for example, [URP](https://docs.unity3d.com/Manual/urp/urp-shaders/shader-keywords-macros.html)), including [Built-In keyword sets](https://docs.unity3d.com/Manual/SL-MultipleProgramVariants-shortcuts.html), and where the branching depends on that definition.
  • **Dynamic Branch**: Unity keeps branching code in one compiled shader program.
| | **Is Overridable** | Indicates whether the keyword's state can be overridden.
For more information, refer to [Toggle shader keywords in a script](https://docs.unity3d.com/Manual/shader-keywords-scripts.html). | | **Generate Material Property** | Generates a material property declaration to display the keyword as a property in the material inspector.
This adds a `[Toggle(_KEYWORD)]` attribute to the material property. For more information, refer to [`MaterialPropertyDrawer`](https://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html). | diff --git a/Packages/com.unity.shadergraph/Documentation~/Property-Types.md b/Packages/com.unity.shadergraph/Documentation~/Property-Types.md index f6a40dd9de9..9b83dfdf03a 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Property-Types.md +++ b/Packages/com.unity.shadergraph/Documentation~/Property-Types.md @@ -13,7 +13,9 @@ All properties have the following common parameters in addition to those specifi | Parameter | Description | | :--- | :--- | | **Name** | The display name of the property. | -| **Reference** | The internal name for the property in the shader.

If you overwrite this parameter, be aware of the following:
  • If **Reference** doesn't begin with an underscore, Unity automatically adds one.
  • If **Reference** contains any characters which are unsupported in HLSL, Unity removes them.
  • You can revert to the default **Reference**: right-click on the **Reference** field label, and select **Reset Reference**.
| +| **Reference** | The internal name for the property in the shader. Use this **Reference** name instead of the display **Name** when you reference the property in a script.

If you overwrite this parameter, be aware of the following:
  • If the string doesn't begin with an underscore, Unity automatically adds one.
  • If the string contains any characters that HLSL does not support, Unity removes them.
  • You can revert to the default value: right-click on the **Reference** field label, and select **Reset Reference**.
| +| **Precision** | Sets the data precision mode of the Property. The options are **Inherit**, **Single**, **Half**, and **Use Graph Precision**.
For more details, refer to [Precision Modes](Precision-Modes.md). | +| **Scope** | Specifies where you expect to edit the property for materials. The options are:
  • **Global**: Makes the property editable at a global level, through a C# script only, for all materials that use it. Selecting this option hides or grays out all parameters that relate to the Inspector UI display.
  • **Per Material**: Makes the property independently editable per material, either through a C# script, or in the Inspector UI if you enable **Show In Inspector**.
  • **Hybrid Per Instance**: Has the same effect as **Per Material**, unless you're using [DOTS instancing](https://docs.unity3d.com/Packages/com.unity.entities.graphics@latest/index.html?subfolder=/manual/dots-instancing-shader.html).
| | **Show In Inspector** | Displays the property in the material inspector.
If you disable this option, it includes an `[HideInInspector]` attribute to the material property (refer to [Properties block reference in ShaderLab](https://docs.unity3d.com/Manual/SL-Properties.html#material-property-attributes) for more details). | | **Read Only** | Adds a [`PerRendererData`](https://docs.unity3d.com/ScriptReference/Rendering.ShaderPropertyFlags.html) attribute to the material property to display the value as read-only in the material inspector. | | **Custom Attributes** | A list of entries that allow you to call custom functions you scripted to create additional [material property drawers](https://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html), like static decorators or complex controls.
The **Custom Material Property Drawers** sample, available in the Package Manager among other [Shader Graph samples](ShaderGraph-Samples.md), shows how to display a Vector2 as a min/max slider, for example.

**Note**: When you declare the custom functions in the script, make sure to suffix their names with `Drawer` or `Decorator`.

In the list, use **+** or **-** to add or remove entries. Each entry corresponds to a function call which requires the following parameters:
  • **Name**: A shorthened version of the function name, without its `Drawer` or `Decorator` suffix.
  • **Value**: The input values for the function as the script expects them.
**Note**: A property can only have one drawer at any given time. | From d2217952b1469274c6036e4390a68772acf6e910 Mon Sep 17 00:00:00 2001 From: Louis-Philippe Ledoux Date: Thu, 2 Oct 2025 19:30:49 +0000 Subject: [PATCH 019/115] Fix for shadergraph compilation issues due to spacewarp --- .../Includes/MotionVectorPass.hlsl | 40 ++++++++++++------- .../Editor/ShaderGraph/Includes/Varyings.hlsl | 12 +++--- .../ShaderGraph/Targets/UniversalTarget.cs | 37 +++++++++-------- .../ShaderLibrary/VisualEffectVertex.hlsl | 4 +- 4 files changed, 54 insertions(+), 39 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/MotionVectorPass.hlsl b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/MotionVectorPass.hlsl index e1c3a831dd1..980437a6ba8 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/MotionVectorPass.hlsl +++ b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/MotionVectorPass.hlsl @@ -129,25 +129,32 @@ void vert( previousPositionOS -= passInput.alembicMotionVectorOS; #endif +#if defined(APPLICATION_SPACE_WARP_MOTION) + // We do not need jittered position in ASW + mvOutput.positionCSNoJitter = mul(_NonJitteredViewProjMatrix, float4(currentFrameMvData.positionWS, 1.0f)); + packedOutput.positionCS = mvOutput.positionCSNoJitter; + mvOutput.previousPositionCSNoJitter = mul(_PrevViewProjMatrix, mul(UNITY_PREV_MATRIX_M, float4(previousPositionOS, 1.0f))); +#else mvOutput.positionCSNoJitter = mul(_NonJitteredViewProjMatrix, float4(currentFrameMvData.positionWS, 1.0f)); -#if defined(HAVE_VFX_MODIFICATION) - #if defined(VFX_FEATURE_MOTION_VECTORS_VERTS) - #if defined(FEATURES_GRAPH_VERTEX_MOTION_VECTOR_OUTPUT) || defined(_ADD_PRECOMPUTED_VELOCITY) - #error Unexpected fast path rendering VFX motion vector while there are vertex modification afterwards. - #endif - mvOutput.previousPositionCSNoJitter = VFXGetPreviousClipPosition(input, currentFrameMvData.vfxElementAttributes, mvOutput.positionCSNoJitter); - #else - #if VFX_WORLD_SPACE - //previousPositionOS is already in world space - const float3 previousPositionWS = previousPositionOS; + #if defined(HAVE_VFX_MODIFICATION) + #if defined(VFX_FEATURE_MOTION_VECTORS_VERTS) + #if defined(FEATURES_GRAPH_VERTEX_MOTION_VECTOR_OUTPUT) || defined(_ADD_PRECOMPUTED_VELOCITY) + #error Unexpected fast path rendering VFX motion vector while there are vertex modification afterwards. + #endif + mvOutput.previousPositionCSNoJitter = VFXGetPreviousClipPosition(input, currentFrameMvData.vfxElementAttributes, mvOutput.positionCSNoJitter); #else - const float3 previousPositionWS = mul(UNITY_PREV_MATRIX_M, float4(previousPositionOS, 1.0f)).xyz; + #if VFX_WORLD_SPACE + //previousPositionOS is already in world space + const float3 previousPositionWS = previousPositionOS; + #else + const float3 previousPositionWS = mul(UNITY_PREV_MATRIX_M, float4(previousPositionOS, 1.0f)).xyz; + #endif + mvOutput.previousPositionCSNoJitter = mul(_PrevViewProjMatrix, float4(previousPositionWS, 1.0f)); #endif - mvOutput.previousPositionCSNoJitter = mul(_PrevViewProjMatrix, float4(previousPositionWS, 1.0f)); + #else + mvOutput.previousPositionCSNoJitter = mul(_PrevViewProjMatrix, mul(UNITY_PREV_MATRIX_M, float4(previousPositionOS, 1.0f))); #endif -#else - mvOutput.previousPositionCSNoJitter = mul(_PrevViewProjMatrix, mul(UNITY_PREV_MATRIX_M, float4(previousPositionOS, 1.0f))); #endif } @@ -175,6 +182,11 @@ float4 frag( LODFadeCrossFade(input.positionCS); #endif + +#if defined(APPLICATION_SPACE_WARP_MOTION) + return float4(CalcAswNdcMotionVectorFromCsPositions(mvInput.positionCSNoJitter, mvInput.previousPositionCSNoJitter), 1); +#else return float4(CalcNdcMotionVectorFromCsPositions(mvInput.positionCSNoJitter, mvInput.previousPositionCSNoJitter), 0, 0); +#endif } #endif diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl index 488fab541d0..dcdd2e4fb4b 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl +++ b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl @@ -34,7 +34,7 @@ VertexDescription BuildVertexDescription(Attributes input) #endif #endif -#if (SHADERPASS == SHADERPASS_MOTION_VECTORS) +#if (SHADERPASS == SHADERPASS_MOTION_VECTORS || SHADERPASS == SHADERPASS_XR_MOTION_VECTORS) // We want to gather some internal data from the BuildVaryings call to // avoid rereading and recalculating these values again in the ShaderGraph motion vector pass struct MotionVectorPassOutput @@ -55,7 +55,7 @@ struct MotionVectorPassOutput #if defined(HAVE_VFX_MODIFICATION) bool PrepareVFXModification(inout Attributes input, inout Varyings output, inout AttributesElement element - #if (SHADERPASS == SHADERPASS_MOTION_VECTORS) + #if (SHADERPASS == SHADERPASS_MOTION_VECTORS || SHADERPASS == SHADERPASS_XR_MOTION_VECTORS) , inout MotionVectorPassOutput motionVectorOutput #endif ) @@ -72,7 +72,7 @@ bool PrepareVFXModification(inout Attributes input, inout Varyings output, inout SetupVFXMatrices(element, output); -#if (SHADERPASS == SHADERPASS_MOTION_VECTORS) +#if (SHADERPASS == SHADERPASS_MOTION_VECTORS || SHADERPASS == SHADERPASS_XR_MOTION_VECTORS) motionVectorOutput.vfxParticlePositionOS = input.positionOS; #endif @@ -81,7 +81,7 @@ bool PrepareVFXModification(inout Attributes input, inout Varyings output, inout #endif Varyings BuildVaryings(Attributes input -#if (SHADERPASS == SHADERPASS_MOTION_VECTORS) +#if (SHADERPASS == SHADERPASS_MOTION_VECTORS || SHADERPASS == SHADERPASS_XR_MOTION_VECTORS) , inout MotionVectorPassOutput motionVectorOutput #endif ) @@ -98,7 +98,7 @@ Varyings BuildVaryings(Attributes input AttributesElement element; ZERO_INITIALIZE(AttributesElement, element); - #if (SHADERPASS == SHADERPASS_MOTION_VECTORS) + #if (SHADERPASS == SHADERPASS_MOTION_VECTORS || SHADERPASS == SHADERPASS_XR_MOTION_VECTORS) isCulledOrDead = PrepareVFXModification(input, output, element, motionVectorOutput); #else isCulledOrDead = PrepareVFXModification(input, output, element); @@ -141,7 +141,7 @@ Varyings BuildVaryings(Attributes input // Returns the camera relative position (if enabled) float3 positionWS = vertexInput.positionWS; - #if (SHADERPASS == SHADERPASS_MOTION_VECTORS) + #if (SHADERPASS == SHADERPASS_MOTION_VECTORS || SHADERPASS == SHADERPASS_XR_MOTION_VECTORS) motionVectorOutput.positionOS = input.positionOS; motionVectorOutput.positionWS = positionWS; #if defined(FEATURES_GRAPH_VERTEX_MOTION_VECTOR_OUTPUT) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs index 66c4a7fb49b..2566168cdd1 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTarget.cs @@ -1195,23 +1195,20 @@ public static PassDescriptor XRMotionVectors(UniversalTarget target) displayName = "XRMotionVectors", referenceName = "SHADERPASS_XR_MOTION_VECTORS", lightMode = "XRMotionVectors", - useInPreview = true, + useInPreview = false, // Template passTemplatePath = UniversalTarget.kUberTemplatePath, sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories, // Port Mask - validVertexBlocks = new BlockFieldDescriptor[]{ }, - validPixelBlocks = new BlockFieldDescriptor[] { }, + validVertexBlocks = CoreBlockMasks.MotionVectorVertex, + validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, // Fields - structs = new StructCollection() { - { Structs.SurfaceDescriptionInputs }, - { Structs.VertexDescriptionInputs }, - }, + structs = CoreStructCollections.Default, requiredFields = new FieldCollection(), - fieldDependencies = new DependencyCollection() { }, + fieldDependencies = CoreFieldDependencies.Default, // Conditional State renderStates = CoreRenderStates.XRMotionVector(target), @@ -1219,10 +1216,16 @@ public static PassDescriptor XRMotionVectors(UniversalTarget target) defines = new DefineCollection(), keywords = new KeywordCollection(), includes = CoreIncludes.XRMotionVectors, + + // Custom Interpolator Support + customInterpolators = CoreCustomInterpDescriptors.Common }; result.defines.Add(CoreKeywordDescriptors.XRMotionVectors, 1); + AddAlphaClipControlToPass(ref result, target); + AddLODCrossFadeControlToPass(ref result, target); + return result; } @@ -1706,8 +1709,10 @@ static class CorePragmas public static readonly PragmaCollection XRMotionVectors = new PragmaCollection { - { Pragma.MultiCompileLodCrossfade }, - { Pragma.ShaderFeatureLocalVertex("_ADD_PRECOMPUTED_VELOCITY") }, + { Pragma.Target(ShaderModel.Target35) }, + { Pragma.MultiCompileInstancing }, + { Pragma.Vertex("vert") }, + { Pragma.Fragment("frag") }, }; public static readonly PragmaCollection Forward = new PragmaCollection @@ -1768,7 +1773,6 @@ static class CoreIncludes const string kFog = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Fog.hlsl"; const string kRenderingLayers = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"; const string kProbeVolumes = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ProbeVolumeVariants.hlsl"; - const string kObjectMotionVectors = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ObjectMotionVectors.hlsl"; public static readonly IncludeCollection CorePregraph = new IncludeCollection { @@ -1803,11 +1807,6 @@ static class CoreIncludes { kProbeVolumes, IncludeLocation.Pregraph, true }, }; - public static readonly IncludeCollection ObjectMotionVectors = new IncludeCollection - { - { kObjectMotionVectors, IncludeLocation.Pregraph, true }, - }; - public static readonly IncludeCollection ShaderGraphPregraph = new IncludeCollection { { kGraphFunctions, IncludeLocation.Pregraph }, @@ -1860,9 +1859,13 @@ static class CoreIncludes public static readonly IncludeCollection XRMotionVectors = new IncludeCollection { // Pre-graph + { DOTSPregraph }, { CorePregraph }, { ShaderGraphPregraph }, - { ObjectMotionVectors }, + + //Post-graph + { CorePostgraph }, + { kMotionVectorPass, IncludeLocation.Postgraph }, }; public static readonly IncludeCollection ShadowCaster = new IncludeCollection diff --git a/Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl b/Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl index c76235e6d07..436fe1daac4 100644 --- a/Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl +++ b/Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl @@ -7,7 +7,7 @@ void VertVFX( Attributes input #endif -#if (SHADERPASS == SHADERPASS_MOTION_VECTORS) +#if (SHADERPASS == SHADERPASS_MOTION_VECTORS || SHADERPASS == SHADERPASS_XR_MOTION_VECTORS) , out PackedMotionVectorPassVaryings packedMvOutput #endif , out PackedVaryings packedOutput @@ -20,7 +20,7 @@ void VertVFX( input.instanceID = instanceID; #endif -#if (SHADERPASS != SHADERPASS_MOTION_VECTORS) +#if (SHADERPASS != SHADERPASS_MOTION_VECTORS || SHADERPASS == SHADERPASS_XR_MOTION_VECTORS) packedOutput = vert(input); #else MotionVectorPassAttributes dummy = (MotionVectorPassAttributes)0; From dc52a53932820a02f5e596a1227a2afc8fdd7050 Mon Sep 17 00:00:00 2001 From: Kenny Tan Date: Thu, 2 Oct 2025 19:30:51 +0000 Subject: [PATCH 020/115] [UUM-115475][URP 2D][6000.4] Remove unsafe light pass to fix PowerVR --- .../Runtime/2D/Rendergraph/DrawLight2DPass.cs | 306 ++++++------------ 1 file changed, 106 insertions(+), 200 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs index 13f90393c57..20f8e548299 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs @@ -8,11 +8,11 @@ namespace UnityEngine.Rendering.Universal internal class DrawLight2DPass : ScriptableRenderPass { static readonly string k_LightPass = "Light2D Pass"; - static readonly string k_LightLowLevelPass = "Light2D LowLevelPass"; + static readonly string k_LightSRTPass = "Light2D SRT Pass"; static readonly string k_LightVolumetricPass = "Light2D Volumetric Pass"; private static readonly ProfilingSampler m_ProfilingSampler = new ProfilingSampler(k_LightPass); - private static readonly ProfilingSampler m_ProfilingSamplerLowLevel = new ProfilingSampler(k_LightLowLevelPass); + private static readonly ProfilingSampler m_ProfilingSampleSRT = new ProfilingSampler(k_LightSRTPass); private static readonly ProfilingSampler m_ProfilingSamplerVolume = new ProfilingSampler(k_LightVolumetricPass); internal static readonly int k_InverseHDREmulationScaleID = Shader.PropertyToID("_InverseHDREmulationScale"); internal static readonly string k_NormalMapID = "_NormalMap"; @@ -22,7 +22,7 @@ internal class DrawLight2DPass : ScriptableRenderPass internal static MaterialPropertyBlock s_PropertyBlock = new MaterialPropertyBlock(); - public void Setup(RenderGraph renderGraph, ref Renderer2DData rendererData) + internal void Setup(RenderGraph renderGraph, ref Renderer2DData rendererData) { foreach (var light in rendererData.lightCullResult.visibleLights) { @@ -55,158 +55,78 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData } #endif - private static void Execute(RasterCommandBuffer cmd, PassData passData, ref LayerBatch layerBatch) + private static void Execute(RasterCommandBuffer cmd, PassData passData, ref LayerBatch layerBatch, int lightTextureIndex) { cmd.SetGlobalFloat(k_InverseHDREmulationScaleID, 1.0f / passData.rendererData.hdrEmulationScale); - for (var i = 0; i < layerBatch.activeBlendStylesIndices.Length; ++i) - { - var blendStyleIndex = layerBatch.activeBlendStylesIndices[i]; - var blendOpName = passData.rendererData.lightBlendStyles[blendStyleIndex].name; - cmd.BeginSample(blendOpName); + var blendStyleIndex = layerBatch.activeBlendStylesIndices[lightTextureIndex]; + var blendOpName = passData.rendererData.lightBlendStyles[blendStyleIndex].name; + cmd.BeginSample(blendOpName); - if (!passData.isVolumetric) - RendererLighting.EnableBlendStyle(cmd, i, true); + var indicesIndex = Renderer2D.supportsMRT ? lightTextureIndex : 0; + if (!passData.isVolumetric) + RendererLighting.EnableBlendStyle(cmd, indicesIndex, true); - var lights = passData.layerBatch.lights; + var lights = passData.layerBatch.lights; - for (int j = 0; j < lights.Count; ++j) - { - var light = lights[j]; + for (int j = 0; j < lights.Count; ++j) + { + var light = lights[j]; - // Check if light is valid - if (light == null || - light.lightType == Light2D.LightType.Global || - light.blendStyleIndex != blendStyleIndex) - continue; + // Check if light is valid + if (light == null || + light.lightType == Light2D.LightType.Global || + light.blendStyleIndex != blendStyleIndex) + continue; - // Check if light is volumetric - if (passData.isVolumetric && - (light.volumeIntensity <= 0.0f || - !light.volumetricEnabled || - layerBatch.endLayerValue != light.GetTopMostLitLayer())) - continue; + // Check if light is volumetric + if (passData.isVolumetric && + (light.volumeIntensity <= 0.0f || + !light.volumetricEnabled || + layerBatch.endLayerValue != light.GetTopMostLitLayer())) + continue; - var useShadows = passData.layerBatch.lightStats.useShadows && layerBatch.shadowIndices.Contains(j); - var lightMaterial = passData.rendererData.GetLightMaterial(light, passData.isVolumetric, useShadows); - var lightMesh = light.lightMesh; + var useShadows = passData.layerBatch.lightStats.useShadows && layerBatch.shadowIndices.Contains(j); + var lightMaterial = passData.rendererData.GetLightMaterial(light, passData.isVolumetric, useShadows); + var lightMesh = light.lightMesh; - // For Batching. - var index = light.batchSlotIndex; - var slotIndex = RendererLighting.lightBatch.SlotIndex(index); - bool canBatch = RendererLighting.lightBatch.CanBatch(light, lightMaterial, index, out int lightHash); + // For Batching. + var index = light.batchSlotIndex; + var slotIndex = RendererLighting.lightBatch.SlotIndex(index); + bool canBatch = RendererLighting.lightBatch.CanBatch(light, lightMaterial, index, out int lightHash); - bool breakBatch = !canBatch; - if (breakBatch && LightBatch.isBatchingSupported) - RendererLighting.lightBatch.Flush(cmd); + bool breakBatch = !canBatch; + if (breakBatch && LightBatch.isBatchingSupported) + RendererLighting.lightBatch.Flush(cmd); - if (passData.layerBatch.lightStats.useNormalMap) - s_PropertyBlock.SetTexture(k_NormalMapID, passData.normalMap); + if (passData.layerBatch.lightStats.useNormalMap) + s_PropertyBlock.SetTexture(k_NormalMapID, passData.normalMap); - if (useShadows && TryGetShadowIndex(ref layerBatch, j, out var shadowIndex)) - s_PropertyBlock.SetTexture(k_ShadowMapID, passData.shadowTextures[shadowIndex]); + if (useShadows && TryGetShadowIndex(ref layerBatch, j, out var shadowIndex)) + s_PropertyBlock.SetTexture(k_ShadowMapID, passData.shadowTextures[shadowIndex]); - if (!passData.isVolumetric || (passData.isVolumetric && light.volumetricEnabled)) - RendererLighting.SetCookieShaderProperties(light, s_PropertyBlock); + if (!passData.isVolumetric || (passData.isVolumetric && light.volumetricEnabled)) + RendererLighting.SetCookieShaderProperties(light, s_PropertyBlock); - // Set shader global properties - RendererLighting.SetPerLightShaderGlobals(cmd, light, slotIndex, passData.isVolumetric, useShadows, LightBatch.isBatchingSupported); + // Set shader global properties + RendererLighting.SetPerLightShaderGlobals(cmd, light, slotIndex, passData.isVolumetric, useShadows, LightBatch.isBatchingSupported); - if (light.normalMapQuality != Light2D.NormalMapQuality.Disabled || light.lightType == Light2D.LightType.Point) - RendererLighting.SetPerPointLightShaderGlobals(cmd, light, slotIndex, LightBatch.isBatchingSupported); + if (light.normalMapQuality != Light2D.NormalMapQuality.Disabled || light.lightType == Light2D.LightType.Point) + RendererLighting.SetPerPointLightShaderGlobals(cmd, light, slotIndex, LightBatch.isBatchingSupported); - if (LightBatch.isBatchingSupported) - { - RendererLighting.lightBatch.AddBatch(light, lightMaterial, light.GetMatrix(), lightMesh, 0, lightHash, index); - RendererLighting.lightBatch.Flush(cmd); - } - else - { - cmd.DrawMesh(lightMesh, light.GetMatrix(), lightMaterial, 0, 0, s_PropertyBlock); - } + if (LightBatch.isBatchingSupported) + { + RendererLighting.lightBatch.AddBatch(light, lightMaterial, light.GetMatrix(), lightMesh, 0, lightHash, index); + RendererLighting.lightBatch.Flush(cmd); } - - RendererLighting.EnableBlendStyle(cmd, i, false); - cmd.EndSample(blendOpName); - } - } - - internal static void ExecuteUnsafe(UnsafeCommandBuffer cmd, PassData passData, ref LayerBatch layerBatch, List lights) - { - cmd.SetGlobalFloat(k_InverseHDREmulationScaleID, 1.0f / passData.rendererData.hdrEmulationScale); - - for (var i = 0; i < layerBatch.activeBlendStylesIndices.Length; ++i) - { - var blendStyleIndex = layerBatch.activeBlendStylesIndices[i]; - var blendOpName = passData.rendererData.lightBlendStyles[blendStyleIndex].name; - cmd.BeginSample(blendOpName); - - if (!Renderer2D.supportsMRT && !passData.isVolumetric) - cmd.SetRenderTarget(passData.lightTextures[i]); - - var indicesIndex = Renderer2D.supportsMRT ? i : 0; - if (!passData.isVolumetric) - RendererLighting.EnableBlendStyle(cmd, indicesIndex, true); - - for (int j = 0; j < lights.Count; ++j) + else { - var light = lights[j]; - - // Check if light is valid - if (light == null || - light.lightType == Light2D.LightType.Global || - light.blendStyleIndex != blendStyleIndex) - continue; - - // Check if light is volumetric - if (passData.isVolumetric && - (light.volumeIntensity <= 0.0f || - !light.volumetricEnabled || - layerBatch.endLayerValue != light.GetTopMostLitLayer())) - continue; - - var useShadows = passData.layerBatch.lightStats.useShadows && layerBatch.shadowIndices.Contains(j); - var lightMaterial = passData.rendererData.GetLightMaterial(light, passData.isVolumetric, useShadows); - var lightMesh = light.lightMesh; - - // For Batching. - var index = light.batchSlotIndex; - var slotIndex = RendererLighting.lightBatch.SlotIndex(index); - bool canBatch = RendererLighting.lightBatch.CanBatch(light, lightMaterial, index, out int lightHash); - - //bool breakBatch = !canBatch; - //if (breakBatch && LightBatch.isBatchingSupported) - // RendererLighting.lightBatch.Flush(cmd); - - if (passData.layerBatch.lightStats.useNormalMap) - s_PropertyBlock.SetTexture(k_NormalMapID, passData.normalMap); - - if (useShadows && TryGetShadowIndex(ref layerBatch, j, out var shadowIndex)) - s_PropertyBlock.SetTexture(k_ShadowMapID, passData.shadowTextures[shadowIndex]); - - if (!passData.isVolumetric || (passData.isVolumetric && light.volumetricEnabled)) - RendererLighting.SetCookieShaderProperties(light, s_PropertyBlock); - - // Set shader global properties - RendererLighting.SetPerLightShaderGlobals(cmd, light, slotIndex, passData.isVolumetric, useShadows, LightBatch.isBatchingSupported); - - if (light.normalMapQuality != Light2D.NormalMapQuality.Disabled || light.lightType == Light2D.LightType.Point) - RendererLighting.SetPerPointLightShaderGlobals(cmd, light, slotIndex, LightBatch.isBatchingSupported); - - //if (LightBatch.isBatchingSupported) - //{ - // RendererLighting.lightBatch.AddBatch(light, lightMaterial, light.GetMatrix(), lightMesh, 0, lightHash, index); - // RendererLighting.lightBatch.Flush(cmd); - //} - //else - { - cmd.DrawMesh(lightMesh, light.GetMatrix(), lightMaterial, 0, 0, s_PropertyBlock); - } + cmd.DrawMesh(lightMesh, light.GetMatrix(), lightMaterial, 0, 0, s_PropertyBlock); } - - RendererLighting.EnableBlendStyle(cmd, indicesIndex, false); - cmd.EndSample(blendOpName); } + + RendererLighting.EnableBlendStyle(cmd, indicesIndex, false); + cmd.EndSample(blendOpName); } internal class PassData @@ -218,15 +138,46 @@ internal class PassData internal TextureHandle normalMap; internal TextureHandle[] shadowTextures; - // TODO: Optimize and remove low level pass - // For low level shadow and light pass - internal TextureHandle[] lightTextures; + internal int lightTextureIndex; } - public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData rendererData, ref LayerBatch layerBatch, int batchIndex, bool isVolumetric = false) + void InitializeRenderPass(IRasterRenderGraphBuilder builder, ContextContainer frameData, PassData passData, Renderer2DData rendererData, ref LayerBatch layerBatch, int batchIndex, bool isVolumetric = false) { Universal2DResourceData universal2DResourceData = frameData.Get(); CommonResourceData commonResourceData = frameData.Get(); + + intermediateTexture[0] = commonResourceData.activeColorTexture; + + if (layerBatch.lightStats.useNormalMap) + builder.UseTexture(universal2DResourceData.normalsTexture[batchIndex]); + + if (layerBatch.lightStats.useShadows) + { + passData.shadowTextures = universal2DResourceData.shadowTextures[batchIndex]; + for (var i = 0; i < passData.shadowTextures.Length; i++) + builder.UseTexture(passData.shadowTextures[i]); + } + + foreach (var light in layerBatch.lights) + { + if (light == null || !light.m_CookieSpriteTextureHandle.IsValid()) + continue; + + if (!isVolumetric || (isVolumetric && light.volumetricEnabled)) + builder.UseTexture(light.m_CookieSpriteTextureHandle); + } + + passData.layerBatch = layerBatch; + passData.rendererData = rendererData; + passData.isVolumetric = isVolumetric; + passData.normalMap = layerBatch.lightStats.useNormalMap ? universal2DResourceData.normalsTexture[batchIndex] : TextureHandle.nullHandle; + + builder.AllowGlobalStateModification(true); + } + + internal void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData rendererData, ref LayerBatch layerBatch, int batchIndex, bool isVolumetric = false) + { + Universal2DResourceData universal2DResourceData = frameData.Get(); UniversalCameraData cameraData = frameData.Get(); DebugHandler debugHandler = ScriptableRenderPass.GetActiveDebugHandler(cameraData); @@ -245,47 +196,26 @@ public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData !isDebugLightingActive) return; - // Render single RTs by using low level pass for apis that don't support MRTs + // Render single RTs by for apis that don't support MRTs if (!isVolumetric && !Renderer2D.supportsMRT) { - using (var builder = graph.AddUnsafePass(k_LightLowLevelPass, out var passData, m_ProfilingSamplerLowLevel)) + for (var i = 0; i < layerBatch.activeBlendStylesIndices.Length; ++i) { - intermediateTexture[0] = commonResourceData.activeColorTexture; - passData.lightTextures = universal2DResourceData.lightTextures[batchIndex]; - - for (var i = 0; i < passData.lightTextures.Length; i++) - builder.UseTexture(passData.lightTextures[i], AccessFlags.Write); - - if (layerBatch.lightStats.useNormalMap) - builder.UseTexture(universal2DResourceData.normalsTexture[batchIndex]); - - if (layerBatch.lightStats.useShadows) + using (var builder = graph.AddRasterRenderPass(k_LightSRTPass, out var passData, m_ProfilingSampleSRT)) { - passData.shadowTextures = universal2DResourceData.shadowTextures[batchIndex]; - for (var i = 0; i < passData.shadowTextures.Length; i++) - builder.UseTexture(passData.shadowTextures[i]); - } + InitializeRenderPass(builder, frameData, passData, rendererData, ref layerBatch, batchIndex, isVolumetric); - foreach (var light in layerBatch.lights) - { - if (light == null || !light.m_CookieSpriteTextureHandle.IsValid()) - continue; - - if (!isVolumetric || (isVolumetric && light.volumetricEnabled)) - builder.UseTexture(light.m_CookieSpriteTextureHandle); - } + var lightTextures = universal2DResourceData.lightTextures[batchIndex]; - passData.layerBatch = layerBatch; - passData.rendererData = rendererData; - passData.isVolumetric = isVolumetric; - passData.normalMap = layerBatch.lightStats.useNormalMap ? universal2DResourceData.normalsTexture[batchIndex] : TextureHandle.nullHandle; + builder.SetRenderAttachment(lightTextures[i], 0); - builder.AllowGlobalStateModification(true); + passData.lightTextureIndex = i; - builder.SetRenderFunc((PassData data, UnsafeGraphContext context) => - { - ExecuteUnsafe(context.cmd, data, ref data.layerBatch, data.layerBatch.lights); - }); + builder.SetRenderFunc((PassData data, RasterGraphContext context) => + { + Execute(context.cmd, data, ref data.layerBatch, data.lightTextureIndex); + }); + } } } else @@ -293,41 +223,17 @@ public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData // Default Raster Pass with MRTs using (var builder = graph.AddRasterRenderPass(!isVolumetric ? k_LightPass : k_LightVolumetricPass, out var passData, !isVolumetric ? m_ProfilingSampler : m_ProfilingSamplerVolume)) { - intermediateTexture[0] = commonResourceData.activeColorTexture; + InitializeRenderPass(builder, frameData, passData, rendererData, ref layerBatch, batchIndex, isVolumetric); + var lightTextures = !isVolumetric ? universal2DResourceData.lightTextures[batchIndex] : intermediateTexture; for (var i = 0; i < lightTextures.Length; i++) builder.SetRenderAttachment(lightTextures[i], i); - - if (layerBatch.lightStats.useNormalMap) - builder.UseTexture(universal2DResourceData.normalsTexture[batchIndex]); - - if (layerBatch.lightStats.useShadows) - { - passData.shadowTextures = universal2DResourceData.shadowTextures[batchIndex]; - for (var i = 0; i < passData.shadowTextures.Length; i++) - builder.UseTexture(passData.shadowTextures[i]); - } - - foreach (var light in layerBatch.lights) - { - if (light == null || !light.m_CookieSpriteTextureHandle.IsValid()) - continue; - - if (!isVolumetric || (isVolumetric && light.volumetricEnabled)) - builder.UseTexture(light.m_CookieSpriteTextureHandle); - } - - passData.layerBatch = layerBatch; - passData.rendererData = rendererData; - passData.isVolumetric = isVolumetric; - passData.normalMap = layerBatch.lightStats.useNormalMap ? universal2DResourceData.normalsTexture[batchIndex] : TextureHandle.nullHandle; - - builder.AllowGlobalStateModification(true); - + builder.SetRenderFunc((PassData data, RasterGraphContext context) => { - Execute(context.cmd, data, ref data.layerBatch); + for (var i = 0; i < data.layerBatch.activeBlendStylesIndices.Length; ++i) + Execute(context.cmd, data, ref data.layerBatch, i); }); } } From 50fc2c19fbc282ae1dea8b7bde4fb7a1e07d598c Mon Sep 17 00:00:00 2001 From: Julien Fryer Date: Fri, 3 Oct 2025 20:25:29 +0000 Subject: [PATCH 021/115] [VFX][Fix] Fix VFX blackboard losing selection when scrolling --- .../GraphView/Blackboard/VFXBlackboard.cs | 33 +++++++++++++++---- .../Blackboard/VFXBlackboardPropertyView.cs | 1 + 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Blackboard/VFXBlackboard.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Blackboard/VFXBlackboard.cs index 7103b67098f..a40a35d9431 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Blackboard/VFXBlackboard.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Blackboard/VFXBlackboard.cs @@ -473,14 +473,23 @@ private DragVisualMode OnHandleDrop(HandleDragAndDropArgs arg) if (fieldId.Count > 0) { - foreach (var id in fieldId) + m_IsChangingSelection = true; + try { - m_Treeview.viewController.Move(id, arg.parentId, childIndex, true); - } + foreach (var id in fieldId) + { + m_Treeview.viewController.Move(id, arg.parentId, childIndex, true); + } - UpdateLastCategoryItem(arg.parentId); - m_Treeview.ClearSelection(); + UpdateLastCategoryItem(arg.parentId); + m_Treeview.ClearSelection(); + } + finally + { + m_IsChangingSelection = false; + } + return DragVisualMode.Move; } @@ -586,7 +595,19 @@ private void UnbindItem(VisualElement element, int index) element.parent.parent.RemoveFromClassList("sub-graph"); element.parent.parent.RemoveFromClassList("separator"); element.ClearClassList(); - element.Clear(); + + + // work around to avoid losing selection with virtualized treeview + bool oldChangingSelection = m_IsChangingSelection; + m_IsChangingSelection = true; + try + { + element.Clear(); + } + finally + { + m_IsChangingSelection = oldChangingSelection; + } } private void BindItem(VisualElement element, int index) diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Blackboard/VFXBlackboardPropertyView.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Blackboard/VFXBlackboardPropertyView.cs index 93f5396801f..3fcdf939e3f 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Blackboard/VFXBlackboardPropertyView.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Blackboard/VFXBlackboardPropertyView.cs @@ -18,6 +18,7 @@ class VFXBlackboardPropertyView : VisualElement, IControlledElement(OnAttachToPanel); + pickingMode = PickingMode.Ignore; // This fixes an issue where this element intercepts up event but not down, potentially putting the treeview incorrectly into drag mode. } public VFXBlackboardRow owner { get; set; } From 11a04a5e3557d9d9829ac506d37a987e49de3e34 Mon Sep 17 00:00:00 2001 From: Rose Hirigoyen Date: Fri, 3 Oct 2025 20:25:31 +0000 Subject: [PATCH 022/115] Update render graph samples to use the render graph helpers --- .../Blit w. FrameData/BlitRendererFeature.cs | 289 ------------------ .../Blit/CopyRenderFeature.cs | 15 +- ... FrameData.meta => BlitWithFrameData.meta} | 0 .../BlitWithFrameData/BlitRendererFeature.cs | 216 +++++++++++++ .../BlitRendererFeature.cs.meta | 0 .../BlitWithMaterial.meta | 2 +- .../BlitAndSwapColorRendererFeature.cs | 41 ++- .../BlitAndSwapColorRendererFeature.cs.meta | 2 +- .../BlitWithMaterial/BlitWithMaterial.mat | 2 +- .../BlitWithMaterial.mat.meta | 2 +- .../BlitWithMaterial.shader.meta | 2 +- .../Compute/ComputeRendererFeature.cs | 105 ++++--- .../ComputeShaderScreenInOutRenderFeature.cs | 37 +-- .../URPRenderGraphSamples/Culling.meta | 8 + .../CullingRenderPassRendererFeature.cs | 11 +- .../CullingRenderPassRendererFeature.cs.meta | 2 + .../FrameBufferFetchRenderFeature.cs | 36 +-- .../GbufferVisualizationRendererFeature.cs | 28 +- .../GlobalGbuffersRendererFeature.cs | 34 +-- .../MRT/MrtRendererFeature.cs | 12 +- .../OutputTextureRendererFeature.cs | 30 +- .../RendererList/RendererListRenderFeature.cs | 40 ++- ...eta => TextureReferenceWithFrameData.meta} | 0 .../TextureRefRendererFeature.cs | 108 +++---- .../TextureRefRendererFeature.cs.meta | 0 .../UnsafePass/UnsafePassRenderFeature.cs | 36 +-- 26 files changed, 492 insertions(+), 566 deletions(-) delete mode 100644 Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs rename Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/{Blit w. FrameData.meta => BlitWithFrameData.meta} (100%) create mode 100644 Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithFrameData/BlitRendererFeature.cs rename Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/{Blit w. FrameData => BlitWithFrameData}/BlitRendererFeature.cs.meta (100%) create mode 100644 Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling.meta create mode 100644 Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling/CullingRenderPassRendererFeature.cs.meta rename Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/{TextureReference w. FrameData.meta => TextureReferenceWithFrameData.meta} (100%) rename Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/{TextureReference w. FrameData => TextureReferenceWithFrameData}/TextureRefRendererFeature.cs (51%) rename Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/{TextureReference w. FrameData => TextureReferenceWithFrameData}/TextureRefRendererFeature.cs.meta (100%) diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs deleted file mode 100644 index bc0e4910244..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs +++ /dev/null @@ -1,289 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Rendering.RenderGraphModule; -using UnityEngine.Rendering; -using UnityEngine.Rendering.Universal; - -// Example of how Blit operatrions can be handled using frameData using multiple ScriptaleRenderPasses. -public class BlitRendererFeature : ScriptableRendererFeature -{ - // The class living in frameData. It will take care of managing the texture resources. - public class BlitData : ContextItem, IDisposable - { - // Textures used for the blit operations. - RTHandle m_TextureFront; - RTHandle m_TextureBack; - // Render graph texture handles. - TextureHandle m_TextureHandleFront; - TextureHandle m_TextureHandleBack; - - // Scale bias is used to control how the blit operation is done. The x and y parameter controls the scale - // and z and w controls the offset. - static Vector4 scaleBias = new Vector4(1f, 1f, 0f, 0f); - - // Bool to manage which texture is the most resent. - bool m_IsFront = true; - - // The texture which contains the color buffer from the most resent blit operation. - public TextureHandle texture; - - // Function used to initialize BlitDatat. Should be called before starting to use the class for each frame. - public void Init(RenderGraph renderGraph, RenderTextureDescriptor targetDescriptor, string textureName = null) - { - // Checks if the texture name is valid and puts in default value if not. - var texName = String.IsNullOrEmpty(textureName) ? "_BlitTextureData" : textureName; - // Reallocate if the RTHandles are being initialized for the first time or if the targetDescriptor has changed since last frame. - RenderingUtils.ReAllocateHandleIfNeeded(ref m_TextureFront, targetDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: texName + "Front"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_TextureBack, targetDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: texName + "Back"); - // Create the texture handles inside render graph by importing the RTHandles in render graph. - m_TextureHandleFront = renderGraph.ImportTexture(m_TextureFront); - m_TextureHandleBack = renderGraph.ImportTexture(m_TextureBack); - // Sets the active texture to the front buffer - texture = m_TextureHandleFront; - } - - // We will need to reset the texture handle after each frame to avoid leaking invalid texture handles - // since the texture handles only lives for one frame. - public override void Reset() - { - // Resets the color buffers to avoid carrying invalid references to the next frame. - // This could be BlitData texture handles from last frame which will now be invalid. - m_TextureHandleFront = TextureHandle.nullHandle; - m_TextureHandleBack = TextureHandle.nullHandle; - texture = TextureHandle.nullHandle; - // Reset the acrive texture to be the front buffer. - m_IsFront = true; - } - - // The data we use to transfer data to the render function. - class PassData - { - // When makeing a blit operation we will need a source, a destination and a material. - // The source and destination is used to know where to copy from and to. - public TextureHandle source; - public TextureHandle destination; - // The material is used to transform the color buffer while copying. - public Material material; - } - - // For this function we don't take a material as argument to show that we should remember to reset values - // we don't use to avoid leaking values from last frame. - public void RecordBlitColor(RenderGraph renderGraph, ContextContainer frameData) - { - // Check if BlitData's texture is valid if it isn't initialize BlitData. - if (!texture.IsValid()) - { - // Setup the descriptor we use for BlitData. We should use the camera target's descriptor as a start. - var cameraData = frameData.Get(); - var descriptor = cameraData.cameraTargetDescriptor; - // We disable MSAA for the blit operations. - descriptor.msaaSamples = 1; - // We disable the depth buffer, since we are only makeing transformations to the color buffer. - descriptor.depthStencilFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.None; - Init(renderGraph, descriptor); - } - - // Starts the recording of the render graph pass given the name of the pass - // and outputting the data used to pass data to the execution of the render function. - using (var builder = renderGraph.AddRasterRenderPass("BlitColorPass", out var passData)) - { - // Fetch UniversalResourceData from frameData to retrive the camera's active color attachment. - var resourceData = frameData.Get(); - - // Remember to reset material since it contains the value from last frame. - // If we don't do this we would get the material last commited to the BlitPassData using RenderGraph - // since we reuse the object allocation. - passData.material = null; - passData.source = resourceData.activeColorTexture; - passData.destination = texture; - - // Sets input attachment to the cameras color buffer. - builder.UseTexture(passData.source); - // Sets output attachment 0 to BlitData's active texture. - builder.SetRenderAttachment(passData.destination, 0); - - // Sets the render function. - builder.SetRenderFunc((PassData passData, RasterGraphContext rgContext) => ExecutePass(passData, rgContext)); - } - } - - // Records a render graph render pass which blits the BlitData's active texture back to the camera's color attachment. - public void RecordBlitBackToColor(RenderGraph renderGraph, ContextContainer frameData) - { - // Check if BlitData's texture is valid if it isn't it hasn't been initialized or an error has occured. - if (!texture.IsValid()) return; - - // Starts the recording of the render graph pass given the name of the pass - // and outputting the data used to pass data to the execution of the render function. - using (var builder = renderGraph.AddRasterRenderPass($"BlitBackToColorPass", out var passData)) - { - // Fetch UniversalResourceData from frameData to retrive the camera's active color attachment. - var resourceData = frameData.Get(); - - // Remember to reset material. Otherwise you would use the last material used in RecordFullScreenPass. - passData.material = null; - passData.source = texture; - passData.destination = resourceData.activeColorTexture; - - // Sets input attachment to BitData's active texture. - builder.UseTexture(passData.source); - // Sets output attachment 0 to the cameras color buffer. - builder.SetRenderAttachment(passData.destination, 0); - - // Sets the render function. - builder.SetRenderFunc((PassData passData, RasterGraphContext rgContext) => ExecutePass(passData, rgContext)); - } - } - - // This function blits the whole screen for a given material. - public void RecordFullScreenPass(RenderGraph renderGraph, string passName, Material material) - { - // Checks if the data is previously initialized and if the material is valid. - if (!texture.IsValid() || material == null) - { - Debug.LogWarning("Invalid input texture handle, will skip fullscreen pass."); - return; - } - - // Starts the recording of the render graph pass given the name of the pass - // and outputting the data used to pass data to the execution of the render function. - using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData)) - { - // Switching the active texture handles to avoid blit. If we want the most recent - // texture we can simply look at the variable texture - m_IsFront = !m_IsFront; - - // Setting data to be used when executing the render function. - passData.material = material; - passData.source = texture; - - // Swap the active texture. - if (m_IsFront) - passData.destination = m_TextureHandleFront; - else - passData.destination = m_TextureHandleBack; - - // Sets input attachment to BlitData's old active texture. - builder.UseTexture(passData.source); - // Sets output attachment 0 to BitData's new active texture. - builder.SetRenderAttachment(passData.destination, 0); - - // Update the texture after switching. - texture = passData.destination; - - // Sets the render function. - builder.SetRenderFunc((PassData passData, RasterGraphContext rgContext) => ExecutePass(passData, rgContext)); - } - } - - // ExecutePass is the render function for each of the blit render graph recordings. - // This is good practice to avoid using variables outside of the lambda it is called from. - // It is static to avoid using member variables which could cause unintended behaviour. - static void ExecutePass(PassData data, RasterGraphContext rgContext) - { - // We can use blit with or without a material both using the static scaleBias to avoid reallocations. - if (data.material == null) - Blitter.BlitTexture(rgContext.cmd, data.source, scaleBias, 0, false); - else - Blitter.BlitTexture(rgContext.cmd, data.source, scaleBias, data.material, 0); - } - - // We need to release the textures once the renderer is released which will dispose every item inside - // frameData (also data types previously created in earlier frames). - public void Dispose() - { - m_TextureFront?.Release(); - m_TextureBack?.Release(); - } - } - - // Initial render pass for the renderer feature which is run to initialize the data in frameData and copying - // the camera's color attachment to a texture inside BlitData so we can do transformations using blit. - class BlitStartRenderPass : ScriptableRenderPass - { - public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) - { - // Creating the data BlitData inside frameData. - var blitTextureData = frameData.Create(); - // Copies the camera's color attachment to a texture inside BlitData. - blitTextureData.RecordBlitColor(renderGraph, frameData); - } - } - - // Render pass which makes a blit for each material given to the renderer feature. - class BlitRenderPass : ScriptableRenderPass - { - List m_Materials; - - // Setup function used to retrive the materials from the renderer feature. - public void Setup(List materials) - { - m_Materials = materials; - } - - public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) - { - // Retrives the BlitData from the current frame. - var blitTextureData = frameData.Get(); - foreach(var material in m_Materials) - { - // Skip current cycle if the material is null since there is no need to blit if no - // transformation happens. - if (material == null) continue; - // Records the material blit pass. - blitTextureData.RecordFullScreenPass(renderGraph, $"Blit {material.name} Pass", material); - } - } - } - - // Final render pass to copying the texture back to the camera's color attachment. - class BlitEndRenderPass : ScriptableRenderPass - { - public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) - { - // Retrives the BlitData from the current frame and blit it back again to the camera's color attachment. - var blitTextureData = frameData.Get(); - blitTextureData.RecordBlitBackToColor(renderGraph, frameData); - } - } - - [SerializeField] - [Tooltip("Materials used for blitting. They will be blit in the same order they have in the list starting from index 0. ")] - List m_Materials; - - BlitStartRenderPass m_StartPass; - BlitRenderPass m_BlitPass; - BlitEndRenderPass m_EndPass; - - // Here you can create passes and do the initialization of them. This is called everytime serialization happens. - public override void Create() - { - m_StartPass = new BlitStartRenderPass(); - m_BlitPass = new BlitRenderPass(); - m_EndPass = new BlitEndRenderPass(); - - // Configures where the render pass should be injected. - m_StartPass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; - m_BlitPass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; - m_EndPass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; - } - - // Here you can inject one or multiple render passes in the renderer. - // This method is called when setting up the renderer once per-camera. - public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) - { - // Early return if there is no texture to blit. - if (m_Materials == null || m_Materials.Count == 0) return; - - // Pass the material to the blit render pass. - m_BlitPass.Setup(m_Materials); - - // Since they have the same RenderPassEvent the order matters when enqueueing them. - renderer.EnqueuePass(m_StartPass); - renderer.EnqueuePass(m_BlitPass); - renderer.EnqueuePass(m_EndPass); - } -} - - diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit/CopyRenderFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit/CopyRenderFeature.cs index 5254f619243..ea668a6c015 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit/CopyRenderFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit/CopyRenderFeature.cs @@ -12,9 +12,10 @@ class CopyRenderPass : ScriptableRenderPass { public CopyRenderPass() { - //The pass will read the current color texture. That needs to be an intermediate texture. It's not supported to use the BackBuffer as input texture. - //By setting this property, URP will automatically create an intermediate texture. - //It's good practice to set it here and not from the RenderFeature. This way, the pass is selfcontaining and you can use it to directly enqueue the pass from a monobehaviour without a RenderFeature. + // The pass will read the current color texture. That needs to be an intermediate texture. It's not supported to use the BackBuffer as input texture. + // By setting this property, URP will automatically create an intermediate texture. + // It's good practice to set it here and not from the RenderFeature. This way, the pass is self-containing, + // and you can use it to directly enqueue the pass from a MonoBehaviour without a RenderFeature. requiresIntermediateTexture = true; } @@ -22,8 +23,6 @@ public CopyRenderPass() // Each ScriptableRenderPass can use the RenderGraph handle to add multiple render passes to the render graph public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - const string passName = "Copy To or From Temp Texture"; - // UniversalResourceData contains all the texture handles used by the renderer, including the active color and depth textures // The active color and depth textures are the main color and depth buffers that the camera renders into UniversalResourceData resourceData = frameData.Get(); @@ -41,10 +40,10 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if (RenderGraphUtils.CanAddCopyPassMSAA()) { // This simple pass copies the active color texture to a new texture. - renderGraph.AddCopyPass(resourceData.activeColorTexture, destination, passName: passName); + renderGraph.AddCopyPass(resourceData.activeColorTexture, destination, passName: "Copy Active Color Texture to Temp Texture"); - //Need to copy back otherwise the pass gets culled since the result of the previous copy is not read. This is just for demonstration purposes. - renderGraph.AddCopyPass(destination, resourceData.activeColorTexture, passName: passName); + // Need to copy back - otherwise the pass gets culled since the result of the previous copy is not read. This is just for demonstration purposes. + renderGraph.AddCopyPass(destination, resourceData.activeColorTexture, passName: "Copy Temp Texture to Active Color Texture"); } else { diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithFrameData.meta similarity index 100% rename from Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData.meta rename to Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithFrameData.meta diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithFrameData/BlitRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithFrameData/BlitRendererFeature.cs new file mode 100644 index 00000000000..3ac48bfbbff --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithFrameData/BlitRendererFeature.cs @@ -0,0 +1,216 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering.RenderGraphModule; +using UnityEngine.Rendering; +using UnityEngine.Rendering.RenderGraphModule.Util; +using UnityEngine.Rendering.Universal; + +// Example of how Blit operations can be handled using frameData and multiple ScriptableRenderPasses. +// BlitStartRenderPass initializes the BlitData in the frameData and copies the camera's color attachment to a texture inside the BlitData. +// BlitRenderPass makes a blit for each material given to the RendererFeature. +// BlitEndRenderPass blits the resulting BlitData texture back to the camera's color attachment. + +public class BlitRendererFeature : ScriptableRendererFeature +{ + // The class living in frameData. It will take care of managing the texture resources. + public class BlitData : ContextItem + { + // Render graph texture handles. + TextureHandle m_TextureHandleFront; + TextureHandle m_TextureHandleBack; + + // Scale bias is used to control how the blit operation is done. The x and y parameter controls the scale + // and z and w controls the offset. + static Vector4 scaleBias = new Vector4(1f, 1f, 0f, 0f); + + // Bool to manage which texture is the most recent. + bool m_IsFront = true; + + // The texture which contains the color buffer from the most recent blit operation. + public TextureHandle texture; + + // Function used to initialize BlitData. Should be called before starting to use the class for each frame. + public void Init(RenderGraph renderGraph, TextureDesc targetDescriptor, string textureName = null) + { + // Checks if the texture name is valid and puts in default value if not. + var baseTexName = String.IsNullOrEmpty(textureName) ? "_BlitTextureData" : textureName; + + targetDescriptor.filterMode = FilterMode.Bilinear; + targetDescriptor.wrapMode = TextureWrapMode.Clamp; + // We disable MSAA for the blit operations. + targetDescriptor.msaaSamples = MSAASamples.None; + // We disable the depth buffer, since we are only making transformations to the color buffer. + targetDescriptor.depthBufferBits = 0; + + targetDescriptor.name = baseTexName + "Front"; + m_TextureHandleFront = renderGraph.CreateTexture(targetDescriptor); + + targetDescriptor.name = baseTexName + "Back"; + m_TextureHandleBack = renderGraph.CreateTexture(targetDescriptor); + + // Sets the active texture to the front buffer. + texture = m_TextureHandleFront; + } + + // We will need to reset the texture handle after each frame to avoid leaking invalid texture handles + // since the texture handles only lives for one frame. + public override void Reset() + { + // Resets the color buffers to avoid carrying invalid references to the next frame. + // This could be BlitData texture handles from last frame which will now be invalid. + m_TextureHandleFront = TextureHandle.nullHandle; + m_TextureHandleBack = TextureHandle.nullHandle; + texture = TextureHandle.nullHandle; + // Reset the active texture to be the front buffer. + m_IsFront = true; + } + + // For this function we don't take a material as argument to show that we should remember to reset values + // we don't use to avoid leaking values from last frame. + public void RecordBlitColor(RenderGraph renderGraph, ContextContainer frameData) + { + // Fetch UniversalResourceData from frameData to retrieve the camera's active color attachment. + var resourceData = frameData.Get(); + + // Check if BlitData's texture is valid if it isn't initialize BlitData. + if (!texture.IsValid()) + { + // Set up the descriptor we use for BlitData. We use the camera color's descriptor as a start. + Init(renderGraph, resourceData.activeColorTexture.GetDescriptor(renderGraph)); + } + + // Copy the activeColorTexture to the current front texture + renderGraph.AddCopyPass(resourceData.activeColorTexture, texture, "BlitCameraColorToTexturePass"); + } + + // Records a render graph render pass which blits the BlitData's current front texture back to the camera's color attachment. + public void RecordBlitBackToColor(RenderGraph renderGraph, ContextContainer frameData) + { + // Check if BlitData's texture is valid if it isn't it hasn't been initialized or an error has occured. + if (!texture.IsValid()) return; + + // Fetch UniversalResourceData from frameData to retrieve the camera's active color attachment. + var resourceData = frameData.Get(); + + // Copy the current front texture back to the activeColorTexture. + renderGraph.AddCopyPass(texture, resourceData.activeColorTexture, "BlitTextureToColorPass"); + } + + // This function blits the whole screen for a given material. + public void RecordFullScreenPass(RenderGraph renderGraph, string passName, Material material) + { + // Checks if the data is previously initialized and if the material is valid. + if (!texture.IsValid() || material == null) + { + Debug.LogWarning("Invalid input texture handle, will skip fullscreen pass."); + return; + } + + // Switching the active texture handles to avoid blit. If we want the most recent + // texture we can simply look at the variable texture. + m_IsFront = !m_IsFront; + + // Swap the active texture. + var destination = m_IsFront ? m_TextureHandleFront : m_TextureHandleBack; + + // Setting data to be used when executing the render function. + var blitMaterialParameters = new RenderGraphUtils.BlitMaterialParameters(texture, destination, material, 0); + + // Blit + renderGraph.AddBlitPass(blitMaterialParameters, passName); + + // Update the texture after switching. + texture = destination; + } + } + + // Initial render pass for the renderer feature which is run to initialize the data in frameData and copying + // the camera's color attachment to a texture inside BlitData so we can do transformations using blit. + class BlitStartRenderPass : ScriptableRenderPass + { + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) + { + // Creating the data BlitData inside frameData. + var blitTextureData = frameData.Create(); + // Copies the camera's color attachment to a texture inside BlitData. + blitTextureData.RecordBlitColor(renderGraph, frameData); + } + } + + // Render pass which makes a blit for each material given to the renderer feature. + class BlitRenderPass : ScriptableRenderPass + { + List m_Materials; + + // Setup function used to retrieve the materials from the renderer feature. + public void Setup(List materials) + { + m_Materials = materials; + } + + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) + { + // Retrieves the BlitData from the current frame. + var blitTextureData = frameData.Get(); + foreach(var material in m_Materials) + { + // Skip current cycle if the material is null since there is no need to blit if no + // transformation happens. + if (material == null) continue; + // Records the material blit pass. + blitTextureData.RecordFullScreenPass(renderGraph, $"Blit {material.name} Pass", material); + } + } + } + + // Final render pass for copying the texture back to the camera's color attachment. + class BlitEndRenderPass : ScriptableRenderPass + { + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) + { + // Retrieves the BlitData from the current frame and blit it back again to the camera's color attachment. + var blitTextureData = frameData.Get(); + blitTextureData.RecordBlitBackToColor(renderGraph, frameData); + } + } + + [SerializeField] + [Tooltip("Materials used for blitting. They will be blit in the same order they have in the list starting from index 0. ")] + List m_Materials; + + BlitStartRenderPass m_StartPass; + BlitRenderPass m_BlitPass; + BlitEndRenderPass m_EndPass; + + // Here you can create and initialize passes. This is called every time serialization happens. + public override void Create() + { + m_StartPass = new BlitStartRenderPass(); + m_BlitPass = new BlitRenderPass(); + m_EndPass = new BlitEndRenderPass(); + + // Configures where the render pass should be injected. + m_StartPass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; + m_BlitPass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; + m_EndPass.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; + } + + // Here you can inject one or multiple render passes in the renderer. + // This method is called when setting up the renderer once per-camera. + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) + { + // Early return if there is no texture to blit. + if (m_Materials == null || m_Materials.Count == 0) return; + + // Pass the material to the blit render pass. + m_BlitPass.Setup(m_Materials); + + // Since they have the same RenderPassEvent the order matters when enqueueing them. + renderer.EnqueuePass(m_StartPass); + renderer.EnqueuePass(m_BlitPass); + renderer.EnqueuePass(m_EndPass); + } +} + + diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithFrameData/BlitRendererFeature.cs.meta similarity index 100% rename from Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Blit w. FrameData/BlitRendererFeature.cs.meta rename to Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithFrameData/BlitRendererFeature.cs.meta diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial.meta index 07129902ec2..89f9da16daf 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial.meta +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 50ac20be57e0e2c4581d99cbfc925a30 +guid: 09bb382fce3ae4ac09a3d2c953cbfb8f folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitAndSwapColorRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitAndSwapColorRendererFeature.cs index 34f1c82b71d..414c4c93e0f 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitAndSwapColorRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitAndSwapColorRendererFeature.cs @@ -4,12 +4,11 @@ using UnityEngine.Rendering.Universal; using UnityEngine.Rendering.RenderGraphModule.Util; -//This example blits the active CameraColor to a new texture. It shows how to do a blit with material, and how to use the ResourceData to avoid another blit back to the active color target. -//This example is for API demonstrative purposes. - +// This example blits the active CameraColor to a new texture. It shows how to do a blit with material, and how to use the ResourceData to avoid another blit back to the active color target. +// This example is for API demonstrative purposes. // This pass blits the whole screen for a given material to a temp texture, and swaps the UniversalResourceData.cameraColor to this temp texture. -// Therefor, the next pass that references the cameraColor will reference this new temp texture as the cameraColor, saving us a blit. +// Therefore, the next pass that references the cameraColor will reference this new temp texture as the cameraColor, saving us a blit. // Using the ResourceData, you can manage swapping of resources yourself and don't need a bespoke API like the SwapColorBuffer API that was specific for the cameraColor. // This allows you to write more decoupled passes without the added costs of avoidable copies/blits. public class BlitAndSwapColorPass : ScriptableRenderPass @@ -24,43 +23,43 @@ public void Setup(Material mat) { m_BlitMaterial = mat; - //The pass will read the current color texture. That needs to be an intermediate texture. It's not supported to use the BackBuffer as input texture. - //By setting this property, URP will automatically create an intermediate texture. This has a performance cost so don't set this if you don't need it. - //It's good practice to set it here and not from the RenderFeature. This way, the pass is selfcontaining and you can use it to directly enqueue the pass from a monobehaviour without a RenderFeature. + // The pass will read the current color texture. That needs to be an intermediate texture. It's not supported to use the BackBuffer as input texture. + // By setting this property, URP will automatically create an intermediate texture. This has a performance cost so don't set this if you don't need it. + // It's good practice to set it here and not from the RenderFeature. This way, the pass is self-containing, + // and you can use it to directly enqueue the pass from a MonoBehaviour without a RenderFeature. requiresIntermediateTexture = true; } public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - // UniversalResourceData contains all the texture handles used by the renderer, including the active color and depth textures - // The active color and depth textures are the main color and depth buffers that the camera renders into + // UniversalResourceData contains all the texture handles used by the renderer, including the active color and depth textures. + // The active color and depth textures are the main color and depth buffers that the camera renders into. var resourceData = frameData.Get(); - //This should never happen since we set m_Pass.requiresIntermediateTexture = true; - //Unless you set the render event to AfterRendering, where we only have the BackBuffer. + // This should never happen since we set m_Pass.requiresIntermediateTexture = true; + // Unless you set the render event to AfterRendering, where we only have the BackBuffer. if (resourceData.isActiveTargetBackBuffer) { Debug.LogError($"Skipping render pass. BlitAndSwapColorRendererFeature requires an intermediate ColorTexture, we can't use the BackBuffer as a texture input."); return; } - // The destination texture is created here, - // the texture is created with the same dimensions as the active color texture + // The destination texture is created here, + // the texture is created with the same dimensions as the active color texture. var source = resourceData.activeColorTexture; - + var destinationDesc = renderGraph.GetTextureDesc(source); destinationDesc.name = $"CameraColor-{m_PassName}"; destinationDesc.clearBuffer = false; - TextureHandle destination = renderGraph.CreateTexture(destinationDesc); RenderGraphUtils.BlitMaterialParameters para = new(source, destination, m_BlitMaterial, 0); renderGraph.AddBlitPass(para, passName: m_PassName); - //FrameData allows to get and set internal pipeline buffers. Here we update the CameraColorBuffer to the texture that we just wrote to in this pass. - //Because RenderGraph manages the pipeline resources and dependencies, following up passes will correctly use the right color buffer. - //This optimization has some caveats. You have to be careful when the color buffer is persistent across frames and between different cameras, such as in camera stacking. - //In those cases you need to make sure your texture is an RTHandle and that you properly manage the lifecycle of it. + // FrameData allows to get and set internal pipeline buffers. Here we update the CameraColorBuffer to the texture that we just wrote to in this pass. + // Because RenderGraph manages the pipeline resources and dependencies, following up passes will correctly use the right color buffer. + // This optimization has some caveats. You have to be careful when the color buffer is persistent across frames and between different cameras, such as in camera stacking. + // In those cases you need to make sure your texture is an RTHandle and that you properly manage the lifecycle of it. resourceData.cameraColor = destination; } } @@ -75,7 +74,7 @@ public class BlitAndSwapColorRendererFeature : ScriptableRendererFeature BlitAndSwapColorPass m_Pass; - // Here you can create passes and do the initialization of them. This is called everytime serialization happens. + // Here you can create passes and do the initialization of them. This is called every time serialization happens. public override void Create() { m_Pass = new BlitAndSwapColorPass(); @@ -96,7 +95,7 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD } m_Pass.Setup(material); - renderer.EnqueuePass(m_Pass); + renderer.EnqueuePass(m_Pass); } } diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitAndSwapColorRendererFeature.cs.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitAndSwapColorRendererFeature.cs.meta index b29e14ce7c5..916f14de5ad 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitAndSwapColorRendererFeature.cs.meta +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitAndSwapColorRendererFeature.cs.meta @@ -1,2 +1,2 @@ fileFormatVersion: 2 -guid: 77eb6cb355f03b344a41286db9580ec6 \ No newline at end of file +guid: 7b89c4d71193d4b40b9b1532d7cc40ee \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.mat b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.mat index b00d17f621c..b9d7a5c984b 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.mat +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.mat @@ -21,7 +21,7 @@ Material: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: BlitWithMaterial - m_Shader: {fileID: 4800000, guid: 385f641abc6b039499b848e66d7ca429, type: 3} + m_Shader: {fileID: 4800000, guid: fa0759f0cab2944609a61ef36ec489a2, type: 3} m_Parent: {fileID: 0} m_ModifiedSerializedProperties: 0 m_ValidKeywords: [] diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.mat.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.mat.meta index 89e21d96bd1..5d8a3a8a26b 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.mat.meta +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.mat.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8a71df55532db1d43b360c40a9f67532 +guid: 66d4c156766b146b7baa4a870a2fe9a7 NativeFormatImporter: externalObjects: {} mainObjectFileID: 0 diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.shader.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.shader.meta index cc5d3d21b52..89295501e38 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.shader.meta +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/BlitWithMaterial/BlitWithMaterial.shader.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 385f641abc6b039499b848e66d7ca429 +guid: fa0759f0cab2944609a61ef36ec489a2 ShaderImporter: externalObjects: {} defaultTextures: [] diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Compute/ComputeRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Compute/ComputeRendererFeature.cs index 0bea87d6db8..97a350ce7fc 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Compute/ComputeRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Compute/ComputeRendererFeature.cs @@ -16,38 +16,29 @@ public class ComputeRendererFeature : ScriptableRendererFeature class ComputePass : ScriptableRenderPass { // Compute shader. - ComputeShader cs; + ComputeShader m_ComputeShader; - // Compute buffers: - GraphicsBuffer inputBuffer; - GraphicsBuffer outputBuffer; + // Compute buffers. + BufferHandle m_InputBufferHandle; + BufferHandle m_OutputBufferHandle; - // Reflection of the data output. I use a preallocated list to avoid memory - // allocations each frame. - int[] outputData = new int[20]; + // Input data for the compute shader. + private List inputData = new List(); - // Constructor is used to initialize the compute buffers. + // Constructor is used to initialize the input data. public ComputePass() { - BufferDesc desc = new BufferDesc(20, sizeof(int)); - inputBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, 20, sizeof(int)); - var list = new List(); for (int i = 0; i < 20; i++) { - list.Add(i); + inputData.Add(i); } - inputBuffer.SetData(list); - outputBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, 20, sizeof(int)); - // We don't need to initialize the output normaly with data but I read the - // buffer from the start when each frame is starting to look at last frames result. - outputBuffer.SetData(list); } // Setup function to transfer the compute shader from the renderer feature to // the render pass. public void Setup(ComputeShader cs) { - this.cs = cs; + m_ComputeShader = cs; } // PassData is used to pass data when recording to the execution of the pass. @@ -55,37 +46,75 @@ class PassData { // Compute shader. public ComputeShader cs; + // Buffer handles for the compute buffers. public BufferHandle input; public BufferHandle output; + public List bufferData; + } + + // ReadbackPassData is used to read data asynchronously from the specified bufferHandle. + class ReadbackPassData + { + public BufferHandle bufferHandle; } // Records a render graph render pass which blits the BlitData's active texture back to the camera's color attachment. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - // Last frame data should be done. Retrive the data if valid. - outputBuffer.GetData(outputData); - Debug.Log($"Output from compute shader: {string.Join(", ", outputData)}"); - - // We need to import buffers when they are created outside of the render graph. - BufferHandle inputHandle = renderGraph.ImportBuffer(inputBuffer); - BufferHandle outputHandle = renderGraph.ImportBuffer(outputBuffer); + // Create buffers + var bufferDesc = new BufferDesc() + { + name = "InputBuffer", + count = 20, + stride = sizeof(int), + target = GraphicsBuffer.Target.Structured + }; + m_InputBufferHandle = renderGraph.CreateBuffer(bufferDesc); + + bufferDesc.name = "OutputBuffer"; + m_OutputBufferHandle = renderGraph.CreateBuffer(bufferDesc); // Starts the recording of the render graph pass given the name of the pass // and outputting the data used to pass data to the execution of the render function. // Notice that we use "AddComputePass" when we are working with compute. using (var builder = renderGraph.AddComputePass("ComputePass", out PassData passData)) { - // Set the pass data so the data can be transfered from the recording to the execution. - passData.cs = cs; - passData.input = inputHandle; - passData.output = outputHandle; - - // UseBuffer is used to setup render graph dependencies together with read and write flags. - builder.UseBuffer(passData.input); + // Set the pass data so the data can be transferred from the recording to the execution. + passData.cs = m_ComputeShader; + passData.input = m_InputBufferHandle; + passData.output = m_OutputBufferHandle; + passData.bufferData = inputData; + + // Log input data in the console to show before and after + Debug.Log($"Input Data: {string.Join(",", inputData)}"); + + // UseBuffer is used to set up render graph dependencies together with read and write flags. + builder.UseBuffer(passData.input, AccessFlags.Read); builder.UseBuffer(passData.output, AccessFlags.Write); - // The execution function is also call SetRenderfunc for compute passes. - builder.SetRenderFunc((PassData data, ComputeGraphContext cgContext) => ExecutePass(data, cgContext)); + + // The execution function is also called SetRenderFunc for compute passes. + builder.SetRenderFunc(static (PassData data, ComputeGraphContext cgContext) => ExecutePass(data, cgContext)); + } + + // Because our BufferHandles are managed by the render graph, we don't have access to the data when the + // RenderGraph is done executing. We need to add a pass to read from the output buffer if we want to + // use the output data from the compute shader. + using (var builder = renderGraph.AddUnsafePass("ReadbackPass", out ReadbackPassData passData)) + { + builder.AllowPassCulling(false); + + // Which buffer to read from + passData.bufferHandle = m_OutputBufferHandle; + builder.UseBuffer(passData.bufferHandle, AccessFlags.Read); + builder.SetRenderFunc(static (ReadbackPassData data, UnsafeGraphContext ctx) => + { + ctx.cmd.RequestAsyncReadback(data.bufferHandle, (AsyncGPUReadbackRequest request) => + { + var result = request.GetData(); + Debug.Log($"Output Data: {string.Join(",", result)}"); + }); + }); } } @@ -95,17 +124,17 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer static void ExecutePass(PassData data, ComputeGraphContext cgContext) { // Attaches the compute buffers. + cgContext.cmd.SetBufferData(data.input, data.bufferData); cgContext.cmd.SetComputeBufferParam(data.cs, data.cs.FindKernel("CSMain"), "inputData", data.input); cgContext.cmd.SetComputeBufferParam(data.cs, data.cs.FindKernel("CSMain"), "outputData", data.output); - // Dispaches the compute shader with a given kernel as entrypoint. - // The amount of thread groups determine how many groups to execute of the kernel. + // Dispatches the compute shader with a given kernel as entrypoint. + // The amount of thread groups determines how many groups to execute of the kernel. cgContext.cmd.DispatchCompute(data.cs, data.cs.FindKernel("CSMain"), 1, 1, 1); } } [SerializeField] ComputeShader computeShader; - ComputePass m_ComputePass; /// @@ -121,7 +150,7 @@ public override void Create() // This method is called when setting up the renderer once per-camera. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { - // Check if the system support compute shaders, if not make an early exit. + // Check if the system supports compute shaders, if not make an early exit. if (!SystemInfo.supportsComputeShaders) { Debug.LogWarning("Device does not support compute shaders. The pass will be skipped."); diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/ComputeShaderScreenInOutRenderFeature/ComputeShaderScreenInOutRenderFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/ComputeShaderScreenInOutRenderFeature/ComputeShaderScreenInOutRenderFeature.cs index b6687be3a6b..5ae714296bb 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/ComputeShaderScreenInOutRenderFeature/ComputeShaderScreenInOutRenderFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/ComputeShaderScreenInOutRenderFeature/ComputeShaderScreenInOutRenderFeature.cs @@ -16,15 +16,15 @@ public class ComputeShaderScreenInOutRenderFeature : ScriptableRendererFeature { class HeatmapPass : ScriptableRenderPass { - // Compute Shader programs + // Compute Shader programs. ComputeShader m_HeatmapComputeShader; ComputeShader m_HeatmapBrightnessComputeShader; - // Kernel of each computeShader shader + // Kernel of each computeShader shader. int m_KernelHeatMapComputeShader; int m_KernelHeatmapBrightnessComputeShader; - // Heatmap computeShader shader (uses a computeShader shader to simulate a group of enemies moving around) + // Heatmap computeShader shader (uses a computeShader shader to simulate a group of enemies moving around). BufferHandle m_EnemyBuffer; Vector2[] m_EnemyPositions; const int k_EnemyCount = 64; @@ -48,8 +48,8 @@ public void Setup(ComputeShader heatmapCS, ComputeShader heatmapBrightnessCS) m_EnemyPositions = new Vector2[k_EnemyCount]; } - // Compute Pass Data - // This will be used for both Compute Shaders + // Compute Pass Data. + // This will be used for both Compute Shaders. class ComputePassData { public ComputeShader computeShader; @@ -87,11 +87,11 @@ public override void RecordRenderGraph(RenderGraph graph, ContextContainer conte // such as the active color texture, depth texture, and more. var resourceData = context.Get(); - // Getting the dimensions from the camera Color + // Getting the dimensions from the camera Color. var width = resourceData.cameraColor.GetDescriptor(graph).width; var height = resourceData.cameraColor.GetDescriptor(graph).height; - // Update the enemy positions + // Update the enemy positions. UpdateEnemyPositions(width, height); // Creating a texture descriptor based on the activeColorTexture's descriptor values. @@ -125,7 +125,7 @@ public override void RecordRenderGraph(RenderGraph graph, ContextContainer conte target = GraphicsBuffer.Target.Structured }; - // Now adding it to the RenderGraph + // Now adding it to the RenderGraph. m_EnemyBuffer = graph.CreateBuffer(bufferDesc); // This is the definition of the computeShader render pass, @@ -146,13 +146,13 @@ public override void RecordRenderGraph(RenderGraph graph, ContextContainer conte builder.UseTexture(passData.output, AccessFlags.Write); builder.UseBuffer(passData.enemyHandle, AccessFlags.Read); - // Set the function to execute the computeShader pass (using static to improve the performance) + // Set the function to execute the computeShader pass (using static to improve the performance). builder.SetRenderFunc(static(ComputePassData data, ComputeGraphContext ctx) => { // The SetBufferData use a command buffer to send the enemy position data - // from the passData.enemyHandle to the passData.positions - ctx.cmd.SetBufferData(data.enemyHandle, data.positions);//Use data.enemyPositions - //to ensure it remains scoped to the render function. + // from the passData.enemyHandle to the passData.positions. + ctx.cmd.SetBufferData(data.enemyHandle, data.positions); // Use data.enemyPositions + // to ensure it remains scoped to the render function. ctx.cmd.SetComputeIntParam(data.computeShader, "k_EnemyCount", data.enemyCount); ctx.cmd.SetComputeBufferParam(data.computeShader, data.kernel, "m_EnemyPositions", data.enemyHandle); ctx.cmd.SetComputeTextureParam(data.computeShader, data.kernel, "heatmapTexture", data.output); @@ -161,7 +161,7 @@ public override void RecordRenderGraph(RenderGraph graph, ContextContainer conte } // Here if you set resourceData.cameraColor = m_HeatmapTextureHandle and comment out the second pass, you - // will get the result of the compute pass directly instead of reusing it in a second pass + // will get the result of the compute pass directly instead of reusing it in a second pass. // This is the second computeShader render pass. // In this pass, the input is the current `m_HeatmapTextureHandle`, @@ -169,7 +169,7 @@ public override void RecordRenderGraph(RenderGraph graph, ContextContainer conte // will be stored in `m_HeatmapBrightnessTextureHandle`. using (var builder = graph.AddComputePass("ComputeCameraColorFromHeatmapPass", out var passData)) { - // Assign data to the computeShader shader data + // Assign data to the computeShader shader data. passData.computeShader = m_HeatmapBrightnessComputeShader; passData.kernel = m_KernelHeatmapBrightnessComputeShader; passData.input = m_HeatmapTextureHandle; @@ -181,7 +181,7 @@ public override void RecordRenderGraph(RenderGraph graph, ContextContainer conte builder.UseTexture(passData.input, AccessFlags.Read); builder.UseTexture(passData.output, AccessFlags.Write); - // Set the function to execute the computeShader pass + // Set the function to execute the computeShader pass. builder.SetRenderFunc(static(ComputePassData data, ComputeGraphContext ctx) => { ctx.cmd.SetComputeTextureParam(data.computeShader, data.kernel, "heatmapTexture", data.input); @@ -190,15 +190,16 @@ public override void RecordRenderGraph(RenderGraph graph, ContextContainer conte }); } - // The resulted texture of the last computeShader pass is assigned to the current Camera Color + // The resulted texture of the last computeShader pass is assigned to the current Camera Color. resourceData.cameraColor = m_HeatmapBrightnessTextureHandle; } } - // The inspector fields of the Renderer Feature + // The inspector fields of the Renderer Feature. [SerializeField] ComputeShader HeatmapComputeShader; [SerializeField] ComputeShader HeatmapBrightnessComputeShader; - // The HeatmapPass instance + + // The HeatmapPass instance. HeatmapPass heatmapPass; public override void Create() diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling.meta new file mode 100644 index 00000000000..0c6e15bb779 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 598943c9393b540b986b90d0ba594f7c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling/CullingRenderPassRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling/CullingRenderPassRendererFeature.cs index e80ab5380eb..a3b9007fae1 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling/CullingRenderPassRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling/CullingRenderPassRendererFeature.cs @@ -8,7 +8,6 @@ public class CullingRenderPassRendererFeature : ScriptableRendererFeature { // Layer mask used to filter objects to put in the renderer list. public LayerMask m_LayerMask; - private CullingRenderPass m_CullingRenderPass; public override void Create() @@ -62,7 +61,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer var cameraData = frameData.Get(); - // CullContextData contains the culling APIs. + // CullContextData contains the culling APIs. var cullContextData = frameData.Get(); // Retrieve the culling parameters for the camera used. @@ -71,10 +70,10 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // Perform culling using the CullContextData API. var cullingResults = cullContextData.Cull(ref cullingParameters); - // Fill up the passData with the data needed by the pass + // Fill up the passData with the data needed by the pass. InitRendererLists(cullingResults, frameData, ref passData, renderGraph); - // Make sure the renderer list is valid + // Make sure the renderer list is valid. if (!passData.rendererListHandle.IsValid()) return; @@ -86,7 +85,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.Write); // Assign the ExecutePass function to the render pass delegate, which will be called by the render graph when executing the pass. - builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecutePass(data, context)); + builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => ExecutePass(data, context)); } } @@ -101,7 +100,7 @@ static void ExecutePass(PassData data, RasterGraphContext context) // Sample utility method that showcases how to create a renderer list via the RenderGraph API. private void InitRendererLists(CullingResults cullResults, ContextContainer frameData, ref PassData passData, RenderGraph renderGraph) { - // Access the relevant frame data from the Universal Render Pipeline + // Access the relevant frame data from the Universal Render Pipeline. var universalRenderingData = frameData.Get(); var cameraData = frameData.Get(); var lightData = frameData.Get(); diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling/CullingRenderPassRendererFeature.cs.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling/CullingRenderPassRendererFeature.cs.meta new file mode 100644 index 00000000000..7d61df871e5 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/Culling/CullingRenderPassRendererFeature.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 449c507e86381462c8fc85c5342da54a \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/FramebufferFetch/FrameBufferFetchRenderFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/FramebufferFetch/FrameBufferFetchRenderFeature.cs index d7bc6cc902f..f6e025241c9 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/FramebufferFetch/FrameBufferFetchRenderFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/FramebufferFetch/FrameBufferFetchRenderFeature.cs @@ -20,13 +20,14 @@ public FrameBufferFetchPass( Material fbFetchMaterial) { m_FBFetchMaterial = fbFetchMaterial; - //The pass will read the current color texture. That needs to be an intermediate texture. It's not supported to use the BackBuffer as input texture. - //By setting this property, URP will automatically create an intermediate texture. This has a performance cost so don't set this if you don't need it. - //It's good practice to set it here and not from the RenderFeature. This way, the pass is selfcontaining and you can use it to directly enqueue the pass from a monobehaviour without a RenderFeature. + // The pass will read the current color texture. That needs to be an intermediate texture. It's not supported to use the BackBuffer as input texture. + // By setting this property, URP will automatically create an intermediate texture. This has a performance cost so don't set this if you don't need it. + // It's good practice to set it here and not from the RenderFeature. This way, the pass is self-containing, + // and you can use it to directly enqueue the pass from a MonoBehaviour without a RenderFeature. requiresIntermediateTexture = true; } - // This class stores the data needed by the pass, passed as parameter to the delegate function that executes the pass + // This class stores the data needed by the pass, passed as parameter to the delegate function that executes the pass. private class PassData { internal TextureHandle src; @@ -34,7 +35,7 @@ private class PassData internal bool useMSAA; } - // This static method is used to execute the pass and passed as the RenderFunc delegate to the RenderGraph render pass + // This static method is used to execute the pass and passed as the RenderFunc delegate to the RenderGraph render pass. static void ExecuteFBFetchPass(PassData data, RasterGraphContext context) { context.cmd.DrawProcedural(Matrix4x4.identity, data.material, data.useMSAA? 1 : 0, MeshTopology.Triangles, 3, 1, null); @@ -47,30 +48,30 @@ private void FBFetchPass(RenderGraph renderGraph, ContextContainer frameData, Te // This simple pass copies the target of the previous pass to a new texture using a custom material and framebuffer fetch. This sample is for API demonstrative purposes, // so the new texture is not used anywhere else in the frame, you can use the frame debugger to verify its contents. - // add a raster render pass to the render graph, specifying the name and the data type that will be passed to the ExecutePass function + // add a raster render pass to the render graph, specifying the name and the data type that will be passed to the ExecutePass function. using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData)) { - // Fill the pass data + // Fill the pass data. passData.material = m_FBFetchMaterial; passData.useMSAA = useMSAA; - // We declare the src as input attachment. This is required for Frame buffer fetch. + // We declare the src as input attachment. This is required for framebuffer fetch. builder.SetInputAttachment(source, 0, AccessFlags.Read); - // Setup as a render target via UseTextureFragment, which is the equivalent of using the old cmd.SetRenderTarget + // Setup as a render target via UseTextureFragment, which is the equivalent of using the old cmd.SetRenderTarget. builder.SetRenderAttachment(destination, 0); // We disable culling for this pass for the demonstrative purpose of this sample, as normally this pass would be culled, - // since the destination texture is not used anywhere else + // since the destination texture is not used anywhere else. builder.AllowPassCulling(false); - // Assign the ExecutePass function to the render pass delegate, which will be called by the render graph when executing the pass - builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecuteFBFetchPass(data, context)); + // Assign the ExecutePass function to the render pass delegate, which will be called by the render graph when executing the pass. + builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => ExecuteFBFetchPass(data, context)); } } // This is where the renderGraph handle can be accessed. - // Each ScriptableRenderPass can use the RenderGraph handle to add multiple render passes to the render graph + // Each ScriptableRenderPass can use the RenderGraph handle to add multiple render passes to the render graph. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { // This pass showcases how to implement framebuffer fetch: this is an advanced TBDR GPU optimization @@ -80,8 +81,8 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // As a result, the passes are merged (you can verify in the RenderGraph Visualizer) and the bandwidth usage is reduced, since we can discard the temporary render target. - // UniversalResourceData contains all the texture handles used by the renderer, including the active color and depth textures - // The active color and depth textures are the main color and depth buffers that the camera renders into + // UniversalResourceData contains all the texture handles used by the renderer, including the active color and depth textures. + // The active color and depth textures are the main color and depth buffers that the camera renders into. var resourceData = frameData.Get(); // The destination texture is created here, @@ -98,8 +99,8 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer FBFetchPass(renderGraph, frameData, source, fbFetchDestination, destinationDesc.msaaSamples != MSAASamples.None); - //Copy back the FBF output to the camera color to easily see the result in the game view - //This copy pass also uses FBF under the hood. All the passes should be merged this way and the destination attachment should be memoryless (no load/store of memory). + // Copy back the FBF output to the camera color to easily see the result in the game view. + // This copy pass also uses FBF under the hood. All the passes should be merged this way and the destination attachment should be memoryless (no load/store of memory). renderGraph.AddCopyPass(fbFetchDestination, source, passName: "Copy Back FF Destination (also using FBF)"); } else @@ -110,7 +111,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer } FrameBufferFetchPass m_FbFetchPass; - public Material m_FBFetchMaterial; /// diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/GbufferVisualization/GbufferVisualizationRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/GbufferVisualization/GbufferVisualizationRendererFeature.cs index dd32bf72d7b..228951d5290 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/GbufferVisualization/GbufferVisualizationRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/GbufferVisualization/GbufferVisualizationRendererFeature.cs @@ -22,28 +22,28 @@ class GBufferVisualizationRenderPass : ScriptableRenderPass // private static readonly int GBufferRenderingLayersIndex = 5; // Components marked as optional are only present when the pipeline requests it. - // If for example there is no rendering layers texture, _GBuffer5 will contain the ShadowMask texture + // If for example there is no rendering layers texture, _GBuffer5 will contain the ShadowMask texture. private static readonly int[] s_GBufferShaderPropertyIDs = new int[] { - // Contains Albedo Texture + // Contains Albedo texture. Shader.PropertyToID("_GBuffer0"), - // Contains Specular Metallic Texture + // Contains Specular Metallic texture. Shader.PropertyToID("_GBuffer1"), - // Contains Normals and Smoothness, referenced as _CameraNormalsTexture in other shaders + // Contains Normals and Smoothness, referenced as _CameraNormalsTexture in other shaders. Shader.PropertyToID("_GBuffer2"), - // Contains Lighting texture + // Contains Lighting texture. Shader.PropertyToID("_GBuffer3"), - // Contains Depth texture, referenced as _CameraDepthTexture in other shaders (optional) + // Contains Depth texture, referenced as _CameraDepthTexture in other shaders (optional). Shader.PropertyToID("_GBuffer4"), - // Contains Rendering Layers Texture, referenced as _CameraRenderingLayersTexture in other shaders (optional) + // Contains Rendering Layers texture, referenced as _CameraRenderingLayersTexture in other shaders (optional). Shader.PropertyToID("_GBuffer5"), - // Contains ShadowMask texture (optional) + // Contains ShadowMask texture (optional). Shader.PropertyToID("_GBuffer6") }; @@ -59,7 +59,7 @@ public void Setup(Material material) m_Material = material; } - // This method will draw the contents of the gBuffer component requested in the shader + // This method will draw the contents of the gBuffer component requested in the shader. static void ExecutePass(PassData data, RasterGraphContext context) { // Here, we read all the gBuffer components as an example even though the shader only needs one. @@ -70,7 +70,7 @@ static void ExecutePass(PassData data, RasterGraphContext context) data.material.SetTexture(s_GBufferShaderPropertyIDs[i], data.gBuffer[i]); } - // Draw the gBuffer component requested by the shader over the geometry + // Draw the gBuffer component requested by the shader over the geometry. context.cmd.DrawProcedural(Matrix4x4.identity, data.material, 0, MeshTopology.Triangles, 3, 1); } @@ -94,14 +94,14 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // For this pass, we want to write to the activeColorTexture, which is the gBuffer Lighting component (_GBuffer3) in the deferred path. builder.SetRenderAttachment(resourceData.activeColorTexture, 0, AccessFlags.Write); - // We are reading the gBuffer components in our pass, so we need call UseTexture on them. + // We are reading the gBuffer components in our pass, so we need to call UseTexture on them. // When they are global, they can be all read with builder.UseAllGlobalTexture(true), but // in this pass they are not global. for (int i = 0; i < resourceData.gBuffer.Length; i++) { if (i == GbufferLightingIndex) { - // We already specify we are writing to it above (SetRenderAttachment) + // We already specify we are writing to it above (SetRenderAttachment). continue; } @@ -112,7 +112,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer passData.gBuffer = gBuffer; // Assigns the ExecutePass function to the render pass delegate. This will be called by the render graph when executing the pass. - builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecutePass(data, context)); + builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => ExecutePass(data, context)); } } } @@ -132,7 +132,7 @@ public override void Create() public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { - // The gBuffers are only used in the Deferred rendering path + // The gBuffers are only used in the Deferred rendering path. if (m_Material != null) { m_GBufferRenderPass.Setup(m_Material); diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/GlobalGbuffers/GlobalGbuffersRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/GlobalGbuffers/GlobalGbuffersRendererFeature.cs index 0ac205a0689..16adb100ff9 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/GlobalGbuffers/GlobalGbuffersRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/GlobalGbuffers/GlobalGbuffersRendererFeature.cs @@ -20,29 +20,29 @@ class GlobalGBuffersRenderPass : ScriptableRenderPass private static readonly int GbufferLightingIndex = 3; private static readonly int GBufferRenderingLayersIndex = 5; - // The pipeline already sets the gBuffer depth component to be global in a few places, so uncomment this code as needed + // The pipeline already sets the gBuffer depth component to be global in a few places, so uncomment this code as needed. // private static readonly int GbufferDepthIndex = 4; // Components marked as optional are only present when the pipeline requests it. - // If for example there is no rendering layers texture, _GBuffer5 will contain the ShadowMask texture + // If for example there is no rendering layers texture, _GBuffer5 will contain the ShadowMask texture. private static readonly int[] s_GBufferShaderPropertyIDs = new int[] { - // Contains Albedo Texture + // Contains Albedo texture. Shader.PropertyToID("_GBuffer0"), - // Contains Specular Metallic Texture + // Contains Specular Metallic texture. Shader.PropertyToID("_GBuffer1"), - // Contains Normals and Smoothness, referenced as _CameraNormalsTexture in other shaders + // Contains Normals and Smoothness, referenced as _CameraNormalsTexture in other shaders. Shader.PropertyToID("_GBuffer2"), - // Contains Lighting texture + // Contains Lighting texture. Shader.PropertyToID("_GBuffer3"), - // Contains Depth texture, referenced as _CameraDepthTexture in other shaders (optional) + // Contains Depth texture, referenced as _CameraDepthTexture in other shaders (optional). Shader.PropertyToID("_GBuffer4"), - // Contains Rendering Layers Texture, referenced as _CameraRenderingLayersTexture in other shaders (optional) + // Contains Rendering Layers texture, referenced as _CameraRenderingLayersTexture in other shaders (optional). Shader.PropertyToID("_GBuffer5"), // Contains ShadowMask texture (optional) @@ -55,11 +55,11 @@ private class PassData // This sets the gBuffer components as global after the current pass. After the pass, the gBuffers components made global // will be made accessible using 'builder.UseAllGlobalTextures(true)' instead of 'builder.UseTexture(gBuffer[i]) - // Shaders that use global texture will be able to fetch them without the need to call 'material.SetTexture()' + // Shaders that use global textures will be able to fetch them without the need to call 'material.SetTexture()' // like we do in the ExecutePass function of this pass. private void SetGlobalGBufferTextures(IRasterRenderGraphBuilder builder, TextureHandle[] gBuffer) { - // This loop will make the gBuffers accessible by all shaders using _GBufferX texture shader IDs + // This loop will make the gBuffers accessible by all shaders using _GBufferX texture shader IDs. for (int i = 0; i < gBuffer.Length; i++) { if (i != GbufferLightingIndex && gBuffer[i].IsValid()) @@ -70,12 +70,12 @@ private void SetGlobalGBufferTextures(IRasterRenderGraphBuilder builder, Texture // need to set the ID to point to the corresponding gBuffer component. if (gBuffer[GBufferNormalSmoothnessIndex].IsValid()) { - // After this pass, shaders that use the _CameraNormalsTexture will get the gBuffer's NormalsSmoothnessTexture component + // After this pass, shaders that use the _CameraNormalsTexture will get the gBuffer's NormalsSmoothnessTexture component. builder.SetGlobalTextureAfterPass(gBuffer[GBufferNormalSmoothnessIndex], Shader.PropertyToID("_CameraNormalsTexture")); } - // The pipeline already sets the gBuffer depth component to be global in a few places, so uncomment this code as needed + // The pipeline already sets the gBuffer depth component to be global in a few places, so uncomment this code as needed. // if (GbufferDepthIndex < gBuffer.Length && gBuffer[GbufferDepthIndex].IsValid()) // { // // After this pass, shaders that use the _CameraDepthTexture will get the gBuffer's Depth component (note that it is also set global by the copy depth pass) @@ -85,7 +85,7 @@ private void SetGlobalGBufferTextures(IRasterRenderGraphBuilder builder, Texture if (GBufferRenderingLayersIndex < gBuffer.Length && gBuffer[GBufferRenderingLayersIndex].IsValid()) { - // After this pass, shaders that use the _CameraRenderingLayersTexture will get the gBuffer's RenderingLayersTexture component + // After this pass, shaders that use the _CameraRenderingLayersTexture will get the gBuffer's RenderingLayersTexture component. builder.SetGlobalTextureAfterPass(gBuffer[GBufferRenderingLayersIndex], Shader.PropertyToID("_CameraRenderingLayersTexture")); } @@ -96,20 +96,20 @@ private void SetGlobalGBufferTextures(IRasterRenderGraphBuilder builder, Texture public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { UniversalRenderingData universalRenderingData = frameData.Get(); - // The gBuffer components are only used in deferred mode + // The gBuffer components are only used in deferred mode. if (universalRenderingData.renderingMode != RenderingMode.Deferred) return; - // Get the gBuffer texture handles are stored in the resourceData + // Get the gBuffer texture handles are stored in the resourceData. UniversalResourceData resourceData = frameData.Get(); TextureHandle[] gBuffer = resourceData.gBuffer; using (var builder = renderGraph.AddRasterRenderPass(m_PassName, out var passData)) { builder.AllowPassCulling(false); - // Set the gBuffers to be global after the pass + // Set the gBuffers to be global after the pass. SetGlobalGBufferTextures(builder, gBuffer); - builder.SetRenderFunc((PassData data, RasterGraphContext context) => { /* nothing to be rendered */ }); + builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => { /* nothing to be rendered */ }); } } } diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/MRT/MrtRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/MRT/MrtRendererFeature.cs index 4fca8a725ca..60179252699 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/MRT/MrtRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/MRT/MrtRendererFeature.cs @@ -36,7 +36,7 @@ public void Setup(string texName, Material material, RenderTexture[] renderTextu m_texName = String.IsNullOrEmpty(texName) ? "_ColorTexture" : texName; - //Create RTHandles from the RenderTextures if they have changed. + // Create RTHandles from the RenderTextures if they have changed. for (int i = 0; i < 3; i++) { if (m_RTs[i] == null || m_RTs[i].rt != renderTextures[i]) @@ -60,7 +60,7 @@ public void Setup(string texName, Material material, RenderTexture[] renderTextu public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { var handles = new TextureHandle[3]; - // Imports the texture handles them in RenderGraph. + // Imports the texture handles in RenderGraph. for (int i = 0; i < 3; i++) { handles[i] = renderGraph.ImportTexture(m_RTs[i], m_RTInfos[i]); @@ -69,7 +69,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // and outputting the data used to pass data to the execution of the render function. using (var builder = renderGraph.AddRasterRenderPass("MRT Pass", out var passData)) { - // Fetch the universal resource data to exstract the camera's color attachment. + // Fetch the universal resource data to extract the camera's color attachment. var resourceData = frameData.Get(); // Fill in the pass data using by the render function. @@ -90,7 +90,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer } // Sets the render function. - builder.SetRenderFunc((PassData data, RasterGraphContext rgContext) => ExecutePass(data, rgContext)); + builder.SetRenderFunc(static (PassData data, RasterGraphContext rgContext) => ExecutePass(data, rgContext)); } } @@ -115,7 +115,7 @@ static void ExecutePass(PassData data, RasterGraphContext rgContext) MrtPass m_MrtPass; - // Here you can create passes and do the initialization of them. This is called everytime serialization happens. + // Here you can create passes and do the initialization of them. This is called every time serialization happens. public override void Create() { m_MrtPass = new MrtPass(); @@ -133,7 +133,7 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD // Early exit if there are no materials. if (mrtMaterial == null || renderTextures.Length != 3) { - Debug.LogWarning("Skipping MRTPass because the material is null or render textures doesn't have a size of 3."); + Debug.LogWarning("Skipping MRTPass because the material is null or the renderTextures array doesn't have a size of 3."); return; } diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/OutputTexture/OutputTextureRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/OutputTexture/OutputTextureRendererFeature.cs index 18b7de52ec4..e282d491abf 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/OutputTexture/OutputTextureRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/OutputTexture/OutputTextureRendererFeature.cs @@ -6,11 +6,11 @@ using UnityEngine.Rendering.RenderGraphModule.Util; // MERGING: This pass can be merged with Draw Objects Pass and Draw Skybox pass if you set the m_PassEvent in -// the inspector to After Rendering Opagues and set the texture type to Normal. -// Your can observe this merging in the Render Graph Visualizer. If set to After Rendering Post Processing we -// can now see that the pass isn't merged with any thing. +// the inspector to After Rendering Opaques and set the texture type to Normal. +// You can observe this merging in the Render Graph Visualizer. If set to After Rendering Post Processing we +// can now see that the pass isn't merged with anything. -// This RenderFeature shows how to used RenderGraph to output a specific texture used in URP, how a texture +// This RenderFeature shows how to use the RenderGraph to output a specific texture used in URP, how a texture // can be attached by name to a material and how two render passes can be merged if executed in the correct order. public class OutputTextureRendererFeature : ScriptableRendererFeature { @@ -42,20 +42,20 @@ static TextureHandle GetTextureHandleFromType(UniversalResourceData resourceData } } - // Pass which outputs a texture from rendering to inspect a texture + // Pass which outputs a texture from rendering to inspect a texture. class OutputTexturePass : ScriptableRenderPass { // The texture name you wish to bind the texture handle to for a given material. string m_TextureName; - // The texture type you want to retrive from URP. + // The texture type you want to retrieve from URP. TextureType m_TextureType; // The material used for blitting to the color output. Material m_Material; - // Function set setup the ConfigureInput() and transfer the renderer feature settings to the render pass. + // Function to set up the ConfigureInput() and transfer the renderer feature settings to the render pass. public void Setup(string textureName, TextureType textureType, Material material) { - // Setup code to trigger each corrspoinding texture is ready for use one the pass is run. + // Setup code to trigger each corresponding texture is ready for use when the pass is run. if (textureType == TextureType.OpaqueColor) ConfigureInput(ScriptableRenderPassInput.Color); else if (textureType == TextureType.Depth) @@ -65,11 +65,11 @@ public void Setup(string textureName, TextureType textureType, Material material else if (textureType == TextureType.MotionVector) ConfigureInput(ScriptableRenderPassInput.Motion); - // Setup the texture name, type and material used when blitting. - // In this example we will use a mateial using a custom name for the input texture name when blitting. + // Set up the texture name, type and material used when blitting. + // In this example we will use a material using a custom name for the input texture name when blitting. // This texture name has to match the material texture input you are using. m_TextureName = String.IsNullOrEmpty(textureName) ? "_BlitTexture" : textureName; - // Texture type selects which input we would like to retrive from the camera. + // Texture type selects which input we would like to retrieve from the camera. m_TextureType = textureType; // The material is used to blit the texture to the cameras color attachment. m_Material = material; @@ -78,7 +78,7 @@ public void Setup(string textureName, TextureType textureType, Material material // Records a render graph render pass which blits the BlitData's active texture back to the camera's color attachment. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - // Fetch UniversalResourceData from frameData to retrive the URP's texture handles. + // Fetch UniversalResourceData from frameData to retrieve the URP's texture handles. var resourceData = frameData.Get(); // Sets the texture handle input using the helper function to fetch the correct handle from resourceData. @@ -120,6 +120,12 @@ public override void Create() // This method is called when setting up the renderer once per-camera. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { + if (m_Material == null) + { + Debug.LogWarning("Skipping OutputTexturePass because the material is null."); + return; + } + // Setup the correct data for the render pass, and transfers the data from the renderer feature to the render pass. m_ScriptablePass.Setup(m_TextureName, m_TextureType, m_Material); renderer.EnqueuePass(m_ScriptablePass); diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/RendererList/RendererListRenderFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/RendererList/RendererListRenderFeature.cs index decc8904fa6..ef6a672868d 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/RendererList/RendererListRenderFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/RendererList/RendererListRenderFeature.cs @@ -2,7 +2,6 @@ using UnityEngine; using UnityEngine.Rendering.RenderGraphModule; using UnityEngine.Rendering; -using UnityEngine.Rendering.RendererUtils; using UnityEngine.Rendering.Universal; // This example clears the current active color texture, then renders the scene geometry associated to the m_LayerMask layer. @@ -12,10 +11,10 @@ public class RendererListRenderFeature : ScriptableRendererFeature { class RendererListPass : ScriptableRenderPass { - // Layer mask used to filter objects to put in the renderer list + // Layer mask used to filter objects to put in the renderer list. private LayerMask m_LayerMask; - // List of shader tags used to build the renderer list + // List of shader tags used to build the renderer list. private List m_ShaderTagIdList = new List(); public RendererListPass(LayerMask layerMask) @@ -23,16 +22,16 @@ public RendererListPass(LayerMask layerMask) m_LayerMask = layerMask; } - // This class stores the data needed by the pass, passed as parameter to the delegate function that executes the pass + // This class stores the data needed by the pass, passed as parameter to the delegate function that executes the pass. private class PassData { public RendererListHandle rendererListHandle; } - // Sample utility method that showcases how to create a renderer list via the RenderGraph API + // Sample utility method that showcases how to create a renderer list via the RenderGraph API. private void InitRendererLists(ContextContainer frameData, ref PassData passData, RenderGraph renderGraph) { - // Access the relevant frame data from the Universal Render Pipeline + // Access the relevant frame data from the Universal Render Pipeline. UniversalRenderingData universalRenderingData = frameData.Get(); UniversalCameraData cameraData = frameData.Get(); UniversalLightData lightData = frameData.Get(); @@ -45,8 +44,8 @@ private void InitRendererLists(ContextContainer frameData, ref PassData passData { new ShaderTagId("UniversalForwardOnly"), new ShaderTagId("UniversalForward"), - new ShaderTagId("SRPDefaultUnlit"), // Legacy shaders (do not have a gbuffer pass) are considered forward-only for backward compatibility - new ShaderTagId("LightweightForward") // Legacy shaders (do not have a gbuffer pass) are considered forward-only for backward compatibility + new ShaderTagId("SRPDefaultUnlit"), // Legacy shaders (do not have a gbuffer pass) are considered forward-only for backward compatibility. + new ShaderTagId("LightweightForward") // Legacy shaders (do not have a gbuffer pass) are considered forward-only for backward compatibility. }; m_ShaderTagIdList.Clear(); @@ -60,7 +59,7 @@ private void InitRendererLists(ContextContainer frameData, ref PassData passData passData.rendererListHandle = renderGraph.CreateRendererList(param); } - // This static method is used to execute the pass and passed as the RenderFunc delegate to the RenderGraph render pass + // This static method is used to execute the pass and passed as the RenderFunc delegate to the RenderGraph render pass. static void ExecutePass(PassData data, RasterGraphContext context) { context.cmd.ClearRenderTarget(RTClearFlags.Color, Color.green, 1,0); @@ -69,46 +68,43 @@ static void ExecutePass(PassData data, RasterGraphContext context) } // This is where the renderGraph handle can be accessed. - // Each ScriptableRenderPass can use the RenderGraph handle to add multiple render passes to the render graph + // Each ScriptableRenderPass can use the RenderGraph handle to add multiple render passes to the render graph. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { string passName = "RenderList Render Pass"; // This simple pass clears the current active color texture, then renders the scene geometry associated to the m_LayerMask layer. // Add scene geometry to your own custom layers and experiment switching the layer mask in the render feature UI. - // You can use the frame debugger to inspect the pass output + // You can use the frame debugger to inspect the pass output. // add a raster render pass to the render graph, specifying the name and the data type that will be passed to the ExecutePass function using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData)) { // UniversalResourceData contains all the texture handles used by the renderer, including the active color and depth textures - // The active color and depth textures are the main color and depth buffers that the camera renders into + // The active color and depth textures are the main color and depth buffers that the camera renders into. UniversalResourceData resourceData = frameData.Get(); - // Fill up the passData with the data needed by the pass + // Fill up the passData with the data needed by the pass. InitRendererLists(frameData, ref passData, renderGraph); - // Make sure the renderer list is valid - //if (!passData.rendererListHandle.IsValid()) - // return; + // Optional check to make sure the rendererList is valid. If it isn't, the pass will not execute (instead of the render graph possibly throwing an error). + if (!passData.rendererListHandle.IsValid()) + return; - // We declare the RendererList we just created as an input dependency to this pass, via UseRendererList() + // We declare the RendererList we just created as an input dependency to this pass, via UseRendererList(). builder.UseRendererList(passData.rendererListHandle); // Setup as a render target via UseTextureFragment and UseTextureFragmentDepth, which are the equivalent of using the old cmd.SetRenderTarget(color,depth) builder.SetRenderAttachment(resourceData.activeColorTexture, 0); builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.Write); - // Assign the ExecutePass function to the render pass delegate, which will be called by the render graph when executing the pass - builder.SetRenderFunc((PassData data, RasterGraphContext context) => ExecutePass(data, context)); - - builder.SetRenderFunc(ExecutePass); + // Assign the ExecutePass function to the render pass delegate, which will be called by the render graph when executing the pass. + builder.SetRenderFunc(static (PassData data, RasterGraphContext context) => ExecutePass(data, context)); } } } RendererListPass m_ScriptablePass; - public LayerMask m_LayerMask; /// diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReference w. FrameData.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReferenceWithFrameData.meta similarity index 100% rename from Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReference w. FrameData.meta rename to Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReferenceWithFrameData.meta diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReference w. FrameData/TextureRefRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReferenceWithFrameData/TextureRefRendererFeature.cs similarity index 51% rename from Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReference w. FrameData/TextureRefRendererFeature.cs rename to Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReferenceWithFrameData/TextureRefRendererFeature.cs index e6a46a05a4f..45fc04cde34 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReference w. FrameData/TextureRefRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReferenceWithFrameData/TextureRefRendererFeature.cs @@ -5,10 +5,10 @@ using UnityEngine.Rendering.RenderGraphModule.Util; // In this example we will create a texture reference ContextItem in frameData to hold a reference -// used by furture passes. This is usefull to avoid additional blit operations copying back and forth -// to the cameras color attachment. Instead of copying it back after the blit operation we can instead +// used by future passes. This is useful to avoid additional blit operations copying back and forth +// to the camera's color attachment. Instead of copying it back after the blit operation we can instead // update the reference to the blit destination and use that for future passes. -// The is the prefered way to share resources between passes. Previously, it was common to use global textures for this. +// The frameData is the preferred way to share resources between passes. Previously, it was common to use global textures for this. // However, it's better to avoid using global textures where you can. public class TextureRefRendererFeature : ScriptableRendererFeature { @@ -22,7 +22,7 @@ public class TexRefData : ContextItem // over to next frame. public override void Reset() { - // We should always reset texture handles since they are only vaild for the current frame. + // We should always reset texture handles since they are only valid for the current frame. texture = TextureHandle.nullHandle; } } @@ -30,20 +30,6 @@ public override void Reset() // This pass updates the reference when making a blit operation using a material and the camera's color attachment. class UpdateRefPass : ScriptableRenderPass { - // The data we want to transfer to the render function after recording. - class PassData - { - // For the blit operation we will need the source and destination of the color attachments. - public TextureHandle source; - public TextureHandle destination; - // We will also need a material to transform the color attachment when making a blit operation. - public Material material; - } - - // Scale bias is used to blit from source to distination given a 2d scale in the x and y parameters - // and an offset in the z and w parameters. - static Vector4 scaleBias = new Vector4(1f, 1f, 0f, 0f); - // Material used in the blit operation. Material[] m_DisplayMaterials; @@ -64,61 +50,36 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer Debug.LogWarning($"Skipping render pass for unassigned material."); continue; } + + var texRefExist = frameData.Contains(); + var texRef = frameData.GetOrCreate(); - - // Starts the recording of the render graph pass given the name of the pass - // and outputting the data used to pass data to the execution of the render function. - using (var builder = renderGraph.AddRasterRenderPass($"UpdateRefPass_{mat.name}", out var passData)) + // First time running this pass. Fetch ref from active color buffer. + if (!texRefExist) { - var texRefExist = frameData.Contains(); - var texRef = frameData.GetOrCreate(); - - // First time running this pass. Fetch ref from active color buffer. - if (!texRefExist) - { - var resourceData = frameData.Get(); - // For this first occurence we would like - texRef.texture = resourceData.activeColorTexture; - } - - // Fill in the pass data using by the render function. - - // Use the old reference from TexRefData. - passData.source = texRef.texture; - - var descriptor = passData.source.GetDescriptor(renderGraph); - // We disable MSAA for the blit operations. - descriptor.msaaSamples = MSAASamples.None; - descriptor.name = $"BlitMaterialRefTex_{mat.name}"; - descriptor.clearBuffer = false; - - // Create a new temporary texture to keep the blit result. - passData.destination = renderGraph.CreateTexture(descriptor); - - // Material used in the blit operation. - passData.material = mat; - - // Update the texture reference to the blit destination. - texRef.texture = passData.destination; - - // Sets input attachment. - builder.UseTexture(passData.source); - // Sets color attachment 0. - builder.SetRenderAttachment(passData.destination, 0); - - // Sets the render function. - builder.SetRenderFunc((PassData data, RasterGraphContext rgContext) => ExecutePass(data, rgContext)); + var resourceData = frameData.Get(); + // For this first occurrence we would like: + texRef.texture = resourceData.activeColorTexture; } + + // Create the destination texture for the pass. + var descriptor = texRef.texture.GetDescriptor(renderGraph); + // We disable MSAA for the blit operations. + descriptor.msaaSamples = MSAASamples.None; + descriptor.name = $"BlitMaterialRefTex_{mat.name}"; + descriptor.clearBuffer = false; + + // Create a new temporary texture to keep the blit result. + var destination = renderGraph.CreateTexture(descriptor); + + // Fill in the pass data used by the render function. + var blitPassParams = new RenderGraphUtils.BlitMaterialParameters(texRef.texture, destination, mat, 0); + renderGraph.AddBlitPass(blitPassParams, $"UpdateRefPass_{mat.name}"); + + // Update the texRef. + texRef.texture = destination; } } - - // ExecutePass is the render function for each of the blit render graph recordings. - // This is good practice to avoid using variables outside of the lambda it is called from. - // It is static to avoid using member variables which could cause unintended behaviour. - static void ExecutePass(PassData data, RasterGraphContext rgContext) - { - Blitter.BlitTexture(rgContext.cmd, data.source, scaleBias, data.material, 0); - } } // After updating the reference we will need to use the result copying it back to camera's @@ -128,12 +89,12 @@ class CopyBackRefPass : ScriptableRenderPass // This function blits the reference back to the camera's color attachment. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - // Early exit if TexRefData doesn't exist within frameData since where is nothing to copy back. + // Early exit if TexRefData doesn't exist within frameData since there is nothing to copy back. if (!frameData.Contains()) return; - // Fetch UniversalResourceData to retrive the camera's active color texture. + // Fetch UniversalResourceData to retrieve the camera's active color texture. var resourceData = frameData.Get(); - // Fetch TexRefData to retrive the texture reference. + // Fetch TexRefData to retrieve the texture reference. var texRef = frameData.Get(); renderGraph.AddBlitPass(texRef.texture, resourceData.activeColorTexture, Vector2.one, Vector2.zero, passName: "Blit Back Pass"); @@ -146,7 +107,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer UpdateRefPass m_UpdateRefPass; CopyBackRefPass m_CopyBackRefPass; - // Here you can create passes and do the initialization of them. This is called everytime serialization happens. + // Here you can create passes and do the initialization of them. This is called every time serialization happens. public override void Create() { m_UpdateRefPass = new UpdateRefPass(); @@ -161,8 +122,6 @@ public override void Create() // This method is called when setting up the renderer once per-camera. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { - // Since they have the same RenderPassEvent the order matters when enqueueing them. - // Early exit if there are no materials. if (displayMaterials == null) { @@ -170,6 +129,7 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD return; } + // Since they have the same RenderPassEvent the order matters when enqueueing them. m_UpdateRefPass.Setup(displayMaterials); renderer.EnqueuePass(m_UpdateRefPass); renderer.EnqueuePass(m_CopyBackRefPass); diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReference w. FrameData/TextureRefRendererFeature.cs.meta b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReferenceWithFrameData/TextureRefRendererFeature.cs.meta similarity index 100% rename from Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReference w. FrameData/TextureRefRendererFeature.cs.meta rename to Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/TextureReferenceWithFrameData/TextureRefRendererFeature.cs.meta diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/UnsafePass/UnsafePassRenderFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/UnsafePass/UnsafePassRenderFeature.cs index a495acd6c20..8e06b663816 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/UnsafePass/UnsafePassRenderFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPRenderGraphSamples/UnsafePass/UnsafePassRenderFeature.cs @@ -5,15 +5,15 @@ // This example copies the active color texture to a new texture, it then downsamples the source texture twice. This example is for API demonstrative purposes, // so the new textures are not used anywhere else in the frame, you can use the frame debugger to verify their contents. -// The key concept of this example, is the UnsafePass usage: these type of passes are unsafe and allow using command like SetRenderTarget() which are +// The key concept of this example, is the UnsafePass usage: these type of passes are unsafe and allow using commands like SetRenderTarget() which are // not compatible with RasterRenderPasses. Using UnsafePasses means that the RenderGraph won't try to optimize the pass by merging it inside a NativeRenderPass. // In some cases using UnsafePasses makes sense, if for example we know that a set of adjacent passes are not mergeable, so this can optimize the RenderGraph -// compiling times, on top of simplifying the multiple passes setup. +// compile time, on top of simplifying the multiple passes setup. public class UnsafePassRenderFeature : ScriptableRendererFeature { class UnsafePass : ScriptableRenderPass { - // This class stores the data needed by the pass, passed as parameter to the delegate function that executes the pass + // This class stores the data needed by the pass, passed as parameter to the delegate function that executes the pass. private class PassData { internal TextureHandle source; @@ -22,11 +22,11 @@ private class PassData internal TextureHandle destinationQuarter; } - // This static method is used to execute the pass and passed as the RenderFunc delegate to the RenderGraph render pass + // This static method is used to execute the pass and passed as the RenderFunc delegate to the RenderGraph render pass. static void ExecutePass(PassData data, UnsafeGraphContext context) { // Set manually the RenderTarget for each blit. Each SetRenderTarget call would require a separate RasterCommandPass if we wanted - // to setup RenderGraph for merging passes when possible. + // to set up RenderGraph for merging passes when possible. // In this case we know that these 3 subpasses are not compatible for merging, because RenderTargets have different dimensions, // so we simplify our code to use an unsafe pass, also saving RenderGraph processing time. @@ -55,32 +55,32 @@ static void ExecutePass(PassData data, UnsafeGraphContext context) } // This is where the renderGraph handle can be accessed. - // Each ScriptableRenderPass can use the RenderGraph handle to add multiple render passes to the render graph + // Each ScriptableRenderPass can use the RenderGraph handle to add multiple render passes to the render graph. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { string passName = "Unsafe Pass"; - // add a raster render pass to the render graph, specifying the name and the data type that will be passed to the ExecutePass function + // Add a raster render pass to the render graph, specifying the name and the data type that will be passed to the ExecutePass function. using (var builder = renderGraph.AddUnsafePass(passName, out var passData)) { - // UniversalResourceData contains all the texture handles used by the renderer, including the active color and depth textures - // The active color and depth textures are the main color and depth buffers that the camera renders into + // UniversalResourceData contains all the texture handles used by the renderer, including the active color and depth textures. + // The active color and depth textures are the main color and depth buffers that the camera renders into. UniversalResourceData resourceData = frameData.Get(); - // Fill up the passData with the data needed by the pass + // Fill up the passData with the data needed by the pass. - // Get the active color texture through the frame data, and set it as the source texture for the blit + // Get the active color texture through the frame data, and set it as the source texture for the blit. passData.source = resourceData.activeColorTexture; // The destination textures are created here, // the texture is created with the same dimensions as the active color texture, but with no depth buffer, being a copy of the color texture - // we also disable MSAA as we don't need multisampled textures for this sample - // the other two textures halve the resolution of the previous one + // we also disable MSAA as we don't need multisampled textures for this sample. + // The other two textures halve the resolution of the previous one. var descriptor = passData.source.GetDescriptor(renderGraph); // We disable MSAA for the blit operations. - descriptor.msaaSamples = MSAASamples.None; + descriptor.msaaSamples = MSAASamples.None; descriptor.clearBuffer = false; @@ -105,17 +105,17 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // We declare the src texture as an input dependency to this pass, via UseTexture() builder.UseTexture(passData.source); - // UnsafePasses don't setup the outputs using UseTextureFragment/UseTextureFragmentDepth, you should specify your writes with UseTexture instead + // UnsafePasses don't setup the outputs using UseTextureFragment/UseTextureFragmentDepth, you should specify your writes with UseTexture instead. builder.UseTexture(passData.destination, AccessFlags.WriteAll); builder.UseTexture(passData.destinationHalf, AccessFlags.WriteAll); builder.UseTexture(passData.destinationQuarter, AccessFlags.WriteAll); // We disable culling for this pass for the demonstrative purpose of this sample, as normally this pass would be culled, - // since the destination texture is not used anywhere else + // since the destination texture is not used anywhere else. builder.AllowPassCulling(false); - // Assign the ExecutePass function to the render pass delegate, which will be called by the render graph when executing the pass - builder.SetRenderFunc((PassData data, UnsafeGraphContext context) => ExecutePass(data, context)); + // Assign the ExecutePass function to the render pass delegate, which will be called by the render graph when executing the pass. + builder.SetRenderFunc(static (PassData data, UnsafeGraphContext context) => ExecutePass(data, context)); } } } From fc4b70dad9c108b9fd945932099bf8cf2706c3fd Mon Sep 17 00:00:00 2001 From: Gabriel de la Cruz Date: Sat, 4 Oct 2025 00:24:28 +0000 Subject: [PATCH 023/115] [VFX] Limit Visual Effect asset prewarm step count --- .../Editor/Inspector/VFXAssetEditor.cs | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs index 1b374b29aeb..eb102a689ea 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs @@ -538,6 +538,7 @@ void OnDisable() SerializedProperty instancingDisabledReasonProperty; private static readonly float k_MinimalCommonDeltaTime = 1.0f / 800.0f; + private static readonly uint k_MaximumStepCount = 2400u; // 3 seconds at minimal delta time public static void DisplayPrewarmInspectorGUI(SerializedObject resourceObject, SerializedProperty prewarmDeltaTime, SerializedProperty prewarmStepCount) { @@ -566,13 +567,9 @@ public static void DisplayPrewarmInspectorGUI(SerializedObject resourceObject, S if (EditorGUI.EndChangeCheck()) { bool hasPrewarm = currentTotalTime != 0.0f; - if (currentStepCount <= 0) - { - currentStepCount = hasPrewarm ? 1 : 0; - } - + currentStepCount = Math.Clamp(currentStepCount, hasPrewarm ? 1 : 0, (int)k_MaximumStepCount); currentDeltaTime = hasPrewarm ? currentTotalTime / currentStepCount : 0.0f; - prewarmDeltaTime.floatValue = currentDeltaTime; + prewarmDeltaTime.floatValue = Math.Max(k_MinimalCommonDeltaTime, currentDeltaTime); prewarmStepCount.uintValue = (uint)currentStepCount; resourceObject.ApplyModifiedProperties(); } @@ -581,13 +578,10 @@ public static void DisplayPrewarmInspectorGUI(SerializedObject resourceObject, S currentDeltaTime = EditorGUILayout.FloatField(EditorGUIUtility.TrTextContent("PreWarm Delta Time", "Sets the time in seconds for each step to achieve the desired total prewarm time."), currentDeltaTime); if (EditorGUI.EndChangeCheck()) { - if (currentDeltaTime < k_MinimalCommonDeltaTime) - { - currentDeltaTime = k_MinimalCommonDeltaTime; - } + currentDeltaTime = Math.Max(k_MinimalCommonDeltaTime, currentDeltaTime); float totalTime = currentDeltaTime * currentStepCount; - if (totalTime > currentTotalTime) + if (totalTime > currentTotalTime || currentStepCount == k_MaximumStepCount) { currentTotalTime = totalTime; } @@ -607,6 +601,7 @@ public static void DisplayPrewarmInspectorGUI(SerializedObject resourceObject, S { currentStepCount = candidateStepCount_B; } + currentStepCount = Math.Clamp(currentStepCount, 1, (int)k_MaximumStepCount); prewarmStepCount.uintValue = (uint)currentStepCount; } @@ -618,14 +613,23 @@ public static void DisplayPrewarmInspectorGUI(SerializedObject resourceObject, S { //Multi selection case, can't resolve total time easily EditorGUI.BeginChangeCheck(); + + // Total time disabled in this case + EditorGUI.BeginDisabled(true); + EditorGUI.showMixedValue = true; + EditorGUILayout.FloatField(EditorGUIUtility.TrTextContent("PreWarm Total Time", "Sets the time in seconds to advance the current effect to when it is initially played. "), 0); + EditorGUI.EndDisabled(); + EditorGUI.showMixedValue = prewarmStepCount.hasMultipleDifferentValues; EditorGUILayout.PropertyField(prewarmStepCount, EditorGUIUtility.TrTextContent("PreWarm Step Count", "Sets the number of simulation steps the prewarm should be broken down to.")); + EditorGUI.showMixedValue = prewarmDeltaTime.hasMultipleDifferentValues; EditorGUILayout.PropertyField(prewarmDeltaTime, EditorGUIUtility.TrTextContent("PreWarm Delta Time", "Sets the time in seconds for each step to achieve the desired total prewarm time.")); + if (EditorGUI.EndChangeCheck()) { - if (prewarmDeltaTime.floatValue < k_MinimalCommonDeltaTime) - prewarmDeltaTime.floatValue = k_MinimalCommonDeltaTime; + prewarmStepCount.uintValue = Math.Clamp(prewarmStepCount.uintValue, 1u, k_MaximumStepCount); + prewarmDeltaTime.floatValue = Math.Max(prewarmDeltaTime.floatValue, k_MinimalCommonDeltaTime); resourceObject.ApplyModifiedProperties(); } } From 058a8417ee718b622e73d5deba999eabe7882024 Mon Sep 17 00:00:00 2001 From: Gabriel de la Cruz Date: Sat, 4 Oct 2025 08:27:29 +0000 Subject: [PATCH 024/115] [VFX] Some links were not disconnected when an incompatible link occurs --- .../Editor/Models/Contexts/VFXContext.cs | 41 +++++++++++-------- .../AllTests/Editor/Tests/VFXContextTests.cs | 19 +++++++++ 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXContext.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXContext.cs index 6a9b5a39175..cefa53d77a0 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXContext.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXContext.cs @@ -2,11 +2,9 @@ using System.Collections.Generic; using System.Linq; using UnityEngine; -using UnityEditor.VFX; using UnityEngine.VFX; using Type = System.Type; -using Object = UnityEngine.Object; namespace UnityEditor.VFX { @@ -371,27 +369,36 @@ public void UnlinkAll() private bool CanLinkToMany() { - return contextType == VFXContextType.Spawner - || contextType == VFXContextType.Event; + return contextType switch + { + VFXContextType.Spawner or + VFXContextType.Event or + VFXContextType.Init or + VFXContextType.Update => true, + _ => false + }; } private bool CanLinkFromMany() { - return contextType == VFXContextType.Output - || contextType == VFXContextType.OutputEvent - || contextType == VFXContextType.Spawner - || contextType == VFXContextType.Subgraph - || contextType == VFXContextType.Init; + return contextType switch + { + VFXContextType.OutputEvent or + VFXContextType.Spawner or + VFXContextType.Subgraph or + VFXContextType.Init => true, + _ => false + }; } private static bool CanMixingFrom(VFXContextType from, VFXContextType to, VFXContextType lastFavoriteTo) { if (from == VFXContextType.Init || from == VFXContextType.Update) { - if (lastFavoriteTo == VFXContextType.Update) - return to == VFXContextType.Update; if (lastFavoriteTo == VFXContextType.Output) return to == VFXContextType.Output; + //Excluding any other combination + return false; } //No special case outside init output which can't be mixed with output & update return true; @@ -423,22 +430,22 @@ protected static void InnerLink(VFXContext from, VFXContext to, int fromIndex, i throw new ArgumentException(string.Format("Cannot link contexts {0} and {1}", from, to)); // Handle constraints on connections + bool fromCanLinkToMany = from.CanLinkToMany(); foreach (var link in from.m_OutputFlowSlot[fromIndex].link.ToArray()) { - if (!link.context.CanLinkFromMany() - || !CanMixingFrom(from.contextType, link.context.contextType, to.contextType)) + if (!fromCanLinkToMany || !CanMixingFrom(from.contextType, link.context.contextType, to.contextType)) { if (link.context.inputFlowCount > toIndex) //Special case from SubGraph, not sure how this test could be false - InnerUnlink(from, link.context, fromIndex, toIndex, notify); + InnerUnlink(from, link.context, fromIndex, link.slotIndex, notify); } } + bool toCanLinkFromMany = to.CanLinkFromMany(); foreach (var link in to.m_InputFlowSlot[toIndex].link.ToArray()) { - if (!link.context.CanLinkToMany() - || !CanMixingTo(link.context.contextType, to.contextType, from.contextType)) + if (!toCanLinkFromMany || !CanMixingTo(link.context.contextType, to.contextType, from.contextType)) { - InnerUnlink(link.context, to, fromIndex, toIndex, notify); + InnerUnlink(link.context, to, link.slotIndex, toIndex, notify); } } diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXContextTests.cs b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXContextTests.cs index 574250ea579..ea58972b0c8 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXContextTests.cs +++ b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXContextTests.cs @@ -306,6 +306,25 @@ public void MultiLink_Event_And_Spawn_To_Initialize() Assert.AreEqual(2, to.inputContexts.Count()); } + [Test] + public void MultiLink_GPUEvent_To_Initialize() + { + var from1 = ScriptableObject.CreateInstance(); + var from2 = ScriptableObject.CreateInstance(); + + var to1 = ScriptableObject.CreateInstance(); + var to2 = ScriptableObject.CreateInstance(); + + from1.LinkTo(to1); + from2.LinkTo(to2); + + // Should disconnect from to1, but not from from2 + from1.LinkTo(to2); + + Assert.AreEqual(2, to2.inputContexts.Count()); + Assert.AreEqual(1, from1.outputContexts.Count()); + } + [Test] public void Link_Success_From_Update_To_Update() { From fe74fbbd6775ef5a6b5e4d050dbbb15cc3f25369 Mon Sep 17 00:00:00 2001 From: Pema Malling Date: Sat, 4 Oct 2025 08:27:31 +0000 Subject: [PATCH 025/115] Bind default shadowmap uniforms in skybox pass when using HDRP path tracing --- .../Runtime/RenderPipeline/PathTracing/PathTracing.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/PathTracing/PathTracing.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/PathTracing/PathTracing.cs index 77f8bb24ec9..a22091d0856 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/PathTracing/PathTracing.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/PathTracing/PathTracing.cs @@ -711,6 +711,12 @@ void RenderSkyBackground(RenderGraph renderGraph, HDCamera hdCamera, TextureHand // Override the exposure texture, as we need a neutral value for this render SetGlobalTexture(renderGraph, HDShaderIDs._ExposureTexture, m_EmptyExposureTexture); + // Parts of sky rendering may access shadowmap-related uniforms. + // In the full path tracing path, these uniforms won't actually be used, + // but they still need to be populated with neutral values, + // or we get errors about unpopulated uniforms. + HDShadowManager.BindDefaultShadowGlobalResources(renderGraph); + m_SkyManager.RenderSky(renderGraph, hdCamera, skyBuffer, CreateDepthBuffer(renderGraph, true, MSAASamples.None), "Render Sky Background for Path Tracing"); // Restore the regular exposure texture From 3501b7445ab597f62a866f88afc30ee1ebf391b6 Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Sat, 4 Oct 2025 08:27:33 +0000 Subject: [PATCH 026/115] [VFX] Fix Space Inspector with ShaderGraph Output --- .../Editor/Models/Contexts/VFXAbstractComposedParticleOutput.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXAbstractComposedParticleOutput.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXAbstractComposedParticleOutput.cs index fbafc19cfa8..ad6480cf8e7 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXAbstractComposedParticleOutput.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Contexts/VFXAbstractComposedParticleOutput.cs @@ -191,6 +191,7 @@ public sealed override void OnInspectorGUI() if (m_ShowParticleOptions) DoDefaultContextEditorGUI(); + ApplyAndInvalidate(); DisplayWarnings(); DisplaySummary(); } From 4259d8d78a8fb39370e85191ddaa138ca00b80df Mon Sep 17 00:00:00 2001 From: Raquel Peces Date: Sat, 4 Oct 2025 08:27:40 +0000 Subject: [PATCH 027/115] Fix wrong hasPassesAfterPostProcessing with wrong comparision --- .../Runtime/UniversalRendererRenderGraph.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index 7b9ef6af09a..9fcb4bd63bb 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -1364,7 +1364,7 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) (cameraData.IsTemporalAAEnabled() && cameraData.taaSettings.contrastAdaptiveSharpening > 0.0f)); bool hasCaptureActions = cameraData.captureActions != null && cameraData.resolveFinalTarget; - bool hasPassesAfterPostProcessing = activeRenderPassQueue.Find(x => x.renderPassEvent == RenderPassEvent.AfterRenderingPostProcessing) != null; + bool hasPassesAfterPostProcessing = activeRenderPassQueue.Find(x => x.renderPassEvent >= RenderPassEvent.AfterRenderingPostProcessing && x.renderPassEvent < RenderPassEvent.AfterRendering) != null; bool resolvePostProcessingToCameraTarget = !hasCaptureActions && !hasPassesAfterPostProcessing && !applyFinalPostProcessing; bool needsColorEncoding = DebugHandler == null || !DebugHandler.HDRDebugViewIsActive(cameraData.resolveFinalTarget); From 307a8425675e689c9ec31d4830a32a1e5ef83217 Mon Sep 17 00:00:00 2001 From: Brian Elgaard Bennett Date: Sat, 4 Oct 2025 08:27:40 +0000 Subject: [PATCH 028/115] Ensured that we don't attempt to unload an unsaved scene --- .../Editor/Lighting/ProbeVolume/ProbeVolumeLightingTab.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeLightingTab.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeLightingTab.cs index b7d5271ddef..ab94e7d8f23 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeLightingTab.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeLightingTab.cs @@ -428,7 +428,7 @@ void ShowWarnings() { for (int i = 0; i < SceneManager.sceneCount; i++) { - var scene = SceneManager.GetSceneAt(i); + Scene scene = SceneManager.GetSceneAt(i); if (scene.isLoaded && ProbeVolumeBakingSet.GetBakingSetForScene(scene) != activeSet) scenesToUnload.Add(scene); } @@ -467,7 +467,7 @@ void ShowWarnings() if (scenesToUnload.All(s => !s.isDirty) || EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) { foreach (var scene in scenesToUnload) - EditorSceneManager.CloseScene(scene, false); + EditorSceneManager.CloseScene(scene, string.IsNullOrEmpty(scene.path)); // Remove the scene from the hierarchy iff it has never been saved. } break; } From 7a2996be8f7ebc4df210fca2bbf397fa25deb774 Mon Sep 17 00:00:00 2001 From: Raquel Peces Date: Sat, 4 Oct 2025 08:27:40 +0000 Subject: [PATCH 029/115] Modify resourceData MaxReaders MaxVersions int to an array by type --- .../RenderGraph/Compiler/ResourcesData.cs | 32 +++---- .../NativePassCompilerRenderGraphTests.cs | 89 +++++++++++++++++-- 2 files changed, 100 insertions(+), 21 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs index 83ecf3d8025..609798da279 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs @@ -152,7 +152,7 @@ public void SetWritingPass(CompilerContextData ctx, ResourceHandle h, int passId public void RegisterReadingPass(CompilerContextData ctx, ResourceHandle h, int passId, int index) { #if DEVELOPMENT_BUILD || UNITY_EDITOR - if (numReaders >= ctx.resources.MaxReaders) + if (numReaders >= ctx.resources.MaxReaders[h.iType]) { string passName = ctx.GetPassName(passId); string resourceName = ctx.GetResourceName(h); @@ -200,8 +200,8 @@ internal class ResourcesData public NativeList[] versionedData; // Flattened fixed size array storing up to MaxVersions versions per resource id. public NativeList[] readerData; // Flattened fixed size array storing up to MaxReaders per resource id per version. - public int MaxVersions; - public int MaxReaders; + public int[] MaxVersions; + public int[] MaxReaders; public DynamicArray[] resourceNames; @@ -211,6 +211,8 @@ public ResourcesData() versionedData = new NativeList[(int)RenderGraphResourceType.Count]; readerData = new NativeList[(int)RenderGraphResourceType.Count]; resourceNames = new DynamicArray[(int)RenderGraphResourceType.Count]; + MaxVersions = new int[(int)RenderGraphResourceType.Count]; + MaxReaders = new int[(int)RenderGraphResourceType.Count]; for (int t = 0; t < (int)RenderGraphResourceType.Count; t++) resourceNames[t] = new DynamicArray(0); // T in NativeList cannot contain managed types, so the names are stored separately @@ -247,14 +249,14 @@ void AllocateAndResizeNativeListIfNeeded(ref NativeList nativeList, int si public void Initialize(RenderGraphResourceRegistry resources) { - uint maxReaders = 0; - uint maxWriters = 0; - for (int t = 0; t < (int)RenderGraphResourceType.Count; t++) { RenderGraphResourceType resourceType = (RenderGraphResourceType) t; var numResources = resources.GetResourceCount(resourceType); + uint maxReaders = 0; + uint maxWriters = 0; + // We don't clear the list as we reinitialize it right after AllocateAndResizeNativeListIfNeeded(ref unversionedData[t], numResources, NativeArrayOptions.UninitializedMemory); @@ -315,12 +317,12 @@ public void Initialize(RenderGraphResourceRegistry resources) } // The first resource is a null resource, so we need to add 1 to the count. - MaxReaders = (int)maxReaders + 1; - MaxVersions = (int)maxWriters + 1; + MaxReaders[t] = (int)maxReaders + 1; + MaxVersions[t] = (int)maxWriters + 1; // Clear the other caching structures, they will be filled later - AllocateAndResizeNativeListIfNeeded(ref versionedData[t], MaxVersions * numResources, NativeArrayOptions.ClearMemory); - AllocateAndResizeNativeListIfNeeded(ref readerData[t], MaxVersions * MaxReaders * numResources, NativeArrayOptions.ClearMemory); + AllocateAndResizeNativeListIfNeeded(ref versionedData[t], MaxVersions[t] * numResources, NativeArrayOptions.ClearMemory); + AllocateAndResizeNativeListIfNeeded(ref readerData[t], MaxVersions[t] * MaxReaders[t] * numResources, NativeArrayOptions.ClearMemory); } } @@ -329,10 +331,10 @@ public void Initialize(RenderGraphResourceRegistry resources) public int Index(ResourceHandle h) { #if UNITY_EDITOR // Hot path - if (h.version < 0 || h.version >= MaxVersions) + if (h.version < 0 || h.version >= MaxVersions[h.iType]) throw new Exception("Invalid version: " + h.version); #endif - return h.index * MaxVersions + h.version; + return h.index * MaxVersions[h.iType] + h.version; } // Flatten array index @@ -340,12 +342,12 @@ public int Index(ResourceHandle h) public int IndexReader(ResourceHandle h, int readerID) { #if UNITY_EDITOR // Hot path - if (h.version < 0 || h.version >= MaxVersions) + if (h.version < 0 || h.version >= MaxVersions[h.iType]) throw new Exception("Invalid version"); - if (readerID < 0 || readerID >= MaxReaders) + if (readerID < 0 || readerID >= MaxReaders[h.iType]) throw new Exception("Invalid reader"); #endif - return (h.index * MaxVersions + h.version) * MaxReaders + readerID; + return (h.index * MaxVersions[h.iType] + h.version) * MaxReaders[h.iType] + readerID; } // Lookup data for a given handle diff --git a/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs b/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs index b02fae8de4e..d378ca1bb06 100644 --- a/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs @@ -1081,11 +1081,11 @@ public void MaxReadersAndMaxVersionsAreCorrectForBuffers() // The resource with the biggest MaxReaders is buffer2: // 1 implicit read (TestPass0) + 1 explicit read (TestPass1) + 1 for the offset. - Assert.AreEqual(result.contextData.resources.MaxReaders, 3); + Assert.AreEqual(result.contextData.resources.MaxReaders[(int)RenderGraphResourceType.Buffer], 3); // The resource with the biggest MaxVersion is buffer2: // 1 explicit write (TestPass0) + 1 explicit readwrite (TestPass1) + 1 for the offset - Assert.AreEqual(result.contextData.resources.MaxVersions, 3); + Assert.AreEqual(result.contextData.resources.MaxVersions[(int)RenderGraphResourceType.Buffer], 3); } [Test] @@ -1122,11 +1122,11 @@ public void MaxReadersAndMaxVersionsAreCorrectForTextures() // Resources with the biggest MaxReaders are extraTextures[0] and depthBuffer (both being equal): // 1 implicit read (TestPass0) + 2 explicit read (TestPass1 & TestPass2) + 1 for the offset - Assert.AreEqual(result.contextData.resources.MaxReaders, 4); + Assert.AreEqual(result.contextData.resources.MaxReaders[(int)RenderGraphResourceType.Texture], 4); // The resource with the biggest MaxVersion is extraTextures[0]: // 1 explicit write (TestPass0) + 1 explicit read-write (TestPass1) + 1 for the offset - Assert.AreEqual(result.contextData.resources.MaxVersions, 3); + Assert.AreEqual(result.contextData.resources.MaxVersions[(int)RenderGraphResourceType.Texture], 3); } [Test] @@ -1164,11 +1164,88 @@ public void MaxReadersAndMaxVersionsAreCorrectForBuffersMultiplePasses() // The resource with the biggest MaxReaders is buffer2: // 5 implicit read (TestPass0-2-4-6-8) + 5 explicit read (TestPass1-3-5-7-9) + 1 for the offset. - Assert.AreEqual(result.contextData.resources.MaxReaders, 11); + Assert.AreEqual(result.contextData.resources.MaxReaders[(int)RenderGraphResourceType.Buffer], 11); // The resource with the biggest MaxVersion is buffer2: // 5 explicit write (TestPass0-2-4-6-8) + 5 explicit readwrite (TestPass1-3-5-7-9) + 1 for the offset - Assert.AreEqual(result.contextData.resources.MaxVersions, 11); + Assert.AreEqual(result.contextData.resources.MaxVersions[(int)RenderGraphResourceType.Buffer], 11); + } + + [Test] + public void ResourcesData_MaxReadersAndVersionsPerResourceType() + { + var g = AllocateRenderGraph(); + var renderTargets = ImportAndCreateRenderTargets(g); + + var desc = new BufferDesc(1024, 16); + var buffer = g.CreateBuffer(desc); + + int indexName = 0; + + // TEXTURE PASSES: Create 2 versions with different reader counts + // Texture Pass 0: Create version 1 of extraTextures[0] (ReadWrite = 1 write + 1 implicit read) + using (var builder = g.AddRasterRenderPass("TestPassTexture" + indexName++, out var passData)) + { + builder.AllowPassCulling(false); + builder.SetRenderAttachment(renderTargets.extraTextures[0], 0, AccessFlags.ReadWrite); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + } + // Texture Pass 1: Create version 2 of extraTextures[0] (ReadWrite = 1 write + 1 explicit read of version 1) + using (var builder = g.AddRasterRenderPass("TestPassTexture" + indexName++, out var passData)) + { + builder.AllowPassCulling(false); + builder.SetRenderAttachment(renderTargets.extraTextures[0], 0, AccessFlags.ReadWrite); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + } + + // BUFFER PASSES: Create many versions to test higher reader/version counts + indexName = 0; + for (int i = 0; i < 5; ++i) + { + // Buffer Pass (Write): Creates version N (1 write + 1 implicit read from previous version) + using (var builder = g.AddRasterRenderPass("TestPassBuffer" + indexName++, out var passData)) + { + builder.AllowPassCulling(false); + builder.UseBufferRandomAccess(buffer, 0, AccessFlags.Write); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + } + // Buffer Pass (ReadWrite): Creates version N+1 (1 write + 1 explicit read from version N) + using (var builder = g.AddRasterRenderPass("TestPassBuffer" + indexName++, out var passData)) + { + builder.AllowPassCulling(false); + builder.UseBufferRandomAccess(buffer, 0, AccessFlags.ReadWrite); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + } + } + + var result = g.CompileNativeRenderGraph(g.ComputeGraphHash()); + var passes = result.contextData.GetNativePasses(); + + // VERIFY: MaxReaders and MaxVersions are calculated PER RESOURCE TYPE + // TEXTURE TYPE: + // 2 readwrite operations = 2 versions + 1 offset = 3 versions/readers. + Assert.AreEqual(result.contextData.resources.MaxReaders[(int)RenderGraphResourceType.Texture], 3); + Assert.AreEqual(result.contextData.resources.MaxVersions[(int)RenderGraphResourceType.Texture], 3); + + // BUFFER TYPE: + // 5 write operations + 5 readwrite operations = 10 versions + 1 offset = 11 versions/readers. + Assert.AreEqual(result.contextData.resources.MaxReaders[(int)RenderGraphResourceType.Buffer], 11); + Assert.AreEqual(result.contextData.resources.MaxVersions[(int)RenderGraphResourceType.Buffer], 11); + + // VERIFY: Index calculations work correctly with per-type maximums + // Get the texture handle from the first native pass attachment + var textureHandle = passes[0].attachments[0].handle; + Assert.AreEqual(renderTargets.extraTextures[0].handle.index, passes[0].attachments[0].handle.index); + + // Test Index() calculation uses correct MaxVersions for texture type + int indexExpected = textureHandle.index * result.contextData.resources.MaxVersions[(int)RenderGraphResourceType.Texture] + textureHandle.version; + Assert.AreEqual(result.contextData.resources.Index(textureHandle), indexExpected); + Assert.IsTrue(indexExpected < result.contextData.resources.versionedData[(int)RenderGraphResourceType.Texture].Capacity); + + // Test IndexReader() calculation uses correct MaxReaders for texture type + int indexReaderExpected = indexExpected * result.contextData.resources.MaxReaders[(int)RenderGraphResourceType.Texture] + 0; + Assert.AreEqual(result.contextData.resources.IndexReader(textureHandle, 0), indexReaderExpected); + Assert.IsTrue(indexExpected < result.contextData.resources.readerData[(int)RenderGraphResourceType.Texture].Capacity); } [Test] From ed439fa0d8a2a0d8f84e253a6c9deb99025d1992 Mon Sep 17 00:00:00 2001 From: Pema Malling Date: Sat, 4 Oct 2025 08:27:41 +0000 Subject: [PATCH 030/115] UUM-84218: Baked shadows do not appear in the Player when Distance Shadowmask and Adaptive Probe Volume are used --- .../Editor/Lighting/ProbeVolume/ProbeGIBaking.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs index 0e00537cab2..a6621e271af 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.cs @@ -1162,6 +1162,21 @@ static void BakeDelegate(ref float progress, ref bool done) } } + // Required by native side. + [Scripting.Preserve] + static bool CurrentSceneHasBakedData() + { + if (!ProbeReferenceVolume.instance.isInitialized || !ProbeReferenceVolume.instance.enabledBySRP) + return false; + + string sceneGUID = SceneManager.GetActiveScene().GetGUID(); + ProbeReferenceVolume.instance.TryGetPerSceneData(sceneGUID, out var sceneData); + if (sceneData == null || sceneData.bakingSet == null) + return false; + + return sceneData.bakingSet.HasBeenBaked(); + } + static void FinalizeBake(bool cleanup = true) { using (new BakingCompleteProfiling(BakingCompleteProfiling.Stages.FinalizingBake)) From 0ab5d616f2ba4b726f10807c2b5c21e7f6d883a9 Mon Sep 17 00:00:00 2001 From: Pema Malling Date: Sat, 4 Oct 2025 08:27:43 +0000 Subject: [PATCH 031/115] UUM-113507: Missing RayTracingRenderPipelineResources type referenced in HDRenderPipelineGlobalSettings --- .../Runtime/UnifiedRayTracing/RayTracingResources.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/RayTracingResources.cs b/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/RayTracingResources.cs index 70075e0c0a1..6ada4735885 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/RayTracingResources.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/RayTracingResources.cs @@ -5,6 +5,12 @@ namespace UnityEngine.Rendering.UnifiedRayTracing { + [Scripting.APIUpdating.MovedFrom( + autoUpdateAPI: true, + sourceNamespace: "UnityEngine.Rendering.UnifiedRayTracing", + sourceAssembly: "Unity.Rendering.LightTransport.Runtime", + sourceClassName: "RayTracingRenderPipelineResources" + )] [Serializable] [SupportedOnRenderPipeline()] [Categorization.CategoryInfo(Name = "R: Unified Ray Tracing", Order = 1000), HideInInspector] From 2b4e69bde05c5d6b9011df8a8938af51099cafe6 Mon Sep 17 00:00:00 2001 From: Pema Malling Date: Sat, 4 Oct 2025 08:27:44 +0000 Subject: [PATCH 032/115] Don't throw exception when trying to bake APV for scene with static Skinned Mesh Renderer --- .../Lighting/ProbeVolume/ProbeGIBaking.RenderingLayers.cs | 3 +++ .../Editor/Lighting/ProbeVolume/ProbeGIBaking.SkyOcclusion.cs | 3 +++ .../Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs | 3 +++ 3 files changed, 9 insertions(+) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.RenderingLayers.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.RenderingLayers.cs index cbfa0cf25f2..79829a9883c 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.RenderingLayers.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.RenderingLayers.cs @@ -116,6 +116,9 @@ static AccelStructAdapter BuildAccelerationStructure() if (mesh == null) continue; + if (renderer.component is SkinnedMeshRenderer) + continue; + int subMeshCount = mesh.subMeshCount; var matIndices = new uint[subMeshCount]; Array.Fill(matIndices, renderer.component.renderingLayerMask); // repurpose the material id as we don't need it here diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.SkyOcclusion.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.SkyOcclusion.cs index 44f6a5b2615..3207aa7e536 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.SkyOcclusion.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.SkyOcclusion.cs @@ -213,6 +213,9 @@ static AccelStructAdapter BuildAccelerationStructure() if (!s_TracingContext.TryGetMeshForAccelerationStructure(renderer.component, out var mesh)) continue; + if (renderer.component is SkinnedMeshRenderer) + continue; + int subMeshCount = mesh.subMeshCount; var matIndices = GetMaterialIndices(renderer.component); var perSubMeshMask = new uint[subMeshCount]; diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs index aa6ac50f95b..5cc06919cfc 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.VirtualOffset.cs @@ -140,6 +140,9 @@ static AccelStructAdapter BuildAccelerationStructure(int mask) if (!s_TracingContext.TryGetMeshForAccelerationStructure(renderer.component, out var mesh)) continue; + if (renderer.component is SkinnedMeshRenderer) + continue; + int subMeshCount = mesh.subMeshCount; var maskAndMatDummy = new uint[subMeshCount]; System.Array.Fill(maskAndMatDummy, 0xFFFFFFFF); From ea26925f725a26fa624ea1bca2bc08dcb408f6ca Mon Sep 17 00:00:00 2001 From: Aljosha Demeulemeester Date: Sat, 4 Oct 2025 22:09:47 +0000 Subject: [PATCH 033/115] Swap debug screen textures in AfterRendering to isolate the debughandler from post process passes --- .../2D/Rendergraph/Renderer2DRendergraph.cs | 109 +++++++-------- .../FrameData/UniversalResourceData.cs | 25 ---- .../Runtime/UniversalRendererRenderGraph.cs | 129 ++++++------------ 3 files changed, 98 insertions(+), 165 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs index 82a1281f938..ed7c662c959 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs @@ -817,16 +817,27 @@ private void OnAfterRendering(RenderGraph renderGraph) DebugHandler debugHandler = ScriptableRenderPass.GetActiveDebugHandler(cameraData); bool resolveToDebugScreen = debugHandler != null && debugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget); + + //When the debughandler displays HDR debug views, it needs to redirect (final) post-process output to an intermediate color target (debugScreenTexture). + //Therefore, we swap the backbuffer textures for the debug screen textures such that the next post processing passes don't need to be aware of the debug handler at all. + //At the end, when the handler is active, we swap them back. This isolates the debug handler code from the sequence of post process passes and is a common pattern to + //use the resourceData. + var debugRealBackBufferColor = TextureHandle.nullHandle; + var debugRealBackBufferDepth = TextureHandle.nullHandle; + // Allocate debug screen texture if the debug mode needs it. if (resolveToDebugScreen) { + debugRealBackBufferColor = commonResourceData.backBufferColor; + debugRealBackBufferDepth = commonResourceData.backBufferDepth; + RenderTextureDescriptor colorDesc = cameraData.cameraTargetDescriptor; DebugHandler.ConfigureColorDescriptorForDebugScreen(ref colorDesc, cameraData.pixelWidth, cameraData.pixelHeight); - commonResourceData.debugScreenColor = UniversalRenderer.CreateRenderGraphTexture(renderGraph, colorDesc, "_DebugScreenColor", false); + commonResourceData.backBufferColor = UniversalRenderer.CreateRenderGraphTexture(renderGraph, colorDesc, "_DebugScreenColor", false); RenderTextureDescriptor depthDesc = cameraData.cameraTargetDescriptor; DebugHandler.ConfigureDepthDescriptorForDebugScreen(ref depthDesc, CoreUtils.GetDefaultDepthStencilFormat(), cameraData.pixelWidth, cameraData.pixelHeight); - commonResourceData.debugScreenDepth = UniversalRenderer.CreateRenderGraphTexture(renderGraph, depthDesc, "_DebugScreenDepth", false); + commonResourceData.backBufferDepth = UniversalRenderer.CreateRenderGraphTexture(renderGraph, depthDesc, "_DebugScreenDepth", false); } bool applyPostProcessing = cameraData.postProcessEnabled && m_PostProcess != null; @@ -841,7 +852,7 @@ private void OnAfterRendering(RenderGraph renderGraph) bool applyFinalPostProcessing = cameraData.resolveFinalTarget && !ppcUpscaleRT && anyPostProcessing && cameraData.antialiasing == AntialiasingMode.FastApproximateAntialiasing; bool hasPassesAfterPostProcessing = activeRenderPassQueue.Find(x => x.renderPassEvent == RenderPassEvent.AfterRenderingPostProcessing) != null; - bool needsColorEncoding = DebugHandler == null || !DebugHandler.HDRDebugViewIsActive(cameraData.resolveFinalTarget); + bool needsColorEncoding = !resolveToDebugScreen; // Don't resolve during post processing if there are passes after or pixel perfect camera is used bool pixelPerfectCameraEnabled = ppc != null && ppc.enabled; @@ -851,88 +862,69 @@ private void OnAfterRendering(RenderGraph renderGraph) if (applyPostProcessing) { - TextureHandle activeColor = commonResourceData.activeColorTexture; - bool isTargetBackbuffer = resolvePostProcessingToCameraTarget; - - // if the postprocessing pass is trying to read and write to the same CameraColor target, we need to swap so it writes to a different target, - // since reading a pass attachment is not possible. Normally this would be possible using temporary RenderGraph managed textures. - // The reason why in this case we need to use "external" RTHandles is to preserve the results for camera stacking. - // TODO RENDERGRAPH: Once all cameras will run in a single RenderGraph we can just use temporary RenderGraph textures as intermediate buffer. - if (!isTargetBackbuffer) + TextureHandle target; + + if(isTargetBackbuffer) + { + target = commonResourceData.backBufferColor; + } + else { + // if the postprocessing pass is trying to read and write to the same CameraColor target, we need to swap so it writes to a different target, + // since reading a pass attachment is not possible. Normally this would be possible using temporary RenderGraph managed textures. + // The reason why in this case we need to use "external" RTHandles is to preserve the results for camera stacking. + // TODO RENDERGRAPH: Once all cameras will run in a single RenderGraph we can just use temporary RenderGraph textures as intermediate buffer. ImportResourceParams importColorParams = new ImportResourceParams(); importColorParams.clearOnFirstUse = true; importColorParams.clearColor = Color.black; importColorParams.discardOnLastUse = cameraData.resolveFinalTarget; // check if last camera in the stack - commonResourceData.cameraColor = renderGraph.ImportTexture(nextRenderGraphCameraColorHandle, importColorParams); + target = renderGraph.ImportTexture(nextRenderGraphCameraColorHandle, importColorParams); } - // Desired target for post-processing pass. - var target = isTargetBackbuffer ? commonResourceData.backBufferColor : commonResourceData.cameraColor; - - if (resolveToDebugScreen && isTargetBackbuffer) - target = commonResourceData.debugScreenColor; - m_PostProcess.RenderPostProcessing( renderGraph, frameData, - activeColor, + commonResourceData.cameraColor, commonResourceData.internalColorLut, commonResourceData.overlayUITexture, target, applyFinalPostProcessing, doSRGBEncoding); + //Always make the switch after the pass has recorded the blit to the backbuffer, not before. if (isTargetBackbuffer) { - commonResourceData.activeColorID = ActiveID.BackBuffer; - commonResourceData.activeDepthID = ActiveID.BackBuffer; + commonResourceData.SwitchActiveTexturesToBackbuffer(); + } + else + { + commonResourceData.cameraColor = target; } } - RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.AfterRenderingPostProcessing); - - var finalColorHandle = commonResourceData.activeColorTexture; + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.AfterRenderingPostProcessing); // Do PixelPerfect upscaling when using the Stretch Fill option if (requirePixelPerfectUpscale) { - m_UpscalePass.Render(renderGraph, cameraData.camera, in finalColorHandle, universal2DResourceData.upscaleTexture); - finalColorHandle = universal2DResourceData.upscaleTexture; - } - - // We need to switch the "final" blit target to debugScreenColor if HDR debug views are enabled. - var finalBlitTarget = resolveToDebugScreen ? commonResourceData.debugScreenColor : commonResourceData.backBufferColor; - var finalDepthHandle = resolveToDebugScreen ? commonResourceData.debugScreenDepth : commonResourceData.backBufferDepth; + m_UpscalePass.Render(renderGraph, cameraData.camera, commonResourceData.cameraColor, universal2DResourceData.upscaleTexture); + commonResourceData.cameraColor = universal2DResourceData.upscaleTexture; + } if (applyFinalPostProcessing) { - m_PostProcess.RenderFinalPostProcessing(renderGraph, frameData, in finalColorHandle, commonResourceData.overlayUITexture, in finalBlitTarget, needsColorEncoding); - - finalColorHandle = finalBlitTarget; + m_PostProcess.RenderFinalPostProcessing(renderGraph, frameData, commonResourceData.cameraColor, commonResourceData.overlayUITexture, commonResourceData.backBufferColor, needsColorEncoding); - commonResourceData.activeColorID = ActiveID.BackBuffer; - commonResourceData.activeDepthID = ActiveID.BackBuffer; + commonResourceData.SwitchActiveTexturesToBackbuffer(); } - // If post-processing then we already resolved to camera target while doing post. - // Also only do final blit if camera is not rendering to RT. - bool cameraTargetResolved = - // final PP always blit to camera target - applyFinalPostProcessing || - // no final PP but we have PP stack. In that case it blit unless there are render pass after PP or pixel perfect camera is used - (applyPostProcessing && !hasPassesAfterPostProcessing && !hasCaptureActions && !pixelPerfectCameraEnabled); - - if (!commonResourceData.isActiveTargetBackBuffer && cameraData.resolveFinalTarget && !cameraTargetResolved) + if (!commonResourceData.isActiveTargetBackBuffer && cameraData.resolveFinalTarget) { - m_FinalBlitPass.Render(renderGraph, frameData, cameraData, finalColorHandle, finalBlitTarget, commonResourceData.overlayUITexture); - - finalColorHandle = finalBlitTarget; + m_FinalBlitPass.Render(renderGraph, frameData, cameraData, commonResourceData.cameraColor, commonResourceData.backBufferColor, commonResourceData.overlayUITexture); - commonResourceData.activeColorID = ActiveID.BackBuffer; - commonResourceData.activeDepthID = ActiveID.BackBuffer; + commonResourceData.SwitchActiveTexturesToBackbuffer(); } // We can explicitly render the overlay UI from URP when HDR output is not enabled. @@ -940,15 +932,24 @@ private void OnAfterRendering(RenderGraph renderGraph) bool shouldRenderUI = cameraData.rendersOverlayUI && cameraData.isLastBaseCamera; bool outputToHDR = cameraData.isHDROutputActive; if (shouldRenderUI && !outputToHDR) - m_DrawOverlayUIPass.RenderOverlay(renderGraph, frameData, in finalColorHandle, in finalDepthHandle); + { + m_DrawOverlayUIPass.RenderOverlay(renderGraph, frameData, commonResourceData.backBufferColor, commonResourceData.backBufferDepth); + } + + // If HDR debug views are enabled, debugHandler will perform the blit from debugScreenColor (== finalColorHandle) to backBufferColor. + if (resolveToDebugScreen) + { + debugHandler.Render(renderGraph, cameraData, commonResourceData.backBufferColor, commonResourceData.overlayUITexture, debugRealBackBufferColor); - // If HDR debug views are enabled, DebugHandler will perform the blit from debugScreenColor (== finalColorHandle) to backBufferColor. - DebugHandler?.Render(renderGraph, cameraData, finalColorHandle, commonResourceData.overlayUITexture, commonResourceData.backBufferColor); + //Swapping the backbuffer textures back + commonResourceData.backBufferColor = debugRealBackBufferColor; + commonResourceData.backBufferDepth = debugRealBackBufferDepth; + } if (cameraData.resolveFinalTarget) { if (cameraData.isSceneViewCamera) - DrawRenderGraphWireOverlay(renderGraph, frameData, commonResourceData.backBufferColor); + DrawRenderGraphWireOverlay(renderGraph, frameData, commonResourceData.activeColorTexture); if (drawGizmos) DrawRenderGraphGizmos(renderGraph, frameData, commonResourceData.activeColorTexture, commonResourceData.activeDepthTexture, GizmoSubset.PostImageEffects); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalResourceData.cs b/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalResourceData.cs index bb9ca4897d6..dce47947642 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalResourceData.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalResourceData.cs @@ -241,29 +241,6 @@ public TextureHandle internalColorLut } private TextureHandle _internalColorLut; - /// - /// Color output of post-process passes (uberPost and finalPost) when HDR debug views are enabled. It replaces - /// the backbuffer color as standard output because the later cannot be sampled back (or may not be in HDR format). - /// If used, DebugHandler will perform the blit from DebugScreenTexture to BackBufferColor. - /// - internal TextureHandle debugScreenColor - { - get => CheckAndGetTextureHandle(ref _debugScreenColor); - set => CheckAndSetTextureHandle(ref _debugScreenColor, value); - } - internal TextureHandle _debugScreenColor; - - /// - /// Depth output of post-process passes (uberPost and finalPost) when HDR debug views are enabled. It replaces - /// the backbuffer depth as standard output because the later cannot be sampled back. - /// - internal TextureHandle debugScreenDepth - { - get => CheckAndGetTextureHandle(ref _debugScreenDepth); - set => CheckAndSetTextureHandle(ref _debugScreenDepth, value); - } - internal TextureHandle _debugScreenDepth; - /// /// After Post Process Color is obsolete. /// @@ -364,8 +341,6 @@ public override void Reset() _motionVectorColor = TextureHandle.nullHandle; _motionVectorDepth = TextureHandle.nullHandle; _internalColorLut = TextureHandle.nullHandle; - _debugScreenColor = TextureHandle.nullHandle; - _debugScreenDepth = TextureHandle.nullHandle; _afterPostProcessColor = TextureHandle.nullHandle; _overlayUITexture = TextureHandle.nullHandle; _renderingLayersTexture = TextureHandle.nullHandle; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index 9fcb4bd63bb..50625d64eb8 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -1366,41 +1366,41 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) bool hasPassesAfterPostProcessing = activeRenderPassQueue.Find(x => x.renderPassEvent >= RenderPassEvent.AfterRenderingPostProcessing && x.renderPassEvent < RenderPassEvent.AfterRendering) != null; - bool resolvePostProcessingToCameraTarget = !hasCaptureActions && !hasPassesAfterPostProcessing && !applyFinalPostProcessing; - bool needsColorEncoding = DebugHandler == null || !DebugHandler.HDRDebugViewIsActive(cameraData.resolveFinalTarget); bool xrDepthTargetResolved = resourceData.activeDepthID == UniversalResourceData.ActiveID.BackBuffer; DebugHandler debugHandler = ScriptableRenderPass.GetActiveDebugHandler(cameraData); bool resolveToDebugScreen = debugHandler != null && debugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget); - // Allocate debug screen texture if the debug mode needs it. + bool needsColorEncoding = !resolveToDebugScreen; + + //When the debughandler displays HDR debug views, it needs to redirect (final) post-process output to an intermediate color target (debugScreenTexture). + //Therefore, we swap the backbuffer textures for the debug screen textures such that the next post processing passes don't need to be aware of the debug handler at all. + //At the end, when the handler is active, we swap them back. This isolates the debug handler code from the sequence of post process passes and is a common pattern to + //use the resourceData. + var debugRealBackBufferColor = TextureHandle.nullHandle; + var debugRealBackBufferDepth = TextureHandle.nullHandle; + if (resolveToDebugScreen) { + debugRealBackBufferColor = resourceData.backBufferColor; + debugRealBackBufferDepth = resourceData.backBufferDepth; + RenderTextureDescriptor colorDesc = cameraData.cameraTargetDescriptor; DebugHandler.ConfigureColorDescriptorForDebugScreen(ref colorDesc, cameraData.pixelWidth, cameraData.pixelHeight); - resourceData.debugScreenColor = CreateRenderGraphTexture(renderGraph, colorDesc, "_DebugScreenColor", false); + resourceData.backBufferColor = CreateRenderGraphTexture(renderGraph, colorDesc, "_DebugScreenColor", false); RenderTextureDescriptor depthDesc = cameraData.cameraTargetDescriptor; DebugHandler.ConfigureDepthDescriptorForDebugScreen(ref depthDesc, cameraDepthAttachmentFormat, cameraData.pixelWidth, cameraData.pixelHeight); - resourceData.debugScreenDepth = CreateRenderGraphTexture(renderGraph, depthDesc, "_DebugScreenDepth", false); + resourceData.backBufferDepth = CreateRenderGraphTexture(renderGraph, depthDesc, "_DebugScreenDepth", false); } - // If the debugHandler displays HDR debug views, it needs to redirect (final) post-process output to an intermediate color target (debugScreenTexture) - // and it will write into the post-process intended output. - TextureHandle debugHandlerColorTarget = resourceData.backBufferColor; - if (applyPostProcessing) - { - TextureHandle activeColor = resourceData.activeColorTexture; - TextureHandle backbuffer = resourceData.backBufferColor; - TextureHandle internalColorLut = resourceData.internalColorLut; - TextureHandle overlayUITexture = resourceData.overlayUITexture; - - bool isTargetBackbuffer = (cameraData.resolveFinalTarget && !applyFinalPostProcessing && !hasPassesAfterPostProcessing); + { + bool isTargetBackbuffer = cameraData.resolveFinalTarget && !applyFinalPostProcessing && !hasPassesAfterPostProcessing && !hasCaptureActions; TextureHandle target; if (isTargetBackbuffer) { - target = backbuffer; + target = resourceData.backBufferColor; } else { @@ -1427,30 +1427,20 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) desc.height = cameraData.pixelHeight; desc.name = _CameraColorUpscaled; - resourceData.cameraColor = renderGraph.CreateTexture(desc); + target = renderGraph.CreateTexture(desc); } else { var isSingleCamera = cameraData.resolveFinalTarget && cameraData.renderType == CameraRenderType.Base; - resourceData.cameraColor = (isSingleCamera) - ? renderGraph.CreateTexture(activeColor, _CameraColorAfterPostProcessingName) + target = (isSingleCamera) + ? renderGraph.CreateTexture(resourceData.cameraColor, _CameraColorAfterPostProcessingName) : renderGraph.ImportTexture(nextRenderGraphCameraColorHandle, importColorParams); } - - target = resourceData.cameraColor; } - // but we may actually render to an intermediate texture if debug views are enabled. - // In that case, DebugHandler will eventually blit DebugScreenTexture into AfterPostProcessColor. - if (resolveToDebugScreen && isTargetBackbuffer) - { - debugHandlerColorTarget = target; - target = resourceData.debugScreenColor; - } - - bool doSRGBEncoding = resolvePostProcessingToCameraTarget && needsColorEncoding; - m_PostProcess.RenderPostProcessing(renderGraph, frameData, in activeColor, in internalColorLut, in overlayUITexture, in target, applyFinalPostProcessing, doSRGBEncoding); + bool doSRGBEncoding = isTargetBackbuffer && needsColorEncoding; + m_PostProcess.RenderPostProcessing(renderGraph, frameData, resourceData.cameraColor, resourceData.internalColorLut, resourceData.overlayUITexture, in target, applyFinalPostProcessing, doSRGBEncoding); // Handle any after-post rendering debugger overlays if (cameraData.resolveFinalTarget) @@ -1460,60 +1450,33 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) { resourceData.SwitchActiveTexturesToBackbuffer(); } + else + { + resourceData.cameraColor = target; + } } RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRenderingPostProcessing); - if (cameraData.captureActions != null) + if (hasCaptureActions) { m_CapturePass.RecordRenderGraph(renderGraph, frameData); } if (applyFinalPostProcessing) { - TextureHandle backbuffer = resourceData.backBufferColor; - TextureHandle overlayUITexture = resourceData.overlayUITexture; - - // Desired target for post-processing pass. - TextureHandle target = backbuffer; - - if (resolveToDebugScreen) - { - debugHandlerColorTarget = target; - target = resourceData.debugScreenColor; - } - - // make sure we are accessing the proper camera color in case it was replaced by injected passes - var source = resourceData.cameraColor; - m_PostProcess.RenderFinalPostProcessing(renderGraph, frameData, in source, in overlayUITexture, in target, needsColorEncoding); + m_PostProcess.RenderFinalPostProcessing(renderGraph, frameData, resourceData.cameraColor, resourceData.overlayUITexture, resourceData.backBufferColor, needsColorEncoding); resourceData.SwitchActiveTexturesToBackbuffer(); } - bool cameraTargetResolved = - // final PP always blit to camera target - applyFinalPostProcessing || - // no final PP but we have PP stack. In that case it blit unless there are render pass after PP - (applyPostProcessing && !hasPassesAfterPostProcessing && !hasCaptureActions); - - if (!resourceData.isActiveTargetBackBuffer && cameraData.resolveFinalTarget && !cameraTargetResolved) + //Keep in mind that also our users could have done the final blit / final post processing and called SwitchActiveTexturesToBackbuffer(). + //Checking resourceData.isActiveTargetBackBuffer is a robust way to check if this has happened, by our own code or by the user. + if (!resourceData.isActiveTargetBackBuffer && cameraData.resolveFinalTarget) { - TextureHandle backbuffer = resourceData.backBufferColor; - TextureHandle overlayUITexture = resourceData.overlayUITexture; - TextureHandle target = backbuffer; - - if (resolveToDebugScreen) - { - debugHandlerColorTarget = target; - target = resourceData.debugScreenColor; - } - - // make sure we are accessing the proper camera color in case it was replaced by injected passes - var source = resourceData.cameraColor; - debugHandler?.UpdateShaderGlobalPropertiesForFinalValidationPass(renderGraph, cameraData, !resolveToDebugScreen); - m_FinalBlitPass.Render(renderGraph, frameData, cameraData, source, target, overlayUITexture); + m_FinalBlitPass.Render(renderGraph, frameData, cameraData, resourceData.cameraColor, resourceData.backBufferColor, resourceData.overlayUITexture); resourceData.SwitchActiveTexturesToBackbuffer(); } @@ -1526,17 +1489,7 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) bool outputToHDR = cameraData.isHDROutputActive; if (shouldRenderUI && !outputToHDR) { - TextureHandle depthBuffer = resourceData.backBufferDepth; - TextureHandle target = resourceData.backBufferColor; - - if (resolveToDebugScreen) - { - debugHandlerColorTarget = target; - target = resourceData.debugScreenColor; - depthBuffer = resourceData.debugScreenDepth; - } - - m_DrawOverlayUIPass.RenderOverlay(renderGraph, frameData, in target, in depthBuffer); + m_DrawOverlayUIPass.RenderOverlay(renderGraph, frameData, resourceData.activeColorTexture, resourceData.activeDepthTexture); } #if ENABLE_VR && ENABLE_XR_MODULE @@ -1552,12 +1505,16 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) } #endif - if (debugHandler != null) + if (resolveToDebugScreen) { - TextureHandle overlayUITexture = resourceData.overlayUITexture; - TextureHandle debugScreenTexture = resourceData.debugScreenColor; + //We swapped the backBuffer textures to the debug screen textures before post processing. This way, all those passes don't need to be aware of the debughandling at all. + var debugScreenTexture = resourceData.backBufferColor; + + debugHandler.Render(renderGraph, cameraData, debugScreenTexture, resourceData.overlayUITexture, debugRealBackBufferColor); - debugHandler.Render(renderGraph, cameraData, debugScreenTexture, overlayUITexture, debugHandlerColorTarget); + //Swapping the backbuffer textures back + resourceData.backBufferColor = debugRealBackBufferColor; + resourceData.backBufferDepth = debugRealBackBufferDepth; } if (cameraData.resolveFinalTarget) @@ -1574,10 +1531,10 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) } #endif if (cameraData.isSceneViewCamera) - DrawRenderGraphWireOverlay(renderGraph, frameData, resourceData.backBufferColor); + DrawRenderGraphWireOverlay(renderGraph, frameData, resourceData.activeColorTexture); if (drawGizmos) - DrawRenderGraphGizmos(renderGraph, frameData, resourceData.backBufferColor, resourceData.activeDepthTexture, GizmoSubset.PostImageEffects); + DrawRenderGraphGizmos(renderGraph, frameData, resourceData.activeColorTexture, resourceData.activeDepthTexture, GizmoSubset.PostImageEffects); } } From 5b9c68a3755eefa71ee7af08b3fc5aac473c2985 Mon Sep 17 00:00:00 2001 From: Rose Hirigoyen Date: Sun, 5 Oct 2025 03:24:18 +0000 Subject: [PATCH 034/115] RenderGraph Mem Leak with RenderGraphCompilationCache --- .../RenderGraph/RenderGraphTestsCore.cs | 2 +- .../Runtime/RenderGraph/RenderGraph.cs | 21 ++++------ .../RenderGraphCompilationCache.cs | 38 +++++++++++++++++++ 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphTestsCore.cs b/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphTestsCore.cs index 9602d17ebc2..a511caadf8b 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphTestsCore.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/RenderGraph/RenderGraphTestsCore.cs @@ -187,7 +187,7 @@ public void CleanupRenderGraph() m_RenderGraphTestPipeline.invalidContextForTesting = false; // Cleaning all Render Graph resources and data structures // Nothing remains, Render Graph in next test will start from scratch - m_RenderGraph.ForceCleanup(); + m_RenderGraph.CleanupResourcesAndGraph(); } } } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs index 9b5ba940419..201b0ea333d 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs @@ -664,23 +664,11 @@ public RenderGraph(string name = "RenderGraph") #endif } - /// - /// Cleanup the Render Graph. - /// - /// - /// This API cannot be called when Render Graph is active, please call it outside of RecordRenderGraph(). - /// - void CleanupResourcesAndGraph() - { - CheckNotUsedWhenActive(); - - ForceCleanup(); - } - // Internal, only for testing // Useful when we need to clean when calling // internal functions in tests even if Render Graph is active - internal void ForceCleanup() + // This API shouldn't be called when the render graph is active! + internal void CleanupResourcesAndGraph() { // Usually done at the end of Execute step // Also doing it here in case RG stopped before it @@ -700,6 +688,11 @@ internal void ForceCleanup() ///
public void Cleanup() { + CheckNotUsedWhenActive(); + + // Dispose of the compiled graphs left over in the cache + m_CompilationCache?.Cleanup(); + CleanupResourcesAndGraph(); UnregisterGraph(); } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphCompilationCache.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphCompilationCache.cs index 6bd8f3766f0..82588ff8259 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphCompilationCache.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphCompilationCache.cs @@ -114,4 +114,42 @@ public void Clear() } m_NativeHashEntries.Clear(); } + + public void Cleanup() + { + // We clear the contents of the pools but not the pool themselves, because they are only + // filled at the beginning of the renderer pipeline and never after. This means when we call + // Cleanup() after an error, if we were clearing the pools, the render graph could not gracefully start + // back up because the cache would have a size of 0 (so no room to cache anything). + + // Cleanup compiled graphs currently in the cache + for (int i = 0; i < m_HashEntries.size; ++i) + { + var compiledGraph = m_HashEntries[i].compiledGraph; + compiledGraph.Clear(); + } + m_HashEntries.Clear(); + + // Cleanup compiled graphs that might be left in the pool + var compiledGraphs = m_CompiledGraphPool.ToArray(); + for (int i = 0; i < compiledGraphs.Length; ++i) + { + compiledGraphs[i].Clear(); + } + + // Dispose of CompilerContextData currently in the cache + for (int i = 0; i < m_NativeHashEntries.size; ++i) + { + var compiledGraph = m_NativeHashEntries[i].compiledGraph; + compiledGraph.Dispose(); + } + m_NativeHashEntries.Clear(); + + // Dispose of CompilerContextData that might be left in the pool + var nativeCompiledGraphs = m_NativeCompiledGraphPool.ToArray(); + for (int i = 0; i < nativeCompiledGraphs.Length; ++i) + { + nativeCompiledGraphs[i].Dispose(); + } + } } From 2360d339354e38ff852237801ccb3b03720bbb1e Mon Sep 17 00:00:00 2001 From: Nicola Cerone Date: Sun, 5 Oct 2025 03:24:25 +0000 Subject: [PATCH 035/115] Added support for ScreenPosition in UITK Custom Shader. --- .../Editor/ShaderGraph/Includes/UITKPass.hlsl | 7 ++++++- .../Editor/Generation/Targets/UITK/UIStructs.cs | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/UITKPass.hlsl b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/UITKPass.hlsl index 46bd4b9038f..e1f5bcf34dc 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/UITKPass.hlsl +++ b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/UITKPass.hlsl @@ -19,11 +19,16 @@ PackedVaryings uie_custom_vert(Attributes input) uieInput.circle = input.uv6; uieInput.textureId = input.uv7.x; - v2f uieOutput = uie_std_vert(uieInput); Varyings varyings = (Varyings)0; varyings.positionCS = uieOutput.pos; + +#ifdef VARYINGS_NEED_POSITION_WS + float3 positionWS = TransformObjectToWorld(input.positionOS); + varyings.positionWS = positionWS; +#endif + varyings.color = uieOutput.color; varyings.texCoord0 = uieOutput.uvClip; varyings.texCoord1 = uieOutput.typeTexSettings; diff --git a/Packages/com.unity.shadergraph/Editor/Generation/Targets/UITK/UIStructs.cs b/Packages/com.unity.shadergraph/Editor/Generation/Targets/UITK/UIStructs.cs index ca903dc6355..5fa16d03137 100644 --- a/Packages/com.unity.shadergraph/Editor/Generation/Targets/UITK/UIStructs.cs +++ b/Packages/com.unity.shadergraph/Editor/Generation/Targets/UITK/UIStructs.cs @@ -10,6 +10,8 @@ internal static class UIStructs fields = new[] { StructFields.Varyings.positionCS, + StructFields.Varyings.positionWS, + StructFields.Varyings.screenPosition, StructFields.Varyings.texCoord0, StructFields.Varyings.texCoord1, StructFields.Varyings.texCoord2, @@ -68,6 +70,11 @@ internal static class UIStructs // optionals StructFields.VertexDescriptionInputs.VertexID, StructFields.VertexDescriptionInputs.InstanceID, + + StructFields.VertexDescriptionInputs.ObjectSpaceNormal, + StructFields.VertexDescriptionInputs.NDCPosition, + StructFields.VertexDescriptionInputs.PixelPosition, + } }; public static StructDescriptor UITKSurfaceDescriptionInputs = new StructDescriptor() @@ -94,6 +101,11 @@ internal static class UIStructs StructFields.SurfaceDescriptionInputs.uv6, StructFields.SurfaceDescriptionInputs.uv7, + StructFields.SurfaceDescriptionInputs.WorldSpacePosition, + StructFields.SurfaceDescriptionInputs.ScreenPosition, + StructFields.SurfaceDescriptionInputs.NDCPosition, + StructFields.SurfaceDescriptionInputs.PixelPosition, + StructFields.SurfaceDescriptionInputs.TimeParameters, } }; From e4928755ad224c18013a104aa2fec5b56728a376 Mon Sep 17 00:00:00 2001 From: Roxanne Corbeil Date: Sun, 5 Oct 2025 03:24:35 +0000 Subject: [PATCH 036/115] [content automatically redacted] touching Platforms folder --- .../TextMesh Pro/Resources/Sprite Assets.meta | 9 - .../Resources/Sprite Assets/EmojiOne.asset | 659 ------------------ .../Sprite Assets/EmojiOne.asset.meta | 8 - .../Assets/TextMesh Pro/Sprites.meta | 8 - .../Sprites/EmojiOne Attribution.txt | 3 - .../Sprites/EmojiOne Attribution.txt.meta | 7 - .../Assets/TextMesh Pro/Sprites/EmojiOne.json | 156 ----- .../TextMesh Pro/Sprites/EmojiOne.json.meta | 8 - .../Assets/TextMesh Pro/Sprites/EmojiOne.png | Bin 112319 -> 0 bytes .../TextMesh Pro/Sprites/EmojiOne.png.meta | 431 ------------ 10 files changed, 1289 deletions(-) delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets.meta delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites.meta delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.json delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.png delete mode 100644 Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets.meta b/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets.meta deleted file mode 100644 index 5171f1b68d9..00000000000 --- a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 512a49d95c0c4332bdd98131869c23c9 -folderAsset: yes -timeCreated: 1441876896 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset b/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset deleted file mode 100644 index 98e6d277137..00000000000 --- a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset +++ /dev/null @@ -1,659 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2103686 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: TextMeshPro/Sprite - m_Shader: {fileID: 4800000, guid: cf81c85f95fe47e1a27f6ae460cf182c, type: 3} - m_ShaderKeywords: UNITY_UI_CLIP_RECT - m_LightmapFlags: 5 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _MainTex: - m_Texture: {fileID: 2800000, guid: dffef66376be4fa480fb02b19edbe903, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _ColorMask: 15 - - _CullMode: 0 - - _Stencil: 0 - - _StencilComp: 8 - - _StencilOp: 0 - - _StencilReadMask: 255 - - _StencilWriteMask: 255 - - _UseUIAlphaClip: 0 - m_Colors: - - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} - - _Color: {r: 1, g: 1, b: 1, a: 1} ---- !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: 84a92b25f83d49b9bc132d206b370281, type: 3} - m_Name: EmojiOne - m_EditorClassIdentifier: - hashCode: -1836805472 - material: {fileID: 2103686} - materialHashCode: 0 - m_Version: 1.1.0 - m_FaceInfo: - m_FamilyName: - m_StyleName: - m_PointSize: 0 - m_Scale: 0 - m_LineHeight: 0 - m_AscentLine: 0 - m_CapLine: 0 - m_MeanLine: 0 - m_Baseline: 0 - m_DescentLine: 0 - m_SuperscriptOffset: 0 - m_SuperscriptSize: 0 - m_SubscriptOffset: 0 - m_SubscriptSize: 0 - m_UnderlineOffset: 0 - m_UnderlineThickness: 0 - m_StrikethroughOffset: 0 - m_StrikethroughThickness: 0 - m_TabWidth: 0 - spriteSheet: {fileID: 2800000, guid: dffef66376be4fa480fb02b19edbe903, type: 3} - m_SpriteCharacterTable: - - m_ElementType: 2 - m_Unicode: 128522 - m_GlyphIndex: 0 - m_Scale: 1 - m_Name: Smiling face with smiling eyes - m_HashCode: -1318250903 - - m_ElementType: 2 - m_Unicode: 128523 - m_GlyphIndex: 1 - m_Scale: 1 - m_Name: 1f60b - m_HashCode: 57188339 - - m_ElementType: 2 - m_Unicode: 128525 - m_GlyphIndex: 2 - m_Scale: 1 - m_Name: 1f60d - m_HashCode: 57188341 - - m_ElementType: 2 - m_Unicode: 128526 - m_GlyphIndex: 3 - m_Scale: 1 - m_Name: 1f60e - m_HashCode: 57188340 - - m_ElementType: 2 - m_Unicode: 128512 - m_GlyphIndex: 4 - m_Scale: 1 - m_Name: Grinning face - m_HashCode: -95541379 - - m_ElementType: 2 - m_Unicode: 128513 - m_GlyphIndex: 5 - m_Scale: 1 - m_Name: 1f601 - m_HashCode: 57188256 - - m_ElementType: 2 - m_Unicode: 128514 - m_GlyphIndex: 6 - m_Scale: 1 - m_Name: Face with tears of joy - m_HashCode: 239522663 - - m_ElementType: 2 - m_Unicode: 128515 - m_GlyphIndex: 7 - m_Scale: 1 - m_Name: 1f603 - m_HashCode: 57188258 - - m_ElementType: 2 - m_Unicode: 128516 - m_GlyphIndex: 8 - m_Scale: 1 - m_Name: 1f604 - m_HashCode: 57188261 - - m_ElementType: 2 - m_Unicode: 128517 - m_GlyphIndex: 9 - m_Scale: 1 - m_Name: 1f605 - m_HashCode: 57188260 - - m_ElementType: 2 - m_Unicode: 128518 - m_GlyphIndex: 10 - m_Scale: 1 - m_Name: 1f606 - m_HashCode: 57188263 - - m_ElementType: 2 - m_Unicode: 128521 - m_GlyphIndex: 11 - m_Scale: 1 - m_Name: 1f609 - m_HashCode: 57188264 - - m_ElementType: 2 - m_Unicode: 0 - m_GlyphIndex: 12 - m_Scale: 1 - m_Name: .notdef - m_HashCode: -600915428 - - m_ElementType: 2 - m_Unicode: 129315 - m_GlyphIndex: 13 - m_Scale: 1 - m_Name: 1f923 - m_HashCode: 57200239 - - m_ElementType: 2 - m_Unicode: 9786 - m_GlyphIndex: 14 - m_Scale: 1 - m_Name: 263a - m_HashCode: 1748406 - - m_ElementType: 2 - m_Unicode: 9785 - m_GlyphIndex: 15 - m_Scale: 1 - m_Name: 2639 - m_HashCode: 1748462 - m_SpriteGlyphTable: - - m_Index: 0 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 0 - m_Y: 384 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 1 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 128 - m_Y: 384 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 2 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 256 - m_Y: 384 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 3 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 384 - m_Y: 384 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 4 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 0 - m_Y: 256 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 5 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 128 - m_Y: 256 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 6 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 256 - m_Y: 256 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 7 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 384 - m_Y: 256 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 8 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 0 - m_Y: 128 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 9 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 128 - m_Y: 128 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 10 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 256 - m_Y: 128 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 11 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 384 - m_Y: 128 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 12 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 0 - m_Y: 0 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 13 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 128 - m_Y: 0 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 14 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 256 - m_Y: 0 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - - m_Index: 15 - m_Metrics: - m_Width: 128 - m_Height: 128 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 115.6 - m_HorizontalAdvance: 128 - m_GlyphRect: - m_X: 384 - m_Y: 0 - m_Width: 128 - m_Height: 128 - m_Scale: 1 - m_AtlasIndex: 0 - sprite: {fileID: 0} - spriteInfoList: - - id: 0 - x: 0 - y: 384 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: Smiling face with smiling eyes - hashCode: -1318250903 - unicode: 128522 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 1 - x: 128 - y: 384 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f60b - hashCode: 57188339 - unicode: 128523 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 2 - x: 256 - y: 384 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f60d - hashCode: 57188341 - unicode: 128525 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 3 - x: 384 - y: 384 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f60e - hashCode: 57188340 - unicode: 128526 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 4 - x: 0 - y: 256 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: Grinning face - hashCode: -95541379 - unicode: 128512 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 5 - x: 128 - y: 256 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f601 - hashCode: 57188256 - unicode: 128513 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 6 - x: 256 - y: 256 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: Face with tears of joy - hashCode: 239522663 - unicode: 128514 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 7 - x: 384 - y: 256 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f603 - hashCode: 57188258 - unicode: 128515 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 8 - x: 0 - y: 128 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f604 - hashCode: 57188261 - unicode: 128516 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 9 - x: 128 - y: 128 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f605 - hashCode: 57188260 - unicode: 128517 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 10 - x: 256 - y: 128 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f606 - hashCode: 57188263 - unicode: 128518 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 11 - x: 384 - y: 128 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f609 - hashCode: 57188264 - unicode: 128521 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 12 - x: 0 - y: 0 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f618 - hashCode: 57188168 - unicode: 128536 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 13 - x: 128 - y: 0 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 1f923 - hashCode: 57200239 - unicode: 129315 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 14 - x: 256 - y: 0 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 263a - hashCode: 1748406 - unicode: 9786 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - - id: 15 - x: 384 - y: 0 - width: 128 - height: 128 - xOffset: 0 - yOffset: 115.6 - xAdvance: 128 - scale: 1 - name: 2639 - hashCode: 1748462 - unicode: 9785 - pivot: {x: 0.5, y: 0.5} - sprite: {fileID: 0} - fallbackSpriteAssets: [] ---- !u!21 &1369835458 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: TextMeshPro/Sprite - m_Shader: {fileID: 4800000, guid: cf81c85f95fe47e1a27f6ae460cf182c, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: [] - m_Floats: [] - m_Colors: [] diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta b/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta deleted file mode 100644 index c7ac83f4d2f..00000000000 --- a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c41005c129ba4d66911b75229fd70b45 -timeCreated: 1480316912 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites.meta b/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites.meta deleted file mode 100644 index 8b699e5fc89..00000000000 --- a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d0603b6d5186471b96c778c3949c7ce2 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt b/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt deleted file mode 100644 index 384180a92b2..00000000000 --- a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt +++ /dev/null @@ -1,3 +0,0 @@ -This sample of beautiful emojis are provided by EmojiOne https://www.emojione.com/ - -Please visit their website to view the complete set of their emojis and review their licensing terms. \ No newline at end of file diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta b/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta deleted file mode 100644 index 0d30e653271..00000000000 --- a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 381dcb09d5029d14897e55f98031fca5 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.json b/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.json deleted file mode 100644 index 6c4e50bc8e1..00000000000 --- a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.json +++ /dev/null @@ -1,156 +0,0 @@ -{"frames": [ - -{ - "filename": "1f60a.png", - "frame": {"x":0,"y":0,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f60b.png", - "frame": {"x":128,"y":0,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f60d.png", - "frame": {"x":256,"y":0,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f60e.png", - "frame": {"x":384,"y":0,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f600.png", - "frame": {"x":0,"y":128,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f601.png", - "frame": {"x":128,"y":128,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f602.png", - "frame": {"x":256,"y":128,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f603.png", - "frame": {"x":384,"y":128,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f604.png", - "frame": {"x":0,"y":256,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f605.png", - "frame": {"x":128,"y":256,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f606.png", - "frame": {"x":256,"y":256,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f609.png", - "frame": {"x":384,"y":256,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f618.png", - "frame": {"x":0,"y":384,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f923.png", - "frame": {"x":128,"y":384,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "263a.png", - "frame": {"x":256,"y":384,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "2639.png", - "frame": {"x":384,"y":384,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}], -"meta": { - "app": "http://www.codeandweb.com/texturepacker", - "version": "1.0", - "image": "EmojiOne.png", - "format": "RGBA8888", - "size": {"w":512,"h":512}, - "scale": "1", - "smartupdate": "$TexturePacker:SmartUpdate:196a26a2e149d875b91ffc8fa3581e76:fc928c7e275404b7e0649307410475cb:424723c3774975ddb2053fd5c4b85f6e$" -} -} diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta b/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta deleted file mode 100644 index 762cf15c922..00000000000 --- a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8f05276190cf498a8153f6cbe761d4e6 -timeCreated: 1480316860 -licenseType: Pro -TextScriptImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.png b/Tests/SRPTests/Projects/MultipleSRP_Tests/Assets/TextMesh Pro/Sprites/EmojiOne.png deleted file mode 100644 index c0de66d0ab8976d2e00122faa45887a4208c07af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112319 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

xMw{_$ce~^VZld@MEWPn}OBCb-| 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΢MWdz93`CaT#q?@>~pm40=*o~e-A0G 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 Date: Sun, 5 Oct 2025 03:24:36 +0000 Subject: [PATCH 037/115] Redistribute Shader Graph doc's Get started section contents --- .../Documentation~/Getting-Started.md | 26 ++++---------- .../Documentation~/TableOfContents.md | 34 ++++++++++--------- .../Documentation~/Upgrade-Guide-10-0-x.md | 2 ++ .../Documentation~/inside-shader-graph.md | 24 +++++++++++++ .../Documentation~/install-and-upgrade.md | 8 +++++ .../Documentation~/install-shader-graph.md | 23 +++++++++++++ .../Documentation~/ui-reference.md | 17 ++++++++++ .../Documentation~/whats-new.md | 3 ++ 8 files changed, 102 insertions(+), 35 deletions(-) create mode 100644 Packages/com.unity.shadergraph/Documentation~/inside-shader-graph.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/install-and-upgrade.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/install-shader-graph.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/ui-reference.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/whats-new.md diff --git a/Packages/com.unity.shadergraph/Documentation~/Getting-Started.md b/Packages/com.unity.shadergraph/Documentation~/Getting-Started.md index 96b65f6dce8..4ba39a34efe 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Getting-Started.md +++ b/Packages/com.unity.shadergraph/Documentation~/Getting-Started.md @@ -1,21 +1,9 @@ -# Getting started with Shader Graph +# Get started with Shader Graph -Use Shader Graph with either of the Scriptable Render Pipelines (SRPs) available in Unity version 2018.1 and later: +Explore the Shader Graph user interface and general workflows to start creating your own shader graphs. -- The [High Definition Render Pipeline (HDRP)](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest) -- The [Universal Render Pipeline (URP)](https://docs.unity3d.com/Manual/urp/urp-introduction.html) - -As of Unity version 2021.2, you can also use Shader Graph with the [Built-In Render Pipeline](https://docs.unity3d.com/Documentation/Manual/built-in-render-pipeline.html). - -> [!NOTE] -> Shader Graph support for the Built-In Render Pipeline is for compatibility purposes only. Shader Graph doesn't receive updates for Built-In Render Pipeline support, aside from bug fixes for existing features. It's recommended to use Shader Graph with the Scriptable Render Pipelines. - -## Installation - -When you install HDRP or URP into your project, Unity also installs the Shader Graph package automatically. You can manually install Shader Graph for use with the Built-In Render Pipeline on Unity version 2021.2 and later with the Package Manager. For more information on how to install a package, see [Adding and removing packages](https://docs.unity3d.com/Manual/upm-ui-actions.html) in the Unity User Manual. - -For more information about how to set up a Scriptable Render Pipeline, see [Getting started with HDRP](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@17.0/manual/getting-started-in-hdrp.html) or [Getting started with URP](https://docs.unity3d.com/Manual/urp/InstallingAndConfiguringURP). - -## What's new - -For information about the latest updates and improvements to Shader Graph, refer to [What's new in Unity](https://docs.unity3d.com/Manual/WhatsNew.html). +| Topic | Description | +| :--- | :--- | +| **[Creating a new shader graph asset](Create-Shader-Graph.md)** | Create a shader graph asset and get an overview of the main Shader Graph interface elements available to create and configure a shader graph. | +| **[My first Shader Graph](First-Shader-Graph.md)** | Create and configure a shader graph, and create and manipulate a material that uses that shader graph. | +| **[Create a new shader graph from a template](create-shader-graph-template.md)** | Use the Shader Graph template browser to create a shader graph. | diff --git a/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md b/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md index 779abadb1a6..485f86204e4 100644 --- a/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md +++ b/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md @@ -1,8 +1,13 @@ * [About Shader Graph](index.md) -* [Getting started with Shader Graph](Getting-Started.md) +* [What's new in Shader Graph](whats-new.md) +* [Install and upgrade](install-and-upgrade.md) + * [Install Shader Graph](install-shader-graph.md) + * [Upgrade to Shader Graph 10.0.x](Upgrade-Guide-10-0-x.md) +* [Get started with Shader Graph](Getting-Started.md) * [Creating a new Shader Graph Asset](Create-Shader-Graph.md) * [My first Shader Graph](First-Shader-Graph.md) * [Create a new shader graph from a template](create-shader-graph-template.md) +* [Shader Graph UI reference](ui-reference.md) * [Shader Graph Window](Shader-Graph-Window.md) * [Blackboard](Blackboard.md) * [Main Preview](Main-Preview.md) @@ -10,30 +15,27 @@ * [Create Node Menu](Create-Node-Menu.md) * [Graph Settings Tab](Graph-Settings-Tab.md) * [Master Stack](Master-Stack.md) - * [Sticky Notes](Sticky-Notes.md) - * [Sub Graph](Sub-graph.md) - * [Color Modes](Color-Modes.md) - * [Precision Modes](Precision-Modes.md) - * [Preview Mode Control](Preview-Mode-Control.md) - * [Custom Function Node](Custom-Function-Node.md) - * [Custom Render Textures](Custom-Render-Texture.md) - * [Accessing](Custom-Render-Texture-Accessing.md) - * [Example](Custom-Render-Texture-Example.md) * [Shader Graph Preferences](Shader-Graph-Preferences.md) * [Shader Graph Project Settings](Shader-Graph-Project-Settings.md) * [Shader Graph Keyboard Shortcuts](Keyboard-shortcuts.md) - * [Material Variants](materialvariant-SG.md) -* Upgrade Guides - * [Upgrade to Shader Graph 10.0.x](Upgrade-Guide-10-0-x.md) -* Inside Shader Graph +* [Inside Shader Graph](inside-shader-graph.md) * [Shader Graph Asset](Shader-Graph-Asset.md) * [Graph Target](Graph-Target.md) - * [Sub Graph Asset](Sub-graph-Asset.md) - * [SpeedTree 8 Sub Graph Assets](SpeedTree8-SubGraphAssets.md) * [Node](Node.md) * [Port](Port.md) * [Custom Port Menu](Custom-Port-Menu.md) * [Edge](Edge.md) + * [Sub Graph](Sub-graph.md) + * [Sub Graph Asset](Sub-graph-Asset.md) + * [SpeedTree 8 Sub Graph Assets](SpeedTree8-SubGraphAssets.md) + * [Sticky Notes](Sticky-Notes.md) + * [Color Modes](Color-Modes.md) + * [Precision Modes](Precision-Modes.md) + * [Preview Mode Control](Preview-Mode-Control.md) + * [Custom Render Textures](Custom-Render-Texture.md) + * [Accessing](Custom-Render-Texture-Accessing.md) + * [Example](Custom-Render-Texture-Example.md) + * [Material Variants](materialvariant-SG.md) * [Property Types](Property-Types.md) * [Keywords](Keywords.md) * [Introduction to keywords](Keywords-concepts.md) diff --git a/Packages/com.unity.shadergraph/Documentation~/Upgrade-Guide-10-0-x.md b/Packages/com.unity.shadergraph/Documentation~/Upgrade-Guide-10-0-x.md index 6a8dd75313a..279ad68de72 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Upgrade-Guide-10-0-x.md +++ b/Packages/com.unity.shadergraph/Documentation~/Upgrade-Guide-10-0-x.md @@ -1,5 +1,7 @@ # Upgrade to version 10.0.x of Shader Graph +Upgrade your project to make it compatible with Shader Graph 10.0 or later. + ## Renamed Vector 1 property and Float precision Shader Graph has renamed the **Vector 1** property as **Float** in both the Vector 1 node and the exposed parameter list. The **Float** precision was also renamed as **Single**. Behavior is exactly the same, and only the names have changed. diff --git a/Packages/com.unity.shadergraph/Documentation~/inside-shader-graph.md b/Packages/com.unity.shadergraph/Documentation~/inside-shader-graph.md new file mode 100644 index 00000000000..a435b42bfe5 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/inside-shader-graph.md @@ -0,0 +1,24 @@ +# Inside Shader Graph + +Learn about Shader Graph concepts and features. + +| Topic | Description | +| :--- | :--- | +| [Shader Graph Asset](Shader-Graph-Asset.md) | Learn about the asset type that contains any shader graph you create. | +| [Graph Target](Graph-Target.md) | Determine the end point compatibility of a shader you generate with Shader Graph. | +| [Node](Node.md) | Create nodes in your shader graph and learn about node interconnection details with ports and edges. | +| [Sub Graph](Sub-graph.md) | Create sub graphs that you can reference from inside other graphs. | +| [Sub Graph Asset](Sub-graph-Asset.md) | Learn about the asset type that contains any sub graph you create. | +| [Sticky Notes](Sticky-Notes.md) | Use sticky notes to write comments within your shader graphs. | +| [Color Modes](Color-Modes.md) | Select color modes to improve your graph readability according to certain criteria like node category, relative performance cost, data precision mode, or custom colors. | +| [Precision Modes](Precision-Modes.md) | Set precision modes for graphs, subgraphs, and nodes to help you optimize your content for different platforms. | +| [Preview Mode Control](Preview-Mode-Control.md) | Manually select your preferred preview mode for nodes that have a preview. | +| [Custom Render Textures](Custom-Render-Texture.md) | Create shaders that are compatible with Custom Render Texture Update and Initialization materials. | +| [Material Variants](materialvariant-SG.md) | Create variations based on a single material. | +| [Property Types](Property-Types.md) | Use properties in your shader graph to expose them as material properties and make them editable in the material that uses the shader. | +| [Keywords](Keywords.md) | Use keywords to create different variants for your shader graph. | +| [Data Types](Data-Types.md) | Learn about all data types available in Shader Graph. | +| [Port Bindings](Port-Bindings.md) | Learn about port bindings, which ensure that some ports always meet data type expectations. | +| [Shader Stage](Shader-Stage.md) | Learn about shader stages that apply to specific ports according to their context compatibility. | +| [Surface options](surface-options.md) | Modify a specific set of properties for certain render pipeline targets. | +| [Custom Interpolators](Custom-Interpolators.md) | Pass custom data from the vertex context to the fragment context. | diff --git a/Packages/com.unity.shadergraph/Documentation~/install-and-upgrade.md b/Packages/com.unity.shadergraph/Documentation~/install-and-upgrade.md new file mode 100644 index 00000000000..60a8eaf99fa --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/install-and-upgrade.md @@ -0,0 +1,8 @@ +# Install and upgrade + +Install and upgrade Shader Graph. + +| Topic | Description | +| :--- | :--- | +| **[Install Shader Graph](install-shader-graph.md)** | Learn about the Shader Graph installation requirements and follow the installation instructions. | +| **[Upgrade to version 10.0.x of Shader Graph](Upgrade-Guide-10-0-x.md)** | Upgrade your project to make it compatible with Shader Graph 10.0 or later. | diff --git a/Packages/com.unity.shadergraph/Documentation~/install-shader-graph.md b/Packages/com.unity.shadergraph/Documentation~/install-shader-graph.md new file mode 100644 index 00000000000..06427688a16 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/install-shader-graph.md @@ -0,0 +1,23 @@ +# Install Shader Graph + +Learn about the Shader Graph installation requirements and follow the installation instructions. + +## Requirements + +Use Shader Graph with either of the Scriptable Render Pipelines (SRPs) available in Unity version 2018.1 and later: + +- The [High Definition Render Pipeline (HDRP)](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest) +- The [Universal Render Pipeline (URP)](https://docs.unity3d.com/Manual/urp/urp-introduction.html) + +As of Unity version 2021.2, you can also use Shader Graph with the [Built-In Render Pipeline](https://docs.unity3d.com/Documentation/Manual/built-in-render-pipeline.html). + +> [!NOTE] +> Shader Graph support for the Built-In Render Pipeline is for compatibility purposes only. Shader Graph doesn't receive updates for Built-In Render Pipeline support, aside from bug fixes for existing features. It's recommended to use Shader Graph with the Scriptable Render Pipelines. + +## Installation + +When you install HDRP or URP into your project, Unity also installs the Shader Graph package automatically. You can manually install Shader Graph for use with the Built-In Render Pipeline on Unity version 2021.2 and later with the Package Manager. + +* For more information about how to install a package, see [Adding and removing packages](https://docs.unity3d.com/Manual/upm-ui-actions.html) in the Unity User Manual. + +* For more information about how to set up a Scriptable Render Pipeline, see [Getting started with HDRP](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@17.0/manual/getting-started-in-hdrp.html) or [Getting started with URP](https://docs.unity3d.com/Manual/urp/InstallingAndConfiguringURP). diff --git a/Packages/com.unity.shadergraph/Documentation~/ui-reference.md b/Packages/com.unity.shadergraph/Documentation~/ui-reference.md new file mode 100644 index 00000000000..f9263c7c2be --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/ui-reference.md @@ -0,0 +1,17 @@ +# Shader Graph UI reference + +Explore the main user interface elements you need to know to create and configure your shader graphs. + +| Topic | Description | +| :--- | :--- | +| [Shader Graph Window](Shader-Graph-Window.md) | Display and edit your shader graph assets in Unity, including the Blackboard, the Main Preview, and the Graph Inspector. | +| [Create Node Menu](Create-Node-Menu.md) | Create nodes in your graph and create block nodes in the Master Stack. | +| [Graph Settings Tab](Graph-Settings-Tab.md) | Change settings that affect your shader graph as a whole. | +| [Master Stack](Master-Stack.md) | Explore the end point of a shader graph, which defines the final surface appearance of a shader. | +| [Shader Graph Preferences](Shader-Graph-Preferences.md) | Define shader graph settings for your system. | +| [Shader Graph Project Settings](Shader-Graph-Project-Settings.md) | Define shader graph settings for your entire project. | +| [Shader Graph Keyboard Shortcuts](Keyboard-shortcuts.md) | Use keyboard shortcuts to work more efficiently when you're using Shader Graph. | + +## Additional resources + +* [Node Library](Node-Library.md) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/whats-new.md b/Packages/com.unity.shadergraph/Documentation~/whats-new.md new file mode 100644 index 00000000000..916386ba408 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/whats-new.md @@ -0,0 +1,3 @@ +# What's new in Shader Graph + +For information about the latest updates and improvements to Shader Graph, refer to [What's new in Unity](https://docs.unity3d.com/Manual/WhatsNew.html). From 5538f576e5baaeb4970f45e1f2b7d2ebc4662b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Sun, 5 Oct 2025 03:24:39 +0000 Subject: [PATCH 038/115] Render Pipeline Converter - Show modal dialog to accept conversion process --- .../Converter/Window/RenderPipelineConvertersEditor.cs | 9 +++++++++ .../Converter/Window/RenderPipelineConvertersEditor.uxml | 1 - 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.cs b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.cs index 4482d583c1f..47dacdab6ad 100644 --- a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.cs +++ b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.cs @@ -435,6 +435,7 @@ struct AnalyticContextInfo void Convert(ClickEvent evt) { + if (!ShowIrreversibleChangesDialog()) return; // Ask to save save the current open scene and after the conversion is done reload the same scene. if (!SaveCurrentSceneAndContinue()) return; @@ -497,5 +498,13 @@ public void AddItemsToMenu(GenericMenu menu) } ); } + + internal static string k_DialogKey = $"{nameof(UnityEditor)}.{nameof(Rendering)}.{nameof(RenderPipelineConvertersEditor)}.{nameof(ShowIrreversibleChangesDialog)}"; + private bool ShowIrreversibleChangesDialog() + { + return EditorUtility.DisplayDialog("Confirm Project Conversion", + "This action will modify project assets and cannot be easily undone. It is strongly recommended to have a backup or use version control before continuing.", + "Proceed", "Cancel", DialogOptOutDecisionType.ForThisMachine, k_DialogKey); + } } } diff --git a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.uxml b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.uxml index 49944729e9c..b9da6ffb630 100644 --- a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.uxml +++ b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.uxml @@ -15,7 +15,6 @@ - From cd3a7bf2335abbfa3d398fc6d66b0e4b786d9fe0 Mon Sep 17 00:00:00 2001 From: Lisha Li Date: Sun, 5 Oct 2025 03:24:52 +0000 Subject: [PATCH 039/115] Fixed broken links --- .../Documentation~/default-solid-node.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.shadergraph/Documentation~/default-solid-node.md b/Packages/com.unity.shadergraph/Documentation~/default-solid-node.md index fa0a33496d5..0144c9d4e8c 100644 --- a/Packages/com.unity.shadergraph/Documentation~/default-solid-node.md +++ b/Packages/com.unity.shadergraph/Documentation~/default-solid-node.md @@ -12,8 +12,8 @@ You can use this node combined with other nodes to create custom effects for the ## Ports -| Name | Direction | Type | Description | -|----------|-----------|---------|--------------------------------------| +| Name | Direction | Type | Description | +|----------|-----------|---------|-----------------------------------------------| | Solid | Output | Color | The solid color specified for the UI element. | ## Additional resources From ab142601756d7613dbea8a1be5092ca400cad3aa Mon Sep 17 00:00:00 2001 From: Chris Chu Date: Sun, 5 Oct 2025 23:20:31 +0000 Subject: [PATCH 040/115] [UUM-117676] Fix for Sort As 2D when using Prefabs --- .../2D/Overrides/SortingGroupEditor2DURP.cs | 53 ++++++++----------- .../Scenes/104_Sort-3D-As-2D-Default.unity | 16 ++++-- .../105_Sort-3D-As-2D-ShaderGraph.unity | 24 ++++++--- ...6_Sort-3D-As-2D-Intersection-Default.unity | 16 ++++-- ...rt-3D-As-2D-Intersection-ShaderGraph.unity | 24 ++++++--- 5 files changed, 83 insertions(+), 50 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/SortingGroupEditor2DURP.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/SortingGroupEditor2DURP.cs index f83941d3845..a840eff2323 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/SortingGroupEditor2DURP.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/SortingGroupEditor2DURP.cs @@ -12,23 +12,25 @@ internal class SortingGroupEditor2DURP : Editor { private static class Styles { - public static GUIContent flattenGroup = EditorGUIUtility.TrTextContent("Sort 3D as 2D", "Clears z values on 3D meshes affected by a Sorting Group allowing them to sort with other 2D objects and Sort 3D as 2D sorting groups."); + public static GUIContent sort3DAs2D = EditorGUIUtility.TrTextContent("Sort 3D as 2D", "Clears z values on 3D meshes affected by a Sorting Group allowing them to sort with other 2D objects and Sort 3D as 2D sorting groups."); } private SerializedProperty m_SortingOrder; private SerializedProperty m_SortingLayerID; + private SerializedProperty m_Sort3DAs2D; public virtual void OnEnable() { alwaysAllowExpansion = true; - m_SortingOrder = serializedObject.FindProperty("m_SortingOrder"); + m_SortingOrder = serializedObject.FindProperty("m_SortingOrder"); m_SortingLayerID = serializedObject.FindProperty("m_SortingLayerID"); + m_Sort3DAs2D = serializedObject.FindProperty("m_Sort3DAs2D"); } public RenderAs2D TryToFindCreatedRenderAs2D(SortingGroup sortingGroup) { RenderAs2D[] renderAs2Ds = sortingGroup.GetComponents(); - foreach(RenderAs2D renderAs2D in renderAs2Ds) + foreach (RenderAs2D renderAs2D in renderAs2Ds) { if (renderAs2D.IsOwner(sortingGroup)) return renderAs2D; @@ -49,39 +51,30 @@ void DirtyScene() UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEngine.SceneManagement.SceneManager.GetActiveScene()); } - void RenderFlattening() + void RenderSort3DAs2D() { - - bool tryToFlatten = TryToFindCreatedRenderAs2D(serializedObject.targetObject as SortingGroup) != null; - bool result = DrawToggleWithLayout(tryToFlatten, Styles.flattenGroup); - - if (tryToFlatten != result) + EditorGUILayout.PropertyField(m_Sort3DAs2D, Styles.sort3DAs2D); + foreach (var target in targets) { - tryToFlatten = result; - foreach (Object targetObject in serializedObject.targetObjects) + SortingGroup sortingGroup = (SortingGroup)target; + if (sortingGroup.sort3DAs2D) { - SortingGroup sortingGroup = targetObject as SortingGroup; - RenderAs2D renderAs2D = TryToFindCreatedRenderAs2D(sortingGroup); + GameObject go = sortingGroup.gameObject; + go.TryGetComponent(out RenderAs2D renderAs2D); - if (tryToFlatten) + if (renderAs2D != null && !renderAs2D.IsOwner(sortingGroup)) { - if (!renderAs2D) - { - Material mat = AssetDatabase.LoadAssetAtPath("Packages/com.unity.render-pipelines.universal/Runtime/Materials/RenderAs2D-Flattening.mat"); - RenderAs2D newRenderAs2D = sortingGroup.gameObject.AddComponent(); - newRenderAs2D.Init(sortingGroup); - newRenderAs2D.material = mat; - newRenderAs2D.hideFlags = HideFlags.HideInInspector | HideFlags.HideInHierarchy; - DirtyScene(); - } + Component.DestroyImmediate(renderAs2D, true); + renderAs2D = null; } - else + + if(renderAs2D == null) { - if (renderAs2D) - { - Component.DestroyImmediate(renderAs2D); - DirtyScene(); - } + Material mat = AssetDatabase.LoadAssetAtPath("Packages/com.unity.render-pipelines.universal/Runtime/Materials/RenderAs2D-Flattening.mat"); + renderAs2D = go.AddComponent(); + renderAs2D.Init(sortingGroup); + renderAs2D.material = mat; + EditorUtility.SetDirty(sortingGroup.gameObject); } } } @@ -95,7 +88,7 @@ public override void OnInspectorGUI() if (rpAsset != null && (rpAsset.scriptableRenderer is Renderer2D)) { SortingLayerEditorUtility.RenderSortingLayerFields(m_SortingOrder, m_SortingLayerID); - RenderFlattening(); + RenderSort3DAs2D(); } else base.OnInspectorGUI(); diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/104_Sort-3D-As-2D-Default.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/104_Sort-3D-As-2D-Default.unity index 1c87b57dcad..949c1efdb95 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/104_Sort-3D-As-2D-Default.unity +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/104_Sort-3D-As-2D-Default.unity @@ -245,6 +245,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &114176919 RenderAs2D: m_ObjectHideFlags: 3 @@ -293,7 +294,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 114176918} + m_OwningSortingGroup: {fileID: 114176918} + m_WasCreatedByOwner: 1 --- !u!1 &140942888 GameObject: m_ObjectHideFlags: 0 @@ -2672,6 +2674,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &1611659894 RenderAs2D: m_ObjectHideFlags: 3 @@ -2720,7 +2723,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 1611659893} + m_OwningSortingGroup: {fileID: 1611659893} + m_WasCreatedByOwner: 1 --- !u!1 &1711284038 GameObject: m_ObjectHideFlags: 0 @@ -2833,6 +2837,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: -1 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &1720578186 RenderAs2D: m_ObjectHideFlags: 3 @@ -2881,7 +2886,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 1720578185} + m_OwningSortingGroup: {fileID: 1720578185} + m_WasCreatedByOwner: 1 --- !u!1 &1805784941 GameObject: m_ObjectHideFlags: 0 @@ -5320,6 +5326,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &6633563706952778051 RenderAs2D: m_ObjectHideFlags: 3 @@ -5368,7 +5375,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 6633563706952778050} + m_OwningSortingGroup: {fileID: 6633563706952778050} + m_WasCreatedByOwner: 1 --- !u!4 &6929055677307623865 Transform: m_ObjectHideFlags: 0 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/105_Sort-3D-As-2D-ShaderGraph.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/105_Sort-3D-As-2D-ShaderGraph.unity index f2c827c7572..7e8414475a3 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/105_Sort-3D-As-2D-ShaderGraph.unity +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/105_Sort-3D-As-2D-ShaderGraph.unity @@ -555,6 +555,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &114176919 RenderAs2D: m_ObjectHideFlags: 3 @@ -603,7 +604,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 114176918} + m_OwningSortingGroup: {fileID: 114176918} + m_WasCreatedByOwner: 1 --- !u!1 &139581595 GameObject: m_ObjectHideFlags: 0 @@ -825,6 +827,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &213804573 RenderAs2D: m_ObjectHideFlags: 3 @@ -873,7 +876,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 213804572} + m_OwningSortingGroup: {fileID: 213804572} + m_WasCreatedByOwner: 1 --- !u!1 &240135210 GameObject: m_ObjectHideFlags: 0 @@ -3710,6 +3714,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &1252527191 RenderAs2D: m_ObjectHideFlags: 3 @@ -3758,7 +3763,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 1252527190} + m_OwningSortingGroup: {fileID: 1252527190} + m_WasCreatedByOwner: 1 --- !u!1 &1279664809 GameObject: m_ObjectHideFlags: 0 @@ -5085,6 +5091,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &1611659894 RenderAs2D: m_ObjectHideFlags: 3 @@ -5133,7 +5140,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 1611659893} + m_OwningSortingGroup: {fileID: 1611659893} + m_WasCreatedByOwner: 1 --- !u!1 &1620089285 GameObject: m_ObjectHideFlags: 0 @@ -5750,6 +5758,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &2010257417 RenderAs2D: m_ObjectHideFlags: 3 @@ -5798,7 +5807,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 2010257416} + m_OwningSortingGroup: {fileID: 2010257416} + m_WasCreatedByOwner: 1 --- !u!1 &2029519282 GameObject: m_ObjectHideFlags: 0 @@ -8102,6 +8112,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &6633563706952778051 RenderAs2D: m_ObjectHideFlags: 3 @@ -8150,7 +8161,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 6633563706952778050} + m_OwningSortingGroup: {fileID: 6633563706952778050} + m_WasCreatedByOwner: 1 --- !u!4 &6929055677307623865 Transform: m_ObjectHideFlags: 0 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/106_Sort-3D-As-2D-Intersection-Default.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/106_Sort-3D-As-2D-Intersection-Default.unity index 4ed676817a3..38a710813c1 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/106_Sort-3D-As-2D-Intersection-Default.unity +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/106_Sort-3D-As-2D-Intersection-Default.unity @@ -245,6 +245,7 @@ SortingGroup: m_SortingLayer: 1 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &114176919 RenderAs2D: m_ObjectHideFlags: 3 @@ -293,7 +294,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 114176918} + m_OwningSortingGroup: {fileID: 114176918} + m_WasCreatedByOwner: 1 --- !u!1 &140942888 GameObject: m_ObjectHideFlags: 0 @@ -2464,6 +2466,7 @@ SortingGroup: m_SortingLayer: 1 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &1611659894 RenderAs2D: m_ObjectHideFlags: 3 @@ -2512,7 +2515,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 1611659893} + m_OwningSortingGroup: {fileID: 1611659893} + m_WasCreatedByOwner: 1 --- !u!1 &1711284038 GameObject: m_ObjectHideFlags: 0 @@ -2625,6 +2629,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: -1 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &1720578186 RenderAs2D: m_ObjectHideFlags: 3 @@ -2673,7 +2678,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 1720578185} + m_OwningSortingGroup: {fileID: 1720578185} + m_WasCreatedByOwner: 1 --- !u!1 &1805784941 GameObject: m_ObjectHideFlags: 0 @@ -4952,6 +4958,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &6633563706952778051 RenderAs2D: m_ObjectHideFlags: 3 @@ -5000,7 +5007,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 6633563706952778050} + m_OwningSortingGroup: {fileID: 6633563706952778050} + m_WasCreatedByOwner: 1 --- !u!4 &6929055677307623865 Transform: m_ObjectHideFlags: 0 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/107_Sort-3D-As-2D-Intersection-ShaderGraph.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/107_Sort-3D-As-2D-Intersection-ShaderGraph.unity index e1c3718091e..2c57d74a3ab 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/107_Sort-3D-As-2D-Intersection-ShaderGraph.unity +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/107_Sort-3D-As-2D-Intersection-ShaderGraph.unity @@ -555,6 +555,7 @@ SortingGroup: m_SortingLayer: 1 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &114176919 RenderAs2D: m_ObjectHideFlags: 3 @@ -603,7 +604,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 114176918} + m_OwningSortingGroup: {fileID: 114176918} + m_WasCreatedByOwner: 1 --- !u!1 &139581595 GameObject: m_ObjectHideFlags: 0 @@ -825,6 +827,7 @@ SortingGroup: m_SortingLayer: 1 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &213804573 RenderAs2D: m_ObjectHideFlags: 3 @@ -873,7 +876,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 213804572} + m_OwningSortingGroup: {fileID: 213804572} + m_WasCreatedByOwner: 1 --- !u!1 &240135210 GameObject: m_ObjectHideFlags: 0 @@ -3410,6 +3414,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &1252527191 RenderAs2D: m_ObjectHideFlags: 3 @@ -3458,7 +3463,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 1252527190} + m_OwningSortingGroup: {fileID: 1252527190} + m_WasCreatedByOwner: 1 --- !u!1 &1279664809 GameObject: m_ObjectHideFlags: 0 @@ -4625,6 +4631,7 @@ SortingGroup: m_SortingLayer: 1 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &1611659894 RenderAs2D: m_ObjectHideFlags: 3 @@ -4673,7 +4680,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 1611659893} + m_OwningSortingGroup: {fileID: 1611659893} + m_WasCreatedByOwner: 1 --- !u!1 &1620089285 GameObject: m_ObjectHideFlags: 0 @@ -5198,6 +5206,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &2010257417 RenderAs2D: m_ObjectHideFlags: 3 @@ -5246,7 +5255,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 2010257416} + m_OwningSortingGroup: {fileID: 2010257416} + m_WasCreatedByOwner: 1 --- !u!1 &2029519282 GameObject: m_ObjectHideFlags: 0 @@ -7550,6 +7560,7 @@ SortingGroup: m_SortingLayer: 0 m_SortingOrder: 0 m_SortAtRoot: 0 + m_Sort3DAs2D: 1 --- !u!1120581460 &6633563706952778051 RenderAs2D: m_ObjectHideFlags: 3 @@ -7598,7 +7609,8 @@ RenderAs2D: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Owner: {fileID: 6633563706952778050} + m_OwningSortingGroup: {fileID: 6633563706952778050} + m_WasCreatedByOwner: 1 --- !u!4 &6929055677307623865 Transform: m_ObjectHideFlags: 0 From a3adec57fb2204cb662bfac2fffd62f8ede90009 Mon Sep 17 00:00:00 2001 From: Ludovic Theobald Date: Mon, 6 Oct 2025 14:10:36 +0000 Subject: [PATCH 041/115] [VFX] Fix Ensure_Camera_Command_Culled test instability --- .../Tests/Runtime/VFXCameraCullingTest.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Runtime/VFXCameraCullingTest.cs b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Runtime/VFXCameraCullingTest.cs index fabca90ad2d..c45bbbda908 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Runtime/VFXCameraCullingTest.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Runtime/VFXCameraCullingTest.cs @@ -1,5 +1,6 @@ using System.Collections; using NUnit.Framework; +using Unity.Profiling; using UnityEngine; using UnityEngine.Profiling; using UnityEngine.TestTools; @@ -12,23 +13,30 @@ public class VFXCameraCullingTest { Recorder m_VFXSortRecorder; private const string kScenePath = "Packages/com.unity.testing.visualeffectgraph/Scenes/009_MultiCamera.unity"; - private const int kCameraVisibleCount = 4; //The camera command markers appear twice in the main thread //Once in the Render Pipeline preparation, once in the Render Context Submit. private const int kMarkerMultiplier = 2; - private const int kWaitFrameCount = 32; + private int m_PreviousFrameRate; + [OneTimeSetUp] public void Init() { m_VFXSortRecorder = Recorder.Get("VFX.SortBuffer"); m_VFXSortRecorder.FilterToCurrentThread(); m_VFXSortRecorder.enabled = false; + m_PreviousFrameRate = Application.targetFrameRate; + Application.targetFrameRate = 30; + } + + [OneTimeTearDown] + public void Cleanup() + { + Application.targetFrameRate = m_PreviousFrameRate; } [UnityTest] - [Ignore("Unstable: https://jira.unity3d.com/browse/UUM-119807")] public IEnumerator Ensure_Camera_Commands_Are_Culled() { UnityEngine.SceneManagement.SceneManager.LoadScene(kScenePath); @@ -48,7 +56,7 @@ public IEnumerator Ensure_Camera_Commands_Are_Culled() int totalSampleCount = 0; for (int i = 0; i < kWaitFrameCount; i++) { - totalSampleCount += m_VFXSortRecorder.sampleBlockCount; + totalSampleCount += m_VFXSortRecorder.sampleBlockCount; yield return new WaitForEndOfFrame(); } From 77360906e759db3b1130ef952bf71e0902289de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolaj=20Z=C3=B8llner?= Date: Tue, 7 Oct 2025 00:29:40 +0000 Subject: [PATCH 042/115] Clustering no longer uses probes with null texture --- .../Runtime/ForwardLights.cs | 14 ++- .../Tests/Runtime/LightClusteringTests.cs | 94 ------------------- 2 files changed, 11 insertions(+), 97 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/ForwardLights.cs b/Packages/com.unity.render-pipelines.universal/Runtime/ForwardLights.cs index c25268a4c64..1e755d75d60 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/ForwardLights.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/ForwardLights.cs @@ -223,6 +223,13 @@ out int wordsPerTile var localLights = lights.GetSubArray(firstLocalLightIdx, localLightCount); var reflectionProbeCount = math.min(probes.Length, UniversalRenderPipeline.maxVisibleReflectionProbes); + // Ensure reflection probes without textures aren't used. + for (var i = 0; i < probes.Length; i++) + { + if (!probes[i].texture) + reflectionProbeCount--; + } + var itemsPerTile = localLights.Length + reflectionProbeCount; wordsPerTile = (itemsPerTile + 31) / 32; @@ -255,11 +262,12 @@ out int wordsPerTile // Should probe come after otherProbe? static bool IsProbeGreater(VisibleReflectionProbe probe, VisibleReflectionProbe otherProbe) { - return probe.importance < otherProbe.importance || - (probe.importance == otherProbe.importance && probe.bounds.extents.sqrMagnitude > otherProbe.bounds.extents.sqrMagnitude); + return otherProbe.texture != null && (probe.texture == null || probe.importance < otherProbe.importance || + (probe.importance == otherProbe.importance && probe.bounds.extents.sqrMagnitude > otherProbe.bounds.extents.sqrMagnitude)); } - for (var i = 1; i < reflectionProbeCount; i++) + // Used probes.Length to check that we use the most relevant probes. + for (var i = 1; i < probes.Length; i++) { var probe = probes[i]; var j = i - 1; diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightClusteringTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightClusteringTests.cs index 2ebcf991d8f..793cadaf955 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightClusteringTests.cs +++ b/Packages/com.unity.render-pipelines.universal/Tests/Runtime/LightClusteringTests.cs @@ -12,100 +12,6 @@ namespace UnityEngine.Rendering.Universal.Tests { class LightClusteringTests { - [Description("Test that an orthographic camera tilted down at a 45 degree angle clusters reflection probes properly. This test specifically focuses on making sure that the convex hull logic in the tiling jobs works as intended, because the reflection probe volume forms collinear points. This test was added due to UUM-58983.")] - [UnityPlatform(include = new RuntimePlatform[] { RuntimePlatform.WindowsEditor, RuntimePlatform.WindowsPlayer, RuntimePlatform.OSXEditor, RuntimePlatform.OSXPlayer })] - [Test] - public void LightClustering_WithOrthographicCameraAndCollinearConvexHull_ZBinsAndTileMasksAreCorrect() - { - NativeArray lights = new(0, Allocator.TempJob); - NativeArray probes = new(1, Allocator.TempJob); - probes[0] = new VisibleReflectionProbe() - { - bounds = new Bounds(Vector3.zero, new Vector3(5, 5, 5)), - localToWorldMatrix = Matrix4x4.identity, - center = Vector3.zero, - blendDistance = 0, - }; - NativeArray zBins = new(UniversalRenderPipeline.maxZBinWords, Allocator.TempJob); - NativeArray tileMasks = new (UniversalRenderPipeline.maxTileWords, Allocator.TempJob); - - float4x4 worldToView = new float4x4( - new float4(1, 0, 0, 0), - new float4(0, 0.707106709f, 0.707106829f, 0), - new float4(0, 0.707106829f, -0.707106709f, 0), - new float4(0, 0, -10, 1) - ); - var worldToViews = new Fixed2(worldToView, worldToView); - float4x4 viewToClip = new float4x4( - new float4(0.0985474288f, 0, 0, 0), - new float4(0, 0.200000003f, 0, 0), - new float4(0, 0, -0.0200601816f, 0), - new float4(0, 0, -1.00601816f, 1) - ); - var viewToClips = new Fixed2(viewToClip, viewToClip); - int2 screenResolution = new(128, 128); - float nearPlane = 0.3f; - float farPlane = 100f; - - JobHandle handle = ForwardLights.ScheduleClusteringJobs( - lights, - probes, - zBins, - tileMasks, - worldToViews, - viewToClips, - 1, - screenResolution, - nearPlane, - farPlane, - true, - out int localLightCount, - out int directionalLightCount, - out int binCount, - out float zBinScale, - out float zBinOffset, - out int2 tileResolution, - out int actualTileWidth, - out int wordsPerTile - ); - JobHandle.ScheduleBatchedJobs(); - handle.Complete(); - - // Uncomment temporarily if the reference arrays need to be updated. - // Debug.Log(string.Join(",", zBins)); - // Debug.Log(string.Join(",", tileMasks)); - - // If the following assertions fail, there isn't currently good - // tooling to visualize the difference. A 3D texture slice viewer - // can be built that would fix this issue. But the cost-benefit is - // not worth it at the moment, since the diff of a PR that fails - // this test can be enough to go on. - // - // Also, these assertions can fail if a change is made includes more - // false positives, i.e. lights contributing to _more_ clusters than - // expected due to increased conservatism, or lights contributing to - // _less_ clusters due increased accuracy. In either of these cases, - // it is up to the author of these code changes to update the - // expected values. - CollectionAssert.AreEqual(expectedZBins0, zBins); - CollectionAssert.AreEqual(expectedTileMasks0, tileMasks); - - lights.Dispose(); - probes.Dispose(); - zBins.Dispose(); - tileMasks.Dispose(); - } - - static readonly uint[] expectedZBins0 = - { - 65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,0,1,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,65535,65535,0,0 - }; - - static readonly uint[] expectedTileMasks0 = - { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - }; - [Description("The tiling job calculates an intersection between an XZ plane and the light volume to determine the range of tiles that the light affects. In the cases where this range falls completely outside of the screen, this test ensures that the ranges are clamped correctly to screen boundaries. If not tested, this bug affects the cone section of spot lights, the cap section of spot lights, and also point lights. This test was added due to UUM-84591.")] [UnityPlatform(include = new RuntimePlatform[] { RuntimePlatform.WindowsEditor, RuntimePlatform.WindowsPlayer, RuntimePlatform.OSXEditor, RuntimePlatform.OSXPlayer })] [Test] From ce02e81566a5938916e3b2022553f3e5bed60d88 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Tue, 7 Oct 2025 00:29:41 +0000 Subject: [PATCH 043/115] [VFX] Properly handle empty enum values and prevent it from happening --- .../Editor/Controls/VFXEnumValuePopup.cs | 2 +- .../Editor/Controls/VFXReorderableList.cs | 5 +---- .../Editor/GraphView/Elements/VFXMultiOperatorEdit.cs | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Controls/VFXEnumValuePopup.cs b/Packages/com.unity.visualeffectgraph/Editor/Controls/VFXEnumValuePopup.cs index 6363f3a6756..5a5c6e390cb 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Controls/VFXEnumValuePopup.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Controls/VFXEnumValuePopup.cs @@ -16,7 +16,7 @@ public VFXEnumValuePopup(string label, List values) { m_DropDownButton = new DropdownField(label); m_DropDownButton.choices = values; - m_DropDownButton.value = values[0]; + m_DropDownButton.value = values.Count > 0 ? values[0] : string.Empty; m_DropDownButton.RegisterCallback>(OnValueChanged); Add(m_DropDownButton); } diff --git a/Packages/com.unity.visualeffectgraph/Editor/Controls/VFXReorderableList.cs b/Packages/com.unity.visualeffectgraph/Editor/Controls/VFXReorderableList.cs index a12cd555e5c..854b0b6f4e6 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Controls/VFXReorderableList.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Controls/VFXReorderableList.cs @@ -129,10 +129,7 @@ public void Select(int index) } } - public virtual bool CanRemove() - { - return true; - } + protected virtual bool CanRemove() => itemCount > 1; public void Select(VisualElement item) { diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXMultiOperatorEdit.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXMultiOperatorEdit.cs index 2a8e4474ac9..4bba4a380f4 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXMultiOperatorEdit.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/VFXMultiOperatorEdit.cs @@ -254,7 +254,7 @@ public override void OnAdd() controller.model.AddOperand(); } - public override bool CanRemove() + protected override bool CanRemove() { return controller.CanRemove(); } From 2bef44cd17babb1addb08737eac5d24f7fb9e548 Mon Sep 17 00:00:00 2001 From: Masayoshi Miyamoto Date: Tue, 7 Oct 2025 00:29:41 +0000 Subject: [PATCH 044/115] Rename shadow mask modes --- .../Editor/Lighting/HDLightUI.Skin.cs | 2 +- .../Editor/Lighting/HDLightUI.cs | 8 ++++---- .../Runtime/Lighting/Light/HDAdditionalLightData.cs | 4 ++-- .../Runtime/Lighting/Light/HDGpuLightsBuilder.Jobs.cs | 8 ++++---- .../Runtime/Lighting/LightDefinition.cs | 4 ++-- .../Runtime/Lighting/LightDefinition.cs.hlsl | 4 ++-- .../Runtime/Lighting/LightEvaluation.hlsl | 6 +++--- .../Runtime/Lighting/LightLoop/HDShadowLoop.hlsl | 2 +- .../Raytracing/Shaders/HDRaytracingShadowLoop.hlsl | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs index b5417159e2b..0792bff5467 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.Skin.cs @@ -40,7 +40,7 @@ sealed class Styles public readonly GUIContent lightRadius = EditorGUIUtility.TrTextContent("Radius", "Sets the radius of the light source. This affects the falloff of diffuse lighting, the spread of the specular highlight, and the softness of Ray Traced shadows."); public readonly GUIContent affectDiffuse = EditorGUIUtility.TrTextContent("Affect Diffuse", "When disabled, HDRP does not calculate diffuse lighting for this Light. Does not increase performance as HDRP still calculates the diffuse lighting."); public readonly GUIContent affectSpecular = EditorGUIUtility.TrTextContent("Affect Specular", "When disabled, HDRP does not calculate specular lighting for this Light. Does not increase performance as HDRP still calculates the specular lighting."); - public readonly GUIContent nonLightmappedOnly = EditorGUIUtility.TrTextContent("Shadowmask Mode", "Determines Shadowmask functionality when using Mixed lighting. Distance Shadowmask casts real-time shadows within the Shadow Distance, and baked shadows beyond. In Shadowmask mode, static GI contributors always cast baked shadows.\nEnable Shadowmask support in the HDRP asset to make use of this feature. Only available when Lighting Mode is set to Shadowmask in the Lighting window."); + public readonly GUIContent shadowMaskMode = EditorGUIUtility.TrTextContent("Shadowmask Mode", "Determines Shadowmask functionality when using Mixed lighting. Distance Shadowmask casts real-time shadows within the Shadow Distance, and baked shadows beyond. In Shadowmask mode, static GI contributors always cast baked shadows.\nEnable Shadowmask support in the HDRP asset to make use of this feature. Only available when Lighting Mode is set to Shadowmask in the Lighting window."); public readonly GUIContent lightDimmer = EditorGUIUtility.TrTextContent("Intensity Multiplier", "Multiplies the intensity of the Light by the given number. This is useful for modifying the intensity of multiple Lights simultaneously without needing know the intensity of each Light. This property does not affect the Physically Based Sky rendering for the main directionnal light."); public readonly GUIContent fadeDistance = EditorGUIUtility.TrTextContent("Fade Distance", "Sets the distance from the camera at which light smoothly fades out before HDRP culls it completely. This minimizes popping."); public readonly GUIContent innerOuterSpotAngle = EditorGUIUtility.TrTextContent("Inner / Outer Spot Angle", "Controls the inner and outer angles in degrees, at the base of a Spot light's cone."); diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs index d87445c7a26..ad6b7046c14 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs @@ -1307,12 +1307,12 @@ static void DrawShadowMapContent(SerializedHDLight serialized, Editor owner) enabled &= settings.mixedBakeMode == MixedLightingMode.Shadowmask; using (new EditorGUI.DisabledScope(!enabled)) { - Rect nonLightmappedOnlyRect = EditorGUILayout.GetControlRect(); - EditorGUI.BeginProperty(nonLightmappedOnlyRect, s_Styles.nonLightmappedOnly, serialized.nonLightmappedOnly); + Rect rect = EditorGUILayout.GetControlRect(); + EditorGUI.BeginProperty(rect, s_Styles.shadowMaskMode, serialized.nonLightmappedOnly); { EditorGUI.BeginChangeCheck(); ShadowmaskMode shadowmask = serialized.nonLightmappedOnly.boolValue ? ShadowmaskMode.Shadowmask : ShadowmaskMode.DistanceShadowmask; - shadowmask = (ShadowmaskMode)EditorGUI.EnumPopup(nonLightmappedOnlyRect, s_Styles.nonLightmappedOnly, shadowmask); + shadowmask = (ShadowmaskMode)EditorGUI.EnumPopup(rect, s_Styles.shadowMaskMode, shadowmask); fullShadowMask = shadowmask == ShadowmaskMode.Shadowmask; if (EditorGUI.EndChangeCheck()) @@ -1320,7 +1320,7 @@ static void DrawShadowMapContent(SerializedHDLight serialized, Editor owner) Undo.RecordObjects(owner.targets, "Light Update Shadowmask Mode"); serialized.nonLightmappedOnly.boolValue = fullShadowMask; foreach (Light target in owner.targets) - target.lightShadowCasterMode = shadowmask == ShadowmaskMode.Shadowmask ? LightShadowCasterMode.NonLightmappedOnly : LightShadowCasterMode.Everything; + target.lightShadowCasterMode = shadowmask == ShadowmaskMode.Shadowmask ? LightShadowCasterMode.ShadowMask : LightShadowCasterMode.DistanceShadowMask; } } EditorGUI.EndProperty(); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs index bcb7e0b4108..9f5a9ea4306 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs @@ -306,7 +306,7 @@ public bool nonLightmappedOnly return; m_NonLightmappedOnly = value; - legacyLight.lightShadowCasterMode = value ? LightShadowCasterMode.NonLightmappedOnly : LightShadowCasterMode.Everything; + legacyLight.lightShadowCasterMode = value ? LightShadowCasterMode.ShadowMask : LightShadowCasterMode.DistanceShadowMask; // We need to update the ray traced shadow flag as we don't want ray traced shadows with shadow mask. if (lightEntity.valid) HDLightRenderDatabase.instance.EditLightDataAsRef(lightEntity).useRayTracedShadows = m_UseRayTracedShadows && !m_NonLightmappedOnly; @@ -2906,7 +2906,7 @@ public static void InitDefaultHDAdditionalLightData(HDAdditionalLightData lightD } // We don't use the global settings of shadow mask by default - light.lightShadowCasterMode = LightShadowCasterMode.Everything; + light.lightShadowCasterMode = LightShadowCasterMode.DistanceShadowMask; lightData.normalBias = 0.75f; lightData.slopeBias = 0.5f; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDGpuLightsBuilder.Jobs.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDGpuLightsBuilder.Jobs.cs index cb3bf048048..d995707ce64 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDGpuLightsBuilder.Jobs.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDGpuLightsBuilder.Jobs.cs @@ -301,13 +301,13 @@ public static void ConvertLightToGPUFormat( if (processedEntity.isBakedShadowMask) { lightData.shadowMaskSelector[visibleLightBakingOutput.occlusionMaskChannel] = 1.0f; - lightData.nonLightMappedOnly = visibleLightShadowCasterMode == LightShadowCasterMode.NonLightmappedOnly ? 1 : 0; + lightData.useShadowMask = visibleLightShadowCasterMode == LightShadowCasterMode.ShadowMask ? 1 : 0; } else { // use -1 to say that we don't use shadow mask lightData.shadowMaskSelector.x = -1.0f; - lightData.nonLightMappedOnly = 0; + lightData.useShadowMask = 0; } } @@ -610,13 +610,13 @@ private void ConvertDirectionalLightToGPUFormat( { var bakingOutput = visibleLightBakingOutput[lightIndex]; lightData.shadowMaskSelector[bakingOutput.occlusionMaskChannel] = 1.0f; - lightData.nonLightMappedOnly = visibleLightShadowCasterMode[lightIndex] == LightShadowCasterMode.NonLightmappedOnly ? 1 : 0; + lightData.useShadowMask = visibleLightShadowCasterMode[lightIndex] == LightShadowCasterMode.ShadowMask ? 1 : 0; } else { // use -1 to say that we don't use shadow mask lightData.shadowMaskSelector.x = -1.0f; - lightData.nonLightMappedOnly = 0; + lightData.useShadowMask = 0; } lightData.angularDiameter = lightRenderData.angularDiameter * Mathf.Deg2Rad; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs index 19c916bdbc9..02d38a6d7f5 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs @@ -84,7 +84,7 @@ struct DirectionalLightData public float shadowDimmer; public float volumetricShadowDimmer; // Replaces 'shadowDimmer' - public int nonLightMappedOnly; // Used with ShadowMask (TODO: use a bitfield) + public int useShadowMask; // Used with ShadowMask (TODO: use a bitfield) [SurfaceDataAttributes(precision = FieldPrecision.Real)] public float minRoughness; // Hack public int screenSpaceShadowIndex; // -1 if unused (TODO: 16 bit) @@ -177,7 +177,7 @@ struct LightData public float shadowDimmer; public float volumetricShadowDimmer; // Replaces 'shadowDimmer' - public int nonLightMappedOnly; // Used with ShadowMask feature (TODO: use a bitfield) + public int useShadowMask; // Used with ShadowMask feature (TODO: use a bitfield) [SurfaceDataAttributes(precision = FieldPrecision.Real)] public float minRoughness; // This is use to give a small "area" to punctual light, as if we have a light with a radius. // TODO: Instead of doing this, we should pack the ray traced shadow index into the tile cookie for instance diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs.hlsl index 9563de5501a..851288ad13a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightDefinition.cs.hlsl @@ -104,7 +104,7 @@ struct DirectionalLightData float3 shadowTint; float shadowDimmer; float volumetricShadowDimmer; - int nonLightMappedOnly; + int useShadowMask; real minRoughness; int screenSpaceShadowIndex; real4 shadowMaskSelector; @@ -189,7 +189,7 @@ struct LightData float3 shadowTint; float shadowDimmer; float volumetricShadowDimmer; - int nonLightMappedOnly; + int useShadowMask; real minRoughness; int screenSpaceShadowIndex; real4 shadowMaskSelector; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightEvaluation.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightEvaluation.hlsl index b4c5c59a837..2024fd569a3 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightEvaluation.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightEvaluation.hlsl @@ -331,7 +331,7 @@ SHADOW_TYPE EvaluateShadow_Directional( LightLoopContext lightLoopContext, Posit } // See comment in EvaluateBSDF_Punctual - if (light.nonLightMappedOnly) + if (light.useShadowMask) { shadow = min(shadowMask, shadow); } @@ -553,7 +553,7 @@ SHADOW_TYPE EvaluateShadow_Punctual(LightLoopContext lightLoopContext, PositionI // The min handle the case of having only dynamic objects in the ShadowMap // The second case for blend with distance is handled with ShadowDimmer. ShadowDimmer is define manually and by shadowDistance by light. // With distance, ShadowDimmer become one and only the ShadowMask appear, we get the blend with distance behavior. - shadow = light.nonLightMappedOnly ? min(shadowMask, shadow) : shadow; + shadow = light.useShadowMask ? min(shadowMask, shadow) : shadow; #endif shadow = lerp(shadowMask, shadow, light.shadowDimmer); @@ -626,7 +626,7 @@ SHADOW_TYPE EvaluateShadow_RectArea( LightLoopContext lightLoopContext, Position #ifdef SHADOWS_SHADOWMASK // See comment for punctual light shadow mask - shadow = light.nonLightMappedOnly ? min(shadowMask, shadow) : shadow; + shadow = light.useShadowMask ? min(shadowMask, shadow) : shadow; #endif shadow = lerp(shadowMask, shadow, light.shadowDimmer); } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadowLoop.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadowLoop.hlsl index 74017540e24..1d5ddd34672 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadowLoop.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadowLoop.hlsl @@ -162,7 +162,7 @@ void ShadowLoopMin(HDShadowContext shadowContext, PositionInputs posInput, float #endif { shadowP = GetPunctualShadowAttenuation(shadowContext, posInput.positionSS, posInput.positionWS, normalWS, s_lightData.shadowIndex, L, distances.x, s_lightData.lightType == GPULIGHTTYPE_POINT, s_lightData.lightType != GPULIGHTTYPE_PROJECTOR_BOX); - shadowP = s_lightData.nonLightMappedOnly ? min(1.0f, shadowP) : shadowP; + shadowP = s_lightData.useShadowMask ? min(1.0f, shadowP) : shadowP; } shadowP = lerp(1.0f, shadowP, s_lightData.shadowDimmer); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/HDRaytracingShadowLoop.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/HDRaytracingShadowLoop.hlsl index c2a73a731e5..464d4e990a9 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/HDRaytracingShadowLoop.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/HDRaytracingShadowLoop.hlsl @@ -130,7 +130,7 @@ void ShadowLoopMin(HDShadowContext shadowContext, PositionInputs posInput, float && L.y > 0.0) { shadowP = GetPunctualShadowAttenuation(shadowContext, posInput.positionSS, posInput.positionWS, normalWS, lightData.shadowIndex, L, distances.x, lightData.lightType == GPULIGHTTYPE_POINT, lightData.lightType != GPULIGHTTYPE_PROJECTOR_BOX); - shadowP = lightData.nonLightMappedOnly ? min(1.0f, shadowP) : shadowP; + shadowP = lightData.useShadowMask ? min(1.0f, shadowP) : shadowP; shadowP = lerp(1.0f, shadowP, lightData.shadowDimmer); #ifdef SHADOW_LOOP_MULTIPLY From 25779f10998f1f81eb2c3c4d4cdbf623b58187bf Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Tue, 7 Oct 2025 00:29:41 +0000 Subject: [PATCH 045/115] [VFX] Fix Opening Twice with Subgraph --- .../Editor/GraphView/VFXViewWindow.cs | 2 +- .../Tests/Editor/VFXViewWindowTest.cs | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/VFXViewWindow.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/VFXViewWindow.cs index 3e2607c7000..62e203dbafd 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/VFXViewWindow.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/VFXViewWindow.cs @@ -77,7 +77,7 @@ public static VFXViewWindow GetWindow(VFXGraph vfxGraph, bool createIfNeeded = f public static VFXViewWindow GetWindow(VisualEffectResource resource, bool createIfNeeded = false, bool show = true) { - return GetWindowLambda(x => x.graphView?.controller?.graph.visualEffectResource == resource, createIfNeeded, show); + return GetWindowLambda(x => x.displayedResource == resource, createIfNeeded, show); } public static VFXViewWindow GetWindow(VFXParameter vfxParameter, bool createIfNeeded = false) diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXViewWindowTest.cs b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXViewWindowTest.cs index 13841661547..d4c31148281 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXViewWindowTest.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXViewWindowTest.cs @@ -98,6 +98,49 @@ public IEnumerator Domain_Reload_With_VFX_Live_In_Scene() Assert.AreEqual(3, previewAssets.OfType().Count()); } + [SerializeField] private string m_Domain_Reload_Open_Same_Window_Twice_Path; + + [UnityTest, Description("Cover UUM-113965")] + public IEnumerator Domain_Reload_Open_Same_Window_Twice() + { + while (EditorWindow.HasOpenInstances()) + EditorWindow.GetWindow().Close(); + while (EditorWindow.HasOpenInstances()) + EditorWindow.GetWindow().Close(); + + Assert.AreEqual(0, VFXViewWindow.GetAllWindows().Count); + var graph = VFXTestCommon.MakeTemporarySubGraphBlock(); + + m_Domain_Reload_Open_Same_Window_Twice_Path = AssetDatabase.GetAssetPath(graph); + Assert.IsFalse(string.IsNullOrEmpty(m_Domain_Reload_Open_Same_Window_Twice_Path)); + + var resource = graph.GetResource(); + var window = VFXViewWindow.GetWindow(resource, true, true); + window.LoadResource(resource, null); + + var vfxDockArea = window.m_Parent as DockArea; + Assert.IsNotNull(vfxDockArea); + vfxDockArea.AddTab(SceneView.GetWindow(typeof(SceneView))); + + for (int i = 0; i < 4; ++i) + yield return null; + + Assert.AreEqual(1, VFXViewWindow.GetAllWindows().Count); + + EditorUtility.RequestScriptReload(); + yield return new WaitForDomainReload(); + + resource = VisualEffectResource.GetResourceAtPath(m_Domain_Reload_Open_Same_Window_Twice_Path); + Assert.AreEqual(1, VFXViewWindow.GetAllWindows().Count); + yield return null; + + window = VFXViewWindow.GetWindow(resource, true, true); + window.LoadResource(resource, null); + + Assert.AreEqual(1, VFXViewWindow.GetAllWindows().Count); + yield return null; + } + [UnityTest] public IEnumerator Check_Tab_Attachment_Behavior() { From 2172332e645ef9ff7fd818af0c1cc3a610e2ccb1 Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Tue, 7 Oct 2025 00:29:42 +0000 Subject: [PATCH 046/115] [Particles] Forcing identity in prevWorldMatrix --- .../GraphicsTests/105_MotionVectors.unity | 4910 ++++++++++++++++- .../GraphicsTests/Repro_UUM114886.shadergraph | 422 ++ .../Repro_UUM114886.shadergraph.meta | 18 + 3 files changed, 5332 insertions(+), 18 deletions(-) create mode 100644 Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Repro_UUM114886.shadergraph create mode 100644 Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Repro_UUM114886.shadergraph.meta diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/105_MotionVectors.unity b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/105_MotionVectors.unity index bc74889e285..aeecf252c3c 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/105_MotionVectors.unity +++ b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/105_MotionVectors.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,13 +38,12 @@ RenderSettings: 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: 1 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -158,6 +157,11 @@ VFXRenderer: m_ReflectionProbeUsage: 0 m_RayTracingMode: 0 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_StaticBatchInfo: @@ -177,9 +181,11 @@ VFXRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 --- !u!2083052967 &427587297 VisualEffect: m_ObjectHideFlags: 0 @@ -234,13 +240,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 427587295} + serializedVersion: 2 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: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &427587299 MonoBehaviour: @@ -274,6 +280,4842 @@ MonoBehaviour: m_Bindings: - {fileID: 427587299} m_VisualEffect: {fileID: 427587297} +--- !u!1 &768272102 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 768272105} + - component: {fileID: 768272104} + - component: {fileID: 768272103} + m_Layer: 0 + m_Name: Repro_UUM114886 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!199 &768272103 +ParticleSystemRenderer: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768272102} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: -876546973899608171, guid: ef14292c3b647074ebc1ea4c2671f144, type: 3} + 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_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_RenderMode: 4 + m_MeshDistribution: 0 + m_SortMode: 0 + m_MinParticleSize: 0 + m_MaxParticleSize: 0.5 + m_CameraVelocityScale: 0 + m_VelocityScale: 0 + m_LengthScale: 2 + m_SortingFudge: 0 + m_NormalDirection: 1 + m_ShadowBias: 0 + m_RenderAlignment: 0 + m_Pivot: {x: 0, y: 0, z: 0} + m_Flip: {x: 0, y: 0, z: 0} + m_EnableGPUInstancing: 1 + m_ApplyActiveColorSpace: 1 + m_AllowRoll: 1 + m_FreeformStretching: 0 + m_RotateWithStretchDirection: 1 + m_UseCustomVertexStreams: 0 + m_VertexStreams: 00010304 + m_UseCustomTrailVertexStreams: 0 + m_TrailVertexStreams: 00010304 + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} + m_Mesh1: {fileID: 0} + m_Mesh2: {fileID: 0} + m_Mesh3: {fileID: 0} + m_MeshWeighting: 1 + m_MeshWeighting1: 1 + m_MeshWeighting2: 1 + m_MeshWeighting3: 1 +--- !u!198 &768272104 +ParticleSystem: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768272102} + serializedVersion: 8 + lengthInSec: 5 + simulationSpeed: 1 + stopAction: 0 + cullingMode: 0 + ringBufferMode: 0 + ringBufferLoopRange: {x: 0, y: 1} + emitterVelocityMode: 1 + looping: 1 + prewarm: 0 + playOnAwake: 1 + useUnscaledTime: 0 + autoRandomSeed: 1 + startDelay: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + moveWithTransform: 0 + moveWithCustomTransform: {fileID: 0} + scalingMode: 1 + randomSeed: 0 + InitialModule: + serializedVersion: 3 + enabled: 1 + startLifetime: + serializedVersion: 2 + minMaxState: 0 + scalar: 5 + minScalar: 5 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSpeed: + serializedVersion: 2 + minMaxState: 0 + scalar: 5 + minScalar: 5 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startColor: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + startSize: + serializedVersion: 2 + minMaxState: 0 + scalar: 5 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSizeY: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSizeZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotationX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotationY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotation: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + randomizeRotationDirection: 0 + gravitySource: 0 + maxNumParticles: 1000 + customEmitterVelocity: {x: 0, y: 0, z: 0} + size3D: 0 + rotation3D: 0 + gravityModifier: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + ShapeModule: + serializedVersion: 6 + enabled: 0 + type: 4 + angle: 25 + length: 5 + boxThickness: {x: 0, y: 0, z: 0} + radiusThickness: 1 + donutRadius: 0.2 + m_Position: {x: 0, y: 0, z: 0} + m_Rotation: {x: 0, y: 0, z: 0} + m_Scale: {x: 1, y: 1, z: 1} + placementMode: 0 + m_MeshMaterialIndex: 0 + m_MeshNormalOffset: 0 + m_MeshSpawn: + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Mesh: {fileID: 0} + m_MeshRenderer: {fileID: 0} + m_SkinnedMeshRenderer: {fileID: 0} + m_Sprite: {fileID: 0} + m_SpriteRenderer: {fileID: 0} + m_UseMeshMaterialIndex: 0 + m_UseMeshColors: 1 + alignToDirection: 0 + m_Texture: {fileID: 0} + m_TextureClipChannel: 3 + m_TextureClipThreshold: 0 + m_TextureUVChannel: 0 + m_TextureColorAffectsParticles: 1 + m_TextureAlphaAffectsParticles: 1 + m_TextureBilinearFiltering: 0 + randomDirectionAmount: 0 + sphericalDirectionAmount: 0 + randomPositionAmount: 0 + radius: + value: 1 + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + arc: + value: 360 + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + EmissionModule: + enabled: 1 + serializedVersion: 4 + rateOverTime: + serializedVersion: 2 + minMaxState: 0 + scalar: 5 + minScalar: 10 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + rateOverDistance: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_BurstCount: 0 + m_Bursts: [] + SizeModule: + enabled: 0 + curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + RotationModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.7853982 + minScalar: 0.7853982 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + ColorModule: + enabled: 0 + gradient: + serializedVersion: 2 + minMaxState: 1 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + UVModule: + serializedVersion: 2 + enabled: 0 + mode: 0 + timeMode: 0 + fps: 30 + frameOverTime: + serializedVersion: 2 + minMaxState: 1 + scalar: 0.9999 + minScalar: 0.9999 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startFrame: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + speedRange: {x: 0, y: 1} + tilesX: 1 + tilesY: 1 + animationType: 0 + rowIndex: 0 + cycles: 1 + uvChannelMask: -1 + rowMode: 1 + sprites: + - sprite: {fileID: 0} + flipU: 0 + flipV: 0 + VelocityModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + radial: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + speedModifier: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + inWorldSpace: 0 + InheritVelocityModule: + enabled: 0 + m_Mode: 0 + m_Curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + LifetimeByEmitterSpeedModule: + enabled: 0 + m_Curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: -0.8 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.2 + inSlope: -0.8 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Range: {x: 0, y: 1} + ForceModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + inWorldSpace: 0 + randomizePerFrame: 0 + ExternalForcesModule: + serializedVersion: 2 + enabled: 0 + multiplierCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + influenceFilter: 0 + influenceMask: + serializedVersion: 2 + m_Bits: 4294967295 + influenceList: [] + ClampVelocityModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + magnitude: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxis: 0 + inWorldSpace: 0 + multiplyDragByParticleSize: 1 + multiplyDragByParticleVelocity: 1 + dampen: 0 + drag: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + NoiseModule: + enabled: 0 + strength: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + strengthY: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + strengthZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + frequency: 0.5 + damping: 1 + octaves: 1 + octaveMultiplier: 0.5 + octaveScale: 2 + quality: 1 + scrollSpeed: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remap: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapY: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapZ: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapEnabled: 0 + positionAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + rotationAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + sizeAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + SizeBySpeedModule: + enabled: 0 + curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + range: {x: 0, y: 1} + separateAxes: 0 + RotationBySpeedModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.7853982 + minScalar: 0.7853982 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + range: {x: 0, y: 1} + ColorBySpeedModule: + enabled: 0 + gradient: + serializedVersion: 2 + minMaxState: 1 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + range: {x: 0, y: 1} + CollisionModule: + enabled: 0 + serializedVersion: 4 + type: 0 + collisionMode: 0 + colliderForce: 0 + multiplyColliderForceByParticleSize: 0 + multiplyColliderForceByParticleSpeed: 0 + multiplyColliderForceByCollisionAngle: 1 + m_Planes: [] + m_Dampen: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Bounce: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_EnergyLossOnCollision: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minKillSpeed: 0 + maxKillSpeed: 10000 + radiusScale: 1 + collidesWith: + serializedVersion: 2 + m_Bits: 4294967295 + maxCollisionShapes: 256 + quality: 0 + voxelSize: 0.5 + collisionMessages: 0 + collidesWithDynamic: 1 + interiorCollisions: 0 + TriggerModule: + enabled: 0 + serializedVersion: 2 + inside: 1 + outside: 0 + enter: 0 + exit: 0 + colliderQueryMode: 0 + radiusScale: 1 + primitives: [] + SubModule: + serializedVersion: 2 + enabled: 0 + subEmitters: + - serializedVersion: 3 + emitter: {fileID: 0} + type: 0 + properties: 0 + emitProbability: 1 + LightsModule: + enabled: 0 + ratio: 0 + light: {fileID: 0} + randomDistribution: 1 + color: 1 + range: 1 + intensity: 1 + rangeCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + intensityCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + maxLights: 20 + TrailModule: + enabled: 0 + mode: 0 + ratio: 1 + lifetime: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minVertexDistance: 0.2 + textureMode: 0 + textureScale: {x: 1, y: 1} + ribbonCount: 1 + shadowBias: 0.5 + worldSpace: 0 + dieWithParticles: 1 + sizeAffectsWidth: 1 + sizeAffectsLifetime: 0 + inheritParticleColor: 1 + generateLightingData: 0 + splitSubEmitterRibbons: 0 + attachRibbonsToTransform: 0 + colorOverLifetime: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + widthOverTrail: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorOverTrail: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + CustomDataModule: + enabled: 0 + mode0: 0 + vectorComponentCount0: 4 + color0: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + colorLabel0: Color + vector0_0: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_0: X + vector0_1: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_1: Y + vector0_2: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_2: Z + vector0_3: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_3: W + mode1: 0 + vectorComponentCount1: 4 + color1: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + colorLabel1: Color + vector1_0: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_0: X + vector1_1: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_1: Y + vector1_2: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_2: Z + vector1_3: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_3: W +--- !u!4 &768272105 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768272102} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: -5, z: 6} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} --- !u!1 &1130978035 GameObject: m_ObjectHideFlags: 0 @@ -359,13 +5201,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1130978035} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -30} 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 &1130978039 MonoBehaviour: @@ -397,19 +5239,20 @@ MonoBehaviour: m_Dithering: 0 m_ClearDepth: 1 m_AllowXRRendering: 1 + m_AllowHDROutput: 1 m_UseScreenCoordOverride: 0 m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} m_RequiresDepthTexture: 0 m_RequiresColorTexture: 0 - m_Version: 2 m_TaaSettings: - quality: 3 - frameInfluence: 0.1 - jitterScale: 0 - mipBias: 0 - varianceClampScale: 0.9 - contrastAdaptiveSharpening: 0 + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 0 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 --- !u!1 &1484518007 GameObject: m_ObjectHideFlags: 0 @@ -465,13 +5308,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1484518007} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: -2.883538, y: 3.7970424, z: 2.128255} 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 &1505558163 GameObject: @@ -509,6 +5352,11 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -530,9 +5378,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1505558166 MeshFilter: @@ -549,6 +5399,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1505558163} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: -7, y: 7, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -556,7 +5407,6 @@ Transform: m_Children: - {fileID: 1587677063} m_Father: {fileID: 0} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!95 &1505558168 Animator: @@ -605,13 +5455,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1587677062} + serializedVersion: 2 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: 1505558167} - m_RootOrder: -1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!73398921 &1587677064 VFXRenderer: @@ -631,6 +5481,11 @@ VFXRenderer: m_ReflectionProbeUsage: 0 m_RayTracingMode: 0 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_StaticBatchInfo: @@ -650,9 +5505,11 @@ VFXRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 --- !u!2083052967 &1587677065 VisualEffect: m_ObjectHideFlags: 0 @@ -718,7 +5575,7 @@ VFXRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1940771137} m_Enabled: 1 - m_CastShadows: 0 + m_CastShadows: 1 m_ReceiveShadows: 0 m_DynamicOccludee: 1 m_StaticShadowCaster: 0 @@ -727,6 +5584,11 @@ VFXRenderer: m_ReflectionProbeUsage: 0 m_RayTracingMode: 0 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_StaticBatchInfo: @@ -746,9 +5608,11 @@ VFXRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 --- !u!2083052967 &1940771139 VisualEffect: m_ObjectHideFlags: 0 @@ -794,11 +5658,21 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1940771137} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 4, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1484518009} + - {fileID: 1130978038} + - {fileID: 1940771140} + - {fileID: 1505558167} + - {fileID: 427587298} + - {fileID: 768272105} diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Repro_UUM114886.shadergraph b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Repro_UUM114886.shadergraph new file mode 100644 index 00000000000..1a53ba5a0fd --- /dev/null +++ b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Repro_UUM114886.shadergraph @@ -0,0 +1,422 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "ca2c2a8f91364cae81215ac552d57195", + "m_Properties": [], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "9bf9fbff48274f6dbd0189354f111e5a" + } + ], + "m_Nodes": [ + { + "m_Id": "443f107819904dbb8194115b9283e9f1" + }, + { + "m_Id": "83acc54a0dae4bbea1110d4a90a5cda7" + }, + { + "m_Id": "0f14fec5b71a4785bac7716ed2907344" + }, + { + "m_Id": "fc3c30ec678a4b9aab858ac4da234c0d" + }, + { + "m_Id": "55b2acfebc034e5da936ae2c76efcd6a" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "443f107819904dbb8194115b9283e9f1" + }, + { + "m_Id": "83acc54a0dae4bbea1110d4a90a5cda7" + }, + { + "m_Id": "0f14fec5b71a4785bac7716ed2907344" + }, + { + "m_Id": "55b2acfebc034e5da936ae2c76efcd6a" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": -0.0000057220458984375, + "y": 287.0 + }, + "m_Blocks": [ + { + "m_Id": "fc3c30ec678a4b9aab858ac4da234c0d" + } + ] + }, + "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_SubDatas": [], + "m_ActiveTargets": [ + { + "m_Id": "a139edd419884079b04372a7516a9521" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "0f14fec5b71a4785bac7716ed2907344", + "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": "561abd3432d841b38296bf917f2e21ab" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalUnlitSubTarget", + "m_ObjectId": "2b749759a6e24d0ebd37e2569e32931b", + "m_KeepLightingVariants": false, + "m_DefaultDecalBlending": true, + "m_DefaultSSAO": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "357079d641734dab8a7e7e0ef00842c7", + "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.BlockNode", + "m_ObjectId": "443f107819904dbb8194115b9283e9f1", + "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": "99685f4c4f904f8e8e72f813ded67106" + } + ], + "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.ShaderGraph.BlockNode", + "m_ObjectId": "55b2acfebc034e5da936ae2c76efcd6a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.MotionVector", + "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": "f722e36dcc2d47c08d45db9046fcc598" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.MotionVector" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "561abd3432d841b38296bf917f2e21ab", + "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": "83acc54a0dae4bbea1110d4a90a5cda7", + "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": "357079d641734dab8a7e7e0ef00842c7" + } + ], + "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.PositionMaterialSlot", + "m_ObjectId": "99685f4c4f904f8e8e72f813ded67106", + "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.CategoryData", + "m_ObjectId": "9bf9fbff48274f6dbd0189354f111e5a", + "m_Name": "", + "m_ChildObjectList": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "a139edd419884079b04372a7516a9521", + "m_Datas": [], + "m_ActiveSubTarget": { + "m_Id": "2b749759a6e24d0ebd37e2569e32931b" + }, + "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_DisableTint": false, + "m_Sort3DAs2DCompatible": false, + "m_AdditionalMotionVectorMode": 2, + "m_AlembicMotionVectors": false, + "m_SupportsLODCrossFade": false, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "eaf6823cbaae4a1c95a81365912b3412", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.9411764740943909, + "y": 0.501960813999176, + "z": 0.501960813999176 + }, + "m_DefaultValue": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "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.Vector3MaterialSlot", + "m_ObjectId": "f722e36dcc2d47c08d45db9046fcc598", + "m_Id": 0, + "m_DisplayName": "Motion Vector", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "MotionVector", + "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_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "fc3c30ec678a4b9aab858ac4da234c0d", + "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": "eaf6823cbaae4a1c95a81365912b3412" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Repro_UUM114886.shadergraph.meta b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Repro_UUM114886.shadergraph.meta new file mode 100644 index 00000000000..39ce8b92ecf --- /dev/null +++ b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Repro_UUM114886.shadergraph.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ef14292c3b647074ebc1ea4c2671f144 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} + useAsTemplate: 0 + exposeTemplateAsShader: 0 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} From 3f1311d5820bd7780bfc84af2a7aab94ea9d5163 Mon Sep 17 00:00:00 2001 From: Miguel Sotolongo Date: Tue, 7 Oct 2025 00:29:46 +0000 Subject: [PATCH 047/115] feat(BuildProfile): Update templates to hide classicplatforms by default. --- .../ProjectSettings/EditorSettings.asset | 1 + 1 file changed, 1 insertion(+) diff --git a/Templates/com.unity.template.hdrp-blank/ProjectSettings/EditorSettings.asset b/Templates/com.unity.template.hdrp-blank/ProjectSettings/EditorSettings.asset index 1e44a0a1160..3d93ee9c75d 100644 --- a/Templates/com.unity.template.hdrp-blank/ProjectSettings/EditorSettings.asset +++ b/Templates/com.unity.template.hdrp-blank/ProjectSettings/EditorSettings.asset @@ -28,3 +28,4 @@ EditorSettings: m_ShowLightmapResolutionOverlay: 1 m_UseLegacyProbeSampleCount: 0 m_SerializeInlineMappingsOnOneLine: 1 + m_HideBuildProfileClassicPlatforms: 1 From e4abb301e3a740b604a7a83e200a94013c9c2d40 Mon Sep 17 00:00:00 2001 From: Masayoshi Miyamoto Date: Tue, 7 Oct 2025 00:29:53 +0000 Subject: [PATCH 048/115] [HDRP] Fix graphics issue with PrecomputedAtmosphericAttenuation in ShaderConfig --- .../Runtime/Sky/SkyManager.cs | 5 +++++ .../Runtime/Sky/SkyRenderer.cs | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs index 776c6ceca62..aba1505a238 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs @@ -82,6 +82,8 @@ public class BuiltinSkyParameters public static RenderTargetIdentifier nullRT = -1; ///

Index of the current cubemap face to render (Unknown for texture2D). public CubemapFace cubemapFace = CubemapFace.Unknown; + /// Fallback for structured buffer of CelestialBodyData. + internal BufferHandle emptyCelestialBodyBuffer; /// /// Copy content of this BuiltinSkyParameters to another instance. @@ -381,6 +383,9 @@ void SetGlobalSkyData(RenderGraph renderGraph, SkyUpdateContext skyContext, Buil passData.builtinParameters.volumetricClouds = skyContext.volumetricClouds; passData.skyRenderer = skyContext.skyRenderer; + passData.builtinParameters.emptyCelestialBodyBuffer = builder.CreateTransientBuffer( + new BufferDesc(1, System.Runtime.InteropServices.Marshal.SizeOf(typeof(CelestialBodyData)))); + builder.SetRenderFunc( (SetGlobalSkyDataPassData data, UnsafeGraphContext ctx) => { diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs index dbaf3228f33..71f7c0b9e52 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs @@ -88,6 +88,17 @@ protected static float GetSkyIntensity(SkySettings skySettings, DebugDisplaySett /// Sky system builtin parameters. public virtual void SetGlobalSkyData(CommandBuffer cmd, BuiltinSkyParameters builtinParams) { + // bind empty resources for non-PBR sky. + if (ShaderConfig.s_PrecomputedAtmosphericAttenuation == 0) + { + cmd.SetGlobalTexture(HDShaderIDs._AirSingleScatteringTexture, (RenderTargetIdentifier)CoreUtils.blackVolumeTexture); + cmd.SetGlobalTexture(HDShaderIDs._AerosolSingleScatteringTexture, (RenderTargetIdentifier)CoreUtils.blackVolumeTexture); + cmd.SetGlobalTexture(HDShaderIDs._MultipleScatteringTexture, (RenderTargetIdentifier)CoreUtils.blackVolumeTexture); + } + else + cmd.SetGlobalTexture(HDShaderIDs._AtmosphericScatteringLUT, (RenderTargetIdentifier)CoreUtils.blackVolumeTexture); + + cmd.SetGlobalBuffer(HDShaderIDs._CelestialBodyDatas, builtinParams.emptyCelestialBodyBuffer); } internal bool DoUpdate(BuiltinSkyParameters parameters) From 3d0c84d6201f323a4d64105aa05b3014711596c3 Mon Sep 17 00:00:00 2001 From: Aljosha Demeulemeester Date: Tue, 7 Oct 2025 00:29:55 +0000 Subject: [PATCH 049/115] Fix unneeded Final PP pass for STP and Upscaler framework and cleanup in AfterRendering for PP modularisation --- .../2D/Rendergraph/Renderer2DRendergraph.cs | 5 +- .../Runtime/PostProcess.cs | 36 +++++------ .../Runtime/UniversalRendererRenderGraph.cs | 60 ++++++------------- 3 files changed, 41 insertions(+), 60 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs index ed7c662c959..55744c15b1b 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs @@ -883,13 +883,14 @@ private void OnAfterRendering(RenderGraph renderGraph) target = renderGraph.ImportTexture(nextRenderGraphCameraColorHandle, importColorParams); } - m_PostProcess.RenderPostProcessing( + //We always pass a valid target because it's alway persistent. However, we still set target to the output to be correct when above code would change. So output handle is equal to input target now. See OnAfterRendering in UnversalRenderer for more context. + target = m_PostProcess.RenderPostProcessing( renderGraph, frameData, commonResourceData.cameraColor, commonResourceData.internalColorLut, commonResourceData.overlayUITexture, - target, + in target, applyFinalPostProcessing, doSRGBEncoding); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs index 2af08a64adc..f505123045f 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs @@ -34,10 +34,6 @@ internal sealed class PostProcess : IDisposable int m_DitheringTextureIndex; // 8-bit dithering - // If there's a final post process pass after this pass. - // If yes, Film Grain and Dithering are setup in the final pass, otherwise they are setup in this pass. - bool m_HasFinalPass; - /// /// Creates a new PostProcessPass instance. /// @@ -154,8 +150,12 @@ static bool UpdateGlobalDebugHandlerPass(RenderGraph renderGraph, UniversalCamer return resolveToDebugScreen; } + const string _CameraColorUpscaled = "_CameraColorUpscaled"; + const string _CameraColorAfterPostProcessingName = "_CameraColorAfterPostProcessing"; - public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frameData, in TextureHandle activeCameraColorTexture, in TextureHandle internalColorLutTexture, in TextureHandle overlayUITexture, in TextureHandle postProcessingTarget, bool hasFinalPass, bool enableColorEncodingIfNeeded) + // If postProcessingTarget is not valid then this function will create an RG managed texture. Only pass postProcessingTarget if the output needs to be written to a certain persistent texture. + // If hasFinalPass == true, Film Grain and Dithering are setup in the final pass, otherwise they are setup in this pass. + public TextureHandle RenderPostProcessing(RenderGraph renderGraph, ContextContainer frameData, in TextureHandle activeCameraColorTexture, in TextureHandle internalColorLutTexture, in TextureHandle overlayUITexture, in TextureHandle persistentTarget, bool hasFinalPass, bool enableColorEncodingIfNeeded) { UniversalResourceData resourceData = frameData.Get(); UniversalCameraData cameraData = frameData.Get(); @@ -175,8 +175,6 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame var tonemapping = stack.GetComponent(); var filmGrain = stack.GetComponent(); - m_HasFinalPass = hasFinalPass; // TODO: should this be external configuration property rather than a param? - bool useFastSRGBLinearConversion = postProcessingData.useFastSRGBLinearConversion; bool supportDataDrivenLensFlare = postProcessingData.supportDataDrivenLensFlare; bool supportScreenSpaceLensFlare = postProcessingData.supportScreenSpaceLensFlare; @@ -224,7 +222,7 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame TemporalAA.ValidateAndWarn(cameraData, isSTPRequested); // NOTE: Debug handling injects a global state render pass. - bool resolveToDebugScreen = UpdateGlobalDebugHandlerPass(renderGraph, cameraData, !m_HasFinalPass); + bool resolveToDebugScreen = UpdateGlobalDebugHandlerPass(renderGraph, cameraData, !hasFinalPass); TextureHandle currentSource = activeCameraColorTexture; @@ -396,7 +394,7 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame m_UberPass.vignette = vignette; m_UberPass.filmGrain = filmGrain; - m_UberPass.isFinalPass = !m_HasFinalPass; + m_UberPass.isFinalPass = !hasFinalPass; m_UberPass.requireSRGBConversionBlit = RequireSRGBConversionBlitToBackBuffer(cameraData, enableColorEncodingIfNeeded); m_UberPass.useFastSRGBLinearConversion = useFastSRGBLinearConversion; m_UberPass.resolveToDebugScreen = resolveToDebugScreen; @@ -407,7 +405,7 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame { // Color space conversion is already applied through color grading, do encoding if uber post is the last pass // Otherwise encoding will happen in the final post process pass or the final blit pass - m_UberPass.hdrOperations = !m_HasFinalPass && enableColorEncodingIfNeeded ? HDROutputUtils.Operation.ColorEncoding : HDROutputUtils.Operation.None; + m_UberPass.hdrOperations = !hasFinalPass && enableColorEncodingIfNeeded ? HDROutputUtils.Operation.ColorEncoding : HDROutputUtils.Operation.None; if(enableColorEncodingIfNeeded && overlayUITexture.IsValid()) activeOverlayUITexture = overlayUITexture; @@ -421,9 +419,17 @@ public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frame m_UberPass.overlayUITexture = activeOverlayUITexture; m_UberPass.ditherTexture = cameraData.isDitheringEnabled ? GetNextDitherTexture() : null; - // Output - m_UberPass.destinationTexture = postProcessingTarget; + if (persistentTarget.IsValid()) + { + m_UberPass.destinationTexture = persistentTarget; + }else + { + m_UberPass.destinationTexture = renderGraph.CreateTexture(m_UberPass.sourceTexture, _CameraColorAfterPostProcessingName); + } + m_UberPass.RecordRenderGraph(renderGraph, frameData); + + return m_UberPass.destinationTexture; } } @@ -436,12 +442,8 @@ public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer var tonemapping = stack.GetComponent(); var filmGrain = stack.GetComponent(); - // TODO RENDERGRAPH: when we remove the old path we should review the naming of these variables... - // m_HasFinalPass is used to let FX passes know when they are not being called by the actual final pass, so they can skip any "final work" - m_HasFinalPass = false; - // NOTE: Debug handling injects a global state render pass. - bool resolveToDebugScreen = UpdateGlobalDebugHandlerPass(renderGraph, cameraData, !m_HasFinalPass); + bool resolveToDebugScreen = UpdateGlobalDebugHandlerPass(renderGraph, cameraData, true); var srcDesc = renderGraph.GetTextureDesc(source); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index 50625d64eb8..3c2224ba1d6 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -350,8 +350,6 @@ private void UpdateCameraHistory(UniversalCameraData cameraData) const string _CameraTargetAttachmentBName = "_CameraTargetAttachmentB"; const string _SingleCameraTargetAttachmentName = "_CameraTargetAttachment"; const string _CameraDepthAttachmentName = "_CameraDepthAttachment"; - const string _CameraColorUpscaled = "_CameraColorUpscaled"; - const string _CameraColorAfterPostProcessingName = "_CameraColorAfterPostProcessing"; void CreateRenderGraphCameraRenderTargets(RenderGraph renderGraph, bool isCameraTargetOffscreenDepth, bool requireIntermediateAttachments, bool depthTextureIsDepthFormat) { @@ -1332,10 +1330,10 @@ private void OnMainRendering(RenderGraph renderGraph, ScriptableRenderContext co private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) { - UniversalResourceData resourceData = frameData.Get(); - UniversalRenderingData renderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalPostProcessingData postProcessingData = frameData.Get(); + var resourceData = frameData.Get(); + var renderingData = frameData.Get(); + var cameraData = frameData.Get(); + var postProcessingData = frameData.Get(); // if it's the last camera in the stack, setup the rendering debugger if (cameraData.resolveFinalTarget) @@ -1360,10 +1358,11 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) // 3. TAA sharpening using standalone RCAS pass is required. (When upscaling is not enabled). bool applyFinalPostProcessing = anyPostProcessing && cameraData.resolveFinalTarget && ((cameraData.antialiasing == AntialiasingMode.FastApproximateAntialiasing) || - ((cameraData.imageScalingMode == ImageScalingMode.Upscaling) && (cameraData.upscalingFilter != ImageUpscalingFilter.Linear)) || + ((cameraData.imageScalingMode == ImageScalingMode.Upscaling) && (cameraData.upscalingFilter == ImageUpscalingFilter.FSR)) || (cameraData.IsTemporalAAEnabled() && cameraData.taaSettings.contrastAdaptiveSharpening > 0.0f)); bool hasCaptureActions = cameraData.captureActions != null && cameraData.resolveFinalTarget; + //We'll skip RecordCustomRenderGraphPasses(RenderPassEvent.AfterRenderingPostProcessing) if this is false so be careful when changing the check. bool hasPassesAfterPostProcessing = activeRenderPassQueue.Find(x => x.renderPassEvent >= RenderPassEvent.AfterRenderingPostProcessing && x.renderPassEvent < RenderPassEvent.AfterRendering) != null; bool xrDepthTargetResolved = resourceData.activeDepthID == UniversalResourceData.ActiveID.BackBuffer; @@ -1396,51 +1395,30 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) if (applyPostProcessing) { bool isTargetBackbuffer = cameraData.resolveFinalTarget && !applyFinalPostProcessing && !hasPassesAfterPostProcessing && !hasCaptureActions; + var isSingleCamera = cameraData.resolveFinalTarget && cameraData.renderType == CameraRenderType.Base; - TextureHandle target; + //We will pass a nullHandle to the post processing if there is no persistent texture that needs to be the output. Then, post processing can create an RG managed texture and return it. + TextureHandle target = TextureHandle.nullHandle; if (isTargetBackbuffer) { target = resourceData.backBufferColor; } - else + else if (!isSingleCamera) { + //When part of a camera stack, we need to ensure the date ends up in the persistent A/B camera attachments to propagate the output to the cameras of the stack. ImportResourceParams importColorParams = new ImportResourceParams(); importColorParams.clearOnFirstUse = true; importColorParams.clearColor = Color.black; importColorParams.discardOnLastUse = cameraData.resolveFinalTarget; // check if last camera in the stack - if (cameraData.IsSTPEnabled() || (cameraData.IsTemporalAAEnabled() && -#if ENABLE_UPSCALER_FRAMEWORK - cameraData.upscalingFilter == ImageUpscalingFilter.IUpscaler -#else - false -#endif - )) - { - // STP is disabled when using camera stacking. In any case, we don't use persistent textures here so we need to make sure there is no next camera in the stack (should always be true). - Debug.Assert(cameraData.resolveFinalTarget); - - var desc = resourceData.cameraColor.GetDescriptor(renderGraph); - PostProcessUtils.MakeCompatible(ref desc); - - desc.width = cameraData.pixelWidth; - desc.height = cameraData.pixelHeight; - desc.name = _CameraColorUpscaled; - - target = renderGraph.CreateTexture(desc); - } - else - { - var isSingleCamera = cameraData.resolveFinalTarget && cameraData.renderType == CameraRenderType.Base; - - target = (isSingleCamera) - ? renderGraph.CreateTexture(resourceData.cameraColor, _CameraColorAfterPostProcessingName) - : renderGraph.ImportTexture(nextRenderGraphCameraColorHandle, importColorParams); - } + target = renderGraph.ImportTexture(nextRenderGraphCameraColorHandle, importColorParams); } bool doSRGBEncoding = isTargetBackbuffer && needsColorEncoding; - m_PostProcess.RenderPostProcessing(renderGraph, frameData, resourceData.cameraColor, resourceData.internalColorLut, resourceData.overlayUITexture, in target, applyFinalPostProcessing, doSRGBEncoding); + + //If the target is the nullHandle, then the output/target is not a persistent texture, and postprocess can create an RG managed texture for the target. This is done inside the RenderPostProcessing + //such that all the upscaled target creation is isolated in the postprocessing and the calling code here does not need to be aware. + target = m_PostProcess.RenderPostProcessing(renderGraph, frameData, resourceData.cameraColor, resourceData.internalColorLut, resourceData.overlayUITexture, in target, applyFinalPostProcessing, doSRGBEncoding); // Handle any after-post rendering debugger overlays if (cameraData.resolveFinalTarget) @@ -1456,7 +1434,9 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) } } - RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRenderingPostProcessing); + //We already checked the passes so we can skip here if there are none as a small optimization + if(hasPassesAfterPostProcessing) + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRenderingPostProcessing); if (hasCaptureActions) { @@ -1466,7 +1446,6 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) if (applyFinalPostProcessing) { m_PostProcess.RenderFinalPostProcessing(renderGraph, frameData, resourceData.cameraColor, resourceData.overlayUITexture, resourceData.backBufferColor, needsColorEncoding); - resourceData.SwitchActiveTexturesToBackbuffer(); } @@ -1480,7 +1459,6 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) resourceData.SwitchActiveTexturesToBackbuffer(); } - // TODO RENDERGRAPH: we need to discuss and decide if RenderPassEvent.AfterRendering injected passes should only be called after the last camera in the stack RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRendering); // We can explicitely render the overlay UI from URP when HDR output is not enabled. From 9321e15ad007c6960d0fc088d09bc1c81b9c9014 Mon Sep 17 00:00:00 2001 From: Angela Dematte Date: Tue, 7 Oct 2025 00:29:56 +0000 Subject: [PATCH 050/115] Disable various unstable tests --- .../ReadonlyMaterialConverter/ReadonlyMaterialConverterTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverterTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverterTests.cs index f711d652080..c0bcdc8cc25 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverterTests.cs +++ b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverterTests.cs @@ -1,6 +1,7 @@ using NUnit.Framework; using UnityEditor.Rendering.Converter; using UnityEngine; +using UnityEngine.TestTools; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; @@ -71,6 +72,7 @@ private void CheckMaterials(Material expected, Material actual) [Test] [Timeout(5 * 60 * 1000)] + [UnityPlatform(exclude = new[] { RuntimePlatform.WindowsEditor })] // Unstable: https://jira.unity3d.com/browse/UUM-121144 public void ReassignGameObjectMaterials_Succeeds_WhenMaterialCanBeSet() { var materialConverter = new ReadonlyMaterialConverter(); From e28d5f61b78e5dea5f35f95576ca2f5b277032e8 Mon Sep 17 00:00:00 2001 From: Kenny Tan Date: Tue, 7 Oct 2025 11:41:11 +0000 Subject: [PATCH 051/115] [D2D-7598][6000.4][URP 2D] Injection Point 2D for 2D Renderer --- .../ScriptableRendererFeature2DEditor.cs | 36 + .../ScriptableRendererFeature2DEditor.cs.meta | 2 + .../ScriptableRendererFeatureProvider.cs | 2 +- .../Runtime/2D/FrameData.meta | 8 + .../2D/FrameData/Universal2DRenderingData.cs | 18 + .../Universal2DRenderingData.cs.meta | 2 + .../Runtime/2D/Passes/Render2DLightingPass.cs | 4 +- .../Runtime/2D/Passes/Utility/LayerDebug.cs | 50 + .../2D/Passes/Utility/LayerDebug.cs.meta | 2 + .../Runtime/2D/Passes/Utility/LayerUtility.cs | 52 +- .../Runtime/2D/Renderer2D.cs | 2 +- .../ScriptableRenderPass2D.cs | 170 +- .../ScriptableRendererFeature2D.cs | 23 + .../ScriptableRendererFeature2D.cs.meta | 2 + .../Runtime/2D/Rendergraph/DrawLight2DPass.cs | 31 +- .../2D/Rendergraph/DrawNormal2DPass.cs | 11 +- .../2D/Rendergraph/DrawRenderer2DPass.cs | 20 +- .../2D/Rendergraph/DrawShadow2DPass.cs | 10 +- .../2D/Rendergraph/GlobalPropertiesPass.cs | 4 +- .../2D/Rendergraph/Renderer2DRendergraph.cs | 163 +- .../CommonAssets/UniversalRPAsset.asset | 13 +- .../Assets/Scenes/030_RenderPass2D.meta | 8 + .../Assets/Scenes/030_RenderPass2D.unity | 1538 +++++++++++++++++ .../Assets/Scenes/030_RenderPass2D.unity.meta | 7 + .../030_InjectionRenderPass2D.asset | 77 + .../030_InjectionRenderPass2D.asset.meta | 8 + .../CustomRendererFeature2D.cs | 104 ++ .../CustomRendererFeature2D.cs.meta | 2 + 28 files changed, 2227 insertions(+), 142 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/ScriptableRendererFeature2DEditor.cs create mode 100644 Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/ScriptableRendererFeature2DEditor.cs.meta create mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData.meta create mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData/Universal2DRenderingData.cs create mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData/Universal2DRenderingData.cs.meta create mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerDebug.cs create mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerDebug.cs.meta create mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRendererFeature2D.cs create mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRendererFeature2D.cs.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.unity create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.unity.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/030_InjectionRenderPass2D.asset create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/030_InjectionRenderPass2D.asset.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/CustomRendererFeature2D.cs create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/CustomRendererFeature2D.cs.meta diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/ScriptableRendererFeature2DEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/ScriptableRendererFeature2DEditor.cs new file mode 100644 index 00000000000..971a9618480 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/ScriptableRendererFeature2DEditor.cs @@ -0,0 +1,36 @@ +using UnityEngine; +using UnityEngine.Rendering.Universal; + +namespace UnityEditor.Rendering.Universal +{ + /// + /// Custom editor for the ScriptableRendererFeature2D class, allowing for the configuration of renderer features in the Unity Editor. + /// + [CustomEditor(typeof(ScriptableRendererFeature2D), true)] + public class ScriptableRendererFeature2DEditor : Editor + { + private SerializedProperty m_InjectionPointProperty; + private SerializedProperty m_SortingLayerProperty; + + private static readonly GUIContent k_InjectionPointGuiContent = new GUIContent("Injection Point", "Specifies where in the frame this pass will be injected."); + + private void OnEnable() + { + m_InjectionPointProperty = serializedObject.FindProperty("injectionPoint2D"); + m_SortingLayerProperty = serializedObject.FindProperty("sortingLayerID"); + } + + /// + /// Implementation for a ScriptableRendererFeature2D inspector. + /// + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + EditorGUILayout.PropertyField(m_InjectionPointProperty, k_InjectionPointGuiContent); + + if (ScriptableRenderPass2D.IsSortingLayerEvent((RenderPassEvent2D)m_InjectionPointProperty.intValue)) + SortingLayerEditorUtility.RenderSortingLayerFields(m_SortingLayerProperty); + } + } +} diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/ScriptableRendererFeature2DEditor.cs.meta b/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/ScriptableRendererFeature2DEditor.cs.meta new file mode 100644 index 00000000000..8af644fcdd4 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Overrides/ScriptableRendererFeature2DEditor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0f8c4e2f372f94e4dbbdc7ce528a8ba4 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererFeatureProvider.cs b/Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererFeatureProvider.cs index acd5ffbafb5..67c4b7dca59 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererFeatureProvider.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererFeatureProvider.cs @@ -46,7 +46,7 @@ public void CreateComponentTree(List tree) { // Check to see if the current renderer feature can be used with the current renderer. If the attribute isn't found then its compatible with everything. - if (!RendererFeatureSupported(type)) + if (!RendererFeatureSupported(type) || type.IsAbstract) continue; if (data.DuplicateFeatureCheck(type)) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData.meta b/Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData.meta new file mode 100644 index 00000000000..75e129ab077 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7bd441e8ae54da04b805cef8d06b4536 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData/Universal2DRenderingData.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData/Universal2DRenderingData.cs new file mode 100644 index 00000000000..750c516d466 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData/Universal2DRenderingData.cs @@ -0,0 +1,18 @@ +namespace UnityEngine.Rendering.Universal +{ + internal class Universal2DRenderingData : ContextItem + { + internal Renderer2DData renderingData; + + internal LayerBatch[] layerBatches; + + internal int batchCount; + + public override void Reset() + { + renderingData = null; + layerBatches = null; + batchCount = 0; + } + } +} diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData/Universal2DRenderingData.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData/Universal2DRenderingData.cs.meta new file mode 100644 index 00000000000..440f030a67a --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/FrameData/Universal2DRenderingData.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cfd8db254ecd63d45bc135530bd0c325 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs index 2077624f5a9..6fed7eca966 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs @@ -193,7 +193,7 @@ private int DrawLayerBatches( if (layerBatch.useNormals) { - LayerUtility.GetFilterSettings(m_Renderer2DData, ref layerBatch, out var filterSettings); + LayerUtility.GetFilterSettings(m_Renderer2DData, layerBatch, out var filterSettings); var depthTarget = m_NeedsDepth ? depthAttachmentHandle : null; this.RenderNormals(context, renderingData, normalsDrawSettings, filterSettings, depthTarget, normalsFirstClear); normalsFirstClear = false; @@ -273,7 +273,7 @@ private int DrawLayerBatches( copyStoreAction = RenderBufferStoreAction.Store; - LayerUtility.GetFilterSettings(m_Renderer2DData, ref layerBatch, out var filterSettings); + LayerUtility.GetFilterSettings(m_Renderer2DData, layerBatch, out var filterSettings); Render(context, cmd, ref renderingData, ref filterSettings, drawSettings); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerDebug.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerDebug.cs new file mode 100644 index 00000000000..426dd54a922 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerDebug.cs @@ -0,0 +1,50 @@ +#if UNITY_EDITOR +using UnityEngine.Rendering.RenderGraphModule; +#endif + +namespace UnityEngine.Rendering.Universal +{ + static class LayerDebug + { +#if UNITY_EDITOR + static internal bool enabled => FrameDebugger.enabled || RenderGraph.isRenderGraphViewerActive; + + static internal string GetDebugLayerNames(LayerBatch layerBatch) + { + var debugNames = string.Empty; + var sortingLayers = Light2DManager.GetCachedSortingLayer(); + + foreach (var layer in sortingLayers) + { + if (layerBatch.IsValueWithinLayerRange(layer.value)) + { + if (debugNames == string.Empty) + debugNames = layer.name; + else + debugNames += " | " + layer.name; + } + } + + return debugNames; + } +#endif + + static internal void FormatPassName(LayerBatch layerBatch, ref string passName) + { +#if UNITY_EDITOR + if (enabled) + passName += " - " + GetDebugLayerNames(layerBatch); +#endif + } + + static internal ProfilingSampler GetProfilingSampler(string passName, ProfilingSampler sampler) + { +#if UNITY_EDITOR + if (enabled) + return new ProfilingSampler(passName); +#endif + return sampler; + } + } +} + diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerDebug.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerDebug.cs.meta new file mode 100644 index 00000000000..4dae62e477d --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerDebug.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a2edf664af334144a8ad0aed989753d3 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerUtility.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerUtility.cs index 31ba056413e..490bdd11bc9 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerUtility.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerUtility.cs @@ -3,7 +3,7 @@ namespace UnityEngine.Rendering.Universal { - internal struct LayerBatch + internal class LayerBatch { #if UNITY_EDITOR public int startIndex; @@ -15,8 +15,8 @@ internal struct LayerBatch public LightStats lightStats; public bool useNormals; #if URP_COMPATIBILITY_MODE - private unsafe fixed int renderTargetIds[4]; - private unsafe fixed bool renderTargetUsed[4]; + private int[] renderTargetIds = new int[4]; + private bool[] renderTargetUsed = new bool[4]; #endif public List lights; @@ -30,11 +30,8 @@ public void InitRTIds(int index) #if URP_COMPATIBILITY_MODE for (var i = 0; i < 4; i++) { - unsafe - { - renderTargetUsed[i] = false; - renderTargetIds[i] = Shader.PropertyToID($"_LightTexture_{index}_{i}"); - } + renderTargetUsed[i] = false; + renderTargetIds[i] = Shader.PropertyToID($"_LightTexture_{index}_{i}"); } #endif @@ -43,32 +40,32 @@ public void InitRTIds(int index) shadowCasters = new List(); } + // This range check uses SortingLayer.value. + internal bool IsValueWithinLayerRange(int value) + { + return value >= layerRange.lowerBound && value <= layerRange.upperBound; + } + #if URP_COMPATIBILITY_MODE public RenderTargetIdentifier GetRTId(CommandBuffer cmd, RenderTextureDescriptor desc, int index) { - unsafe + if (!renderTargetUsed[index]) { - if (!renderTargetUsed[index]) - { - cmd.GetTemporaryRT(renderTargetIds[index], desc, FilterMode.Bilinear); - renderTargetUsed[index] = true; - } - return new RenderTargetIdentifier(renderTargetIds[index]); + cmd.GetTemporaryRT(renderTargetIds[index], desc, FilterMode.Bilinear); + renderTargetUsed[index] = true; } + return new RenderTargetIdentifier(renderTargetIds[index]); } public void ReleaseRT(CommandBuffer cmd) { for (var i = 0; i < 4; i++) { - unsafe - { - if (!renderTargetUsed[i]) - continue; + if (!renderTargetUsed[i]) + continue; - cmd.ReleaseTemporaryRT(renderTargetIds[i]); - renderTargetUsed[i] = false; - } + cmd.ReleaseTemporaryRT(renderTargetIds[i]); + renderTargetUsed[i] = false; } } #endif @@ -157,12 +154,13 @@ private static void InitializeBatchInfos(SortingLayer[] cachedSortingLayers) needInit = true; } #endif + if (needInit) { for (var i = 0; i < s_LayerBatches.Length; i++) { - ref var layerBatch = ref s_LayerBatches[i]; - layerBatch.InitRTIds(i); + s_LayerBatches[i] = new LayerBatch(); + s_LayerBatches[i].InitRTIds(i); } } } @@ -177,7 +175,7 @@ public static LayerBatch[] CalculateBatches(Renderer2DData rendererData, out int for (var i = 0; i < cachedSortingLayers.Length;) { var layerToRender = cachedSortingLayers[i].id; - ref var layerBatch = ref s_LayerBatches[batchCount++]; + var layerBatch = s_LayerBatches[batchCount++]; var lightStats = rendererData.lightCullResult.GetLightStatsByLayer(layerToRender, ref layerBatch); // Find the highest layer that share the same set of lights and shadows as this layer. @@ -211,7 +209,7 @@ public static LayerBatch[] CalculateBatches(Renderer2DData rendererData, out int // Account for Sprite Mask and normal map usage as there might be masks on a different layer that need to mask out the normals for (var i = 0; i < batchCount; ++i) { - ref var layerBatch = ref s_LayerBatches[i]; + var layerBatch = s_LayerBatches[i]; var hasSpriteMask = SpriteMaskUtility.HasSpriteMaskInLayerRange(layerBatch.layerRange); layerBatch.useNormals = layerBatch.lightStats.useNormalMap || (anyNormals && hasSpriteMask); } @@ -221,7 +219,7 @@ public static LayerBatch[] CalculateBatches(Renderer2DData rendererData, out int return s_LayerBatches; } - public static void GetFilterSettings(Renderer2DData rendererData, ref LayerBatch layerBatch, out FilteringSettings filterSettings) + public static void GetFilterSettings(Renderer2DData rendererData, LayerBatch layerBatch, out FilteringSettings filterSettings) { filterSettings = FilteringSettings.defaultValue; filterSettings.renderQueueRange = RenderQueueRange.all; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs index a632fc6b378..8ff4b717b55 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs @@ -235,7 +235,7 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re } } - RenderPassInputSummary renderPassInputs = GetRenderPassInputs(cameraData); + RenderPassInputSummary renderPassInputs = GetRenderPassInputs(); RTHandle colorTargetHandle; RTHandle depthTargetHandle; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRenderPass2D.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRenderPass2D.cs index 81af325f83a..0d3a6a12c02 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRenderPass2D.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRenderPass2D.cs @@ -1,53 +1,161 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; + +using System; namespace UnityEngine.Rendering.Universal { - internal enum RenderPassEvent2D + /// + /// Specifies the execution timing for a ScriptableRenderPass2D within the 2D renderer pipeline. + /// This enum allows you to control when a custom render pass is injected relative to key stages + /// of the 2D rendering process, such as normals, shadows, lights, sprites, and post-processing. + /// + public enum RenderPassEvent2D { - None = -1, + /// + /// Executes a ScriptableRenderPass2D before rendering any other passes in the pipeline. + /// Camera matrices and stereo rendering are not set up at this point. + /// Use this to draw to custom input textures used later in the pipeline, for example, LUT textures. + /// BeforeRendering = 0, - BeforeRenderingLayer = 100, - BeforeRenderingShadows = 200, - BeforeRenderingNormals = 300, - BeforeRenderingLights = 400, - BeforeRenderingSprites = 500, - AfterRenderingLayer = 600, - BeforeRenderingPostProcessing = 700, - AfterRenderingPostProcessing = 800, - AfterRendering = 900, + + /// + /// Executes a ScriptableRenderPass2D before rendering normals. + /// You can target sorting layers when using this event. + /// + BeforeRenderingNormals = 100, + + /// + /// Executes a ScriptableRenderPass2D after rendering normals. + /// You can target sorting layers when using this event. + /// + AfterRenderingNormals = 200, + + /// + /// Executes a ScriptableRenderPass2D before rendering shadows. + /// You can target sorting layers when using this event. + /// + BeforeRenderingShadows = 300, + + /// + /// Executes a ScriptableRenderPass2D after rendering shadows. + /// You can target sorting layers when using this event. + /// + AfterRenderingShadows = 400, + + /// + /// Executes a ScriptableRenderPass2D before rendering lights. + /// You can target sorting layers when using this event. + /// + BeforeRenderingLights = 500, + + /// + /// Executes a ScriptableRenderPass2D after rendering lights. + /// You can target sorting layers when using this event. + /// + AfterRenderingLights = 600, + + /// + /// Executes a ScriptableRenderPass2D before rendering sprites. + /// You can target sorting layers when using this event. + /// + BeforeRenderingSprites = 700, + + /// + /// Executes a ScriptableRenderPass2D after rendering sprites. + /// You can target sorting layers when using this event. + /// + AfterRenderingSprites = 800, + /// + /// Executes a ScriptableRenderPass2D before rendering post-processing. + /// + BeforeRenderingPostProcessing = 900, + + /// + /// Executes a ScriptableRenderPass2D after rendering post-processing. + /// + AfterRenderingPostProcessing = 1000, + + /// + /// Executes a ScriptableRenderPass2D after all rendering is complete. + /// + AfterRendering = 1100, } + internal static class RenderPassEvents2DEnumValues + { + // We cache the values in this array at construction time to avoid runtime allocations, which we would cause if we accessed valuesInternal directly. + public static int[] values; + + static RenderPassEvents2DEnumValues() + { + System.Array valuesInternal = Enum.GetValues(typeof(RenderPassEvent2D)); -#if USING_SCRIPTABLE_RENDERER_PASS_2D - internal abstract class ScriptableRenderPass2D : ScriptableRenderPass + values = new int[valuesInternal.Length]; + + int index = 0; + foreach (int value in valuesInternal) + { + values[index] = value; + index++; + } + } + } + + /// + /// ScriptableRenderPass2D implements a logical rendering pass with which you can extend the 2D renderer. + /// + public abstract class ScriptableRenderPass2D : ScriptableRenderPass { - private RenderPassEvent2D m_RenderPassEvent2D = RenderPassEvent2D.None; - private int m_RenderPassLayer2D = -1; + /// + /// The event that occurs when the render pass executes with the 2d renderer. + /// + public RenderPassEvent2D renderPassEvent2D { get; set; } - internal RenderPassEvent2D renderPassEvent2D => m_RenderPassEvent2D; - internal int renderPassLayer2D => m_RenderPassLayer2D; + /// + /// The sorting layer that the render pass executes on the 2d renderer. + /// + public int renderPassSortingLayerID { get; set; } - public ScriptableRenderPass2D(RenderPassEvent2D rpEvent, int rpLayer) + static internal int GetRenderPassEventRange(RenderPassEvent2D renderPassEvent2D) { - m_RenderPassEvent2D = rpEvent; - m_RenderPassLayer2D = rpLayer; + int numEvents = RenderPassEvents2DEnumValues.values.Length; + int currentIndex = 0; + + // Find the index of the renderPassEvent in the values array. + for (int i = 0; i < numEvents; ++i) + { + if (RenderPassEvents2DEnumValues.values[currentIndex] == (int)renderPassEvent2D) + break; + + currentIndex++; + } + + if (currentIndex >= numEvents) + { + Debug.LogError("GetRenderPassEventRange: invalid renderPassEvent2D value cannot be found in the RenderPassEvent2D enumeration"); + return 0; + } + + if (currentIndex + 1 >= numEvents) + return 50; // If this was the enum's last event, add 50 as the range. + + int nextValue = RenderPassEvents2DEnumValues.values[currentIndex + 1]; + + return nextValue - (int)renderPassEvent2D; + } + + static internal bool IsSortingLayerEvent(RenderPassEvent2D renderPassEvent) + { + return renderPassEvent >= RenderPassEvent2D.BeforeRenderingNormals && renderPassEvent <= RenderPassEvent2D.AfterRenderingSprites; } } -#endif static internal class ScriptableRenderPass2DExtension { - static internal void GetInjectionPoint2D(this ScriptableRenderPass renderPass, out RenderPassEvent2D rpEvent, out int rpLayer) { - -#if USING_SCRIPTABLE_RENDERER_PASS_2D ScriptableRenderPass2D renderPass2D = renderPass as ScriptableRenderPass2D; - if (renderPass2D == null || renderPass2D.renderPassEvent2D == RenderPassEvent2D.None) -#endif + if (renderPass2D == null) { rpLayer = int.MinValue; @@ -60,13 +168,11 @@ static internal void GetInjectionPoint2D(this ScriptableRenderPass renderPass, o else rpEvent = RenderPassEvent2D.AfterRendering; } -#if USING_SCRIPTABLE_RENDERER_PASS_2D else { rpEvent = renderPass2D.renderPassEvent2D; - rpLayer = renderPass2D.renderPassLayer2D; + rpLayer = renderPass2D.renderPassSortingLayerID; } -# endif } } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRendererFeature2D.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRendererFeature2D.cs new file mode 100644 index 00000000000..73360c18e4d --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRendererFeature2D.cs @@ -0,0 +1,23 @@ +namespace UnityEngine.Rendering.Universal +{ + /// + /// You can add a ScriptableRendererFeature2D to the ScriptableRenderer. Use this scriptable renderer feature to inject render passes into the 2D renderer. + /// + /// + /// + [ExcludeFromPreset] + public abstract partial class ScriptableRendererFeature2D : ScriptableRendererFeature + { + /// + /// Specifies at which injection point the pass will be rendered. + /// + [HideInInspector] + public RenderPassEvent2D injectionPoint2D = RenderPassEvent2D.BeforeRendering; + + /// + /// Specifies the sorting layer in which Unity injects the pass. + /// + [HideInInspector] + public int sortingLayerID = 0; + } +} diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRendererFeature2D.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRendererFeature2D.cs.meta new file mode 100644 index 00000000000..3d051f8d9d0 --- /dev/null +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/RendererFeatures/ScriptableRendererFeature2D.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 47ca7de5076d2e34fbc2e25f05744f10 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs index 20f8e548299..27004c3fca4 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using UnityEngine.Rendering.RenderGraphModule; using CommonResourceData = UnityEngine.Rendering.Universal.UniversalResourceData; @@ -55,7 +54,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData } #endif - private static void Execute(RasterCommandBuffer cmd, PassData passData, ref LayerBatch layerBatch, int lightTextureIndex) + private static void Execute(RasterCommandBuffer cmd, PassData passData, LayerBatch layerBatch, int lightTextureIndex) { cmd.SetGlobalFloat(k_InverseHDREmulationScaleID, 1.0f / passData.rendererData.hdrEmulationScale); @@ -141,10 +140,12 @@ internal class PassData internal int lightTextureIndex; } - void InitializeRenderPass(IRasterRenderGraphBuilder builder, ContextContainer frameData, PassData passData, Renderer2DData rendererData, ref LayerBatch layerBatch, int batchIndex, bool isVolumetric = false) + void InitializeRenderPass(IRasterRenderGraphBuilder builder, ContextContainer frameData, PassData passData, int batchIndex, bool isVolumetric = false) { Universal2DResourceData universal2DResourceData = frameData.Get(); CommonResourceData commonResourceData = frameData.Get(); + Renderer2DData rendererData = frameData.Get().renderingData; + var layerBatch = frameData.Get().layerBatches[batchIndex]; intermediateTexture[0] = commonResourceData.activeColorTexture; @@ -175,12 +176,13 @@ void InitializeRenderPass(IRasterRenderGraphBuilder builder, ContextContainer fr builder.AllowGlobalStateModification(true); } - internal void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData rendererData, ref LayerBatch layerBatch, int batchIndex, bool isVolumetric = false) + internal void Render(RenderGraph graph, ContextContainer frameData, int batchIndex, bool isVolumetric = false) { Universal2DResourceData universal2DResourceData = frameData.Get(); UniversalCameraData cameraData = frameData.Get(); + var layerBatch = frameData.Get().layerBatches[batchIndex]; - DebugHandler debugHandler = ScriptableRenderPass.GetActiveDebugHandler(cameraData); + DebugHandler debugHandler = GetActiveDebugHandler(cameraData); var isDebugLightingActive = debugHandler?.IsLightingActive ?? true; #if UNITY_EDITOR @@ -199,11 +201,14 @@ internal void Render(RenderGraph graph, ContextContainer frameData, Renderer2DDa // Render single RTs by for apis that don't support MRTs if (!isVolumetric && !Renderer2D.supportsMRT) { + var passName = k_LightSRTPass; + LayerDebug.FormatPassName(layerBatch, ref passName); + for (var i = 0; i < layerBatch.activeBlendStylesIndices.Length; ++i) { - using (var builder = graph.AddRasterRenderPass(k_LightSRTPass, out var passData, m_ProfilingSampleSRT)) + using (var builder = graph.AddRasterRenderPass(passName, out var passData, LayerDebug.GetProfilingSampler(passName, m_ProfilingSampleSRT))) { - InitializeRenderPass(builder, frameData, passData, rendererData, ref layerBatch, batchIndex, isVolumetric); + InitializeRenderPass(builder, frameData, passData, batchIndex, isVolumetric); var lightTextures = universal2DResourceData.lightTextures[batchIndex]; @@ -213,17 +218,21 @@ internal void Render(RenderGraph graph, ContextContainer frameData, Renderer2DDa builder.SetRenderFunc((PassData data, RasterGraphContext context) => { - Execute(context.cmd, data, ref data.layerBatch, data.lightTextureIndex); + Execute(context.cmd, data, data.layerBatch, data.lightTextureIndex); }); } } } else { + var passName = !isVolumetric ? k_LightPass : k_LightVolumetricPass; + var profilingSampler = !isVolumetric ? m_ProfilingSampler : m_ProfilingSamplerVolume; + LayerDebug.FormatPassName(layerBatch, ref passName); + // Default Raster Pass with MRTs - using (var builder = graph.AddRasterRenderPass(!isVolumetric ? k_LightPass : k_LightVolumetricPass, out var passData, !isVolumetric ? m_ProfilingSampler : m_ProfilingSamplerVolume)) + using (var builder = graph.AddRasterRenderPass(passName, out var passData, LayerDebug.GetProfilingSampler(passName, profilingSampler))) { - InitializeRenderPass(builder, frameData, passData, rendererData, ref layerBatch, batchIndex, isVolumetric); + InitializeRenderPass(builder, frameData, passData, batchIndex, isVolumetric); var lightTextures = !isVolumetric ? universal2DResourceData.lightTextures[batchIndex] : intermediateTexture; @@ -233,7 +242,7 @@ internal void Render(RenderGraph graph, ContextContainer frameData, Renderer2DDa builder.SetRenderFunc((PassData data, RasterGraphContext context) => { for (var i = 0; i < data.layerBatch.activeBlendStylesIndices.Length; ++i) - Execute(context.cmd, data, ref data.layerBatch, i); + Execute(context.cmd, data, data.layerBatch, i); }); } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs index d06f48f892f..75c9d1dcc5c 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs @@ -29,10 +29,12 @@ private static void Execute(RasterCommandBuffer cmd, PassData passData) cmd.DrawRendererList(passData.rendererList); } - public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData rendererData, ref LayerBatch layerBatch, int batchIndex) + public void Render(RenderGraph graph, ContextContainer frameData, int batchIndex) { Universal2DResourceData universal2DResourceData = frameData.Get(); CommonResourceData commonResourceData = frameData.Get(); + Renderer2DData rendererData = frameData.Get().renderingData; + var layerBatch = frameData.Get().layerBatches[batchIndex]; if (!layerBatch.useNormals) return; @@ -41,9 +43,12 @@ public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData UniversalCameraData cameraData = frameData.Get(); UniversalLightData lightData = frameData.Get(); - using (var builder = graph.AddRasterRenderPass(k_NormalPass, out var passData, m_ProfilingSampler)) + var passName = k_NormalPass; + LayerDebug.FormatPassName(layerBatch, ref passName); + + using (var builder = graph.AddRasterRenderPass(passName, out var passData, LayerDebug.GetProfilingSampler(passName, m_ProfilingSampler))) { - LayerUtility.GetFilterSettings(rendererData, ref layerBatch, out var filterSettings); + LayerUtility.GetFilterSettings(rendererData, layerBatch, out var filterSettings); var drawSettings = CreateDrawingSettings(k_NormalsRenderingPassName, renderingData, cameraData, lightData, SortingCriteria.CommonTransparent); var sortSettings = drawSettings.sortingSettings; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs index f798e4e548c..a5e3fda5bc1 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs @@ -91,15 +91,16 @@ class PassData #endif } - public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData rendererData, ref LayerBatch[] layerBatches, int batchIndex, ref FilteringSettings filterSettings) + public void Render(RenderGraph graph, ContextContainer frameData, int batchIndex, ref FilteringSettings filterSettings) { UniversalRenderingData renderingData = frameData.Get(); UniversalCameraData cameraData = frameData.Get(); UniversalLightData lightData = frameData.Get(); Universal2DResourceData universal2DResourceData = frameData.Get(); CommonResourceData commonResourceData = frameData.Get(); + Renderer2DData rendererData = frameData.Get().renderingData; + var layerBatch = frameData.Get().layerBatches[batchIndex]; - var layerBatch = layerBatches[batchIndex]; bool isLitView = true; #if UNITY_EDITOR @@ -124,7 +125,7 @@ public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData builder.UseTexture(passData.lightTextures[i]); } - SetGlobalLightTextures(graph, builder, passData.lightTextures, ref layerBatch, rendererData, isLitView); + SetGlobalLightTextures(graph, builder, frameData, batchIndex, isLitView); builder.AllowGlobalStateModification(true); @@ -135,7 +136,10 @@ public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData } // Renderer Pass - using (var builder = graph.AddRasterRenderPass(k_RenderPass, out var passData, m_ProfilingSampler)) + var passName = k_RenderPass; + LayerDebug.FormatPassName(layerBatch, ref passName); + + using (var builder = graph.AddRasterRenderPass(passName, out var passData, LayerDebug.GetProfilingSampler(passName, m_ProfilingSampler))) { passData.lightBlendStyles = rendererData.lightBlendStyles; passData.blendStyleIndices = layerBatch.activeBlendStylesIndices; @@ -189,7 +193,7 @@ public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData // Post set global light textures for next renderer pass var nextBatch = batchIndex + 1; if (nextBatch < universal2DResourceData.lightTextures.Length) - SetGlobalLightTextures(graph, builder, universal2DResourceData.lightTextures[nextBatch], ref layerBatches[nextBatch], rendererData, isLitView); + SetGlobalLightTextures(graph, builder, frameData, nextBatch, isLitView); builder.SetRenderFunc((PassData data, RasterGraphContext context) => { @@ -198,8 +202,12 @@ public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData } } - void SetGlobalLightTextures(RenderGraph graph, IRasterRenderGraphBuilder builder, TextureHandle[] lightTextures, ref LayerBatch layerBatch, Renderer2DData rendererData, bool isLitView) + void SetGlobalLightTextures(RenderGraph graph, IRasterRenderGraphBuilder builder, ContextContainer frameData, int batchIndex, bool isLitView) { + Renderer2DData rendererData = frameData.Get().renderingData; + var layerBatch = frameData.Get().layerBatches[batchIndex]; + var lightTextures = frameData.Get().lightTextures[batchIndex]; + if (isLitView) { if (layerBatch.lightStats.useLights) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawShadow2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawShadow2DPass.cs index c969e04de3f..6f40725b88a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawShadow2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawShadow2DPass.cs @@ -43,16 +43,22 @@ internal class PassData internal TextureHandle shadowDepth; } - public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData rendererData, ref LayerBatch layerBatch, int batchIndex, bool isVolumetric = false) + public void Render(RenderGraph graph, ContextContainer frameData, int batchIndex, bool isVolumetric = false) { Universal2DResourceData universal2DResourceData = frameData.Get(); CommonResourceData commonResourceData = frameData.Get(); + Renderer2DData rendererData = frameData.Get().renderingData; + var layerBatch = frameData.Get().layerBatches[batchIndex]; if (!layerBatch.lightStats.useShadows || isVolumetric && !layerBatch.lightStats.useVolumetricShadowLights) return; - using (var builder = graph.AddUnsafePass(!isVolumetric ? k_ShadowPass : k_ShadowVolumetricPass, out var passData, !isVolumetric ? m_ProfilingSampler : m_ProfilingSamplerVolume)) + var passName = !isVolumetric ? k_ShadowPass : k_ShadowVolumetricPass; + var profilingSampler = !isVolumetric ? m_ProfilingSampler : m_ProfilingSamplerVolume; + LayerDebug.FormatPassName(layerBatch, ref passName); + + using (var builder = graph.AddUnsafePass(passName, out var passData, LayerDebug.GetProfilingSampler(passName, profilingSampler))) { passData.layerBatch = layerBatch; passData.rendererData = rendererData; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/GlobalPropertiesPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/GlobalPropertiesPass.cs index 34d70f20a4e..d25d7585667 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/GlobalPropertiesPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/GlobalPropertiesPass.cs @@ -12,9 +12,11 @@ class PassData internal Vector2Int screenParams; } - internal static void Setup(RenderGraph graph, ContextContainer frameData, Renderer2DData rendererData, UniversalCameraData cameraData, bool useLights) + internal static void Setup(RenderGraph graph, ContextContainer frameData, bool useLights) { Universal2DResourceData universal2DResourceData = frameData.Get(); + UniversalCameraData cameraData = frameData.Get(); + Renderer2DData rendererData = frameData.Get().renderingData; using (var builder = graph.AddRasterRenderPass(k_SetGlobalProperties, out var passData, m_SetGlobalPropertiesProfilingSampler)) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs index 55744c15b1b..9e921bc2be0 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs @@ -59,8 +59,6 @@ private struct ImportResourceSummary DrawScreenSpaceUIPass m_DrawOverlayUIPass; // from HDRP code Renderer2DData m_Renderer2DData; - LayerBatch[] m_LayerBatches; - int m_BatchCount; internal bool m_CreateColorTexture; internal bool m_CreateDepthTexture; @@ -160,8 +158,10 @@ private bool IsPixelPerfectCameraEnabled(UniversalCameraData cameraData) return ppc != null && ppc.enabled && ppc.cropFrame != PixelPerfectCamera.CropFrame.None; } - private RenderPassInputSummary GetRenderPassInputs(UniversalCameraData cameraData) + private RenderPassInputSummary GetRenderPassInputs() { + UniversalCameraData cameraData = frameData.Get(); + RenderPassInputSummary inputSummary = new RenderPassInputSummary(); for (int i = 0; i < activeRenderPassQueue.Count; ++i) @@ -316,30 +316,33 @@ public override void SetupCullingParameters(ref ScriptableCullingParameters cull void InitializeLayerBatches() { Universal2DResourceData resourceData = frameData.Get(); + var renderingData = frameData.Get().renderingData; + ref var layerBatches = ref frameData.Get().layerBatches; - m_LayerBatches = LayerUtility.CalculateBatches(m_Renderer2DData, out m_BatchCount); + layerBatches = LayerUtility.CalculateBatches(renderingData, out var batchCount); + frameData.Get().batchCount = batchCount; // Initialize textures dependent on batch size - if (resourceData.normalsTexture.Length != m_BatchCount) - resourceData.normalsTexture = new TextureHandle[m_BatchCount]; + if (resourceData.normalsTexture.Length != batchCount) + resourceData.normalsTexture = new TextureHandle[batchCount]; - if (resourceData.shadowTextures.Length != m_BatchCount) - resourceData.shadowTextures = new TextureHandle[m_BatchCount][]; + if (resourceData.shadowTextures.Length != batchCount) + resourceData.shadowTextures = new TextureHandle[batchCount][]; - if (resourceData.lightTextures.Length != m_BatchCount) - resourceData.lightTextures = new TextureHandle[m_BatchCount][]; + if (resourceData.lightTextures.Length != batchCount) + resourceData.lightTextures = new TextureHandle[batchCount][]; // Initialize light textures based on active blend styles to save on resources for (int i = 0; i < resourceData.lightTextures.Length; ++i) { - if (resourceData.lightTextures[i] == null || resourceData.lightTextures[i].Length != m_LayerBatches[i].activeBlendStylesIndices.Length) - resourceData.lightTextures[i] = new TextureHandle[m_LayerBatches[i].activeBlendStylesIndices.Length]; + if (resourceData.lightTextures[i] == null || resourceData.lightTextures[i].Length != layerBatches[i].activeBlendStylesIndices.Length) + resourceData.lightTextures[i] = new TextureHandle[layerBatches[i].activeBlendStylesIndices.Length]; } for (int i = 0; i < resourceData.shadowTextures.Length; ++i) { - if (resourceData.shadowTextures[i] == null || resourceData.shadowTextures[i].Length != m_LayerBatches[i].shadowIndices.Count) - resourceData.shadowTextures[i] = new TextureHandle[m_LayerBatches[i].shadowIndices.Count]; + if (resourceData.shadowTextures[i] == null || resourceData.shadowTextures[i].Length != layerBatches[i].shadowIndices.Count) + resourceData.shadowTextures[i] = new TextureHandle[layerBatches[i].shadowIndices.Count]; } } @@ -411,7 +414,7 @@ void CreateResources(RenderGraph renderGraph) // Create the attachments if (cameraData.renderType == CameraRenderType.Base) // require intermediate textures { - RenderPassInputSummary renderPassInputs = GetRenderPassInputs(cameraData); + RenderPassInputSummary renderPassInputs = GetRenderPassInputs(); m_CreateColorTexture = renderPassInputs.requiresColorTexture; m_CreateDepthTexture = renderPassInputs.requiresDepthTexture; @@ -525,7 +528,7 @@ void CreateResources(RenderGraph renderGraph) commonResourceData.backBufferColor = renderGraph.ImportTexture(m_RenderGraphBackbufferColorHandle, importSummary.importInfo, importSummary.backBufferColorParams); commonResourceData.backBufferDepth = renderGraph.ImportTexture(m_RenderGraphBackbufferDepthHandle, importSummary.importInfoDepth, importSummary.backBufferDepthParams); - if (RequiresDepthCopyPass(cameraData)) + if (RequiresDepthCopyPass()) CreateCameraDepthCopyTexture(renderGraph, cameraTargetDescriptor); } @@ -562,6 +565,7 @@ void CreateCameraNormalsTextures(RenderGraph renderGraph, RenderTextureDescripto void CreateLightTextures(RenderGraph renderGraph, int width, int height) { Universal2DResourceData resourceData = frameData.Get(); + var layerBatches = frameData.Get().layerBatches; var desc = new RenderTextureDescriptor(width, height); desc.graphicsFormat = RendererLighting.GetRenderTextureFormat(); @@ -569,10 +573,10 @@ void CreateLightTextures(RenderGraph renderGraph, int width, int height) for (int i = 0; i < resourceData.lightTextures.Length; ++i) { - for (var j = 0; j < m_LayerBatches[i].activeBlendStylesIndices.Length; ++j) + for (var j = 0; j < layerBatches[i].activeBlendStylesIndices.Length; ++j) { - var index = m_LayerBatches[i].activeBlendStylesIndices[j]; - if (!Light2DManager.GetGlobalColor(m_LayerBatches[i].startLayerID, index, out var clearColor)) + var index = layerBatches[i].activeBlendStylesIndices[j]; + if (!Light2DManager.GetGlobalColor(layerBatches[i].startLayerID, index, out var clearColor)) clearColor = Color.black; resourceData.lightTextures[i][j] = UniversalRenderer.CreateRenderGraphTexture(renderGraph, desc, RendererLighting.k_ShapeLightTextureIDs[index], true, clearColor, FilterMode.Bilinear); @@ -583,6 +587,7 @@ void CreateLightTextures(RenderGraph renderGraph, int width, int height) void CreateShadowTextures(RenderGraph renderGraph, int width, int height) { Universal2DResourceData resourceData = frameData.Get(); + var layerBatches = frameData.Get().layerBatches; var shadowDesc = new RenderTextureDescriptor(width, height); shadowDesc.graphicsFormat = GraphicsFormat.B10G11R11_UFloatPack32; @@ -590,7 +595,7 @@ void CreateShadowTextures(RenderGraph renderGraph, int width, int height) for (int i = 0; i < resourceData.shadowTextures.Length; ++i) { - for (var j = 0; j < m_LayerBatches[i].shadowIndices.Count; ++j) + for (var j = 0; j < layerBatches[i].shadowIndices.Count; ++j) { resourceData.shadowTextures[i][j] = UniversalRenderer.CreateRenderGraphTexture(renderGraph, shadowDesc, "_ShadowTex", false, FilterMode.Bilinear); } @@ -614,9 +619,11 @@ void CreateCameraSortingLayerTexture(RenderGraph renderGraph, RenderTextureDescr resourceData.cameraSortingLayerTexture = renderGraph.ImportTexture(m_CameraSortingLayerHandle); } - bool RequiresDepthCopyPass(UniversalCameraData cameraData) + bool RequiresDepthCopyPass() { - var renderPassInputs = GetRenderPassInputs(cameraData); + UniversalCameraData cameraData = frameData.Get(); + + var renderPassInputs = GetRenderPassInputs(); bool requiresDepthTexture = cameraData.requiresDepthTexture || renderPassInputs.requiresDepthTexture; bool cameraHasPostProcessingWithDepth = cameraData.postProcessEnabled && m_PostProcess != null && cameraData.postProcessingRequiresDepthTexture; bool requiresDepthCopyPass = (cameraHasPostProcessingWithDepth || requiresDepthTexture) && m_CreateDepthTexture; @@ -639,25 +646,48 @@ void CreateCameraDepthCopyTexture(RenderGraph renderGraph, RenderTextureDescript public override void OnBeginRenderGraphFrame() { Universal2DResourceData universal2DResourceData = frameData.Create(); - CommonResourceData commonResourceData = frameData.GetOrCreate(); - universal2DResourceData.InitFrame(); + CommonResourceData commonResourceData = frameData.Get(); + frameData.Create().renderingData = m_Renderer2DData; + + universal2DResourceData.InitFrame(); commonResourceData.InitFrame(); } - internal void RecordCustomRenderGraphPasses(RenderGraph renderGraph, RenderPassEvent2D activeRPEvent) + internal void RecordCustomRenderGraphPasses(RenderGraph renderGraph, RenderPassEvent2D eventStart, int batchIndex = -1) { foreach (ScriptableRenderPass pass in activeRenderPassQueue) { - pass.GetInjectionPoint2D(out RenderPassEvent2D rpEvent, out int rpLayer); + var batchCount = frameData.Get().batchCount; + var isBatchValid = batchIndex >= 0 && batchIndex < batchCount; + + pass.GetInjectionPoint2D(out RenderPassEvent2D rpEvent, out int layerID); + int range = ScriptableRenderPass2D.GetRenderPassEventRange(eventStart); + + // Account for render passes in between events. + if (rpEvent >= eventStart && rpEvent < eventStart + range) + { + // Invalid sorting layer specified for render pass + if (!SortingLayer.IsValid(layerID) && ScriptableRenderPass2D.IsSortingLayerEvent(rpEvent)) + { + Debug.Assert(SortingLayer.IsValid(layerID), SortingLayer.IDToName(layerID) + " is not a valid Sorting Layer."); + } + // BatchIndex is valid + else if (isBatchValid) + { + var layerBatch = frameData.Get().layerBatches[batchIndex]; - if (rpEvent == activeRPEvent) - pass.RecordRenderGraph(renderGraph, frameData); + if (layerBatch.IsValueWithinLayerRange(SortingLayer.GetLayerValueFromID(layerID))) + pass.RecordRenderGraph(renderGraph, frameData); + } + else + pass.RecordRenderGraph(renderGraph, frameData); + } } } internal override void OnRecordRenderGraph(RenderGraph renderGraph, ScriptableRenderContext context) { - CommonResourceData commonResourceData = frameData.GetOrCreate(); + CommonResourceData commonResourceData = frameData.Get(); UniversalCameraData cameraData = frameData.Get(); InitializeLayerBatches(); @@ -666,6 +696,8 @@ internal override void OnRecordRenderGraph(RenderGraph renderGraph, ScriptableRe DebugHandler?.Setup(renderGraph, cameraData.isPreviewCamera); + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.BeforeRendering); + SetupRenderGraphCameraProperties(renderGraph, commonResourceData.isActiveTargetBackBuffer, commonResourceData.activeColorTexture); #if VISUAL_EFFECT_GRAPH_0_0_1_OR_NEWER @@ -674,8 +706,6 @@ internal override void OnRecordRenderGraph(RenderGraph renderGraph, ScriptableRe OnBeforeRendering(renderGraph); - RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.BeforeRendering); - BeginRenderGraphXRRendering(renderGraph); OnMainRendering(renderGraph); @@ -703,18 +733,19 @@ internal override void OnFinishRenderGraphRendering(CommandBuffer cmd) private void OnBeforeRendering(RenderGraph renderGraph) { UniversalCameraData cameraData = frameData.Get(); + var renderingData = frameData.Get().renderingData; - m_LightPass.Setup(renderGraph, ref m_Renderer2DData); + m_LightPass.Setup(renderGraph, ref renderingData); // Before rendering the lights cache some values that are expensive to get/calculate - var culledLights = m_Renderer2DData.lightCullResult.visibleLights; + var culledLights = renderingData.lightCullResult.visibleLights; for (var i = 0; i < culledLights.Count; i++) { culledLights[i].CacheValues(); } ShadowCasterGroup2DManager.CacheValues(); - ShadowRendering.CallOnBeforeRender(cameraData.camera, m_Renderer2DData.lightCullResult); + ShadowRendering.CallOnBeforeRender(cameraData.camera, renderingData.lightCullResult); RendererLighting.lightBatch.Reset(); } @@ -724,6 +755,8 @@ private void OnMainRendering(RenderGraph renderGraph) Universal2DResourceData universal2DResourceData = frameData.Get(); CommonResourceData commonResourceData = frameData.Get(); UniversalCameraData cameraData = frameData.Get(); + var layerBatches = frameData.Get().layerBatches; + var batchCount = frameData.Get().batchCount; // Color Grading LUT bool requiredColorGradingLutPass = cameraData.postProcessEnabled && m_PostProcess != null; @@ -738,28 +771,46 @@ private void OnMainRendering(RenderGraph renderGraph) var cameraSortingLayerBoundsIndex = m_Renderer2DData.GetCameraSortingLayerBoundsIndex(); bool useLights = false; - for (int i = 0; i < m_BatchCount; ++i) - useLights |= m_LayerBatches[i].lightStats.useLights; + for (int i = 0; i < batchCount; ++i) + useLights |= layerBatches[i].lightStats.useLights; // Set Global Properties and Textures - GlobalPropertiesPass.Setup(renderGraph, frameData, m_Renderer2DData, cameraData, useLights); + GlobalPropertiesPass.Setup(renderGraph, frameData, useLights); // Main render passes // Normal Pass - for (var i = 0; i < m_BatchCount; i++) - m_NormalPass.Render(renderGraph, frameData, m_Renderer2DData, ref m_LayerBatches[i], i); + for (var i = 0; i < batchCount; i++) + { + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.BeforeRenderingNormals, i); + + m_NormalPass.Render(renderGraph, frameData, i); + + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.AfterRenderingNormals, i); + } // Shadow Pass (TODO: Optimize RT swapping between shadow and light textures) - for (var i = 0; i < m_BatchCount; i++) - m_ShadowPass.Render(renderGraph, frameData, m_Renderer2DData, ref m_LayerBatches[i], i); + for (var i = 0; i < batchCount; i++) + { + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.BeforeRenderingShadows, i); + + m_ShadowPass.Render(renderGraph, frameData, i); + + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.AfterRenderingShadows, i); + } // Light Pass - for (var i = 0; i < m_BatchCount; i++) - m_LightPass.Render(renderGraph, frameData, m_Renderer2DData, ref m_LayerBatches[i], i); + for (var i = 0; i < batchCount; i++) + { + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.BeforeRenderingLights, i); + + m_LightPass.Render(renderGraph, frameData, i); + + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.AfterRenderingLights, i); + } // Default Render Pass - for (var i = 0; i < m_BatchCount; i++) + for (var i = 0; i < batchCount; i++) { if (!renderGraph.nativeRenderPassesEnabled && i == 0) { @@ -768,28 +819,33 @@ private void OnMainRendering(RenderGraph renderGraph) ClearTargetsPass.Render(renderGraph, commonResourceData.activeColorTexture, commonResourceData.activeDepthTexture, clearFlags, cameraData.backgroundColor); } - ref var layerBatch = ref m_LayerBatches[i]; + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.BeforeRenderingSprites, i); - LayerUtility.GetFilterSettings(m_Renderer2DData, ref m_LayerBatches[i], out var filterSettings); - m_RendererPass.Render(renderGraph, frameData, m_Renderer2DData, ref m_LayerBatches, i, ref filterSettings); + + LayerUtility.GetFilterSettings(m_Renderer2DData, layerBatches[i], out var filterSettings); + m_RendererPass.Render(renderGraph, frameData, i, ref filterSettings); + + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.AfterRenderingSprites, i); // Shadow Volumetric Pass - m_ShadowPass.Render(renderGraph, frameData, m_Renderer2DData, ref m_LayerBatches[i], i, true); + m_ShadowPass.Render(renderGraph, frameData, i, true); // Light Volumetric Pass - m_LightPass.Render(renderGraph, frameData, m_Renderer2DData, ref m_LayerBatches[i], i, true); + m_LightPass.Render(renderGraph, frameData, i, true); // Camera Sorting Layer Pass if (m_Renderer2DData.useCameraSortingLayerTexture) { - if (cameraSortingLayerBoundsIndex >= layerBatch.layerRange.lowerBound && cameraSortingLayerBoundsIndex <= layerBatch.layerRange.upperBound) + ref var layerBatch = ref layerBatches[i]; + + if (layerBatch.IsValueWithinLayerRange(cameraSortingLayerBoundsIndex)) { m_CopyCameraSortingLayerPass.Render(renderGraph, frameData); } } } - if (RequiresDepthCopyPass(cameraData)) + if (RequiresDepthCopyPass()) m_CopyDepthPass?.Render(renderGraph, frameData, commonResourceData.cameraDepthTexture, commonResourceData.activeDepthTexture, true); bool shouldRenderUI = cameraData.rendersOverlayUI; @@ -806,7 +862,6 @@ private void OnAfterRendering(RenderGraph renderGraph) { Universal2DResourceData universal2DResourceData = frameData.Get(); CommonResourceData commonResourceData = frameData.Get(); - UniversalRenderingData renderingData = frameData.Get(); UniversalCameraData cameraData = frameData.Get(); UniversalPostProcessingData postProcessingData = frameData.Get(); @@ -851,7 +906,7 @@ private void OnAfterRendering(RenderGraph renderGraph) // so FXAA is not supported (you don't want to apply FXAA when everything is intentionally pixelated). bool applyFinalPostProcessing = cameraData.resolveFinalTarget && !ppcUpscaleRT && anyPostProcessing && cameraData.antialiasing == AntialiasingMode.FastApproximateAntialiasing; - bool hasPassesAfterPostProcessing = activeRenderPassQueue.Find(x => x.renderPassEvent == RenderPassEvent.AfterRenderingPostProcessing) != null; + bool hasPassesAfterPostProcessing = activeRenderPassQueue.Find(x => x.renderPassEvent == RenderPassEvent.AfterRenderingPostProcessing || (x as ScriptableRenderPass2D)?.renderPassEvent2D == RenderPassEvent2D.AfterRenderingPostProcessing) != null; bool needsColorEncoding = !resolveToDebugScreen; // Don't resolve during post processing if there are passes after or pixel perfect camera is used @@ -928,6 +983,8 @@ private void OnAfterRendering(RenderGraph renderGraph) commonResourceData.SwitchActiveTexturesToBackbuffer(); } + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.AfterRendering); + // We can explicitly render the overlay UI from URP when HDR output is not enabled. // SupportedRenderingFeatures.active.rendersUIOverlay should also be set to true. bool shouldRenderUI = cameraData.rendersOverlayUI && cameraData.isLastBaseCamera; diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/CommonAssets/UniversalRPAsset.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/CommonAssets/UniversalRPAsset.asset index b2c5a766377..51f48edddc2 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/CommonAssets/UniversalRPAsset.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/CommonAssets/UniversalRPAsset.asset @@ -12,8 +12,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} m_Name: UniversalRPAsset m_EditorClassIdentifier: - k_AssetVersion: 12 - k_AssetPreviousVersion: 12 + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 m_RendererType: 1 m_RendererData: {fileID: 0} m_RendererDataList: @@ -27,6 +27,7 @@ MonoBehaviour: - {fileID: 11400000, guid: ab4527fe9ad5ef949bffe9447fabcfa2, type: 2} - {fileID: 11400000, guid: 3fbfbd331642d98488a7faad256688e5, type: 2} - {fileID: 11400000, guid: 01e79ba8f42c808448b7542939affccb, type: 2} + - {fileID: 11400000, guid: 9b5b99c05ab3ae148b6d8faf2da44518, type: 2} m_DefaultRendererIndex: 2 m_RequireDepthTexture: 0 m_RequireOpaqueTexture: 0 @@ -34,6 +35,7 @@ MonoBehaviour: m_SupportsTerrainHoles: 1 m_SupportsHDR: 1 m_HDRColorBufferPrecision: 0 + m_IntermediateTextureMode: 1 m_MSAA: 4 m_RenderScale: 1 m_UpscalingFilter: 0 @@ -62,7 +64,7 @@ MonoBehaviour: m_AdditionalLightsShadowResolutionTierHigh: 512 m_ReflectionProbeBlending: 0 m_ReflectionProbeBoxProjection: 0 - m_ReflectionProbeAtlas: 1 + m_ReflectionProbeAtlas: 0 m_ShadowDistance: 56 m_ShadowCascadeCount: 4 m_Cascade2Split: 0.25 @@ -137,9 +139,14 @@ MonoBehaviour: m_PrefilterSoftShadowsQualityHigh: 0 m_PrefilterSoftShadows: 0 m_PrefilterScreenCoord: 0 + m_PrefilterScreenSpaceIrradiance: 0 m_PrefilterNativeRenderPass: 0 m_PrefilterUseLegacyLightmaps: 0 m_PrefilterBicubicLightmapSampling: 0 + m_PrefilterReflectionProbeRotation: 0 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 0 m_ShaderVariantLogLevel: 0 m_ShadowCascades: 3 m_Textures: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.meta new file mode 100644 index 00000000000..92a755877b0 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f3900fbcb8553484e9f7f9ecbc54fefb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.unity new file mode 100644 index 00000000000..314522c0c0c --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.unity @@ -0,0 +1,1538 @@ +%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: 10 + 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: 3 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + 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_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + 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 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &269225265 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 269225269} + - component: {fileID: 269225268} + - component: {fileID: 269225267} + - component: {fileID: 269225266} + - component: {fileID: 269225270} + 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 &269225266 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269225265} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: 10 + 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_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!81 &269225267 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269225265} + m_Enabled: 1 +--- !u!20 &269225268 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269225265} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + 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: 5 + 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: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &269225269 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269225265} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &269225270 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269225265} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73231aa468d81ea49bc3d914080de185, type: 3} + m_Name: + m_EditorClassIdentifier: UniversalGraphicsTests::UniversalGraphicsTestSettings + ImageComparisonSettings: + TargetWidth: 1280 + TargetHeight: 720 + TargetMSAASamples: 1 + PerPixelCorrectnessThreshold: 0.001 + PerPixelGammaThreshold: 0.003921569 + PerPixelAlphaThreshold: 0.003921569 + RMSEThreshold: 0 + AverageCorrectnessThreshold: 0.005 + IncorrectPixelsThreshold: 0.0000038146973 + UseHDR: 0 + UseBackBuffer: 0 + ImageResolution: 0 + ActiveImageTests: 1 + ActivePixelTests: 7 + WaitFrames: 0 + XRCompatible: 0 + gpuDrivenCompatible: 1 + CheckMemoryAllocation: 1 + renderBackendCompatibility: 0 + SetBackBufferResolution: 0 +--- !u!1 &417180950 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 417180953} + - component: {fileID: 417180952} + - component: {fileID: 417180951} + m_Layer: 0 + m_Name: Sprite_Coral_round FG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &417180951 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 417180950} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7db70e0ea77f5ac47a8f4565a9406397, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.ShadowCaster2D + m_ShadowGroup: 0 + m_Priority: 0 + m_ComponentVersion: 5 + m_HasRenderer: 1 + m_UseRendererSilhouette: 1 + m_CastsShadows: 1 + m_SelfShadows: 0 + m_AlphaCutoff: 0.1 + m_ApplyToSortingLayers: eb0feddf00000000e980ef06 + m_ShapePath: + - {x: -2.5600002, y: -1.935, z: 0} + - {x: -2.5600002, y: 1.935, z: 0} + - {x: 2.5600004, y: 1.935, z: 0} + - {x: 2.5600004, y: -1.935, z: 0} + m_ShapePathHash: 0 + m_InstanceId: 0 + m_ShadowShape2DComponent: {fileID: 417180952} + m_ShadowShape2DProvider: + rid: 1074215597368148051 + m_ShadowCastingSource: 2 + m_ShadowMesh: + m_Mesh: {fileID: 2046973583} + m_LocalBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.4599915, y: 1.8349915, z: 0} + m_EdgeProcessing: 1 + m_TrimEdge: 0.1 + m_FlipX: 0 + m_FlipY: 0 + m_InitialTrim: 0 + m_CastingOption: 1 + m_PreviousTrimEdge: 0.1 + m_PreviousEdgeProcessing: 1 + m_PreviousShadowCastingSource: 2 + m_PreviousShadowShape2DSource: {fileID: 417180952} + references: + version: 2 + RefIds: + - rid: 1074215597368148051 + type: {class: ShadowShape2DProvider_SpriteRenderer, ns: UnityEngine.Rendering.Universal, + asm: Unity.RenderPipelines.Universal.2D.Runtime} + data: +--- !u!212 &417180952 +SpriteRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 417180950} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 116359401 + m_SortingLayer: 1 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_Sprite: {fileID: -6091329584399971573, guid: 734039631e6f77248b04a79e9dded059, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 5.12, y: 3.87} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_SpriteSortPoint: 0 +--- !u!4 &417180953 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 417180950} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 5, y: 0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!43 &964297794 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 12 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 666 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 370 + localAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.4599915, y: 1.8349915, z: 0} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_BonesAABB: [] + m_VariableBoneCountWeights: + m_Data: + m_MeshCompression: 0 + m_IsReadable: 1 + m_KeepVertices: 0 + m_KeepIndices: 0 + m_IndexFormat: 0 + m_IndexBuffer: 00004a004b004b000100000001004e004f004f000200010002005200530053000300020003005600570057000400030004005a005b005b000500040005005e005f005f000600050006006200630063000700060007006600670067000800070008006a006b006b000900080009006e006f006f000a0009000a007200730073000b000a000b007600770077000c000b000c007a007b007b000d000c000d007e007f007f000e000d000e008200830083000f000e000f0086008700870010000f0010008a008b008b001100100011008e008f008f001200110012009200930093001300120013009600970097001400130014009a009b009b001500140015009e009f009f00160015001600a200a300a300170016001700a600a700a700180017001800aa00ab00ab00190018001900ae00af00af001a0019001a00b200b300b3001b001a001b00b600b700b7001c001b001c00ba00bb00bb001d001c001d00be00bf00bf001e001d001e00c200c300c3001f001e001f00c600c700c70020001f002000ca00cb00cb00210020002100ce00cf00cf00220021002200d200d300d300230022002300d600d700d700240023002400da00db00db00250024002500de00df00df00260025002600e200e300e300270026002700e600e700e700280027002800ea00eb00eb00290028002900ee00ef00ef002a0029002a00f200f300f3002b002a002b00f600f700f7002c002b002c00fa00fb00fb002d002c002d00fe00ff00ff002e002d002e000201030103012f002e002f0006010701070130002f0030000a010b010b013100300031000e010f010f013200310032001201130113013300320033001601170117013400330034001a011b011b013500340035001e011f011f013600350036002201230123013700360037002601270127013800370038002a012b012b013900380039002e012f012f013a0039003a003201330133013b003a003b003601370137013c003b003c003a013b013b013d003c003d003e013f013f013e003d003e004201430143013f003e003f0046014701470140003f0040004a014b014b014100400041004e014f014f014200410042005201530153014300420043005601570157014400430044005a015b015b014500440045005e015f015f014600450046006201630163014700460047006601670167014800470048006a016b016b014900480049006e016f016f010000490000004c004d0001005000510002005400550003005800590004005c005d0005006000610006006400650007006800690008006c006d000900700071000a00740075000b00780079000c007c007d000d00800081000e00840085000f008800890010008c008d0011009000910012009400950013009800990014009c009d001500a000a1001600a400a5001700a800a9001800ac00ad001900b000b1001a00b400b5001b00b800b9001c00bc00bd001d00c000c1001e00c400c5001f00c800c9002000cc00cd002100d000d1002200d400d5002300d800d9002400dc00dd002500e000e1002600e400e5002700e800e9002800ec00ed002900f000f1002a00f400f5002b00f800f9002c00fc00fd002d00000101012e00040105012f000801090130000c010d0131001001110132001401150133001801190134001c011d0135002001210136002401250137002801290138002c012d013900300131013a00340135013b00380139013c003c013d013d00400141013e00440145013f004801490140004c014d0141005001510142005401550143005801590144005c015d0145006001610146006401650147006801690148006c016d01490070017101 + m_VertexData: + serializedVersion: 3 + m_VertexCount: 370 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 12 + format: 0 + dimension: 4 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 10360 + _typelessdata: 00d0fc3e8036eabf00000000000080bf00000000003c0c3f804ce3bf003c0c3f804ce3bf00000000000080bf00000000001f163f8069d9bf001f163f8069d9bf00000000000080bf00000000002e1a3f0050d2bf002e1a3f0050d2bf00000000000080bf0000000000901e3f8028c5bf00901e3f8028c5bf00000000000080bf00000000009a343f8033bfbf009a343f8033bfbf00000000000080bf0000000080d4803f8027d0bf80d4803f8027d0bf00000000000080bf00000000804f823f0010d1bf804f823f0010d1bf00000000000080bf0000000000d18c3f80a8d9bf00d18c3f80a8d9bf00000000000080bf0000000000b8a23f80ebd6bf00b8a23f80ebd6bf00000000000080bf000000000026ad3f0019cfbf0026ad3f0019cfbf00000000000080bf000000008064b43f0072cebf8064b43f0072cebf00000000000080bf000000000046d23f8062ddbf0046d23f8062ddbf00000000000080bf0000000000b8d73f8079debf00b8d73f8079debf00000000000080bf000000008016f03f00e9cbbf8016f03f00e9cbbf00000000000080bf00000000002bf53f80a0cabf002bf53f80a0cabf00000000000080bf00000000001e054080f4cdbf001e054080f4cdbf00000000000080bf0000000080fa1040009fb9bf80fa1040009fb9bf00000000000080bf00000000809012400024b8bf809012400024b8bf00000000000080bf00000000805f18408034b6bf805f18408034b6bf00000000000080bf0000000040c11840000fb5bf40c11840000fb5bf00000000000080bf0000000080701d40803d8dbf80701d40803d8dbf00000000000080bf0000000080701d400018fabd80701d400018fabd00000000000080bf00000000c0f01c4000588abdc0f01c4000588abd00000000000080bf00000000803816400090833e803816400090833e00000000000080bf0000000040010b4000821b3f40010b4000821b3f00000000000080bf00000000406a02400069563f406a02400069563f00000000000080bf000000008069ed3f008e873f8069ed3f008e873f00000000000080bf000000008026db3f80089b3f8026db3f80089b3f00000000000080bf00000000808fb73f8042b73f808fb73f8042b73f00000000000080bf000000008029a43f002cc23f8029a43f002cc23f00000000000080bf00000000005c703f80cad83f005c703f80cad83f00000000000080bf000000000065443f0057e13f0065443f0057e13f00000000000080bf0000000000a7243f0039e63f00a7243f0039e63f00000000000080bf0000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f00000000000080bf000000000080febe00e1ea3f0080febe00e1ea3f00000000000080bf0000000000535bbf80c3de3f00535bbf80c3de3f00000000000080bf00000000004b9abf00edca3f004b9abf00edca3f00000000000080bf00000000806fa4bf004bc53f806fa4bf004bc53f00000000000080bf0000000080f4c5bf8038ab3f80f4c5bf8038ab3f00000000000080bf0000000000b5e1bf8040933f00b5e1bf8040933f00000000000080bf0000000080a6f2bf0085833f80a6f2bf0085833f00000000000080bf00000000c05001c0003f5d3fc05001c0003f5d3f00000000000080bf0000000000af08c000f3353f00af08c000f3353f00000000000080bf0000000040ab13c000caca3e40ab13c000caca3e00000000000080bf0000000040171dc000c8adbd40171dc000c8adbd00000000000080bf00000000801d1dc00038b0bd801d1dc00038b0bd00000000000080bf0000000080701dc00050cfbd80701dc00050cfbd00000000000080bf0000000080701dc0803888bf80701dc0803888bf00000000000080bf00000000403019c08015afbf403019c08015afbf00000000000080bf0000000080c013c0807fcebf80c013c0807fcebf00000000000080bf00000000008c0cc00079e7bf008c0cc00079e7bf00000000000080bf0000000040ff0bc0005ae7bf40ff0bc0005ae7bf00000000000080bf00000000800af0bf009fd4bf800af0bf009fd4bf00000000000080bf00000000001beebf0010d4bf001beebf0010d4bf00000000000080bf000000008054e0bf8057d2bf8054e0bf8057d2bf00000000000080bf000000008067dbbf00b4d3bf8067dbbf00b4d3bf00000000000080bf0000000080e0c0bf0077e8bf80e0c0bf0077e8bf00000000000080bf000000008047afbf0011e4bf8047afbf0011e4bf00000000000080bf00000000800293bf8090d2bf800293bf8090d2bf00000000000080bf0000000080be8bbf008ed2bf80be8bbf008ed2bf00000000000080bf00000000007b71bf0040debf007b71bf0040debf00000000000080bf0000000000b061bf00c2e1bf00b061bf00c2e1bf00000000000080bf00000000003e44bf80e4e0bf003e44bf80e4e0bf00000000000080bf0000000000022bbf802fd7bf00022bbf802fd7bf00000000000080bf0000000000acb9be0031acbf00acb9be0031acbf00000000000080bf000000000084aabe8020aabf0084aabe8020aabf00000000000080bf00000000008069be00e3a7bf008069be00e3a7bf00000000000080bf00000000004038be00bba1bf004038be00bba1bf00000000000080bf0000000000488cbd0089a5bf00488cbd0089a5bf00000000000080bf0000000000402c3d80e3d9bf00402c3d80e3d9bf00000000000080bf000000000010e43d00b5e6bf0010e43d00b5e6bf00000000000080bf00000000001c243e00e1eabf001c243e00e1eabf00000000000080bf000000000026f63e00e1eabf0026f63e00e1eabf00000000000080bf0000000000d0fc3e8036eabf00d0fc3e8036eabf000000000000000000000000003c0c3f804ce3bf003c0c3f804ce3bf00000000000000000000000000d0fc3e8036eabf00d0fc3e8036eabf000000000000803f00000000003c0c3f804ce3bf00d0fc3e8036eabf000000000000404000000000003c0c3f804ce3bf003c0c3f804ce3bf000000000000000000000000001f163f8069d9bf001f163f8069d9bf000000000000000000000000003c0c3f804ce3bf003c0c3f804ce3bf000000000000803f00000000001f163f8069d9bf003c0c3f804ce3bf000000000000404000000000001f163f8069d9bf001f163f8069d9bf000000000000000000000000002e1a3f0050d2bf002e1a3f0050d2bf000000000000000000000000001f163f8069d9bf001f163f8069d9bf000000000000803f00000000002e1a3f0050d2bf001f163f8069d9bf000000000000404000000000002e1a3f0050d2bf002e1a3f0050d2bf00000000000000000000000000901e3f8028c5bf00901e3f8028c5bf000000000000000000000000002e1a3f0050d2bf002e1a3f0050d2bf000000000000803f0000000000901e3f8028c5bf002e1a3f0050d2bf00000000000040400000000000901e3f8028c5bf00901e3f8028c5bf000000000000000000000000009a343f8033bfbf009a343f8033bfbf00000000000000000000000000901e3f8028c5bf00901e3f8028c5bf000000000000803f00000000009a343f8033bfbf00901e3f8028c5bf000000000000404000000000009a343f8033bfbf009a343f8033bfbf00000000000000000000000080d4803f8027d0bf80d4803f8027d0bf000000000000000000000000009a343f8033bfbf009a343f8033bfbf000000000000803f0000000080d4803f8027d0bf009a343f8033bfbf00000000000040400000000080d4803f8027d0bf80d4803f8027d0bf000000000000000000000000804f823f0010d1bf804f823f0010d1bf00000000000000000000000080d4803f8027d0bf80d4803f8027d0bf000000000000803f00000000804f823f0010d1bf80d4803f8027d0bf000000000000404000000000804f823f0010d1bf804f823f0010d1bf00000000000000000000000000d18c3f80a8d9bf00d18c3f80a8d9bf000000000000000000000000804f823f0010d1bf804f823f0010d1bf000000000000803f0000000000d18c3f80a8d9bf804f823f0010d1bf00000000000040400000000000d18c3f80a8d9bf00d18c3f80a8d9bf00000000000000000000000000b8a23f80ebd6bf00b8a23f80ebd6bf00000000000000000000000000d18c3f80a8d9bf00d18c3f80a8d9bf000000000000803f0000000000b8a23f80ebd6bf00d18c3f80a8d9bf00000000000040400000000000b8a23f80ebd6bf00b8a23f80ebd6bf0000000000000000000000000026ad3f0019cfbf0026ad3f0019cfbf00000000000000000000000000b8a23f80ebd6bf00b8a23f80ebd6bf000000000000803f000000000026ad3f0019cfbf00b8a23f80ebd6bf0000000000004040000000000026ad3f0019cfbf0026ad3f0019cfbf0000000000000000000000008064b43f0072cebf8064b43f0072cebf0000000000000000000000000026ad3f0019cfbf0026ad3f0019cfbf000000000000803f000000008064b43f0072cebf0026ad3f0019cfbf0000000000004040000000008064b43f0072cebf8064b43f0072cebf0000000000000000000000000046d23f8062ddbf0046d23f8062ddbf0000000000000000000000008064b43f0072cebf8064b43f0072cebf000000000000803f000000000046d23f8062ddbf8064b43f0072cebf0000000000004040000000000046d23f8062ddbf0046d23f8062ddbf00000000000000000000000000b8d73f8079debf00b8d73f8079debf0000000000000000000000000046d23f8062ddbf0046d23f8062ddbf000000000000803f0000000000b8d73f8079debf0046d23f8062ddbf00000000000040400000000000b8d73f8079debf00b8d73f8079debf0000000000000000000000008016f03f00e9cbbf8016f03f00e9cbbf00000000000000000000000000b8d73f8079debf00b8d73f8079debf000000000000803f000000008016f03f00e9cbbf00b8d73f8079debf0000000000004040000000008016f03f00e9cbbf8016f03f00e9cbbf000000000000000000000000002bf53f80a0cabf002bf53f80a0cabf0000000000000000000000008016f03f00e9cbbf8016f03f00e9cbbf000000000000803f00000000002bf53f80a0cabf8016f03f00e9cbbf000000000000404000000000002bf53f80a0cabf002bf53f80a0cabf000000000000000000000000001e054080f4cdbf001e054080f4cdbf000000000000000000000000002bf53f80a0cabf002bf53f80a0cabf000000000000803f00000000001e054080f4cdbf002bf53f80a0cabf000000000000404000000000001e054080f4cdbf001e054080f4cdbf00000000000000000000000080fa1040009fb9bf80fa1040009fb9bf000000000000000000000000001e054080f4cdbf001e054080f4cdbf000000000000803f0000000080fa1040009fb9bf001e054080f4cdbf00000000000040400000000080fa1040009fb9bf80fa1040009fb9bf000000000000000000000000809012400024b8bf809012400024b8bf00000000000000000000000080fa1040009fb9bf80fa1040009fb9bf000000000000803f00000000809012400024b8bf80fa1040009fb9bf000000000000404000000000809012400024b8bf809012400024b8bf000000000000000000000000805f18408034b6bf805f18408034b6bf000000000000000000000000809012400024b8bf809012400024b8bf000000000000803f00000000805f18408034b6bf809012400024b8bf000000000000404000000000805f18408034b6bf805f18408034b6bf00000000000000000000000040c11840000fb5bf40c11840000fb5bf000000000000000000000000805f18408034b6bf805f18408034b6bf000000000000803f0000000040c11840000fb5bf805f18408034b6bf00000000000040400000000040c11840000fb5bf40c11840000fb5bf00000000000000000000000080701d40803d8dbf80701d40803d8dbf00000000000000000000000040c11840000fb5bf40c11840000fb5bf000000000000803f0000000080701d40803d8dbf40c11840000fb5bf00000000000040400000000080701d40803d8dbf80701d40803d8dbf00000000000000000000000080701d400018fabd80701d400018fabd00000000000000000000000080701d40803d8dbf80701d40803d8dbf000000000000803f0000000080701d400018fabd80701d40803d8dbf00000000000040400000000080701d400018fabd80701d400018fabd000000000000000000000000c0f01c4000588abdc0f01c4000588abd00000000000000000000000080701d400018fabd80701d400018fabd000000000000803f00000000c0f01c4000588abd80701d400018fabd000000000000404000000000c0f01c4000588abdc0f01c4000588abd000000000000000000000000803816400090833e803816400090833e000000000000000000000000c0f01c4000588abdc0f01c4000588abd000000000000803f00000000803816400090833ec0f01c4000588abd000000000000404000000000803816400090833e803816400090833e00000000000000000000000040010b4000821b3f40010b4000821b3f000000000000000000000000803816400090833e803816400090833e000000000000803f0000000040010b4000821b3f803816400090833e00000000000040400000000040010b4000821b3f40010b4000821b3f000000000000000000000000406a02400069563f406a02400069563f00000000000000000000000040010b4000821b3f40010b4000821b3f000000000000803f00000000406a02400069563f40010b4000821b3f000000000000404000000000406a02400069563f406a02400069563f0000000000000000000000008069ed3f008e873f8069ed3f008e873f000000000000000000000000406a02400069563f406a02400069563f000000000000803f000000008069ed3f008e873f406a02400069563f0000000000004040000000008069ed3f008e873f8069ed3f008e873f0000000000000000000000008026db3f80089b3f8026db3f80089b3f0000000000000000000000008069ed3f008e873f8069ed3f008e873f000000000000803f000000008026db3f80089b3f8069ed3f008e873f0000000000004040000000008026db3f80089b3f8026db3f80089b3f000000000000000000000000808fb73f8042b73f808fb73f8042b73f0000000000000000000000008026db3f80089b3f8026db3f80089b3f000000000000803f00000000808fb73f8042b73f8026db3f80089b3f000000000000404000000000808fb73f8042b73f808fb73f8042b73f0000000000000000000000008029a43f002cc23f8029a43f002cc23f000000000000000000000000808fb73f8042b73f808fb73f8042b73f000000000000803f000000008029a43f002cc23f808fb73f8042b73f0000000000004040000000008029a43f002cc23f8029a43f002cc23f000000000000000000000000005c703f80cad83f005c703f80cad83f0000000000000000000000008029a43f002cc23f8029a43f002cc23f000000000000803f00000000005c703f80cad83f8029a43f002cc23f000000000000404000000000005c703f80cad83f005c703f80cad83f0000000000000000000000000065443f0057e13f0065443f0057e13f000000000000000000000000005c703f80cad83f005c703f80cad83f000000000000803f000000000065443f0057e13f005c703f80cad83f0000000000004040000000000065443f0057e13f0065443f0057e13f00000000000000000000000000a7243f0039e63f00a7243f0039e63f0000000000000000000000000065443f0057e13f0065443f0057e13f000000000000803f0000000000a7243f0039e63f0065443f0057e13f00000000000040400000000000a7243f0039e63f00a7243f0039e63f00000000000000000000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f00000000000000000000000000a7243f0039e63f00a7243f0039e63f000000000000803f0000000000d2fe3e00e1ea3f00a7243f0039e63f00000000000040400000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f0000000000000000000000000080febe00e1ea3f0080febe00e1ea3f00000000000000000000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f000000000000803f000000000080febe00e1ea3f00d2fe3e00e1ea3f0000000000004040000000000080febe00e1ea3f0080febe00e1ea3f00000000000000000000000000535bbf80c3de3f00535bbf80c3de3f0000000000000000000000000080febe00e1ea3f0080febe00e1ea3f000000000000803f0000000000535bbf80c3de3f0080febe00e1ea3f00000000000040400000000000535bbf80c3de3f00535bbf80c3de3f000000000000000000000000004b9abf00edca3f004b9abf00edca3f00000000000000000000000000535bbf80c3de3f00535bbf80c3de3f000000000000803f00000000004b9abf00edca3f00535bbf80c3de3f000000000000404000000000004b9abf00edca3f004b9abf00edca3f000000000000000000000000806fa4bf004bc53f806fa4bf004bc53f000000000000000000000000004b9abf00edca3f004b9abf00edca3f000000000000803f00000000806fa4bf004bc53f004b9abf00edca3f000000000000404000000000806fa4bf004bc53f806fa4bf004bc53f00000000000000000000000080f4c5bf8038ab3f80f4c5bf8038ab3f000000000000000000000000806fa4bf004bc53f806fa4bf004bc53f000000000000803f0000000080f4c5bf8038ab3f806fa4bf004bc53f00000000000040400000000080f4c5bf8038ab3f80f4c5bf8038ab3f00000000000000000000000000b5e1bf8040933f00b5e1bf8040933f00000000000000000000000080f4c5bf8038ab3f80f4c5bf8038ab3f000000000000803f0000000000b5e1bf8040933f80f4c5bf8038ab3f00000000000040400000000000b5e1bf8040933f00b5e1bf8040933f00000000000000000000000080a6f2bf0085833f80a6f2bf0085833f00000000000000000000000000b5e1bf8040933f00b5e1bf8040933f000000000000803f0000000080a6f2bf0085833f00b5e1bf8040933f00000000000040400000000080a6f2bf0085833f80a6f2bf0085833f000000000000000000000000c05001c0003f5d3fc05001c0003f5d3f00000000000000000000000080a6f2bf0085833f80a6f2bf0085833f000000000000803f00000000c05001c0003f5d3f80a6f2bf0085833f000000000000404000000000c05001c0003f5d3fc05001c0003f5d3f00000000000000000000000000af08c000f3353f00af08c000f3353f000000000000000000000000c05001c0003f5d3fc05001c0003f5d3f000000000000803f0000000000af08c000f3353fc05001c0003f5d3f00000000000040400000000000af08c000f3353f00af08c000f3353f00000000000000000000000040ab13c000caca3e40ab13c000caca3e00000000000000000000000000af08c000f3353f00af08c000f3353f000000000000803f0000000040ab13c000caca3e00af08c000f3353f00000000000040400000000040ab13c000caca3e40ab13c000caca3e00000000000000000000000040171dc000c8adbd40171dc000c8adbd00000000000000000000000040ab13c000caca3e40ab13c000caca3e000000000000803f0000000040171dc000c8adbd40ab13c000caca3e00000000000040400000000040171dc000c8adbd40171dc000c8adbd000000000000000000000000801d1dc00038b0bd801d1dc00038b0bd00000000000000000000000040171dc000c8adbd40171dc000c8adbd000000000000803f00000000801d1dc00038b0bd40171dc000c8adbd000000000000404000000000801d1dc00038b0bd801d1dc00038b0bd00000000000000000000000080701dc00050cfbd80701dc00050cfbd000000000000000000000000801d1dc00038b0bd801d1dc00038b0bd000000000000803f0000000080701dc00050cfbd801d1dc00038b0bd00000000000040400000000080701dc00050cfbd80701dc00050cfbd00000000000000000000000080701dc0803888bf80701dc0803888bf00000000000000000000000080701dc00050cfbd80701dc00050cfbd000000000000803f0000000080701dc0803888bf80701dc00050cfbd00000000000040400000000080701dc0803888bf80701dc0803888bf000000000000000000000000403019c08015afbf403019c08015afbf00000000000000000000000080701dc0803888bf80701dc0803888bf000000000000803f00000000403019c08015afbf80701dc0803888bf000000000000404000000000403019c08015afbf403019c08015afbf00000000000000000000000080c013c0807fcebf80c013c0807fcebf000000000000000000000000403019c08015afbf403019c08015afbf000000000000803f0000000080c013c0807fcebf403019c08015afbf00000000000040400000000080c013c0807fcebf80c013c0807fcebf000000000000000000000000008c0cc00079e7bf008c0cc00079e7bf00000000000000000000000080c013c0807fcebf80c013c0807fcebf000000000000803f00000000008c0cc00079e7bf80c013c0807fcebf000000000000404000000000008c0cc00079e7bf008c0cc00079e7bf00000000000000000000000040ff0bc0005ae7bf40ff0bc0005ae7bf000000000000000000000000008c0cc00079e7bf008c0cc00079e7bf000000000000803f0000000040ff0bc0005ae7bf008c0cc00079e7bf00000000000040400000000040ff0bc0005ae7bf40ff0bc0005ae7bf000000000000000000000000800af0bf009fd4bf800af0bf009fd4bf00000000000000000000000040ff0bc0005ae7bf40ff0bc0005ae7bf000000000000803f00000000800af0bf009fd4bf40ff0bc0005ae7bf000000000000404000000000800af0bf009fd4bf800af0bf009fd4bf000000000000000000000000001beebf0010d4bf001beebf0010d4bf000000000000000000000000800af0bf009fd4bf800af0bf009fd4bf000000000000803f00000000001beebf0010d4bf800af0bf009fd4bf000000000000404000000000001beebf0010d4bf001beebf0010d4bf0000000000000000000000008054e0bf8057d2bf8054e0bf8057d2bf000000000000000000000000001beebf0010d4bf001beebf0010d4bf000000000000803f000000008054e0bf8057d2bf001beebf0010d4bf0000000000004040000000008054e0bf8057d2bf8054e0bf8057d2bf0000000000000000000000008067dbbf00b4d3bf8067dbbf00b4d3bf0000000000000000000000008054e0bf8057d2bf8054e0bf8057d2bf000000000000803f000000008067dbbf00b4d3bf8054e0bf8057d2bf0000000000004040000000008067dbbf00b4d3bf8067dbbf00b4d3bf00000000000000000000000080e0c0bf0077e8bf80e0c0bf0077e8bf0000000000000000000000008067dbbf00b4d3bf8067dbbf00b4d3bf000000000000803f0000000080e0c0bf0077e8bf8067dbbf00b4d3bf00000000000040400000000080e0c0bf0077e8bf80e0c0bf0077e8bf0000000000000000000000008047afbf0011e4bf8047afbf0011e4bf00000000000000000000000080e0c0bf0077e8bf80e0c0bf0077e8bf000000000000803f000000008047afbf0011e4bf80e0c0bf0077e8bf0000000000004040000000008047afbf0011e4bf8047afbf0011e4bf000000000000000000000000800293bf8090d2bf800293bf8090d2bf0000000000000000000000008047afbf0011e4bf8047afbf0011e4bf000000000000803f00000000800293bf8090d2bf8047afbf0011e4bf000000000000404000000000800293bf8090d2bf800293bf8090d2bf00000000000000000000000080be8bbf008ed2bf80be8bbf008ed2bf000000000000000000000000800293bf8090d2bf800293bf8090d2bf000000000000803f0000000080be8bbf008ed2bf800293bf8090d2bf00000000000040400000000080be8bbf008ed2bf80be8bbf008ed2bf000000000000000000000000007b71bf0040debf007b71bf0040debf00000000000000000000000080be8bbf008ed2bf80be8bbf008ed2bf000000000000803f00000000007b71bf0040debf80be8bbf008ed2bf000000000000404000000000007b71bf0040debf007b71bf0040debf00000000000000000000000000b061bf00c2e1bf00b061bf00c2e1bf000000000000000000000000007b71bf0040debf007b71bf0040debf000000000000803f0000000000b061bf00c2e1bf007b71bf0040debf00000000000040400000000000b061bf00c2e1bf00b061bf00c2e1bf000000000000000000000000003e44bf80e4e0bf003e44bf80e4e0bf00000000000000000000000000b061bf00c2e1bf00b061bf00c2e1bf000000000000803f00000000003e44bf80e4e0bf00b061bf00c2e1bf000000000000404000000000003e44bf80e4e0bf003e44bf80e4e0bf00000000000000000000000000022bbf802fd7bf00022bbf802fd7bf000000000000000000000000003e44bf80e4e0bf003e44bf80e4e0bf000000000000803f0000000000022bbf802fd7bf003e44bf80e4e0bf00000000000040400000000000022bbf802fd7bf00022bbf802fd7bf00000000000000000000000000acb9be0031acbf00acb9be0031acbf00000000000000000000000000022bbf802fd7bf00022bbf802fd7bf000000000000803f0000000000acb9be0031acbf00022bbf802fd7bf00000000000040400000000000acb9be0031acbf00acb9be0031acbf0000000000000000000000000084aabe8020aabf0084aabe8020aabf00000000000000000000000000acb9be0031acbf00acb9be0031acbf000000000000803f000000000084aabe8020aabf00acb9be0031acbf0000000000004040000000000084aabe8020aabf0084aabe8020aabf000000000000000000000000008069be00e3a7bf008069be00e3a7bf0000000000000000000000000084aabe8020aabf0084aabe8020aabf000000000000803f00000000008069be00e3a7bf0084aabe8020aabf000000000000404000000000008069be00e3a7bf008069be00e3a7bf000000000000000000000000004038be00bba1bf004038be00bba1bf000000000000000000000000008069be00e3a7bf008069be00e3a7bf000000000000803f00000000004038be00bba1bf008069be00e3a7bf000000000000404000000000004038be00bba1bf004038be00bba1bf00000000000000000000000000488cbd0089a5bf00488cbd0089a5bf000000000000000000000000004038be00bba1bf004038be00bba1bf000000000000803f0000000000488cbd0089a5bf004038be00bba1bf00000000000040400000000000488cbd0089a5bf00488cbd0089a5bf00000000000000000000000000402c3d80e3d9bf00402c3d80e3d9bf00000000000000000000000000488cbd0089a5bf00488cbd0089a5bf000000000000803f0000000000402c3d80e3d9bf00488cbd0089a5bf00000000000040400000000000402c3d80e3d9bf00402c3d80e3d9bf0000000000000000000000000010e43d00b5e6bf0010e43d00b5e6bf00000000000000000000000000402c3d80e3d9bf00402c3d80e3d9bf000000000000803f000000000010e43d00b5e6bf00402c3d80e3d9bf0000000000004040000000000010e43d00b5e6bf0010e43d00b5e6bf000000000000000000000000001c243e00e1eabf001c243e00e1eabf0000000000000000000000000010e43d00b5e6bf0010e43d00b5e6bf000000000000803f00000000001c243e00e1eabf0010e43d00b5e6bf000000000000404000000000001c243e00e1eabf001c243e00e1eabf0000000000000000000000000026f63e00e1eabf0026f63e00e1eabf000000000000000000000000001c243e00e1eabf001c243e00e1eabf000000000000803f000000000026f63e00e1eabf001c243e00e1eabf0000000000004040000000000026f63e00e1eabf0026f63e00e1eabf00000000000000000000000000d0fc3e8036eabf00d0fc3e8036eabf0000000000000000000000000026f63e00e1eabf0026f63e00e1eabf000000000000803f0000000000d0fc3e8036eabf0026f63e00e1eabf00000000000040400000000000d0fc3e8036eabf + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_MeshUsageFlags: 0 + m_CookingOptions: 30 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + 'm_MeshMetrics[0]': 1 + 'm_MeshMetrics[1]': 1 + m_MeshOptimizationFlags: 1 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: + m_MeshLodInfo: + serializedVersion: 2 + m_LodSelectionCurve: + serializedVersion: 1 + m_LodSlope: 0 + m_LodBias: 0 + m_NumLevels: 1 + m_SubMeshes: + - serializedVersion: 2 + m_Levels: + - serializedVersion: 1 + m_IndexStart: 0 + m_IndexCount: 0 +--- !u!1 &1374772171 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1374772174} + - component: {fileID: 1374772173} + - component: {fileID: 1374772172} + m_Layer: 0 + m_Name: Sprite_Coral_round BG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1374772172 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1374772171} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7db70e0ea77f5ac47a8f4565a9406397, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.ShadowCaster2D + m_ShadowGroup: 0 + m_Priority: 0 + m_ComponentVersion: 5 + m_HasRenderer: 1 + m_UseRendererSilhouette: 1 + m_CastsShadows: 1 + m_SelfShadows: 0 + m_AlphaCutoff: 0.1 + m_ApplyToSortingLayers: eb0feddf00000000e980ef06 + m_ShapePath: + - {x: -2.5600004, y: -1.935, z: 0} + - {x: -2.5600004, y: 1.935, z: 0} + - {x: 2.5600002, y: 1.935, z: 0} + - {x: 2.5600002, y: -1.935, z: 0} + m_ShapePathHash: 0 + m_InstanceId: 0 + m_ShadowShape2DComponent: {fileID: 1374772173} + m_ShadowShape2DProvider: + rid: 1074215597368148049 + m_ShadowCastingSource: 2 + m_ShadowMesh: + m_Mesh: {fileID: 2040016249} + m_LocalBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.4599915, y: 1.8349915, z: 0} + m_EdgeProcessing: 1 + m_TrimEdge: 0.1 + m_FlipX: 0 + m_FlipY: 0 + m_InitialTrim: 0 + m_CastingOption: 1 + m_PreviousTrimEdge: 0.1 + m_PreviousEdgeProcessing: 1 + m_PreviousShadowCastingSource: 2 + m_PreviousShadowShape2DSource: {fileID: 1374772173} + references: + version: 2 + RefIds: + - rid: 1074215597368148049 + type: {class: ShadowShape2DProvider_SpriteRenderer, ns: UnityEngine.Rendering.Universal, + asm: Unity.RenderPipelines.Universal.2D.Runtime} + data: +--- !u!212 &1374772173 +SpriteRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1374772171} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: -538112021 + m_SortingLayer: -1 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_Sprite: {fileID: -6091329584399971573, guid: 734039631e6f77248b04a79e9dded059, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 5.12, y: 3.87} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_SpriteSortPoint: 0 +--- !u!4 &1374772174 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1374772171} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -5, y: 0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1398446539 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1398446541} + - component: {fileID: 1398446540} + m_Layer: 0 + m_Name: Spot Light 2D (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1398446540 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1398446539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 073797afb82c5a1438f328866b10b3f0, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.Light2D + m_ComponentVersion: 2 + m_LightType: 3 + m_BlendStyleIndex: 0 + m_FalloffIntensity: 0.5 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_LightVolumeIntensity: 1 + m_LightVolumeEnabled: 0 + m_ApplyToSortingLayers: 00000000 + m_LightCookieSprite: {fileID: 0} + m_DeprecatedPointLightCookieSprite: {fileID: 0} + m_LightOrder: 0 + m_AlphaBlendOnOverlap: 0 + m_OverlapOperation: 0 + m_NormalMapDistance: 3 + m_NormalMapQuality: 1 + m_UseNormalMap: 0 + m_ShadowsEnabled: 1 + m_ShadowIntensity: 0.75 + m_ShadowSoftness: 0.3 + m_ShadowSoftnessFalloffIntensity: 0.5 + m_ShadowVolumeIntensityEnabled: 0 + m_ShadowVolumeIntensity: 0.75 + m_LocalBounds: + m_Center: {x: 0, y: -0.00000011920929, z: 0} + m_Extent: {x: 0.9985302, y: 0.99853027, z: 0} + m_PointLightInnerAngle: 360 + m_PointLightOuterAngle: 360 + m_PointLightInnerRadius: 5 + m_PointLightOuterRadius: 10 + m_ShapeLightParametricSides: 5 + m_ShapeLightParametricAngleOffset: 0 + m_ShapeLightParametricRadius: 1 + m_ShapeLightFalloffSize: 0.5 + m_ShapeLightFalloffOffset: {x: 0, y: 0} + m_ShapePath: + - {x: -0.5, y: -0.5, z: 0} + - {x: 0.5, y: -0.5, z: 0} + - {x: 0.5, y: 0.5, z: 0} + - {x: -0.5, y: 0.5, z: 0} +--- !u!4 &1398446541 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1398446539} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1708032148 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1708032151} + - component: {fileID: 1708032150} + - component: {fileID: 1708032149} + m_Layer: 0 + m_Name: Sprite_Coral_round Default + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1708032149 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1708032148} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7db70e0ea77f5ac47a8f4565a9406397, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.ShadowCaster2D + m_ShadowGroup: 0 + m_Priority: 0 + m_ComponentVersion: 5 + m_HasRenderer: 1 + m_UseRendererSilhouette: 1 + m_CastsShadows: 1 + m_SelfShadows: 0 + m_AlphaCutoff: 0.1 + m_ApplyToSortingLayers: 00000000 + m_ShapePath: + - {x: -2.5600002, y: -1.935, z: 0} + - {x: -2.5600002, y: 1.935, z: 0} + - {x: 2.5600002, y: 1.935, z: 0} + - {x: 2.5600002, y: -1.935, z: 0} + m_ShapePathHash: 0 + m_InstanceId: 0 + m_ShadowShape2DComponent: {fileID: 1708032150} + m_ShadowShape2DProvider: + rid: 1074215597368148050 + m_ShadowCastingSource: 2 + m_ShadowMesh: + m_Mesh: {fileID: 964297794} + m_LocalBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.4599915, y: 1.8349915, z: 0} + m_EdgeProcessing: 1 + m_TrimEdge: 0.1 + m_FlipX: 0 + m_FlipY: 0 + m_InitialTrim: 0 + m_CastingOption: 1 + m_PreviousTrimEdge: 0.1 + m_PreviousEdgeProcessing: 1 + m_PreviousShadowCastingSource: 2 + m_PreviousShadowShape2DSource: {fileID: 1708032150} + references: + version: 2 + RefIds: + - rid: 1074215597368148050 + type: {class: ShadowShape2DProvider_SpriteRenderer, ns: UnityEngine.Rendering.Universal, + asm: Unity.RenderPipelines.Universal.2D.Runtime} + data: +--- !u!212 &1708032150 +SpriteRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1708032148} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_Sprite: {fileID: -6091329584399971573, guid: 734039631e6f77248b04a79e9dded059, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 5.12, y: 3.87} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_SpriteSortPoint: 0 +--- !u!4 &1708032151 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1708032148} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!43 &2040016249 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 12 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 666 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 370 + localAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.4599915, y: 1.8349915, z: 0} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_BonesAABB: [] + m_VariableBoneCountWeights: + m_Data: + m_MeshCompression: 0 + m_IsReadable: 1 + m_KeepVertices: 0 + m_KeepIndices: 0 + m_IndexFormat: 0 + m_IndexBuffer: 00004a004b004b000100000001004e004f004f000200010002005200530053000300020003005600570057000400030004005a005b005b000500040005005e005f005f000600050006006200630063000700060007006600670067000800070008006a006b006b000900080009006e006f006f000a0009000a007200730073000b000a000b007600770077000c000b000c007a007b007b000d000c000d007e007f007f000e000d000e008200830083000f000e000f0086008700870010000f0010008a008b008b001100100011008e008f008f001200110012009200930093001300120013009600970097001400130014009a009b009b001500140015009e009f009f00160015001600a200a300a300170016001700a600a700a700180017001800aa00ab00ab00190018001900ae00af00af001a0019001a00b200b300b3001b001a001b00b600b700b7001c001b001c00ba00bb00bb001d001c001d00be00bf00bf001e001d001e00c200c300c3001f001e001f00c600c700c70020001f002000ca00cb00cb00210020002100ce00cf00cf00220021002200d200d300d300230022002300d600d700d700240023002400da00db00db00250024002500de00df00df00260025002600e200e300e300270026002700e600e700e700280027002800ea00eb00eb00290028002900ee00ef00ef002a0029002a00f200f300f3002b002a002b00f600f700f7002c002b002c00fa00fb00fb002d002c002d00fe00ff00ff002e002d002e000201030103012f002e002f0006010701070130002f0030000a010b010b013100300031000e010f010f013200310032001201130113013300320033001601170117013400330034001a011b011b013500340035001e011f011f013600350036002201230123013700360037002601270127013800370038002a012b012b013900380039002e012f012f013a0039003a003201330133013b003a003b003601370137013c003b003c003a013b013b013d003c003d003e013f013f013e003d003e004201430143013f003e003f0046014701470140003f0040004a014b014b014100400041004e014f014f014200410042005201530153014300420043005601570157014400430044005a015b015b014500440045005e015f015f014600450046006201630163014700460047006601670167014800470048006a016b016b014900480049006e016f016f010000490000004c004d0001005000510002005400550003005800590004005c005d0005006000610006006400650007006800690008006c006d000900700071000a00740075000b00780079000c007c007d000d00800081000e00840085000f008800890010008c008d0011009000910012009400950013009800990014009c009d001500a000a1001600a400a5001700a800a9001800ac00ad001900b000b1001a00b400b5001b00b800b9001c00bc00bd001d00c000c1001e00c400c5001f00c800c9002000cc00cd002100d000d1002200d400d5002300d800d9002400dc00dd002500e000e1002600e400e5002700e800e9002800ec00ed002900f000f1002a00f400f5002b00f800f9002c00fc00fd002d00000101012e00040105012f000801090130000c010d0131001001110132001401150133001801190134001c011d0135002001210136002401250137002801290138002c012d013900300131013a00340135013b00380139013c003c013d013d00400141013e00440145013f004801490140004c014d0141005001510142005401550143005801590144005c015d0145006001610146006401650147006801690148006c016d01490070017101 + m_VertexData: + serializedVersion: 3 + m_VertexCount: 370 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 12 + format: 0 + dimension: 4 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 10360 + _typelessdata: 00d0fc3e8036eabf00000000000080bf00000000003c0c3f804ce3bf003c0c3f804ce3bf00000000000080bf00000000001f163f8069d9bf001f163f8069d9bf00000000000080bf00000000002e1a3f0050d2bf002e1a3f0050d2bf00000000000080bf0000000000901e3f8028c5bf00901e3f8028c5bf00000000000080bf00000000009a343f8033bfbf009a343f8033bfbf00000000000080bf0000000080d4803f8027d0bf80d4803f8027d0bf00000000000080bf00000000804f823f0010d1bf804f823f0010d1bf00000000000080bf0000000000d18c3f80a8d9bf00d18c3f80a8d9bf00000000000080bf0000000000b8a23f80ebd6bf00b8a23f80ebd6bf00000000000080bf000000000026ad3f0019cfbf0026ad3f0019cfbf00000000000080bf000000008064b43f0072cebf8064b43f0072cebf00000000000080bf000000000046d23f8062ddbf0046d23f8062ddbf00000000000080bf0000000000b8d73f8079debf00b8d73f8079debf00000000000080bf000000008016f03f00e9cbbf8016f03f00e9cbbf00000000000080bf00000000002bf53f80a0cabf002bf53f80a0cabf00000000000080bf00000000001e054080f4cdbf001e054080f4cdbf00000000000080bf0000000080fa1040009fb9bf80fa1040009fb9bf00000000000080bf00000000809012400024b8bf809012400024b8bf00000000000080bf00000000805f18408034b6bf805f18408034b6bf00000000000080bf0000000040c11840000fb5bf40c11840000fb5bf00000000000080bf0000000080701d40803d8dbf80701d40803d8dbf00000000000080bf0000000080701d400018fabd80701d400018fabd00000000000080bf00000000c0f01c4000588abdc0f01c4000588abd00000000000080bf00000000803816400090833e803816400090833e00000000000080bf0000000040010b4000821b3f40010b4000821b3f00000000000080bf00000000406a02400069563f406a02400069563f00000000000080bf000000008069ed3f008e873f8069ed3f008e873f00000000000080bf000000008026db3f80089b3f8026db3f80089b3f00000000000080bf00000000808fb73f8042b73f808fb73f8042b73f00000000000080bf000000008029a43f002cc23f8029a43f002cc23f00000000000080bf00000000005c703f80cad83f005c703f80cad83f00000000000080bf000000000065443f0057e13f0065443f0057e13f00000000000080bf0000000000a7243f0039e63f00a7243f0039e63f00000000000080bf0000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f00000000000080bf000000000080febe00e1ea3f0080febe00e1ea3f00000000000080bf0000000000535bbf80c3de3f00535bbf80c3de3f00000000000080bf00000000004b9abf00edca3f004b9abf00edca3f00000000000080bf00000000806fa4bf004bc53f806fa4bf004bc53f00000000000080bf0000000080f4c5bf8038ab3f80f4c5bf8038ab3f00000000000080bf0000000000b5e1bf8040933f00b5e1bf8040933f00000000000080bf0000000080a6f2bf0085833f80a6f2bf0085833f00000000000080bf00000000c05001c0003f5d3fc05001c0003f5d3f00000000000080bf0000000000af08c000f3353f00af08c000f3353f00000000000080bf0000000040ab13c000caca3e40ab13c000caca3e00000000000080bf0000000040171dc000c8adbd40171dc000c8adbd00000000000080bf00000000801d1dc00038b0bd801d1dc00038b0bd00000000000080bf0000000080701dc00050cfbd80701dc00050cfbd00000000000080bf0000000080701dc0803888bf80701dc0803888bf00000000000080bf00000000403019c08015afbf403019c08015afbf00000000000080bf0000000080c013c0807fcebf80c013c0807fcebf00000000000080bf00000000008c0cc00079e7bf008c0cc00079e7bf00000000000080bf0000000040ff0bc0005ae7bf40ff0bc0005ae7bf00000000000080bf00000000800af0bf009fd4bf800af0bf009fd4bf00000000000080bf00000000001beebf0010d4bf001beebf0010d4bf00000000000080bf000000008054e0bf8057d2bf8054e0bf8057d2bf00000000000080bf000000008067dbbf00b4d3bf8067dbbf00b4d3bf00000000000080bf0000000080e0c0bf0077e8bf80e0c0bf0077e8bf00000000000080bf000000008047afbf0011e4bf8047afbf0011e4bf00000000000080bf00000000800293bf8090d2bf800293bf8090d2bf00000000000080bf0000000080be8bbf008ed2bf80be8bbf008ed2bf00000000000080bf00000000007b71bf0040debf007b71bf0040debf00000000000080bf0000000000b061bf00c2e1bf00b061bf00c2e1bf00000000000080bf00000000003e44bf80e4e0bf003e44bf80e4e0bf00000000000080bf0000000000022bbf802fd7bf00022bbf802fd7bf00000000000080bf0000000000acb9be0031acbf00acb9be0031acbf00000000000080bf000000000084aabe8020aabf0084aabe8020aabf00000000000080bf00000000008069be00e3a7bf008069be00e3a7bf00000000000080bf00000000004038be00bba1bf004038be00bba1bf00000000000080bf0000000000488cbd0089a5bf00488cbd0089a5bf00000000000080bf0000000000402c3d80e3d9bf00402c3d80e3d9bf00000000000080bf000000000010e43d00b5e6bf0010e43d00b5e6bf00000000000080bf00000000001c243e00e1eabf001c243e00e1eabf00000000000080bf000000000026f63e00e1eabf0026f63e00e1eabf00000000000080bf0000000000d0fc3e8036eabf00d0fc3e8036eabf000000000000000000000000003c0c3f804ce3bf003c0c3f804ce3bf00000000000000000000000000d0fc3e8036eabf00d0fc3e8036eabf000000000000803f00000000003c0c3f804ce3bf00d0fc3e8036eabf000000000000404000000000003c0c3f804ce3bf003c0c3f804ce3bf000000000000000000000000001f163f8069d9bf001f163f8069d9bf000000000000000000000000003c0c3f804ce3bf003c0c3f804ce3bf000000000000803f00000000001f163f8069d9bf003c0c3f804ce3bf000000000000404000000000001f163f8069d9bf001f163f8069d9bf000000000000000000000000002e1a3f0050d2bf002e1a3f0050d2bf000000000000000000000000001f163f8069d9bf001f163f8069d9bf000000000000803f00000000002e1a3f0050d2bf001f163f8069d9bf000000000000404000000000002e1a3f0050d2bf002e1a3f0050d2bf00000000000000000000000000901e3f8028c5bf00901e3f8028c5bf000000000000000000000000002e1a3f0050d2bf002e1a3f0050d2bf000000000000803f0000000000901e3f8028c5bf002e1a3f0050d2bf00000000000040400000000000901e3f8028c5bf00901e3f8028c5bf000000000000000000000000009a343f8033bfbf009a343f8033bfbf00000000000000000000000000901e3f8028c5bf00901e3f8028c5bf000000000000803f00000000009a343f8033bfbf00901e3f8028c5bf000000000000404000000000009a343f8033bfbf009a343f8033bfbf00000000000000000000000080d4803f8027d0bf80d4803f8027d0bf000000000000000000000000009a343f8033bfbf009a343f8033bfbf000000000000803f0000000080d4803f8027d0bf009a343f8033bfbf00000000000040400000000080d4803f8027d0bf80d4803f8027d0bf000000000000000000000000804f823f0010d1bf804f823f0010d1bf00000000000000000000000080d4803f8027d0bf80d4803f8027d0bf000000000000803f00000000804f823f0010d1bf80d4803f8027d0bf000000000000404000000000804f823f0010d1bf804f823f0010d1bf00000000000000000000000000d18c3f80a8d9bf00d18c3f80a8d9bf000000000000000000000000804f823f0010d1bf804f823f0010d1bf000000000000803f0000000000d18c3f80a8d9bf804f823f0010d1bf00000000000040400000000000d18c3f80a8d9bf00d18c3f80a8d9bf00000000000000000000000000b8a23f80ebd6bf00b8a23f80ebd6bf00000000000000000000000000d18c3f80a8d9bf00d18c3f80a8d9bf000000000000803f0000000000b8a23f80ebd6bf00d18c3f80a8d9bf00000000000040400000000000b8a23f80ebd6bf00b8a23f80ebd6bf0000000000000000000000000026ad3f0019cfbf0026ad3f0019cfbf00000000000000000000000000b8a23f80ebd6bf00b8a23f80ebd6bf000000000000803f000000000026ad3f0019cfbf00b8a23f80ebd6bf0000000000004040000000000026ad3f0019cfbf0026ad3f0019cfbf0000000000000000000000008064b43f0072cebf8064b43f0072cebf0000000000000000000000000026ad3f0019cfbf0026ad3f0019cfbf000000000000803f000000008064b43f0072cebf0026ad3f0019cfbf0000000000004040000000008064b43f0072cebf8064b43f0072cebf0000000000000000000000000046d23f8062ddbf0046d23f8062ddbf0000000000000000000000008064b43f0072cebf8064b43f0072cebf000000000000803f000000000046d23f8062ddbf8064b43f0072cebf0000000000004040000000000046d23f8062ddbf0046d23f8062ddbf00000000000000000000000000b8d73f8079debf00b8d73f8079debf0000000000000000000000000046d23f8062ddbf0046d23f8062ddbf000000000000803f0000000000b8d73f8079debf0046d23f8062ddbf00000000000040400000000000b8d73f8079debf00b8d73f8079debf0000000000000000000000008016f03f00e9cbbf8016f03f00e9cbbf00000000000000000000000000b8d73f8079debf00b8d73f8079debf000000000000803f000000008016f03f00e9cbbf00b8d73f8079debf0000000000004040000000008016f03f00e9cbbf8016f03f00e9cbbf000000000000000000000000002bf53f80a0cabf002bf53f80a0cabf0000000000000000000000008016f03f00e9cbbf8016f03f00e9cbbf000000000000803f00000000002bf53f80a0cabf8016f03f00e9cbbf000000000000404000000000002bf53f80a0cabf002bf53f80a0cabf000000000000000000000000001e054080f4cdbf001e054080f4cdbf000000000000000000000000002bf53f80a0cabf002bf53f80a0cabf000000000000803f00000000001e054080f4cdbf002bf53f80a0cabf000000000000404000000000001e054080f4cdbf001e054080f4cdbf00000000000000000000000080fa1040009fb9bf80fa1040009fb9bf000000000000000000000000001e054080f4cdbf001e054080f4cdbf000000000000803f0000000080fa1040009fb9bf001e054080f4cdbf00000000000040400000000080fa1040009fb9bf80fa1040009fb9bf000000000000000000000000809012400024b8bf809012400024b8bf00000000000000000000000080fa1040009fb9bf80fa1040009fb9bf000000000000803f00000000809012400024b8bf80fa1040009fb9bf000000000000404000000000809012400024b8bf809012400024b8bf000000000000000000000000805f18408034b6bf805f18408034b6bf000000000000000000000000809012400024b8bf809012400024b8bf000000000000803f00000000805f18408034b6bf809012400024b8bf000000000000404000000000805f18408034b6bf805f18408034b6bf00000000000000000000000040c11840000fb5bf40c11840000fb5bf000000000000000000000000805f18408034b6bf805f18408034b6bf000000000000803f0000000040c11840000fb5bf805f18408034b6bf00000000000040400000000040c11840000fb5bf40c11840000fb5bf00000000000000000000000080701d40803d8dbf80701d40803d8dbf00000000000000000000000040c11840000fb5bf40c11840000fb5bf000000000000803f0000000080701d40803d8dbf40c11840000fb5bf00000000000040400000000080701d40803d8dbf80701d40803d8dbf00000000000000000000000080701d400018fabd80701d400018fabd00000000000000000000000080701d40803d8dbf80701d40803d8dbf000000000000803f0000000080701d400018fabd80701d40803d8dbf00000000000040400000000080701d400018fabd80701d400018fabd000000000000000000000000c0f01c4000588abdc0f01c4000588abd00000000000000000000000080701d400018fabd80701d400018fabd000000000000803f00000000c0f01c4000588abd80701d400018fabd000000000000404000000000c0f01c4000588abdc0f01c4000588abd000000000000000000000000803816400090833e803816400090833e000000000000000000000000c0f01c4000588abdc0f01c4000588abd000000000000803f00000000803816400090833ec0f01c4000588abd000000000000404000000000803816400090833e803816400090833e00000000000000000000000040010b4000821b3f40010b4000821b3f000000000000000000000000803816400090833e803816400090833e000000000000803f0000000040010b4000821b3f803816400090833e00000000000040400000000040010b4000821b3f40010b4000821b3f000000000000000000000000406a02400069563f406a02400069563f00000000000000000000000040010b4000821b3f40010b4000821b3f000000000000803f00000000406a02400069563f40010b4000821b3f000000000000404000000000406a02400069563f406a02400069563f0000000000000000000000008069ed3f008e873f8069ed3f008e873f000000000000000000000000406a02400069563f406a02400069563f000000000000803f000000008069ed3f008e873f406a02400069563f0000000000004040000000008069ed3f008e873f8069ed3f008e873f0000000000000000000000008026db3f80089b3f8026db3f80089b3f0000000000000000000000008069ed3f008e873f8069ed3f008e873f000000000000803f000000008026db3f80089b3f8069ed3f008e873f0000000000004040000000008026db3f80089b3f8026db3f80089b3f000000000000000000000000808fb73f8042b73f808fb73f8042b73f0000000000000000000000008026db3f80089b3f8026db3f80089b3f000000000000803f00000000808fb73f8042b73f8026db3f80089b3f000000000000404000000000808fb73f8042b73f808fb73f8042b73f0000000000000000000000008029a43f002cc23f8029a43f002cc23f000000000000000000000000808fb73f8042b73f808fb73f8042b73f000000000000803f000000008029a43f002cc23f808fb73f8042b73f0000000000004040000000008029a43f002cc23f8029a43f002cc23f000000000000000000000000005c703f80cad83f005c703f80cad83f0000000000000000000000008029a43f002cc23f8029a43f002cc23f000000000000803f00000000005c703f80cad83f8029a43f002cc23f000000000000404000000000005c703f80cad83f005c703f80cad83f0000000000000000000000000065443f0057e13f0065443f0057e13f000000000000000000000000005c703f80cad83f005c703f80cad83f000000000000803f000000000065443f0057e13f005c703f80cad83f0000000000004040000000000065443f0057e13f0065443f0057e13f00000000000000000000000000a7243f0039e63f00a7243f0039e63f0000000000000000000000000065443f0057e13f0065443f0057e13f000000000000803f0000000000a7243f0039e63f0065443f0057e13f00000000000040400000000000a7243f0039e63f00a7243f0039e63f00000000000000000000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f00000000000000000000000000a7243f0039e63f00a7243f0039e63f000000000000803f0000000000d2fe3e00e1ea3f00a7243f0039e63f00000000000040400000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f0000000000000000000000000080febe00e1ea3f0080febe00e1ea3f00000000000000000000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f000000000000803f000000000080febe00e1ea3f00d2fe3e00e1ea3f0000000000004040000000000080febe00e1ea3f0080febe00e1ea3f00000000000000000000000000535bbf80c3de3f00535bbf80c3de3f0000000000000000000000000080febe00e1ea3f0080febe00e1ea3f000000000000803f0000000000535bbf80c3de3f0080febe00e1ea3f00000000000040400000000000535bbf80c3de3f00535bbf80c3de3f000000000000000000000000004b9abf00edca3f004b9abf00edca3f00000000000000000000000000535bbf80c3de3f00535bbf80c3de3f000000000000803f00000000004b9abf00edca3f00535bbf80c3de3f000000000000404000000000004b9abf00edca3f004b9abf00edca3f000000000000000000000000806fa4bf004bc53f806fa4bf004bc53f000000000000000000000000004b9abf00edca3f004b9abf00edca3f000000000000803f00000000806fa4bf004bc53f004b9abf00edca3f000000000000404000000000806fa4bf004bc53f806fa4bf004bc53f00000000000000000000000080f4c5bf8038ab3f80f4c5bf8038ab3f000000000000000000000000806fa4bf004bc53f806fa4bf004bc53f000000000000803f0000000080f4c5bf8038ab3f806fa4bf004bc53f00000000000040400000000080f4c5bf8038ab3f80f4c5bf8038ab3f00000000000000000000000000b5e1bf8040933f00b5e1bf8040933f00000000000000000000000080f4c5bf8038ab3f80f4c5bf8038ab3f000000000000803f0000000000b5e1bf8040933f80f4c5bf8038ab3f00000000000040400000000000b5e1bf8040933f00b5e1bf8040933f00000000000000000000000080a6f2bf0085833f80a6f2bf0085833f00000000000000000000000000b5e1bf8040933f00b5e1bf8040933f000000000000803f0000000080a6f2bf0085833f00b5e1bf8040933f00000000000040400000000080a6f2bf0085833f80a6f2bf0085833f000000000000000000000000c05001c0003f5d3fc05001c0003f5d3f00000000000000000000000080a6f2bf0085833f80a6f2bf0085833f000000000000803f00000000c05001c0003f5d3f80a6f2bf0085833f000000000000404000000000c05001c0003f5d3fc05001c0003f5d3f00000000000000000000000000af08c000f3353f00af08c000f3353f000000000000000000000000c05001c0003f5d3fc05001c0003f5d3f000000000000803f0000000000af08c000f3353fc05001c0003f5d3f00000000000040400000000000af08c000f3353f00af08c000f3353f00000000000000000000000040ab13c000caca3e40ab13c000caca3e00000000000000000000000000af08c000f3353f00af08c000f3353f000000000000803f0000000040ab13c000caca3e00af08c000f3353f00000000000040400000000040ab13c000caca3e40ab13c000caca3e00000000000000000000000040171dc000c8adbd40171dc000c8adbd00000000000000000000000040ab13c000caca3e40ab13c000caca3e000000000000803f0000000040171dc000c8adbd40ab13c000caca3e00000000000040400000000040171dc000c8adbd40171dc000c8adbd000000000000000000000000801d1dc00038b0bd801d1dc00038b0bd00000000000000000000000040171dc000c8adbd40171dc000c8adbd000000000000803f00000000801d1dc00038b0bd40171dc000c8adbd000000000000404000000000801d1dc00038b0bd801d1dc00038b0bd00000000000000000000000080701dc00050cfbd80701dc00050cfbd000000000000000000000000801d1dc00038b0bd801d1dc00038b0bd000000000000803f0000000080701dc00050cfbd801d1dc00038b0bd00000000000040400000000080701dc00050cfbd80701dc00050cfbd00000000000000000000000080701dc0803888bf80701dc0803888bf00000000000000000000000080701dc00050cfbd80701dc00050cfbd000000000000803f0000000080701dc0803888bf80701dc00050cfbd00000000000040400000000080701dc0803888bf80701dc0803888bf000000000000000000000000403019c08015afbf403019c08015afbf00000000000000000000000080701dc0803888bf80701dc0803888bf000000000000803f00000000403019c08015afbf80701dc0803888bf000000000000404000000000403019c08015afbf403019c08015afbf00000000000000000000000080c013c0807fcebf80c013c0807fcebf000000000000000000000000403019c08015afbf403019c08015afbf000000000000803f0000000080c013c0807fcebf403019c08015afbf00000000000040400000000080c013c0807fcebf80c013c0807fcebf000000000000000000000000008c0cc00079e7bf008c0cc00079e7bf00000000000000000000000080c013c0807fcebf80c013c0807fcebf000000000000803f00000000008c0cc00079e7bf80c013c0807fcebf000000000000404000000000008c0cc00079e7bf008c0cc00079e7bf00000000000000000000000040ff0bc0005ae7bf40ff0bc0005ae7bf000000000000000000000000008c0cc00079e7bf008c0cc00079e7bf000000000000803f0000000040ff0bc0005ae7bf008c0cc00079e7bf00000000000040400000000040ff0bc0005ae7bf40ff0bc0005ae7bf000000000000000000000000800af0bf009fd4bf800af0bf009fd4bf00000000000000000000000040ff0bc0005ae7bf40ff0bc0005ae7bf000000000000803f00000000800af0bf009fd4bf40ff0bc0005ae7bf000000000000404000000000800af0bf009fd4bf800af0bf009fd4bf000000000000000000000000001beebf0010d4bf001beebf0010d4bf000000000000000000000000800af0bf009fd4bf800af0bf009fd4bf000000000000803f00000000001beebf0010d4bf800af0bf009fd4bf000000000000404000000000001beebf0010d4bf001beebf0010d4bf0000000000000000000000008054e0bf8057d2bf8054e0bf8057d2bf000000000000000000000000001beebf0010d4bf001beebf0010d4bf000000000000803f000000008054e0bf8057d2bf001beebf0010d4bf0000000000004040000000008054e0bf8057d2bf8054e0bf8057d2bf0000000000000000000000008067dbbf00b4d3bf8067dbbf00b4d3bf0000000000000000000000008054e0bf8057d2bf8054e0bf8057d2bf000000000000803f000000008067dbbf00b4d3bf8054e0bf8057d2bf0000000000004040000000008067dbbf00b4d3bf8067dbbf00b4d3bf00000000000000000000000080e0c0bf0077e8bf80e0c0bf0077e8bf0000000000000000000000008067dbbf00b4d3bf8067dbbf00b4d3bf000000000000803f0000000080e0c0bf0077e8bf8067dbbf00b4d3bf00000000000040400000000080e0c0bf0077e8bf80e0c0bf0077e8bf0000000000000000000000008047afbf0011e4bf8047afbf0011e4bf00000000000000000000000080e0c0bf0077e8bf80e0c0bf0077e8bf000000000000803f000000008047afbf0011e4bf80e0c0bf0077e8bf0000000000004040000000008047afbf0011e4bf8047afbf0011e4bf000000000000000000000000800293bf8090d2bf800293bf8090d2bf0000000000000000000000008047afbf0011e4bf8047afbf0011e4bf000000000000803f00000000800293bf8090d2bf8047afbf0011e4bf000000000000404000000000800293bf8090d2bf800293bf8090d2bf00000000000000000000000080be8bbf008ed2bf80be8bbf008ed2bf000000000000000000000000800293bf8090d2bf800293bf8090d2bf000000000000803f0000000080be8bbf008ed2bf800293bf8090d2bf00000000000040400000000080be8bbf008ed2bf80be8bbf008ed2bf000000000000000000000000007b71bf0040debf007b71bf0040debf00000000000000000000000080be8bbf008ed2bf80be8bbf008ed2bf000000000000803f00000000007b71bf0040debf80be8bbf008ed2bf000000000000404000000000007b71bf0040debf007b71bf0040debf00000000000000000000000000b061bf00c2e1bf00b061bf00c2e1bf000000000000000000000000007b71bf0040debf007b71bf0040debf000000000000803f0000000000b061bf00c2e1bf007b71bf0040debf00000000000040400000000000b061bf00c2e1bf00b061bf00c2e1bf000000000000000000000000003e44bf80e4e0bf003e44bf80e4e0bf00000000000000000000000000b061bf00c2e1bf00b061bf00c2e1bf000000000000803f00000000003e44bf80e4e0bf00b061bf00c2e1bf000000000000404000000000003e44bf80e4e0bf003e44bf80e4e0bf00000000000000000000000000022bbf802fd7bf00022bbf802fd7bf000000000000000000000000003e44bf80e4e0bf003e44bf80e4e0bf000000000000803f0000000000022bbf802fd7bf003e44bf80e4e0bf00000000000040400000000000022bbf802fd7bf00022bbf802fd7bf00000000000000000000000000acb9be0031acbf00acb9be0031acbf00000000000000000000000000022bbf802fd7bf00022bbf802fd7bf000000000000803f0000000000acb9be0031acbf00022bbf802fd7bf00000000000040400000000000acb9be0031acbf00acb9be0031acbf0000000000000000000000000084aabe8020aabf0084aabe8020aabf00000000000000000000000000acb9be0031acbf00acb9be0031acbf000000000000803f000000000084aabe8020aabf00acb9be0031acbf0000000000004040000000000084aabe8020aabf0084aabe8020aabf000000000000000000000000008069be00e3a7bf008069be00e3a7bf0000000000000000000000000084aabe8020aabf0084aabe8020aabf000000000000803f00000000008069be00e3a7bf0084aabe8020aabf000000000000404000000000008069be00e3a7bf008069be00e3a7bf000000000000000000000000004038be00bba1bf004038be00bba1bf000000000000000000000000008069be00e3a7bf008069be00e3a7bf000000000000803f00000000004038be00bba1bf008069be00e3a7bf000000000000404000000000004038be00bba1bf004038be00bba1bf00000000000000000000000000488cbd0089a5bf00488cbd0089a5bf000000000000000000000000004038be00bba1bf004038be00bba1bf000000000000803f0000000000488cbd0089a5bf004038be00bba1bf00000000000040400000000000488cbd0089a5bf00488cbd0089a5bf00000000000000000000000000402c3d80e3d9bf00402c3d80e3d9bf00000000000000000000000000488cbd0089a5bf00488cbd0089a5bf000000000000803f0000000000402c3d80e3d9bf00488cbd0089a5bf00000000000040400000000000402c3d80e3d9bf00402c3d80e3d9bf0000000000000000000000000010e43d00b5e6bf0010e43d00b5e6bf00000000000000000000000000402c3d80e3d9bf00402c3d80e3d9bf000000000000803f000000000010e43d00b5e6bf00402c3d80e3d9bf0000000000004040000000000010e43d00b5e6bf0010e43d00b5e6bf000000000000000000000000001c243e00e1eabf001c243e00e1eabf0000000000000000000000000010e43d00b5e6bf0010e43d00b5e6bf000000000000803f00000000001c243e00e1eabf0010e43d00b5e6bf000000000000404000000000001c243e00e1eabf001c243e00e1eabf0000000000000000000000000026f63e00e1eabf0026f63e00e1eabf000000000000000000000000001c243e00e1eabf001c243e00e1eabf000000000000803f000000000026f63e00e1eabf001c243e00e1eabf0000000000004040000000000026f63e00e1eabf0026f63e00e1eabf00000000000000000000000000d0fc3e8036eabf00d0fc3e8036eabf0000000000000000000000000026f63e00e1eabf0026f63e00e1eabf000000000000803f0000000000d0fc3e8036eabf0026f63e00e1eabf00000000000040400000000000d0fc3e8036eabf + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_MeshUsageFlags: 0 + m_CookingOptions: 30 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + 'm_MeshMetrics[0]': 1 + 'm_MeshMetrics[1]': 1 + m_MeshOptimizationFlags: 1 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: + m_MeshLodInfo: + serializedVersion: 2 + m_LodSelectionCurve: + serializedVersion: 1 + m_LodSlope: 0 + m_LodBias: 0 + m_NumLevels: 1 + m_SubMeshes: + - serializedVersion: 2 + m_Levels: + - serializedVersion: 1 + m_IndexStart: 0 + m_IndexCount: 0 +--- !u!43 &2046973583 +Mesh: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 12 + m_SubMeshes: + - serializedVersion: 2 + firstByte: 0 + indexCount: 666 + topology: 0 + baseVertex: 0 + firstVertex: 0 + vertexCount: 370 + localAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 2.4599915, y: 1.8349915, z: 0} + m_Shapes: + vertices: [] + shapes: [] + channels: [] + fullWeights: [] + m_BindPose: [] + m_BoneNameHashes: + m_RootBoneNameHash: 0 + m_BonesAABB: [] + m_VariableBoneCountWeights: + m_Data: + m_MeshCompression: 0 + m_IsReadable: 1 + m_KeepVertices: 0 + m_KeepIndices: 0 + m_IndexFormat: 0 + m_IndexBuffer: 00004a004b004b000100000001004e004f004f000200010002005200530053000300020003005600570057000400030004005a005b005b000500040005005e005f005f000600050006006200630063000700060007006600670067000800070008006a006b006b000900080009006e006f006f000a0009000a007200730073000b000a000b007600770077000c000b000c007a007b007b000d000c000d007e007f007f000e000d000e008200830083000f000e000f0086008700870010000f0010008a008b008b001100100011008e008f008f001200110012009200930093001300120013009600970097001400130014009a009b009b001500140015009e009f009f00160015001600a200a300a300170016001700a600a700a700180017001800aa00ab00ab00190018001900ae00af00af001a0019001a00b200b300b3001b001a001b00b600b700b7001c001b001c00ba00bb00bb001d001c001d00be00bf00bf001e001d001e00c200c300c3001f001e001f00c600c700c70020001f002000ca00cb00cb00210020002100ce00cf00cf00220021002200d200d300d300230022002300d600d700d700240023002400da00db00db00250024002500de00df00df00260025002600e200e300e300270026002700e600e700e700280027002800ea00eb00eb00290028002900ee00ef00ef002a0029002a00f200f300f3002b002a002b00f600f700f7002c002b002c00fa00fb00fb002d002c002d00fe00ff00ff002e002d002e000201030103012f002e002f0006010701070130002f0030000a010b010b013100300031000e010f010f013200310032001201130113013300320033001601170117013400330034001a011b011b013500340035001e011f011f013600350036002201230123013700360037002601270127013800370038002a012b012b013900380039002e012f012f013a0039003a003201330133013b003a003b003601370137013c003b003c003a013b013b013d003c003d003e013f013f013e003d003e004201430143013f003e003f0046014701470140003f0040004a014b014b014100400041004e014f014f014200410042005201530153014300420043005601570157014400430044005a015b015b014500440045005e015f015f014600450046006201630163014700460047006601670167014800470048006a016b016b014900480049006e016f016f010000490000004c004d0001005000510002005400550003005800590004005c005d0005006000610006006400650007006800690008006c006d000900700071000a00740075000b00780079000c007c007d000d00800081000e00840085000f008800890010008c008d0011009000910012009400950013009800990014009c009d001500a000a1001600a400a5001700a800a9001800ac00ad001900b000b1001a00b400b5001b00b800b9001c00bc00bd001d00c000c1001e00c400c5001f00c800c9002000cc00cd002100d000d1002200d400d5002300d800d9002400dc00dd002500e000e1002600e400e5002700e800e9002800ec00ed002900f000f1002a00f400f5002b00f800f9002c00fc00fd002d00000101012e00040105012f000801090130000c010d0131001001110132001401150133001801190134001c011d0135002001210136002401250137002801290138002c012d013900300131013a00340135013b00380139013c003c013d013d00400141013e00440145013f004801490140004c014d0141005001510142005401550143005801590144005c015d0145006001610146006401650147006801690148006c016d01490070017101 + m_VertexData: + serializedVersion: 3 + m_VertexCount: 370 + m_Channels: + - stream: 0 + offset: 0 + format: 0 + dimension: 3 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 12 + format: 0 + dimension: 4 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + - stream: 0 + offset: 0 + format: 0 + dimension: 0 + m_DataSize: 10360 + _typelessdata: 00d0fc3e8036eabf00000000000080bf00000000003c0c3f804ce3bf003c0c3f804ce3bf00000000000080bf00000000001f163f8069d9bf001f163f8069d9bf00000000000080bf00000000002e1a3f0050d2bf002e1a3f0050d2bf00000000000080bf0000000000901e3f8028c5bf00901e3f8028c5bf00000000000080bf00000000009a343f8033bfbf009a343f8033bfbf00000000000080bf0000000080d4803f8027d0bf80d4803f8027d0bf00000000000080bf00000000804f823f0010d1bf804f823f0010d1bf00000000000080bf0000000000d18c3f80a8d9bf00d18c3f80a8d9bf00000000000080bf0000000000b8a23f80ebd6bf00b8a23f80ebd6bf00000000000080bf000000000026ad3f0019cfbf0026ad3f0019cfbf00000000000080bf000000008064b43f0072cebf8064b43f0072cebf00000000000080bf000000000046d23f8062ddbf0046d23f8062ddbf00000000000080bf0000000000b8d73f8079debf00b8d73f8079debf00000000000080bf000000008016f03f00e9cbbf8016f03f00e9cbbf00000000000080bf00000000002bf53f80a0cabf002bf53f80a0cabf00000000000080bf00000000001e054080f4cdbf001e054080f4cdbf00000000000080bf0000000080fa1040009fb9bf80fa1040009fb9bf00000000000080bf00000000809012400024b8bf809012400024b8bf00000000000080bf00000000805f18408034b6bf805f18408034b6bf00000000000080bf0000000040c11840000fb5bf40c11840000fb5bf00000000000080bf0000000080701d40803d8dbf80701d40803d8dbf00000000000080bf0000000080701d400018fabd80701d400018fabd00000000000080bf00000000c0f01c4000588abdc0f01c4000588abd00000000000080bf00000000803816400090833e803816400090833e00000000000080bf0000000040010b4000821b3f40010b4000821b3f00000000000080bf00000000406a02400069563f406a02400069563f00000000000080bf000000008069ed3f008e873f8069ed3f008e873f00000000000080bf000000008026db3f80089b3f8026db3f80089b3f00000000000080bf00000000808fb73f8042b73f808fb73f8042b73f00000000000080bf000000008029a43f002cc23f8029a43f002cc23f00000000000080bf00000000005c703f80cad83f005c703f80cad83f00000000000080bf000000000065443f0057e13f0065443f0057e13f00000000000080bf0000000000a7243f0039e63f00a7243f0039e63f00000000000080bf0000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f00000000000080bf000000000080febe00e1ea3f0080febe00e1ea3f00000000000080bf0000000000535bbf80c3de3f00535bbf80c3de3f00000000000080bf00000000004b9abf00edca3f004b9abf00edca3f00000000000080bf00000000806fa4bf004bc53f806fa4bf004bc53f00000000000080bf0000000080f4c5bf8038ab3f80f4c5bf8038ab3f00000000000080bf0000000000b5e1bf8040933f00b5e1bf8040933f00000000000080bf0000000080a6f2bf0085833f80a6f2bf0085833f00000000000080bf00000000c05001c0003f5d3fc05001c0003f5d3f00000000000080bf0000000000af08c000f3353f00af08c000f3353f00000000000080bf0000000040ab13c000caca3e40ab13c000caca3e00000000000080bf0000000040171dc000c8adbd40171dc000c8adbd00000000000080bf00000000801d1dc00038b0bd801d1dc00038b0bd00000000000080bf0000000080701dc00050cfbd80701dc00050cfbd00000000000080bf0000000080701dc0803888bf80701dc0803888bf00000000000080bf00000000403019c08015afbf403019c08015afbf00000000000080bf0000000080c013c0807fcebf80c013c0807fcebf00000000000080bf00000000008c0cc00079e7bf008c0cc00079e7bf00000000000080bf0000000040ff0bc0005ae7bf40ff0bc0005ae7bf00000000000080bf00000000800af0bf009fd4bf800af0bf009fd4bf00000000000080bf00000000001beebf0010d4bf001beebf0010d4bf00000000000080bf000000008054e0bf8057d2bf8054e0bf8057d2bf00000000000080bf000000008067dbbf00b4d3bf8067dbbf00b4d3bf00000000000080bf0000000080e0c0bf0077e8bf80e0c0bf0077e8bf00000000000080bf000000008047afbf0011e4bf8047afbf0011e4bf00000000000080bf00000000800293bf8090d2bf800293bf8090d2bf00000000000080bf0000000080be8bbf008ed2bf80be8bbf008ed2bf00000000000080bf00000000007b71bf0040debf007b71bf0040debf00000000000080bf0000000000b061bf00c2e1bf00b061bf00c2e1bf00000000000080bf00000000003e44bf80e4e0bf003e44bf80e4e0bf00000000000080bf0000000000022bbf802fd7bf00022bbf802fd7bf00000000000080bf0000000000acb9be0031acbf00acb9be0031acbf00000000000080bf000000000084aabe8020aabf0084aabe8020aabf00000000000080bf00000000008069be00e3a7bf008069be00e3a7bf00000000000080bf00000000004038be00bba1bf004038be00bba1bf00000000000080bf0000000000488cbd0089a5bf00488cbd0089a5bf00000000000080bf0000000000402c3d80e3d9bf00402c3d80e3d9bf00000000000080bf000000000010e43d00b5e6bf0010e43d00b5e6bf00000000000080bf00000000001c243e00e1eabf001c243e00e1eabf00000000000080bf000000000026f63e00e1eabf0026f63e00e1eabf00000000000080bf0000000000d0fc3e8036eabf00d0fc3e8036eabf000000000000000000000000003c0c3f804ce3bf003c0c3f804ce3bf00000000000000000000000000d0fc3e8036eabf00d0fc3e8036eabf000000000000803f00000000003c0c3f804ce3bf00d0fc3e8036eabf000000000000404000000000003c0c3f804ce3bf003c0c3f804ce3bf000000000000000000000000001f163f8069d9bf001f163f8069d9bf000000000000000000000000003c0c3f804ce3bf003c0c3f804ce3bf000000000000803f00000000001f163f8069d9bf003c0c3f804ce3bf000000000000404000000000001f163f8069d9bf001f163f8069d9bf000000000000000000000000002e1a3f0050d2bf002e1a3f0050d2bf000000000000000000000000001f163f8069d9bf001f163f8069d9bf000000000000803f00000000002e1a3f0050d2bf001f163f8069d9bf000000000000404000000000002e1a3f0050d2bf002e1a3f0050d2bf00000000000000000000000000901e3f8028c5bf00901e3f8028c5bf000000000000000000000000002e1a3f0050d2bf002e1a3f0050d2bf000000000000803f0000000000901e3f8028c5bf002e1a3f0050d2bf00000000000040400000000000901e3f8028c5bf00901e3f8028c5bf000000000000000000000000009a343f8033bfbf009a343f8033bfbf00000000000000000000000000901e3f8028c5bf00901e3f8028c5bf000000000000803f00000000009a343f8033bfbf00901e3f8028c5bf000000000000404000000000009a343f8033bfbf009a343f8033bfbf00000000000000000000000080d4803f8027d0bf80d4803f8027d0bf000000000000000000000000009a343f8033bfbf009a343f8033bfbf000000000000803f0000000080d4803f8027d0bf009a343f8033bfbf00000000000040400000000080d4803f8027d0bf80d4803f8027d0bf000000000000000000000000804f823f0010d1bf804f823f0010d1bf00000000000000000000000080d4803f8027d0bf80d4803f8027d0bf000000000000803f00000000804f823f0010d1bf80d4803f8027d0bf000000000000404000000000804f823f0010d1bf804f823f0010d1bf00000000000000000000000000d18c3f80a8d9bf00d18c3f80a8d9bf000000000000000000000000804f823f0010d1bf804f823f0010d1bf000000000000803f0000000000d18c3f80a8d9bf804f823f0010d1bf00000000000040400000000000d18c3f80a8d9bf00d18c3f80a8d9bf00000000000000000000000000b8a23f80ebd6bf00b8a23f80ebd6bf00000000000000000000000000d18c3f80a8d9bf00d18c3f80a8d9bf000000000000803f0000000000b8a23f80ebd6bf00d18c3f80a8d9bf00000000000040400000000000b8a23f80ebd6bf00b8a23f80ebd6bf0000000000000000000000000026ad3f0019cfbf0026ad3f0019cfbf00000000000000000000000000b8a23f80ebd6bf00b8a23f80ebd6bf000000000000803f000000000026ad3f0019cfbf00b8a23f80ebd6bf0000000000004040000000000026ad3f0019cfbf0026ad3f0019cfbf0000000000000000000000008064b43f0072cebf8064b43f0072cebf0000000000000000000000000026ad3f0019cfbf0026ad3f0019cfbf000000000000803f000000008064b43f0072cebf0026ad3f0019cfbf0000000000004040000000008064b43f0072cebf8064b43f0072cebf0000000000000000000000000046d23f8062ddbf0046d23f8062ddbf0000000000000000000000008064b43f0072cebf8064b43f0072cebf000000000000803f000000000046d23f8062ddbf8064b43f0072cebf0000000000004040000000000046d23f8062ddbf0046d23f8062ddbf00000000000000000000000000b8d73f8079debf00b8d73f8079debf0000000000000000000000000046d23f8062ddbf0046d23f8062ddbf000000000000803f0000000000b8d73f8079debf0046d23f8062ddbf00000000000040400000000000b8d73f8079debf00b8d73f8079debf0000000000000000000000008016f03f00e9cbbf8016f03f00e9cbbf00000000000000000000000000b8d73f8079debf00b8d73f8079debf000000000000803f000000008016f03f00e9cbbf00b8d73f8079debf0000000000004040000000008016f03f00e9cbbf8016f03f00e9cbbf000000000000000000000000002bf53f80a0cabf002bf53f80a0cabf0000000000000000000000008016f03f00e9cbbf8016f03f00e9cbbf000000000000803f00000000002bf53f80a0cabf8016f03f00e9cbbf000000000000404000000000002bf53f80a0cabf002bf53f80a0cabf000000000000000000000000001e054080f4cdbf001e054080f4cdbf000000000000000000000000002bf53f80a0cabf002bf53f80a0cabf000000000000803f00000000001e054080f4cdbf002bf53f80a0cabf000000000000404000000000001e054080f4cdbf001e054080f4cdbf00000000000000000000000080fa1040009fb9bf80fa1040009fb9bf000000000000000000000000001e054080f4cdbf001e054080f4cdbf000000000000803f0000000080fa1040009fb9bf001e054080f4cdbf00000000000040400000000080fa1040009fb9bf80fa1040009fb9bf000000000000000000000000809012400024b8bf809012400024b8bf00000000000000000000000080fa1040009fb9bf80fa1040009fb9bf000000000000803f00000000809012400024b8bf80fa1040009fb9bf000000000000404000000000809012400024b8bf809012400024b8bf000000000000000000000000805f18408034b6bf805f18408034b6bf000000000000000000000000809012400024b8bf809012400024b8bf000000000000803f00000000805f18408034b6bf809012400024b8bf000000000000404000000000805f18408034b6bf805f18408034b6bf00000000000000000000000040c11840000fb5bf40c11840000fb5bf000000000000000000000000805f18408034b6bf805f18408034b6bf000000000000803f0000000040c11840000fb5bf805f18408034b6bf00000000000040400000000040c11840000fb5bf40c11840000fb5bf00000000000000000000000080701d40803d8dbf80701d40803d8dbf00000000000000000000000040c11840000fb5bf40c11840000fb5bf000000000000803f0000000080701d40803d8dbf40c11840000fb5bf00000000000040400000000080701d40803d8dbf80701d40803d8dbf00000000000000000000000080701d400018fabd80701d400018fabd00000000000000000000000080701d40803d8dbf80701d40803d8dbf000000000000803f0000000080701d400018fabd80701d40803d8dbf00000000000040400000000080701d400018fabd80701d400018fabd000000000000000000000000c0f01c4000588abdc0f01c4000588abd00000000000000000000000080701d400018fabd80701d400018fabd000000000000803f00000000c0f01c4000588abd80701d400018fabd000000000000404000000000c0f01c4000588abdc0f01c4000588abd000000000000000000000000803816400090833e803816400090833e000000000000000000000000c0f01c4000588abdc0f01c4000588abd000000000000803f00000000803816400090833ec0f01c4000588abd000000000000404000000000803816400090833e803816400090833e00000000000000000000000040010b4000821b3f40010b4000821b3f000000000000000000000000803816400090833e803816400090833e000000000000803f0000000040010b4000821b3f803816400090833e00000000000040400000000040010b4000821b3f40010b4000821b3f000000000000000000000000406a02400069563f406a02400069563f00000000000000000000000040010b4000821b3f40010b4000821b3f000000000000803f00000000406a02400069563f40010b4000821b3f000000000000404000000000406a02400069563f406a02400069563f0000000000000000000000008069ed3f008e873f8069ed3f008e873f000000000000000000000000406a02400069563f406a02400069563f000000000000803f000000008069ed3f008e873f406a02400069563f0000000000004040000000008069ed3f008e873f8069ed3f008e873f0000000000000000000000008026db3f80089b3f8026db3f80089b3f0000000000000000000000008069ed3f008e873f8069ed3f008e873f000000000000803f000000008026db3f80089b3f8069ed3f008e873f0000000000004040000000008026db3f80089b3f8026db3f80089b3f000000000000000000000000808fb73f8042b73f808fb73f8042b73f0000000000000000000000008026db3f80089b3f8026db3f80089b3f000000000000803f00000000808fb73f8042b73f8026db3f80089b3f000000000000404000000000808fb73f8042b73f808fb73f8042b73f0000000000000000000000008029a43f002cc23f8029a43f002cc23f000000000000000000000000808fb73f8042b73f808fb73f8042b73f000000000000803f000000008029a43f002cc23f808fb73f8042b73f0000000000004040000000008029a43f002cc23f8029a43f002cc23f000000000000000000000000005c703f80cad83f005c703f80cad83f0000000000000000000000008029a43f002cc23f8029a43f002cc23f000000000000803f00000000005c703f80cad83f8029a43f002cc23f000000000000404000000000005c703f80cad83f005c703f80cad83f0000000000000000000000000065443f0057e13f0065443f0057e13f000000000000000000000000005c703f80cad83f005c703f80cad83f000000000000803f000000000065443f0057e13f005c703f80cad83f0000000000004040000000000065443f0057e13f0065443f0057e13f00000000000000000000000000a7243f0039e63f00a7243f0039e63f0000000000000000000000000065443f0057e13f0065443f0057e13f000000000000803f0000000000a7243f0039e63f0065443f0057e13f00000000000040400000000000a7243f0039e63f00a7243f0039e63f00000000000000000000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f00000000000000000000000000a7243f0039e63f00a7243f0039e63f000000000000803f0000000000d2fe3e00e1ea3f00a7243f0039e63f00000000000040400000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f0000000000000000000000000080febe00e1ea3f0080febe00e1ea3f00000000000000000000000000d2fe3e00e1ea3f00d2fe3e00e1ea3f000000000000803f000000000080febe00e1ea3f00d2fe3e00e1ea3f0000000000004040000000000080febe00e1ea3f0080febe00e1ea3f00000000000000000000000000535bbf80c3de3f00535bbf80c3de3f0000000000000000000000000080febe00e1ea3f0080febe00e1ea3f000000000000803f0000000000535bbf80c3de3f0080febe00e1ea3f00000000000040400000000000535bbf80c3de3f00535bbf80c3de3f000000000000000000000000004b9abf00edca3f004b9abf00edca3f00000000000000000000000000535bbf80c3de3f00535bbf80c3de3f000000000000803f00000000004b9abf00edca3f00535bbf80c3de3f000000000000404000000000004b9abf00edca3f004b9abf00edca3f000000000000000000000000806fa4bf004bc53f806fa4bf004bc53f000000000000000000000000004b9abf00edca3f004b9abf00edca3f000000000000803f00000000806fa4bf004bc53f004b9abf00edca3f000000000000404000000000806fa4bf004bc53f806fa4bf004bc53f00000000000000000000000080f4c5bf8038ab3f80f4c5bf8038ab3f000000000000000000000000806fa4bf004bc53f806fa4bf004bc53f000000000000803f0000000080f4c5bf8038ab3f806fa4bf004bc53f00000000000040400000000080f4c5bf8038ab3f80f4c5bf8038ab3f00000000000000000000000000b5e1bf8040933f00b5e1bf8040933f00000000000000000000000080f4c5bf8038ab3f80f4c5bf8038ab3f000000000000803f0000000000b5e1bf8040933f80f4c5bf8038ab3f00000000000040400000000000b5e1bf8040933f00b5e1bf8040933f00000000000000000000000080a6f2bf0085833f80a6f2bf0085833f00000000000000000000000000b5e1bf8040933f00b5e1bf8040933f000000000000803f0000000080a6f2bf0085833f00b5e1bf8040933f00000000000040400000000080a6f2bf0085833f80a6f2bf0085833f000000000000000000000000c05001c0003f5d3fc05001c0003f5d3f00000000000000000000000080a6f2bf0085833f80a6f2bf0085833f000000000000803f00000000c05001c0003f5d3f80a6f2bf0085833f000000000000404000000000c05001c0003f5d3fc05001c0003f5d3f00000000000000000000000000af08c000f3353f00af08c000f3353f000000000000000000000000c05001c0003f5d3fc05001c0003f5d3f000000000000803f0000000000af08c000f3353fc05001c0003f5d3f00000000000040400000000000af08c000f3353f00af08c000f3353f00000000000000000000000040ab13c000caca3e40ab13c000caca3e00000000000000000000000000af08c000f3353f00af08c000f3353f000000000000803f0000000040ab13c000caca3e00af08c000f3353f00000000000040400000000040ab13c000caca3e40ab13c000caca3e00000000000000000000000040171dc000c8adbd40171dc000c8adbd00000000000000000000000040ab13c000caca3e40ab13c000caca3e000000000000803f0000000040171dc000c8adbd40ab13c000caca3e00000000000040400000000040171dc000c8adbd40171dc000c8adbd000000000000000000000000801d1dc00038b0bd801d1dc00038b0bd00000000000000000000000040171dc000c8adbd40171dc000c8adbd000000000000803f00000000801d1dc00038b0bd40171dc000c8adbd000000000000404000000000801d1dc00038b0bd801d1dc00038b0bd00000000000000000000000080701dc00050cfbd80701dc00050cfbd000000000000000000000000801d1dc00038b0bd801d1dc00038b0bd000000000000803f0000000080701dc00050cfbd801d1dc00038b0bd00000000000040400000000080701dc00050cfbd80701dc00050cfbd00000000000000000000000080701dc0803888bf80701dc0803888bf00000000000000000000000080701dc00050cfbd80701dc00050cfbd000000000000803f0000000080701dc0803888bf80701dc00050cfbd00000000000040400000000080701dc0803888bf80701dc0803888bf000000000000000000000000403019c08015afbf403019c08015afbf00000000000000000000000080701dc0803888bf80701dc0803888bf000000000000803f00000000403019c08015afbf80701dc0803888bf000000000000404000000000403019c08015afbf403019c08015afbf00000000000000000000000080c013c0807fcebf80c013c0807fcebf000000000000000000000000403019c08015afbf403019c08015afbf000000000000803f0000000080c013c0807fcebf403019c08015afbf00000000000040400000000080c013c0807fcebf80c013c0807fcebf000000000000000000000000008c0cc00079e7bf008c0cc00079e7bf00000000000000000000000080c013c0807fcebf80c013c0807fcebf000000000000803f00000000008c0cc00079e7bf80c013c0807fcebf000000000000404000000000008c0cc00079e7bf008c0cc00079e7bf00000000000000000000000040ff0bc0005ae7bf40ff0bc0005ae7bf000000000000000000000000008c0cc00079e7bf008c0cc00079e7bf000000000000803f0000000040ff0bc0005ae7bf008c0cc00079e7bf00000000000040400000000040ff0bc0005ae7bf40ff0bc0005ae7bf000000000000000000000000800af0bf009fd4bf800af0bf009fd4bf00000000000000000000000040ff0bc0005ae7bf40ff0bc0005ae7bf000000000000803f00000000800af0bf009fd4bf40ff0bc0005ae7bf000000000000404000000000800af0bf009fd4bf800af0bf009fd4bf000000000000000000000000001beebf0010d4bf001beebf0010d4bf000000000000000000000000800af0bf009fd4bf800af0bf009fd4bf000000000000803f00000000001beebf0010d4bf800af0bf009fd4bf000000000000404000000000001beebf0010d4bf001beebf0010d4bf0000000000000000000000008054e0bf8057d2bf8054e0bf8057d2bf000000000000000000000000001beebf0010d4bf001beebf0010d4bf000000000000803f000000008054e0bf8057d2bf001beebf0010d4bf0000000000004040000000008054e0bf8057d2bf8054e0bf8057d2bf0000000000000000000000008067dbbf00b4d3bf8067dbbf00b4d3bf0000000000000000000000008054e0bf8057d2bf8054e0bf8057d2bf000000000000803f000000008067dbbf00b4d3bf8054e0bf8057d2bf0000000000004040000000008067dbbf00b4d3bf8067dbbf00b4d3bf00000000000000000000000080e0c0bf0077e8bf80e0c0bf0077e8bf0000000000000000000000008067dbbf00b4d3bf8067dbbf00b4d3bf000000000000803f0000000080e0c0bf0077e8bf8067dbbf00b4d3bf00000000000040400000000080e0c0bf0077e8bf80e0c0bf0077e8bf0000000000000000000000008047afbf0011e4bf8047afbf0011e4bf00000000000000000000000080e0c0bf0077e8bf80e0c0bf0077e8bf000000000000803f000000008047afbf0011e4bf80e0c0bf0077e8bf0000000000004040000000008047afbf0011e4bf8047afbf0011e4bf000000000000000000000000800293bf8090d2bf800293bf8090d2bf0000000000000000000000008047afbf0011e4bf8047afbf0011e4bf000000000000803f00000000800293bf8090d2bf8047afbf0011e4bf000000000000404000000000800293bf8090d2bf800293bf8090d2bf00000000000000000000000080be8bbf008ed2bf80be8bbf008ed2bf000000000000000000000000800293bf8090d2bf800293bf8090d2bf000000000000803f0000000080be8bbf008ed2bf800293bf8090d2bf00000000000040400000000080be8bbf008ed2bf80be8bbf008ed2bf000000000000000000000000007b71bf0040debf007b71bf0040debf00000000000000000000000080be8bbf008ed2bf80be8bbf008ed2bf000000000000803f00000000007b71bf0040debf80be8bbf008ed2bf000000000000404000000000007b71bf0040debf007b71bf0040debf00000000000000000000000000b061bf00c2e1bf00b061bf00c2e1bf000000000000000000000000007b71bf0040debf007b71bf0040debf000000000000803f0000000000b061bf00c2e1bf007b71bf0040debf00000000000040400000000000b061bf00c2e1bf00b061bf00c2e1bf000000000000000000000000003e44bf80e4e0bf003e44bf80e4e0bf00000000000000000000000000b061bf00c2e1bf00b061bf00c2e1bf000000000000803f00000000003e44bf80e4e0bf00b061bf00c2e1bf000000000000404000000000003e44bf80e4e0bf003e44bf80e4e0bf00000000000000000000000000022bbf802fd7bf00022bbf802fd7bf000000000000000000000000003e44bf80e4e0bf003e44bf80e4e0bf000000000000803f0000000000022bbf802fd7bf003e44bf80e4e0bf00000000000040400000000000022bbf802fd7bf00022bbf802fd7bf00000000000000000000000000acb9be0031acbf00acb9be0031acbf00000000000000000000000000022bbf802fd7bf00022bbf802fd7bf000000000000803f0000000000acb9be0031acbf00022bbf802fd7bf00000000000040400000000000acb9be0031acbf00acb9be0031acbf0000000000000000000000000084aabe8020aabf0084aabe8020aabf00000000000000000000000000acb9be0031acbf00acb9be0031acbf000000000000803f000000000084aabe8020aabf00acb9be0031acbf0000000000004040000000000084aabe8020aabf0084aabe8020aabf000000000000000000000000008069be00e3a7bf008069be00e3a7bf0000000000000000000000000084aabe8020aabf0084aabe8020aabf000000000000803f00000000008069be00e3a7bf0084aabe8020aabf000000000000404000000000008069be00e3a7bf008069be00e3a7bf000000000000000000000000004038be00bba1bf004038be00bba1bf000000000000000000000000008069be00e3a7bf008069be00e3a7bf000000000000803f00000000004038be00bba1bf008069be00e3a7bf000000000000404000000000004038be00bba1bf004038be00bba1bf00000000000000000000000000488cbd0089a5bf00488cbd0089a5bf000000000000000000000000004038be00bba1bf004038be00bba1bf000000000000803f0000000000488cbd0089a5bf004038be00bba1bf00000000000040400000000000488cbd0089a5bf00488cbd0089a5bf00000000000000000000000000402c3d80e3d9bf00402c3d80e3d9bf00000000000000000000000000488cbd0089a5bf00488cbd0089a5bf000000000000803f0000000000402c3d80e3d9bf00488cbd0089a5bf00000000000040400000000000402c3d80e3d9bf00402c3d80e3d9bf0000000000000000000000000010e43d00b5e6bf0010e43d00b5e6bf00000000000000000000000000402c3d80e3d9bf00402c3d80e3d9bf000000000000803f000000000010e43d00b5e6bf00402c3d80e3d9bf0000000000004040000000000010e43d00b5e6bf0010e43d00b5e6bf000000000000000000000000001c243e00e1eabf001c243e00e1eabf0000000000000000000000000010e43d00b5e6bf0010e43d00b5e6bf000000000000803f00000000001c243e00e1eabf0010e43d00b5e6bf000000000000404000000000001c243e00e1eabf001c243e00e1eabf0000000000000000000000000026f63e00e1eabf0026f63e00e1eabf000000000000000000000000001c243e00e1eabf001c243e00e1eabf000000000000803f000000000026f63e00e1eabf001c243e00e1eabf0000000000004040000000000026f63e00e1eabf0026f63e00e1eabf00000000000000000000000000d0fc3e8036eabf00d0fc3e8036eabf0000000000000000000000000026f63e00e1eabf0026f63e00e1eabf000000000000803f0000000000d0fc3e8036eabf0026f63e00e1eabf00000000000040400000000000d0fc3e8036eabf + m_CompressedMesh: + m_Vertices: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_UV: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Normals: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Tangents: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_Weights: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_NormalSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_TangentSigns: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_FloatColors: + m_NumItems: 0 + m_Range: 0 + m_Start: 0 + m_Data: + m_BitSize: 0 + m_BoneIndices: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_Triangles: + m_NumItems: 0 + m_Data: + m_BitSize: 0 + m_UVInfo: 0 + m_LocalAABB: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_MeshUsageFlags: 0 + m_CookingOptions: 30 + m_BakedConvexCollisionMesh: + m_BakedTriangleCollisionMesh: + 'm_MeshMetrics[0]': 1 + 'm_MeshMetrics[1]': 1 + m_MeshOptimizationFlags: 1 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: + m_MeshLodInfo: + serializedVersion: 2 + m_LodSelectionCurve: + serializedVersion: 1 + m_LodSlope: 0 + m_LodBias: 0 + m_NumLevels: 1 + m_SubMeshes: + - serializedVersion: 2 + m_Levels: + - serializedVersion: 1 + m_IndexStart: 0 + m_IndexCount: 0 +--- !u!1 &2077238613 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2077238615} + - component: {fileID: 2077238614} + m_Layer: 0 + m_Name: BG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &2077238614 +SpriteRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2077238613} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: -538112021 + m_SortingLayer: -1 + m_SortingOrder: -1 + m_MaskInteraction: 0 + m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_SpriteSortPoint: 0 +--- !u!4 &2077238615 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2077238613} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 100, y: 100, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2081924414 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2081924416} + - component: {fileID: 2081924415} + m_Layer: 0 + m_Name: Spot Light 2D + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2081924415 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2081924414} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 073797afb82c5a1438f328866b10b3f0, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.Light2D + m_ComponentVersion: 2 + m_LightType: 3 + m_BlendStyleIndex: 0 + m_FalloffIntensity: 0.5 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_LightVolumeIntensity: 1 + m_LightVolumeEnabled: 0 + m_ApplyToSortingLayers: eb0feddfe980ef06 + m_LightCookieSprite: {fileID: 0} + m_DeprecatedPointLightCookieSprite: {fileID: 0} + m_LightOrder: 0 + m_AlphaBlendOnOverlap: 0 + m_OverlapOperation: 0 + m_NormalMapDistance: 3 + m_NormalMapQuality: 1 + m_UseNormalMap: 0 + m_ShadowsEnabled: 1 + m_ShadowIntensity: 0.75 + m_ShadowSoftness: 0.3 + m_ShadowSoftnessFalloffIntensity: 0.5 + m_ShadowVolumeIntensityEnabled: 0 + m_ShadowVolumeIntensity: 0.75 + m_LocalBounds: + m_Center: {x: 0, y: -0.00000011920929, z: 0} + m_Extent: {x: 0.9985302, y: 0.99853027, z: 0} + m_PointLightInnerAngle: 360 + m_PointLightOuterAngle: 360 + m_PointLightInnerRadius: 5 + m_PointLightOuterRadius: 10 + m_ShapeLightParametricSides: 5 + m_ShapeLightParametricAngleOffset: 0 + m_ShapeLightParametricRadius: 1 + m_ShapeLightFalloffSize: 0.5 + m_ShapeLightFalloffOffset: {x: 0, y: 0} + m_ShapePath: + - {x: -0.5, y: -0.5, z: 0} + - {x: 0.5, y: -0.5, z: 0} + - {x: 0.5, y: 0.5, z: 0} + - {x: -0.5, y: 0.5, z: 0} +--- !u!4 &2081924416 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2081924414} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 269225269} + - {fileID: 1374772174} + - {fileID: 1708032151} + - {fileID: 417180953} + - {fileID: 2081924416} + - {fileID: 1398446541} + - {fileID: 2077238615} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.unity.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.unity.meta new file mode 100644 index 00000000000..faec98c56f4 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d419e012a6d7b5d499754d81e68ac073 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/030_InjectionRenderPass2D.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/030_InjectionRenderPass2D.asset new file mode 100644 index 00000000000..9ee6dd6ba87 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/030_InjectionRenderPass2D.asset @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-4730295787603024334 +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: ca7c3d2ecbc6d7b4c917e1e525696db0, type: 3} + m_Name: CustomRendererFeature2D + m_EditorClassIdentifier: Universal2DGraphicsTests::UnityEngine.Rendering.Universal.CustomRendererFeature2D + m_Active: 1 + injectionPoint2D: 0 + sortingLayerID: 0 +--- !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: 11145981673336645838492a2d98e247, type: 3} + m_Name: 030_InjectionRenderPass2D + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.Renderer2DData + debugShaders: + debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, + type: 3} + hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, + type: 3} + probeVolumeResources: + probeVolumeDebugShader: {fileID: 0} + probeVolumeFragmentationDebugShader: {fileID: 0} + probeVolumeOffsetDebugShader: {fileID: 0} + probeVolumeSamplingDebugShader: {fileID: 0} + probeSamplingDebugMesh: {fileID: 0} + probeSamplingDebugTexture: {fileID: 0} + probeVolumeBlendStatesCS: {fileID: 0} + m_RendererFeatures: + - {fileID: -4730295787603024334} + m_RendererFeatureMap: 322665190b9d5abe + m_UseNativeRenderPass: 0 + m_LayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 1, z: 0} + m_HDREmulationScale: 1 + m_LightRenderTextureScale: 0.5 + m_LightBlendStyles: + - name: Multiply + maskTextureChannel: 0 + blendMode: 1 + - name: Additive + maskTextureChannel: 0 + blendMode: 0 + - name: Multiply with Mask + maskTextureChannel: 1 + blendMode: 1 + - name: Additive with Mask + maskTextureChannel: 1 + blendMode: 0 + m_UseDepthStencilBuffer: 1 + m_UseCameraSortingLayersTexture: 0 + m_CameraSortingLayersTextureBound: -1 + m_CameraSortingLayerDownsamplingMethod: 0 + m_MaxLightRenderTextureCount: 16 + m_MaxShadowRenderTextureCount: 1 + m_PostProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} + m_DefaultMaterialType: 0 + m_DefaultCustomMaterial: {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, + type: 2} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/030_InjectionRenderPass2D.asset.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/030_InjectionRenderPass2D.asset.meta new file mode 100644 index 00000000000..9888f094839 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/030_InjectionRenderPass2D.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9b5b99c05ab3ae148b6d8faf2da44518 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/CustomRendererFeature2D.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/CustomRendererFeature2D.cs new file mode 100644 index 00000000000..d8e77309e07 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/CustomRendererFeature2D.cs @@ -0,0 +1,104 @@ +using UnityEngine.Rendering.RenderGraphModule; + +namespace UnityEngine.Rendering.Universal +{ + [SupportedOnRenderer(typeof(Renderer2DData))] + public class CustomRendererFeature2D : ScriptableRendererFeature2D + { + private CustomRenderPass2D m_CustomRenderPass2D; + + public override void Create() + { + m_CustomRenderPass2D = new CustomRenderPass2D + { + renderPassEvent2D = injectionPoint2D, + renderPassSortingLayerID = sortingLayerID + }; + } + + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) + { + renderer.EnqueuePass(m_CustomRenderPass2D); + } + } + + internal class CustomRenderPass2D : ScriptableRenderPass2D + { + class PassData + { + internal TextureHandle copySourceTexture; + } + + static void ExecutePass(PassData data, RasterGraphContext context) + { + // Records a rendering command to copy, or blit, the contents of the source texture + // to the color render target of the render pass. + Blitter.BlitTexture(context.cmd, data.copySourceTexture, + new Vector4(1, 1, 0, 0), 0, false); + } + + public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) + { + string passName = "Debug Custom RenderPass2D"; + +#if UNITY_EDITOR + if (LayerDebug.enabled) + passName = passName + " - " + renderPassEvent2D.ToString(); +#endif + + using (var builder = renderGraph.AddRasterRenderPass(passName, + out var passData)) + { + // UniversalResourceData contains all the texture references used by URP, + // including the active color and depth textures of the camera. + UniversalResourceData resourceData = frameData.Get(); + + // Populate passData with the data needed by the rendering function + // of the render pass. + // Use the camera's active color texture + // as the source texture for the copy operation. + passData.copySourceTexture = resourceData.cameraColor; + + // Create a destination texture for the copy operation based on the settings, + // such as dimensions, of the textures that the camera uses. + // Set msaaSamples to 1 to get a non-multisampled destination texture. + // Set depthBufferBits to 0 to ensure that the CreateRenderGraphTexture method + // creates a color texture and not a depth texture. + UniversalCameraData cameraData = frameData.Get(); + RenderTextureDescriptor desc = cameraData.cameraTargetDescriptor; + desc.msaaSamples = 1; + desc.depthBufferBits = 0; + + // For demonstrative purposes, this sample creates a temporary destination texture. + // UniversalRenderer.CreateRenderGraphTexture is a helper method + // that calls the RenderGraph.CreateTexture method. + // Using a RenderTextureDescriptor instance instead of a TextureDesc instance + // simplifies your code. + TextureHandle destination = + UniversalRenderer.CreateRenderGraphTexture(renderGraph, desc, + "CopyTexture", false); + + // Declare that this render pass uses the source texture as a read-only input. + builder.UseTexture(passData.copySourceTexture); + + // Declare that this render pass uses the temporary destination texture + // as its color render target. + // This is similar to cmd.SetRenderTarget prior to the RenderGraph API. + builder.SetRenderAttachment(destination, 0); + + // RenderGraph automatically determines that it can remove this render pass + // because its results, which are stored in the temporary destination texture, + // are not used by other passes. + // For demonstrative purposes, this sample turns off this behavior to make sure + // that render graph executes the render pass. + builder.AllowPassCulling(false); + + // Set the ExecutePass method as the rendering function that render graph calls + // for the render pass. + // This sample uses a lambda expression to avoid memory allocations. + builder.SetRenderFunc((PassData data, RasterGraphContext context) + => ExecutePass(data, context)); + } + } + } +} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/CustomRendererFeature2D.cs.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/CustomRendererFeature2D.cs.meta new file mode 100644 index 00000000000..9cd6c0bff3e --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/030_RenderPass2D/CustomRendererFeature2D.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ca7c3d2ecbc6d7b4c917e1e525696db0 \ No newline at end of file From f88fe842fe2bb297d0d48219c3eb081d67bc6579 Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Tue, 7 Oct 2025 16:44:57 +0000 Subject: [PATCH 052/115] [VFX] Preview too bright in HDRP --- .../Editor/GraphView/Elements/3D.meta | 10 --- .../Editor/GraphView/Elements/3D/Preview3D.cs | 67 --------------- .../GraphView/Elements/3D/Preview3D.cs.meta | 13 --- .../Elements/3D/Rotate3DManipulator.cs | 86 ------------------- .../Elements/3D/Rotate3DManipulator.cs.meta | 13 --- .../Editor/Inspector/VFXAssetEditor.cs | 6 +- 6 files changed, 4 insertions(+), 191 deletions(-) delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Preview3D.cs delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Preview3D.cs.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Rotate3DManipulator.cs delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Rotate3DManipulator.cs.meta diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D.meta b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D.meta deleted file mode 100644 index de6720abc28..00000000000 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 0066c6c7d0c4b3e46882bbc8b1b263d1 -folderAsset: yes -timeCreated: 1503589466 -licenseType: Pro -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Preview3D.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Preview3D.cs deleted file mode 100644 index 5f913f97311..00000000000 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Preview3D.cs +++ /dev/null @@ -1,67 +0,0 @@ -#if false -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor.UIElements; -using UnityEditor.Experimental.GraphView; - -namespace UnityEditor.VFX.UI -{ - /* class Preview3DController : SimpleElementPresenter - { - public Preview3DController() - { - title = "3D Preview"; - - position = new Rect(100, 100, 300, 300); - } - - public new void OnEnable() - { - base.OnEnable(); - capabilities |= Capabilities.Movable | Capabilities.Resizable; - } - }*/ - class Preview3D : GraphElement - { - Label m_Label; - Element3D m_Element; - - - public Preview3D() - { - style.flexDirection = FlexDirection.Column; - style.alignItems = Align.Stretch; - - m_Label = new Label(); - Add(m_Label); - - - m_Element = new Element3D(); - Add(m_Element); - - m_Element.style.flex = 1; - - - style.width = style.height = 300; - - - m_Element.AddManipulator(new Rotate3DManipulator(m_Element)); - } - - /* - public void OnDataChanged() - { - base.OnDataChanged(); - - Preview3DController controller = GetPresenter(); - - m_Label.text = controller.title; - } - */ - } -} -#endif diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Preview3D.cs.meta b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Preview3D.cs.meta deleted file mode 100644 index 5c9d82c3e5e..00000000000 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Preview3D.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 00a8f7d2349fd5e4abc3d4abc125519b -timeCreated: 1503569120 -licenseType: Pro -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Rotate3DManipulator.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Rotate3DManipulator.cs deleted file mode 100644 index b9266471ed7..00000000000 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Rotate3DManipulator.cs +++ /dev/null @@ -1,86 +0,0 @@ -#if false -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor; - -namespace UnityEditor.VFX.UI -{ - class Rotate3DManipulator : Manipulator - { - public Rotate3DManipulator(Element3D element3D) - { - m_Element3D = element3D; - } - - Element3D m_Element3D; - - protected override void RegisterCallbacksOnTarget() - { - target.RegisterCallback(OnMouseUp, Capture.Capture); - target.RegisterCallback(OnMouseDown, Capture.Capture); - //target.RegisterCallback(OnKeyDown); - } - - protected override void UnregisterCallbacksFromTarget() - { - target.UnregisterCallback(OnMouseUp); - target.UnregisterCallback(OnMouseDown); - //target.UnregisterCallback(OnKeyDown); - } - - void Release() - { - if (m_Dragging) - { - m_Dragging = false; - if (target.HasMouseCapture()) - target.ReleaseMouseCapture(); - EditorGUIUtility.SetWantsMouseJumping(0); - - target.UnregisterCallback(OnMouseMove); - } - } - - bool m_Dragging; - - void OnMouseDown(MouseDownEvent e) - { - m_Dragging = true; - EditorGUIUtility.SetWantsMouseJumping(1); - target.TakeMouseCapture(); - target.RegisterCallback(OnMouseMove, Capture.Capture); - m_Dragging = true; - e.StopPropagation(); - } - - void OnMouseUp(MouseUpEvent e) - { - Release(); - e.StopPropagation(); - } - - void OnMouseMove(MouseMoveEvent e) - { - if (m_Dragging) - { - if (!target.HasMouseCapture()) - { - Release(); - return; - } - Quaternion rotation = m_Element3D.rotation; - rotation = Quaternion.AngleAxis(e.mouseDelta.y * .003f * Mathf.Rad2Deg, rotation * Vector3.right) * rotation; - rotation = Quaternion.AngleAxis(e.mouseDelta.x * .003f * Mathf.Rad2Deg, Vector3.up) * rotation; - - m_Element3D.rotation = rotation; - e.StopPropagation(); - } - } - } -} - -#endif diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Rotate3DManipulator.cs.meta b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Rotate3DManipulator.cs.meta deleted file mode 100644 index cc5026fa3d9..00000000000 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Elements/3D/Rotate3DManipulator.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 188a0d48fcc58b44fbcd0e78baaee4f7 -timeCreated: 1503589466 -licenseType: Pro -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs index eb102a689ea..9d5173a1971 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VFXAssetEditor.cs @@ -262,9 +262,7 @@ private void CreateVisualEffect() m_PreviewUtility.camera.farClipPlane = 10000.0f; m_PreviewUtility.camera.clearFlags = CameraClearFlags.SolidColor; m_PreviewUtility.ambientColor = new Color(.1f, .1f, .1f, 1.0f); - m_PreviewUtility.lights[0].intensity = 1.4f; m_PreviewUtility.lights[0].transform.rotation = Quaternion.Euler(40f, 40f, 0); - m_PreviewUtility.lights[1].intensity = 1.4f; m_VisualEffectGO = new GameObject("VisualEffect (Preview)"); @@ -462,6 +460,10 @@ public override void OnInteractivePreviewGUI(Rect r, GUIStyle background) if (needsRender) { + //Forcing fixed intensity in case of lazily addition of HDAdditionalLightData + m_PreviewUtility.lights[0].intensity = 1.4f; + m_PreviewUtility.lights[1].intensity = 1.4f; + m_RemainingFramesToRender--; m_PreviewUtility.BeginPreview(m_LastArea, background); From 2b98655e1cf68ebf8497edd9f70a2e095b548981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Tue, 7 Oct 2025 16:44:57 +0000 Subject: [PATCH 053/115] Material Upgrader - Make sure src and dst shaders exist. --- .../MaterialUpgraderMissingShadersTests.cs | 47 +++++++++++++++++++ ...aterialUpgraderMissingShadersTests.cs.meta | 2 + .../MaterialUpgraderProviders.cs | 2 +- .../MaterialUpgraderProviders.cs | 4 +- 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.core/Tests/Editor/Tools/MaterialUpgrader/MaterialUpgraderMissingShadersTests.cs create mode 100644 Packages/com.unity.render-pipelines.core/Tests/Editor/Tools/MaterialUpgrader/MaterialUpgraderMissingShadersTests.cs.meta diff --git a/Packages/com.unity.render-pipelines.core/Tests/Editor/Tools/MaterialUpgrader/MaterialUpgraderMissingShadersTests.cs b/Packages/com.unity.render-pipelines.core/Tests/Editor/Tools/MaterialUpgrader/MaterialUpgraderMissingShadersTests.cs new file mode 100644 index 00000000000..8b861c7ea45 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/Tools/MaterialUpgrader/MaterialUpgraderMissingShadersTests.cs @@ -0,0 +1,47 @@ +using System.Text; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.Rendering; +using static UnityEngine.Rendering.ReloadAttribute; + +namespace UnityEditor.Rendering.Tools.Tests +{ + [TestFixture] + [Category("Graphics Tools")] + class MaterialUpgraderMissingShadersTests + { + [Test] + public void TestMissingShaders() + { + StringBuilder sb = new StringBuilder(); + + var pipelineTypes = TypeCache.GetTypesDerivedFrom(); + + var testAssembly = typeof(MaterialUpgraderMissingShadersTests).Assembly; + foreach (var type in pipelineTypes) + { + var allURPUpgraders = MaterialUpgrader.FetchAllUpgradersForPipeline(type); + foreach (var upgrader in allURPUpgraders) + { + var assembly = upgrader.GetType().Assembly; + if (testAssembly == assembly) + continue; + + var src = Shader.Find(upgrader.OldShaderPath); + if (src == null) + { + sb.AppendLine($"Src Shader '{upgrader.OldShaderPath}' not found for upgrader {upgrader.GetType().Name}. This may indicate that the shader has been removed or renamed."); + } + + var dst = Shader.Find(upgrader.NewShaderPath); + if (dst == null) + { + sb.AppendLine($"Dst Shader '{upgrader.NewShaderPath}' not found for upgrader {upgrader.GetType().Name}. This may indicate that the shader has been removed or renamed."); + } + } + } + Assert.AreEqual(0, sb.Length, sb.ToString()); + } + } + +} diff --git a/Packages/com.unity.render-pipelines.core/Tests/Editor/Tools/MaterialUpgrader/MaterialUpgraderMissingShadersTests.cs.meta b/Packages/com.unity.render-pipelines.core/Tests/Editor/Tools/MaterialUpgrader/MaterialUpgraderMissingShadersTests.cs.meta new file mode 100644 index 00000000000..e8acb813d15 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/Tools/MaterialUpgrader/MaterialUpgraderMissingShadersTests.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f26b721c3441f704c83451dc3d5769a2 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Tools/MaterialUpgrader/MaterialUpgraderProviders.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Tools/MaterialUpgrader/MaterialUpgraderProviders.cs index 871aedea41a..3bf94fd4a16 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Tools/MaterialUpgrader/MaterialUpgraderProviders.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Tools/MaterialUpgrader/MaterialUpgraderProviders.cs @@ -11,7 +11,7 @@ public IEnumerable GetUpgraders() { yield return new StandardsToHDLitMaterialUpgrader("Standard", "HDRP/Lit"); yield return new StandardsToHDLitMaterialUpgrader("Standard (Specular setup)", "HDRP/Lit"); - yield return new StandardsToHDLitMaterialUpgrader("Standard (Roughness setup)", "HDRP/Lit"); + yield return new StandardsToHDLitMaterialUpgrader("Autodesk Interactive", "HDRP/Lit"); } } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Tools/MaterialUpgrader/MaterialUpgraderProviders.cs b/Packages/com.unity.render-pipelines.universal/Editor/Tools/MaterialUpgrader/MaterialUpgraderProviders.cs index 538bd849b21..8046005f407 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Tools/MaterialUpgrader/MaterialUpgraderProviders.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Tools/MaterialUpgrader/MaterialUpgraderProviders.cs @@ -100,7 +100,7 @@ public IEnumerable GetUpgraders() { yield return new StandardSimpleLightingUpgrader("Mobile/Diffuse", SupportedUpgradeParams.diffuseOpaque); yield return new StandardSimpleLightingUpgrader("Mobile/Bumped Specular", SupportedUpgradeParams.specularOpaque); - yield return new StandardSimpleLightingUpgrader("Mobile/Bumped Specular (1 Directional Light)", SupportedUpgradeParams.specularOpaque); + yield return new StandardSimpleLightingUpgrader("Mobile/Bumped Specular (1 Directional Realtime Light)", SupportedUpgradeParams.specularOpaque); yield return new StandardSimpleLightingUpgrader("Mobile/Bumped Diffuse", SupportedUpgradeParams.diffuseOpaque); yield return new StandardSimpleLightingUpgrader("Mobile/Unlit (Supports Lightmap)", SupportedUpgradeParams.diffuseOpaque); yield return new StandardSimpleLightingUpgrader("Mobile/VertexLit", SupportedUpgradeParams.specularOpaque); @@ -130,7 +130,7 @@ public IEnumerable GetUpgraders() // Standard particle shaders yield return new ParticleUpgrader("Particles/Standard Surface"); yield return new ParticleUpgrader("Particles/Standard Unlit"); - yield return new ParticleUpgrader("Particles/VertexLit Blended"); + yield return new ParticleUpgrader("Legacy Shaders/Particles/VertexLit Blended"); } } From 720b25b30f5bb4709d051a95ea1eba8a1918ed6c Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Wed, 8 Oct 2025 10:21:01 +0000 Subject: [PATCH 054/115] KEEP-41 Test Project -> Package ConversionTests: /EditModeAndPlayModeTests/AssetType --- .../Terrain/Textures/dry_soil_CH.png.meta | 117 ------------------ 1 file changed, 117 deletions(-) delete mode 100644 Packages/com.unity.shadergraph/Samples~/Terrain/Textures/dry_soil_CH.png.meta diff --git a/Packages/com.unity.shadergraph/Samples~/Terrain/Textures/dry_soil_CH.png.meta b/Packages/com.unity.shadergraph/Samples~/Terrain/Textures/dry_soil_CH.png.meta deleted file mode 100644 index 080f2f7cd73..00000000000 --- a/Packages/com.unity.shadergraph/Samples~/Terrain/Textures/dry_soil_CH.png.meta +++ /dev/null @@ -1,117 +0,0 @@ -fileFormatVersion: 2 -guid: 5177befc12f3f8543828689be98cfb30 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 1 - 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 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 2 - aniso: 16 - 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 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 2 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: From 845f2094811662332e4c1e38fb35288ba0c3410c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Carr=C3=A8re?= Date: Wed, 8 Oct 2025 10:21:02 +0000 Subject: [PATCH 055/115] docg-7688: describe disable color tint in HDRP canvas ref page --- .../Documentation~/canvas-master-stack-reference.md | 2 +- .../shader-properties/surface-options/disable-color-tint.md | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/snippets/shader-properties/surface-options/disable-color-tint.md diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/canvas-master-stack-reference.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/canvas-master-stack-reference.md index efa077e5724..ce06104815a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/canvas-master-stack-reference.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/canvas-master-stack-reference.md @@ -62,4 +62,4 @@ The following table describes the Surface options: [!include[](snippets/shader-properties/surface-options/material-type.md)] [!include[](snippets/shader-properties/surface-options/alpha-clipping.md)] - +[!include[](snippets/shader-properties/surface-options/disable-color-tint.md)] diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/snippets/shader-properties/surface-options/disable-color-tint.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/snippets/shader-properties/surface-options/disable-color-tint.md new file mode 100644 index 00000000000..a49f8f41d2c --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/snippets/shader-properties/surface-options/disable-color-tint.md @@ -0,0 +1,6 @@ + +Disable Color Tint +N/A +N/A +Prevents Shader Graph tinting the texture with the color of the UI element. If you enable this setting, use a [Vertex Color Node](https://docs.unity3d.com/Packages/com.unity.shadergraph@latest/index.html?preview=1&subfolder=/manual/Vertex-Color-Node.html) to access the color of the UI element. + From 5e3efeb48aa6a17f21528693d3d39d1259066bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Wed, 8 Oct 2025 10:21:03 +0000 Subject: [PATCH 056/115] Render Pipeline Converter - Fixes for PPv2 and Serialization warnings of converters --- .../Tools/Converter/AssetsConverter.cs | 1 + ...RenderPipelineConverterMaterialUpgrader.cs | 2 + .../BuiltInToHDRPMaterialUpgrader.cs | 2 + .../2D/Converter/Base2DMaterialUpgrader.cs | 1 + .../BuiltInAndURP3DTo2DMaterialUpgrader.cs | 2 + .../BuiltInToURP2DMaterialUpgrader.cs | 2 + .../ParametricToFreeformLightUpgrader.cs | 1 + .../Editor/Converter/Converters.cs | 264 +++++++++--------- .../Converter/RenderPipelineConverter.cs | 1 + .../Converters/AnimationClipConverter.cs | 1 + .../BuiltInToURP3DMaterialUpgrader.cs | 2 + .../Tools/Converters/PPv2/PPv2Converter.cs | 5 +- .../ReadonlyMaterialConverter.cs | 1 + .../Converters/RenderSettingsConverter.cs | 1 + .../Editor/RenderGraphTests.HelperPasses.cs | 7 + .../Tools/Converters/ConvertersTests.cs | 98 +++---- ...derPipelines.Universal.Editor.Tests.asmdef | 8 +- .../SRP_SmokeTest/Packages/manifest.json | 3 +- 18 files changed, 217 insertions(+), 185 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/AssetsConverter.cs b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/AssetsConverter.cs index db56c9a4dae..f420824415a 100644 --- a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/AssetsConverter.cs +++ b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/AssetsConverter.cs @@ -4,6 +4,7 @@ namespace UnityEditor.Rendering.Converter { + [Serializable] internal abstract class AssetsConverter : IRenderPipelineConverter { protected abstract List<(string query, string description)> contextSearchQueriesAndIds { get; } diff --git a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/RenderPipelineConverterMaterialUpgrader.cs b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/RenderPipelineConverterMaterialUpgrader.cs index a2ac8d2602d..f2b987ba6e1 100644 --- a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/RenderPipelineConverterMaterialUpgrader.cs +++ b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/RenderPipelineConverterMaterialUpgrader.cs @@ -1,9 +1,11 @@ +using System; using System.Collections.Generic; using System.Text; using UnityEngine; namespace UnityEditor.Rendering.Converter { + [Serializable] internal abstract class RenderPipelineConverterMaterialUpgrader : AssetsConverter { public override bool isEnabled => m_UpgradersCache.Count > 0; diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Tools/Converter/BuiltInToHDRPMaterialUpgrader.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Tools/Converter/BuiltInToHDRPMaterialUpgrader.cs index 23b28c8df9f..43dd879866f 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Tools/Converter/BuiltInToHDRPMaterialUpgrader.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Tools/Converter/BuiltInToHDRPMaterialUpgrader.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using UnityEditor.Rendering.Converter; using UnityEngine.Categorization; @@ -5,6 +6,7 @@ namespace UnityEditor.Rendering.HighDefinition { + [Serializable] [PipelineConverter("Built-in", "High Definition Render Pipeline (HDRP)")] [ElementInfo(Name = "Material Shader Converter", Order = 100, diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/Base2DMaterialUpgrader.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/Base2DMaterialUpgrader.cs index 21f44382188..fad1ef5018f 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/Base2DMaterialUpgrader.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/Base2DMaterialUpgrader.cs @@ -8,6 +8,7 @@ namespace UnityEditor.Rendering.Universal { [URPHelpURL("features/rp-converter")] + [Serializable] internal abstract class Base2DMaterialUpgrader : RenderPipelineConverter { public const string k_PackageMaterialsPath = "Packages/com.unity.render-pipelines.universal/Runtime/Materials/"; diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/BuiltInAndURP3DTo2DMaterialUpgrader.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/BuiltInAndURP3DTo2DMaterialUpgrader.cs index b824450a7d4..c715cffc05d 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/BuiltInAndURP3DTo2DMaterialUpgrader.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/BuiltInAndURP3DTo2DMaterialUpgrader.cs @@ -1,3 +1,4 @@ +using System; using UnityEditor.Rendering.Converter; using UnityEngine; using UnityEngine.Categorization; @@ -5,6 +6,7 @@ namespace UnityEditor.Rendering.Universal { + [Serializable] [PipelineTools] [ElementInfo(Name = "Convert Built-in and URP ( Universal Renderer ) Materials to Mesh2D-Lit-Default", Order = 300, diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/BuiltInToURP2DMaterialUpgrader.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/BuiltInToURP2DMaterialUpgrader.cs index 295e4f69310..e01d6e5011f 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/BuiltInToURP2DMaterialUpgrader.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/BuiltInToURP2DMaterialUpgrader.cs @@ -1,3 +1,4 @@ +using System; using UnityEditor.Rendering.Converter; using UnityEngine; using UnityEngine.Categorization; @@ -5,6 +6,7 @@ namespace UnityEditor.Rendering.Universal { + [Serializable] [PipelineConverter("Built-in", "Universal Render Pipeline (2D Renderer)")] [ElementInfo(Name = "Material and Material Reference Upgrade", Order = 400, diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/ParametricToFreeformLightUpgrader.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/ParametricToFreeformLightUpgrader.cs index 2a614b3f9f1..1b78cbfb5c7 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/ParametricToFreeformLightUpgrader.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Converter/ParametricToFreeformLightUpgrader.cs @@ -9,6 +9,7 @@ namespace UnityEditor.Rendering.Universal { + [Serializable] [PipelineTools] [ElementInfo(Name = "Parametric to Freeform Light Upgrade", Order = 100, diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Converter/Converters.cs b/Packages/com.unity.render-pipelines.universal/Editor/Converter/Converters.cs index 5da55a22bd8..2eba9b457a1 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Converter/Converters.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Converter/Converters.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Text; +using UnityEditor.Rendering.Converter; using UnityEngine; -using UnityEngine.Pool; namespace UnityEditor.Rendering.Universal { @@ -10,6 +11,7 @@ namespace UnityEditor.Rendering.Universal /// Filter for the list of converters used in batch mode. /// /// .) + [Obsolete("This enum has been obsoleted, please use the Type of the converter directly. #from(6000.4)")] public enum ConverterFilter { ///
@@ -23,21 +25,11 @@ public enum ConverterFilter Exclusive } - [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)] - internal class RenderPipelineConverterContainerAttribute : Attribute - { - public Type container { get; } - - public RenderPipelineConverterContainerAttribute(Type container) - { - this.container = container; - } - } - /// /// The container to run in batch mode. /// /// .) + [Obsolete("This enum has been obsoleted, please use the Type of the converter directly. #from(6000.4)")] public enum ConverterContainerId { /// @@ -61,58 +53,75 @@ public enum ConverterContainerId UpgradeURP2DAssets, } + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)] + [Obsolete("This attribute has been obsoleted, please use the Type of the converter directly. #from(6000.4)")] + internal class BatchModeConverterInfo : Attribute + { + public Type converterType { get; } + public ConverterContainerId containerName {get;} + + public BatchModeConverterInfo(ConverterContainerId containerName, Type converterType) + { + this.converterType = converterType; + this.containerName = containerName; + } + } + /// /// The converter to run in batch mode. /// /// .) + [Obsolete("This enum has been obsoleted, please use the Type of the converter directly. #from(6000.4)")] public enum ConverterId { /// /// Use this for the material converters. /// - [RenderPipelineConverterContainer(typeof(BuiltInToURPConverterContainer))] + [BatchModeConverterInfo(ConverterContainerId.BuiltInToURP,typeof(BuiltInToURP3DMaterialUpgrader))] Material, /// /// Use this for the render settings converters. /// - [RenderPipelineConverterContainer(typeof(BuiltInToURPConverterContainer))] + [BatchModeConverterInfo(ConverterContainerId.BuiltInToURP, typeof(RenderSettingsConverter))] RenderSettings, /// /// Use this for the animation clip converters. /// - [RenderPipelineConverterContainer(typeof(BuiltInToURPConverterContainer))] + [BatchModeConverterInfo(ConverterContainerId.BuiltInToURP, typeof(AnimationClipConverter))] AnimationClip, /// /// Use this for readonly material converters. /// - [RenderPipelineConverterContainer(typeof(BuiltInToURPConverterContainer))] + [BatchModeConverterInfo(ConverterContainerId.BuiltInToURP, typeof(ReadonlyMaterialConverter))] ReadonlyMaterial, /// /// Use this for 2D material conversion /// - [RenderPipelineConverterContainer(typeof(BuiltInToURP2DConverterContainer))] + [BatchModeConverterInfo(ConverterContainerId.BuiltInToURP2D, typeof(BuiltInToURP2DMaterialUpgrader))] ReadonlyMaterial2D, /// /// Use this for 3D URP material conversion /// - [RenderPipelineConverterContainer(typeof(BuiltInAndURP3DTo2DConverterContainer))] + [BatchModeConverterInfo(ConverterContainerId.UpgradeURP2DAssets, typeof(BuiltInAndURP3DTo2DMaterialUpgrader))] URPToReadonlyMaterial2D, +#if PPV2_EXISTS /// /// Use this for post processing V2 converters. /// - [RenderPipelineConverterContainer(typeof(BuiltInToURPConverterContainer))] + [BatchModeConverterInfo(ConverterContainerId.BuiltInToURP, typeof(PPv2Converter))] PPv2, +#endif /// /// Use this for parametric to freeform light converters. /// - [RenderPipelineConverterContainer(typeof(UpgradeURP2DAssetsContainer))] + [BatchModeConverterInfo(ConverterContainerId.UpgradeURP2DAssets, typeof(ParametricToFreeformLightUpgrader))] ParametricToFreeformLight, } @@ -121,75 +130,46 @@ public enum ConverterId /// public static class Converters { - internal abstract class EnumTypeMap - where TEnum : struct, Enum + private static void DumpAvailableConverters() { - protected abstract (TEnum id, Type type)[] Map { get; } - - public Type GetTypeForId(TEnum id) + StringBuilder sb = new(); + foreach (var converter in TypeCache.GetTypesDerivedFrom()) { - for (int i = 0; i < Map.Length; i++) - { - if (Map[i].id.Equals(id)) - return Map[i].type; - } - return null; - } + if (converter.IsAbstract || converter.IsInterface) + continue; - public TEnum? GetIdForType(Type type) - { - for (int i = 0; i < Map.Length; i++) - { - if (Map[i].type == type) - return Map[i].id; - } - return null; + sb.AppendLine(converter.AssemblyQualifiedName); } - } - - internal class ConverterTypeMap : EnumTypeMap - { - protected override (ConverterId id, Type type)[] Map { get; } = - { - (ConverterId.Material, typeof(BuiltInToURP3DMaterialUpgrader)), - (ConverterId.RenderSettings, typeof(RenderSettingsConverter)), - (ConverterId.AnimationClip, typeof(AnimationClipConverter)), - (ConverterId.ReadonlyMaterial, typeof(ReadonlyMaterialConverter)), - (ConverterId.ReadonlyMaterial2D, typeof(BuiltInToURP2DMaterialUpgrader)), - (ConverterId.URPToReadonlyMaterial2D, typeof(BuiltInAndURP3DTo2DMaterialUpgrader)), - #if PPV2_EXISTS - (ConverterId.PPv2, typeof(PPv2Converter)), - #endif - (ConverterId.ParametricToFreeformLight, typeof(ParametricToFreeformLightUpgrader)), - }; - } - internal class ConverterContainerTypeMap : EnumTypeMap - { - protected override (ConverterContainerId id, Type type)[] Map { get; } = - { - (ConverterContainerId.BuiltInToURP, typeof(BuiltInToURPConverterContainer)), - (ConverterContainerId.BuiltInToURP2D, typeof(BuiltInToURP2DConverterContainer)), - (ConverterContainerId.BuiltInAndURPToURP2D, typeof(BuiltInAndURP3DTo2DConverterContainer)), - (ConverterContainerId.UpgradeURP2DAssets, typeof(UpgradeURP2DAssetsContainer)), - }; + Debug.Log(sb.ToString()); } /// /// Call this method to run all the converters in a specific container in batch mode. /// /// The name of the container which will be batched. All Converters in this Container will run if prerequisites are met. + [Obsolete("RunInBatchMode will be removed. Please open the Unity Editor and perform the conversion from the Converter UI. #from(6000.4)", false)] public static void RunInBatchMode(ConverterContainerId containerName) { - Array enumValues = Enum.GetValues(typeof(ConverterId)); - List converterList = new List(); + RunInBatchMode(containerName, new List() { }, ConverterFilter.Exclusive); + } + + [Obsolete("RunInBatchMode will be removed. Please open the Unity Editor and perform the conversion from the Converter UI. #from(6000.4)", false)] - foreach (object value in enumValues) + internal static bool TryGetTypeInContainer(ConverterId value, ConverterContainerId containerName, out Type type) + { + type = null; + var memberInfo = typeof(ConverterId).GetMember(value.ToString()); + if (memberInfo.Length > 0) { - converterList.Add((ConverterId)value); + var attr = memberInfo[0].GetCustomAttribute(); + if (attr != null) + { + if(attr.containerName == containerName) + type = attr.converterType; + } } - - RunInBatchMode(containerName, converterList, ConverterFilter.Inclusive); + return type != null; } /// @@ -198,92 +178,112 @@ public static void RunInBatchMode(ConverterContainerId containerName) /// The name of the container which will be batched. /// The list of converters that will be either included or excluded from batching. These converters need to be part of the passed in container for them to run. /// The enum that decide if the list of converters will be included or excluded when batching. + [Obsolete("RunInBatchMode will be removed. Please open the Unity Editor and perform the conversion from the Converter UI. #from(6000.4)", false)] public static void RunInBatchMode(ConverterContainerId containerName, List converterList, ConverterFilter converterFilter) { - BatchConverters(FilterConverters(containerName, converterList, converterFilter)); + var types = FilterConverters(containerName, converterList, converterFilter); + RunInBatchMode(types); } - internal static Type GetConverterContainer(this ConverterId value) + [Obsolete("RunInBatchMode will be removed. Please open the Unity Editor and perform the conversion from the Converter UI. #from(6000.4)", false)] + + internal static List FilterConverters(ConverterContainerId containerName, List converterList, ConverterFilter converterFilter) { - var memberInfo = typeof(ConverterId).GetMember(value.ToString()); - if (memberInfo.Length > 0) + Array converters = Enum.GetValues(typeof(ConverterId)); + + List converterTypes = new(); + foreach (object value in converters) { - var attr = memberInfo[0].GetCustomAttribute(); - if (attr != null) - return attr.container; + var converterEnum = (ConverterId)value; + if (TryGetTypeInContainer(converterEnum, containerName, out var type)) + { + bool inFilter = converterList.Contains(converterEnum); + if ((converterFilter == ConverterFilter.Inclusive) ^ !inFilter) + converterTypes.Add(type); + } } - return null; + + return converterTypes; } - internal static List FilterConverters(ConverterContainerId containerName, List converterList, ConverterFilter converterFilter) + /// + /// Call this method to run a specific list of converters in batch mode. + /// + /// The list of converters to run + /// False if there were errors. + internal static bool RunInBatchMode(List converterTypes) { - var converterContainerMap = new ConverterContainerTypeMap(); - var containerID = converterContainerMap.GetTypeForId(containerName); - if (containerID == null) - throw new KeyNotFoundException($"Container ID '{containerName}' not found."); + List convertersToExecute = new(); - using (HashSetPool.Get(out var tmpConverterFilter)) + bool errors = false; + foreach (var type in converterTypes) { - var converterMap = new ConverterTypeMap(); - foreach (var converterID in converterList) - { - var converterType = converterMap.GetTypeForId(converterID); - if (converterType == null) - throw new KeyNotFoundException($"Container Type '{converterType}' not found."); - tmpConverterFilter.Add(converterType); - } - - List convertersToExecute = new List(); - foreach (var converter in TypeCache.GetTypesDerivedFrom()) + try { - if (converter.IsAbstract || converter.IsInterface) - continue; - - // If Inclusive and inFilter is true will add the converter - // If Exclusive and inFilter is false will add the converter - bool inFilter = tmpConverterFilter.Contains(converter); - if ((converterFilter == ConverterFilter.Inclusive) ^ !inFilter) + var instance = Activator.CreateInstance(type) as IRenderPipelineConverter; + if (instance == null) { - var instance = Activator.CreateInstance(converter) as RenderPipelineConverter; - var converterId = converterMap.GetIdForType(converter); - if (converterId.HasValue && GetConverterContainer(converterId.Value) == containerID) - convertersToExecute.Add(instance); + Debug.LogWarning($"{type} is not a converter type."); + errors = true; } + else + convertersToExecute.Add(instance); } + catch + { + Debug.LogWarning($"Unable to create instance of type {type}."); + errors = true; + } + } - return convertersToExecute; + if (errors) + { + Debug.LogWarning($"Please use any of the given Converter Types."); + DumpAvailableConverters(); } + + BatchConverters(convertersToExecute); + + return !errors; } - internal static void BatchConverters(List converters) + internal static void BatchConverters(List converters) { - foreach (RenderPipelineConverter converter in converters) + foreach (var converter in converters) { - List converterItemInfos = new List(); - var initCtx = new InitializeConverterContext { items = converterItemInfos }; - initCtx.isBatchMode = true; - converter.OnInitialize(initCtx, () => { }); + var sb = new StringBuilder($"Conversion results for item: {converter}:{Environment.NewLine}"); - converter.OnPreRun(); - for (int i = 0; i < initCtx.items.Count; i++) + converter.Scan(OnConverterCompleteDataCollection); + + void OnConverterCompleteDataCollection(List items) { - var item = new ConverterItemInfo() + converter.BeforeConvert(); + foreach (var item in items) { - index = i, - descriptor = initCtx.items[i], - }; - var ctx = new RunItemContext(item); - ctx.isBatchMode = true; - converter.OnRun(ref ctx); - - string converterStatus = ctx.didFail ? $"Fail\nInfo: {ctx.info}" : "Pass"; - Debug.Log($"Name: {ctx.item.descriptor.name}\nConverter Status: {converterStatus}"); - } - - converter.OnPostRun(); + var status = converter.Convert(item, out var message); + switch (status) + { + case Status.Pending: + throw new InvalidOperationException("Converter returned a pending status when converting. This is not supported."); + case Status.Error: + case Status.Warning: + sb.AppendLine($"- {item.name} ({status}) ({message})"); + break; + case Status.Success: + { + sb.AppendLine($"- {item.name} ({status})"); + message = "Conversion successful!"; + } + break; + } + } + converter.AfterConvert(); - AssetDatabase.SaveAssets(); + Debug.Log(sb.ToString()); + } } + + AssetDatabase.SaveAssets(); } } } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Converter/RenderPipelineConverter.cs b/Packages/com.unity.render-pipelines.universal/Editor/Converter/RenderPipelineConverter.cs index a41a0119fe9..2882a1559d4 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Converter/RenderPipelineConverter.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Converter/RenderPipelineConverter.cs @@ -9,6 +9,7 @@ namespace UnityEditor.Rendering.Universal { // Might need to change this name before making it public + [Serializable] internal abstract class RenderPipelineConverter : IRenderPipelineConverter { /// diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/AnimationClipConverter.cs b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/AnimationClipConverter.cs index 942eab19eb7..48ecc50c68e 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/AnimationClipConverter.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/AnimationClipConverter.cs @@ -11,6 +11,7 @@ namespace UnityEditor.Rendering.Universal { + [Serializable] [URPHelpURL("features/rp-converter")] [PipelineConverter("Built-in", "Universal Render Pipeline (Universal Renderer)")] [ElementInfo(Name = "Animation Clip", diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/BuiltInToURP3DMaterialUpgrader.cs b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/BuiltInToURP3DMaterialUpgrader.cs index a35c10bd2b1..50960cdfa8f 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/BuiltInToURP3DMaterialUpgrader.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/BuiltInToURP3DMaterialUpgrader.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using UnityEditor.Rendering.Converter; using UnityEngine.Categorization; @@ -5,6 +6,7 @@ namespace UnityEditor.Rendering.Universal { + [Serializable] [PipelineConverter("Built-in", "Universal Render Pipeline (Universal Renderer)")] [ElementInfo(Name = "Material Shader Converter", Order = 100, diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/PPv2/PPv2Converter.cs b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/PPv2/PPv2Converter.cs index 89d8354ce54..6c859eb0ed3 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/PPv2/PPv2Converter.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/PPv2/PPv2Converter.cs @@ -19,6 +19,7 @@ namespace UnityEditor.Rendering.Universal { [URPHelpURL("features/rp-converter")] + [Serializable] [PipelineConverter("Built-in", "Universal Render Pipeline (Universal Renderer)")] [ElementInfo(Name = "Post-Processing Stack v2", Order = int.MaxValue, @@ -26,8 +27,8 @@ namespace UnityEditor.Rendering.Universal internal class PPv2Converter : AssetsConverter { - public override bool isEnabled => effectConverters?.Count() > 0; - public override string isDisabledMessage => "No converters specified."; + public override bool isEnabled => s_PostProcessTypesToSearch?.Count() > 0; + public override string isDisabledMessage => "Missing types to search"; private IEnumerable effectConverters = null; diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverter.cs b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverter.cs index e68c9cdbe89..09b95360728 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverter.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverter.cs @@ -98,6 +98,7 @@ public static Material[] GetBuiltInMaterials() } } + [Serializable] [PipelineConverter("Built-in", "Universal Render Pipeline (Universal Renderer)")] [ElementInfo(Name = "Material Reference Converter", Order = 100, diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/RenderSettingsConverter.cs b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/RenderSettingsConverter.cs index 81c1535a066..94417d8d956 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/RenderSettingsConverter.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Tools/Converters/RenderSettingsConverter.cs @@ -9,6 +9,7 @@ namespace UnityEditor.Rendering.Universal { + [Serializable] [URPHelpURL("features/rp-converter")] [PipelineConverter("Built-in", "Universal Render Pipeline (Universal Renderer)")] [ElementInfo(Name = "Rendering Settings", diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderGraphTests.HelperPasses.cs b/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderGraphTests.HelperPasses.cs index bd53ee802c7..f1fa2db980f 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderGraphTests.HelperPasses.cs +++ b/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderGraphTests.HelperPasses.cs @@ -13,6 +13,13 @@ namespace UnityEngine.Rendering.Tests { internal partial class RenderGraphTests : RenderGraphTestsCore { + [OneTimeSetUp] + public void OneTimeSetup() + { + if (!(GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset)) + Assert.Ignore("Current pipeline is not URP. Skipping tests..."); + } + static GraphicsFormat[] depthBlitTestFormats = { GraphicsFormat.D32_SFloat, diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ConvertersTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ConvertersTests.cs index 023a7b21842..1c292a1ebaa 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ConvertersTests.cs +++ b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ConvertersTests.cs @@ -1,13 +1,55 @@ using System; using System.Collections.Generic; using NUnit.Framework; -using static UnityEditor.Rendering.Universal.Converters; namespace UnityEditor.Rendering.Universal.Tools { [Category("Graphics Tools")] class ConverterTests { + [Serializable] + class BatchModeConverter : RenderPipelineConverter + { + public static bool s_Initialize = false; + public static bool s_Run = false; + + public override void OnInitialize(InitializeConverterContext context, Action callback) + { + s_Initialize = true; + context.AddAssetToConvert(new ConverterItemDescriptor { name = "Dummy", info = "Some placeholder info." }); + callback?.Invoke(); + } + + public override void OnRun(ref RunItemContext context) + { + s_Run = true; + } + } + + [Test] + public void BatchModeRuns() + { + BatchModeConverter.s_Initialize = false; + BatchModeConverter.s_Run = false; + bool ok = Converters.RunInBatchMode(new List() { typeof(BatchModeConverter) }); + Assert.IsTrue(BatchModeConverter.s_Initialize); + Assert.IsTrue(BatchModeConverter.s_Run); + Assert.IsTrue(ok); + } + + class NotAConverterType + { + + } + + [Test] + public void BatchModeFails() + { + bool ok = Converters.RunInBatchMode(new List() { typeof(NotAConverterType) }); + Assert.IsFalse(ok); + } + +#pragma warning disable CS0618 // Type or member is obsolete public static IEnumerable TestCases() { yield return new TestCaseData( @@ -20,7 +62,7 @@ public static IEnumerable TestCases() ConverterContainerId.BuiltInToURP, new List { ConverterId.ParametricToFreeformLight }, ConverterFilter.Inclusive, - new List () + new List() ).SetName("When Using Inclusive filter with Light in the wrong category. The Filter returns nothing"); yield return new TestCaseData( @@ -75,71 +117,29 @@ public static IEnumerable TestCases() ).SetName("BuiltInToURP2D - When Using Exclusive filter with no converters. The filter returns everything"); yield return new TestCaseData( - ConverterContainerId.BuiltInAndURPToURP2D, + ConverterContainerId.UpgradeURP2DAssets, new List(), ConverterFilter.Exclusive, - new List - { - typeof(BuiltInAndURP3DTo2DMaterialUpgrader), - } - ).SetName("BuiltInAndURPToURP2D - When Using Exclusive filter with no converters. The filter returns everything"); - - yield return new TestCaseData( - ConverterContainerId.UpgradeURP2DAssets, - new List(), - ConverterFilter.Exclusive, new List { + typeof(BuiltInAndURP3DTo2DMaterialUpgrader), typeof(ParametricToFreeformLightUpgrader) } - ).SetName("UpgradeURP2DAssets - When Using Exclusive filter with no converters. The filter returns everything") - .Ignore("Temporarily disabled because of 2D pixel perfect upgrader"); + ).SetName("UpgradeURP2DAssets - When Using Exclusive filter with no converters. The filter returns everything"); } [TestCaseSource(nameof(TestCases))] - [Ignore("Temporarily disabled to land work")] //Task to re-enable SRP-922 public void FilterConverters_ShouldReturnExpectedConverters( ConverterContainerId containerId, List filterList, ConverterFilter filterMode, List expectedTypes) { - var result = Converters.FilterConverters(containerId, filterList, filterMode); - - var actualTypes = new List(); - foreach (var converter in result) - { - actualTypes.Add(converter.GetType()); - } - + var actualTypes = Converters.FilterConverters(containerId, filterList, filterMode); CollectionAssert.AreEquivalent(expectedTypes, actualTypes); } - [Test] - [Ignore("Temporarily disabled because of 2D pixel perfect upgrader")] - public void EnsureConverterIsNotForgottenForBatchMode() - { - var converterMap = new ConverterTypeMap(); - foreach (var converter in TypeCache.GetTypesDerivedFrom()) - { - if (converter.IsAbstract || converter.IsInterface) - continue; - - var id = converterMap.GetIdForType(converter); - Assert.IsNotNull(id, $"The converter '{converter.Name}' is missing from the ConverterTypeMap. Please add it to the mapping array."); - } - - var converterContainerMap = new ConverterContainerTypeMap(); - foreach (var converterContainer in TypeCache.GetTypesDerivedFrom()) - { - if (converterContainer.IsAbstract || converterContainer.IsInterface) - continue; - - var id = converterContainerMap.GetIdForType(converterContainer); - Assert.IsNotNull(id, $"The converter container '{converterContainer.Name}' is missing from the ConverterContainerTypeMap. Please add it to the mapping array."); - } - } - +#pragma warning restore CS0618 // Type or member is obsolete } } diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Unity.RenderPipelines.Universal.Editor.Tests.asmdef b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Unity.RenderPipelines.Universal.Editor.Tests.asmdef index 5d36f4f714b..deb2ba2443c 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Unity.RenderPipelines.Universal.Editor.Tests.asmdef +++ b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Unity.RenderPipelines.Universal.Editor.Tests.asmdef @@ -26,6 +26,12 @@ "defineConstraints": [ "UNITY_INCLUDE_TESTS" ], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.postprocessing", + "expression": "0.0.1", + "define": "PPV2_EXISTS" + } + ], "noEngineReferences": false } \ No newline at end of file diff --git a/Tests/SRPTests/Projects/SRP_SmokeTest/Packages/manifest.json b/Tests/SRPTests/Projects/SRP_SmokeTest/Packages/manifest.json index a0baca98e5f..faccb2edf08 100644 --- a/Tests/SRPTests/Projects/SRP_SmokeTest/Packages/manifest.json +++ b/Tests/SRPTests/Projects/SRP_SmokeTest/Packages/manifest.json @@ -2,8 +2,9 @@ "enableLockFile": false, "disableProjectUpdate": true, "dependencies": { - "com.unity.ide.visualstudio": "2.0.17", "com.unity.ide.rider": "3.0.17", + "com.unity.ide.visualstudio": "2.0.17", + "com.unity.postprocessing": "3.5.1", "com.unity.render-pipelines.core": "file:../../../../../Packages/com.unity.render-pipelines.core", "com.unity.render-pipelines.high-definition": "file:../../../../../Packages/com.unity.render-pipelines.high-definition", "com.unity.render-pipelines.high-definition-config": "file:../../../../../Packages/com.unity.render-pipelines.high-definition-config", From 6a3443aee903047cf27d5db259057460790410d0 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Wed, 8 Oct 2025 10:21:04 +0000 Subject: [PATCH 057/115] [VFX] Do not delete existing empty groups when grouping --- .../Views/Controller/VFXViewController.cs | 5 +-- .../Editor/Tests/VFXControllerTests.cs | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/Controller/VFXViewController.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/Controller/VFXViewController.cs index 223d8f43608..4eb39adf348 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/Controller/VFXViewController.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/Controller/VFXViewController.cs @@ -1919,7 +1919,7 @@ VFXUI.GroupInfo PrivateAddGroupNode(Vector2 position) else ui.groupInfos = new VFXUI.GroupInfo[] { newGroupInfo }; - return ui.groupInfos.Last(); + return newGroupInfo; } public void GroupNodes(VFXNodeController[] nodes) => GroupNodes(nodes, Array.Empty()); @@ -1929,13 +1929,14 @@ public void GroupNodes(VFXNodeController[] nodes, VFXStickyNoteController[] stic // If a node from the selection already belongs to a group, remove it from this group foreach (var g in groupNodes.ToArray()) { + if (g.nodes.Count() == 0) + continue; g.RemoveNodes(nodes); g.RemoveStickyNotes(stickyNoteControllers); if (g.nodes.Count() == 0) { RemoveGroupNode(g); } - } // Use a node or a sticky note position when possible to avoid the group to go back to (0,0) when emptied diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXControllerTests.cs b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXControllerTests.cs index 7dc45e3f76e..95ce51e3252 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXControllerTests.cs +++ b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXControllerTests.cs @@ -1612,6 +1612,38 @@ public IEnumerator CustomHLSL_Usage_In_Sample_Water_Unexpected_Dirty() window.Close(); yield return null; } + + [UnityTest, Description("Repro from UUM-113869")] + public IEnumerator Group_Selection_No_Delete_Empty_Groups() + { + //Prepare Asset + var vfxGraph = VFXTestCommon.CreateGraph_And_System(); + var vfxPath = AssetDatabase.GetAssetPath(vfxGraph); + + AssetDatabase.ImportAsset(vfxPath); + yield return null; + + //Prepare Controller + var asset = AssetDatabase.LoadAssetAtPath(vfxPath); + Assert.IsNotNull(asset); + Assert.IsTrue(VisualEffectAssetEditor.OnOpenVFX(asset.GetInstanceID(), 0)); + + var window = VFXViewWindow.GetWindow(asset); + window.LoadAsset(asset, null); + var controller = window.graphView.controller; + + controller.AddStickyNote(Vector2.one * 400, null); + controller.AddGroupNode(500 * Vector2.right); + + for (int i = 0; i < 4; i++) + yield return null; + + var stickyNoteController = controller.stickyNotes.Single(); // This will confirm there's only one sticky note + controller.GroupNodes(Array.Empty(), new[] { stickyNoteController }); + yield return null; + + Assert.AreEqual(2, controller.groupNodes.Count); + } } } #endif From 2b97a45e60f441c7a03ffe8f2ba0a1df73c9bdf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Slysz?= Date: Wed, 8 Oct 2025 10:21:04 +0000 Subject: [PATCH 058/115] Fix LookDev VolumeComponent deserialized at wrong time when creating project from HDRP Template --- .../Volume/VolumeComponentListEditor.cs | 3 +- .../HDRenderPipelineGlobalSettings.cs | 3 +- .../Settings/LookDevVolumeProfileSettings.cs | 32 ++++++++++++------- .../Runtime/Utilities/VolumeUtils.cs | 13 +++++++- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentListEditor.cs b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentListEditor.cs index bc12819098b..debabea11a7 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentListEditor.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Volume/VolumeComponentListEditor.cs @@ -202,7 +202,8 @@ void RefreshEditors() // Recreate editors for existing settings, if any var components = asset.components; for (int i = 0; i < components.Count; i++) - CreateEditor(components[i], m_ComponentsProperty.GetArrayElementAtIndex(i)); + if (components[i] != null) //can happens if a component type is removed and opening old serialized data + CreateEditor(components[i], m_ComponentsProperty.GetArrayElementAtIndex(i)); m_CurrentHashCode = asset.GetComponentListHashCode(); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineGlobalSettings.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineGlobalSettings.cs index 7568959746d..e7738fe3679 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineGlobalSettings.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineGlobalSettings.cs @@ -112,9 +112,10 @@ public override void Initialize(RenderPipelineGlobalSettings source = null) if (TryGet(typeof(LookDevVolumeProfileSettings), out var lookDevSettings) && lookDevSettings is LookDevVolumeProfileSettings lookDevVolumeProfileSettings && + lookDevVolumeProfileSettings.volumeProfile == null && assets != null) { - lookDevVolumeProfileSettings.volumeProfile ??= VolumeUtils.CopyVolumeProfileFromResourcesToAssets(assets.lookDevVolumeProfile); + lookDevVolumeProfileSettings.volumeProfile = VolumeUtils.CopyVolumeProfileFromResourcesToAssets(assets.lookDevVolumeProfile); } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Settings/LookDevVolumeProfileSettings.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Settings/LookDevVolumeProfileSettings.cs index 99691e07873..1b2d50f5c28 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Settings/LookDevVolumeProfileSettings.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Settings/LookDevVolumeProfileSettings.cs @@ -1,4 +1,6 @@ using System; +using UnityEditor.Rendering; +using UnityEditor; namespace UnityEngine.Rendering.HighDefinition { @@ -63,22 +65,28 @@ public VolumeProfile volumeProfile get => m_VolumeProfile; set => this.SetValueAndNotify(ref m_VolumeProfile, value); } - - void IRenderPipelineGraphicsSettings.Reset() - { + #if UNITY_EDITOR - if (UnityEditor.Rendering.EditorGraphicsSettings.TryGetRenderPipelineSettingsForPipeline(out var rpgs)) + //Overriding "Reset" in menu that is not called at HDRPDefaultVolumeProfileSettings creation such Reset() + struct ResetImplementation : IRenderPipelineGraphicsSettingsContextMenu2 + { + public void PopulateContextMenu(LookDevVolumeProfileSettings setting, SerializedProperty _, ref GenericMenu menu) + { + void Reset() { - //UUM-100350 - //When opening the new HDRP project from the template the first time, the global settings is created and the population of IRenderPipelineGraphicsSettings - //will call this Reset() method. At this time, the copied item will appear ok but will be seen as null soon after. This lead to errors when opening the - //inspector of the LookDev's VolumeProfile (at the creation of Editors for VolumeComponent). Closing and opening the project would make this issue disappear. - //This asset data base manipulation issue disappear if we delay it. - UnityEditor.EditorApplication.delayCall += () => - volumeProfile = VolumeUtils.CopyVolumeProfileFromResourcesToAssets(rpgs.lookDevVolumeProfile); + if (EditorGraphicsSettings.TryGetRenderPipelineSettingsForPipeline(out var rpgs)) + { + RenderPipelineGraphicsSettingsEditorUtility.Rebind( + new LookDevVolumeProfileSettings() { volumeProfile = VolumeUtils.CopyVolumeProfileFromResourcesToAssets(rpgs.lookDevVolumeProfile, true) }, + typeof(HDRenderPipeline) + ); + } } -#endif + + menu.AddItem(new GUIContent("Reset"), false, Reset); } } +#endif + } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/VolumeUtils.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/VolumeUtils.cs index a9d731296f1..978c4e4ad3e 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/VolumeUtils.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Utilities/VolumeUtils.cs @@ -43,12 +43,23 @@ public static VolumeProfile CopyVolumeProfileFromResourcesToAssets(VolumeProfile c.parameters[i].SetValue(resourceComponent.parameters[i]); } } - } return profile; } + internal static VolumeProfile CopyVolumeProfileFromResourcesToAssets(VolumeProfile profileInResourcesFolder, bool forcedOverrideValue = false) + { + var profile = CopyVolumeProfileFromResourcesToAssets(profileInResourcesFolder); + + if (profile != null) + foreach (var component in profile.components) + for (int i = 0; i < component.parameters.Count; i++) + component.parameters[i].overrideState = forcedOverrideValue; + + return profile; + } + public static bool IsDefaultVolumeProfile(VolumeProfile volumeProfile, VolumeProfile profileInResourcesFolder) { return volumeProfile != null && volumeProfile.Equals(profileInResourcesFolder); From b0a7656eeba2daa0f925c05f043028f28d62adff Mon Sep 17 00:00:00 2001 From: Masayoshi Miyamoto Date: Wed, 8 Oct 2025 10:21:04 +0000 Subject: [PATCH 059/115] Fix pyramid light's potential UI issue --- .../Editor/Lighting/HDLightUI.cs | 1 + .../Light/HDAdditionalLightData.Migration.cs | 41 ++++++++++++------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs index ad6b7046c14..ff8cc5e77e1 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Lighting/HDLightUI.cs @@ -532,6 +532,7 @@ static void DrawShapeContent(SerializedHDLight serialized, Editor owner) { float newInnerSpotAngle = 360f / Mathf.PI * Mathf.Atan(newAspectRatio * Mathf.Tan(serialized.settings.spotAngle.floatValue * Mathf.PI / 360f)); serialized.settings.innerSpotAngle.floatValue = newInnerSpotAngle; + serialized.settings.areaSizeX.floatValue = newAspectRatio; needsReflectedIntensityRecalc = true; } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.Migration.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.Migration.cs index 62978d4f3d1..325e4b2f427 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.Migration.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.Migration.cs @@ -248,27 +248,38 @@ private static readonly MigrationDescription k_H var light = data.GetComponent(); if (light.type == LightType.Pyramid) { - light.innerSpotAngle = 360f / Mathf.PI * Mathf.Atan(data.m_AspectRatio * Mathf.Tan(light.spotAngle * Mathf.PI / 360f)); - data.m_AspectRatio = -1.0f; + // If the asset is too old and m_AspectRatio isn't defined in HDAdditionalLightData, the value will be the default value -1. + // In such case, we skip the migration. And innerSpotAngle will be the default value specified in Light class. + if (data.m_AspectRatio != -1.0f) + { + light.innerSpotAngle = 360f / Mathf.PI * Mathf.Atan(data.m_AspectRatio * Mathf.Tan(light.spotAngle * Mathf.PI / 360f)); + data.m_AspectRatio = -1.0f; + } } else { - light.innerSpotAngle = data.m_InnerSpotPercent * light.spotAngle / 100f; - data.m_InnerSpotPercent = -1.0f; + if (data.m_InnerSpotPercent != -1.0f) + { + light.innerSpotAngle = data.m_InnerSpotPercent * light.spotAngle / 100f; + data.m_InnerSpotPercent = -1.0f; + } } - if (light.type == LightType.Directional) - { - light.cookieSize2D = new Vector2(data.m_ShapeWidth, data.m_ShapeHeight); - data.m_ShapeWidth = data.m_ShapeHeight = -1.0f; - } - else if (light.type == LightType.Disc) - { - // Disc lights already store their size in Light.areaSize. Don't overwrite it. - } - else + if (data.m_ShapeWidth != -1.0f) { - light.areaSize = new Vector2(data.m_ShapeWidth, data.m_ShapeHeight); + if (light.type == LightType.Directional) + { + light.cookieSize2D = new Vector2(data.m_ShapeWidth, data.m_ShapeHeight); + } + else + { + // Disc: Light.areaSize is filled on UI. Don't overwrite it. + // Pyramid: Light.areaSize.x may have been set in the previous migration step. + if (light.type == LightType.Rectangle || light.type == LightType.Box || light.type == LightType.Tube) + { + light.areaSize = new Vector2(data.m_ShapeWidth, data.m_ShapeHeight); + } + } data.m_ShapeWidth = data.m_ShapeHeight = -1.0f; } }), From 3df7a04fcfac6e142839b590906f7cd5396790c7 Mon Sep 17 00:00:00 2001 From: Daniel Kierkegaard Andersen Date: Wed, 8 Oct 2025 10:21:06 +0000 Subject: [PATCH 060/115] Deprecate implicit conversions for SceneHandle and introduce explicit methods --- .../Editor/2D/LightBatchingDebugger/LightBatchingDebugger.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/LightBatchingDebugger/LightBatchingDebugger.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/LightBatchingDebugger/LightBatchingDebugger.cs index 660a9f08a15..61b1ad6a746 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/LightBatchingDebugger/LightBatchingDebugger.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/LightBatchingDebugger/LightBatchingDebugger.cs @@ -42,7 +42,7 @@ public static void ShowExample() // Variables used for refresh view private bool doRefresh; - private int cachedSceneHandle; + private SceneHandle cachedSceneHandle; private int totalLightCount; private int totalShadowCount; private Vector3 cachedCamPos; From 92d01f46424f8590b327e0ba410c0e5dbf8176f8 Mon Sep 17 00:00:00 2001 From: Pema Malling Date: Wed, 8 Oct 2025 10:21:07 +0000 Subject: [PATCH 061/115] Update area light color when intensity is changed via script --- .../Runtime/Lighting/Light/HDAdditionalLightData.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs index 9f5a9ea4306..8affa0cf57e 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Light/HDAdditionalLightData.cs @@ -19,6 +19,7 @@ struct TimelineWorkaround { public float oldSpotAngle; public Color oldLightColor; + public float oldLightIntensity; public Vector3 oldLossyScale; public bool oldDisplayAreaLightEmissiveMesh; public float oldLightColorTemperature; @@ -2732,12 +2733,14 @@ internal static void TickLateUpdate() #endif if (lightData.legacyLight.color != lightData.timelineWorkaround.oldLightColor + || lightData.legacyLight.intensity != lightData.timelineWorkaround.oldLightIntensity || lightData.timelineWorkaround.oldLossyScale != lightData.transform.lossyScale || lightData.displayAreaLightEmissiveMesh != lightData.timelineWorkaround.oldDisplayAreaLightEmissiveMesh || lightData.legacyLight.colorTemperature != lightData.timelineWorkaround.oldLightColorTemperature) { lightData.UpdateAreaLightEmissiveMesh(); lightData.timelineWorkaround.oldLightColor = lightData.legacyLight.color; + lightData.timelineWorkaround.oldLightIntensity = lightData.legacyLight.intensity; lightData.timelineWorkaround.oldLossyScale = lightData.transform.lossyScale; lightData.timelineWorkaround.oldDisplayAreaLightEmissiveMesh = lightData.displayAreaLightEmissiveMesh; lightData.timelineWorkaround.oldLightColorTemperature = lightData.legacyLight.colorTemperature; From 1fd8c6e27b427c3c16ac996ba3b872435147ef44 Mon Sep 17 00:00:00 2001 From: Aljosha Demeulemeester Date: Wed, 8 Oct 2025 10:21:07 +0000 Subject: [PATCH 062/115] Add EditorTests for RenderingUtils.ReAllocateHandleIfNeeded with TextureDesc overload --- .../Tests/Editor/EditorTests.cs | 77 ++++++++++++++++++- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/EditorTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Editor/EditorTests.cs index 868229c7499..40fcc5c3d7e 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/EditorTests.cs +++ b/Packages/com.unity.render-pipelines.universal/Tests/Editor/EditorTests.cs @@ -2,13 +2,10 @@ using UnityEditor; using UnityEngine; using UnityEngine.Rendering; -using UnityEngine.Profiling; using UnityEngine.Rendering.Universal; using UnityEditor.Rendering.Universal.Internal; using UnityEngine.Experimental.Rendering; -using UnityEngine.Experimental.Rendering.Universal; -using UnityEngine.TestTools; -using System.Xml.Linq; +using UnityEngine.Rendering.RenderGraphModule; class EditorTests { @@ -184,6 +181,78 @@ public void UseReAllocateIfNeededWithoutTextureLeak() Assert.That(posttestTextures, Is.EquivalentTo(pretestTextures), "A texture leak is detected when using RenderingUtils.ReAllocateIfNeeded."); } + [Test] + public void UseReAllocateIfNeededWithoutTextureLeakTextureDesc() + { + Object[] pretestTextures = Resources.FindObjectsOfTypeAll(typeof(Texture)); + RTHandle myHandle = default(RTHandle); + + // URP is not initlized in test framework, init RTHandlePool here which is required for this test. + if (UniversalRenderPipeline.s_RTHandlePool == null) + { + UniversalRenderPipeline.s_RTHandlePool = new RTHandleResourcePool(); + } + + // Realloc RTHandle 100 times with different resolution. + for (int i = 0; i < 100; i++) + { + var desc = new TextureDesc(1, 1 + i); + desc.format = GraphicsFormat.R8G8B8A8_UNorm; + desc.filterMode = FilterMode.Point; + desc.wrapMode = TextureWrapMode.Clamp; + RenderingUtils.ReAllocateHandleIfNeeded(ref myHandle, desc, "TestTexture"); + } + UniversalRenderPipeline.s_RTHandlePool.Cleanup(); + RTHandles.Release(myHandle); + + Object[] posttestTextures = Resources.FindObjectsOfTypeAll(typeof(Texture)); + + Assert.That(posttestTextures, Is.EquivalentTo(pretestTextures), "A texture leak is detected when using RenderingUtils.ReAllocateIfNeeded."); + } + + [Test] + public void UseReAllocateIfNeededCorrect() + { + Object[] pretestTextures = Resources.FindObjectsOfTypeAll(typeof(Texture)); + RTHandle myHandle = default(RTHandle); + + // URP is not initlized in test framework, init RTHandlePool here which is required for this test. + if (UniversalRenderPipeline.s_RTHandlePool == null) + { + UniversalRenderPipeline.s_RTHandlePool = new RTHandleResourcePool(); + } + + var desc = new TextureDesc(128, 128); + desc.format = GraphicsFormat.R8G8B8A8_UNorm; + desc.filterMode = FilterMode.Point; + desc.wrapMode = TextureWrapMode.Clamp; + + RenderingUtils.ReAllocateHandleIfNeeded(ref myHandle, desc, "TestTexture"); + + Assert.That(IsEqualDesc(in desc, myHandle), "RenderingUtils.ReAllocateIfNeeded alloced RTHandle with different properties than requested."); + + desc.width = desc.height = 64; + desc.format = GraphicsFormat.R32_SFloat; + desc.filterMode = FilterMode.Bilinear; + desc.wrapMode = TextureWrapMode.Repeat; + + RenderingUtils.ReAllocateHandleIfNeeded(ref myHandle, desc, "TestTexture"); + + Assert.That(IsEqualDesc(in desc, myHandle), "RenderingUtils.ReAllocateIfNeeded alloced RTHandle with different properties than requested."); + + UniversalRenderPipeline.s_RTHandlePool.Cleanup(); + RTHandles.Release(myHandle); + } + + bool IsEqualDesc(in TextureDesc desc, RTHandle rt) + { + return rt.rt.width == desc.width + && rt.rt.height == desc.height + && rt.rt.graphicsFormat == desc.format + && rt.rt.wrapMode == desc.wrapMode + && rt.rt.filterMode == desc.filterMode; + } + [TestCase(ShaderPathID.Lit)] [TestCase(ShaderPathID.SimpleLit)] [TestCase(ShaderPathID.Unlit)] From bc99f1134a12452d4b5ee60d0180f3054053e7fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Wed, 8 Oct 2025 10:21:09 +0000 Subject: [PATCH 063/115] Create the prefab from code every time we want to execute the test. --- .../ReadonlyMaterialConverter/Cube.prefab | 123 ------------------ .../Cube.prefab.meta | 7 - .../ReadonlyMaterialConverterTests.cs | 55 ++++++-- 3 files changed, 45 insertions(+), 140 deletions(-) delete mode 100644 Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/Cube.prefab delete mode 100644 Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/Cube.prefab.meta diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/Cube.prefab b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/Cube.prefab deleted file mode 100644 index b8acf589c58..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/Cube.prefab +++ /dev/null @@ -1,123 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &7720142174441302186 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6694468348056204606} - - component: {fileID: 1552815716135096073} - - component: {fileID: 5322394103119292604} - - component: {fileID: 4602385329376030183} - m_Layer: 0 - m_Name: Cube - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6694468348056204606 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7720142174441302186} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.5, y: 0.35, z: 0.5} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &1552815716135096073 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7720142174441302186} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &5322394103119292604 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7720142174441302186} - 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_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10308, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10301, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10650, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10651, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10652, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10758, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15302, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15303, 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_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &4602385329376030183 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7720142174441302186} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/Cube.prefab.meta b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/Cube.prefab.meta deleted file mode 100644 index d9551a2a346..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/Cube.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 95cb9745d0f90ed4cb2976ad2147b05d -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverterTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverterTests.cs index c0bcdc8cc25..8a0b148bd8e 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverterTests.cs +++ b/Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/ReadonlyMaterialConverterTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using NUnit.Framework; using UnityEditor.Rendering.Converter; using UnityEngine; @@ -11,11 +12,45 @@ namespace UnityEditor.Rendering.Universal.Tools [Category("Graphics Tools")] class ReadonlyMaterialConverterTests { - const string k_PrefabPath = "Packages/com.unity.render-pipelines.universal/Tests/Editor/Tools/Converters/ReadonlyMaterialConverter/Cube.prefab"; + const string k_PrefabPath = "Assets/ReadonlyMaterialConverterTests/"; GameObject m_GO; MeshRenderer m_MeshRenderer; - Material[] m_RollbackMaterials; + + public static GameObject CreatePrefabWithMeshRenderer(Material[] materials, string assetPath) + { + // Create a temporary GameObject + var go = new GameObject("CreatePrefabWithMeshRenderer_GO"); + + try + { + // Add components + var mf = go.AddComponent(); + var mr = go.AddComponent(); + mr.sharedMaterials = materials; + + string localPath = assetPath + go.name + ".prefab"; + CoreUtils.EnsureFolderTreeInAssetFilePath(localPath); + + // Save as prefab + var prefab = PrefabUtility.SaveAsPrefabAsset(go, localPath, out bool success); + if (!success || prefab == null) + { + Debug.LogError("Failed to save prefab at: " + assetPath); + return null; + } + + AssetDatabase.ImportAsset(localPath); + AssetDatabase.SaveAssets(); + + return prefab; + } + finally + { + // Cleanup temporary instance + Object.DestroyImmediate(go); + } + } [OneTimeSetUp] public void OneTimeSetup() @@ -32,7 +67,10 @@ public void OneTimeSetup() [SetUp] public void Setup() { - m_GO = AssetDatabase.LoadAssetAtPath(k_PrefabPath); + var materials = ReadonlyMaterialMap.GetBuiltInMaterials(); + Assume.That(materials.Length > 0, "There are no mapping materials"); + + m_GO = CreatePrefabWithMeshRenderer(materials, k_PrefabPath); m_MeshRenderer = m_GO.GetComponent(); Assert.AreEqual(ReadonlyMaterialMap.count, m_MeshRenderer.sharedMaterials.Length, "ReadonlyMaterialMap - Lengths are different"); @@ -42,24 +80,21 @@ public void Setup() Assert.AreEqual(key, m_MeshRenderer.sharedMaterials[i].name, "ReadonlyMaterialMap - Order has changed"); ++i; } - - m_RollbackMaterials = new Material[ReadonlyMaterialMap.count]; - m_MeshRenderer.sharedMaterials.CopyTo(m_RollbackMaterials, 0); } [TearDown] public void Teardown() { - if (m_MeshRenderer != null) - m_MeshRenderer.sharedMaterials = m_RollbackMaterials; + AssetDatabase.DeleteAsset(k_PrefabPath); } private void CheckMaterials(Material[] actual) { int i = 0; + var materials = ReadonlyMaterialMap.GetBuiltInMaterials(); foreach (var key in ReadonlyMaterialMap.Keys) { - Assert.IsTrue(ReadonlyMaterialMap.TryGetMappingMaterial(m_RollbackMaterials[i], out var expected)); + Assert.IsTrue(ReadonlyMaterialMap.TryGetMappingMaterial(materials[i], out var expected)); CheckMaterials(expected, actual[i]); ++i; } @@ -78,7 +113,7 @@ public void ReassignGameObjectMaterials_Succeeds_WhenMaterialCanBeSet() var materialConverter = new ReadonlyMaterialConverter(); var gid = GlobalObjectId.GetGlobalObjectIdSlow(m_GO); - var assetItem = new RenderPipelineConverterAssetItem(gid, k_PrefabPath); + var assetItem = new RenderPipelineConverterAssetItem(gid, AssetDatabase.GetAssetPath(m_GO)); materialConverter.assets.Add(assetItem); Assert.IsNull(materialConverter.m_MaterialReferenceChanger, "MaterialReferenceChanger should be null before BeforeConvert"); From 3055461c5fe6ca20b755d1ee3b2c23047caa3336 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Wed, 8 Oct 2025 16:27:20 +0000 Subject: [PATCH 064/115] [VFX] Expandable properties can now be expanded/collapsed when clicking on label --- .../GraphView/Views/Properties/PropertyRM.cs | 18 --- .../Editor/UIResources/VFX/Folder.png.meta | 2 +- .../UIResources/VFX/IN foldout on@2x.png | Bin 0 -> 365 bytes .../UIResources/VFX/IN foldout on@2x.png.meta | 117 ++++++++++++++++++ .../Editor/UIResources/VFX/IN foldout@2x.png | Bin 0 -> 357 bytes .../UIResources/VFX/IN foldout@2x.png.meta | 117 ++++++++++++++++++ .../Editor/UIResources/uss/PropertyRM.uss | 34 ++--- .../Editor/UIResources/uss/VFXDataAnchor.uss | 27 +--- 8 files changed, 252 insertions(+), 63 deletions(-) create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/IN foldout on@2x.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/IN foldout on@2x.png.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/IN foldout@2x.png create mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/VFX/IN foldout@2x.png.meta diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/Properties/PropertyRM.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/Properties/PropertyRM.cs index 0370c9cbb9a..936bc999d90 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/Properties/PropertyRM.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/Properties/PropertyRM.cs @@ -434,24 +434,6 @@ protected void NotifyValueChanged() void OnExpand(EventBase evt) { - // Allow expand/collapse on when clicking over the arrow icon (which can be embedded in the label's background) - if (evt is PointerUpEvent pointerUpEvent) - { - var label = this.Q /// Creates a new PostProcessPass instance. @@ -416,7 +416,6 @@ void Render(CommandBuffer cmd, ref RenderingData renderingData) bool useSubPixeMorpAA = cameraData.antialiasing == AntialiasingMode.SubpixelMorphologicalAntiAliasing; var dofMaterial = m_DepthOfField.mode.value == DepthOfFieldMode.Gaussian ? m_Materials.gaussianDepthOfField : m_Materials.bokehDepthOfField; bool useDepthOfField = m_DepthOfField.IsActive() && !isSceneViewCamera && dofMaterial != null; - bool useLensFlare = !LensFlareCommonSRP.Instance.IsEmpty() && m_SupportDataDrivenLensFlare; bool useLensFlareScreenSpace = m_LensFlareScreenSpace.IsActive() && m_SupportScreenSpaceLensFlare; bool useMotionBlur = m_MotionBlur.IsActive() && !isSceneViewCamera; bool usePaniniProjection = m_PaniniProjection.IsActive() && !isSceneViewCamera; @@ -1980,4 +1979,4 @@ static class ShaderConstants #endregion } } -#endif \ No newline at end of file +#endif diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs index 1be61e12e3e..32480573a10 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs @@ -2084,11 +2084,5 @@ internal static ShEvalMode ShAutoDetect(ShEvalMode mode) } internal static bool isRunningOnPowerVRGPU = SystemInfo.graphicsDeviceName.Contains("PowerVR"); - - // Mali Valhall architecture GPUs (G76, G77, G78, etc.) have issues with separate depth textures when SSAO is enabled - // This affects depth texture sampling patterns in SSAO passes - internal static bool isRunningOnMaliValhallGPU = SystemInfo.graphicsDeviceName.StartsWith("Mali-G5") || - SystemInfo.graphicsDeviceName.StartsWith("Mali-G6") || - SystemInfo.graphicsDeviceName.StartsWith("Mali-G7"); } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs index d4c30fc1302..7aafc73ae0c 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs @@ -937,6 +937,7 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re requiresDepthPrepass |= isPreviewCamera; requiresDepthPrepass |= renderPassInputs.requiresDepthPrepass; requiresDepthPrepass |= renderPassInputs.requiresNormalsTexture; + requiresDepthPrepass |= IsGLESDevice() && postProcessPass?.useLensFlare == true; // Current aim of depth prepass is to generate a copy of depth buffer, it is NOT to prime depth buffer and reduce overdraw on non-mobile platforms. // When deferred renderer is enabled, depth buffer is already accessible so depth prepass is not needed. @@ -1413,11 +1414,6 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re EnqueuePass(m_DrawSkyboxPass); } - // Mali Valhall + SSAO compatibility: Force depth copy when needed -#if UNITY_ANDROID - requiresDepthCopyPass |= PlatformAutoDetect.isRunningOnMaliValhallGPU && renderingData.cameraData.postProcessEnabled; -#endif - // If a depth texture was created we necessarily need to copy it, otherwise we could have render it to a renderbuffer. // 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 From 03525d7a2126e887b6aef6d1a8baa7664d82cf5f Mon Sep 17 00:00:00 2001 From: Jesper Mortensen Date: Thu, 9 Oct 2025 18:05:38 +0000 Subject: [PATCH 072/115] Fix UUM-83569: Ray Tracing in HDRP does not work with GRD --- .../Material/LayeredLit/LayeredLit.shader | 1 + .../LayeredLit/LayeredLitTessellation.shader | 1 + .../Runtime/Material/Lit/Lit.shader | 1 + .../Material/Lit/LitTessellation.shader | 1 + .../Assets/Tests/HDRP_DXR_Graphics_Tests.cs | 275 ++++++++++++------ .../HDRP_DXR_Tests/Assets/Tests/Tests.asmdef | 2 + .../HDRP_DXR_Tests/Packages/manifest.json | 1 + .../ProjectSettings/GraphicsSettings.asset | 2 +- 8 files changed, 196 insertions(+), 88 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/LayeredLit/LayeredLit.shader b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/LayeredLit/LayeredLit.shader index 68fbf401ff6..c732a87acba 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/LayeredLit/LayeredLit.shader +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/LayeredLit/LayeredLit.shader @@ -1187,6 +1187,7 @@ Shader "HDRP/LayeredLit" HLSLPROGRAM #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch switch2 + #pragma multi_compile _ DOTS_INSTANCING_ON #define SHADERPASS SHADERPASS_CONSTANT #include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl" diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/LayeredLit/LayeredLitTessellation.shader b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/LayeredLit/LayeredLitTessellation.shader index b3594cdf389..67504f64e6e 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/LayeredLit/LayeredLitTessellation.shader +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/LayeredLit/LayeredLitTessellation.shader @@ -1243,6 +1243,7 @@ Shader "HDRP/LayeredLitTessellation" HLSLPROGRAM #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch switch2 + #pragma multi_compile _ DOTS_INSTANCING_ON #define SHADERPASS SHADERPASS_CONSTANT #include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl" diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.shader b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.shader index 00107110805..a1d73f1f002 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.shader +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.shader @@ -1137,6 +1137,7 @@ Shader "HDRP/Lit" #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch switch2 // enable dithering LOD crossfade #pragma multi_compile _ LOD_FADE_CROSSFADE + #pragma multi_compile _ DOTS_INSTANCING_ON #define SHADERPASS SHADERPASS_CONSTANT #include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl" diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitTessellation.shader b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitTessellation.shader index 7386093ebf9..c8c56fd60e0 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitTessellation.shader +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitTessellation.shader @@ -1164,6 +1164,7 @@ Shader "HDRP/LitTessellation" #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch switch2 // enable dithering LOD crossfade #pragma multi_compile _ LOD_FADE_CROSSFADE + #pragma multi_compile _ DOTS_INSTANCING_ON #define SHADERPASS SHADERPASS_CONSTANT #include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl" diff --git a/Tests/SRPTests/Projects/HDRP_DXR_Tests/Assets/Tests/HDRP_DXR_Graphics_Tests.cs b/Tests/SRPTests/Projects/HDRP_DXR_Tests/Assets/Tests/HDRP_DXR_Graphics_Tests.cs index f14320e7bbc..ef043abf20f 100644 --- a/Tests/SRPTests/Projects/HDRP_DXR_Tests/Assets/Tests/HDRP_DXR_Graphics_Tests.cs +++ b/Tests/SRPTests/Projects/HDRP_DXR_Tests/Assets/Tests/HDRP_DXR_Graphics_Tests.cs @@ -2,110 +2,211 @@ using NUnit.Framework; using UnityEngine; using UnityEngine.Rendering; +using UnityEngine.SceneManagement; using UnityEngine.TestTools; using UnityEngine.TestTools.Graphics; +using UnityEngine.TestTools.Graphics.Contexts; +using UnityEngine.TestTools.Graphics.Platforms; using Unity.Testing.XR.Runtime; -// [MockHmdSetup] -public class HDRP_Graphics_Tests +namespace UnityEngine.Rendering.HighDefinition.DXR_Tests +{ + + // [MockHmdSetup] + public class HDRP_Graphics_Tests #if UNITY_EDITOR : IPrebuildSetup #endif -{ - [UnityTest] - [SceneGraphicsTest(@"Assets/Scenes/^[0-9]+")] - [Timeout(450 * 1000)] // Set timeout to 450 sec. to handle complex scenes with many shaders (previous timeout was 300s) - [IgnoreGraphicsTest("5012_PathTracing_Transmission", "Fails on Yamato")] - [IgnoreGraphicsTest( - "1000_RaytracingQualityKeyword_PathTracer_Default|2009_Debug_RTAS_ScreenSpaceReflections_InstanceID|2009_Debug_RTAS_ScreenSpaceReflections_PrimitiveID|2009_Debug_RTAS_Shadows_PrimitiveID|2010_Debug_ClusterDebug|308_ScreenSpaceGlobalIllumination", - "Fails on Yamato" - )] - [IgnoreGraphicsTest( - "1000_RaytracingQualityKeyword_MaterialQuality_Indirect", - "Strict Mode not supported" - )] - [IgnoreGraphicsTest( - "10004_TerrainPathTracing|10004_TerrainPathTracing_NoDecalSurfaceGradient|5001_PathTracing|5001_PathTracing_Denoised_Intel|5001_PathTracing_Denoised_Optix|5002_PathTracing_GI|5003_PathTracing_transparency|5004_PathTracing_arealight|5005_PathTracing_Fog|5006_PathTracing_DoFVolume|5007_PathTracing_Materials_SG_Lit|5007_PathTracing_Materials_SG_Unlit|5007_PathTracing_Materials_StackLit|5008_PathTracing_NormalMapping|5009_PathTracing_FabricMaterial|501_RecursiveRendering|501_RecursiveRenderingTransparent|5010_PathTracingAlpha|5011_PathTracing_ShadowMatte|5012_PathTracing_Transmission|5013_PathTracing_ShadowFlags|5014_PathTracing_DoubleSidedOverride|5015_PathTracing_DoFCamera|5016_PathTracingTiledRendering|5017_PathTracing_Decals|505_RecursiveRenderingFog|506_RecursiveRenderingTransparentLayer|507_RecursiveRenderingDecal|5019_PathTracing_AmbientOcclusion|5018_PathTracing_MaterialOverrides|5021_PathTracing_Depth_2|5022_PathTracing_Depth_3|5020_PathTracing_Depth_1|5023_PathTracing_MeshInstancing_SG_Lit|5026_PathTracing_BoxLight", - "Unsupported", - runtimePlatforms: new RuntimePlatform[] + { + [UnityTest] + [SceneGraphicsTest(@"Assets/Scenes/^[0-9]+")] + [Timeout(450 * 1000)] // Set timeout to 450 sec. to handle complex scenes with many shaders (previous timeout was 300s) + [IgnoreGraphicsTest("5012_PathTracing_Transmission", "Fails on Yamato")] + [IgnoreGraphicsTest( + "1000_RaytracingQualityKeyword_PathTracer_Default|2009_Debug_RTAS_ScreenSpaceReflections_InstanceID|2009_Debug_RTAS_ScreenSpaceReflections_PrimitiveID|2009_Debug_RTAS_Shadows_PrimitiveID|2010_Debug_ClusterDebug|308_ScreenSpaceGlobalIllumination", + "Fails on Yamato" + )] + [IgnoreGraphicsTest( + "1000_RaytracingQualityKeyword_MaterialQuality_Indirect", + "Strict Mode not supported" + )] + [IgnoreGraphicsTest( + "10004_TerrainPathTracing|10004_TerrainPathTracing_NoDecalSurfaceGradient|5001_PathTracing|5001_PathTracing_Denoised_Intel|5001_PathTracing_Denoised_Optix|5002_PathTracing_GI|5003_PathTracing_transparency|5004_PathTracing_arealight|5005_PathTracing_Fog|5006_PathTracing_DoFVolume|5007_PathTracing_Materials_SG_Lit|5007_PathTracing_Materials_SG_Unlit|5007_PathTracing_Materials_StackLit|5008_PathTracing_NormalMapping|5009_PathTracing_FabricMaterial|501_RecursiveRendering|501_RecursiveRenderingTransparent|5010_PathTracingAlpha|5011_PathTracing_ShadowMatte|5012_PathTracing_Transmission|5013_PathTracing_ShadowFlags|5014_PathTracing_DoubleSidedOverride|5015_PathTracing_DoFCamera|5016_PathTracingTiledRendering|5017_PathTracing_Decals|505_RecursiveRenderingFog|506_RecursiveRenderingTransparentLayer|507_RecursiveRenderingDecal|5019_PathTracing_AmbientOcclusion|5018_PathTracing_MaterialOverrides|5021_PathTracing_Depth_2|5022_PathTracing_Depth_3|5020_PathTracing_Depth_1|5023_PathTracing_MeshInstancing_SG_Lit|5026_PathTracing_BoxLight", + "Unsupported", + runtimePlatforms: new RuntimePlatform[] + { + RuntimePlatform.GameCoreXboxSeries, + RuntimePlatform.PS5 + } + )] + [IgnoreGraphicsTest( + "2007_Debug_LightCluster", + "issue on Yamato/HDRP-3081", + runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.GameCoreXboxSeries } + )] + [IgnoreGraphicsTest( + "2007_Debug_LightCluster", + "issue on Yamato/HDRP-3081", + runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.PS5 } + )] + [IgnoreGraphicsTest( + "5001_PathTracing|5010_PathTracingAlpha", + "jira: https://jira.unity3d.com/browse/GFXFEAT-1332", + graphicsDeviceTypes: new[] { GraphicsDeviceType.Direct3D12 } + )] + [IgnoreGraphicsTest( + "5005_PathTracing_Fog", + "jira: https://jira.unity3d.com/browse/GFXFEAT-1334", + graphicsDeviceTypes: new[] { GraphicsDeviceType.Direct3D12 } + )] + [IgnoreGraphicsTest( + "5007_PathTracing_Materials_SG_Lit", + "issue on Yamato only: jira: https://jira.unity3d.com/browse/UUM-26542", + runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.WindowsPlayer } + )] + [IgnoreGraphicsTest( + "802_SubSurfaceScatteringForward", + "Inconsistent on Yamato", + runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.GameCoreXboxSeries } + )] + [IgnoreGraphicsTest( + "802_SubSurfaceScatteringForward", + "Inconsistent on Yamato", + runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.PS5 } + )] + [IgnoreGraphicsTest( + "900_Materials_AlphaTest_SG", + "issue on Yamato only: jira: https://jira.unity3d.com/browse/UUM-26542" + )] + [IgnoreGraphicsTest( + "902_Materials_SG_Variants_Lit", + "issue on Yamato only: jira: https://jira.unity3d.com/browse/UUM-26542", + runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.WindowsPlayer } + )] + [IgnoreGraphicsTest( + "10003_TerrainShadow", + "Disabled for Instability https://jira.unity3d.com/browse/UUM-104980" + )] + public IEnumerator Run(SceneGraphicsTestCase testCase) { - RuntimePlatform.GameCoreXboxSeries, - RuntimePlatform.PS5 + yield return HDRP_GraphicTestRunner.Run(testCase); } - )] - [IgnoreGraphicsTest( - "2007_Debug_LightCluster", - "issue on Yamato/HDRP-3081", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.GameCoreXboxSeries } - )] - [IgnoreGraphicsTest( - "2007_Debug_LightCluster", - "issue on Yamato/HDRP-3081", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.PS5 } - )] - [IgnoreGraphicsTest( - "5001_PathTracing|5010_PathTracingAlpha", - "jira: https://jira.unity3d.com/browse/GFXFEAT-1332", - graphicsDeviceTypes: new[] { GraphicsDeviceType.Direct3D12 } - )] - [IgnoreGraphicsTest( - "5005_PathTracing_Fog", - "jira: https://jira.unity3d.com/browse/GFXFEAT-1334", - graphicsDeviceTypes: new[] { GraphicsDeviceType.Direct3D12 } - )] - [IgnoreGraphicsTest( - "5007_PathTracing_Materials_SG_Lit", - "issue on Yamato only: jira: https://jira.unity3d.com/browse/UUM-26542", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.WindowsPlayer } - )] - [IgnoreGraphicsTest( - "802_SubSurfaceScatteringForward", - "Inconsistent on Yamato", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.GameCoreXboxSeries } - )] - [IgnoreGraphicsTest( - "802_SubSurfaceScatteringForward", - "Inconsistent on Yamato", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.PS5 } - )] - [IgnoreGraphicsTest( - "900_Materials_AlphaTest_SG", - "issue on Yamato only: jira: https://jira.unity3d.com/browse/UUM-26542" - )] - [IgnoreGraphicsTest( - "902_Materials_SG_Variants_Lit", - "issue on Yamato only: jira: https://jira.unity3d.com/browse/UUM-26542", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.WindowsPlayer } - )] - [IgnoreGraphicsTest( - "10003_TerrainShadow", - "Disabled for Instability https://jira.unity3d.com/browse/UUM-104980" - )] - public IEnumerator Run(SceneGraphicsTestCase testCase) - { - yield return HDRP_GraphicTestRunner.Run(testCase); - } #if UNITY_EDITOR - public void Setup() - { - Unity.Testing.XR.Editor.SetupMockHMD.SetupLoader(); + public void Setup() + { + Unity.Testing.XR.Editor.SetupMockHMD.SetupLoader(); + } + + [TearDown] + public void DumpImagesInEditor() + { + UnityEditor.TestTools.Graphics.ResultsUtility.ExtractImagesFromTestProperties( + TestContext.CurrentContext.Test + ); + } + + [TearDown] + public void TearDownXR() + { + XRGraphicsAutomatedTests.running = false; + } + +#endif } - [TearDown] - public void DumpImagesInEditor() + [TestFixtureSource( + typeof(HighDefinitionTestFixtureData), + nameof(HighDefinitionTestFixtureData.FixtureParams) + )] + public class HDRP_GRD_DXR_Graphics_Tests { - UnityEditor.TestTools.Graphics.ResultsUtility.ExtractImagesFromTestProperties( - TestContext.CurrentContext.Test - ); + readonly GpuResidentDrawerGlobalContext gpuResidentDrawerContext; + readonly GpuResidentDrawerContext requestedGRDContext; + readonly GpuResidentDrawerContext previousGRDContext; + + public HDRP_GRD_DXR_Graphics_Tests(GpuResidentDrawerContext grdContext) + { + requestedGRDContext = grdContext; + + // Register context + gpuResidentDrawerContext = + GlobalContextManager.RegisterGlobalContext(typeof(GpuResidentDrawerGlobalContext)) + as GpuResidentDrawerGlobalContext; + + // Cache previous state to avoid state leak + previousGRDContext = (GpuResidentDrawerContext)gpuResidentDrawerContext.Context; + gpuResidentDrawerContext.ActivateContext(requestedGRDContext); + } + + [OneTimeSetUp] + public void OneTimeSetUp() + { + SceneManager.LoadScene("GraphicsTestTransitionScene", LoadSceneMode.Single); + } + + [OneTimeTearDown] + public void OneTimeTearDown() + { + SceneManager.LoadScene("GraphicsTestTransitionScene", LoadSceneMode.Single); + gpuResidentDrawerContext.ActivateContext(previousGRDContext); + GlobalContextManager.UnregisterGlobalContext(typeof(GpuResidentDrawerGlobalContext)); + } + + [SetUp] + public void SetUpContext() + { + gpuResidentDrawerContext.ActivateContext(requestedGRDContext); + GlobalContextManager.AssertContextIs(requestedGRDContext); + } + + [TearDown] + public void TearDown() + { + Debug.ClearDeveloperConsole(); +#if UNITY_EDITOR + UnityEditor.TestTools.Graphics.ResultsUtility.ExtractImagesFromTestProperties(TestContext.CurrentContext.Test); +#endif +#if ENABLE_VR + XRGraphicsAutomatedTests.running = false; +#endif + } + + [UnityTest] + [SceneGraphicsTest(@"Assets/GRDScenes/^[0-9]+")] + [Timeout(450 * 1000)] // Set timeout to 450 sec. to handle complex scenes with many shaders (previous timeout was 300s) + public IEnumerator Run(SceneGraphicsTestCase testCase) + { + if (testCase.Name.Contains("11000_HDRP_Lit_Shaders")) + { + yield return HDRP_GraphicTestRunner.Run(testCase); + } + else + { + Assert.Ignore("https://jira.unity3d.com/browse/UUM-119893"); + } + yield return null; + } } - [TearDown] - public void TearDownXR() + public class HighDefinitionTestFixtureData { - XRGraphicsAutomatedTests.running = false; - } + public static IEnumerable FixtureParams + { + get + { + yield return new TestFixtureData( + GpuResidentDrawerContext.GRDDisabled + ); -#endif + if (GraphicsTestPlatform.Current.IsEditorPlatform) + { + yield return new TestFixtureData( + GpuResidentDrawerContext.GRDEnabled + ); + } + } + } + } } diff --git a/Tests/SRPTests/Projects/HDRP_DXR_Tests/Assets/Tests/Tests.asmdef b/Tests/SRPTests/Projects/HDRP_DXR_Tests/Assets/Tests/Tests.asmdef index 28280dccfbc..6a9e00fa404 100644 --- a/Tests/SRPTests/Projects/HDRP_DXR_Tests/Assets/Tests/Tests.asmdef +++ b/Tests/SRPTests/Projects/HDRP_DXR_Tests/Assets/Tests/Tests.asmdef @@ -9,6 +9,8 @@ "Unity.Testing.XR.Runtime", "Unity.RenderPipelines.Core.Runtime", "HDRP_TestRunner", + "UnityEngine.TestTools.Graphics.Contexts", + "UnityEngine.Graphics.Testing.Common.Runtime", "Unity.Testing.XR.Editor" ], "includePlatforms": [], diff --git a/Tests/SRPTests/Projects/HDRP_DXR_Tests/Packages/manifest.json b/Tests/SRPTests/Projects/HDRP_DXR_Tests/Packages/manifest.json index c5530e97e3f..6e4bbdc421e 100644 --- a/Tests/SRPTests/Projects/HDRP_DXR_Tests/Packages/manifest.json +++ b/Tests/SRPTests/Projects/HDRP_DXR_Tests/Packages/manifest.json @@ -10,6 +10,7 @@ "com.unity.shadergraph": "file:../../../../../Packages/com.unity.shadergraph", "com.unity.test-framework": "file:../../../../../Packages/com.unity.test-framework", "com.unity.testframework.graphics": "file:../../../Packages/com.unity.test-framework.graphics", + "com.unity.testing.common-graphics": "file:../../../Packages/com.unity.testing.common-graphics", "com.unity.testing.hdrp": "file:../../../Packages/com.unity.testing.hdrp", "com.unity.testing.xr": "file:../../../Packages/com.unity.testing.xr", "com.unity.ugui": "2.0.0", diff --git a/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/GraphicsSettings.asset b/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/GraphicsSettings.asset index 13b982c54ea..c20b3b5db3b 100644 --- a/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/GraphicsSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/GraphicsSettings.asset @@ -50,7 +50,7 @@ GraphicsSettings: m_LightmapStripping: 0 m_FogStripping: 0 m_InstancingStripping: 0 - m_BrgStripping: 0 + m_BrgStripping: 2 m_LightmapKeepPlain: 1 m_LightmapKeepDirCombined: 1 m_LightmapKeepDynamicPlain: 1 From 4e1e99aae3d690e2e38c7d90e5b6a6230806e24d Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Thu, 9 Oct 2025 23:37:59 +0000 Subject: [PATCH 073/115] [VFX/Test] Remove Create Garbgage from Player --- .../Tests/Runtime/VFXCheckGarbage.cs | 46 ++++--------------- 1 file changed, 8 insertions(+), 38 deletions(-) diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Runtime/VFXCheckGarbage.cs b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Runtime/VFXCheckGarbage.cs index 71b37ef3e70..c47bdced19f 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Runtime/VFXCheckGarbage.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Runtime/VFXCheckGarbage.cs @@ -1,21 +1,18 @@ +#if UNITY_EDITOR using System; +using System.Linq; using System.Collections; using System.Text; using NUnit.Framework; -using UnityEngine; using UnityEngine.Profiling; -using Unity.Profiling; using Unity.Testing.VisualEffectGraph; using UnityEngine.TestTools; using UnityEngine.TestTools.Graphics; using Unity.Testing.VisualEffectGraph.Tests; -#if UNITY_EDITOR using System.Collections.Generic; -using System.Linq; using UnityEditor; using UnityEditor.Profiling; using UnityEditorInternal; -#endif namespace UnityEngine.VFX.Test @@ -34,7 +31,7 @@ public class VFXCheckGarbage private static readonly int kForceGarbageID = Shader.PropertyToID("forceGarbage"); private static readonly WaitForEndOfFrame kWaitForEndOfFrame = new WaitForEndOfFrame(); -Recorder m_gcAllocRecorder; + Recorder m_gcAllocRecorder; AssetBundle m_AssetBundle; int m_previousCaptureFrameRate; @@ -55,11 +52,8 @@ public void SetUp() m_previousCaptureFrameRate = Time.captureFramerate; m_previousFixedTimeStep = UnityEngine.VFX.VFXManager.fixedTimeStep; m_previousMaxDeltaTime = UnityEngine.VFX.VFXManager.maxDeltaTime; -#if UNITY_EDITOR - //Disabling asyncShaderCompilation to avoid unexpected late shader loading m_previousAsyncShaderCompilation = EditorSettings.asyncShaderCompilation; EditorSettings.asyncShaderCompilation = false; -#endif Time.captureFramerate = 10; VFXManager.fixedTimeStep = 0.1f; @@ -75,26 +69,19 @@ public void TearDown() VFXManager.fixedTimeStep = m_previousFixedTimeStep; VFXManager.maxDeltaTime = m_previousMaxDeltaTime; -#if UNITY_EDITOR //UnityEditorInternal.ProfilerDriver.ClearAllFrames(); //Voluntary letting the capture readable in profiler windows if needed for inspection ProfilerDriver.enabled = false; EditorSettings.asyncShaderCompilation = m_previousAsyncShaderCompilation; -#endif -#if UNITY_EDITOR while (SceneView.sceneViews.Count > 0) { var sceneView = SceneView.sceneViews[0] as SceneView; sceneView.Close(); } -#endif AssetBundleHelper.Unload(m_AssetBundle); } [UnityTest] -#if UNITY_SWITCH || UNITY_PS5 - [Ignore("See UUM-108973")] -#endif public IEnumerator Create_Garbage_Scenario([ValueSource(nameof(s_Scenarios))] string scenario, [ValueSource(nameof(s_CustomGarbageWrapperTest))] string garbageMode) { UnityEngine.SceneManagement.SceneManager.LoadScene(string.Format("Packages/com.unity.testing.visualeffectgraph/Scenes/{0}.unity", scenario)); @@ -103,7 +90,7 @@ public IEnumerator Create_Garbage_Scenario([ValueSource(nameof(s_Scenarios))] st var vfxComponents = Resources.FindObjectsOfTypeAll(); Assert.Greater(vfxComponents.Length, 0u); - var forceGarbage = garbageMode == s_CustomGarbageWrapperTest[0]; + var forceGarbage = garbageMode == "Reference_Forcing_Garbage_Creation"; foreach (var currentVFX in vfxComponents) { Assert.IsTrue(currentVFX.HasBool(kForceGarbageID), $"ForceGarbage does not exist on the VFX component {currentVFX.name}."); @@ -119,11 +106,8 @@ public IEnumerator Create_Garbage_Scenario([ValueSource(nameof(s_Scenarios))] st yield return kWaitForEndOfFrame; bool isTimelineTest = scenario.EndsWith("Timeline", StringComparison.InvariantCultureIgnoreCase); - -#if UNITY_EDITOR - UnityEditorInternal.ProfilerDriver.ClearAllFrames(); + ProfilerDriver.ClearAllFrames(); ProfilerDriver.enabled = true; -#endif m_gcAllocRecorder.enabled = true; int frameCount = 16; @@ -131,14 +115,12 @@ public IEnumerator Create_Garbage_Scenario([ValueSource(nameof(s_Scenarios))] st yield return kWaitForEndOfFrame; m_gcAllocRecorder.enabled = false; -#if UNITY_EDITOR ProfilerDriver.enabled = false; yield return kWaitForEndOfFrame; -#endif int allocationCountFromCustomCallback = m_gcAllocRecorder.sampleBlockCount; Debug.LogFormat("Global GC.Alloc Count: {0}", allocationCountFromCustomCallback); -#if UNITY_EDITOR + var currentFrameIndex = ProfilerDriver.GetPreviousFrameIndex(Time.frameCount); Assert.Greater(currentFrameIndex, 0u, "Can't retrieve Profiler Frame"); @@ -211,21 +193,9 @@ public IEnumerator Create_Garbage_Scenario([ValueSource(nameof(s_Scenarios))] st } else { - Assert.AreEqual(0u, totalGcAllocSizeFromVFXUpdate, aggregatedAllocation.Any() ? aggregatedAllocation.Aggregate((a, b) => $"{a}\n{b}") : string.Empty); + Assert.AreEqual(0u, totalGcAllocSizeFromVFXUpdate, aggregatedAllocation.Count > 0 ? aggregatedAllocation.Aggregate((a, b) => $"{a}\n{b}") : string.Empty); } -#else - var knownAllocation = isTimelineTest ? 5u : 4u; //Previous coroutine call is expecting at most 5 or 4 GC.Alloc (one per frame) - knownAllocation += 3u; //Lazy allocation from GUI.Repaint (standalone are in development mode, OnGUI is called in PlaymodeTestRunner) - knownAllocation += 1u; //RemoteTestResultSend.SendDataRoutine (which can occurs randomly) - if (forceGarbage) - { - Assert.Greater(allocationCountFromCustomCallback, knownAllocation); - } - else - { - Assert.LessOrEqual(allocationCountFromCustomCallback, knownAllocation); - } -#endif } } } +#endif From e44807561f27f0cb430788be0767097c902b408c Mon Sep 17 00:00:00 2001 From: Benoit Alain Date: Fri, 10 Oct 2025 11:17:01 +0000 Subject: [PATCH 074/115] Fixed UUM-108024. Removed receivesHierarchyGeometryChangedEvents for SG. --- .../Editor/Drawing/Blackboard/SGBlackboard.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.shadergraph/Editor/Drawing/Blackboard/SGBlackboard.cs b/Packages/com.unity.shadergraph/Editor/Drawing/Blackboard/SGBlackboard.cs index 94db972375f..8dfff8b1d17 100644 --- a/Packages/com.unity.shadergraph/Editor/Drawing/Blackboard/SGBlackboard.cs +++ b/Packages/com.unity.shadergraph/Editor/Drawing/Blackboard/SGBlackboard.cs @@ -189,6 +189,7 @@ public SGBlackboard(BlackboardViewModel viewModel, BlackboardController controll isWindowScrollable = true; isWindowResizable = true; focusable = true; + scrollView.contentContainer.receivesHierarchyGeometryChangedEvents = false; m_DragIndicator = new VisualElement(); m_DragIndicator.name = "categoryDragIndicator"; From fa4d0ece6ca8c82c72eb21677db0bb793a0240af Mon Sep 17 00:00:00 2001 From: Ludovic Theobald Date: Fri, 10 Oct 2025 20:41:46 +0000 Subject: [PATCH 075/115] [VFX] Fix output properties order in CustomHLSL operator --- .../Models/Operators/Implementations/CustomHLSL.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/Implementations/CustomHLSL.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/Implementations/CustomHLSL.cs index 2c7ce57705a..1e3efc4d25d 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/Implementations/CustomHLSL.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Operators/Implementations/CustomHLSL.cs @@ -401,11 +401,6 @@ private void ParseCodeIfNeeded() m_InputProperties = new List(); m_OutputProperties = new List(); - if (m_Function.returnType != typeof(void) && m_Function.returnType != null) - { - m_OutputProperties.Add(new VFXPropertyWithValue(new VFXProperty(m_Function.returnType, m_Function.returnName))); - } - foreach (var input in m_InputParameters) { if (input.type != null) @@ -420,6 +415,10 @@ private void ParseCodeIfNeeded() } } } + if (m_Function.returnType != typeof(void) && m_Function.returnType != null) + { + m_OutputProperties.Add(new VFXPropertyWithValue(new VFXProperty(m_Function.returnType, m_Function.returnName))); + } } else { From 5dc022d64580812a68c95e0c0d0bcc1e7438239c Mon Sep 17 00:00:00 2001 From: Robin Bradley Date: Sat, 11 Oct 2025 15:47:11 +0000 Subject: [PATCH 076/115] Code cleanup - Move backbuffer/y-flip logic over to the new method for the remaining passes --- .../2D/Rendergraph/Renderer2DRendergraph.cs | 8 ++++- .../Runtime/Passes/CopyDepthPass.cs | 15 +++++---- .../Runtime/Passes/FinalBlitPass.cs | 16 +++++---- .../Runtime/Passes/HDRDebugViewPass.cs | 14 ++++---- .../PostProcess/FinalPostProcessPass.cs | 33 ++----------------- .../ScalingSetupPostProcessPass.cs | 2 +- .../Passes/PostProcess/UberPostProcessPass.cs | 4 +-- .../Passes/ScreenSpaceAmbientOcclusionPass.cs | 17 +++++----- .../Runtime/PostProcess.cs | 9 ++--- .../Runtime/PostProcessUtils.cs | 20 +++++------ .../Runtime/RenderingUtils.cs | 15 +++++++-- .../Runtime/ScriptableRenderer.cs | 4 +-- .../Runtime/UniversalRendererRenderGraph.cs | 8 ++--- .../CustomRenderPipeline/CustomRenderer.cs | 2 +- 14 files changed, 79 insertions(+), 88 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs index 9e921bc2be0..66422e8904a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs @@ -238,6 +238,12 @@ ImportResourceSummary GetImportResourceSummary(RenderGraph renderGraph, Universa bool isBuiltInTexture = cameraData.targetTexture == null; + bool useActualBackbufferOrienation = !cameraData.isSceneViewCamera && !cameraData.isPreviewCamera && cameraData.targetTexture == null; + TextureUVOrigin backbufferTextureUVOrigin = useActualBackbufferOrienation ? (SystemInfo.graphicsUVStartsAtTop ? TextureUVOrigin.TopLeft : TextureUVOrigin.BottomLeft) : TextureUVOrigin.BottomLeft; + + output.backBufferColorParams.textureUVOrigin = backbufferTextureUVOrigin; + output.backBufferDepthParams.textureUVOrigin = backbufferTextureUVOrigin; + #if ENABLE_VR && ENABLE_XR_MODULE if (cameraData.xr.enabled) { @@ -698,7 +704,7 @@ internal override void OnRecordRenderGraph(RenderGraph renderGraph, ScriptableRe RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent2D.BeforeRendering); - SetupRenderGraphCameraProperties(renderGraph, commonResourceData.isActiveTargetBackBuffer, commonResourceData.activeColorTexture); + SetupRenderGraphCameraProperties(renderGraph, commonResourceData.activeColorTexture); #if VISUAL_EFFECT_GRAPH_0_0_1_OR_NEWER ProcessVFXCameraCommand(renderGraph); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs index 9cc40422b2d..fcb93d919e5 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs @@ -120,6 +120,7 @@ public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderin private class PassData { internal TextureHandle source; + internal TextureHandle destination; internal UniversalCameraData cameraData; internal Material copyDepthMaterial; internal int msaaSamples; @@ -151,11 +152,14 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData cmd.SetFoveatedRenderingMode(FoveatedRenderingMode.Disabled); } #endif - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(cmd), m_PassData, this.source); + + // We must perform a yflip if we're rendering into the backbuffer and we have a flipped source texture. + bool yflip = m_PassData.isDstBackbuffer && cameraData.IsHandleYFlipped(source); + ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(cmd), m_PassData, this.source, yflip); } #endif - private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RTHandle source) + private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RTHandle source, bool yflip) { var copyDepthMaterial = passData.copyDepthMaterial; var msaaSamples = passData.msaaSamples; @@ -215,9 +219,6 @@ private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RTHa cmd.SetKeyword(ShaderGlobalKeywords._OUTPUT_DEPTH, copyToDepth); - // We must perform a yflip if we're rendering into the backbuffer and we have a flipped source texture. - bool yflip = passData.isDstBackbuffer && passData.cameraData.IsHandleYFlipped(source); - Vector2 viewportScale = source.useScaling ? new Vector2(source.rtHandleProperties.rtHandleScale.x, source.rtHandleProperties.rtHandleScale.y) : Vector2.one; Vector4 scaleBias = yflip ? new Vector4(viewportScale.x, -viewportScale.y, 0, viewportScale.y) : new Vector4(viewportScale.x, viewportScale.y, 0, 0); @@ -342,6 +343,7 @@ public void Render(RenderGraph renderGraph, TextureHandle destination, TextureHa } passData.source = source; + passData.destination = destination; builder.UseTexture(source, AccessFlags.Read); if (bindAsCameraDepth && destination.IsValid()) @@ -351,7 +353,8 @@ public void Render(RenderGraph renderGraph, TextureHandle destination, TextureHa builder.SetRenderFunc((PassData data, RasterGraphContext context) => { - ExecutePass(context.cmd, data, data.source); + bool yflip = context.GetTextureUVOrigin(in data.source) != context.GetTextureUVOrigin(in data.destination); + ExecutePass(context.cmd, data, data.source, yflip); }); } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs index 3f4debe42e5..1d22a4f9fbd 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs @@ -219,21 +219,21 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData #endif CoreUtils.SetRenderTarget(renderingData.commandBuffer, cameraTargetHandle.nameID, loadAction, RenderBufferStoreAction.Store, ClearFlag.None, Color.clear); - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, m_Source, cameraTargetHandle, cameraData); + Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(m_Source, cameraTargetHandle, cameraData); + ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, m_Source, cameraTargetHandle, cameraData, scaleBias); cameraData.renderer.ConfigureCameraTarget(cameraTargetHandle, cameraTargetHandle); - } + } } } #endif - private static void ExecutePass(RasterCommandBuffer cmd, PassData data, RTHandle source, RTHandle destination, UniversalCameraData cameraData) + private static void ExecutePass(RasterCommandBuffer cmd, PassData data, RTHandle source, RTHandle destination, UniversalCameraData cameraData, Vector4 scaleBias) { bool isRenderToBackBufferTarget = !cameraData.isSceneViewCamera; #if ENABLE_VR && ENABLE_XR_MODULE if (cameraData.xr.enabled) isRenderToBackBufferTarget = new RenderTargetIdentifier(destination.nameID, 0, CubemapFace.Unknown, -1) == new RenderTargetIdentifier(cameraData.xr.renderTarget, 0, CubemapFace.Unknown, -1); -#endif - Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(source, destination, cameraData); +#endif if (isRenderToBackBufferTarget) cmd.SetViewport(cameraData.pixelRect); @@ -358,7 +358,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Univer Blitter.BlitTexture(context.cmd, sourceTex, viewportScale, data.blitMaterialData.material, shaderPassIndex); } else - ExecutePass(context.cmd, data, data.source, data.destination, data.cameraData); + { + Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(context, in data.source, in data.destination); + ExecutePass(context.cmd, data, data.source, data.destination, data.cameraData, scaleBias); + } + }); } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/HDRDebugViewPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/HDRDebugViewPass.cs index 7a3783341f0..b549df4c456 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/HDRDebugViewPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/HDRDebugViewPass.cs @@ -109,7 +109,7 @@ private static void ExecuteCIExyPrepass(CommandBuffer cmd, PassDataCIExy data, R cmd.ClearRandomWriteTargets(); } - private static void ExecuteHDRDebugViewFinalPass(RasterCommandBuffer cmd, PassDataDebugView data, RTHandle sourceTexture, RTHandle destination, RTHandle xyTarget) + private static void ExecuteHDRDebugViewFinalPass(RasterCommandBuffer cmd, in PassDataDebugView data, RTHandle source, Vector4 scaleBias, RTHandle destination, RTHandle xyTarget) { if (data.cameraData.isHDROutputActive) { @@ -122,9 +122,7 @@ private static void ExecuteHDRDebugViewFinalPass(RasterCommandBuffer cmd, PassDa Vector4 debugParameters = new Vector4(ShaderConstants._SizeOfHDRXYMapping, ShaderConstants._SizeOfHDRXYMapping, 0, 0); data.material.SetVector(ShaderConstants._HDRDebugParamsId, debugParameters); data.material.SetVector(ShaderPropertyId.hdrOutputLuminanceParams, data.luminanceParameters); - data.material.SetInteger(ShaderConstants._DebugHDRModeId, (int)data.hdrDebugMode); - - Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(sourceTexture, destination, data.cameraData); + data.material.SetInteger(ShaderConstants._DebugHDRModeId, (int)data.hdrDebugMode); RenderTargetIdentifier cameraTarget = BuiltinRenderTextureType.CameraTarget; #if ENABLE_VR && ENABLE_XR_MODULE @@ -135,7 +133,7 @@ private static void ExecuteHDRDebugViewFinalPass(RasterCommandBuffer cmd, PassDa if (destination.nameID == cameraTarget || data.cameraData.targetTexture != null) cmd.SetViewport(data.cameraData.pixelRect); - Blitter.BlitTexture(cmd, sourceTexture, scaleBias, data.material, 1); + Blitter.BlitTexture(cmd, source, scaleBias, data.material, 1); } // Non-RenderGraph path @@ -213,7 +211,8 @@ private void ExecutePass(CommandBuffer cmd, PassDataCIExy dataCIExy, PassDataDeb using (new ProfilingScope(cmd, profilingSampler)) { - ExecuteHDRDebugViewFinalPass(rasterCmd, dataDebugView, sourceTexture, destTexture, xyTarget); + Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(sourceTexture, destTexture, dataDebugView.cameraData); + ExecuteHDRDebugViewFinalPass(rasterCmd, dataDebugView, sourceTexture, scaleBias, destTexture, xyTarget); } // Disable obsolete warning for internal usage @@ -287,7 +286,8 @@ internal void RenderHDRDebug(RenderGraph renderGraph, UniversalCameraData camera builder.SetRenderFunc((PassDataDebugView data, RasterGraphContext context) => { data.material.enabledKeywords = null; - ExecuteHDRDebugViewFinalPass(context.cmd, data, data.srcColor, data.dstColor, data.xyBuffer); + Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(in context, in data.srcColor, in data.dstColor); + ExecuteHDRDebugViewFinalPass(context.cmd, in data, data.srcColor, scaleBias, data.dstColor, data.xyBuffer); }); } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs index 6c93e4026b8..bd66c663eda 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs @@ -28,7 +28,6 @@ public enum SamplingOperation public bool applySrgbEncoding { get; set; } //NOTE: This is used to communicate if FXAA is already done in the previous pass. public bool applyFxaa { get; set; } - public bool resolveToDebugScreen { get; set; } // TODO: Needed only for the y-flip logic, we should pass the y-flip flag instead. // Input public TextureHandle sourceTexture { get; set; } @@ -77,7 +76,6 @@ private class PostProcessingFinalBlitPassData internal bool applySrgbEncoding; internal bool applyFxaa; - internal bool resolveToDebugScreen; } public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { @@ -111,7 +109,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer passData.applySrgbEncoding = applySrgbEncoding; passData.applyFxaa = applyFxaa; - passData.resolveToDebugScreen = resolveToDebugScreen; #if ENABLE_VR && ENABLE_XR_MODULE if (cameraData.xr.enabled) @@ -132,7 +129,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer var requireHDROutput = PostProcessUtils.RequireHDROutput(cameraData); var isAlphaOutputEnabled = cameraData.isAlphaOutputEnabled; var applyFxaa = data.applyFxaa; - var resolveToDebugScreen = data.resolveToDebugScreen; var hdrColorEncoding = data.hdrOperations.HasFlag(HDROutputUtils.Operation.ColorEncoding); var applySrgbEncoding = data.applySrgbEncoding; RTHandle sourceTextureHdl = data.sourceTexture; @@ -190,13 +186,9 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if(hdrColorEncoding) PostProcessUtils.SetupHDROutput(material, cameraData.hdrDisplayInformation, cameraData.hdrDisplayColorGamut, data.tonemapping, data.hdrOperations, cameraData.rendersOverlayUI); - //PostProcessUtils.SetGlobalShaderSourceSize(cmd, data.sourceTexture); material.SetVector(ShaderConstants._SourceSize, PostProcessUtils.CalcShaderSourceSize(sourceTextureHdl)); - bool yFlip = isYFlipRequired(destinationTextureHdl, data.cameraData, data.resolveToDebugScreen); - Vector2 viewportScale = sourceTextureHdl.useScaling ? new Vector2(sourceTextureHdl.rtHandleProperties.rtHandleScale.x, sourceTextureHdl.rtHandleProperties.rtHandleScale.y) : Vector2.one; - Vector4 scaleBias = yFlip ? new Vector4(viewportScale.x, -viewportScale.y, 0, viewportScale.y) : new Vector4(viewportScale.x, viewportScale.y, 0, 0); - + Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(context, data.sourceTexture, data.destinationTexture); cmd.SetViewport(data.cameraData.pixelRect); #if ENABLE_VR && ENABLE_XR_MODULE if (data.cameraData.xr.enabled && data.cameraData.xr.hasValidVisibleMesh) @@ -205,7 +197,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer xrPropertyBlock.SetVector(ShaderConstants._BlitScaleBias, scaleBias); xrPropertyBlock.SetTexture(ShaderConstants._BlitTexture, sourceTextureHdl); - data.cameraData.xr.RenderVisibleMeshCustomMaterial(cmd, data.cameraData.xr.occlusionMeshScale, material, xrPropertyBlock, 1, !yFlip); + data.cameraData.xr.RenderVisibleMeshCustomMaterial(cmd, data.cameraData.xr.occlusionMeshScale, material, xrPropertyBlock, 1, context.GetTextureUVOrigin(in data.sourceTexture) == context.GetTextureUVOrigin(in data.destinationTexture)); } else #endif @@ -216,27 +208,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer } } - // TODO: Move yFlip logic to higher level (like OnAfterRendering). The destinationTexture is passed in from the OnAfterRendering. - // TODO: We should know if the target is going to be the same as xr.renderTarget at that level. All the other data is already available there. - // TODO: The pass/shader only needs to know whether to apply y-flip or not. - // TODO: Comparing the xr.renderTarget inside the pass creates a non-modular/global dependency on XR target setup code. - // TODO: Currently we call this inside the execution delegate/lambda because the texture handles are not yet allocated at record-time. - static bool isYFlipRequired(RTHandle destinationTexture, UniversalCameraData cameraData, bool resolveToDebugScreen) - { - bool isRenderToBackBufferTarget = !cameraData.isSceneViewCamera; -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - isRenderToBackBufferTarget = destinationTexture == cameraData.xr.renderTarget; -#endif - // HDR debug views force-renders to DebugScreenTexture. - isRenderToBackBufferTarget &= !resolveToDebugScreen; - - // We y-flip if - // 1) we are blitting from render texture to back buffer(UV starts at bottom) and - // 2) renderTexture starts UV at top - return isRenderToBackBufferTarget && cameraData.targetTexture == null && SystemInfo.graphicsUVStartsAtTop; - } - // Precomputed shader ids to same some CPU cycles (mostly affects mobile) public static class ShaderConstants { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/ScalingSetupPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/ScalingSetupPostProcessPass.cs index 16fbaa24581..566fbe9cbb3 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/ScalingSetupPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/ScalingSetupPostProcessPass.cs @@ -97,7 +97,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer material.SetVector(ShaderConstants._SourceSize, PostProcessUtils.CalcShaderSourceSize(data.sourceTexture)); const bool isFinalPass = false; // This is a pass just before final pass. Viewport must match intermediate target. - PostProcessUtils.ScaleViewportAndBlit(context.cmd, data.sourceTexture, data.destinationTexture, data.cameraData, data.material, isFinalPass); + PostProcessUtils.ScaleViewportAndBlit(context, data.sourceTexture, data.destinationTexture, data.cameraData, data.material, isFinalPass); }); } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs index cc076cee32f..51e3d26cd2b 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs @@ -213,10 +213,10 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // Done with Uber, blit it #if ENABLE_VR && ENABLE_XR_MODULE if (cameraData.xr.enabled && cameraData.xr.hasValidVisibleMesh) - PostProcessUtils.ScaleViewportAndDrawVisibilityMesh(cmd, sourceTextureHdl, data.destinationTexture, data.cameraData, material, data.isFinalPass); + PostProcessUtils.ScaleViewportAndDrawVisibilityMesh(context, data.sourceTexture, data.destinationTexture, data.cameraData, material, data.isFinalPass); else #endif - PostProcessUtils.ScaleViewportAndBlit(cmd, sourceTextureHdl, data.destinationTexture, data.cameraData, material, data.isFinalPass); + PostProcessUtils.ScaleViewportAndBlit(context, data.sourceTexture, data.destinationTexture, data.cameraData, material, data.isFinalPass); }); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceAmbientOcclusionPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceAmbientOcclusionPass.cs index 17ac7da5502..87d613175cd 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceAmbientOcclusionPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceAmbientOcclusionPass.cs @@ -324,20 +324,21 @@ private void InitSSAOPassData(ref SSAOPassData data) data.directLightingStrength = m_CurrentSettings.DirectLightingStrength; } - private static Vector4 ComputeScaleBias(UniversalCameraData cameraData, RTHandle source, RTHandle destination) + private static Vector4 ComputeScaleBias(in UnsafeGraphContext context, in TextureHandle source, in TextureHandle destination) { + RTHandle srcRTHandle = source; Vector2 viewportScale; - if (source.useScaling) + if (srcRTHandle is { useScaling: true }) { - viewportScale.x = source.rtHandleProperties.rtHandleScale.x; - viewportScale.y = source.rtHandleProperties.rtHandleScale.y; + viewportScale.x = srcRTHandle.rtHandleProperties.rtHandleScale.x; + viewportScale.y = srcRTHandle.rtHandleProperties.rtHandleScale.y; } else { viewportScale = Vector2.one; } - bool yFlip = cameraData.IsHandleYFlipped(source) != cameraData.IsHandleYFlipped(destination); + bool yFlip = context.GetTextureUVOrigin(in source) != context.GetTextureUVOrigin(in destination); if (yFlip) return new Vector4(viewportScale.x, -viewportScale.y, 0, viewportScale.y); else @@ -429,20 +430,20 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer case ScreenSpaceAmbientOcclusionSettings.BlurQualityOptions.High: Blitter.BlitCameraTexture(cmd, data.AOTexture, data.blurTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, data.material, (int) ShaderPasses.BilateralBlurHorizontal); Blitter.BlitCameraTexture(cmd, data.blurTexture, data.AOTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, data.material, (int) ShaderPasses.BilateralBlurVertical); - viewScaleBias = ComputeScaleBias(data.cameraData, data.AOTexture, data.finalTexture); + viewScaleBias = ComputeScaleBias(in rgContext, in data.AOTexture, in data.finalTexture); Blitter.BlitCameraTexture(cmd, data.AOTexture, data.finalTexture, viewScaleBias, finalLoadAction, RenderBufferStoreAction.Store, data.material, (int) (data.afterOpaque ? ShaderPasses.BilateralAfterOpaque : ShaderPasses.BilateralBlurFinal)); break; // Gaussian case ScreenSpaceAmbientOcclusionSettings.BlurQualityOptions.Medium: Blitter.BlitCameraTexture(cmd, data.AOTexture, data.blurTexture, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, data.material, (int) ShaderPasses.GaussianBlurHorizontal); - viewScaleBias = ComputeScaleBias(data.cameraData, data.blurTexture, data.finalTexture); + viewScaleBias = ComputeScaleBias(in rgContext, in data.blurTexture, in data.finalTexture); Blitter.BlitCameraTexture(cmd, data.blurTexture, data.finalTexture, viewScaleBias, finalLoadAction, RenderBufferStoreAction.Store, data.material, (int) (data.afterOpaque ? ShaderPasses.GaussianAfterOpaque : ShaderPasses.GaussianBlurVertical)); break; // Kawase case ScreenSpaceAmbientOcclusionSettings.BlurQualityOptions.Low: - viewScaleBias = ComputeScaleBias(data.cameraData, data.AOTexture, data.finalTexture); + viewScaleBias = ComputeScaleBias(in rgContext, in data.AOTexture, in data.finalTexture); Blitter.BlitCameraTexture(cmd, data.AOTexture, data.finalTexture, viewScaleBias, finalLoadAction, RenderBufferStoreAction.Store, data.material, (int) (data.afterOpaque ? ShaderPasses.KawaseAfterOpaque : ShaderPasses.KawaseBlur)); break; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs index f505123045f..702d6e272bc 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs @@ -141,13 +141,12 @@ TextureHandle TryGetCachedUserLutTextureHandle(RenderGraph renderGraph, ColorLoo return m_UserLut != null ? renderGraph.ImportTexture(m_UserLut) : TextureHandle.nullHandle; } - static bool UpdateGlobalDebugHandlerPass(RenderGraph renderGraph, UniversalCameraData cameraData, bool isFinalPass) + static void UpdateGlobalDebugHandlerPass(RenderGraph renderGraph, UniversalCameraData cameraData, bool isFinalPass) { // NOTE: Debug handling injects a global state render pass. DebugHandler debugHandler = ScriptableRenderPass.GetActiveDebugHandler(cameraData); bool resolveToDebugScreen = debugHandler != null && debugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget); debugHandler?.UpdateShaderGlobalPropertiesForFinalValidationPass(renderGraph, cameraData, isFinalPass && !resolveToDebugScreen); - return resolveToDebugScreen; } const string _CameraColorUpscaled = "_CameraColorUpscaled"; @@ -222,7 +221,7 @@ public TextureHandle RenderPostProcessing(RenderGraph renderGraph, ContextContai TemporalAA.ValidateAndWarn(cameraData, isSTPRequested); // NOTE: Debug handling injects a global state render pass. - bool resolveToDebugScreen = UpdateGlobalDebugHandlerPass(renderGraph, cameraData, !hasFinalPass); + UpdateGlobalDebugHandlerPass(renderGraph, cameraData, !hasFinalPass); TextureHandle currentSource = activeCameraColorTexture; @@ -397,7 +396,6 @@ public TextureHandle RenderPostProcessing(RenderGraph renderGraph, ContextContai m_UberPass.isFinalPass = !hasFinalPass; m_UberPass.requireSRGBConversionBlit = RequireSRGBConversionBlitToBackBuffer(cameraData, enableColorEncodingIfNeeded); m_UberPass.useFastSRGBLinearConversion = useFastSRGBLinearConversion; - m_UberPass.resolveToDebugScreen = resolveToDebugScreen; TextureHandle activeOverlayUITexture = TextureHandle.nullHandle; bool requireHDROutput = PostProcessUtils.RequireHDROutput(cameraData); @@ -443,7 +441,7 @@ public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer var filmGrain = stack.GetComponent(); // NOTE: Debug handling injects a global state render pass. - bool resolveToDebugScreen = UpdateGlobalDebugHandlerPass(renderGraph, cameraData, true); + UpdateGlobalDebugHandlerPass(renderGraph, cameraData, true); var srcDesc = renderGraph.GetTextureDesc(source); @@ -563,7 +561,6 @@ public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer m_FinalPostProcessPass.samplingOperation = samplingOperation; m_FinalPostProcessPass.applyFxaa = applyFxaa; m_FinalPostProcessPass.applySrgbEncoding = RequireSRGBConversionBlitToBackBuffer(cameraData, enableColorEncodingIfNeeded); - m_FinalPostProcessPass.resolveToDebugScreen = resolveToDebugScreen; m_FinalPostProcessPass.hdrOperations = hdrOperations; m_FinalPostProcessPass.sourceTexture = currentSource; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessUtils.cs b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessUtils.cs index 20380702bd1..1af7b5bba20 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessUtils.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessUtils.cs @@ -317,7 +317,7 @@ internal static void SetGlobalShaderSourceSize(CommandBuffer cmd, RTHandle sourc SetGlobalShaderSourceSize(CommandBufferHelpers.GetRasterCommandBuffer(cmd), source); } - internal static void ScaleViewport(RasterCommandBuffer cmd, RTHandle sourceTextureHdl, RTHandle dest, UniversalCameraData cameraData, bool isFinalPass) + internal static void ScaleViewport(RasterCommandBuffer cmd, RTHandle dest, UniversalCameraData cameraData, bool isFinalPass) { RenderTargetIdentifier cameraTarget = BuiltinRenderTextureType.CameraTarget; #if ENABLE_VR && ENABLE_XR_MODULE @@ -350,25 +350,25 @@ internal static void ScaleViewport(RasterCommandBuffer cmd, RTHandle sourceTextu } } - internal static void ScaleViewportAndBlit(RasterCommandBuffer cmd, RTHandle sourceTextureHdl, RTHandle dest, UniversalCameraData cameraData, Material material, bool isFinalPass) + internal static void ScaleViewportAndBlit(RasterGraphContext context, in TextureHandle sourceTexture, in TextureHandle destTexture, UniversalCameraData cameraData, Material material, bool isFinalPass) { - Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(sourceTextureHdl, dest, cameraData); - ScaleViewport(cmd, sourceTextureHdl, dest, cameraData, isFinalPass); + Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(context, sourceTexture, destTexture); + ScaleViewport(context.cmd, destTexture, cameraData, isFinalPass); - Blitter.BlitTexture(cmd, sourceTextureHdl, scaleBias, material, 0); + Blitter.BlitTexture(context.cmd, sourceTexture, scaleBias, material, 0); } - internal static void ScaleViewportAndDrawVisibilityMesh(RasterCommandBuffer cmd, RTHandle sourceTextureHdl, RTHandle dest, UniversalCameraData cameraData, Material material, bool isFinalPass) + internal static void ScaleViewportAndDrawVisibilityMesh(RasterGraphContext context, in TextureHandle sourceTexture, in TextureHandle destTexture, UniversalCameraData cameraData, Material material, bool isFinalPass) { #if ENABLE_VR && ENABLE_XR_MODULE - Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(sourceTextureHdl, dest, cameraData); - ScaleViewport(cmd, sourceTextureHdl, dest, cameraData, isFinalPass); + Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(context, sourceTexture, destTexture); + ScaleViewport(context.cmd, destTexture, cameraData, isFinalPass); // Set property block for blit shader MaterialPropertyBlock xrPropertyBlock = XRSystemUniversal.GetMaterialPropertyBlock(); xrPropertyBlock.SetVector(Shader.PropertyToID("_BlitScaleBias"), scaleBias); - xrPropertyBlock.SetTexture(Shader.PropertyToID("_BlitTexture"), sourceTextureHdl); - cameraData.xr.RenderVisibleMeshCustomMaterial(cmd, cameraData.xr.occlusionMeshScale, material, xrPropertyBlock, 1, cameraData.IsRenderTargetProjectionMatrixFlipped(dest)); + xrPropertyBlock.SetTexture(Shader.PropertyToID("_BlitTexture"), sourceTexture); + cameraData.xr.RenderVisibleMeshCustomMaterial(context.cmd, cameraData.xr.occlusionMeshScale, material, xrPropertyBlock, 1, context.GetTextureUVOrigin(in sourceTexture) == context.GetTextureUVOrigin(in destTexture)); #endif } #endregion diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs index 68f722153db..23b09f1c1fc 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs @@ -1118,6 +1118,7 @@ internal static bool IsHandleYFlipped(in RasterGraphContext renderGraphContext, return renderGraphContext.GetTextureUVOrigin(textureHandle) == TextureUVOrigin.BottomLeft; } +#if URP_COMPATIBILITY_MODE /// /// Returns the scale bias vector to use for final blits to the backbuffer, based on scaling mode and y-flip platform requirements. /// @@ -1127,9 +1128,19 @@ internal static bool IsHandleYFlipped(in RasterGraphContext renderGraphContext, /// internal static Vector4 GetFinalBlitScaleBias(RTHandle source, RTHandle destination, UniversalCameraData cameraData) { - Vector2 viewportScale = source.useScaling ? new Vector2(source.rtHandleProperties.rtHandleScale.x, source.rtHandleProperties.rtHandleScale.y) : Vector2.one; + Vector2 scale = source.useScaling ? new Vector2(source.rtHandleProperties.rtHandleScale.x, source.rtHandleProperties.rtHandleScale.y) : Vector2.one; var yflip = cameraData.IsRenderTargetProjectionMatrixFlipped(destination); - Vector4 scaleBias = !yflip ? new Vector4(viewportScale.x, -viewportScale.y, 0, viewportScale.y) : new Vector4(viewportScale.x, viewportScale.y, 0, 0); + Vector4 scaleBias = !yflip ? new Vector4(scale.x, -scale.y, 0, scale.y) : new Vector4(scale.x, scale.y, 0, 0); + + return scaleBias; + } +#endif + internal static Vector4 GetFinalBlitScaleBias(in RasterGraphContext renderGraphContext, in TextureHandle source, in TextureHandle destination) + { + RTHandle srcRTHandle = source; + Vector2 scale = srcRTHandle is { useScaling: true } ? new Vector2(srcRTHandle.rtHandleProperties.rtHandleScale.x, srcRTHandle.rtHandleProperties.rtHandleScale.y) : Vector2.one; + var yflip = renderGraphContext.GetTextureUVOrigin(in source) != renderGraphContext.GetTextureUVOrigin(in destination); + Vector4 scaleBias = yflip ? new Vector4(scale.x, -scale.y, 0, scale.y) : new Vector4(scale.x, scale.y, 0, 0); return scaleBias; } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs index 08f85d7bd20..2620ecccb6a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs @@ -987,7 +987,7 @@ internal void ProcessVFXCameraCommand(RenderGraph renderGraph) } } - internal void SetupRenderGraphCameraProperties(RenderGraph renderGraph, bool isTargetBackbuffer, TextureHandle target) + internal void SetupRenderGraphCameraProperties(RenderGraph renderGraph, TextureHandle target) { using (var builder = renderGraph.AddRasterRenderPass(Profiling.setupCamera.name, out var passData, Profiling.setupCamera)) @@ -995,7 +995,6 @@ internal void SetupRenderGraphCameraProperties(RenderGraph renderGraph, bool isT passData.renderer = this; passData.cameraData = frameData.Get(); passData.cameraTargetSizeCopy = new Vector2Int(passData.cameraData.cameraTargetDescriptor.width, passData.cameraData.cameraTargetDescriptor.height); - passData.isTargetBackbuffer = isTargetBackbuffer; passData.target = target; builder.AllowGlobalStateModification(true); @@ -1229,7 +1228,6 @@ private class PassData { internal ScriptableRenderer renderer; internal UniversalCameraData cameraData; - internal bool isTargetBackbuffer; internal TextureHandle target; // The size of the camera target changes during the frame so we must make a copy of it here to preserve its record-time value. diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index 3c2224ba1d6..ee08cc55f49 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -626,7 +626,7 @@ internal override void OnRecordRenderGraph(RenderGraph renderGraph, ScriptableRe RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.BeforeRendering); - SetupRenderGraphCameraProperties(renderGraph, resourceData.isActiveTargetBackBuffer, resourceData.activeColorTexture.IsValid() ? resourceData.activeColorTexture : resourceData.activeDepthTexture); + SetupRenderGraphCameraProperties(renderGraph, resourceData.activeColorTexture.IsValid() ? resourceData.activeColorTexture : resourceData.activeDepthTexture); #if VISUAL_EFFECT_GRAPH_0_0_1_OR_NEWER ProcessVFXCameraCommand(renderGraph); @@ -754,7 +754,7 @@ private void OnBeforeRendering(RenderGraph renderGraph) // The camera need to be setup again after the shadows since those passes override some settings // TODO RENDERGRAPH: move the setup code into the shadow passes if (renderShadows) - SetupRenderGraphCameraProperties(renderGraph, resourceData.isActiveTargetBackBuffer, resourceData.activeColorTexture.IsValid() ? resourceData.activeColorTexture : resourceData.activeDepthTexture); + SetupRenderGraphCameraProperties(renderGraph, resourceData.activeColorTexture.IsValid() ? resourceData.activeColorTexture : resourceData.activeDepthTexture); RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRenderingShadows); @@ -1086,13 +1086,13 @@ private void OnMainRendering(RenderGraph renderGraph, ScriptableRenderContext co // Therefore we need to set the camera properties for the DepthNormal to be consistent with rendering to an intermediate render target. if (resourceData.isActiveTargetBackBuffer) { - SetupRenderGraphCameraProperties(renderGraph, false, depthTarget); + SetupRenderGraphCameraProperties(renderGraph, depthTarget); } DepthNormalPrepassRender(renderGraph, renderPassInputs, depthTarget, batchLayerMask, setGlobalDepth, setGlobalTextures); // Restore camera properties for the rest of the render graph execution. if (resourceData.isActiveTargetBackBuffer) { - SetupRenderGraphCameraProperties(renderGraph, true, resourceData.activeColorTexture.IsValid() ? resourceData.activeColorTexture : resourceData.activeDepthTexture); + SetupRenderGraphCameraProperties(renderGraph, resourceData.activeColorTexture.IsValid() ? resourceData.activeColorTexture : resourceData.activeDepthTexture); } } else diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/CustomRenderPipeline/CustomRenderer.cs b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/CustomRenderPipeline/CustomRenderer.cs index ffa9545eefc..4d4de49a5f6 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/CustomRenderPipeline/CustomRenderer.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/CustomRenderPipeline/CustomRenderer.cs @@ -163,7 +163,7 @@ internal override void OnRecordRenderGraph(RenderGraph renderGraph, ScriptableRe var targetHandle = renderGraph.ImportTexture(m_TargetColorHandle, importInfo, importBackbufferParams); var depthHandle = renderGraph.ImportTexture(m_TargetDepthHandle, importInfoDepth, importBackbufferParams); - SetupRenderGraphCameraProperties(renderGraph, cameraData.camera.targetTexture == null, targetHandle.IsValid() ? targetHandle : depthHandle); + SetupRenderGraphCameraProperties(renderGraph, targetHandle.IsValid() ? targetHandle : depthHandle); if (!renderGraph.nativeRenderPassesEnabled) { From 8485984868432995c13a61c24b3431fe22ca9dda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Sat, 11 Oct 2025 20:35:11 +0000 Subject: [PATCH 077/115] Render Pipeline Converter - UX rework. --- .../RenderPipelineConverterManager.cs | 10 +- .../RenderPipelineConverterVisualElement.cs | 158 +++++++----------- .../RenderPipelineConverterVisualElement.uss | 82 +++++++++ .../RenderPipelineConverterVisualElement.uxml | 59 ++++--- .../Window/RenderPipelineConvertersEditor.cs | 67 ++------ .../Window/RenderPipelineConvertersEditor.uss | 80 +++++++++ .../RenderPipelineConvertersEditor.uxml | 32 ++-- .../Editor/HeaderFoldout.cs | 27 ++- 8 files changed, 320 insertions(+), 195 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/RenderPipelineConverterManager.cs b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/RenderPipelineConverterManager.cs index 4925143db83..a484518b371 100644 --- a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/RenderPipelineConverterManager.cs +++ b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/RenderPipelineConverterManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using NUnit.Framework; using UnityEngine; namespace UnityEditor.Rendering.Converter @@ -79,7 +80,14 @@ public void OnBeforeSerialize() public void OnAfterDeserialize() { - + // Something null, remove it + for (int i = converterStates.Count - 1; i >= 0; i--) + { + if (converterStates[i] == null || converterStates[i].converter == null) + { + converterStates.RemoveAt(i); + } + } } } } diff --git a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConverterVisualElement.cs b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConverterVisualElement.cs index 4b4c96cc334..f39d93b84ee 100644 --- a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConverterVisualElement.cs +++ b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConverterVisualElement.cs @@ -27,6 +27,11 @@ internal class RenderPipelineConverterVisualElement : VisualElement public bool isSelectedAndEnabled => converter.isEnabled && state.isSelected; VisualElement m_RootVisualElement; + ListView m_ItemsList; + HeaderFoldout m_HeaderFoldout; + VisualElement m_ListViewHeader; + HelpBox m_NoItemsFound; + HelpBox m_PressScan; Label m_PendingLabel; Label m_WarningLabel; Label m_ErrorLabel; @@ -43,53 +48,26 @@ public RenderPipelineConverterVisualElement(Node converterInfo) s_VisualTreeAsset.Value.CloneTree(m_RootVisualElement); m_RootVisualElement.styleSheets.Add(s_StyleSheet.Value); - m_RootVisualElement.SetEnabled(converter.isEnabled); - m_RootVisualElement.Q public partial class FinalBlitPass : ScriptableRenderPass { - static readonly int s_CameraDepthTextureID = Shader.PropertyToID("_CameraDepthTexture"); #if URP_COMPATIBILITY_MODE RTHandle m_Source; @@ -272,26 +271,26 @@ private void InitPassData(UniversalCameraData cameraData, ref PassData passData, passData.blitMaterialData = m_BlitMaterialData[(int)blitType]; } - internal void Render(RenderGraph renderGraph, ContextContainer frameData, UniversalCameraData cameraData, in TextureHandle src, in TextureHandle dest, TextureHandle overlayUITexture) + /// + override public void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) - { - UniversalResourceData resourceData = frameData.Get(); - - // Only the UniversalRenderer guarantees that global textures will be available at this point - bool isUniversalRenderer = (cameraData.renderer as UniversalRenderer) != null; + var cameraData = frameData.Get(); + var resourceData = frameData.Get(); - if (cameraData.requiresDepthTexture && isUniversalRenderer) - builder.UseGlobalTexture(s_CameraDepthTextureID); + var sourceTexture = resourceData.cameraColor; + var destinationTexture = resourceData.backBufferColor; //By definition this pass blits to the backbuffer + var overlayUITexture = resourceData.overlayUITexture; + using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) + { bool outputsToHDR = cameraData.isHDROutputActive; bool outputsAlpha = cameraData.isAlphaOutputEnabled; InitPassData(cameraData, ref passData, outputsToHDR ? BlitType.HDR : BlitType.Core, outputsAlpha); passData.sourceID = ShaderPropertyId.sourceTex; - passData.source = src; - builder.UseTexture(src, AccessFlags.Read); - passData.destination = dest; + passData.source = sourceTexture; + builder.UseTexture(sourceTexture, AccessFlags.Read); + passData.destination = destinationTexture; // Default flag for non-XR common case AccessFlags targetAccessFlag = AccessFlags.Write; @@ -307,7 +306,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Univer if (cameraData.xr.enabled && cameraData.isDefaultViewport && !outputsAlpha) targetAccessFlag = AccessFlags.WriteAll; #endif - builder.SetRenderAttachment(dest, 0, targetAccessFlag); + builder.SetRenderAttachment(passData.destination, 0, targetAccessFlag); if (outputsToHDR && overlayUITexture.IsValid()) { @@ -334,7 +333,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Univer DebugHandler debugHandler = GetActiveDebugHandler(data.cameraData); bool resolveToDebugScreen = debugHandler != null && debugHandler.WriteToDebugScreenTexture(data.cameraData.resolveFinalTarget); - // TODO RENDERGRAPH: this should ideally be shared in ExecutePass to avoid code duplication + if (data.hdrOutputLuminanceParams.w >= 0) { HDROutputUtils.Operation hdrOperation = HDROutputUtils.Operation.None; @@ -365,6 +364,8 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Univer }); } + + resourceData.SwitchActiveTexturesToBackbuffer(); } } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs index bd66c663eda..1fb766d1cb3 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs @@ -7,7 +7,6 @@ namespace UnityEngine.Rendering.Universal internal sealed class FinalPostProcessPass : ScriptableRenderPass, IDisposable { Material m_Material; - bool m_IsValid; Texture2D[] m_FilmGrainTextures; @@ -19,32 +18,19 @@ public enum SamplingOperation FsrSharpening } - // Settings - public Tonemapping tonemapping { get; set; } - public FilmGrain filmGrain { get; set; } - - public SamplingOperation samplingOperation { get; set; } - public HDROutputUtils.Operation hdrOperations { get; set; } - public bool applySrgbEncoding { get; set; } + SamplingOperation m_SamplingOperation; + HDROutputUtils.Operation m_HdrOperations; + bool m_ApplySrgbEncoding; //NOTE: This is used to communicate if FXAA is already done in the previous pass. - public bool applyFxaa { get; set; } - - // Input - public TextureHandle sourceTexture { get; set; } - public TextureHandle overlayUITexture { get; set; } - - public Texture ditherTexture { get; set; } - - // Output - public TextureHandle destinationTexture { get; set; } + bool m_ApplyFxaa; + Texture m_DitherTexture; public FinalPostProcessPass(Shader shader, Texture2D[] filmGrainTextures) { this.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing - 1; - this.profilingSampler = null; + this.profilingSampler = new ProfilingSampler("Blit Final Post Processing"); m_Material = PostProcessUtils.LoadShader(shader, passName); - m_IsValid = m_Material != null; m_FilmGrainTextures = filmGrainTextures; } @@ -54,10 +40,13 @@ public void Dispose() CoreUtils.Destroy(m_Material); } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool IsValid() + public void Setup(SamplingOperation samplingOperation, HDROutputUtils.Operation hdrOperations, bool applySrgbEncoding, bool applyFxaa, Texture ditherTexture) { - return m_IsValid; + m_SamplingOperation = samplingOperation; + m_HdrOperations = hdrOperations; + m_ApplySrgbEncoding = applySrgbEncoding; + m_ApplyFxaa = applyFxaa; + m_DitherTexture = ditherTexture; } private class PostProcessingFinalBlitPassData @@ -79,13 +68,22 @@ private class PostProcessingFinalBlitPassData } public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - Assertions.Assert.IsTrue(sourceTexture.IsValid(), $"Source texture must be set for FinalPostProcessPass."); - Assertions.Assert.IsTrue(destinationTexture.IsValid(), $"Destination texture must be set for FinalPostProcessPass."); + if (m_Material == null) + return; - UniversalCameraData cameraData = frameData.Get(); + //TODO get stack from VolumeEffect class in later PR + Tonemapping tonemapping = VolumeManager.instance.stack.GetComponent(); + FilmGrain filmGrain = VolumeManager.instance.stack.GetComponent(); + + var cameraData = frameData.Get(); + var resourceData = frameData.Get(); + + var sourceTexture = resourceData.cameraColor; + var destinationTexture = resourceData.backBufferColor; //By definition this pass blits to the backbuffer + var overlayUITexture = resourceData.overlayUITexture; // Final blit pass - using (var builder = renderGraph.AddRasterRenderPass("Postprocessing Final Blit Pass", out var passData, ProfilingSampler.Get(URPProfileId.RG_FinalBlit))) + using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { // FSR and RCAS use global state constants. builder.AllowGlobalStateModification(true); @@ -101,14 +99,14 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer passData.cameraData = cameraData; passData.tonemapping = tonemapping; - passData.samplingOperation = samplingOperation; - passData.hdrOperations = hdrOperations; + passData.samplingOperation = m_SamplingOperation; + passData.hdrOperations = m_HdrOperations; passData.filmGrain.Setup(filmGrain, m_FilmGrainTextures, cameraData.pixelWidth, cameraData.pixelHeight); - passData.dithering.Setup(ditherTexture, cameraData.pixelWidth, cameraData.pixelHeight); + passData.dithering.Setup(m_DitherTexture, cameraData.pixelWidth, cameraData.pixelHeight); - passData.applySrgbEncoding = applySrgbEncoding; - passData.applyFxaa = applyFxaa; + passData.applySrgbEncoding = m_ApplySrgbEncoding; + passData.applyFxaa = m_ApplyFxaa; #if ENABLE_VR && ENABLE_XR_MODULE if (cameraData.xr.enabled) @@ -203,9 +201,9 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer #endif Blitter.BlitTexture(cmd, sourceTextureHdl, scaleBias, material, 0); }); - - return; } + + resourceData.SwitchActiveTexturesToBackbuffer(); } // Precomputed shader ids to same some CPU cycles (mostly affects mobile) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/Fsr1UpscalePostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/Fsr1UpscalePostProcessPass.cs index 4b3555e8bf9..24e46dd6a01 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/Fsr1UpscalePostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/Fsr1UpscalePostProcessPass.cs @@ -17,7 +17,7 @@ internal sealed class Fsr1UpscalePostProcessPass : ScriptableRenderPass, IDispos public Fsr1UpscalePostProcessPass(Shader shader) { this.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing - 1; - this.profilingSampler = null; + this.profilingSampler = new ProfilingSampler("Blit FSR Upscaling"); m_Material = PostProcessUtils.LoadShader(shader, passName); m_IsValid = m_Material != null; @@ -54,7 +54,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer var dstDesc = renderGraph.GetTextureDesc(destinationTexture); // FSR upscale - using (var builder = renderGraph.AddRasterRenderPass("Postprocessing Final FSR Scale Pass", out var passData, ProfilingSampler.Get(URPProfileId.RG_FinalFSRScale))) + using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { builder.AllowGlobalStateModification(true); builder.SetRenderAttachment(destinationTexture, 0, AccessFlags.Write); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/ScalingSetupPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/ScalingSetupPostProcessPass.cs index 566fbe9cbb3..03f0af2cb7c 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/ScalingSetupPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/ScalingSetupPostProcessPass.cs @@ -25,7 +25,7 @@ internal sealed class ScalingSetupPostProcessPass : ScriptableRenderPass, IDispo public ScalingSetupPostProcessPass(Shader shader) { this.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing - 1; - this.profilingSampler = null; + this.profilingSampler = new ProfilingSampler("Setup Final Post Processing"); m_Material = PostProcessUtils.LoadShader(shader, passName); m_IsValid = m_Material != null; @@ -58,7 +58,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer Assertions.Assert.IsTrue(destinationTexture.IsValid(), $"Destination texture must be set for ScalingSetupPostProcessPass."); // Scaled FXAA - using (var builder = renderGraph.AddRasterRenderPass("Postprocessing Final Setup Pass", out var passData, ProfilingSampler.Get(URPProfileId.RG_FinalSetup))) + using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { UniversalCameraData cameraData = frameData.Get(); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs index 51e3d26cd2b..a36547755a4 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs @@ -7,7 +7,6 @@ namespace UnityEngine.Rendering.Universal internal sealed class UberPostProcessPass : ScriptableRenderPass, IDisposable { Material m_Material; - bool m_IsValid; Texture2D[] m_FilmGrainTextures; @@ -27,28 +26,15 @@ internal sealed class UberPostProcessPass : ScriptableRenderPass, IDisposable public HDROutputUtils.Operation hdrOperations { get; set; } public bool requireSRGBConversionBlit { get; set; } public bool useFastSRGBLinearConversion { get; set; } - public bool resolveToDebugScreen { get; set; } - - // Input - public TextureHandle sourceTexture { get; set; } - public TextureHandle internalLutTexture { get; set; } - public TextureHandle userLutTexture { get; set; } - public TextureHandle bloomTexture { get; set; } - public TextureHandle overlayUITexture { get; set; } public Texture ditherTexture { get; set; } - // Output - public TextureHandle destinationTexture { get; set; } - - public UberPostProcessPass(Shader shader, Texture2D[] filmGrainTextures) { this.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing - 1; - this.profilingSampler = null; // Use default passName + this.profilingSampler = new ProfilingSampler("Blit Post Processing"); m_Material = PostProcessUtils.LoadShader(shader, passName); - m_IsValid = m_Material != null; m_FilmGrainTextures = filmGrainTextures; } @@ -56,12 +42,7 @@ public UberPostProcessPass(Shader shader, Texture2D[] filmGrainTextures) public void Dispose() { CoreUtils.Destroy(m_Material); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool IsValid() - { - return m_IsValid; + m_UserLut?.Release(); } private class UberPostPassData @@ -90,19 +71,43 @@ private class UberPostPassData internal bool requireSRGBConversionBlit; } + const string _CameraColorAfterPostProcessingName = "_CameraColorAfterPostProcessing"; + /// public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { - Assertions.Assert.IsTrue(sourceTexture.IsValid(), $"Source texture must be set for UberPostProcessPass."); - Assertions.Assert.IsTrue(destinationTexture.IsValid(), $"Destination texture must be set for UberPostProcessPass."); + if (m_Material == null) + return; var cameraData = frameData.Get(); var postProcessingData = frameData.Get(); + var resourceData = frameData.Get(); - using (var builder = renderGraph.AddRasterRenderPass("Blit Post Processing", out var passData, ProfilingSampler.Get(URPProfileId.RG_UberPost))) + var sourceTexture = resourceData.cameraColor; + var overlayUITexture = resourceData.overlayUITexture; + var internalColorLut = resourceData.internalColorLut; + var userColorLut = TryGetCachedUserLutTextureHandle(renderGraph, colorLookup); + var bloomTexture = resourceData.bloom; + + TextureHandle destinationTexture; + if (resourceData.isActiveTargetBackBuffer) { - UniversalResourceData resourceData = frameData.Get(); + destinationTexture = resourceData.backBufferColor; + } + else + { + //Due to camera stacking we could be rendering to a persistent texture that is not the backbuffer + destinationTexture = resourceData.destinationCameraColor.IsValid() ? + resourceData.destinationCameraColor + //TODO here we don't seem to apply PostProcessUtils.CreateCompatibleTexture. This seems completely out of sync with the other post process passes. + //However, changing it, breaks some tests because rendering with the color and depth after this pass when MSAA is on leads to mismatch. + //It seems completely arbitrary that we continue to write out color with MSAA if no other pp pass has been applied earlier. + : renderGraph.CreateTexture(sourceTexture, _CameraColorAfterPostProcessingName); + resourceData.destinationCameraColor = TextureHandle.nullHandle; + } + using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) + { var srcDesc = sourceTexture.GetDescriptor(renderGraph); #if ENABLE_VR && ENABLE_XR_MODULE @@ -124,11 +129,11 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if(overlayUITexture.IsValid()) builder.UseTexture(overlayUITexture, AccessFlags.Read); - builder.UseTexture(internalLutTexture, AccessFlags.Read); - if (userLutTexture.IsValid()) - builder.UseTexture(userLutTexture, AccessFlags.Read); + builder.UseTexture(internalColorLut, AccessFlags.Read); + if(userColorLut.IsValid()) + builder.UseTexture(userColorLut, AccessFlags.Read); - if (bloomTexture.IsValid()) + if(bloomTexture.IsValid()) builder.UseTexture(bloomTexture, AccessFlags.Read); passData.material = m_Material; @@ -141,7 +146,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer passData.hdrOperations = hdrOperations; passData.isHdrGrading = postProcessingData.gradingMode == ColorGradingMode.HighDynamicRange; - passData.lut.Setup(colorAdjustments, colorLookup, postProcessingData.lutSize, internalLutTexture, userLutTexture); + passData.lut.Setup(colorAdjustments, colorLookup, postProcessingData.lutSize, internalColorLut, userColorLut); passData.bloom.Setup(bloom, in srcDesc, bloomTexture); passData.lensDistortion.Setup(lensDistortion, cameraData.isSceneViewCamera); passData.chromaticAberration.Setup(chromaticAberration); @@ -219,12 +224,37 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer PostProcessUtils.ScaleViewportAndBlit(context, data.sourceTexture, data.destinationTexture, data.cameraData, material, data.isFinalPass); }); + } - return; + if (!resourceData.isActiveTargetBackBuffer) + { + resourceData.cameraColor = destinationTexture; } } #region ColorLut + RTHandle m_UserLut; + TextureHandle TryGetCachedUserLutTextureHandle(RenderGraph renderGraph, ColorLookup colorLookup) + { + if (colorLookup.texture.value == null) + { + if (m_UserLut != null) + { + m_UserLut.Release(); + m_UserLut = null; + } + } + else + { + if (m_UserLut == null || m_UserLut.externalTexture != colorLookup.texture.value) + { + m_UserLut?.Release(); + m_UserLut = RTHandles.Alloc(colorLookup.texture.value); + } + } + return m_UserLut != null ? renderGraph.ImportTexture(m_UserLut) : TextureHandle.nullHandle; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void CalcColorLutParams(ColorAdjustments colorAdjustments, ColorLookup colorLookup, int lutHeight, out Vector4 internalLutParams, out Vector4 userLutParams) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs index 702d6e272bc..08b40f6b033 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcess.cs @@ -29,9 +29,6 @@ internal sealed class PostProcess : IDisposable PostProcessData m_Resources; - RTHandle m_UserLut; - RTHandle m_InternalLut; - int m_DitheringTextureIndex; // 8-bit dithering /// @@ -85,12 +82,11 @@ public void Dispose() m_MotionBlurPass?.Dispose(); m_TemporalAntiAliasingPass?.Dispose(); m_StpPostProcessPass?.Dispose(); + m_UpscalerPostProcessPass.Dispose(); m_DepthOfFieldBokehPass?.Dispose(); m_DepthOfFieldGaussianPass?.Dispose(); m_SmaaPostProcessPass?.Dispose(); m_StopNanPostProcessPass?.Dispose(); - - m_UserLut?.Release(); } // Some Android devices do not support sRGB backbuffer @@ -120,27 +116,6 @@ Texture2D GetNextDitherTexture() return m_Resources.textures.blueNoise16LTex[GetNextDitherIndex()]; } - TextureHandle TryGetCachedUserLutTextureHandle(RenderGraph renderGraph, ColorLookup colorLookup) - { - if (colorLookup.texture.value == null) - { - if (m_UserLut != null) - { - m_UserLut.Release(); - m_UserLut = null; - } - } - else - { - if (m_UserLut == null || m_UserLut.externalTexture != colorLookup.texture.value) - { - m_UserLut?.Release(); - m_UserLut = RTHandles.Alloc(colorLookup.texture.value); - } - } - return m_UserLut != null ? renderGraph.ImportTexture(m_UserLut) : TextureHandle.nullHandle; - } - static void UpdateGlobalDebugHandlerPass(RenderGraph renderGraph, UniversalCameraData cameraData, bool isFinalPass) { // NOTE: Debug handling injects a global state render pass. @@ -150,15 +125,13 @@ static void UpdateGlobalDebugHandlerPass(RenderGraph renderGraph, UniversalCamer } const string _CameraColorUpscaled = "_CameraColorUpscaled"; - const string _CameraColorAfterPostProcessingName = "_CameraColorAfterPostProcessing"; - // If postProcessingTarget is not valid then this function will create an RG managed texture. Only pass postProcessingTarget if the output needs to be written to a certain persistent texture. // If hasFinalPass == true, Film Grain and Dithering are setup in the final pass, otherwise they are setup in this pass. - public TextureHandle RenderPostProcessing(RenderGraph renderGraph, ContextContainer frameData, in TextureHandle activeCameraColorTexture, in TextureHandle internalColorLutTexture, in TextureHandle overlayUITexture, in TextureHandle persistentTarget, bool hasFinalPass, bool enableColorEncodingIfNeeded) + public void RenderPostProcessing(RenderGraph renderGraph, ContextContainer frameData, bool hasFinalPass, bool enableColorEncodingIfNeeded) { - UniversalResourceData resourceData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalPostProcessingData postProcessingData = frameData.Get(); + var resourceData = frameData.Get(); + var cameraData = frameData.Get(); + var postProcessingData = frameData.Get(); var stack = VolumeManager.instance.stack; var depthOfField = stack.GetComponent(); @@ -223,7 +196,7 @@ public TextureHandle RenderPostProcessing(RenderGraph renderGraph, ContextContai // NOTE: Debug handling injects a global state render pass. UpdateGlobalDebugHandlerPass(renderGraph, cameraData, !hasFinalPass); - TextureHandle currentSource = activeCameraColorTexture; + TextureHandle currentSource = resourceData.cameraColor; // Optional NaN killer before post-processing kicks in // stopNaN may be null on Adreno 3xx. It doesn't support full shader level 3.5, but SystemInfo.graphicsShaderLevel is 35. @@ -397,7 +370,10 @@ public TextureHandle RenderPostProcessing(RenderGraph renderGraph, ContextContai m_UberPass.requireSRGBConversionBlit = RequireSRGBConversionBlitToBackBuffer(cameraData, enableColorEncodingIfNeeded); m_UberPass.useFastSRGBLinearConversion = useFastSRGBLinearConversion; - TextureHandle activeOverlayUITexture = TextureHandle.nullHandle; + //TODO remove once all passes are converted to use the resourceData with cameraColor swapping + resourceData.cameraColor = currentSource; + + var activeOverlayUITextureUberPost = TextureHandle.nullHandle; bool requireHDROutput = PostProcessUtils.RequireHDROutput(cameraData); if (requireHDROutput) { @@ -405,34 +381,25 @@ public TextureHandle RenderPostProcessing(RenderGraph renderGraph, ContextContai // Otherwise encoding will happen in the final post process pass or the final blit pass m_UberPass.hdrOperations = !hasFinalPass && enableColorEncodingIfNeeded ? HDROutputUtils.Operation.ColorEncoding : HDROutputUtils.Operation.None; - if(enableColorEncodingIfNeeded && overlayUITexture.IsValid()) - activeOverlayUITexture = overlayUITexture; + if(enableColorEncodingIfNeeded && resourceData.overlayUITexture.IsValid()) + activeOverlayUITextureUberPost = resourceData.overlayUITexture; } - // Input - m_UberPass.sourceTexture = currentSource; - m_UberPass.internalLutTexture = internalColorLutTexture; - m_UberPass.userLutTexture = TryGetCachedUserLutTextureHandle(renderGraph, colorLookup); - m_UberPass.bloomTexture = bloomTexture; - m_UberPass.overlayUITexture = activeOverlayUITexture; - m_UberPass.ditherTexture = cameraData.isDitheringEnabled ? GetNextDitherTexture() : null; + var overlayUITexture = resourceData.overlayUITexture; - if (persistentTarget.IsValid()) - { - m_UberPass.destinationTexture = persistentTarget; - }else - { - m_UberPass.destinationTexture = renderGraph.CreateTexture(m_UberPass.sourceTexture, _CameraColorAfterPostProcessingName); - } + resourceData.overlayUITexture = activeOverlayUITextureUberPost; + resourceData.bloom = bloomTexture; + + m_UberPass.ditherTexture = cameraData.isDitheringEnabled ? GetNextDitherTexture() : null; m_UberPass.RecordRenderGraph(renderGraph, frameData); - return m_UberPass.destinationTexture; + resourceData.overlayUITexture = overlayUITexture; } } #region FinalPass - public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer frameData, in TextureHandle source, in TextureHandle overlayUITexture, in TextureHandle postProcessingTarget, bool enableColorEncodingIfNeeded) + public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer frameData, bool enableColorEncodingIfNeeded) { UniversalCameraData cameraData = frameData.Get(); @@ -443,7 +410,9 @@ public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer // NOTE: Debug handling injects a global state render pass. UpdateGlobalDebugHandlerPass(renderGraph, cameraData, true); - var srcDesc = renderGraph.GetTextureDesc(source); + var resourceData = frameData.Get(); + var currentSource = resourceData.cameraColor; + var srcDesc = renderGraph.GetTextureDesc(currentSource); HDROutputUtils.Operation hdrOperations = HDROutputUtils.Operation.None; bool requireHDROutput = PostProcessUtils.RequireHDROutput(cameraData); @@ -467,7 +436,6 @@ public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer bool applyFxaa = PostProcessUtils.IsFxaaEnabled(cameraData); - var currentSource = source; if (cameraData.imageScalingMode != ImageScalingMode.None) { // When FXAA is enabled in scaled renders, we execute it in a separate blit since it's not designed to be used in @@ -553,23 +521,23 @@ public void RenderFinalPostProcessing(RenderGraph renderGraph, ContextContainer } } - bool renderOverlayUI = requireHDROutput && enableColorEncodingIfNeeded && cameraData.rendersOverlayUI; + //TODO remove once all passes are converted to use the resourceData with cameraColor swapping + resourceData.cameraColor = currentSource; - m_FinalPostProcessPass.tonemapping = tonemapping; - m_FinalPostProcessPass.filmGrain = filmGrain; + bool renderOverlayUI = requireHDROutput && enableColorEncodingIfNeeded && cameraData.rendersOverlayUI; + var overlayUITexture = resourceData.overlayUITexture; - m_FinalPostProcessPass.samplingOperation = samplingOperation; - m_FinalPostProcessPass.applyFxaa = applyFxaa; - m_FinalPostProcessPass.applySrgbEncoding = RequireSRGBConversionBlitToBackBuffer(cameraData, enableColorEncodingIfNeeded); - m_FinalPostProcessPass.hdrOperations = hdrOperations; + //We will swap the resourceData.overlayUITexture back after the pass + if (!renderOverlayUI) + resourceData.overlayUITexture = TextureHandle.nullHandle; - m_FinalPostProcessPass.sourceTexture = currentSource; - m_FinalPostProcessPass.overlayUITexture = renderOverlayUI ? overlayUITexture : TextureHandle.nullHandle; - m_FinalPostProcessPass.ditherTexture = cameraData.isDitheringEnabled ? GetNextDitherTexture() : null; + bool applySrgbEncoding = RequireSRGBConversionBlitToBackBuffer(cameraData, enableColorEncodingIfNeeded); + var ditherTexture = cameraData.isDitheringEnabled ? GetNextDitherTexture() : null; - m_FinalPostProcessPass.destinationTexture = postProcessingTarget; + m_FinalPostProcessPass.Setup(samplingOperation, hdrOperations, applySrgbEncoding, applyFxaa, ditherTexture); m_FinalPostProcessPass.RecordRenderGraph(renderGraph,frameData); - currentSource = TextureHandle.nullHandle; + + resourceData.overlayUITexture = overlayUITexture; } #endregion } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index ee08cc55f49..e9996c62851 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -1393,17 +1393,16 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) } if (applyPostProcessing) - { + { bool isTargetBackbuffer = cameraData.resolveFinalTarget && !applyFinalPostProcessing && !hasPassesAfterPostProcessing && !hasCaptureActions; var isSingleCamera = cameraData.resolveFinalTarget && cameraData.renderType == CameraRenderType.Base; - //We will pass a nullHandle to the post processing if there is no persistent texture that needs to be the output. Then, post processing can create an RG managed texture and return it. - TextureHandle target = TextureHandle.nullHandle; if (isTargetBackbuffer) { - target = resourceData.backBufferColor; + //Switch target to backbuffer for post processing pass + resourceData.SwitchActiveTexturesToBackbuffer(); } - else if (!isSingleCamera) + else if(!isSingleCamera) { //When part of a camera stack, we need to ensure the date ends up in the persistent A/B camera attachments to propagate the output to the cameras of the stack. ImportResourceParams importColorParams = new ImportResourceParams(); @@ -1411,33 +1410,25 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) importColorParams.clearColor = Color.black; importColorParams.discardOnLastUse = cameraData.resolveFinalTarget; // check if last camera in the stack - target = renderGraph.ImportTexture(nextRenderGraphCameraColorHandle, importColorParams); + resourceData.destinationCameraColor = renderGraph.ImportTexture(nextRenderGraphCameraColorHandle, importColorParams); } bool doSRGBEncoding = isTargetBackbuffer && needsColorEncoding; - //If the target is the nullHandle, then the output/target is not a persistent texture, and postprocess can create an RG managed texture for the target. This is done inside the RenderPostProcessing - //such that all the upscaled target creation is isolated in the postprocessing and the calling code here does not need to be aware. - target = m_PostProcess.RenderPostProcessing(renderGraph, frameData, resourceData.cameraColor, resourceData.internalColorLut, resourceData.overlayUITexture, in target, applyFinalPostProcessing, doSRGBEncoding); + m_PostProcess.RenderPostProcessing(renderGraph, frameData, applyFinalPostProcessing, doSRGBEncoding); // Handle any after-post rendering debugger overlays if (cameraData.resolveFinalTarget) SetupAfterPostRenderGraphFinalPassDebug(renderGraph, frameData); - - if (isTargetBackbuffer) - { - resourceData.SwitchActiveTexturesToBackbuffer(); - } - else - { - resourceData.cameraColor = target; - } } //We already checked the passes so we can skip here if there are none as a small optimization - if(hasPassesAfterPostProcessing) + if (hasPassesAfterPostProcessing) RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRenderingPostProcessing); + //TODO we should check if the custom (users) passes swapped the camera color when the camera is part of a stack, because this will break camera stacking. + //We need to copy back to a persistent A/B texture if that is the case to ensure correctness. + if (hasCaptureActions) { m_CapturePass.RecordRenderGraph(renderGraph, frameData); @@ -1445,8 +1436,8 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) if (applyFinalPostProcessing) { - m_PostProcess.RenderFinalPostProcessing(renderGraph, frameData, resourceData.cameraColor, resourceData.overlayUITexture, resourceData.backBufferColor, needsColorEncoding); - resourceData.SwitchActiveTexturesToBackbuffer(); + //Will swap the active camera targets to backbuffer (resourceData.SwitchActiveTexturesToBackbuffer) + m_PostProcess.RenderFinalPostProcessing(renderGraph, frameData, needsColorEncoding); } //Keep in mind that also our users could have done the final blit / final post processing and called SwitchActiveTexturesToBackbuffer(). @@ -1455,8 +1446,8 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) { debugHandler?.UpdateShaderGlobalPropertiesForFinalValidationPass(renderGraph, cameraData, !resolveToDebugScreen); - m_FinalBlitPass.Render(renderGraph, frameData, cameraData, resourceData.cameraColor, resourceData.backBufferColor, resourceData.overlayUITexture); - resourceData.SwitchActiveTexturesToBackbuffer(); + //Will swap the active camera targets to backbuffer (resourceData.SwitchActiveTexturesToBackbuffer) + m_FinalBlitPass.RecordRenderGraph(renderGraph, frameData); } RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRendering); From 528f0ebeb02b0abc27b783545d4d951636b012f6 Mon Sep 17 00:00:00 2001 From: Rasmus Roenn Nielsen Date: Tue, 14 Oct 2025 22:59:20 +0000 Subject: [PATCH 083/115] Bugfixes + improvements to HDRP ReBLUR Denoiser (UUM-103701 + UUM-103202 + UUM-103766) --- .../Shaders/TemporalAntialiasing.hlsl | 6 ++---- .../Camera/HDCameraFrameHistoryType.cs | 11 +++++++---- .../HDRenderPipeline.RaytracingReflection.cs | 10 +++++----- .../RenderPipeline/Raytracing/ReblurDenoiser.cs | 2 +- .../Shaders/Denoising/ReBlur/ReBlur_Blur.compute | 11 ++++++----- .../Denoising/ReBlur/ReBlur_HistoryFix.compute | 10 ++++------ .../Shaders/Denoising/ReBlur/ReBlur_PreBlur.compute | 4 ++-- .../ReBlur/ReBlur_TemporalAccumulation.compute | 5 ++--- .../ReBlur/ReBlur_TemporalStabilization.compute | 13 ++++++++++++- .../Shaders/Denoising/ReBlur/ReBlur_Utilities.hlsl | 6 +++--- .../Shaders/RaytracingReflectionFilter.compute | 6 +++--- 11 files changed, 47 insertions(+), 37 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/TemporalAntialiasing.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/TemporalAntialiasing.hlsl index 70de30c7f4a..84ea023e00a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/TemporalAntialiasing.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/PostProcessing/Shaders/TemporalAntialiasing.hlsl @@ -491,11 +491,8 @@ void VarianceNeighbourhood(inout NeighbourhoodSamples samples, float historyLuma // and high temporal contrast, we let the history to be closer to be unclipped. To achieve, the min/max bounds // are extended artificially more. #if ANTI_FLICKER - stDevMultiplier = 1.5; - - float aggressiveStdDevLuma = GetLuma(stdDev)* 0.5; + float aggressiveStdDevLuma = GetLuma(stdDev) * 0.5; aggressiveClampedHistoryLuma = clamp(historyLuma, GetLuma(moment1) - aggressiveStdDevLuma, GetLuma(moment1) + aggressiveStdDevLuma); - float temporalContrast = saturate(abs(colorLuma - aggressiveClampedHistoryLuma) / Max3(0.15, colorLuma, aggressiveClampedHistoryLuma)); #if ANTI_FLICKER_MV_DEPENDENT const float maxFactorScale = 2.25f; // when stationary const float minFactorScale = 0.8f; // when moving more than slightly @@ -508,6 +505,7 @@ void VarianceNeighbourhood(inout NeighbourhoodSamples samples, float historyLuma #if TEMPORAL_CONTRAST // TODO: Because we use a very aggressivley clipped history to compute the temporal contrast (hopefully cutting a chunk of ghosting) // can we be more aggressive here, being a bit more confident that the issue is from flickering? To investigate. + float temporalContrast = saturate(abs(colorLuma - aggressiveClampedHistoryLuma) / Max3(0.15, colorLuma, aggressiveClampedHistoryLuma)); stDevMultiplier += lerp(0.0, localizedAntiFlicker, smoothstep(0.05, antiFlickerParams.y, temporalContrast)); #else stDevMultiplier += localizedAntiFlicker; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Camera/HDCameraFrameHistoryType.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Camera/HDCameraFrameHistoryType.cs index 7c1ba31fe50..331874f6975 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Camera/HDCameraFrameHistoryType.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Camera/HDCameraFrameHistoryType.cs @@ -33,9 +33,9 @@ public enum HDCameraFrameHistoryType RaytracedShadowHistoryValidity, /// Ray traced shadow history distance buffer. RaytracedShadowDistanceValidity, - /// Ray traced reflections distance buffer. - RaytracedReflectionDistance, - /// Ray traced reflections distance buffer. + /// Ray traced reflections (xyz) and distance (w) buffer. + RaytracedReflectionLightingDistance, + /// Ray traced reflections accumulation buffer. RaytracedReflectionAccumulation, /// Ray traced reflections stabilization buffer. RaytracedReflectionStabilization, @@ -85,6 +85,9 @@ public enum HDCameraFrameHistoryType MotionVectorAOV = PathTracingMotionVector, /// Denoised path-traced frame history. It is recommended to use the PathTracingDenoised enum value instead. [Obsolete("#from(2023.3)")] - DenoiseHistory = PathTracingDenoised + DenoiseHistory = PathTracingDenoised, + /// Ray traced reflections (xyz) and distance (w) buffer. It is recommended to use RaytracedReflectionLightingDistance enum value instead. + [Obsolete("#from(6000.4)")] + RaytracedReflectionDistance = RaytracedReflectionLightingDistance } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRenderPipeline.RaytracingReflection.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRenderPipeline.RaytracingReflection.cs index 75f665ecfae..9ee426690e3 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRenderPipeline.RaytracingReflection.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRenderPipeline.RaytracingReflection.cs @@ -358,10 +358,10 @@ TextureHandle UpscaleRTR(RenderGraph renderGraph, HDCamera hdCamera, TextureHand static RTHandle RequestRayTracedReflectionLightingDistanceHistoryTexture(HDCamera hdCamera, ref bool realloc) { - var currentRT = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.RaytracedReflectionDistance); + var currentRT = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.RaytracedReflectionLightingDistance); if (currentRT == null) { - currentRT = hdCamera.AllocHistoryFrameRT((int)HDCameraFrameHistoryType.RaytracedReflectionDistance, ReflectionLightingDistanceHistoryBufferAllocatorFunction, 1); + currentRT = hdCamera.AllocHistoryFrameRT((int)HDCameraFrameHistoryType.RaytracedReflectionLightingDistance, ReflectionLightingDistanceHistoryBufferAllocatorFunction, 1); realloc = true; } return currentRT; @@ -448,7 +448,7 @@ DeferredLightingRTParameters PrepareReflectionDeferredLightingRTParameters(HDCam deferredParameters.raytracingCB._RayTracingRayMissUseAmbientProbeAsSky = 0; deferredParameters.raytracingCB._RayTracingLastBounceFallbackHierarchy = deferredParameters.lastBounceFallbackHierarchy; deferredParameters.raytracingCB._RayTracingAmbientProbeDimmer = settings.ambientProbeDimmer.value; - deferredParameters.raytracingCB._RaytracingAPVLayerMask = settings.adaptiveProbeVolumesLayerMask.value; + deferredParameters.raytracingCB._RaytracingAPVLayerMask = settings.adaptiveProbeVolumesLayerMask.value; return deferredParameters; } @@ -585,10 +585,10 @@ RayTracingReflectionsQualityOutput QualityRTR(RenderGraph renderGraph, HDCamera // Output textures passData.lightingTexture = renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) - { format = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, name = "Ray Traced Reflections" }); + { format = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, name = "Ray Traced Reflections (Lighting + Weight)" }); builder.UseTexture(passData.lightingTexture, AccessFlags.Write); passData.distanceTexture = renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) - { format = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, name = "Ray Traced Reflections" }); + { format = GraphicsFormat.R16_SFloat, enableRandomWrite = true, name = "Ray Traced Reflections (Ray Distances)" }); builder.UseTexture(passData.distanceTexture, AccessFlags.Write); passData.enableDecals = hdCamera.frameSettings.IsEnabled(FrameSettingsField.Decals); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/ReblurDenoiser.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/ReblurDenoiser.cs index 5b430917e2c..1ac93388c4b 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/ReblurDenoiser.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/ReblurDenoiser.cs @@ -402,7 +402,7 @@ public TextureHandle DenoiseIndirectSpecular(RenderGraph renderGraph, HDCamera h using (new ProfilingScope(ctx.cmd, ProfilingSampler.Get(HDProfileId.ReBlurMipHistoryFix))) { // Mini GBuffer - natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, HDShaderIDs._DepthTexture, data.depthBuffer); + natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, HDShaderIDs._DepthTexture, data.depthPyramidBuffer); natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, HDShaderIDs._NormalBufferTexture, data.normalBuffer); natCmd.SetComputeTextureParam(data.historyFixCS, data.historyFixKernel, _ReBlurMipChain, data.mipTexture); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_Blur.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_Blur.compute index 9bee8a57e7c..2cbf7de3c25 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_Blur.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_Blur.compute @@ -56,18 +56,19 @@ void Blur(uint3 dispatchThreadId : SV_DispatchThreadID, uint2 groupThreadId : SV // Evaluate the position and view vectors float3 viewWS = GetWorldSpaceNormalizeViewDir(center.position); - // Convert both directions to view space - float NdotV = abs(dot(center.normal, viewWS)); - // Get the dominant direction float4 dominantWS = GetSpecularDominantDirection(center.normal, viewWS, center.roughness); // Evaluate the blur radius float distanceToCamera = length(center.position); float blurRadius = ComputeBlurRadius(center.roughness, BLUR_MAX_RADIUS) * _ReBlurDenoiserRadius; - blurRadius *= (1.0 - saturate(accumulationFactor / MAX_ACCUM_FRAME_NUM)); + blurRadius *= lerp(1.0f, 0.1f, accumulationFactor / MAX_ACCUM_FRAME_NUM); blurRadius *= HitDistanceAttenuation(center.roughness, distanceToCamera, centerSignal.w); - blurRadius *= lerp(saturate((distanceToCamera - MIN_BLUR_DISTANCE) / BLUR_OUT_RANGE), 0.0, 1.0); + + // As the camera nears an object it becomes increasingly likely that the disc sample points + // land outside the view frustum, so we shrink radius accordingly to reduce the likelihood + // of this happening. + blurRadius *= saturate((distanceToCamera - MIN_BLUR_DISTANCE) / BLUR_OUT_RANGE); // Evalute the local basis float2x3 TvBv = GetKernelBasis(dominantWS.xyz, center.normal, center.roughness); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_HistoryFix.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_HistoryFix.compute index 8e6ea939be8..52af6afdfd2 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_HistoryFix.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_HistoryFix.compute @@ -36,7 +36,7 @@ void HistoryFix(uint3 dispatchThreadId : SV_DispatchThreadID, uint2 groupThreadI uint2 currentCoord = dispatchThreadId.xy; // Fetch the full resolution depth - float depthFR = LOAD_TEXTURE2D_X(_DepthTexture, currentCoord).x; + float depthFR = LOAD_TEXTURE2D_X(_DepthTexture, _DepthPyramidMipLevelOffsets[0] + currentCoord).x; // IF this is a background pixel, we have nothing to do here if (depthFR == UNITY_RAW_FAR_CLIP_VALUE) @@ -63,10 +63,8 @@ void HistoryFix(uint3 dispatchThreadId : SV_DispatchThreadID, uint2 groupThreadI NormalData normalData; DecodeFromNormalBuffer(currentCoord.xy, normalData); - // Grab the signal of the current frame - int mipLevel = (int)(MIP_LEVEL_COUNT * (1.0 - normAcc) * normalData.perceptualRoughness); + const int mipLevel = min(MIP_LEVEL_COUNT - 1, (1.0 - normAcc) * normalData.perceptualRoughness * MIP_LEVEL_COUNT); - // Now we need to loop through the LODs (going from the lowest to the highest until we have enough representative samples) float4 signalSum = 0.0; float weightSum = 0.0; int2 mipOffset = _DepthPyramidMipLevelOffsets[mipLevel]; @@ -75,7 +73,7 @@ void HistoryFix(uint3 dispatchThreadId : SV_DispatchThreadID, uint2 groupThreadI for (int x = -1; x <= 1; ++x) { // Evaluate the tap coordinate - int2 tapCoord = (currentCoord << mipLevel) + int2(x, y); + int2 tapCoord = (currentCoord >> mipLevel) + int2(x, y); // Read and linearize the depth float tapDepth = Linear01Depth(LOAD_TEXTURE2D_X(_DepthTexture, mipOffset + tapCoord).x, _ZBufferParams); @@ -83,7 +81,7 @@ void HistoryFix(uint3 dispatchThreadId : SV_DispatchThreadID, uint2 groupThreadI // Is the depth compatible with the full resolution depth float4 lightDistance = LOAD_TEXTURE2D_X_LOD(_ReBlurMipChain, tapCoord, mipLevel); if ((abs(tapDepth - linearDepth) < linearDepth * 0.1) && lightDistance.w >= 0.0) - { + { float weight = Gaussian(length(int2(x, y)), 1.0); signalSum += lightDistance * weight; weightSum += weight; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_PreBlur.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_PreBlur.compute index 22f6dfe6a91..c3186157f81 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_PreBlur.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_PreBlur.compute @@ -185,7 +185,7 @@ void PreBlur(uint3 dispatchThreadId : SV_DispatchThreadID, } else { - // If we are + // If we are #if defined(HALF_RESOLUTION) float4 fallbackLighting = 0.0; float weightSum = 0.0; @@ -227,7 +227,7 @@ void PreBlur(uint3 dispatchThreadId : SV_DispatchThreadID, #else fallbackLighting += float4(LOAD_TEXTURE2D_X(_LightingInputTexture, halfResCoord).xyz, LOAD_TEXTURE2D_X(_DistanceInputTexture, halfResCoord).x) * weight; #endif - weightSum += weight; + weightSum += weight; } } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_TemporalAccumulation.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_TemporalAccumulation.compute index 4150db65190..9412d0bde5b 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_TemporalAccumulation.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_TemporalAccumulation.compute @@ -83,7 +83,7 @@ void TemporalAccumulation(uint3 currentCoord : SV_DispatchThreadID, // Compute N dot V float NdotV = abs(dot(normalData.normalWS, viewWS)); - + // Surface motion history (the disocclusion code guarantees that the reprojected surface motion is inside the viewport and is an equivalent point) float2 historyUVUnscaled; float2 historySurfaceMotionCoord; @@ -146,7 +146,7 @@ void TemporalAccumulation(uint3 currentCoord : SV_DispatchThreadID, float4 virtualLightingDistance; virtualLightingDistance.xyz = lerp(virtualHistory.xyz, lightingDistance.xyz, 1/(1 + Avirt)); virtualLightingDistance.w = lerp(virtualHistory.w, lightingDistance.w, 1/(1 + Ahitdist)); - + // Mix surface and virtual motion-based combined specular // signals into the final result. float4 currentResult = lerp(surfaceLightingDistance, virtualLightingDistance, amount); @@ -157,7 +157,6 @@ void TemporalAccumulation(uint3 currentCoord : SV_DispatchThreadID, float Acurr = 1.0 / a - 1.0; } - // Normalize the result _LightingDistanceTextureRW[COORD_TEXTURE2D_X(currentCoord.xy)] = surfaceLightingDistance; _AccumulationTextureRW[COORD_TEXTURE2D_X(currentCoord.xy)] = accumulationFactor; } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_TemporalStabilization.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_TemporalStabilization.compute index a1701a975b0..23d645840c1 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_TemporalStabilization.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_TemporalStabilization.compute @@ -168,7 +168,7 @@ void TemporalStabilization(uint3 dispatchThreadId : SV_DispatchThreadID, int gro // Compute the neighborhood index int nIndex = (x + 1) + (y + 1) * 3; nIndex = nIndex > 4 ? nIndex - 1 : nIndex; - + // If this is a background pixel or one that doesn't have SSR or is Unlit we can't use it if (gs_cacheDepth[tapLDSIndex] == UNITY_RAW_FAR_CLIP_VALUE || !gs_cacheValidity[tapLDSIndex] @@ -188,6 +188,17 @@ void TemporalStabilization(uint3 dispatchThreadId : SV_DispatchThreadID, int gro // Clip the history prevSignal = GetClippedHistory(nbSamples.central, prevSignal, nbSamples.minNeighbour, nbSamples.maxNeighbour); + // Variance neighbourhood clipping works great when the associated "color box" is relatively small. + // However, this is not necessarily the case for perfect mirrors: Neighbouring pixels in screen space + // may differ by an arbitrary amount, even with many ray tracing samples. This means that the color box + // can be huge and thus neighbourhood clipping will do nothing, not even if the overall input signal + // changes (UUM-103701). Therefore, mirrors cannot rely _only_ on neighbourhood clipping. + // We fix this by using a bit of the input signal proportional to how smooth the pixel is. + // This is only an imperfect heuristic and can theoretically increase temporal noise in extreme cases, + // but it is preferable to no updates at all. + const float maxRoughness = 0.06f; // Empirically chosen. + prevSignal = lerp(nbSamples.central, prevSignal, smoothstep(0.0f, maxRoughness, normalData.perceptualRoughness)); + // Move back to the output space prevSignal.xyz = ConvertToOutputSpace(prevSignal.xyz); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_Utilities.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_Utilities.hlsl index c0b76253edf..8da9e859e91 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_Utilities.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Denoising/ReBlur/ReBlur_Utilities.hlsl @@ -7,7 +7,7 @@ // Accumulation loop is done on 32 frames #define MAX_ACCUM_FRAME_NUM 32.0 -#define MIP_LEVEL_COUNT 4.0 +#define MIP_LEVEL_COUNT 4 #define MAX_FRAME_NUM_WITH_HISTORY_FIX 4.0 float2 RotateVector(float4 rotator, float2 v) @@ -73,7 +73,7 @@ float GetCombinedWeight(float2 geometryWeightParams, float3 Nv, float3 Xvs, floa #define SPECULAR_DOMINANT_DIRECTION_DEFAULT 2 float GetSpecularDominantFactor(float NoV, float linearRoughness) -{ +{ float a = 0.298475 * log( 39.4115 - 39.0029 * linearRoughness ); float dominantFactor = pow(saturate(1.0 - NoV), 10.8649 ) * ( 1.0 - a ) + a; return saturate(dominantFactor); @@ -105,7 +105,7 @@ float2x3 GetKernelBasis( float3 V, float3 N, float linearRoughness) float3 R = reflect( -V, N ); float3 D = normalize( lerp( N, R, f ) ); float NoD = abs( dot( N, D ) ); - + if( NoD < 0.999 && linearRoughness != 1.0 ) { float3 Dreflected = reflect( -D, N ); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingReflectionFilter.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingReflectionFilter.compute index e58704c7b06..75a25cda725 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingReflectionFilter.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingReflectionFilter.compute @@ -162,7 +162,7 @@ void ReflectionUpscale(uint3 dispatchThreadId : SV_DispatchThreadID, uint2 fullResolution = dispatchThreadId.xy; // Fetch the full resolution depth - float hiResDepth = Linear01Depth(LOAD_TEXTURE2D_X(_DepthTexture, fullResolution).x, _ZBufferParams); + float hiResDepth = Linear01Depth(LOAD_TEXTURE2D_X(_DepthTexture, fullResolution).x, _ZBufferParams); // If the full resolution depth is a background pixel, write the invalid data and we are done if (hiResDepth == 1.0) @@ -196,10 +196,10 @@ void ReflectionUpscale(uint3 dispatchThreadId : SV_DispatchThreadID, // Make sure the pixel has a valid signal weight *= gs_cacheValidity[tapHalfResLDSIndex] ? 1.0 : 0.0; - + // Add the contribution of the sample fallbackLighting += float4(gs_cacheLighting[tapHalfResLDSIndex], 0.0) * weight; - weightSum += weight; + weightSum += weight; } } From de296236699ba69c8c9e9d1130b48279181e3d16 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Tue, 14 Oct 2025 22:59:31 +0000 Subject: [PATCH 084/115] [VFX] Set the VFXParameter help url --- .../Editor/Models/Parameters/VFXParameter.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Models/Parameters/VFXParameter.cs b/Packages/com.unity.visualeffectgraph/Editor/Models/Parameters/VFXParameter.cs index 2d69bf24f38..89397b9f82a 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Models/Parameters/VFXParameter.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Models/Parameters/VFXParameter.cs @@ -1,9 +1,9 @@ using System; using System.Linq; using System.Collections.Generic; -using UnityEngine; using System.Collections.ObjectModel; -using UnityEditor.VFX.UI; + +using UnityEngine; using UnityEngine.Serialization; namespace UnityEditor.VFX @@ -15,6 +15,7 @@ enum VFXValueFilter Enum } + [VFXHelpURL("Properties")] [ExcludeFromPreset] class VFXParameter : VFXSlotContainerModel { From 6b3dbec299d35222c7f75028d1aa162b4964f4eb Mon Sep 17 00:00:00 2001 From: Josep Maria Pujol March Date: Tue, 14 Oct 2025 22:59:36 +0000 Subject: [PATCH 085/115] Removing legacy editor preprocessors in URP package --- .../Editor/Lighting/IESEngine.cs | 4 --- .../Editor/Lighting/IESImporter.cs | 4 --- .../Editor/Lighting/IESImporterEditor.cs | 4 --- ...splayWindow.EnvironmentLibrarySidePanel.cs | 25 +------------------ .../Editor/Material/MaterialHeaderScope.cs | 11 -------- .../Runtime/Debugging/ProfilingScope.cs | 2 -- .../RenderGraphResourceRegistry.cs | 2 -- .../RenderGraph/RenderGraphResourceTexture.cs | 6 ----- .../Runtime/Textures/RTHandle.cs | 3 --- .../Runtime/Utilities/CoreUtils.cs | 22 +++++++--------- .../Runtime/Volume/VolumeManager.cs | 2 +- 11 files changed, 11 insertions(+), 74 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESEngine.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESEngine.cs index a9ec2465957..e366e94d4c7 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESEngine.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESEngine.cs @@ -3,11 +3,7 @@ using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using UnityEditor; -#if UNITY_2020_2_OR_NEWER using UnityEditor.AssetImporters; -#else -using UnityEditor.Experimental.AssetImporters; -#endif using UnityEngine; namespace UnityEditor.Rendering diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESImporter.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESImporter.cs index 58584068af9..ded2eae98b7 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESImporter.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESImporter.cs @@ -1,11 +1,7 @@ using System.IO; using UnityEditor; using UnityEngine; -#if UNITY_2020_2_OR_NEWER using UnityEditor.AssetImporters; -#else -using UnityEditor.Experimental.AssetImporters; -#endif namespace UnityEditor.Rendering { diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESImporterEditor.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESImporterEditor.cs index fbe18f7ae2c..bec724fa8ab 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESImporterEditor.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/IESImporterEditor.cs @@ -1,10 +1,6 @@ using System.Reflection; using UnityEditor; -#if UNITY_2020_2_OR_NEWER using UnityEditor.AssetImporters; -#else -using UnityEditor.Experimental.AssetImporters; -#endif using UnityEngine; using UnityEngine.Rendering; diff --git a/Packages/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.EnvironmentLibrarySidePanel.cs b/Packages/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.EnvironmentLibrarySidePanel.cs index 20902c6fecb..dfe60e1f5be 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.EnvironmentLibrarySidePanel.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/LookDev/DisplayWindow.EnvironmentLibrarySidePanel.cs @@ -91,22 +91,10 @@ void CreateEnvironment() LookDev.currentContext.environmentLibrary[i], EnvironmentElement.k_SkyThumbnailWidth); }; -#if UNITY_2022_2_OR_NEWER - m_EnvironmentList.selectionChanged += objects => + m_EnvironmentList.selectionChanged += objects => { bool empty = !objects.GetEnumerator().MoveNext(); if (empty || (LookDev.currentContext.environmentLibrary?.Count ?? 0) == 0) -#elif UNITY_2020_1_OR_NEWER - m_EnvironmentList.onSelectionChange += objects => - { - bool empty = !objects.GetEnumerator().MoveNext(); - if (empty || (LookDev.currentContext.environmentLibrary?.Count ?? 0) == 0) -#else - m_EnvironmentList.onSelectionChanged += objects => - - { - if (objects.Count == 0 || (LookDev.currentContext.environmentLibrary?.Count ?? 0) == 0) -#endif { m_EnvironmentInspector.style.visibility = Visibility.Hidden; m_EnvironmentInspector.style.height = 0; @@ -127,22 +115,11 @@ void CreateEnvironment() m_EnvironmentInspector.Bind(environment, deportedLatLong); } }; -#if UNITY_2022_2_OR_NEWER m_EnvironmentList.itemsChosen += objCollection => { foreach (var obj in objCollection) EditorGUIUtility.PingObject(LookDev.currentContext.environmentLibrary ? [(int)obj]); }; -#elif UNITY_2020_1_OR_NEWER - m_EnvironmentList.onItemsChosen += objCollection => - { - foreach (var obj in objCollection) - EditorGUIUtility.PingObject(LookDev.currentContext.environmentLibrary ? [(int)obj]); - }; -#else - m_EnvironmentList.onItemChosen += obj => - EditorGUIUtility.PingObject(LookDev.currentContext.environmentLibrary?[(int)obj]); -#endif m_NoEnvironmentList = new Label(Style.k_DragAndDropLibrary); m_NoEnvironmentList.style.flexGrow = 1; m_NoEnvironmentList.style.unityTextAlign = TextAnchor.MiddleCenter; diff --git a/Packages/com.unity.render-pipelines.core/Editor/Material/MaterialHeaderScope.cs b/Packages/com.unity.render-pipelines.core/Editor/Material/MaterialHeaderScope.cs index a476c7c5a9b..ed9450d7c54 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Material/MaterialHeaderScope.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Material/MaterialHeaderScope.cs @@ -23,9 +23,6 @@ public struct MaterialHeaderScope : IDisposable /// Indicates whether the header is expanded or not. Is true if the header is expanded, false otherwise. public readonly bool expanded; bool spaceAtEnd; -#if !UNITY_2020_1_OR_NEWER - int oldIndentLevel; -#endif /// /// Creates a material header scope to display the foldout in the material UI. @@ -44,11 +41,6 @@ public MaterialHeaderScope(GUIContent title, uint bitExpanded, MaterialEditor ma bool beforeExpanded = materialEditor.IsAreaExpanded(bitExpanded, defaultExpandedState); -#if !UNITY_2020_1_OR_NEWER - oldIndentLevel = EditorGUI.indentLevel; - EditorGUI.indentLevel = subHeader ? 1 : 0; //fix for preset in 2019.3 (preset are one more indentation depth in material) -#endif - this.spaceAtEnd = spaceAtEnd; if (!subHeader) CoreEditorUtils.DrawSplitter(); @@ -85,9 +77,6 @@ void IDisposable.Dispose() if (expanded && spaceAtEnd && (Event.current.type == EventType.Repaint || Event.current.type == EventType.Layout)) EditorGUILayout.Space(); -#if !UNITY_2020_1_OR_NEWER - EditorGUI.indentLevel = oldIndentLevel; -#endif GUILayout.EndVertical(); } } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/ProfilingScope.cs b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/ProfilingScope.cs index 0ee475bbbc2..40338ccfe28 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/ProfilingScope.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/ProfilingScope.cs @@ -3,9 +3,7 @@ // So in the meantime we use a Dictionary with a perf hit... //#define USE_UNSAFE -#if UNITY_2020_1_OR_NEWER #define UNITY_USE_RECORDER -#endif using System; using System.Linq; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs index 4358957dbbf..f2cd92a260f 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs @@ -1060,13 +1060,11 @@ bool CreateTextureCallback(InternalRenderGraphContext rgContext, IRenderGraphRes { var resource = res as TextureResource; -#if UNITY_2020_2_OR_NEWER var fastMemDesc = resource.desc.fastMemoryDesc; if (fastMemDesc.inFastMemory) { resource.graphicsResource.SwitchToFastMemory(rgContext.cmd, fastMemDesc.residencyFraction, fastMemDesc.flags); } -#endif bool executedWork = false; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceTexture.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceTexture.cs index eca99c43982..408ac2fa8de 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceTexture.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceTexture.cs @@ -186,7 +186,6 @@ public enum TextureSizeMode Functor } -#if UNITY_2020_2_OR_NEWER /// /// Subset of the texture desc containing information for fast memory allocation (when platform supports it) /// @@ -199,7 +198,6 @@ public struct FastMemoryDesc ///How much of the render target is to be switched into fast memory (between 0 and 1). public float residencyFraction; } -#endif /// /// Descriptor used to create texture resources @@ -267,10 +265,8 @@ public struct TextureDesc ///Texture name. public string name; -#if UNITY_2020_2_OR_NEWER ///Descriptor to determine how the texture will be in fast memory on platform that supports it. public FastMemoryDesc fastMemoryDesc; -#endif ///Determines whether the texture will fallback to a black texture if it is read without ever writing to it. public bool fallBackToBlackTexture; /// @@ -492,9 +488,7 @@ public override int GetHashCode() hashCode.Append(bindTextureMS); hashCode.Append(useDynamicScale); hashCode.Append((int) msaaSamples); -#if UNITY_2020_2_OR_NEWER hashCode.Append(fastMemoryDesc.inFastMemory); -#endif hashCode.Append(enableShadingRate); return hashCode.value; } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Textures/RTHandle.cs b/Packages/com.unity.render-pipelines.core/Runtime/Textures/RTHandle.cs index 5fdaaba56d4..43039450c62 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Textures/RTHandle.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Textures/RTHandle.cs @@ -275,7 +275,6 @@ public Vector2Int GetScaledSize() } } -#if UNITY_2020_2_OR_NEWER /// /// Switch the render target to fast memory on platform that have it. /// @@ -317,7 +316,5 @@ public void SwitchOutFastMemory(CommandBuffer cmd, bool copyContents = true) { cmd.SwitchOutOfFastMemory(m_RT, copyContents); } - -#endif } } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Utilities/CoreUtils.cs b/Packages/com.unity.render-pipelines.core/Runtime/Utilities/CoreUtils.cs index b91c8634e83..134f3bd95b7 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Utilities/CoreUtils.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Utilities/CoreUtils.cs @@ -1369,7 +1369,7 @@ public static IEnumerable GetAllAssemblyTypes() /// A list of types that inherit from the provided type. public static IEnumerable GetAllTypesDerivedFrom() { -#if UNITY_EDITOR && UNITY_2019_2_OR_NEWER +#if UNITY_EDITOR return UnityEditor.TypeCache.GetTypesDerivedFrom(); #else var derivedTypes = new List(); @@ -1499,11 +1499,7 @@ public static bool AreAnimatedMaterialsEnabled(Camera camera) for (int i = 0; i < UnityEditor.SceneView.sceneViews.Count; i++) // Using a foreach on an ArrayList generates garbage ... { var sv = UnityEditor.SceneView.sceneViews[i] as UnityEditor.SceneView; -#if UNITY_2020_2_OR_NEWER if (sv.camera == camera && sv.sceneViewState.alwaysRefreshEnabled) -#else - if (sv.camera == camera && sv.sceneViewState.materialUpdateEnabled) -#endif { animateMaterials = true; break; @@ -1950,7 +1946,7 @@ public static DepthBits GetDefaultDepthBufferBits() return DepthBits.Depth32; #endif } - + #if UNITY_EDITOR /// /// Populates null fields or collection elements in a target object from a source object of the same type. @@ -1965,12 +1961,12 @@ public static DepthBits GetDefaultDepthBufferBits() /// The target object to populate with values from the source object. This cannot be null. /// /// - /// This method copies non-null field values or collection elements from the source object to the target object. - /// Both objects must be of the same type, and derived or base types are not allowed. Fields are updated only if they - /// are null in the target. If a field is a collection implementing `IList`, the method attempts to copy elements that + /// This method copies non-null field values or collection elements from the source object to the target object. + /// Both objects must be of the same type, and derived or base types are not allowed. Fields are updated only if they + /// are null in the target. If a field is a collection implementing `IList`, the method attempts to copy elements that /// are null in the target collection. /// - /// **Type restrictions**: + /// **Type restrictions**: /// - `T` must be a reference type. /// - `source` and `target` must be of the exact same type, not derived or base types. /// - Collections must implement `IList` and have the same length in both source and target for element-by-element copying. @@ -1983,7 +1979,7 @@ public static void PopulateNullFieldsFrom(T source, T target) if (target == null) throw new ArgumentNullException(nameof(target)); - + if (source.GetType() != typeof(T) || target.GetType() != typeof(T)) { throw new ArgumentException("Source and target must be of the exact same type. Derived or base types are not allowed."); @@ -2006,14 +2002,14 @@ public static void PopulateNullFieldsFrom(T source, T target) else { // Handle individual field population - if (targetValue == null) + if (targetValue == null) field.SetValue(target, sourceValue); // Copy if target is null } } // Generic method to populate arrays static void PopulateIListFields(ref object source, ref object target) { - if (source is not IList sourceCollection) + if (source is not IList sourceCollection) return; if (target is not IList targetCollection) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Volume/VolumeManager.cs b/Packages/com.unity.render-pipelines.core/Runtime/Volume/VolumeManager.cs index 6065a5698f6..cdb7b2d84a9 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Volume/VolumeManager.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Volume/VolumeManager.cs @@ -852,7 +852,7 @@ List GrabVolumes(LayerMask mask) static bool IsVolumeRenderedByCamera(Volume volume, Camera camera) { -#if UNITY_2018_3_OR_NEWER && UNITY_EDITOR +#if UNITY_EDITOR // GameObject for default global volume may not belong to any scene, following check prevents it from being culled if (!volume.cachedGameObject.scene.IsValid()) return true; From 314b6fc2ef97437e1a169f13c6981192c3e511c3 Mon Sep 17 00:00:00 2001 From: Adrien Moulin Date: Wed, 15 Oct 2025 09:39:43 +0000 Subject: [PATCH 086/115] [UUM-90498] - Graphics/SRP/RPF - Fix nearest filtering for Blitter.BlitOctahedralWithPadding/WithPaddingMultiply APIs --- .../Runtime/Utilities/Blit.hlsl | 7 ++++++ .../Runtime/Utilities/Blitter.cs | 6 +++-- .../Runtime/ShaderLibrary/Blit.shader | 25 +++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl b/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl index 9638e09dcf6..db396292df3 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl +++ b/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl @@ -128,6 +128,13 @@ float4 FragOctahedralBilinearRepeat(Varyings input) : SV_Target return SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, sampler_LinearRepeat, uv, _BlitMipLevel); } +float4 FragOctahedralNearestRepeat(Varyings input) : SV_Target +{ + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + float2 uv = RepeatOctahedralUV(input.texcoord.x, input.texcoord.y); + return SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, sampler_PointRepeat, uv, _BlitMipLevel); +} + float4 FragOctahedralProject(Varyings input) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs b/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs index 5962100a8b0..b25f67b2c69 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs @@ -91,6 +91,8 @@ enum BlitShaderPassNames BilinearQuadRed = 20, NearestCubeToOctahedralPadding = 21, BilinearCubeToOctahedralPadding = 22, + NearestQuadPaddingOctahedral = 23, + NearestQuadPaddingAlphaBlendOctahedral = 24 } enum BlitColorAndDepthPassNames @@ -1470,7 +1472,7 @@ public static void BlitOctahedralWithPadding(CommandBuffer cmd, Texture source, s_PropertyBlock.SetFloat(BlitShaderIDs._BlitMipLevel, mipLevelTex); s_PropertyBlock.SetVector(BlitShaderIDs._BlitTextureSize, textureSize); s_PropertyBlock.SetInt(BlitShaderIDs._BlitPaddingSize, paddingInPixels); - DrawQuad(cmd, GetBlitMaterial(source.dimension), s_BlitShaderPassIndicesMap[8]); + DrawQuad(cmd, GetBlitMaterial(source.dimension), s_BlitShaderPassIndicesMap[bilinear ? 8 : 23]); } /// @@ -1526,7 +1528,7 @@ public static void BlitOctahedralWithPaddingMultiply(CommandBuffer cmd, Texture s_PropertyBlock.SetFloat(BlitShaderIDs._BlitMipLevel, mipLevelTex); s_PropertyBlock.SetVector(BlitShaderIDs._BlitTextureSize, textureSize); s_PropertyBlock.SetInt(BlitShaderIDs._BlitPaddingSize, paddingInPixels); - DrawQuad(cmd, GetBlitMaterial(source.dimension), s_BlitShaderPassIndicesMap[13]); + DrawQuad(cmd, GetBlitMaterial(source.dimension), s_BlitShaderPassIndicesMap[bilinear ? 13 : 24]); } /// diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/Blit.shader b/Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/Blit.shader index 364073bf243..47912045006 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/Blit.shader +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/Blit.shader @@ -300,6 +300,31 @@ Shader "Hidden/HDRP/Blit" #pragma fragment FragOctahedralProjectBilinearRepeat ENDHLSL } + + // 23: Nearest quad with padding (for OctahedralTexture) + Pass + { + ZWrite Off ZTest Always Blend Off Cull Off + Name "NearestQuadPaddingOctahedral" + + HLSLPROGRAM + #pragma vertex VertQuadPadding + #pragma fragment FragOctahedralNearestRepeat + ENDHLSL + } + + // 24: Nearest quad with padding alpha blend (for OctahedralTexture) (23 with alpha blend) + Pass + { + ZWrite Off ZTest Always Blend DstColor Zero Cull Off + Name "NearestQuadPaddingAlphaBlendOctahedral" + + HLSLPROGRAM + #pragma vertex VertQuadPadding + #pragma fragment FragOctahedralNearestRepeat + #define WITH_ALPHA_BLEND + ENDHLSL + } } Fallback Off From c9f6b91c05c39072a9c418b5676458c517c46c57 Mon Sep 17 00:00:00 2001 From: Beini Gu Date: Wed, 15 Oct 2025 10:10:11 +0000 Subject: [PATCH 087/115] [PSO Tracing] Add new GraphicsStates with Mesh/Material pairs and render pass data --- .../GraphicsStateCollectionTest.unitypackage | 3 + ...phicsStateCollectionTest.unitypackage.meta | 7 ++ .../Editor/VFXGraphicsStateCollectionTest.cs | 98 +++++++++++++++++++ .../VFXGraphicsStateCollectionTest.cs.meta | 11 +++ 4 files changed, 119 insertions(+) create mode 100644 Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/GraphicsStateCollectionTest.unitypackage create mode 100644 Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/GraphicsStateCollectionTest.unitypackage.meta create mode 100644 Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXGraphicsStateCollectionTest.cs create mode 100644 Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXGraphicsStateCollectionTest.cs.meta diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/GraphicsStateCollectionTest.unitypackage b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/GraphicsStateCollectionTest.unitypackage new file mode 100644 index 00000000000..7bc50001deb --- /dev/null +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/GraphicsStateCollectionTest.unitypackage @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d0ff9603fc3914d56b6ec43e454ecfda6701ce51669032de7dd8f3e912c6173 +size 8965 diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/GraphicsStateCollectionTest.unitypackage.meta b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/GraphicsStateCollectionTest.unitypackage.meta new file mode 100644 index 00000000000..1a5c8195f5a --- /dev/null +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/GraphicsStateCollectionTest.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2a5f640ef001c4397ae210fc72726a5b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXGraphicsStateCollectionTest.cs b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXGraphicsStateCollectionTest.cs new file mode 100644 index 00000000000..7984d826064 --- /dev/null +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXGraphicsStateCollectionTest.cs @@ -0,0 +1,98 @@ +using System.Collections; +using System.Collections.Generic; +using Unity.Collections; +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; +using UnityEngine.VFX; +using NUnit.Framework; +using UnityEngine.TestTools; + +namespace UnityEditor.VFX.Test +{ + public class VFXGraphicsStateCollectionTest + { + [UnityTest] + public IEnumerator GraphicsStateCollection_IsFilled() + { + var packagePath = "Packages/com.unity.testing.visualeffectgraph/Tests/Editor/Data/GraphicsStateCollectionTest.unitypackage"; + AssetDatabase.ImportPackageImmediately(packagePath); + yield return null; + + + var gsc = new GraphicsStateCollection(); + + GraphicsStateCollection.GraphicsState graphicsState = GetValidGraphicsState(); + + var attachments = new NativeArray(graphicsState.attachments, Allocator.Temp); + var subPasses = new NativeArray(graphicsState.subPasses, Allocator.Temp); + + var vfxPath = VFXTestCommon.tempBasePath + "GraphicsStateCollection/PSOTest.vfx"; + var vfxAsset = AssetDatabase.LoadAssetAtPath(vfxPath); + Assert.IsNotNull(vfxAsset, $"Failed to load VisualEffectAsset at path: {vfxPath}"); + + // Test AddGraphicsStates + gsc.AddGraphicsStates(new[] { vfxAsset }, graphicsState.sampleCount, attachments, subPasses, graphicsState.subPassIndex, graphicsState.depthAttachmentIndex, graphicsState.shadingRateIndex); + List variants = new List(); + gsc.GetVariants(variants); + + // 3 outputs, each with 4 passes, with and without instancing (x2) = 24 variants + Assert.IsTrue(variants.Count == 24, $"Expected 24 variants in the GraphicsStateCollection, but got {variants.Count}."); + + foreach (var variant in variants) + { + List states = new List(); + gsc.GetGraphicsStatesForVariant(variant, states); + Assert.IsTrue(states.Count > 0, $"Expected at least one graphics state for variant {variant.shader?.name }"); + + foreach (var state in states) + { + Assert.AreEqual(1, state.attachments.Length, "Attachments length mismatch."); + Assert.AreEqual(1, state.subPasses.Length, "SubPasses length mismatch."); + } + } + gsc.ClearVariants(); + variants.Clear(); + + // Test AddGraphicsStatesFromReference + gsc.AddGraphicsStatesFromReference(graphicsState, new[] { vfxAsset }); + gsc.GetVariants(variants); + + // 3 outputs, each with 4 passes, with and without instancing (x2) = 24 variants + Assert.IsTrue(variants.Count == 24, $"Expected 24 variants in the GraphicsStateCollection, but got {variants.Count}."); + + foreach (var variant in variants) + { + List states = new List(); + gsc.GetGraphicsStatesForVariant(variant, states); + Assert.IsTrue(states.Count > 0, $"Expected at least one graphics state for variant {variant.shader?.name }"); + + foreach (var state in states) + { + Assert.AreEqual(1, state.attachments.Length, "Attachments length mismatch."); + Assert.AreEqual(1, state.subPasses.Length, "SubPasses length mismatch."); + } + } + + attachments.Dispose(); + subPasses.Dispose(); + } + + GraphicsStateCollection.GraphicsState GetValidGraphicsState() + { + GraphicsStateCollection.GraphicsState graphicsState = new GraphicsStateCollection.GraphicsState(); + + AttachmentDescriptor attachment = new AttachmentDescriptor(); + attachment.format = RenderTextureFormat.ARGB32; + attachment.storeAction = RenderBufferStoreAction.DontCare; + graphicsState.attachments = new[] { attachment }; + + SubPassDescriptor subPass = new SubPassDescriptor(); + subPass.colorOutputs = new AttachmentIndexArray(new int[] { 0 }); + subPass.flags = SubPassFlags.None; + graphicsState.subPasses = new[] { subPass }; + graphicsState.sampleCount = 1; + return graphicsState; + } + } +} diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXGraphicsStateCollectionTest.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXGraphicsStateCollectionTest.cs.meta new file mode 100644 index 00000000000..ab3029fabd2 --- /dev/null +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXGraphicsStateCollectionTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0355e294d462c474cadf9c78e3857b41 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 100 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 584a377fe238a07073ac647cecf006c62bf3ad1a Mon Sep 17 00:00:00 2001 From: Joe Scheinberg Date: Wed, 15 Oct 2025 23:14:15 +0000 Subject: [PATCH 088/115] [content automatically redacted] touching PlatformDependent folder --- .../Runtime/Lighting/ProbeVolume/ProbeVolumePerSceneData.cs | 1 + .../Runtime/UnifiedRayTracing/RayTracingResources.cs | 3 +-- .../Targets/CustomRenderTexture/CustomTextureSubTarget.cs | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumePerSceneData.cs b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumePerSceneData.cs index 6cc04a608ad..b063a3b8f32 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumePerSceneData.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumePerSceneData.cs @@ -4,6 +4,7 @@ #if UNITY_EDITOR using UnityEditor; +using UnityEngine; #endif namespace UnityEngine.Rendering diff --git a/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/RayTracingResources.cs b/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/RayTracingResources.cs index 6ada4735885..ca69731e84c 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/RayTracingResources.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/UnifiedRayTracing/RayTracingResources.cs @@ -8,8 +8,7 @@ namespace UnityEngine.Rendering.UnifiedRayTracing [Scripting.APIUpdating.MovedFrom( autoUpdateAPI: true, sourceNamespace: "UnityEngine.Rendering.UnifiedRayTracing", - sourceAssembly: "Unity.Rendering.LightTransport.Runtime", - sourceClassName: "RayTracingRenderPipelineResources" + sourceAssembly: "Unity.Rendering.LightTransport.Runtime" )] [Serializable] [SupportedOnRenderPipeline()] diff --git a/Packages/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs b/Packages/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs index 09f03ef082a..a7fd1b68503 100644 --- a/Packages/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs +++ b/Packages/com.unity.shadergraph/Editor/Generation/Targets/CustomRenderTexture/CustomTextureSubTarget.cs @@ -3,6 +3,7 @@ using UnityEditor; using UnityEditor.ShaderGraph; using UnityEditor.ShaderGraph.Legacy; +using UnityEngine; namespace UnityEditor.Rendering.CustomRenderTexture.ShaderGraph { From 6d1905132450c147351fe76fafd1680fb4c01018 Mon Sep 17 00:00:00 2001 From: Jannah Mekhaemar Date: Wed, 15 Oct 2025 23:14:19 +0000 Subject: [PATCH 089/115] [URP] Logged HDR Output events when changing to a RP asset with SDR rendering --- .../Runtime/UniversalRenderPipeline.cs | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs index d0e619a6b34..a41843de18f 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs @@ -2347,7 +2347,11 @@ internal static bool HDROutputForAnyDisplayIsActive() // We only want to enable HDR Output for the game view once // since the game itself might want to control this - internal bool enableHDROnce = true; + internal bool enableHDROutputOnce = true; + + // We only want to warn once when the render pipeline asset HDR rendering support changes + // and HDR output is active, which is incompatible at the render pipeline asset level. + internal bool warnedRuntimeSwitchHDROutputToSDROutput = false; /// /// Configures the render pipeline to render to HDR output or disables HDR output. @@ -2359,20 +2363,34 @@ void SetHDRState(Camera[] cameras) #endif { bool hdrOutputActive = HDROutputSettings.main.available && HDROutputSettings.main.active; + bool hdrOutputIncompatibleWithSDRRendering = hdrOutputActive && HDROutputSettings.main.displayColorGamut != ColorGamut.Rec709; // If the pipeline doesn't support HDR rendering, output to SDR. - bool supportsSwitchingHDR = SystemInfo.hdrDisplaySupportFlags.HasFlag(HDRDisplaySupportFlags.RuntimeSwitchable); - bool switchHDRToSDR = supportsSwitchingHDR && !asset.supportsHDR && hdrOutputActive; - if (switchHDRToSDR) + bool supportsSwitchingHDROutput = SystemInfo.hdrDisplaySupportFlags.HasFlag(HDRDisplaySupportFlags.RuntimeSwitchable); + bool switchHDROutputToSDROutput = !asset.supportsHDR && hdrOutputActive && hdrOutputIncompatibleWithSDRRendering; + if (switchHDROutputToSDROutput && !warnedRuntimeSwitchHDROutputToSDROutput) { - HDROutputSettings.main.RequestHDRModeChange(false); + if (supportsSwitchingHDROutput) + { + Debug.Log("HDR output is being disabled because the current Render Pipeline Asset does not support HDR rendering."); + HDROutputSettings.main.RequestHDRModeChange(false); + } + else + { + Debug.LogWarning("HDR output is active and cannot be switched off at runtime, but the current Render Pipeline Asset does not support HDR rendering. Image may appear underexposed or oversaturated."); + } + warnedRuntimeSwitchHDROutputToSDROutput = true; } + // Reset the warning flag as soon as the RP asset supports HDR rendering + if (warnedRuntimeSwitchHDROutputToSDROutput && asset.supportsHDR) + warnedRuntimeSwitchHDROutputToSDROutput = false; + #if UNITY_EDITOR bool requestedHDRModeChange = false; // Automatically switch to HDR in the editor if it's available - if (supportsSwitchingHDR && asset.supportsHDR && PlayerSettings.useHDRDisplay && HDROutputSettings.main.available) + if (supportsSwitchingHDROutput && asset.supportsHDR && PlayerSettings.useHDRDisplay && HDROutputSettings.main.available) { #if UNITY_2021_1_OR_NEWER int cameraCount = cameras.Count; @@ -2384,15 +2402,15 @@ void SetHDRState(Camera[] cameras) requestedHDRModeChange = hdrOutputActive; HDROutputSettings.main.RequestHDRModeChange(false); } - else if (enableHDROnce) + else if (enableHDROutputOnce) { requestedHDRModeChange = !hdrOutputActive; HDROutputSettings.main.RequestHDRModeChange(true); - enableHDROnce = false; + enableHDROutputOnce = false; } } - if (requestedHDRModeChange || switchHDRToSDR) + if (requestedHDRModeChange || switchHDROutputToSDROutput) { // Repaint scene views and game views so the HDR mode request is applied UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); From 596aea6a02ae6e3be3db53e3478a0da458fdffcb Mon Sep 17 00:00:00 2001 From: Lisha Li Date: Wed, 15 Oct 2025 23:14:25 +0000 Subject: [PATCH 090/115] UITK docs: Fixed a code error and formatting issues --- .../Documentation~/default-bitmap-text-node.md | 2 +- .../Documentation~/default-texture-node.md | 2 +- .../Documentation~/element-texture-uv-node.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Packages/com.unity.shadergraph/Documentation~/default-bitmap-text-node.md b/Packages/com.unity.shadergraph/Documentation~/default-bitmap-text-node.md index 32d7a504746..53ceaec084b 100644 --- a/Packages/com.unity.shadergraph/Documentation~/default-bitmap-text-node.md +++ b/Packages/com.unity.shadergraph/Documentation~/default-bitmap-text-node.md @@ -1,5 +1,5 @@ --- -uid: default-bitmap-text +uid: default-bitmap-text-node --- # Default Bitmap Text node diff --git a/Packages/com.unity.shadergraph/Documentation~/default-texture-node.md b/Packages/com.unity.shadergraph/Documentation~/default-texture-node.md index 4c4bf54e5c6..d4aea64caea 100644 --- a/Packages/com.unity.shadergraph/Documentation~/default-texture-node.md +++ b/Packages/com.unity.shadergraph/Documentation~/default-texture-node.md @@ -23,4 +23,4 @@ You can use this node to access the texture assigned to a UI element, such as a - [Default Solid node](xref:default-solid-node) - [Default Gradient node](xref:default-gradient-node) - [Default SDF Text node](xref:default-sdf-text-node) -- [Default Bitmap Text node](xref:default-bitmap-text) \ No newline at end of file +- [Default Bitmap Text node](xref:default-bitmap-text-node) \ No newline at end of file diff --git a/Packages/com.unity.shadergraph/Documentation~/element-texture-uv-node.md b/Packages/com.unity.shadergraph/Documentation~/element-texture-uv-node.md index 6fbae88b9db..85776dea3b3 100644 --- a/Packages/com.unity.shadergraph/Documentation~/element-texture-uv-node.md +++ b/Packages/com.unity.shadergraph/Documentation~/element-texture-uv-node.md @@ -12,7 +12,7 @@ This node might output different coordinates than the [**Element Layout UV**](xr If the texture is part of an atlas, its UV coordinates only map to a specific region within the atlas. If you repeat UV coordinates or sample outside them, the data comes from other textures in the atlas. Use texture coordinates (UV) when you need precise control over how a texture appears on a UI element, and be mindful of atlas constraints. -The texture UV can also originate from a custom mesh when you call [`MeshGenerationContext.DrawMesh`](xref:UnityEngine.UIElements.MeshGenerationContext.DrawMesh). In such cases, the UV values might vary depending on the mesh data. +The texture UV can also originate from a custom mesh when you call [`MeshGenerationContext.DrawMesh`](xref:UnityEngine.UIElements.MeshGenerationContext.DrawMesh(Unity.Collections.NativeSlice`1,Unity.Collections.NativeSlice`1,UnityEngine.Texture)). In such cases, the UV values might vary depending on the mesh data. ## Ports From a187b19395a756726f8c55d030e1514526962b13 Mon Sep 17 00:00:00 2001 From: Paul Demeulenaere Date: Wed, 15 Oct 2025 23:14:34 +0000 Subject: [PATCH 091/115] [VFX] Fix Instability Check_Additional_Doesnt_Generate_Any_Errors --- .../VFX/MultiStripsPeriodicBurst.vfx | 4 ++-- .../Tests/Editor/VFXAdditionalPackageTest.cs | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Samples~/VFXLearningTemplates/VFX/MultiStripsPeriodicBurst.vfx b/Packages/com.unity.visualeffectgraph/Samples~/VFXLearningTemplates/VFX/MultiStripsPeriodicBurst.vfx index 2a075f268d5..247c2e17736 100644 --- a/Packages/com.unity.visualeffectgraph/Samples~/VFXLearningTemplates/VFX/MultiStripsPeriodicBurst.vfx +++ b/Packages/com.unity.visualeffectgraph/Samples~/VFXLearningTemplates/VFX/MultiStripsPeriodicBurst.vfx @@ -809,7 +809,7 @@ MonoBehaviour: m_Type: m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"center":{"x":0.6039242148399353,"y":0.0,"z":0.0},"size":{"x":1.0,"y":1.0,"z":1.0}}' + m_SerializableObject: '{"center":{"x":0.0,"y":2.0,"z":0.0},"size":{"x":5.0,"y":5.0,"z":3.0}}' m_Space: 0 m_Property: name: bounds @@ -1253,7 +1253,7 @@ MonoBehaviour: stripCapacity: 20 particlePerStripCount: 50 needsComputeBounds: 0 - boundsMode: 0 + boundsMode: 1 m_Space: 0 --- !u!114 &8926484042661614893 MonoBehaviour: diff --git a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXAdditionalPackageTest.cs b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXAdditionalPackageTest.cs index a15dea02348..60cb9400ede 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXAdditionalPackageTest.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.visualeffectgraph/Tests/Editor/VFXAdditionalPackageTest.cs @@ -19,10 +19,9 @@ public class VFXAdditionalPackageTest private static readonly string kSampleExpectedPath = "Assets/Samples"; [SerializeField] - private static string m_CurrentMatch; + private string m_CurrentMatch; [UnityTest, Timeout(10 * 60 * 1000)] - [UnityPlatform(exclude = new RuntimePlatform[] { RuntimePlatform.WindowsEditor })] // Unstable: https://jira.unity3d.com/browse/UUM-117433 public IEnumerator Check_Additional_Doesnt_Generate_Any_Errors([ValueSource(nameof(kAdditionalSampleMatches))] string expectedMatch) { m_CurrentMatch = expectedMatch; @@ -79,11 +78,11 @@ public IEnumerator Check_Additional_Doesnt_Generate_Any_Errors([ValueSource(name { var dataParticle = initialize.GetData() as VFXDataParticle; Assert.IsNotNull(dataParticle); - Assert.AreEqual(BoundsSettingMode.Manual, dataParticle.boundsMode); + Assert.AreEqual(BoundsSettingMode.Manual, dataParticle.boundsMode, "Failure at " + path); } - Assert.IsTrue(graph.children.OfType().Any()); - Assert.IsTrue(graph.UIInfos.stickyNoteInfos.Length > 0); + Assert.IsTrue(graph.children.OfType().Any(), "Failure at " + path); + Assert.IsTrue(graph.UIInfos.stickyNoteInfos.Length > 0, "Failure at " + path); } } m_CurrentMatch = null; From 0e8456ce6cbe7bbb78bc54341c6458c3bacd80a4 Mon Sep 17 00:00:00 2001 From: Toshiyuki Mori Date: Thu, 16 Oct 2025 12:19:09 +0000 Subject: [PATCH 092/115] fix: DANB-1079 Accurate SRP Batcher compatibility update when GPU Skinning mode changes in 2D skinned sprites --- .../Assets/Scenes/082_2D_GPUSkinning/SRPBatcherToggle.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/082_2D_GPUSkinning/SRPBatcherToggle.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/082_2D_GPUSkinning/SRPBatcherToggle.cs index 7e2406a92e7..61f6be95032 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/082_2D_GPUSkinning/SRPBatcherToggle.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/082_2D_GPUSkinning/SRPBatcherToggle.cs @@ -15,6 +15,7 @@ void OnEnable() Debug.LogFormat("OnEnable {0}", universalAsset.useSRPBatcher); useScriptableRenderPipelineBatching = universalAsset.useSRPBatcher; universalAsset.useSRPBatcher = useSRPBatcher; + GraphicsSettings.useScriptableRenderPipelineBatching = useSRPBatcher; } private void Update() @@ -27,6 +28,7 @@ void OnDisable() { var universalAsset = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; universalAsset.useSRPBatcher = useScriptableRenderPipelineBatching; + GraphicsSettings.useScriptableRenderPipelineBatching = useScriptableRenderPipelineBatching; Debug.LogFormat("OnDisable {0}", universalAsset.useSRPBatcher); } } From 3abfde3604d60233c64eaeba96fd77812b6dd532 Mon Sep 17 00:00:00 2001 From: Kirill Titov Date: Fri, 17 Oct 2025 00:08:50 +0000 Subject: [PATCH 093/115] URP Compatibility mode removal --- .../RenderPipeline/HDRenderPipelineAsset.cs | 9 - .../Runtime/ShaderConfig.cs | 3 +- .../BuildProcessors/URPBuildDataValidator.cs | 45 - .../Editor/Overrides/BloomEditor.cs | 8 +- .../NewPostProcessRendererFeature.cs.txt | 57 - .../URPRenderGraphPropertyDrawer.cs | 67 - .../URPRenderGraphPropertyDrawer.cs.meta | 2 - .../Editor/ShaderScriptableStripper.cs | 18 +- .../UniversalRenderPipelineAssetUI.Drawers.cs | 11 - .../Editor/UniversalRendererDataEditor.cs | 26 +- .../Runtime/2D/Light2DBlendStyle.cs | 8 - .../Runtime/2D/Passes/IRenderPass2D.cs | 9 - .../Runtime/2D/Passes/IRenderPass2D.cs.meta | 3 - .../2D/Passes/PixelPerfectBackgroundPass.cs | 36 - .../Passes/PixelPerfectBackgroundPass.cs.meta | 11 - .../Runtime/2D/Passes/Render2DLightingPass.cs | 456 ---- .../2D/Passes/Render2DLightingPass.cs.meta | 11 - .../Runtime/2D/Passes/Utility/LayerUtility.cs | 44 - .../2D/Passes/Utility/RendererLighting.cs | 412 ---- .../Runtime/2D/Renderer2D.cs | 428 ---- .../Runtime/2D/Renderer2D.cs.meta | 2 - .../Runtime/2D/Renderer2DData.cs | 13 - .../Rendergraph/CopyCameraSortingLayerPass.cs | 8 - .../Runtime/2D/Rendergraph/DrawLight2DPass.cs | 7 - .../2D/Rendergraph/DrawNormal2DPass.cs | 8 - .../2D/Rendergraph/DrawRenderer2DPass.cs | 8 - .../2D/Rendergraph/DrawShadow2DPass.cs | 8 - .../2D/Rendergraph/Renderer2DRendergraph.cs | 11 - .../Runtime/2D/Rendergraph/UpscalePass.cs | 11 - .../Runtime/2D/Shadows/ShadowRendering.cs | 92 +- .../Data/UniversalRenderPipelineAsset.cs | 46 - .../Runtime/Debug/DebugHandler.cs | 31 - .../Runtime/Debug/DebugRenderSetup.cs | 11 - .../Decal/DBuffer/DBufferRenderPass.cs | 134 -- .../Decal/DBuffer/DecalForwardEmissivePass.cs | 28 - .../Runtime/Decal/DecalPreviewPass.cs | 28 - .../ScreenSpace/DecalGBufferRenderPass.cs | 89 - .../ScreenSpace/DecalScreenSpaceRenderPass.cs | 27 - .../Runtime/Deprecated.cs | 594 +---- .../Runtime/ForwardLights.cs | 17 - .../Runtime/FrameData/UniversalCameraData.cs | 63 - .../FrameData/UniversalRenderingData.cs | 21 - .../Runtime/NativeRenderPass.cs | 708 ------ .../Runtime/NativeRenderPass.cs.meta | 3 - .../AdditionalLightsShadowCasterPass.cs | 113 +- .../Runtime/Passes/CapturePass.cs | 25 +- .../Runtime/Passes/ColorGradingLutPass.cs | 47 +- .../Runtime/Passes/CopyColorPass.cs | 51 - .../Runtime/Passes/CopyDepthPass.cs | 86 +- .../Runtime/Passes/DeferredPass.cs | 36 - .../Runtime/Passes/DepthNormalOnlyPass.cs | 84 +- .../Runtime/Passes/DepthOnlyPass.cs | 63 +- .../Runtime/Passes/DrawObjectsPass.cs | 150 +- .../Runtime/Passes/DrawScreenSpaceUIPass.cs | 65 +- .../Runtime/Passes/DrawSkyboxPass.cs | 50 - .../Runtime/Passes/FinalBlitPass.cs | 130 -- .../Runtime/Passes/GBufferPass.cs | 119 +- .../Runtime/Passes/HDRDebugViewPass.cs | 84 +- .../InvokeOnRenderObjectCallbackPass.cs | 16 - .../Passes/MainLightShadowCasterPass.cs | 104 +- .../Runtime/Passes/MotionVectorRenderPass.cs | 80 +- .../Runtime/Passes/PostProcessPass.cs | 1982 ----------------- .../Runtime/Passes/PostProcessPass.cs.meta | 11 - .../Runtime/Passes/ProbeVolumeDebugPass.cs | 36 +- .../Runtime/Passes/RenderObjectsPass.cs | 56 +- .../Passes/ScreenSpaceAmbientOcclusionPass.cs | 206 -- .../Runtime/Passes/ScriptableRenderPass.cs | 519 +---- .../Runtime/Passes/TransparentSettingsPass.cs | 12 - .../Runtime/Passes/XROcclusionMeshPass.cs | 29 - .../Runtime/PostProcessPasses.cs | 136 -- .../Runtime/PostProcessPasses.cs.meta | 11 - .../Runtime/RenderGraph.meta | 8 - .../RenderGraphGraphicsAutomatedTests.cs | 32 - .../RenderGraphGraphicsAutomatedTests.cs.meta | 11 - .../Renderer2DResources.cs | 12 - .../RendererFeatures/DecalRendererFeature.cs | 53 - .../FullScreenPassRendererFeature.cs | 64 - .../OnTilePostProcessFeature.cs | 2 +- .../Runtime/RendererFeatures/RenderObjects.cs | 7 - .../RendererFeatures/ScreenSpaceShadows.cs | 106 +- .../Runtime/RenderingUtils.cs | 371 +-- .../Runtime/ScriptableRenderer.cs | 1166 +--------- .../Runtime/ScriptableRendererFeature.cs | 20 - .../Runtime/Settings/RenderGraphSettings.cs | 59 +- .../Runtime/ShadowUtils.cs | 15 +- .../Runtime/UniversalRenderPipeline.cs | 67 +- .../Runtime/UniversalRenderPipelineCore.cs | 58 - .../UniversalRenderPipelineGlobalSettings.cs | 13 - .../Runtime/UniversalRenderer.cs | 1370 +----------- .../BlitToRTHandle/BlitToRTHandlePass.cs | 39 - .../DepthBlit/DepthBlitCopyDepthPass.cs | 46 - .../DepthBlit/DepthBlitDepthOnlyPass.cs | 41 - .../DepthBlit/DepthBlitEdgePass.cs | 29 - .../DistortTunnelPass_CopyColor.cs | 34 - .../DistortTunnelPass_Distort.cs | 33 - .../DistortTunnel/DistortTunnelPass_Tunnel.cs | 35 - .../KeepFrame/KeepFrameFeature.cs | 53 - .../Tests/Editor/NativeRenderPassTests.cs | 130 -- .../Editor/NativeRenderPassTests.cs.meta | 2 - .../Tests/Editor/RenderPassCullingTests.cs | 9 - .../RenderTextureDescriptorDimensionsTests.cs | 21 - .../RenderGraphSettingsMigrationTest.cs | 76 - .../RenderGraphSettingsMigrationTest.cs.meta | 2 - .../Editor/CompatibilityModeInitializer.cs | 46 - .../CompatibilityModeInitializer.cs.meta | 3 - .../CustomRenderPipeline/CustomRenderer.cs | 44 - .../DrawRenderingLayersFeature.cs | 26 - .../Scripts/Runtime/OutputTextureFeature.cs | 31 - .../Scripts/Runtime/SetInputRequirements.cs | 12 - .../Runtime/UniversalGraphicsTestBase.cs | 16 - .../Scripts/ShaderGraphGraphicsTests.cs | 3 +- .../AfterOpaqueCustomRendering.cs | 60 - .../AfterOpaqueCustomRendering.cs.meta | 2 - .../InstancedRenderingTest.cs | 2 - .../TestbedAssets/SRP/LWNoBatching.asset | 85 +- .../TestbedAssets/SRP/LightweightAsset.asset | 85 +- .../Assets/Test/Runtime/Renderer2DTests.cs | 6 - .../CopyDepthPrepassFeature.cs | 36 +- .../CaptureMotionVectorsPass.cs | 16 - .../NormalReconstructionTestFeature.cs | 15 - .../280_HistoryVisualizerRendererFeature.cs | 59 +- .../Scenes/300_RandomUAV/RandomUAVFeature.cs | 8 - .../SwapbufferBlitFeature.cs | 27 - .../325_DepthCopy/CaptureDepthFeature.cs | 48 - .../URPGlobalSettingsStrippingTests.cs | 1 - ...red_GBuffer_Visualization_RenderFeature.cs | 73 - .../ScreenCoordOverrideRenderPass.cs | 21 - .../CaptureMotionVectorsPass.cs | 16 - .../Scripts/OutputTextureFeature.cs | 25 - 129 files changed, 303 insertions(+), 12380 deletions(-) delete mode 100644 Packages/com.unity.render-pipelines.universal/Editor/Settings/PropertyDrawers/URPRenderGraphPropertyDrawer.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Editor/Settings/PropertyDrawers/URPRenderGraphPropertyDrawer.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/IRenderPass2D.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/IRenderPass2D.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/PixelPerfectBackgroundPass.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/PixelPerfectBackgroundPass.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/PostProcessPasses.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/PostProcessPasses.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph/RenderGraphGraphicsAutomatedTests.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph/RenderGraphGraphicsAutomatedTests.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Tests/Editor/NativeRenderPassTests.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Tests/Editor/NativeRenderPassTests.cs.meta delete mode 100644 Packages/com.unity.render-pipelines.universal/Tests/Editor/URPGlobalSettingsMigrationTests/RenderGraphSettingsMigrationTest.cs delete mode 100644 Packages/com.unity.render-pipelines.universal/Tests/Editor/URPGlobalSettingsMigrationTests/RenderGraphSettingsMigrationTest.cs.meta delete mode 100644 Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Editor/CompatibilityModeInitializer.cs delete mode 100644 Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Editor/CompatibilityModeInitializer.cs.meta delete mode 100644 Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/AfterOpaqueCustomRendering.cs delete mode 100644 Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/AfterOpaqueCustomRendering.cs.meta diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineAsset.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineAsset.cs index 27c01bfbd55..ce172169257 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineAsset.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipelineAsset.cs @@ -200,15 +200,6 @@ public override string[] prefixedRenderingLayerMaskNames [SerializeField] internal VirtualTexturingSettingsSRP virtualTexturingSettings = new VirtualTexturingSettingsSRP(); - - [SerializeField] private bool m_UseRenderGraph = true; - - internal bool useRenderGraph - { - get => m_UseRenderGraph; - set => m_UseRenderGraph = value; - } - /// public bool isImmediateModeSupported => false; diff --git a/Packages/com.unity.render-pipelines.universal-config/Runtime/ShaderConfig.cs b/Packages/com.unity.render-pipelines.universal-config/Runtime/ShaderConfig.cs index 9ef5e375b4e..92bbf1e5e53 100644 --- a/Packages/com.unity.render-pipelines.universal-config/Runtime/ShaderConfig.cs +++ b/Packages/com.unity.render-pipelines.universal-config/Runtime/ShaderConfig.cs @@ -1,7 +1,6 @@ //----------------------------------------------------------------------------- // Configuration //----------------------------------------------------------------------------- -using System; namespace UnityEngine.Rendering.Universal { @@ -25,5 +24,5 @@ public static class ShaderOptions /// Switch fog keywords (FOG_LINEAR, FOG_EXP and FOG_EXP2) to dynamic branching. /// For more information on dynamic branches, refer to [Shader Branching](https://docs.unity3d.com/Manual/shader-branching.html). public const int k_UseDynamicBranchFogKeyword = 0; - }; + } } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/BuildProcessors/URPBuildDataValidator.cs b/Packages/com.unity.render-pipelines.universal/Editor/BuildProcessors/URPBuildDataValidator.cs index e2a86dc3a20..0e661c23705 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/BuildProcessors/URPBuildDataValidator.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/BuildProcessors/URPBuildDataValidator.cs @@ -51,48 +51,6 @@ private static void ValidateRenderPipelineGlobalSettings(UniversalRenderPipeline } } } - -#if !URP_COMPATIBILITY_MODE - private static void ValidateCompatibilityMode(UniversalRenderPipelineGlobalSettings globalSettingsInstance, StringBuilder failures) - { - if (globalSettingsInstance == null) - return; //error already covered in ValidateRenderPipelineGlobalSettings - - if (!GraphicsSettings.TryGetRenderPipelineSettings(out var settings)) - { - failures.AppendLine($"- The {nameof(RenderGraphSettings)} of the project are missing. Is the {nameof(UniversalRenderPipelineGlobalSettings)} missing?"); - return; - } - - if (settings.GetSerializedCompatibilityModeForBuildCheck()) - { - failures.AppendLine($"- Compatibility Mode is enabled in Project Settings, but this feature is deprecated from Unity 6.0, and the setting is hidden in Unity 6.3. To enable Compatibility Mode, go to Edit > Project Settings > Player and add URP_COMPATIBILITY_MODE to the Scripting Define Symbols."); - - //It can be complicated to fix it manually: - // - Add the URP_COMPATIBILITY_MODE define - // - Change back the checkbox to false in Project Settings > Graphics - // - Remove the URP_COMPATIBILITY_MODE define - //So this helpbox propose to fix it for user wanting to adopt Render Graph - EditorApplication.delayCall += () => { - EditorApplication.delayCall += () => - { - int answear = EditorUtility.DisplayDialogComplex("Universal Render Pipeline's Compatibility Mode", - "Unity can't build your project because Compatibility Mode (Render Graph disabled) is active. This feature is deprecated.\n\n" + - "Select \"Use Render Graph\" (Recommended) to update Project Settings. You may need to update scripts and assets.\n\n" + - "Select \"Keep Compatibility Mode\" to add URP_COMPATIBILITY_MODE to Player Settings for this build target. Warning: Compatibility Mode will be removed in a future release.", - "Use Render Graph", - "Cancel", - "Keep Compatibility Mode"); - switch (answear) - { - case 0: settings.SetCompatibilityModeFromUpgrade(false); break; - case 2: settings.AddCompatibilityModeDefineForCurrentPlateform(); break; - }; - }; - }; - } - } -#endif public static bool IsProjectValidForBuilding(BuildReport report, out string message) { @@ -103,9 +61,6 @@ public static bool IsProjectValidForBuilding(BuildReport report, out string mess ValidateRenderPipelineAssetsAreAtLastVersion(URPBuildData.instance.renderPipelineAssets, failures); ValidateRenderPipelineGlobalSettings(UniversalRenderPipelineGlobalSettings.Ensure(), failures); ValidateDynamicBatchingSettings(URPBuildData.instance.renderPipelineAssets); -#if !URP_COMPATIBILITY_MODE - ValidateCompatibilityMode(UniversalRenderPipelineGlobalSettings.Ensure(), failures); -#endif string allFailures = failures.ToString(); diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Overrides/BloomEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/Overrides/BloomEditor.cs index e59ce7c5c17..c974aad91a1 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Overrides/BloomEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Overrides/BloomEditor.cs @@ -44,13 +44,7 @@ public override void OnInspectorGUI() PropertyField(m_Tint); PropertyField(m_Clamp); PropertyField(m_HighQualityFiltering); - -#if URP_COMPATIBILITY_MODE - // Filter is RG only. Comp.Mode. will use Gaussian. - if(!GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode) -#endif - PropertyField(m_Filter); - + PropertyField(m_Filter); PropertyField(m_Downsample); PropertyField(m_MaxIterations); PropertyField(m_DirtTexture); diff --git a/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessRendererFeature.cs.txt b/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessRendererFeature.cs.txt index e345d830186..427893244d7 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessRendererFeature.cs.txt +++ b/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessRendererFeature.cs.txt @@ -158,63 +158,6 @@ public sealed class #FEATURE_TYPE# : ScriptableRendererFeature #region PASS_NON_RENDER_GRAPH_PATH -#if URP_COMPATIBILITY_MODE - // Override the OnCameraSetup method to configure render targets and their clear states, and create temporary render target textures. - // Unity calls this method before executing the render pass. - // This method is used only in the Compatibility Mode path. - // Use ConfigureTarget or ConfigureClear in this method. Don't use CommandBuffer.SetRenderTarget. - [System.Obsolete("This rendering path works in Compatibility Mode only, which is deprecated. Use the render graph API instead.")] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - // Reset the render target to default. - ResetTarget(); - - // Allocate a temporary texture, and reallocate it if there's a change to camera settings, for example resolution. - if (kSampleActiveColor) - RenderingUtils.ReAllocateHandleIfNeeded(ref m_CopiedColor, GetCopyPassTextureDescriptor(renderingData.cameraData.cameraTargetDescriptor), name: "_CustomPostPassCopyColor"); - } - - // Override the Execute method to implement the rendering logic. Use ScriptableRenderContext to issue drawing commands or execute command buffers. - // You don't need to call ScriptableRenderContext.Submit. - // This method is used only in the Compatibility Mode path. - [System.Obsolete("This rendering path works in Compatibility Mode only, which is deprecated. Use the render graph API instead.")] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - - // Get the camera data and command buffer. - ref var cameraData = ref renderingData.cameraData; - var cmd = CommandBufferPool.Get(); - - // Add a profiling sampler. - using (new ProfilingScope(cmd, profilingSampler)) - { - // Create a command buffer to execute the render pass. - RasterCommandBuffer rasterCmd = CommandBufferHelpers.GetRasterCommandBuffer(cmd); - if (kSampleActiveColor) - { - CoreUtils.SetRenderTarget(cmd, m_CopiedColor); - ExecuteCopyColorPass(rasterCmd, cameraData.renderer.cameraColorTargetHandle); - } - - // Set the render target based on the depth-stencil attachment. - if(kBindDepthStencilAttachment) - CoreUtils.SetRenderTarget(cmd, cameraData.renderer.cameraColorTargetHandle, cameraData.renderer.cameraDepthTargetHandle); - else - CoreUtils.SetRenderTarget(cmd, cameraData.renderer.cameraColorTargetHandle); - - // Execute the main render pass. - ExecuteMainPass(rasterCmd, kSampleActiveColor ? m_CopiedColor : null, m_Material); - } - - // Execute the command buffer. - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - // Release the command buffer. - CommandBufferPool.Release(cmd); - } -#endif - // Free the resources the camera uses. // This method is used only in the Compatibility Mode path. public override void OnCameraCleanup(CommandBuffer cmd) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Settings/PropertyDrawers/URPRenderGraphPropertyDrawer.cs b/Packages/com.unity.render-pipelines.universal/Editor/Settings/PropertyDrawers/URPRenderGraphPropertyDrawer.cs deleted file mode 100644 index e70fdbde4de..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Editor/Settings/PropertyDrawers/URPRenderGraphPropertyDrawer.cs +++ /dev/null @@ -1,67 +0,0 @@ -#if URP_COMPATIBILITY_MODE -using UnityEditor.UIElements; -using UnityEngine.Rendering; -#endif -using UnityEngine.Rendering.Universal; -using UnityEngine.UIElements; - -namespace UnityEditor.Rendering.Universal -{ - [CustomPropertyDrawer(typeof(RenderGraphSettings))] - class RenderGraphPropertyDrawer : PropertyDrawer - { - VisualElement m_Root; - -#if URP_COMPATIBILITY_MODE - private const string k_EnableRenderCompatibilityPropertyName = "m_EnableRenderCompatibilityMode"; - private const string k_EnableRenderCompatibilityModeLabel = "Compatibility Mode (Render Graph Disabled)"; - private const string k_EnableRenderCompatibilityModeHelpBoxLabel = "Unity no longer develops or improves the rendering path that does not use Render Graph API. Use the Render Graph API when developing new graphics features."; - - bool m_EnableCompatibilityModeValue; -#endif - - /// - public override VisualElement CreatePropertyGUI(SerializedProperty property) - { - m_Root = new VisualElement(); - - m_Root.Add(new HelpBox() - { - messageType = HelpBoxMessageType.Info, - text = -#if URP_COMPATIBILITY_MODE - "Compatibility Mode (Render Graph disabled) is currently available because URP_COMPATIBILITY_MODE is defined in Player Settings. This feature is deprecated and will be removed in a future version. It is recommended to remove this define, as it can improve compilation time and reduce the build size." -#else - "Compatibility Mode (Render Graph disabled) is deprecated from Unity 6.0, and the setting is hidden in Unity 6.3. Unity strips Compatibility Mode code to improve compilation time and reduce the build size. To enable Compatibility Mode, go to Edit > Project Settings > Player and add URP_COMPATIBILITY_MODE to the Scripting Define Symbols. This isn't recommended or supported." -#endif - }); - -#if URP_COMPATIBILITY_MODE - var enableCompatilityModeProp = property.FindPropertyRelative(k_EnableRenderCompatibilityPropertyName); - var enableCompatibilityMode = new PropertyField(enableCompatilityModeProp, k_EnableRenderCompatibilityModeLabel); - - // UITK raises ValueChangeCallback at various times, so we need to track the actual value - m_EnableCompatibilityModeValue = enableCompatilityModeProp.boolValue; - - m_Root.Add(enableCompatibilityMode); - enableCompatibilityMode.RegisterValueChangeCallback((onchanged) => - { - m_Root.Q("HelpBoxWarning").style.display = (onchanged.changedProperty.boolValue) ? DisplayStyle.Flex : DisplayStyle.None; - - bool newValue = onchanged.changedProperty.boolValue; - if (m_EnableCompatibilityModeValue != newValue) - { - m_EnableCompatibilityModeValue = newValue; - GraphicsSettings.GetRenderPipelineSettings()?.NotifyValueChanged(onchanged.changedProperty.name); - } - }); - - m_Root.Add(new HelpBox(k_EnableRenderCompatibilityModeHelpBoxLabel, HelpBoxMessageType.Warning) - { - name = "HelpBoxWarning" - }); -#endif - return m_Root; - } - } -} diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Settings/PropertyDrawers/URPRenderGraphPropertyDrawer.cs.meta b/Packages/com.unity.render-pipelines.universal/Editor/Settings/PropertyDrawers/URPRenderGraphPropertyDrawer.cs.meta deleted file mode 100644 index 6a83d2e6a85..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Editor/Settings/PropertyDrawers/URPRenderGraphPropertyDrawer.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 4c646c9863237f14c9fa7fdec7d26961 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ShaderScriptableStripper.cs b/Packages/com.unity.render-pipelines.universal/Editor/ShaderScriptableStripper.cs index 0c69260274c..9f02ae5723a 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ShaderScriptableStripper.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/ShaderScriptableStripper.cs @@ -42,7 +42,6 @@ internal interface IShaderScriptableStrippingData public bool IsHDRDisplaySupportEnabled { get; set; } public bool IsHDRShaderVariantValid { get; set; } - public bool IsRenderCompatibilityMode { get; set; } public bool IsShaderFeatureEnabled(ShaderFeatures feature); @@ -80,7 +79,6 @@ internal struct StrippingData : IShaderScriptableStrippingData public PassIdentifier passIdentifier { get => passData.pass; set {} } public bool IsHDRDisplaySupportEnabled { get; set; } public bool IsHDRShaderVariantValid { get => HDROutputUtils.IsShaderVariantValid(variantData.shaderKeywordSet, PlayerSettings.allowHDRDisplaySupport); set { } } - public bool IsRenderCompatibilityMode { get; set; } public bool IsKeywordEnabled(LocalKeyword keyword) { @@ -813,16 +811,12 @@ internal bool StripUnusedFeatures_CrossFadeLod(ref IShaderScriptableStrippingDat if (strippingData.IsKeywordEnabled(m_Instancing) || strippingData.IsKeywordEnabled(m_DotsInstancing)|| strippingData.IsKeywordEnabled(m_ProceduralInstancing)) return false; // Currently we don't support stencil-based fade with GPU instancing. - // native render pass is not supported for now. - if (strippingData.IsRenderCompatibilityMode) - return false; - // We can't strip the variations of the passes which may not have stencils. // Stencil's availability in motion vector pass depends on platforms + graphics API. - return (strippingData.passType != PassType.ShadowCaster) && (strippingData.passType != PassType.MotionVectors); + return strippingData.passType != PassType.ShadowCaster && strippingData.passType != PassType.MotionVectors; } - else - return !strippingData.IsShaderFeatureEnabled(ShaderFeatures.LODCrossFade); + + return !strippingData.IsShaderFeatureEnabled(ShaderFeatures.LODCrossFade); } internal bool StripUnusedFeatures(ref IShaderScriptableStrippingData strippingData) @@ -1237,12 +1231,6 @@ public bool CanRemoveVariant([DisallowNull] Shader shader, ShaderSnippetData pas stripUnusedPostProcessingVariants = ShaderBuildPreprocessor.s_StripUnusedPostProcessingVariants, stripUnusedXRVariants = ShaderBuildPreprocessor.s_StripXRVariants, IsHDRDisplaySupportEnabled = PlayerSettings.allowHDRDisplaySupport, - IsRenderCompatibilityMode = -#if URP_COMPATIBILITY_MODE - GraphicsSettings.TryGetRenderPipelineSettings(out var renderGraphSettings) && renderGraphSettings.enableRenderCompatibilityMode, -#else - false, -#endif shader = shader, passData = passData, variantData = variantData diff --git a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAsset/UniversalRenderPipelineAssetUI.Drawers.cs b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAsset/UniversalRenderPipelineAssetUI.Drawers.cs index c8b3af98fd5..d730edeaf3c 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAsset/UniversalRenderPipelineAssetUI.Drawers.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAsset/UniversalRenderPipelineAssetUI.Drawers.cs @@ -152,10 +152,6 @@ static void DrawRendering(SerializedUniversalRenderPipelineAsset serialized, Edi EditorGUILayout.HelpBox(Styles.lightModeErrorMessage.text, MessageType.Warning, true); if (staticBatchingWarning) EditorGUILayout.HelpBox(Styles.staticBatchingInfoMessage.text, MessageType.Info, true); -#if URP_COMPATIBILITY_MODE - if (serialized.gpuResidentDrawerEnableOcclusionCullingInCameras.boolValue && GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode) - EditorGUILayout.HelpBox(Styles.renderGraphNotEnabledErrorMessage.text, MessageType.Info, true); -#endif } } } @@ -323,13 +319,6 @@ static void DrawUpscalingFilterDropdownAndOptions(SerializedUniversalRenderPipel case UpscalingFilterSelection.STP: { -#if URP_COMPATIBILITY_MODE - // Warn users if they attempt to enable STP without render graph - if (GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode) - { - EditorGUILayout.HelpBox(Styles.stpRequiresRenderGraph, MessageType.Warning, true); - } -#endif // Warn users about performance expectations if they attempt to enable STP on a mobile platform if (PlatformAutoDetect.isShaderAPIMobileDefined) { diff --git a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs index fa28c682251..3f5299f742b 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRendererDataEditor.cs @@ -163,11 +163,7 @@ public override void OnInspectorGUI() EditorGUILayout.LabelField(Styles.FilteringSectionLabel, EditorStyles.boldLabel); EditorGUI.indentLevel++; -#if URP_COMPATIBILITY_MODE - if (GraphicsSettings.TryGetRenderPipelineSettings(out var renderGraphSettings) - && !renderGraphSettings.enableRenderCompatibilityMode) -#endif - EditorGUILayout.PropertyField(m_PrepassLayerMask, Styles.PrepassMask); + EditorGUILayout.PropertyField(m_PrepassLayerMask, Styles.PrepassMask); EditorGUILayout.PropertyField(m_OpaqueLayerMask, Styles.OpaqueMask); EditorGUILayout.PropertyField(m_TransparentLayerMask, Styles.TransparentMask); EditorGUI.indentLevel--; @@ -187,15 +183,6 @@ public override void OnInspectorGUI() depthFormatIndex = GetDepthFormatIndex((DepthFormat)m_DepthAttachmentFormat.intValue, m_RenderingMode.intValue); } -#if URP_COMPATIBILITY_MODE - if (m_RenderingMode.intValue == (int)RenderingMode.DeferredPlus && GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode) - { - EditorGUI.indentLevel++; - EditorGUILayout.HelpBox(Styles.deferredPlusIncompatibleWarning.text, MessageType.Warning); - EditorGUI.indentLevel--; - } -#endif - if (m_RenderingMode.intValue == (int)RenderingMode.Deferred || m_RenderingMode.intValue == (int)RenderingMode.DeferredPlus) { EditorGUI.indentLevel++; @@ -231,17 +218,6 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(m_DepthTextureFormat, Styles.DepthTextureFormat); EditorGUI.indentLevel--; - -#if URP_COMPATIBILITY_MODE - if (renderGraphSettings != null && renderGraphSettings.enableRenderCompatibilityMode) - { - EditorGUILayout.Space(); - EditorGUILayout.LabelField(Styles.RenderPassSectionLabel, EditorStyles.boldLabel); - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(m_UseNativeRenderPass, Styles.RenderPassLabel); - EditorGUI.indentLevel--; - } -#endif EditorGUILayout.Space(); EditorGUILayout.LabelField(Styles.ShadowsSectionLabel, EditorStyles.boldLabel); EditorGUI.indentLevel++; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2DBlendStyle.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2DBlendStyle.cs index 90490430a6b..24642b0e0b7 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2DBlendStyle.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Light2DBlendStyle.cs @@ -118,13 +118,5 @@ internal MaskChannelFilter maskTextureChannelFilter } } } - -#if URP_COMPATIBILITY_MODE - // Transient data - internal bool isDirty { get; set; } - internal bool hasRenderTarget { get; set; } - internal int renderTargetHandleId; - internal RTHandle renderTargetHandle; -#endif } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/IRenderPass2D.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/IRenderPass2D.cs deleted file mode 100644 index 4f506f73c39..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/IRenderPass2D.cs +++ /dev/null @@ -1,9 +0,0 @@ -#if URP_COMPATIBILITY_MODE -namespace UnityEngine.Rendering.Universal -{ - internal interface IRenderPass2D - { - Renderer2DData rendererData { get; } - } -} -#endif diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/IRenderPass2D.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/IRenderPass2D.cs.meta deleted file mode 100644 index a537d742a78..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/IRenderPass2D.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ed92912a74ef47789c37ffbe7c5672a8 -timeCreated: 1595414585 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/PixelPerfectBackgroundPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/PixelPerfectBackgroundPass.cs deleted file mode 100644 index fdaa959be84..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/PixelPerfectBackgroundPass.cs +++ /dev/null @@ -1,36 +0,0 @@ -#if URP_COMPATIBILITY_MODE -using System; - -namespace UnityEngine.Rendering.Universal.CompatibilityMode -{ - // Only to be used when Pixel Perfect Camera is present and it has Crop Frame X or Y enabled. - // This pass simply clears BuiltinRenderTextureType.CameraTarget to black, so that the letterbox or pillarbox is black instead of garbage. - // In the future this can be extended to draw a custom background image instead of just clearing. - internal class PixelPerfectBackgroundPass : ScriptableRenderPass - { - private static readonly ProfilingSampler m_ProfilingScope = new ProfilingSampler("Pixel Perfect Background Pass"); - - public PixelPerfectBackgroundPass(RenderPassEvent evt) - { - renderPassEvent = evt; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cmd = renderingData.commandBuffer; - - using (new ProfilingScope(cmd, m_ProfilingScope)) - { - CoreUtils.SetRenderTarget( - cmd, - BuiltinRenderTextureType.CameraTarget, - RenderBufferLoadAction.DontCare, - RenderBufferStoreAction.Store, - ClearFlag.Color, - Color.black); - } - } - } -} -#endif // URP_COMPATIBILITY_MODE diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/PixelPerfectBackgroundPass.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/PixelPerfectBackgroundPass.cs.meta deleted file mode 100644 index 239d21a0222..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/PixelPerfectBackgroundPass.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d4ffb7da24670bf4687d34e0a1e19eaa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs deleted file mode 100644 index 6fed7eca966..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs +++ /dev/null @@ -1,456 +0,0 @@ -#if URP_COMPATIBILITY_MODE -using System; -using System.Collections.Generic; -using UnityEngine.Profiling; - -namespace UnityEngine.Rendering.Universal.CompatibilityMode -{ - internal class Render2DLightingPass : ScriptableRenderPass, IRenderPass2D - { - private static readonly int k_HDREmulationScaleID = Shader.PropertyToID("_HDREmulationScale"); - private static readonly int k_InverseHDREmulationScaleID = Shader.PropertyToID("_InverseHDREmulationScale"); - private static readonly int k_RendererColorID = Shader.PropertyToID("_RendererColor"); - private static readonly int k_LightLookupID = Shader.PropertyToID("_LightLookup"); - private static readonly int k_FalloffLookupID = Shader.PropertyToID("_FalloffLookup"); - - private static readonly int[] k_ShapeLightTextureIDs = - { - Shader.PropertyToID("_ShapeLightTexture0"), - Shader.PropertyToID("_ShapeLightTexture1"), - Shader.PropertyToID("_ShapeLightTexture2"), - Shader.PropertyToID("_ShapeLightTexture3") - }; - - private static readonly ShaderTagId k_CombinedRenderingPassName = new ShaderTagId("Universal2D"); - private static readonly ShaderTagId k_NormalsRenderingPassName = new ShaderTagId("NormalsRendering"); - private static readonly ShaderTagId k_LegacyPassName = new ShaderTagId("SRPDefaultUnlit"); - private static readonly List k_ShaderTags = new List() { k_LegacyPassName, k_CombinedRenderingPassName }; - - private static readonly ProfilingSampler m_ProfilingDrawLights = new ProfilingSampler("Draw 2D Lights"); - private static readonly ProfilingSampler m_ProfilingDrawLightTextures = new ProfilingSampler("Draw 2D Lights Textures"); - private static readonly ProfilingSampler m_ProfilingDrawRenderers = new ProfilingSampler("Draw All Renderers"); - private static readonly ProfilingSampler m_ProfilingDrawLayerBatch = new ProfilingSampler("Draw Layer Batch"); - private static readonly ProfilingSampler m_ProfilingSamplerUnlit = new ProfilingSampler("Render Unlit"); - - Material m_BlitMaterial; - Material m_SamplingMaterial; - - private readonly Renderer2DData m_Renderer2DData; - private readonly Texture2D m_FallOffLookup; - private bool m_NeedsDepth; - private short m_CameraSortingLayerBoundsIndex; - - public Render2DLightingPass(Renderer2DData rendererData, Material blitMaterial, Material samplingMaterial, Texture2D fallOffLookup) - { - m_Renderer2DData = rendererData; - m_BlitMaterial = blitMaterial; - m_SamplingMaterial = samplingMaterial; - m_FallOffLookup = fallOffLookup; - - m_CameraSortingLayerBoundsIndex = m_Renderer2DData.GetCameraSortingLayerBoundsIndex(); - } - - internal void Setup(bool useDepth) - { - m_NeedsDepth = useDepth; - } - - private void CopyCameraSortingLayerRenderTexture(ScriptableRenderContext context, RenderingData renderingData, RenderBufferStoreAction mainTargetStoreAction) - { - var cmd = renderingData.commandBuffer; - - this.CreateCameraSortingLayerRenderTexture(renderingData, cmd, m_Renderer2DData.cameraSortingLayerDownsamplingMethod); - - Material copyMaterial = m_SamplingMaterial; - int passIndex = 0; - if (m_Renderer2DData.cameraSortingLayerDownsamplingMethod != Downsampling._4xBox) - { - copyMaterial = m_BlitMaterial; - passIndex = colorAttachmentHandle.rt.filterMode == FilterMode.Bilinear ? 1 : 0; - } - - Blitter.BlitCameraTexture(cmd, colorAttachmentHandle, m_Renderer2DData.cameraSortingLayerRenderTarget, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, copyMaterial, passIndex); - CoreUtils.SetRenderTarget(cmd, - colorAttachmentHandle, RenderBufferLoadAction.Load, mainTargetStoreAction, - depthAttachmentHandle, RenderBufferLoadAction.Load, mainTargetStoreAction, - ClearFlag.None, Color.clear); - cmd.SetGlobalTexture(m_Renderer2DData.cameraSortingLayerRenderTarget.name, m_Renderer2DData.cameraSortingLayerRenderTarget.nameID); - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } - - private void DetermineWhenToResolve(int startIndex, int batchesDrawn, int batchCount, LayerBatch[] layerBatches, - out int resolveDuringBatch, out bool resolveIsAfterCopy) - { - bool anyLightWithVolumetricShadows = false; - var lights = m_Renderer2DData.lightCullResult.visibleLights; - for (int i = 0; i < lights.Count; i++) - { - anyLightWithVolumetricShadows = lights[i].renderVolumetricShadows; - if (anyLightWithVolumetricShadows) - break; - } - - var lastVolumetricLightBatch = -1; - if (anyLightWithVolumetricShadows) - { - for (int i = startIndex + batchesDrawn - 1; i >= startIndex; i--) - { - if (layerBatches[i].lightStats.totalVolumetricUsage > 0) - { - lastVolumetricLightBatch = i; - break; - } - } - } - - if (m_Renderer2DData.useCameraSortingLayerTexture) - { - var cameraSortingLayerBoundsIndex = m_Renderer2DData.GetCameraSortingLayerBoundsIndex(); - var copyBatch = -1; - for (int i = startIndex; i < startIndex + batchesDrawn; i++) - { - var layerBatch = layerBatches[i]; - if (cameraSortingLayerBoundsIndex >= layerBatch.layerRange.lowerBound && cameraSortingLayerBoundsIndex <= layerBatch.layerRange.upperBound) - { - copyBatch = i; - break; - } - } - - resolveIsAfterCopy = copyBatch > lastVolumetricLightBatch; - resolveDuringBatch = resolveIsAfterCopy ? copyBatch : lastVolumetricLightBatch; - } - else - { - resolveDuringBatch = lastVolumetricLightBatch; - resolveIsAfterCopy = false; - } - } - - private void Render(ScriptableRenderContext context, CommandBuffer cmd, ref RenderingData renderingData, ref FilteringSettings filterSettings, DrawingSettings drawSettings) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - var activeDebugHandler = GetActiveDebugHandler(cameraData); - if (activeDebugHandler != null) - { - UniversalRenderingData universalRenderingData = renderingData.universalRenderingData; - RenderStateBlock renderStateBlock = new RenderStateBlock(); - var debugRendererLists = activeDebugHandler.CreateRendererListsWithDebugRenderState(context, - ref universalRenderingData.cullResults, ref drawSettings, ref filterSettings, ref renderStateBlock); - debugRendererLists.DrawWithRendererList(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer)); - } - else - { - var param = new RendererListParams(renderingData.cullResults, drawSettings, filterSettings); - var rl = context.CreateRendererList(ref param); - cmd.DrawRendererList(rl); - } - } - - private int DrawLayerBatches( - LayerBatch[] layerBatches, - int batchCount, - int startIndex, - CommandBuffer cmd, - ScriptableRenderContext context, - ref RenderingData renderingData, - ref DrawingSettings normalsDrawSettings, - ref DrawingSettings drawSettings, - ref RenderTextureDescriptor desc) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - - var debugHandler = GetActiveDebugHandler(cameraData); - bool drawLights = debugHandler?.IsLightingActive ?? true; - var batchesDrawn = 0; - var rtCount = 0U; - - // Account for sprite mask interaction with normals. Only clear normals at the start as we require stencil for sprite mask in different layer batches - bool normalsFirstClear = true; - - // Draw lights - using (new ProfilingScope(cmd, m_ProfilingDrawLights)) - { - for (var i = startIndex; i < batchCount; ++i) - { - ref var layerBatch = ref layerBatches[i]; - - var blendStyleMask = layerBatch.lightStats.blendStylesUsed; - var blendStyleCount = 0U; - while (blendStyleMask > 0) - { - blendStyleCount += blendStyleMask & 1; - blendStyleMask >>= 1; - } - - rtCount += blendStyleCount; - - if (rtCount > LayerUtility.maxTextureCount) - break; - - batchesDrawn++; - - if (layerBatch.useNormals) - { - LayerUtility.GetFilterSettings(m_Renderer2DData, layerBatch, out var filterSettings); - var depthTarget = m_NeedsDepth ? depthAttachmentHandle : null; - this.RenderNormals(context, renderingData, normalsDrawSettings, filterSettings, depthTarget, normalsFirstClear); - normalsFirstClear = false; - } - - using (new ProfilingScope(cmd, m_ProfilingDrawLightTextures)) - { - this.RenderLights(renderingData, cmd, ref layerBatch, ref desc); - } - } - } - - // Determine when to resolve in case we use MSAA - var msaaEnabled = renderingData.cameraData.cameraTargetDescriptor.msaaSamples > 1; - var isFinalBatchSet = startIndex + batchesDrawn >= batchCount; - var resolveDuringBatch = -1; - var resolveIsAfterCopy = false; - if (msaaEnabled && isFinalBatchSet) - DetermineWhenToResolve(startIndex, batchesDrawn, batchCount, layerBatches, out resolveDuringBatch, out resolveIsAfterCopy); - - - // Draw renderers - var blendStylesCount = m_Renderer2DData.lightBlendStyles.Length; - using (new ProfilingScope(cmd, m_ProfilingDrawRenderers)) - { - RenderBufferStoreAction initialStoreAction; - if (msaaEnabled) - initialStoreAction = resolveDuringBatch < startIndex ? RenderBufferStoreAction.Resolve : RenderBufferStoreAction.StoreAndResolve; - else - initialStoreAction = RenderBufferStoreAction.Store; - CoreUtils.SetRenderTarget(cmd, - colorAttachmentHandle, RenderBufferLoadAction.Load, initialStoreAction, - depthAttachmentHandle, RenderBufferLoadAction.Load, initialStoreAction, - ClearFlag.None, Color.clear); - - for (var i = startIndex; i < startIndex + batchesDrawn; i++) - { - using (new ProfilingScope(cmd, m_ProfilingDrawLayerBatch)) - { - // This is a local copy of the array element (it's a struct). Remember to add a ref here if you need to modify the real thing. - var layerBatch = layerBatches[i]; - - if (layerBatch.lightStats.useLights) - { - for (var blendStyleIndex = 0; blendStyleIndex < blendStylesCount; blendStyleIndex++) - { - var blendStyleMask = (uint)(1 << blendStyleIndex); - var blendStyleUsed = (layerBatch.lightStats.blendStylesUsed & blendStyleMask) > 0; - - if (blendStyleUsed) - { - var identifier = layerBatch.GetRTId(cmd, desc, blendStyleIndex); - cmd.SetGlobalTexture(k_ShapeLightTextureIDs[blendStyleIndex], identifier); - } - - RendererLighting.EnableBlendStyle(CommandBufferHelpers.GetRasterCommandBuffer(cmd), blendStyleIndex, blendStyleUsed); - } - } - else - { - for (var blendStyleIndex = 0; blendStyleIndex < k_ShapeLightTextureIDs.Length; blendStyleIndex++) - { - cmd.SetGlobalTexture(k_ShapeLightTextureIDs[blendStyleIndex], Texture2D.blackTexture); - RendererLighting.EnableBlendStyle(CommandBufferHelpers.GetRasterCommandBuffer(cmd), blendStyleIndex, blendStyleIndex == 0); - } - } - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - short cameraSortingLayerBoundsIndex = m_Renderer2DData.GetCameraSortingLayerBoundsIndex(); - - RenderBufferStoreAction copyStoreAction; - if (msaaEnabled) - copyStoreAction = resolveDuringBatch == i && resolveIsAfterCopy ? RenderBufferStoreAction.Resolve : RenderBufferStoreAction.StoreAndResolve; - else - copyStoreAction = RenderBufferStoreAction.Store; - - - LayerUtility.GetFilterSettings(m_Renderer2DData, layerBatch, out var filterSettings); - - Render(context, cmd, ref renderingData, ref filterSettings, drawSettings); - - if (m_Renderer2DData.useCameraSortingLayerTexture) - { - if (cameraSortingLayerBoundsIndex >= layerBatch.layerRange.lowerBound && cameraSortingLayerBoundsIndex <= layerBatch.layerRange.upperBound) - { - CopyCameraSortingLayerRenderTexture(context, renderingData, copyStoreAction); - } - } - - RendererLighting.DisableAllKeywords(CommandBufferHelpers.GetRasterCommandBuffer(cmd)); - - // Draw light volumes - if (drawLights && (layerBatch.lightStats.totalVolumetricUsage > 0)) - { - var sampleName = "Render 2D Light Volumes"; - cmd.BeginSample(sampleName); - - RenderBufferStoreAction storeAction; - if (msaaEnabled) - storeAction = resolveDuringBatch == i && !resolveIsAfterCopy ? RenderBufferStoreAction.Resolve : RenderBufferStoreAction.StoreAndResolve; - else - storeAction = RenderBufferStoreAction.Store; - this.RenderLightVolumes(renderingData, cmd, ref layerBatch, colorAttachmentHandle.nameID, depthAttachmentHandle.nameID, - RenderBufferStoreAction.Store, storeAction, false, m_Renderer2DData.lightCullResult.visibleLights); - - cmd.EndSample(sampleName); - } - } - } - } - - for (var i = startIndex; i < startIndex + batchesDrawn; ++i) - { - ref var layerBatch = ref layerBatches[i]; - layerBatch.ReleaseRT(cmd); - } - - return batchesDrawn; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var isLitView = true; - -#if UNITY_EDITOR - if (renderingData.cameraData.isSceneViewCamera && UnityEditor.SceneView.currentDrawingSceneView != null) - isLitView = UnityEditor.SceneView.currentDrawingSceneView.sceneLighting; - - if (renderingData.cameraData.camera.cameraType == CameraType.Preview) - isLitView = false; -#endif - var camera = renderingData.cameraData.camera; - var filterSettings = FilteringSettings.defaultValue; - filterSettings.renderQueueRange = RenderQueueRange.all; - filterSettings.layerMask = -1; - filterSettings.renderingLayerMask = 0xFFFFFFFF; - filterSettings.sortingLayerRange = SortingLayerRange.all; - - LayerUtility.InitializeBudget(m_Renderer2DData.lightRenderTextureMemoryBudget); - ShadowRendering.InitializeBudget(m_Renderer2DData.shadowRenderTextureMemoryBudget); - RendererLighting.lightBatch.Reset(); - - // Set screenParams when pixel perfect camera is used with the reference resolution - camera.TryGetComponent(out PixelPerfectCamera pixelPerfectCamera); - if (pixelPerfectCamera != null && pixelPerfectCamera.enabled && pixelPerfectCamera.offscreenRTSize != Vector2Int.zero) - { - var cameraWidth = pixelPerfectCamera.offscreenRTSize.x; - var cameraHeight = pixelPerfectCamera.offscreenRTSize.y; - renderingData.commandBuffer.SetGlobalVector(ShaderPropertyId.screenParams, new Vector4(cameraWidth, cameraHeight, 1.0f + 1.0f / cameraWidth, 1.0f + 1.0f / cameraHeight)); - } - - var isSceneLit = m_Renderer2DData.lightCullResult.IsSceneLit(); - if (isSceneLit && isLitView) - { - var combinedDrawSettings = CreateDrawingSettings(k_ShaderTags, ref renderingData, SortingCriteria.CommonTransparent); - var normalsDrawSettings = CreateDrawingSettings(k_NormalsRenderingPassName, ref renderingData, SortingCriteria.CommonTransparent); - - var sortSettings = combinedDrawSettings.sortingSettings; - RendererLighting.GetTransparencySortingMode(m_Renderer2DData, camera, ref sortSettings); - combinedDrawSettings.sortingSettings = sortSettings; - normalsDrawSettings.sortingSettings = sortSettings; - - var cmd = renderingData.commandBuffer; - cmd.SetGlobalFloat(k_HDREmulationScaleID, m_Renderer2DData.hdrEmulationScale); - cmd.SetGlobalFloat(k_InverseHDREmulationScaleID, 1.0f / m_Renderer2DData.hdrEmulationScale); - cmd.SetGlobalColor(k_RendererColorID, Color.white); - cmd.SetGlobalTexture(k_FalloffLookupID, m_FallOffLookup); - cmd.SetGlobalTexture(k_LightLookupID, Light2DLookupTexture.GetLightLookupTexture()); - RendererLighting.SetLightShaderGlobals(m_Renderer2DData, CommandBufferHelpers.GetRasterCommandBuffer(cmd)); - - var desc = this.GetBlendStyleRenderTextureDesc(renderingData); - - ShadowRendering.CallOnBeforeRender(renderingData.cameraData.camera, m_Renderer2DData.lightCullResult); - - var layerBatches = LayerUtility.CalculateBatches(m_Renderer2DData, out var batchCount); - var batchesDrawn = 0; - - for (var i = 0; i < batchCount; i += batchesDrawn) - batchesDrawn = DrawLayerBatches(layerBatches, batchCount, i, cmd, context, ref renderingData, ref normalsDrawSettings, ref combinedDrawSettings, ref desc); - - RendererLighting.DisableAllKeywords(CommandBufferHelpers.GetRasterCommandBuffer(cmd)); - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } - else - { - var unlitDrawSettings = CreateDrawingSettings(k_ShaderTags, ref renderingData, SortingCriteria.CommonTransparent); - var msaaEnabled = renderingData.cameraData.cameraTargetDescriptor.msaaSamples > 1; - var storeAction = msaaEnabled ? RenderBufferStoreAction.Resolve : RenderBufferStoreAction.Store; - - var sortSettings = unlitDrawSettings.sortingSettings; - RendererLighting.GetTransparencySortingMode(m_Renderer2DData, camera, ref sortSettings); - unlitDrawSettings.sortingSettings = sortSettings; - - var cmd = renderingData.commandBuffer; - using (new ProfilingScope(cmd, m_ProfilingSamplerUnlit)) - { - CoreUtils.SetRenderTarget(cmd, - colorAttachmentHandle, RenderBufferLoadAction.Load, storeAction, - depthAttachmentHandle, RenderBufferLoadAction.Load, storeAction, - ClearFlag.None, Color.clear); - - cmd.SetGlobalColor(k_RendererColorID, Color.white); - - for (var blendStyleIndex = 0; blendStyleIndex < k_ShapeLightTextureIDs.Length; blendStyleIndex++) - { - if (blendStyleIndex == 0) - cmd.SetGlobalTexture(k_ShapeLightTextureIDs[blendStyleIndex], Texture2D.blackTexture); - - RendererLighting.EnableBlendStyle(CommandBufferHelpers.GetRasterCommandBuffer(cmd), blendStyleIndex, blendStyleIndex == 0); - } - } - - RendererLighting.DisableAllKeywords(CommandBufferHelpers.GetRasterCommandBuffer(cmd)); - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - Profiler.BeginSample("Render Sprites Unlit"); - if (m_Renderer2DData.useCameraSortingLayerTexture) - { - filterSettings.sortingLayerRange = new SortingLayerRange(short.MinValue, m_CameraSortingLayerBoundsIndex); - Render(context, cmd, ref renderingData, ref filterSettings, unlitDrawSettings); - - CopyCameraSortingLayerRenderTexture(context, renderingData, storeAction); - - filterSettings.sortingLayerRange = new SortingLayerRange((short)(m_CameraSortingLayerBoundsIndex + 1), short.MaxValue); - Render(context, cmd, ref renderingData, ref filterSettings, unlitDrawSettings); - } - else - { - Render(context, cmd, ref renderingData, ref filterSettings, unlitDrawSettings); - } - Profiler.EndSample(); - } - - filterSettings.sortingLayerRange = SortingLayerRange.all; - - RendererList objectsWithErrorRendererList = RendererList.nullRendererList; - RenderingUtils.CreateRendererListObjectsWithError(context, ref renderingData.cullResults, camera, filterSettings, SortingCriteria.None, ref objectsWithErrorRendererList); - RenderingUtils.DrawRendererListObjectsWithError(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), ref objectsWithErrorRendererList); - } - - Renderer2DData IRenderPass2D.rendererData - { - get { return m_Renderer2DData; } - } - - public void Dispose() - { - m_Renderer2DData.normalsRenderTarget?.Release(); - m_Renderer2DData.normalsRenderTarget = null; - m_Renderer2DData.cameraSortingLayerRenderTarget?.Release(); - m_Renderer2DData.cameraSortingLayerRenderTarget = null; - } - } -} -#endif // URP_COMPATIBILITY_MODE diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs.meta deleted file mode 100644 index 0fbbe16f01f..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Render2DLightingPass.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c4cbc2d2d710ce84696437385ac8866c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerUtility.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerUtility.cs index 490bdd11bc9..496461d8c5d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerUtility.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/LayerUtility.cs @@ -14,10 +14,6 @@ internal class LayerBatch public SortingLayerRange layerRange; public LightStats lightStats; public bool useNormals; -#if URP_COMPATIBILITY_MODE - private int[] renderTargetIds = new int[4]; - private bool[] renderTargetUsed = new bool[4]; -#endif public List lights; public List shadowIndices; @@ -27,14 +23,6 @@ internal class LayerBatch public void InitRTIds(int index) { -#if URP_COMPATIBILITY_MODE - for (var i = 0; i < 4; i++) - { - renderTargetUsed[i] = false; - renderTargetIds[i] = Shader.PropertyToID($"_LightTexture_{index}_{i}"); - } -#endif - lights = new List(); shadowIndices = new List(); shadowCasters = new List(); @@ -45,43 +33,11 @@ internal bool IsValueWithinLayerRange(int value) { return value >= layerRange.lowerBound && value <= layerRange.upperBound; } - -#if URP_COMPATIBILITY_MODE - public RenderTargetIdentifier GetRTId(CommandBuffer cmd, RenderTextureDescriptor desc, int index) - { - if (!renderTargetUsed[index]) - { - cmd.GetTemporaryRT(renderTargetIds[index], desc, FilterMode.Bilinear); - renderTargetUsed[index] = true; - } - return new RenderTargetIdentifier(renderTargetIds[index]); - } - - public void ReleaseRT(CommandBuffer cmd) - { - for (var i = 0; i < 4; i++) - { - if (!renderTargetUsed[i]) - continue; - - cmd.ReleaseTemporaryRT(renderTargetIds[i]); - renderTargetUsed[i] = false; - } - } -#endif } internal static class LayerUtility { private static LayerBatch[] s_LayerBatches; -#if URP_COMPATIBILITY_MODE - public static uint maxTextureCount { get; private set; } - - public static void InitializeBudget(uint maxTextureCount) - { - LayerUtility.maxTextureCount = math.max(4, maxTextureCount); - } -#endif private static bool CanBatchLightsInLayer(int layerIndex1, int layerIndex2, SortingLayer[] sortingLayers, ILight2DCullResult lightCullResult) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/RendererLighting.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/RendererLighting.cs index fffacabdc71..321f03a60ff 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/RendererLighting.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Passes/Utility/RendererLighting.cs @@ -95,64 +95,6 @@ internal static GraphicsFormat GetRenderTextureFormat() return s_RenderTextureFormatToUse; } -#if URP_COMPATIBILITY_MODE - public static void CreateNormalMapRenderTexture(this IRenderPass2D pass, RenderingData renderingData, CommandBuffer cmd, float renderScale) - { - var descriptor = new RenderTextureDescriptor( - (int)(renderingData.cameraData.cameraTargetDescriptor.width * renderScale), - (int)(renderingData.cameraData.cameraTargetDescriptor.height * renderScale)); - - descriptor.graphicsFormat = GetRenderTextureFormat(); - descriptor.useMipMap = false; - descriptor.autoGenerateMips = false; - descriptor.depthStencilFormat = GraphicsFormat.None; - descriptor.msaaSamples = renderingData.cameraData.cameraTargetDescriptor.msaaSamples; - descriptor.dimension = TextureDimension.Tex2D; - - RenderingUtils.ReAllocateHandleIfNeeded(ref pass.rendererData.normalsRenderTarget, descriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_NormalMap"); - cmd.SetGlobalTexture(pass.rendererData.normalsRenderTarget.name, pass.rendererData.normalsRenderTarget.nameID); - } - - public static RenderTextureDescriptor GetBlendStyleRenderTextureDesc(this IRenderPass2D pass, RenderingData renderingData) - { - var renderTextureScale = Mathf.Clamp(pass.rendererData.lightRenderTextureScale, 0.01f, 1.0f); - var width = (int)(renderingData.cameraData.cameraTargetDescriptor.width * renderTextureScale); - var height = (int)(renderingData.cameraData.cameraTargetDescriptor.height * renderTextureScale); - - var descriptor = new RenderTextureDescriptor(width, height); - descriptor.graphicsFormat = GetRenderTextureFormat(); - descriptor.useMipMap = false; - descriptor.autoGenerateMips = false; - descriptor.depthStencilFormat = GraphicsFormat.None; - descriptor.msaaSamples = 1; - descriptor.dimension = TextureDimension.Tex2D; - - return descriptor; - } - - public static void CreateCameraSortingLayerRenderTexture(this IRenderPass2D pass, RenderingData renderingData, CommandBuffer cmd, Downsampling downsamplingMethod) - { - var renderTextureScale = 1.0f; - if (downsamplingMethod == Downsampling._2xBilinear) - renderTextureScale = 0.5f; - else if (downsamplingMethod == Downsampling._4xBox || downsamplingMethod == Downsampling._4xBilinear) - renderTextureScale = 0.25f; - - var width = (int)(renderingData.cameraData.cameraTargetDescriptor.width * renderTextureScale); - var height = (int)(renderingData.cameraData.cameraTargetDescriptor.height * renderTextureScale); - - var descriptor = new RenderTextureDescriptor(width, height); - descriptor.graphicsFormat = renderingData.cameraData.cameraTargetDescriptor.graphicsFormat; - descriptor.useMipMap = false; - descriptor.autoGenerateMips = false; - descriptor.depthStencilFormat = GraphicsFormat.None; - descriptor.msaaSamples = 1; - - RenderingUtils.ReAllocateHandleIfNeeded(ref pass.rendererData.cameraSortingLayerRenderTarget, descriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_CameraSortingLayerTexture"); - cmd.SetGlobalTexture(pass.rendererData.cameraSortingLayerRenderTarget.name, pass.rendererData.cameraSortingLayerRenderTarget.nameID); - } -#endif - internal static void EnableBlendStyle(IRasterCommandBuffer cmd, int blendStyleIndex, bool enabled) { var keyword = k_UseBlendStyleKeywords[blendStyleIndex]; @@ -195,242 +137,11 @@ internal static void GetTransparencySortingMode(Renderer2DData rendererData, Cam } } -#if URP_COMPATIBILITY_MODE - private static bool CanRenderLight(IRenderPass2D pass, Light2D light, int blendStyleIndex, int layerToRender, bool isVolume, bool hasShadows, ref Mesh lightMesh, ref Material lightMaterial) - { - if (light != null && light.lightType != Light2D.LightType.Global && light.blendStyleIndex == blendStyleIndex && light.IsLitLayer(layerToRender)) - { - lightMesh = light.lightMesh; - if (lightMesh == null) - return false; - lightMaterial = pass.rendererData.GetLightMaterial(light, isVolume, hasShadows); - if (lightMaterial == null) - return false; - return true; - } - return false; - } -#endif - internal static bool CanCastShadows(Light2D light, int layerToRender) { return light.shadowsEnabled && light.shadowIntensity > 0 && light.IsLitLayer(layerToRender); } -#if URP_COMPATIBILITY_MODE - private static bool CanCastVolumetricShadows(Light2D light, int endLayerValue) - { - var topMostLayerValue = light.GetTopMostLitLayer(); - return light.volumetricShadowsEnabled && light.shadowVolumeIntensity > 0 && topMostLayerValue == endLayerValue; - } - - internal static void RenderLight(IRenderPass2D pass, CommandBuffer cmd, Light2D light, bool isVolume, int blendStyleIndex, int layerToRender, bool hasShadows, bool batchingSupported, ref int shadowLightCount) - { - Mesh lightMesh = null; - Material lightMaterial = null; - if (!CanRenderLight(pass, light, blendStyleIndex, layerToRender, isVolume, hasShadows, ref lightMesh, ref lightMaterial)) - return; - - // For Batching. - bool canBatch = lightBatch.CanBatch(light, lightMaterial, light.batchSlotIndex, out int lightHash); - bool hasCookies = SetCookieShaderGlobals(cmd, light); - - // Flush on Break. - bool breakBatch = hasShadows || hasCookies || !canBatch; - if (breakBatch && batchingSupported) - lightBatch.Flush(CommandBufferHelpers.GetRasterCommandBuffer(cmd)); - - // Set the shadow texture to read from - if (hasShadows) - ShadowRendering.SetGlobalShadowTexture(cmd, light, shadowLightCount++); - - var slotIndex = lightBatch.SlotIndex(light.batchSlotIndex); - SetPerLightShaderGlobals(CommandBufferHelpers.GetRasterCommandBuffer(cmd), light, slotIndex, isVolume, hasShadows, batchingSupported); - - if (light.lightType == Light2D.LightType.Point) - SetPerPointLightShaderGlobals(CommandBufferHelpers.GetRasterCommandBuffer(cmd), light, slotIndex, batchingSupported); - - // Check if StructuredBuffer is supported, if not fallback. - if (batchingSupported) - { - lightBatch.AddBatch(light, lightMaterial, light.GetMatrix(), lightMesh, 0, lightHash, light.batchSlotIndex); - } - else - { - cmd.DrawMesh(lightMesh, light.GetMatrix(), lightMaterial); - } - } - - private static void RenderLightSet(IRenderPass2D pass, RenderingData renderingData, int blendStyleIndex, CommandBuffer cmd, ref LayerBatch layer, RenderTargetIdentifier renderTexture, List lights) - { - var maxShadowLightCount = ShadowRendering.maxTextureCount; - var requiresRTInit = true; - - // This case should never happen, but if it does it may cause an infinite loop later. - if (maxShadowLightCount < 1) - { - Debug.LogError("maxShadowTextureCount cannot be less than 1"); - return; - } - - NativeArray doesLightAtIndexHaveShadows = new NativeArray(lights.Count, Allocator.Temp); - - // Break up light rendering into batches for the purpose of shadow casting - var lightIndex = 0; - while (lightIndex < lights.Count) - { - var remainingLights = (uint)lights.Count - lightIndex; - var batchedLights = 0; - - // Add lights to our batch until the number of shadow textures reach the maxShadowTextureCount - int shadowLightCount = 0; - while (batchedLights < remainingLights && shadowLightCount < maxShadowLightCount) - { - int curLightIndex = lightIndex + batchedLights; - var light = lights[curLightIndex]; - if (CanCastShadows(light, layer.startLayerID)) - { - doesLightAtIndexHaveShadows[curLightIndex] = false; - if (ShadowRendering.PrerenderShadows(pass, renderingData, cmd, ref layer, light, shadowLightCount, light.shadowIntensity)) - { - doesLightAtIndexHaveShadows[curLightIndex] = true; - shadowLightCount++; - } - } - batchedLights++; - } - - - // Set the current RT to the light RT - if (shadowLightCount > 0 || requiresRTInit) - { - cmd.SetRenderTarget(renderTexture, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare); - requiresRTInit = false; - } - - // Render all the lights. - shadowLightCount = 0; - for (var lightIndexOffset = 0; lightIndexOffset < batchedLights; lightIndexOffset++) - { - var arrayIndex = (int)(lightIndex + lightIndexOffset); - RenderLight(pass, cmd, lights[arrayIndex], false, blendStyleIndex, layer.startLayerID, doesLightAtIndexHaveShadows[arrayIndex], LightBatch.isBatchingSupported, ref shadowLightCount); - } - lightBatch.Flush(CommandBufferHelpers.GetRasterCommandBuffer(cmd)); - - // Release all of the temporary shadow textures - for (var releaseIndex = shadowLightCount - 1; releaseIndex >= 0; releaseIndex--) - ShadowRendering.ReleaseShadowRenderTexture(cmd, releaseIndex); - - lightIndex += batchedLights; - } - - doesLightAtIndexHaveShadows.Dispose(); - } - - public static void RenderLightVolumes(this IRenderPass2D pass, RenderingData renderingData, CommandBuffer cmd, ref LayerBatch layer, - RenderTargetIdentifier renderTexture, RenderTargetIdentifier depthTexture, RenderBufferStoreAction intermediateStoreAction, - RenderBufferStoreAction finalStoreAction, bool requiresRTInit, List lights) - { - var maxShadowLightCount = ShadowRendering.maxTextureCount; // Now encodes shadows into RG,BA as well as seperate textures - - NativeArray doesLightAtIndexHaveShadows = new NativeArray(lights.Count, Allocator.Temp); - - // This case should never happen, but if it does it may cause an infinite loop later. - if (maxShadowLightCount < 1) - { - Debug.LogError("maxShadowLightCount cannot be less than 1"); - return; - } - - // Determine last light with volumetric shadows to be rendered if we want to use a different store action after using rendering its volumetric shadows - int useFinalStoreActionAfter = lights.Count; - if (intermediateStoreAction != finalStoreAction) - { - for (int i = lights.Count - 1; i >= 0; i--) - { - if (lights[i].renderVolumetricShadows) - { - useFinalStoreActionAfter = i; - break; - } - } - } - - // Break up light rendering into batches for the purpose of shadow casting - var lightIndex = 0; - while (lightIndex < lights.Count) - { - var remainingLights = (uint)lights.Count - lightIndex; - var batchedLights = 0; - - // Add lights to our batch until the number of shadow textures reach the maxShadowTextureCount - var shadowLightCount = 0; - while (batchedLights < remainingLights && shadowLightCount < maxShadowLightCount) - { - int curLightIndex = lightIndex + batchedLights; - var light = lights[curLightIndex]; - - if (CanCastVolumetricShadows(light, layer.endLayerValue)) - { - doesLightAtIndexHaveShadows[curLightIndex] = false; - if (ShadowRendering.PrerenderShadows(pass, renderingData, cmd, ref layer, light, shadowLightCount, light.shadowVolumeIntensity)) - { - doesLightAtIndexHaveShadows[curLightIndex] = true; - shadowLightCount++; - } - } - batchedLights++; - } - - // Set the current RT to the light RT - if (shadowLightCount > 0 || requiresRTInit) - { - var storeAction = lightIndex + batchedLights >= useFinalStoreActionAfter ? finalStoreAction : intermediateStoreAction; - cmd.SetRenderTarget(renderTexture, RenderBufferLoadAction.Load, storeAction, depthTexture, RenderBufferLoadAction.Load, storeAction); - requiresRTInit = false; - } - - // Render all the lights. - shadowLightCount = 0; - for (var lightIndexOffset = 0; lightIndexOffset < batchedLights; lightIndexOffset++) - { - var arrayIndex = (int)(lightIndex + lightIndexOffset); - var light = lights[arrayIndex]; - - if (light.volumeIntensity <= 0.0f || !light.volumetricEnabled) - continue; - - if (layer.endLayerValue == light.GetTopMostLitLayer()) // this implies the layer is correct - RenderLight(pass, cmd, light, true, light.blendStyleIndex, layer.startLayerID, doesLightAtIndexHaveShadows[arrayIndex], LightBatch.isBatchingSupported, ref shadowLightCount); - } - lightBatch.Flush(CommandBufferHelpers.GetRasterCommandBuffer(cmd)); - - // Release all of the temporary shadow textures - for (var releaseIndex = shadowLightCount - 1; releaseIndex >= 0; releaseIndex--) - ShadowRendering.ReleaseShadowRenderTexture(cmd, releaseIndex); - - lightIndex += batchedLights; - } - - doesLightAtIndexHaveShadows.Dispose(); - } - - // TODO: Remove once Rendergraph becomes default pipeline - internal static void SetLightShaderGlobals(Renderer2DData rendererData, RasterCommandBuffer cmd) - { - for (var i = 0; i < rendererData.lightBlendStyles.Length; i++) - { - var blendStyle = rendererData.lightBlendStyles[i]; - if (i >= k_BlendFactorsPropIDs.Length) - break; - - cmd.SetGlobalVector(k_BlendFactorsPropIDs[i], blendStyle.blendFactors); - cmd.SetGlobalVector(k_MaskFilterPropIDs[i], blendStyle.maskTextureChannelFilter.mask); - cmd.SetGlobalVector(k_InvertedFilterPropIDs[i], blendStyle.maskTextureChannelFilter.inverted); - } - } -#endif - internal static void SetLightShaderGlobals(IRasterCommandBuffer cmd, Light2DBlendStyle[] lightBlendStyles, int[] blendStyleIndices) { for (var i = 0; i < blendStyleIndices.Length; i++) @@ -535,135 +246,12 @@ internal static void SetPerPointLightShaderGlobals(IRasterCommandBuffer cmd, Lig } } -#if URP_COMPATIBILITY_MODE - // TODO: Remove once Rendergraph becomes default pipeline - internal static bool SetCookieShaderGlobals(CommandBuffer cmd, Light2D light) - { - if (light.useCookieSprite) - cmd.SetGlobalTexture(light.lightType == Light2D.LightType.Sprite ? k_CookieTexID : k_PointLightCookieTexID, light.lightCookieSprite.texture); - - return light.useCookieSprite; - } -#endif - internal static void SetCookieShaderProperties(Light2D light, MaterialPropertyBlock properties) { if (light.useCookieSprite && light.m_CookieSpriteTextureHandle.IsValid()) properties.SetTexture(light.lightType == Light2D.LightType.Sprite ? k_CookieTexID : k_PointLightCookieTexID, light.m_CookieSpriteTextureHandle); } -#if URP_COMPATIBILITY_MODE - public static void ClearDirtyLighting(this IRenderPass2D pass, CommandBuffer cmd, uint blendStylesUsed) - { - for (var i = 0; i < pass.rendererData.lightBlendStyles.Length; ++i) - { - if ((blendStylesUsed & (uint)(1 << i)) == 0) - continue; - - if (!pass.rendererData.lightBlendStyles[i].isDirty) - continue; - - CoreUtils.SetRenderTarget(cmd, pass.rendererData.lightBlendStyles[i].renderTargetHandle, ClearFlag.Color, Color.black); - pass.rendererData.lightBlendStyles[i].isDirty = false; - } - } - - internal static void RenderNormals(this IRenderPass2D pass, ScriptableRenderContext context, RenderingData renderingData, DrawingSettings drawSettings, FilteringSettings filterSettings, RTHandle depthTarget, bool bFirstClear) - { - var cmd = renderingData.commandBuffer; - - using (new ProfilingScope(cmd, m_ProfilingSampler)) - { - // figure out the scale - var normalRTScale = 0.0f; - - if (depthTarget != null) - normalRTScale = 1.0f; - else - normalRTScale = Mathf.Clamp(pass.rendererData.lightRenderTextureScale, 0.01f, 1.0f); - - pass.CreateNormalMapRenderTexture(renderingData, cmd, normalRTScale); - - var msaaEnabled = renderingData.cameraData.cameraTargetDescriptor.msaaSamples > 1; - var storeAction = msaaEnabled ? RenderBufferStoreAction.Resolve : RenderBufferStoreAction.Store; - var clearFlag = pass.rendererData.useDepthStencilBuffer && bFirstClear ? ClearFlag.All : ClearFlag.Color; - - if (depthTarget != null) - { - CoreUtils.SetRenderTarget(cmd, - pass.rendererData.normalsRenderTarget, RenderBufferLoadAction.DontCare, storeAction, - depthTarget, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, - clearFlag, k_NormalClearColor); - } - else - CoreUtils.SetRenderTarget(cmd, pass.rendererData.normalsRenderTarget, RenderBufferLoadAction.DontCare, storeAction, clearFlag, k_NormalClearColor); - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - drawSettings.SetShaderPassName(0, k_NormalsRenderingPassName); - - var param = new RendererListParams(renderingData.cullResults, drawSettings, filterSettings); - var rl = context.CreateRendererList(ref param); - cmd.DrawRendererList(rl); - } - } - - public static void RenderLights(this IRenderPass2D pass, RenderingData renderingData, CommandBuffer cmd, ref LayerBatch layerBatch, ref RenderTextureDescriptor rtDesc) - { - // Before rendering the lights cache some values that are expensive to get/calculate - var culledLights = pass.rendererData.lightCullResult.visibleLights; - for (var i = 0; i < culledLights.Count; i++) - { - culledLights[i].CacheValues(); - } - - ShadowCasterGroup2DManager.CacheValues(); - - var blendStyles = pass.rendererData.lightBlendStyles; - - for (var i = 0; i < blendStyles.Length; ++i) - { - if ((layerBatch.lightStats.blendStylesUsed & (uint)(1 << i)) == 0) - continue; - - var sampleName = blendStyles[i].name; - cmd.BeginSample(sampleName); - - if (!Light2DManager.GetGlobalColor(layerBatch.startLayerID, i, out var clearColor)) - clearColor = Color.black; - - var anyLights = (layerBatch.lightStats.blendStylesWithLights & (uint)(1 << i)) != 0; - - var desc = rtDesc; - if (!anyLights) // No lights -- create tiny texture - desc.width = desc.height = 4; - var identifier = layerBatch.GetRTId(cmd, desc, i); - - cmd.SetRenderTarget(identifier, - RenderBufferLoadAction.DontCare, - RenderBufferStoreAction.Store, - RenderBufferLoadAction.DontCare, - RenderBufferStoreAction.DontCare); - cmd.ClearRenderTarget(false, true, clearColor); - - if (anyLights) - { - RenderLightSet( - pass, renderingData, - i, - cmd, - ref layerBatch, - identifier, - pass.rendererData.lightCullResult.visibleLights - ); - } - - cmd.EndSample(sampleName); - } - } -#endif - private static void SetBlendModes(Material material, BlendMode src, BlendMode dst) { material.SetFloat(k_SrcBlendID, (float)src); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs deleted file mode 100644 index 8ff4b717b55..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs +++ /dev/null @@ -1,428 +0,0 @@ -#if URP_COMPATIBILITY_MODE -using System; -using UnityEngine.Experimental.Rendering; -using UnityEngine.Rendering.Universal.Internal; - -namespace UnityEngine.Rendering.Universal -{ - internal sealed partial class Renderer2D : ScriptableRenderer - { - CompatibilityMode.Render2DLightingPass m_Render2DLightingPass; - CompatibilityMode.PixelPerfectBackgroundPass m_PixelPerfectBackgroundPass; - - internal RenderTargetBufferSystem m_ColorBufferSystem; - - private static readonly ProfilingSampler m_ProfilingSampler = new ProfilingSampler("Create Camera Textures"); - - bool m_UseDepthStencilBuffer = true; - - // We probably should declare these names in the base class, - // as they must be the same across all ScriptableRenderer types for camera stacking to work. - internal RTHandle m_ColorTextureHandle; - internal RTHandle m_DepthTextureHandle; - -#if UNITY_EDITOR - SetEditorTargetPass m_SetEditorTargetPass; - internal RTHandle m_DefaultWhiteTextureHandle; -#endif - - internal bool createColorTexture => m_CreateColorTexture; - internal bool createDepthTexture => m_CreateDepthTexture; - - // Compatibility - CompatibilityMode.PostProcessPasses m_PostProcessPasses; - internal ColorGradingLutPass colorGradingLutPass { get => m_PostProcessPasses.colorGradingLutPass; } - internal CompatibilityMode.PostProcessPass postProcessPass { get => m_PostProcessPasses.postProcessPass; } - internal CompatibilityMode.PostProcessPass finalPostProcessPass { get => m_PostProcessPasses.finalPostProcessPass; } - internal RTHandle afterPostProcessColorHandle { get => m_PostProcessPasses.afterPostProcessColor; } - internal RTHandle colorGradingLutHandle { get => m_PostProcessPasses.colorGradingLut; } - - void InitializeCompatibilityMode(Renderer2DData data) - { - if (GraphicsSettings.TryGetRenderPipelineSettings(out var renderer2DResources)) - { - m_Render2DLightingPass = new CompatibilityMode.Render2DLightingPass(data, m_BlitMaterial, m_SamplingMaterial, renderer2DResources.fallOffLookup); - } - - m_PixelPerfectBackgroundPass = new CompatibilityMode.PixelPerfectBackgroundPass(RenderPassEvent.AfterRenderingTransparents); - -#if UNITY_EDITOR - m_SetEditorTargetPass = new SetEditorTargetPass(RenderPassEvent.AfterRendering + 9); -#endif - - // RenderTexture format depends on camera and pipeline (HDR, non HDR, etc) - // Samples (MSAA) depend on camera and pipeline - m_ColorBufferSystem = new RenderTargetBufferSystem("_CameraColorAttachment"); - - var ppParams = CompatibilityMode.PostProcessParams.Create(); - ppParams.blitMaterial = m_BlitMaterial; - ppParams.requestColorFormat = GraphicsFormat.B10G11R11_UFloatPack32; - - m_PostProcessPasses = new CompatibilityMode.PostProcessPasses(data.postProcessData, ref ppParams); - - m_UseDepthStencilBuffer = data.useDepthStencilBuffer; - } - - void CleanupCompatibilityModeResources() - { - m_Render2DLightingPass?.Dispose(); - m_PostProcessPasses.Dispose(); - m_ColorTextureHandle?.Release(); - m_DepthTextureHandle?.Release(); - ReleaseRenderTargets(); - } - - internal override void ReleaseRenderTargets() - { - m_ColorBufferSystem.Dispose(); - m_PostProcessPasses.ReleaseRenderTargets(); - } - - void CreateRenderTextures( - ref RenderPassInputSummary renderPassInputs, - CommandBuffer cmd, - UniversalCameraData cameraData, - bool forceCreateColorTexture, - FilterMode colorTextureFilterMode, - out RTHandle colorTargetHandle, - out RTHandle depthTargetHandle) - { - ref var cameraTargetDescriptor = ref cameraData.cameraTargetDescriptor; - - var colorDescriptor = cameraTargetDescriptor; - colorDescriptor.depthStencilFormat = GraphicsFormat.None; - m_ColorBufferSystem.SetCameraSettings(colorDescriptor, colorTextureFilterMode); - - if (cameraData.renderType == CameraRenderType.Base) - { - m_CreateColorTexture = renderPassInputs.requiresColorTexture; - m_CreateDepthTexture = renderPassInputs.requiresDepthTexture; - m_CreateColorTexture |= forceCreateColorTexture; - - // RTHandles do not support combining color and depth in the same texture so we create them separately - m_CreateDepthTexture |= createColorTexture; - - if (createColorTexture) - { - if (m_ColorBufferSystem.PeekBackBuffer() == null || m_ColorBufferSystem.PeekBackBuffer().nameID != BuiltinRenderTextureType.CameraTarget) - { - m_ColorTextureHandle = m_ColorBufferSystem.GetBackBuffer(cmd); - cmd.SetGlobalTexture("_CameraColorTexture", m_ColorTextureHandle.nameID); - //Set _AfterPostProcessTexture, users might still rely on this although it is now always the cameratarget due to swapbuffer - cmd.SetGlobalTexture("_AfterPostProcessTexture", m_ColorTextureHandle.nameID); - } - - m_ColorTextureHandle = m_ColorBufferSystem.PeekBackBuffer(); - } - - if (createDepthTexture) - { - var depthDescriptor = cameraTargetDescriptor; - depthDescriptor.colorFormat = RenderTextureFormat.Depth; - depthDescriptor.depthStencilFormat = CoreUtils.GetDefaultDepthStencilFormat(); - if (!cameraData.resolveFinalTarget && m_UseDepthStencilBuffer) - depthDescriptor.bindMS = depthDescriptor.msaaSamples > 1 && !SystemInfo.supportsMultisampleAutoResolve && (SystemInfo.supportsMultisampledTextures != 0); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_DepthTextureHandle, depthDescriptor, FilterMode.Point, wrapMode: TextureWrapMode.Clamp, name: "_CameraDepthAttachment"); - } - - colorTargetHandle = createColorTexture ? m_ColorTextureHandle : k_CameraTarget; - depthTargetHandle = createDepthTexture ? m_DepthTextureHandle : k_CameraTarget; - } - else // Overlay camera - { - cameraData.baseCamera.TryGetComponent(out var baseCameraData); - var baseRenderer = (Renderer2D)baseCameraData.scriptableRenderer; - - if (m_ColorBufferSystem != baseRenderer.m_ColorBufferSystem) - { - m_ColorBufferSystem.Dispose(); - m_ColorBufferSystem = baseRenderer.m_ColorBufferSystem; - } - - // These render textures are created by the base camera, but it's the responsibility of the last overlay camera's ScriptableRenderer - // to release the textures in its FinishRendering(). - m_CreateColorTexture = true; - m_CreateDepthTexture = true; - - m_ColorTextureHandle = baseRenderer.m_ColorTextureHandle; - m_DepthTextureHandle = baseRenderer.m_DepthTextureHandle; - - colorTargetHandle = m_ColorTextureHandle; - depthTargetHandle = m_DepthTextureHandle; - } - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Setup(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalPostProcessingData postProcessingData = frameData.Get(); - - ref var cameraTargetDescriptor = ref cameraData.cameraTargetDescriptor; - bool stackHasPostProcess = postProcessingData.isEnabled && m_PostProcessPasses.isCreated; - bool hasPostProcess = cameraData.postProcessEnabled && m_PostProcessPasses.isCreated; - bool lastCameraInStack = cameraData.resolveFinalTarget; - var colorTextureFilterMode = FilterMode.Bilinear; - - PixelPerfectCamera ppc = null; - bool ppcUsesOffscreenRT = false; - bool ppcUpscaleRT = false; - - if (DebugHandler != null) - { -#if UNITY_EDITOR - UnityEditorInternal.SpriteMaskUtility.EnableDebugMode(DebugHandler.DebugDisplaySettings.materialSettings.materialDebugMode == DebugMaterialMode.SpriteMask); -#endif - if (DebugHandler.AreAnySettingsActive) - { - stackHasPostProcess = stackHasPostProcess && DebugHandler.IsPostProcessingAllowed; - hasPostProcess = hasPostProcess && DebugHandler.IsPostProcessingAllowed; - } - DebugHandler.Setup(universalRenderingData.commandBuffer, cameraData.isPreviewCamera); - - if (DebugHandler.IsActiveForCamera(cameraData.isPreviewCamera)) - { - if (DebugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget)) - { - RenderTextureDescriptor descriptor = cameraData.cameraTargetDescriptor; - DebugHandler.ConfigureColorDescriptorForDebugScreen(ref descriptor, cameraData.pixelWidth, cameraData.pixelHeight); - RenderingUtils.ReAllocateHandleIfNeeded(ref DebugHandler.DebugScreenColorHandle, descriptor, name: "_DebugScreenColor"); - - RenderTextureDescriptor depthDesc = cameraData.cameraTargetDescriptor; - DebugHandler.ConfigureDepthDescriptorForDebugScreen(ref depthDesc, CoreUtils.GetDefaultDepthStencilFormat(), cameraData.pixelWidth, cameraData.pixelHeight); - RenderingUtils.ReAllocateHandleIfNeeded(ref DebugHandler.DebugScreenDepthHandle, depthDesc, name: "_DebugScreenDepth"); - } - - if (DebugHandler.HDRDebugViewIsActive(cameraData.resolveFinalTarget)) - { - DebugHandler.hdrDebugViewPass.Setup(cameraData, DebugHandler.DebugDisplaySettings.lightingSettings.hdrDebugMode); - EnqueuePass(DebugHandler.hdrDebugViewPass); - } - } - } - -#if UNITY_EDITOR - // The scene view camera cannot be uninitialized or skybox when using the 2D renderer. - if (cameraData.cameraType == CameraType.SceneView) - { - cameraData.camera.clearFlags = CameraClearFlags.SolidColor; - } -#endif - - // Pixel Perfect Camera doesn't support camera stacking. - if (cameraData.renderType == CameraRenderType.Base && lastCameraInStack) - { - cameraData.camera.TryGetComponent(out ppc); - if (ppc != null && ppc.enabled) - { - if (ppc.offscreenRTSize != Vector2Int.zero) - { - ppcUsesOffscreenRT = true; - - // Pixel Perfect Camera may request a different RT size than camera VP size. - // In that case we need to modify cameraTargetDescriptor here so that all the passes would use the same size. - cameraTargetDescriptor.width = ppc.offscreenRTSize.x; - cameraTargetDescriptor.height = ppc.offscreenRTSize.y; - - // If using FullScreenRenderPass with Pixel Perfect, we need to reallocate the size of the RT used - var fullScreenRenderPass = activeRenderPassQueue.Find(x => x is FullScreenPassRendererFeature.FullScreenRenderPass) as FullScreenPassRendererFeature.FullScreenRenderPass; - fullScreenRenderPass?.ReAllocate(cameraTargetDescriptor); - } - - colorTextureFilterMode = FilterMode.Point; - ppcUpscaleRT = ppc.gridSnapping == PixelPerfectCamera.GridSnapping.UpscaleRenderTexture || ppc.requiresUpscalePass; - } - } - - RenderPassInputSummary renderPassInputs = GetRenderPassInputs(); - - RTHandle colorTargetHandle; - RTHandle depthTargetHandle; - - var cmd = universalRenderingData.commandBuffer; - - using (new ProfilingScope(cmd, m_ProfilingSampler)) - { - CreateRenderTextures(ref renderPassInputs, cmd, cameraData, ppcUsesOffscreenRT, colorTextureFilterMode, - out colorTargetHandle, out depthTargetHandle); - } - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - ConfigureCameraTarget(colorTargetHandle, depthTargetHandle); - - if (hasPostProcess) - { - colorGradingLutPass.ConfigureDescriptor(in postProcessingData, out var desc, out var filterMode); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_PostProcessPasses.m_ColorGradingLut, desc, filterMode, TextureWrapMode.Clamp, name: "_InternalGradingLut"); - colorGradingLutPass.Setup(colorGradingLutHandle); - EnqueuePass(colorGradingLutPass); - } - - m_Render2DLightingPass.Setup(renderPassInputs.requiresDepthTexture || m_UseDepthStencilBuffer); - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - m_Render2DLightingPass.ConfigureTarget(colorTargetHandle, depthTargetHandle); -#pragma warning restore CS0618 - EnqueuePass(m_Render2DLightingPass); - - bool shouldRenderUI = cameraData.rendersOverlayUI; - bool outputToHDR = cameraData.isHDROutputActive; - if (shouldRenderUI && outputToHDR) - { - m_DrawOffscreenUIPass.Setup(cameraData, CoreUtils.GetDefaultDepthStencilFormat()); - EnqueuePass(m_DrawOffscreenUIPass); - } - - // TODO: Investigate how to make FXAA work with HDR output. - bool isFXAAEnabled = cameraData.antialiasing == AntialiasingMode.FastApproximateAntialiasing && !outputToHDR; - - // When using Upscale Render Texture on a Pixel Perfect Camera, we want all post-processing effects done with a low-res RT, - // and only upscale the low-res RT to fullscreen when blitting it to camera target. Also, final post processing pass is not run in this case, - // so FXAA is not supported (you don't want to apply FXAA when everything is intentionally pixelated). - bool requireFinalPostProcessPass = - lastCameraInStack && !ppcUpscaleRT && stackHasPostProcess && isFXAAEnabled; - - bool hasPassesAfterPostProcessing = activeRenderPassQueue.Find(x => x.renderPassEvent == RenderPassEvent.AfterRenderingPostProcessing) != null; - bool needsColorEncoding = DebugHandler == null || !DebugHandler.HDRDebugViewIsActive(cameraData.resolveFinalTarget); - - // Don't resolve during post processing if there are passes after or pixel perfect camera is used - bool pixelPerfectCameraEnabled = ppc != null && ppc.enabled; - bool hasCaptureActions = cameraData.captureActions != null && lastCameraInStack; - bool resolvePostProcessingToCameraTarget = lastCameraInStack && !hasCaptureActions && !hasPassesAfterPostProcessing && !requireFinalPostProcessPass && !pixelPerfectCameraEnabled; - bool doSRGBEncoding = resolvePostProcessingToCameraTarget && needsColorEncoding; - - if (hasPostProcess) - { - var desc = CompatibilityMode.PostProcessPass.GetCompatibleDescriptor(cameraTargetDescriptor, cameraTargetDescriptor.width, cameraTargetDescriptor.height, cameraTargetDescriptor.graphicsFormat); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_PostProcessPasses.m_AfterPostProcessColor, desc, FilterMode.Point, TextureWrapMode.Clamp, name: "_AfterPostProcessTexture"); - - postProcessPass.Setup( - cameraTargetDescriptor, - colorTargetHandle, - resolvePostProcessingToCameraTarget, - depthTargetHandle, - colorGradingLutHandle, - null, - requireFinalPostProcessPass, - doSRGBEncoding); - - EnqueuePass(postProcessPass); - } - - RTHandle finalTargetHandle = colorTargetHandle; - - if (pixelPerfectCameraEnabled && ppc.cropFrame != PixelPerfectCamera.CropFrame.None) - { - EnqueuePass(m_PixelPerfectBackgroundPass); - - // Queue PixelPerfect UpscalePass. Only used when using the Stretch Fill option - if (ppc.requiresUpscalePass) - { - int upscaleWidth = ppc.refResolutionX * ppc.pixelRatio; - int upscaleHeight = ppc.refResolutionY * ppc.pixelRatio; - - m_UpscalePass.Setup(colorTargetHandle, upscaleWidth, upscaleHeight, ppc.finalBlitFilterMode, cameraData.cameraTargetDescriptor, out finalTargetHandle); - EnqueuePass(m_UpscalePass); - } - } - - if (requireFinalPostProcessPass) - { - finalPostProcessPass.SetupFinalPass(finalTargetHandle, hasPassesAfterPostProcessing, needsColorEncoding); - EnqueuePass(finalPostProcessPass); - } - - // If post-processing then we already resolved to camera target while doing post. - // Also only do final blit if camera is not rendering to RT. - bool cameraTargetResolved = - // final PP always blit to camera target - requireFinalPostProcessPass || - // no final PP but we have PP stack. In that case it blit unless there are render pass after PP or pixel perfect camera is used - (hasPostProcess && !hasPassesAfterPostProcessing && !hasCaptureActions && !pixelPerfectCameraEnabled) || - // offscreen camera rendering to a texture, we don't need a blit pass to resolve to screen - colorTargetHandle.nameID == k_CameraTarget.nameID; - - if (!cameraTargetResolved) - { - m_FinalBlitPass.Setup(cameraTargetDescriptor, finalTargetHandle); - EnqueuePass(m_FinalBlitPass); - } - - // We can explicitely render the overlay UI from URP when HDR output is not enabled. - // SupportedRenderingFeatures.active.rendersUIOverlay should also be set to true. - if (shouldRenderUI && cameraData.isLastBaseCamera && !outputToHDR) - { - EnqueuePass(m_DrawOverlayUIPass); - } - - // The editor scene view still relies on some builtin passes (i.e. drawing the scene grid). The builtin - // passes are not explicitly setting RTs and rely on the last active render target being set. - // TODO: this will go away once we remove the builtin dependencies and implement the grid in SRP. -#if UNITY_EDITOR - bool isSceneViewOrPreviewCamera = cameraData.isSceneViewCamera || cameraData.isPreviewCamera; - bool isGizmosEnabled = UnityEditor.Handles.ShouldRenderGizmos(); - if (isSceneViewOrPreviewCamera || (isGizmosEnabled && lastCameraInStack)) - { - EnqueuePass(m_SetEditorTargetPass); - } -#endif - } - - internal override void SwapColorBuffer(CommandBuffer cmd) - { - m_ColorBufferSystem.Swap(); - - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - //Check if we are using the depth that is attached to color buffer - if (m_DepthTextureHandle.nameID != BuiltinRenderTextureType.CameraTarget) - ConfigureCameraTarget(m_ColorBufferSystem.GetBackBuffer(cmd), m_DepthTextureHandle); - else - ConfigureCameraColorTarget(m_ColorBufferSystem.GetBackBuffer(cmd)); -#pragma warning restore CS0618 - - m_ColorTextureHandle = m_ColorBufferSystem.GetBackBuffer(cmd); - cmd.SetGlobalTexture("_CameraColorTexture", m_ColorTextureHandle.nameID); - //Set _AfterPostProcessTexture, users might still rely on this although it is now always the cameratarget due to swapbuffer - cmd.SetGlobalTexture("_AfterPostProcessTexture", m_ColorTextureHandle.nameID); - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal override RTHandle GetCameraColorFrontBuffer(CommandBuffer cmd) - { - return m_ColorBufferSystem.GetFrontBuffer(cmd); - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal override RTHandle GetCameraColorBackBuffer(CommandBuffer cmd) - { - return m_ColorBufferSystem.GetBackBuffer(cmd); - } - - internal override void EnableSwapBufferMSAA(bool enable) - { - m_ColorBufferSystem.EnableMSAA(enable); - } - } - -#if UNITY_EDITOR - internal class SetEditorTargetPass : ScriptableRenderPass - { - public SetEditorTargetPass(RenderPassEvent evt) - { - renderPassEvent = evt; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete + " #from(6000.0)")] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - renderingData.commandBuffer.SetRenderTarget(k_CameraTarget, - RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, // color - RenderBufferLoadAction.Load, RenderBufferStoreAction.DontCare); // depth - } - } -#endif -} -#endif // URP_COMPATIBILITY_MODE diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs.meta deleted file mode 100644 index 06d2252e47f..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 2c8841d47fff7714cb6671d40620dea6 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2DData.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2DData.cs index 1530a003689..63beab007f1 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2DData.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2DData.cs @@ -105,11 +105,6 @@ internal void Dispose() { UnityEngine.RenderAs2DUtil.DisposeCanRenderAs2D(); -#if URP_COMPATIBILITY_MODE - for (var i = 0; i < m_LightBlendStyles.Length; ++i) - m_LightBlendStyles[i].renderTargetHandle?.Release(); -#endif - foreach(var mat in lightMaterials) CoreUtils.Destroy(mat.Value); @@ -130,14 +125,6 @@ protected override void OnEnable() { base.OnEnable(); -#if URP_COMPATIBILITY_MODE - for (var i = 0; i < m_LightBlendStyles.Length; ++i) - { - m_LightBlendStyles[i].renderTargetHandleId = Shader.PropertyToID($"_ShapeLightTexture{i}"); - m_LightBlendStyles[i].renderTargetHandle = RTHandles.Alloc(m_LightBlendStyles[i].renderTargetHandleId, $"_ShapeLightTexture{i}"); - } -#endif - geometrySelfShadowMaterial = null; geometryUnshadowMaterial = null; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/CopyCameraSortingLayerPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/CopyCameraSortingLayerPass.cs index 08b5a7109a3..57bfad80571 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/CopyCameraSortingLayerPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/CopyCameraSortingLayerPass.cs @@ -19,14 +19,6 @@ public CopyCameraSortingLayerPass(Material blitMaterial) m_BlitMaterial = blitMaterial; } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - throw new NotImplementedException(); - } -#endif - public static void ConfigureDescriptor(Downsampling downsamplingMethod, ref RenderTextureDescriptor descriptor, out FilterMode filterMode) { descriptor.msaaSamples = 1; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs index 27004c3fca4..6ef2abb06e7 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawLight2DPass.cs @@ -46,13 +46,6 @@ static bool TryGetShadowIndex(ref LayerBatch layerBatch, int lightIndex, out int return false; } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - throw new NotImplementedException(); - } -#endif private static void Execute(RasterCommandBuffer cmd, PassData passData, LayerBatch layerBatch, int lightTextureIndex) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs index 75c9d1dcc5c..59fda26b1a5 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs @@ -16,14 +16,6 @@ private class PassData internal RendererListHandle rendererList; } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - throw new NotImplementedException(); - } -#endif - private static void Execute(RasterCommandBuffer cmd, PassData passData) { cmd.DrawRendererList(passData.rendererList); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs index a5e3fda5bc1..28ef30c7e54 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs @@ -21,14 +21,6 @@ internal class DrawRenderer2DPass : ScriptableRenderPass private static readonly int k_HDREmulationScaleID = Shader.PropertyToID("_HDREmulationScale"); private static readonly int k_RendererColorID = Shader.PropertyToID("_RendererColor"); -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - throw new NotImplementedException(); - } -#endif - private static void Execute(RasterGraphContext context, PassData passData) { var cmd = context.cmd; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawShadow2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawShadow2DPass.cs index 6f40725b88a..60a55054b95 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawShadow2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawShadow2DPass.cs @@ -14,14 +14,6 @@ internal class DrawShadow2DPass : ScriptableRenderPass private static readonly ProfilingSampler m_ProfilingSampler = new ProfilingSampler(k_ShadowPass); private static readonly ProfilingSampler m_ProfilingSamplerVolume = new ProfilingSampler(k_ShadowVolumetricPass); -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - throw new NotImplementedException(); - } -#endif - private static void ExecuteShadowPass(UnsafeCommandBuffer cmd, PassData passData, Light2D light, int batchIndex) { cmd.SetRenderTarget(passData.shadowTextures[batchIndex], passData.shadowDepth); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs index 2c83a522ae3..3f721a5ad5a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs @@ -141,10 +141,6 @@ public Renderer2D(Renderer2DData data) : base(data) XRSystem.Initialize(XRPassUniversal.Create, xrResources.xrOcclusionMeshPS, xrResources.xrMirrorViewPS); } #endif - -#if URP_COMPATIBILITY_MODE - InitializeCompatibilityMode(data); -#endif } private bool IsPixelPerfectCameraEnabled(UniversalCameraData cameraData) @@ -1011,11 +1007,6 @@ public Renderer2DData GetRenderer2DData() protected override void Dispose(bool disposing) { CleanupRenderGraphResources(); - -#if URP_COMPATIBILITY_MODE - CleanupCompatibilityModeResources(); -#endif - base.Dispose(disposing); } @@ -1058,7 +1049,5 @@ internal static bool supportsMRT { get => !IsGLESDevice(); } - - internal override bool supportsNativeRenderPassRendergraphCompiler => true; } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/UpscalePass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/UpscalePass.cs index 21c0948f2c1..1ffbaa1eb5a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/UpscalePass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/UpscalePass.cs @@ -44,17 +44,6 @@ public void Dispose() destination?.Release(); } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cmd = renderingData.commandBuffer; - cmd.SetRenderTarget(destination); - - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(cmd), source); - } -#endif - private static void ExecutePass(RasterCommandBuffer cmd, RTHandle source) { using (new ProfilingScope(cmd, m_ExecuteProfilingSampler)) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Shadows/ShadowRendering.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Shadows/ShadowRendering.cs index b01239683fb..956720c6362 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Shadows/ShadowRendering.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Shadows/ShadowRendering.cs @@ -45,36 +45,6 @@ internal enum ShadowTestType private static readonly Color k_ShadowColorLookup = new Color(0, 0, 1, 0); private static readonly Color k_UnshadowColorLookup = new Color(0, 1, 0, 0); -#if URP_COMPATIBILITY_MODE - private static RTHandle[] m_RenderTargets = null; - private static int[] m_RenderTargetIds = null; - private static RenderTargetIdentifier[] m_LightInputTextures = null; - private static readonly ProfilingSampler[] m_ProfilingSamplerShadowColorsLookup = new ProfilingSampler[4] { m_ProfilingSamplerShadowsA, m_ProfilingSamplerShadowsB, m_ProfilingSamplerShadowsG, m_ProfilingSamplerShadowsR }; - - public static uint maxTextureCount { get; private set; } - public static RenderTargetIdentifier[] lightInputTextures { get { return m_LightInputTextures; } } - internal static void InitializeBudget(uint maxTextureCount) - { - if (m_RenderTargets == null || m_RenderTargets.Length != maxTextureCount) - { - m_RenderTargets = new RTHandle[maxTextureCount]; - m_RenderTargetIds = new int[maxTextureCount]; - ShadowRendering.maxTextureCount = maxTextureCount; - - for (int i = 0; i < maxTextureCount; i++) - { - m_RenderTargetIds[i] = Shader.PropertyToID($"ShadowTex_{i}"); - m_RenderTargets[i] = RTHandles.Alloc(m_RenderTargetIds[i], $"ShadowTex_{i}"); - } - } - - if (m_LightInputTextures == null || m_LightInputTextures.Length != maxTextureCount) - { - m_LightInputTextures = new RenderTargetIdentifier[maxTextureCount]; - } - } -#endif - private static Material CreateMaterial(Shader shader, int offset, int pass) { Material material = CoreUtils.CreateEngineMaterial(shader); @@ -278,53 +248,6 @@ internal static void PrerenderShadows(UnsafeCommandBuffer cmdBuffer, Renderer2DD RenderShadows(cmdBuffer, rendererData, ref layer, light); } -#if URP_COMPATIBILITY_MODE - private static void CreateShadowRenderTexture(IRenderPass2D pass, RenderingData renderingData, CommandBuffer cmdBuffer, int shadowIndex) - { - CreateShadowRenderTexture(pass, m_RenderTargetIds[shadowIndex], renderingData, cmdBuffer); - } - - internal static bool PrerenderShadows(this IRenderPass2D pass, RenderingData renderingData, CommandBuffer cmdBuffer, ref LayerBatch layer, Light2D light, int shadowIndex, float shadowIntensity) - { - ShadowRendering.CreateShadowRenderTexture(pass, renderingData, cmdBuffer, shadowIndex); - - bool hadShadowsToRender = layer.shadowCasters.Count != 0; - - if (hadShadowsToRender) - { - cmdBuffer.SetRenderTarget(m_RenderTargets[shadowIndex].nameID, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare); - cmdBuffer.ClearRenderTarget(RTClearFlags.All, Color.clear, 1, 0); - RenderShadows(CommandBufferHelpers.GetUnsafeCommandBuffer(cmdBuffer), pass.rendererData, ref layer, light); - } - - m_LightInputTextures[shadowIndex] = m_RenderTargets[shadowIndex].nameID; - - return hadShadowsToRender; - } - - private static void CreateShadowRenderTexture(IRenderPass2D pass, int handleId, RenderingData renderingData, CommandBuffer cmdBuffer) - { - var renderTextureScale = Mathf.Clamp(pass.rendererData.lightRenderTextureScale, 0.01f, 1.0f); - var width = (int)(renderingData.cameraData.cameraTargetDescriptor.width * renderTextureScale); - var height = (int)(renderingData.cameraData.cameraTargetDescriptor.height * renderTextureScale); - - var descriptor = new RenderTextureDescriptor(width, height); - descriptor.useMipMap = false; - descriptor.autoGenerateMips = false; - descriptor.depthStencilFormat = GraphicsFormatUtility.GetDepthStencilFormat(24); - descriptor.graphicsFormat = GraphicsFormat.B10G11R11_UFloatPack32; - descriptor.msaaSamples = 1; - descriptor.dimension = TextureDimension.Tex2D; - - cmdBuffer.GetTemporaryRT(handleId, descriptor, FilterMode.Bilinear); - } - - internal static void ReleaseShadowRenderTexture(CommandBuffer cmdBuffer, int shadowIndex) - { - cmdBuffer.ReleaseTemporaryRT(m_RenderTargetIds[shadowIndex]); - } -#endif - private static void SetShadowProjectionGlobals(UnsafeCommandBuffer cmdBuffer, ShadowCaster2D shadowCaster, Light2D light) { cmdBuffer.SetGlobalVector(k_ShadowModelScaleID, shadowCaster.m_CachedLossyScale); @@ -338,17 +261,6 @@ private static void SetShadowProjectionGlobals(UnsafeCommandBuffer cmdBuffer, Sh cmdBuffer.SetGlobalFloat(k_ShadowContractionDistanceID, 0f); } -#if URP_COMPATIBILITY_MODE - internal static void SetGlobalShadowTexture(CommandBuffer cmdBuffer, Light2D light, int shadowIndex) - { - var textureIndex = shadowIndex; - - cmdBuffer.SetGlobalTexture("_ShadowTex", m_LightInputTextures[textureIndex]); - cmdBuffer.SetGlobalColor(k_ShadowShadowColorID, k_ShadowColorLookup); - cmdBuffer.SetGlobalColor(k_ShadowUnshadowColorID, k_UnshadowColorLookup); - } -#endif - internal static void SetGlobalShadowProp(IRasterCommandBuffer cmdBuffer) { cmdBuffer.SetGlobalColor(k_ShadowShadowColorID, k_ShadowColorLookup); @@ -358,9 +270,9 @@ internal static void SetGlobalShadowProp(IRasterCommandBuffer cmdBuffer) static bool ShadowCasterIsVisible(ShadowCaster2D shadowCaster) { #if UNITY_EDITOR - return SceneVisibilityManager.instance == null ? true : !SceneVisibilityManager.instance.IsHidden(shadowCaster.gameObject); + return SceneVisibilityManager.instance == null || !SceneVisibilityManager.instance.IsHidden(shadowCaster.gameObject); #else - return true; + return true; #endif } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs index a8e53d0a0bc..05c90eb8f21 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Data/UniversalRenderPipelineAsset.cs @@ -420,28 +420,6 @@ public enum ShEvalMode PerPixel = 3, } -#if URP_COMPATIBILITY_MODE - internal struct DeprecationMessage - { - internal const string CompatibilityScriptingAPIObsolete = "This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead."; - internal const string CompatibilityScriptingAPIObsoleteFrom2023_3 = CompatibilityScriptingAPIObsolete + " #from(2023.3)"; - internal const string CompatibilityScriptingAPIConsoleWarning = "Your project uses Compatibility Mode, which disables the render graph system. Compatibility Mode is deprecated. Migrate your ScriptableRenderPasses to the Render Graph API instead. After you migrate, go to Edit > Project Settings > Player and remove the URP_COMPATIBILITY_MODE define from the Scripting Define Symbols. If you don't remove the define, build time and build size are slightly increased."; - } -#endif - -#if UNITY_EDITOR && URP_COMPATIBILITY_MODE - internal class WarnUsingNonRenderGraph - { - [InitializeOnLoadMethod] - internal static void EmitConsoleWarning() - { - RenderGraphSettings rgs = GraphicsSettings.GetRenderPipelineSettings(); - if (rgs != null && rgs.enableRenderCompatibilityMode) - Debug.LogWarning(DeprecationMessage.CompatibilityScriptingAPIConsoleWarning); - } - } -#endif - /// /// The asset that contains the URP setting. /// You can use this asset as a graphics quality level. @@ -1619,30 +1597,6 @@ public bool useSRPBatcher set => m_UseSRPBatcher = value; } - /// - /// Controls whether the RenderGraph render path is enabled. - /// - [Obsolete("This has been deprecated, please use GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode instead. #from(2023.3)")] - public bool enableRenderGraph -#if URP_COMPATIBILITY_MODE - { - get - { - if (GraphicsSettings.TryGetRenderPipelineSettings(out var renderGraphSettings)) - return !renderGraphSettings.enableRenderCompatibilityMode; - - return false; - } - } -#else - => true; -#endif - - internal void OnEnableRenderGraphChanged() - { - OnValidate(); - } - /// /// Returns the selected ColorGradingMode in the URP Asset. /// diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Debug/DebugHandler.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Debug/DebugHandler.cs index 69c30e129fb..2b4447ef24b 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Debug/DebugHandler.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Debug/DebugHandler.cs @@ -558,19 +558,6 @@ internal void Render(RenderGraph renderGraph, UniversalCameraData cameraData, Te } #region DebugRendererLists - - internal DebugRendererLists CreateRendererListsWithDebugRenderState( - ScriptableRenderContext context, - ref CullingResults cullResults, - ref DrawingSettings drawingSettings, - ref FilteringSettings filteringSettings, - ref RenderStateBlock renderStateBlock) - { - DebugRendererLists debug = new DebugRendererLists(this, filteringSettings); - debug.CreateRendererListsWithDebugRenderState(context, ref cullResults, ref drawingSettings, ref filteringSettings, ref renderStateBlock); - return debug; - } - internal DebugRendererLists CreateRendererListsWithDebugRenderState( RenderGraph renderGraph, ref CullingResults cullResults, @@ -619,24 +606,6 @@ void DisposeDebugRenderLists() m_ActiveDebugRendererListHdl.Clear(); } - internal void CreateRendererListsWithDebugRenderState( - ScriptableRenderContext context, - ref CullingResults cullResults, - ref DrawingSettings drawingSettings, - ref FilteringSettings filteringSettings, - ref RenderStateBlock renderStateBlock) - { - CreateDebugRenderSetups(filteringSettings); - foreach (DebugRenderSetup debugRenderSetup in m_DebugRenderSetups) - { - DrawingSettings debugDrawingSettings = debugRenderSetup.CreateDrawingSettings(drawingSettings); - RenderStateBlock debugRenderStateBlock = debugRenderSetup.GetRenderStateBlock(renderStateBlock); - RendererList rendererList = new RendererList(); - RenderingUtils.CreateRendererListWithRenderStateBlock(context, ref cullResults, debugDrawingSettings, filteringSettings, debugRenderStateBlock, ref rendererList); - m_ActiveDebugRendererList.Add((rendererList)); - } - } - internal void CreateRendererListsWithDebugRenderState( RenderGraph renderGraph, ref CullingResults cullResults, diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Debug/DebugRenderSetup.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Debug/DebugRenderSetup.cs index 5afa086f4ad..19e3914c399 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Debug/DebugRenderSetup.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Debug/DebugRenderSetup.cs @@ -72,17 +72,6 @@ internal DebugRenderSetup(DebugHandler debugHandler, m_Index = index; } - internal void CreateRendererList( - ScriptableRenderContext context, - ref CullingResults cullResults, - ref DrawingSettings drawingSettings, - ref FilteringSettings filteringSettings, - ref RenderStateBlock renderStateBlock, - ref RendererList rendererList) - { - RenderingUtils.CreateRendererListWithRenderStateBlock(context, ref cullResults, drawingSettings, filteringSettings, renderStateBlock, ref rendererList); - } - internal void CreateRendererList( RenderGraph renderGraph, ref CullingResults cullResults, diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DBuffer/DBufferRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DBuffer/DBufferRenderPass.cs index 85ddde3876f..2e3cd33e486 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DBuffer/DBufferRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DBuffer/DBufferRenderPass.cs @@ -28,17 +28,6 @@ internal class DBufferRenderPass : ScriptableRenderPass private TextureHandle[] dbufferHandles; -#if URP_COMPATIBILITY_MODE - private RTHandle m_DBufferDepth; - private Material m_DBufferClear; - private ProfilingSampler m_DBufferClearSampler; - private PassData m_PassData; - - internal RTHandle[] dBufferColorHandles { get; private set; } - internal RTHandle depthHandle { get; private set; } - internal RTHandle dBufferDepth { get => m_DBufferDepth; } -#endif - public DBufferRenderPass(Material dBufferClear, DBufferSettings settings, DecalDrawDBufferSystem drawSystem, bool decalLayers) { renderPassEvent = RenderPassEvent.AfterRenderingPrePasses + 1; @@ -58,133 +47,14 @@ public DBufferRenderPass(Material dBufferClear, DBufferSettings settings, DecalD m_ShaderTagIdList = new List(); m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DBufferMesh)); m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DBufferProjectorVFX)); - -#if URP_COMPATIBILITY_MODE - int dBufferCount = (int)settings.surfaceData + 1; - dBufferColorHandles = new RTHandle[dBufferCount]; - - m_DBufferClear = dBufferClear; - m_DBufferClearSampler = new ProfilingSampler("Clear"); - m_PassData = new PassData(); -#endif - } - -#if URP_COMPATIBILITY_MODE - public void Dispose() - { - m_DBufferDepth?.Release(); - foreach (var handle in dBufferColorHandles) - handle?.Release(); - } - public void Setup(in CameraData cameraData) - { - var depthDesc = cameraData.cameraTargetDescriptor; - depthDesc.graphicsFormat = GraphicsFormat.None; //Depth only rendering - depthDesc.depthStencilFormat = cameraData.cameraTargetDescriptor.depthStencilFormat; - depthDesc.msaaSamples = 1; - - RenderingUtils.ReAllocateHandleIfNeeded(ref m_DBufferDepth, depthDesc, name: s_DBufferDepthName); - - Setup(cameraData, m_DBufferDepth); } - public void Setup(in CameraData cameraData, RTHandle depthTextureHandle) - { - // base - { - var desc = cameraData.cameraTargetDescriptor; - desc.graphicsFormat = QualitySettings.activeColorSpace == ColorSpace.Linear ? GraphicsFormat.R8G8B8A8_SRGB : GraphicsFormat.R8G8B8A8_UNorm; - desc.depthStencilFormat = GraphicsFormat.None; - desc.msaaSamples = 1; - - RenderingUtils.ReAllocateHandleIfNeeded(ref dBufferColorHandles[0], desc, name: s_DBufferNames[0]); - } - - if (m_Settings.surfaceData == DecalSurfaceData.AlbedoNormal || m_Settings.surfaceData == DecalSurfaceData.AlbedoNormalMAOS) - { - var desc = cameraData.cameraTargetDescriptor; - desc.graphicsFormat = GraphicsFormat.R8G8B8A8_UNorm; - desc.depthStencilFormat = GraphicsFormat.None; - desc.msaaSamples = 1; - - RenderingUtils.ReAllocateHandleIfNeeded(ref dBufferColorHandles[1], desc, name: s_DBufferNames[1]); - } - - if (m_Settings.surfaceData == DecalSurfaceData.AlbedoNormalMAOS) - { - var desc = cameraData.cameraTargetDescriptor; - desc.graphicsFormat = GraphicsFormat.R8G8B8A8_UNorm; - desc.depthStencilFormat = GraphicsFormat.None; - desc.msaaSamples = 1; - - RenderingUtils.ReAllocateHandleIfNeeded(ref dBufferColorHandles[2], desc, name: s_DBufferNames[2]); - } - - // depth - depthHandle = depthTextureHandle; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(dBufferColorHandles, depthHandle); - #pragma warning restore CS0618 - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - InitPassData(ref m_PassData); - var cmd = renderingData.commandBuffer; - var passData = m_PassData; - using (new ProfilingScope(cmd, profilingSampler)) - { - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - SetGlobalTextures(renderingData.commandBuffer, m_PassData); - SetKeywords(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData); - - // TODO: This should be replace with mrt clear once we support it - // Clear render targets - using (new ProfilingScope(cmd, m_DBufferClearSampler)) - { - // for alpha compositing, color is cleared to 0, alpha to 1 - // https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch23.html - Blitter.BlitTexture(cmd, passData.dBufferColorHandles[0], new Vector4(1, 1, 0, 0), m_DBufferClear, 0); - } - - UniversalRenderingData universalRenderingData = renderingData.frameData.Get(); - UniversalCameraData cameraData = renderingData.frameData.Get(); - UniversalLightData lightData = renderingData.frameData.Get(); - - var param = InitRendererListParams(universalRenderingData, cameraData, lightData); - var rendererList = context.CreateRendererList(ref param); - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, rendererList, false); - } - } -#endif - private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RendererList rendererList, bool renderGraph) { passData.drawSystem.Execute(cmd); cmd.DrawRendererList(rendererList); } -#if URP_COMPATIBILITY_MODE - private static void SetGlobalTextures(CommandBuffer cmd, PassData passData) - { - var dBufferColorHandles = passData.dBufferColorHandles; - cmd.SetGlobalTexture(dBufferColorHandles[0].name, dBufferColorHandles[0].nameID); - if (passData.settings.surfaceData == DecalSurfaceData.AlbedoNormal || passData.settings.surfaceData == DecalSurfaceData.AlbedoNormalMAOS) - cmd.SetGlobalTexture(dBufferColorHandles[1].name, dBufferColorHandles[1].nameID); - if (passData.settings.surfaceData == DecalSurfaceData.AlbedoNormalMAOS) - cmd.SetGlobalTexture(dBufferColorHandles[2].name, dBufferColorHandles[2].nameID); - } -#endif - private static void SetKeywords(RasterCommandBuffer cmd, PassData passData) { cmd.SetKeyword(ShaderGlobalKeywords.DBufferMRT1, passData.settings.surfaceData == DecalSurfaceData.Albedo); @@ -210,10 +80,6 @@ private void InitPassData(ref PassData passData) passData.drawSystem = m_DrawSystem; passData.settings = m_Settings; passData.decalLayers = m_DecalLayers; -#if URP_COMPATIBILITY_MODE - passData.dBufferDepth = m_DBufferDepth; - passData.dBufferColorHandles = dBufferColorHandles; -#endif } private RendererListParams InitRendererListParams(UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DBuffer/DecalForwardEmissivePass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DBuffer/DecalForwardEmissivePass.cs index e4b6bbd9ec5..48dd314c7a7 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DBuffer/DecalForwardEmissivePass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DBuffer/DecalForwardEmissivePass.cs @@ -17,10 +17,6 @@ internal class DecalForwardEmissivePass : ScriptableRenderPass private List m_ShaderTagIdList; private DecalDrawFowardEmissiveSystem m_DrawSystem; -#if URP_COMPATIBILITY_MODE - private PassData m_PassData; -#endif - public DecalForwardEmissivePass(DecalDrawFowardEmissiveSystem drawSystem) { renderPassEvent = RenderPassEvent.AfterRenderingOpaques; @@ -33,31 +29,7 @@ public DecalForwardEmissivePass(DecalDrawFowardEmissiveSystem drawSystem) m_ShaderTagIdList = new List(); m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalMeshForwardEmissive)); m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalProjectorForwardEmissive)); - -#if URP_COMPATIBILITY_MODE - m_PassData = new PassData(); -#endif - } - -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - InitPassData(ref m_PassData); - - UniversalRenderingData universalRenderingData = renderingData.frameData.Get(); - UniversalCameraData cameraData = renderingData.frameData.Get(); - UniversalLightData lightData = renderingData.frameData.Get(); - - var param = InitRendererListParams(universalRenderingData, cameraData, lightData); - - var rendererList = context.CreateRendererList(ref param); - using (new ProfilingScope(universalRenderingData.commandBuffer, profilingSampler)) - { - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(universalRenderingData.commandBuffer), m_PassData, rendererList); - } } -#endif private class PassData { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DecalPreviewPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DecalPreviewPass.cs index 723bc116aad..8944503ba51 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DecalPreviewPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/DecalPreviewPass.cs @@ -11,10 +11,6 @@ internal class DecalPreviewPass : ScriptableRenderPass private List m_ShaderTagIdList; private ProfilingSampler m_ProfilingSampler; -#if URP_COMPATIBILITY_MODE - private PassData m_PassData; -#endif - public DecalPreviewPass() { renderPassEvent = RenderPassEvent.AfterRenderingOpaques; @@ -25,31 +21,7 @@ public DecalPreviewPass() m_ShaderTagIdList = new List(); m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalScreenSpaceMesh)); - -#if URP_COMPATIBILITY_MODE - m_PassData = new PassData(); -#endif - } - -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalRenderingData universalRenderingData = renderingData.frameData.Get(); - UniversalCameraData cameraData = renderingData.frameData.Get(); - UniversalLightData lightData = renderingData.frameData.Get(); - - - SortingCriteria sortingCriteria = cameraData.defaultOpaqueSortFlags; - DrawingSettings drawingSettings = RenderingUtils.CreateDrawingSettings(m_ShaderTagIdList, universalRenderingData, cameraData, lightData, sortingCriteria); - var param = new RendererListParams(universalRenderingData.cullResults, drawingSettings, m_FilteringSettings); - var rendererList = context.CreateRendererList(ref param); - using (new ProfilingScope(universalRenderingData.commandBuffer, m_ProfilingSampler)) - { - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(universalRenderingData.commandBuffer), m_PassData, rendererList); - } } -#endif private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RendererList rendererList) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs index 39c94cb3206..2de0180c6b3 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs @@ -21,11 +21,6 @@ internal class DecalGBufferRenderPass : ScriptableRenderPass private DeferredLights m_DeferredLights; private bool m_DecalLayers; -#if URP_COMPATIBILITY_MODE - private RTHandle[] m_GbufferAttachments; - private PassData m_PassData; -#endif - public DecalGBufferRenderPass(DecalScreenSpaceSettings settings, DecalDrawGBufferSystem drawSystem, bool decalLayers) { renderPassEvent = RenderPassEvent.AfterRenderingGbuffer; @@ -41,11 +36,6 @@ public DecalGBufferRenderPass(DecalScreenSpaceSettings settings, DecalDrawGBuffe m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalGBufferProjector)); else m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalGBufferMesh)); - -#if URP_COMPATIBILITY_MODE - m_PassData = new PassData(); - m_GbufferAttachments = new RTHandle[4]; -#endif } internal void Setup(DeferredLights deferredLights) @@ -53,85 +43,6 @@ internal void Setup(DeferredLights deferredLights) m_DeferredLights = deferredLights; } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - if (m_DeferredLights.UseFramebufferFetch) - { - m_GbufferAttachments[0] = m_DeferredLights.GbufferAttachments[0]; - m_GbufferAttachments[1] = m_DeferredLights.GbufferAttachments[1]; - m_GbufferAttachments[2] = m_DeferredLights.GbufferAttachments[2]; - m_GbufferAttachments[3] = m_DeferredLights.GbufferAttachments[3]; - - if (m_DecalLayers) - { - var deferredInputAttachments = new RTHandle[] - { - m_DeferredLights.GbufferAttachments[m_DeferredLights.GbufferDepthIndex], - m_DeferredLights.GbufferAttachments[m_DeferredLights.GBufferRenderingLayers], - }; - - var deferredInputIsTransient = new bool[] - { - true, false, // TODO: Make rendering layers transient - }; - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureInputAttachments(deferredInputAttachments, deferredInputIsTransient); - #pragma warning restore CS0618 - } - else - { - var deferredInputAttachments = new RTHandle[] - { - m_DeferredLights.GbufferAttachments[m_DeferredLights.GbufferDepthIndex], - }; - - var deferredInputIsTransient = new bool[] - { - true, - }; - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureInputAttachments(deferredInputAttachments, deferredInputIsTransient); - #pragma warning restore CS0618 - } - } - else - { - m_GbufferAttachments[0] = m_DeferredLights.GbufferAttachments[0]; - m_GbufferAttachments[1] = m_DeferredLights.GbufferAttachments[1]; - m_GbufferAttachments[2] = m_DeferredLights.GbufferAttachments[2]; - m_GbufferAttachments[3] = m_DeferredLights.GbufferAttachments[3]; - } - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(m_GbufferAttachments, m_DeferredLights.DepthAttachmentHandle); - #pragma warning restore CS0618 - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - - InitPassData(cameraData, ref m_PassData); - - SortingCriteria sortingCriteria = renderingData.cameraData.defaultOpaqueSortFlags; - DrawingSettings drawingSettings = RenderingUtils.CreateDrawingSettings(m_ShaderTagIdList, ref renderingData, sortingCriteria); - var param = new RendererListParams(renderingData.cullResults, drawingSettings, m_FilteringSettings); - var rendererList = context.CreateRendererList(ref param); - using (new ProfilingScope(renderingData.commandBuffer, profilingSampler)) - { - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, rendererList); - } - } -#endif - private class PassData { internal DecalDrawGBufferSystem drawSystem; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs index 05466ccaa7f..dc06896cb13 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs @@ -20,10 +20,6 @@ internal class DecalScreenSpaceRenderPass : ScriptableRenderPass private DecalScreenSpaceSettings m_Settings; private bool m_DecalLayers; -#if URP_COMPATIBILITY_MODE - private PassData m_PassData; -#endif - public DecalScreenSpaceRenderPass(DecalScreenSpaceSettings settings, DecalDrawScreenSpaceSystem drawSystem, bool decalLayers) { renderPassEvent = RenderPassEvent.AfterRenderingSkybox; @@ -43,10 +39,6 @@ public DecalScreenSpaceRenderPass(DecalScreenSpaceSettings settings, DecalDrawSc m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalScreenSpaceProjector)); else m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalScreenSpaceMesh)); - -#if URP_COMPATIBILITY_MODE - m_PassData = new PassData(); -#endif } private RendererListParams CreateRenderListParams(UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData) @@ -56,25 +48,6 @@ private RendererListParams CreateRenderListParams(UniversalRenderingData renderi return new RendererListParams(renderingData.cullResults, drawingSettings, m_FilteringSettings); } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - - InitPassData(cameraData, ref m_PassData); - RenderingUtils.SetScaleBiasRt(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), in renderingData); - UniversalRenderingData universalRenderingData = renderingData.frameData.Get(); - UniversalLightData lightData = renderingData.frameData.Get(); - var param = CreateRenderListParams(universalRenderingData, cameraData, lightData); - var rendererList = context.CreateRendererList(ref param); - using (new ProfilingScope(renderingData.commandBuffer, profilingSampler)) - { - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, rendererList); - } - } -#endif - private class PassData { internal DecalDrawScreenSpaceSystem drawSystem; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs index 8bd9b193969..e08751d6bb2 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Deprecated.cs @@ -14,6 +14,35 @@ public abstract partial class ScriptableRenderPass /// Use this CommandBuffer to cleanup any generated data. [EditorBrowsable(EditorBrowsableState.Never)] public virtual void FrameCleanup(CommandBuffer cmd) => OnCameraCleanup(cmd); + + + /// + /// This method is obsolete. + /// + [Obsolete("This method is obsolete.")] + public virtual void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) + { } + + /// + /// This method is obsolete. + /// + [Obsolete("This method is obsolete.")] + public virtual void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { } + + /// + /// This method is obsolete. + /// + [Obsolete("This method is obsolete.")] + public virtual void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) + { } + + /// + /// This method is obsolete. + /// + [Obsolete("This method is obsolete.")] + public void ConfigureClear(ClearFlag clearFlag, Color clearColor) + { } } namespace Internal @@ -628,570 +657,5 @@ partial class UniversalRenderPipelineGlobalSettings /// [Obsolete("Please use stripRuntimeDebugShaders instead. #from(2023.1)")] public bool supportRuntimeDebugDisplay = false; - - [SerializeField, Obsolete("Keep for migration. #from(2023.2)")] internal bool m_EnableRenderGraph; - } - -#if !URP_COMPATIBILITY_MODE - internal struct DeprecationMessage - { - internal const string CompatibilityScriptingAPIHidden = "This rendering path is for Compatibility Mode only which has been deprecated and hidden behind URP_COMPATIBILITY_MODE define. This will do nothing."; - } - - partial class UniversalCameraData - { - /// - /// Returns the camera GPU projection matrix. This contains platform specific changes to handle y-flip and reverse z. Includes camera jitter if required by active features. - /// Similar to GL.GetGPUProjectionMatrix but queries URP internal state to know if the pipeline is rendering to render texture. - /// For more info on platform differences regarding camera projection check: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html - /// - /// View index in case of stereo rendering. By default viewIndex is set to 0. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public Matrix4x4 GetGPUProjectionMatrix(int viewIndex = 0) => default; - - /// - /// Returns the camera GPU projection matrix. This contains platform specific changes to handle y-flip and reverse z. Does not include any camera jitter. - /// Similar to GL.GetGPUProjectionMatrix but queries URP internal state to know if the pipeline is rendering to render texture. - /// For more info on platform differences regarding camera projection check: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html - /// - /// View index in case of stereo rendering. By default viewIndex is set to 0. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public Matrix4x4 GetGPUProjectionMatrixNoJitter(int viewIndex = 0) => default; - - /// - /// True if the camera device projection matrix is flipped. This happens when the pipeline is rendering - /// to a render texture in non OpenGL platforms. If you are doing a custom Blit pass to copy camera textures - /// (_CameraColorTexture, _CameraDepthAttachment) you need to check this flag to know if you should flip the - /// matrix when rendering with for cmd.Draw* and reading from camera textures. - /// - /// True if the camera device projection matrix is flipped. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public bool IsCameraProjectionMatrixFlipped() => default; - } - - public abstract partial class ScriptableRenderPass - { - /// - /// RTHandle alias for BuiltinRenderTextureType.CameraTarget which is the backbuffer. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public static RTHandle k_CameraTarget = null; - - /// - /// List for the g-buffer attachment handles. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public RTHandle[] colorAttachmentHandles => null; - - /// - /// The main color attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public RTHandle colorAttachmentHandle => null; - - /// - /// The depth attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public RTHandle depthAttachmentHandle => null; - - /// - /// The store actions for Color. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public RenderBufferStoreAction[] colorStoreActions => null; - - /// - /// The store actions for Depth. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public RenderBufferStoreAction depthStoreAction => default; - - /// - /// The flag to use when clearing. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public ClearFlag clearFlag => default; - - /// - /// The color value to use when clearing. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public Color clearColor => default; - - /// - /// Configures the Store Action for a color attachment of this render pass. - /// - /// RenderBufferStoreAction to use - /// Index of the color attachment - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ConfigureColorStoreAction(RenderBufferStoreAction storeAction, uint attachmentIndex = 0) { } - - /// - /// Configures the Store Actions for all the color attachments of this render pass. - /// - /// Array of RenderBufferStoreActions to use - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ConfigureColorStoreActions(RenderBufferStoreAction[] storeActions) { } - - /// - /// Configures the Store Action for the depth attachment of this render pass. - /// - /// RenderBufferStoreAction to use - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ConfigureDepthStoreAction(RenderBufferStoreAction storeAction) { } - - /// - /// Resets render targets to default. - /// This method effectively reset changes done by ConfigureTarget. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ResetTarget() { } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment handle. - /// Depth attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ConfigureTarget(RTHandle colorAttachment, RTHandle depthAttachment) { } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment handle. - /// Depth attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ConfigureTarget(RTHandle[] colorAttachments, RTHandle depthAttachment) { } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ConfigureTarget(RTHandle colorAttachment) { } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ConfigureTarget(RTHandle[] colorAttachments) { } - - /// - /// Configures clearing for the render targets for this render pass. Call this inside Configure. - /// - /// ClearFlag containing information about what targets to clear. - /// Clear color. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ConfigureClear(ClearFlag clearFlag, Color clearColor) { } - - /// - /// This method is called by the renderer before rendering a camera - /// Override this method if you need to to configure render targets and their clear state, and to create temporary render target textures. - /// If a render pass doesn't override this method, this render pass renders to the active Camera's render target. - /// You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear. - /// - /// CommandBuffer to enqueue rendering commands. This will be executed by the pipeline. - /// Current rendering state information - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public virtual void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { } - - /// - /// This method is called by the renderer before executing the render pass. - /// Override this method if you need to to configure render targets and their clear state, and to create temporary render target textures. - /// If a render pass doesn't override this method, this render pass renders to the active Camera's render target. - /// You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear. - /// - /// CommandBuffer to enqueue rendering commands. This will be executed by the pipeline. - /// Render texture descriptor of the camera render target. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public virtual void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { } - - /// - /// Called upon finish rendering a camera stack. You can use this callback to release any resources created - /// by this render pass that need to be cleanup once all cameras in the stack have finished rendering. - /// This method will be called once after rendering the last camera in the camera stack. - /// Cameras that don't have an explicit camera stack are also considered stacked rendering. - /// In that case the Base camera is the first and last camera in the stack. - /// - /// Use this CommandBuffer to cleanup any generated data - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public virtual void OnFinishCameraStackRendering(CommandBuffer cmd) { } - - /// - /// Execute the pass. This is where custom rendering occurs. Specific details are left to the implementation - /// - /// Use this render context to issue any draw commands during execution - /// Current rendering state information - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public virtual void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - - /// - /// Add a blit command to the context for execution. This changes the active render target in the ScriptableRenderer to - /// destination. - /// - /// Command buffer to record command for execution. - /// Source texture or target handle to blit from. - /// Destination texture or target handle to blit into. This becomes the renderer active render target. - /// Material to use. - /// Shader pass to use. Default is 0. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void Blit(CommandBuffer cmd, RTHandle source, RTHandle destination, Material material = null, int passIndex = 0) { } - - /// - /// Add a blit command to the context for execution. This applies the material to the color target. - /// - /// Command buffer to record command for execution. - /// RenderingData to access the active renderer. - /// Material to use. - /// Shader pass to use. Default is 0. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void Blit(CommandBuffer cmd, ref RenderingData data, Material material, int passIndex = 0) { } - - /// - /// Add a blit command to the context for execution. This applies the material to the color target. - /// - /// Command buffer to record command for execution. - /// RenderingData to access the active renderer. - /// Source texture or target identifier to blit from. - /// Material to use. - /// Shader pass to use. Default is 0. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void Blit(CommandBuffer cmd, ref RenderingData data, RTHandle source, Material material, int passIndex = 0) { } - } - -#if ENABLE_VR && ENABLE_XR_MODULE - partial class XROcclusionMeshPass - { - /// - /// Used to indicate if the active target of the pass is the back buffer - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public bool m_IsActiveTargetBackBuffer; - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } -#endif - - partial class DecalRendererFeature - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData) { } - } - - partial class ScriptableRenderer - { - /// - /// Override to provide a custom profiling name - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - protected ProfilingSampler profilingExecute { get; set; } - - /// - /// Set camera matrices. This method will set UNITY_MATRIX_V, UNITY_MATRIX_P, UNITY_MATRIX_VP to the camera matrices. - /// Additionally this will also set unity_CameraProjection and unity_CameraProjection. - /// If setInverseMatrices is set to true this function will also set UNITY_MATRIX_I_V and UNITY_MATRIX_I_VP. - /// This function has no effect when rendering in stereo. When in stereo rendering you cannot override camera matrices. - /// If you need to set general purpose view and projection matrices call instead. - /// - /// CommandBuffer to submit data to GPU. - /// CameraData containing camera matrices information. - /// Set this to true if you also need to set inverse camera matrices. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public static void SetCameraMatrices(CommandBuffer cmd, ref CameraData cameraData, bool setInverseMatrices) { } - - /// - /// Set camera matrices. This method will set UNITY_MATRIX_V, UNITY_MATRIX_P, UNITY_MATRIX_VP to camera matrices. - /// Additionally this will also set unity_CameraProjection and unity_CameraProjection. - /// If setInverseMatrices is set to true this function will also set UNITY_MATRIX_I_V and UNITY_MATRIX_I_VP. - /// This function has no effect when rendering in stereo. When in stereo rendering you cannot override camera matrices. - /// If you need to set general purpose view and projection matrices call instead. - /// - /// CommandBuffer to submit data to GPU. - /// CameraData containing camera matrices information. - /// Set this to true if you also need to set inverse camera matrices. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public static void SetCameraMatrices(CommandBuffer cmd, UniversalCameraData cameraData, bool setInverseMatrices) { } - - /// - /// Returns the camera color target for this renderer. - /// It's only valid to call cameraColorTargetHandle in the scope of ScriptableRenderPass. - /// . - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public RTHandle cameraColorTargetHandle { get => null; set { } } - - /// - /// Returns the camera depth target for this renderer. - /// It's only valid to call cameraDepthTargetHandle in the scope of ScriptableRenderPass. - /// . - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public RTHandle cameraDepthTargetHandle { get => null; set { } } - - /// - /// Configures the camera target. - /// - /// Camera color target. Pass k_CameraTarget if rendering to backbuffer. - /// Camera depth target. Pass k_CameraTarget if color has depth or rendering to backbuffer. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void ConfigureCameraTarget(RTHandle colorTarget, RTHandle depthTarget) { } - - /// - /// Configures the render passes that will execute for this renderer. - /// This method is called per-camera every frame. - /// - /// Use this render context to issue any draw commands during execution. - /// Current render state information. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public virtual void Setup(ScriptableRenderContext context, ref RenderingData renderingData) { } - - /// - /// Override this method to implement the lighting setup for the renderer. You can use this to - /// compute and upload light CBUFFER for example. - /// - /// Use this render context to issue any draw commands during execution. - /// Current render state information. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public virtual void SetupLights(ScriptableRenderContext context, ref RenderingData renderingData) { } - - /// - /// Execute the enqueued render passes. This automatically handles editor and stereo rendering. - /// - /// Use this render context to issue any draw commands during execution. - /// Current render state information. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - - /// - /// Calls Setup for each feature added to this renderer. - /// - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - protected void SetupRenderPasses(in RenderingData renderingData) { } - } - - partial class ScriptableRendererFeature - { - /// - /// Callback after render targets are initialized. This allows for accessing targets from renderer after they are created and ready. - /// - /// Renderer used for adding render passes. - /// Rendering state. Use this to setup render passes. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public virtual void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData) { } - } - - partial struct CameraData - { - /// - /// Returns the camera GPU projection matrix. This contains platform specific changes to handle y-flip and reverse z. Includes camera jitter if required by active features. - /// Similar to GL.GetGPUProjectionMatrix but queries URP internal state to know if the pipeline is rendering to render texture. - /// For more info on platform differences regarding camera projection check: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html - /// - /// View index in case of stereo rendering. By default viewIndex is set to 0. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public Matrix4x4 GetGPUProjectionMatrix(int viewIndex = 0) => default; - - /// - /// Returns the camera GPU projection matrix. This contains platform specific changes to handle y-flip and reverse z. Does not include any camera jitter. - /// Similar to GL.GetGPUProjectionMatrix but queries URP internal state to know if the pipeline is rendering to render texture. - /// For more info on platform differences regarding camera projection check: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html - /// - /// View index in case of stereo rendering. By default viewIndex is set to 0. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public Matrix4x4 GetGPUProjectionMatrixNoJitter(int viewIndex = 0) => default; - - /// - /// True if the camera device projection matrix is flipped. This happens when the pipeline is rendering - /// to a render texture in non OpenGL platforms. If you are doing a custom Blit pass to copy camera textures - /// (_CameraColorTexture, _CameraDepthAttachment) you need to check this flag to know if you should flip the - /// matrix when rendering with for cmd.Draw* and reading from camera textures. - /// - /// True if the camera device projection matrix is flipped. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public bool IsCameraProjectionMatrixFlipped() => default; - } - - namespace Internal - { - partial class AdditionalLightsShadowCasterPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class ColorGradingLutPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class CopyColorPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class CopyDepthPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class DepthNormalOnlyPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class DepthOnlyPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class DrawObjectsPass - { - /// - /// Used to indicate if the active target of the pass is the back buffer - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public bool m_IsActiveTargetBackBuffer; // TODO: Remove this when we remove non-RG path - - /// - /// Sets up the pass. - /// - /// Color attachment handle. - /// Texture used with rendering layers. - /// Depth attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void Setup(RTHandle colorAttachment, RTHandle renderingLayersTexture, RTHandle depthAttachment) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class ForwardLights - { - /// - /// Sets up the keywords and data for forward lighting. - /// - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public void Setup(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class FinalBlitPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class MainLightShadowCasterPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - } - - partial class DrawSkyboxPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class RenderObjectsPass - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { } - } - - partial class UniversalRenderer - { - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void Setup(ScriptableRenderContext context, ref RenderingData renderingData) { } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIHidden)] - public override void SetupLights(ScriptableRenderContext context, ref RenderingData renderingData) { } } -#endif //!URP_COMPATIBILITY_MODE } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/ForwardLights.cs b/Packages/com.unity.render-pipelines.universal/Runtime/ForwardLights.cs index 1e755d75d60..aacb2c9ff08 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/ForwardLights.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/ForwardLights.cs @@ -429,23 +429,6 @@ out m_WordsPerTile } } -#if URP_COMPATIBILITY_MODE - /// - /// Sets up the keywords and data for forward lighting. - /// - /// - /// - public void Setup(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - - SetupLights(CommandBufferHelpers.GetUnsafeCommandBuffer(renderingData.commandBuffer), universalRenderingData, cameraData, lightData); - } -#endif - static ProfilingSampler s_SetupForwardLights = new ProfilingSampler("Setup Forward Lights"); private class SetupLightPassData { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalCameraData.cs b/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalCameraData.cs index 2980025cd09..6f758e37d75 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalCameraData.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalCameraData.cs @@ -121,42 +121,6 @@ internal Matrix4x4 GetProjectionMatrixNoJitter(int viewIndex = 0) #endif return m_ProjectionMatrix; } - -#if URP_COMPATIBILITY_MODE - /// - /// Returns the camera GPU projection matrix. This contains platform specific changes to handle y-flip and reverse z. Includes camera jitter if required by active features. - /// Similar to GL.GetGPUProjectionMatrix but queries URP internal state to know if the pipeline is rendering to render texture. - /// For more info on platform differences regarding camera projection check: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html - /// - /// View index in case of stereo rendering. By default viewIndex is set to 0. - /// - /// - public Matrix4x4 GetGPUProjectionMatrix(int viewIndex = 0) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - // GetGPUProjectionMatrix takes a projection matrix and returns a GfxAPI adjusted version, does not set or get any state. - return m_JitterMatrix * GL.GetGPUProjectionMatrix(GetProjectionMatrixNoJitter(viewIndex), IsCameraProjectionMatrixFlipped()); - #pragma warning restore CS0618 - } - - /// - /// Returns the camera GPU projection matrix. This contains platform specific changes to handle y-flip and reverse z. Does not include any camera jitter. - /// Similar to GL.GetGPUProjectionMatrix but queries URP internal state to know if the pipeline is rendering to render texture. - /// For more info on platform differences regarding camera projection check: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html - /// - /// View index in case of stereo rendering. By default viewIndex is set to 0. - /// - /// - public Matrix4x4 GetGPUProjectionMatrixNoJitter(int viewIndex = 0) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - // GetGPUProjectionMatrix takes a projection matrix and returns a GfxAPI adjusted version, does not set or get any state. - return GL.GetGPUProjectionMatrix(GetProjectionMatrixNoJitter(viewIndex), IsCameraProjectionMatrixFlipped()); - #pragma warning restore CS0618 - } -#endif internal Matrix4x4 GetGPUProjectionMatrix(bool renderIntoTexture, int viewIndex = 0) { @@ -421,33 +385,6 @@ public bool IsHandleYFlipped(RTHandle handle) #endif return !isBackbuffer; } - -#if URP_COMPATIBILITY_MODE - /// - /// True if the camera device projection matrix is flipped. This happens when the pipeline is rendering - /// to a render texture in non OpenGL platforms. If you are doing a custom Blit pass to copy camera textures - /// (_CameraColorTexture, _CameraDepthAttachment) you need to check this flag to know if you should flip the - /// matrix when rendering with for cmd.Draw* and reading from camera textures. - /// - /// True if the camera device projection matrix is flipped. - public bool IsCameraProjectionMatrixFlipped() - { - if (!SystemInfo.graphicsUVStartsAtTop) - return false; - - // Users only have access to CameraData on URP rendering scope. The current renderer should never be null. - var renderer = ScriptableRenderer.current; - Debug.Assert(renderer != null, "IsCameraProjectionMatrixFlipped is being called outside camera rendering scope."); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - if (renderer != null) - return IsHandleYFlipped(renderer.cameraColorTargetHandle) || targetTexture != null; - #pragma warning restore CS0618 - - return true; - } -#endif /// /// True if the render target's projection matrix is flipped. This happens when the pipeline is rendering diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalRenderingData.cs b/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalRenderingData.cs index bbce723cfbd..62316da81c1 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalRenderingData.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/FrameData/UniversalRenderingData.cs @@ -5,24 +5,6 @@ namespace UnityEngine.Rendering.Universal /// public class UniversalRenderingData : ContextItem { -#if URP_COMPATIBILITY_MODE - // Non-rendergraph path only. Do NOT use with rendergraph! (RG execution timeline breaks.) - // NOTE: internal for a ref return in legacy RenderingData.commandBuffer. - internal CommandBuffer m_CommandBuffer; - - // Non-rendergraph path only. Do NOT use with rendergraph! (RG execution timeline breaks.) - internal CommandBuffer commandBuffer - { - get - { - if (m_CommandBuffer == null) - Debug.LogError("UniversalRenderingData.commandBuffer is null. RenderGraph does not support this property. Please use the command buffer provided by the RenderGraphContext."); - - return m_CommandBuffer; - } - } -#endif - /// /// Returns culling results that exposes handles to visible objects, lights and probes. /// You can use this to draw objects with ScriptableRenderContext.DrawRenderers @@ -73,9 +55,6 @@ internal CommandBuffer commandBuffer /// public override void Reset() { -#if URP_COMPATIBILITY_MODE - m_CommandBuffer = default; -#endif cullResults = default; supportsDynamicBatching = default; perObjectData = default; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs deleted file mode 100644 index f9a9bdc903d..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs +++ /dev/null @@ -1,708 +0,0 @@ -#if URP_COMPATIBILITY_MODE -using System; -using System.Collections.Generic; -using System.Linq; -using Unity.Collections; -using UnityEngine.Experimental.Rendering; - -namespace UnityEngine.Rendering.Universal -{ - public partial class ScriptableRenderer - { - // Used "internal" only for testing. This should be private. - internal const int kRenderPassMapSize = 10; - internal const int kRenderPassMaxCount = 20; - - // used to keep track of the index of the last pass when we called BeginSubpass - private int m_LastBeginSubpassPassIndex = 0; - - private Dictionary m_MergeableRenderPassesMap = new Dictionary(kRenderPassMapSize); - // static array storing all the mergeableRenderPassesMap arrays. This is used to remove any GC allocs during the frame which would have been introduced by using a dynamic array to store the mergeablePasses per RenderPass - private int[][] m_MergeableRenderPassesMapArrays; - private Hash128[] m_PassIndexToPassHash = new Hash128[kRenderPassMaxCount]; - private Dictionary m_RenderPassesAttachmentCount = new Dictionary(kRenderPassMapSize); - - // used to keep track of the index of the first pass in the last group of merged native passes - private int m_firstPassIndexOfLastMergeableGroup; - - AttachmentDescriptor[] m_ActiveColorAttachmentDescriptors = new AttachmentDescriptor[] - { - RenderingUtils.emptyAttachment, RenderingUtils.emptyAttachment, RenderingUtils.emptyAttachment, - RenderingUtils.emptyAttachment, RenderingUtils.emptyAttachment, RenderingUtils.emptyAttachment, - RenderingUtils.emptyAttachment, RenderingUtils.emptyAttachment - }; - 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, - RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store - }; - internal RenderBufferStoreAction m_FinalDepthStoreAction = RenderBufferStoreAction.Store; - - private static partial class Profiling - { - public static readonly ProfilingSampler setMRTAttachmentsList = new ProfilingSampler($"NativeRenderPass {nameof(SetNativeRenderPassMRTAttachmentList)}"); - public static readonly ProfilingSampler setAttachmentList = new ProfilingSampler($"NativeRenderPass {nameof(SetNativeRenderPassAttachmentList)}"); - public static readonly ProfilingSampler execute = new ProfilingSampler($"NativeRenderPass {nameof(ExecuteNativeRenderPass)}"); - public static readonly ProfilingSampler setupFrameData = new ProfilingSampler($"NativeRenderPass {nameof(SetupNativeRenderPassFrameData)}"); - } - - internal struct RenderPassDescriptor - { - internal int w, h, samples, depthID; - - internal RenderPassDescriptor(int width, int height, int sampleCount, int rtID) - { - w = width; - h = height; - samples = sampleCount; - depthID = rtID; - } - } - - internal void ResetNativeRenderPassFrameData() - { - if (m_MergeableRenderPassesMapArrays == null) - m_MergeableRenderPassesMapArrays = new int[kRenderPassMapSize][]; - - for (int i = 0; i < kRenderPassMapSize; ++i) - { - if (m_MergeableRenderPassesMapArrays[i] == null) - m_MergeableRenderPassesMapArrays[i] = new int[kRenderPassMaxCount]; - - for (int j = 0; j < kRenderPassMaxCount; ++j) - { - m_MergeableRenderPassesMapArrays[i][j] = -1; - } - } - - m_firstPassIndexOfLastMergeableGroup = 0; - } - - internal void SetupNativeRenderPassFrameData(UniversalCameraData cameraData, bool isRenderPassEnabled) - { - //TODO: edge cases to detect that should affect possible passes to merge - // - total number of color attachment > 8 - - // Go through all the passes and mark the final one as last pass - - using (new ProfilingScope(Profiling.setupFrameData)) - { - int lastPassIndex = m_ActiveRenderPassQueue.Count - 1; - - // Make sure the list is already sorted! - m_MergeableRenderPassesMap.Clear(); - m_RenderPassesAttachmentCount.Clear(); - uint currentHashIndex = 0; - // reset all the passes last pass flag - for (int i = 0; i < m_ActiveRenderPassQueue.Count; ++i) - { - var renderPass = m_ActiveRenderPassQueue[i]; - - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - bool RPEnabled = IsRenderPassEnabled(renderPass); - #pragma warning restore CS0618 - if (!RPEnabled) - continue; - - // Check if current index pass is higher than the maximum number of passes - if (i >= kRenderPassMaxCount) - { - Debug.LogError($"Exceeded the maximum number of Render Passes (${kRenderPassMaxCount}). Please consider using Render Graph to support a higher number of render passes with Native RenderPass, note support will be enabled by default."); - return; - } - - renderPass.renderPassQueueIndex = i; - - var rpDesc = InitializeRenderPassDescriptor(cameraData, renderPass); - - Hash128 hash = CreateRenderPassHash(rpDesc, currentHashIndex); - - m_PassIndexToPassHash[i] = hash; - - if (!m_MergeableRenderPassesMap.ContainsKey(hash)) - { - m_MergeableRenderPassesMap.Add(hash, m_MergeableRenderPassesMapArrays[m_MergeableRenderPassesMap.Count]); - m_RenderPassesAttachmentCount.Add(hash, 0); - m_firstPassIndexOfLastMergeableGroup = i; - } - else if (m_MergeableRenderPassesMap[hash][GetValidPassIndexCount(m_MergeableRenderPassesMap[hash]) - 1] != (i - 1)) - { - // if the passes are not sequential we want to split the current mergeable passes list. So we increment the hashIndex and update the hash - currentHashIndex++; - hash = CreateRenderPassHash(rpDesc, currentHashIndex); - m_PassIndexToPassHash[i] = hash; - - m_MergeableRenderPassesMap.Add(hash, m_MergeableRenderPassesMapArrays[m_MergeableRenderPassesMap.Count]); - m_RenderPassesAttachmentCount.Add(hash, 0); - m_firstPassIndexOfLastMergeableGroup = i; - } - - m_MergeableRenderPassesMap[hash][GetValidPassIndexCount(m_MergeableRenderPassesMap[hash])] = i; - } - - for (int i = 0; i < m_ActiveRenderPassQueue.Count; ++i) - { - m_ActiveRenderPassQueue[i].m_ColorAttachmentIndices = new NativeArray(8, Allocator.Temp); - m_ActiveRenderPassQueue[i].m_InputAttachmentIndices = new NativeArray(8, Allocator.Temp); - } - } - } - - internal void UpdateFinalStoreActions(int[] currentMergeablePasses, UniversalCameraData cameraData, bool isLastMergeableGroup) - { - for (int i = 0; i < m_FinalColorStoreAction.Length; ++i) - m_FinalColorStoreAction[i] = RenderBufferStoreAction.Store; - m_FinalDepthStoreAction = RenderBufferStoreAction.Store; - - foreach (var passIdx in currentMergeablePasses) - { - if (!m_UseOptimizedStoreActions) - break; - - if (passIdx == -1) - break; - - ScriptableRenderPass pass = m_ActiveRenderPassQueue[passIdx]; - - var samples = pass.overrideCameraTarget ? GetFirstAllocatedRTHandle(pass).rt.descriptor.msaaSamples : (cameraData.targetTexture != null ? cameraData.targetTexture.descriptor.msaaSamples : cameraData.cameraTargetDescriptor.msaaSamples); - - bool rendererSupportsMSAA = cameraData.renderer != null && cameraData.renderer.supportedRenderingFeatures.msaa; - if (!cameraData.camera.allowMSAA || !rendererSupportsMSAA) - samples = 1; - - // only override existing non destructive actions - for (int i = 0; i < m_FinalColorStoreAction.Length; ++i) - { - if (m_FinalColorStoreAction[i] == RenderBufferStoreAction.Store || m_FinalColorStoreAction[i] == RenderBufferStoreAction.StoreAndResolve || pass.overriddenColorStoreActions[i]) - m_FinalColorStoreAction[i] = pass.colorStoreActions[i]; - - if (samples > 1) - { - if (m_FinalColorStoreAction[i] == RenderBufferStoreAction.Store) - m_FinalColorStoreAction[i] = RenderBufferStoreAction.StoreAndResolve; - else if (m_FinalColorStoreAction[i] == RenderBufferStoreAction.DontCare) - m_FinalColorStoreAction[i] = RenderBufferStoreAction.Resolve; - else if (isLastMergeableGroup && m_FinalColorStoreAction[i] == RenderBufferStoreAction.Resolve) - m_FinalColorStoreAction[i] = RenderBufferStoreAction.StoreAndResolve; - } - } - - // only override existing store - if (m_FinalDepthStoreAction == RenderBufferStoreAction.Store || (m_FinalDepthStoreAction == RenderBufferStoreAction.StoreAndResolve && pass.depthStoreAction == RenderBufferStoreAction.Resolve) || pass.overriddenDepthStoreAction) - m_FinalDepthStoreAction = pass.depthStoreAction; - } - } - - internal void SetNativeRenderPassMRTAttachmentList(ScriptableRenderPass renderPass, UniversalCameraData cameraData, bool needCustomCameraColorClear, ClearFlag cameraClearFlag) - { - using (new ProfilingScope(Profiling.setMRTAttachmentsList)) - { - int currentPassIndex = renderPass.renderPassQueueIndex; - Hash128 currentPassHash = m_PassIndexToPassHash[currentPassIndex]; - int[] currentMergeablePasses = m_MergeableRenderPassesMap[currentPassHash]; - - // Not the first pass - if (currentMergeablePasses.First() != currentPassIndex) - return; - - m_RenderPassesAttachmentCount[currentPassHash] = 0; - - UpdateFinalStoreActions(currentMergeablePasses, cameraData, currentPassIndex == m_firstPassIndexOfLastMergeableGroup); - - int currentAttachmentIdx = 0; - bool hasInput = false; - foreach (var passIdx in currentMergeablePasses) - { - if (passIdx == -1) - break; - ScriptableRenderPass pass = m_ActiveRenderPassQueue[passIdx]; - - for (int i = 0; i < pass.m_ColorAttachmentIndices.Length; ++i) - pass.m_ColorAttachmentIndices[i] = -1; - - for (int i = 0; i < pass.m_InputAttachmentIndices.Length; ++i) - pass.m_InputAttachmentIndices[i] = -1; - - uint validColorBuffersCount = RenderingUtils.GetValidColorBufferCount(pass.colorAttachmentHandles); - - for (int i = 0; i < validColorBuffersCount; ++i) - { - AttachmentDescriptor currentAttachmentDescriptor = - new AttachmentDescriptor(pass.renderTargetFormat[i] != GraphicsFormat.None ? pass.renderTargetFormat[i] : UniversalRenderPipeline.MakeRenderTextureGraphicsFormat(cameraData.isHdrEnabled, cameraData.hdrColorBufferPrecision, Graphics.preserveFramebufferAlpha)); - - var colorHandle = pass.overrideCameraTarget ? pass.colorAttachmentHandles[i] : m_CameraColorTarget; - - int existingAttachmentIndex = FindAttachmentDescriptorIndexInList(colorHandle.nameID, m_ActiveColorAttachmentDescriptors); - - if (m_UseOptimizedStoreActions) - currentAttachmentDescriptor.storeAction = m_FinalColorStoreAction[i]; - - if (existingAttachmentIndex == -1) - { - // add a new attachment - m_ActiveColorAttachmentDescriptors[currentAttachmentIdx] = currentAttachmentDescriptor; - bool passHasClearColor = (pass.clearFlag & ClearFlag.Color) != 0; - m_ActiveColorAttachmentDescriptors[currentAttachmentIdx].ConfigureTarget(colorHandle.nameID, !passHasClearColor, true); - - if (pass.colorAttachmentHandles[i].nameID == m_CameraColorTarget.nameID && needCustomCameraColorClear && (cameraClearFlag & ClearFlag.Color) != 0) - m_ActiveColorAttachmentDescriptors[currentAttachmentIdx].ConfigureClear(cameraData.backgroundColor, 1.0f, 0); - else if (passHasClearColor) - m_ActiveColorAttachmentDescriptors[currentAttachmentIdx].ConfigureClear(CoreUtils.ConvertSRGBToActiveColorSpace(pass.clearColor), 1.0f, 0); - - pass.m_ColorAttachmentIndices[i] = currentAttachmentIdx; - currentAttachmentIdx++; - m_RenderPassesAttachmentCount[currentPassHash]++; - } - else - { - // attachment was already present - pass.m_ColorAttachmentIndices[i] = existingAttachmentIndex; - } - } - - 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)); - bool passHasClearDepth = (cameraClearFlag & ClearFlag.DepthStencil) != 0; - m_ActiveDepthAttachmentDescriptor.ConfigureTarget(pass.overrideCameraTarget ? pass.depthAttachmentHandle.nameID : m_CameraDepthTarget.nameID, !passHasClearDepth, true); - - if (passHasClearDepth) - m_ActiveDepthAttachmentDescriptor.ConfigureClear(Color.black, 1.0f, 0); - - if (m_UseOptimizedStoreActions) - m_ActiveDepthAttachmentDescriptor.storeAction = m_FinalDepthStoreAction; - } - - if (hasInput) - SetupTransientInputAttachments(m_RenderPassesAttachmentCount[currentPassHash]); - } - } - - bool IsDepthOnlyRenderTexture(RenderTexture t) - => t.graphicsFormat == GraphicsFormat.None; - - internal void SetNativeRenderPassAttachmentList(ScriptableRenderPass renderPass, UniversalCameraData cameraData, RTHandle passColorAttachment, RTHandle passDepthAttachment, ClearFlag finalClearFlag, Color finalClearColor) - { - using (new ProfilingScope(Profiling.setAttachmentList)) - { - int currentPassIndex = renderPass.renderPassQueueIndex; - Hash128 currentPassHash = m_PassIndexToPassHash[currentPassIndex]; - int[] currentMergeablePasses = m_MergeableRenderPassesMap[currentPassHash]; - - // Skip if not the first pass - if (currentMergeablePasses.First() != currentPassIndex) - return; - - m_RenderPassesAttachmentCount[currentPassHash] = 0; - - UpdateFinalStoreActions(currentMergeablePasses, cameraData, currentPassIndex == m_firstPassIndexOfLastMergeableGroup); - - int currentAttachmentIdx = 0; - foreach (var passIdx in currentMergeablePasses) - { - if (passIdx == -1) - break; - ScriptableRenderPass pass = m_ActiveRenderPassQueue[passIdx]; - - for (int i = 0; i < pass.m_ColorAttachmentIndices.Length; ++i) - pass.m_ColorAttachmentIndices[i] = -1; - - AttachmentDescriptor currentAttachmentDescriptor; - var usesTargetTexture = cameraData.targetTexture != null; - var depthOnly = (pass.colorAttachmentHandle.rt != null && IsDepthOnlyRenderTexture(pass.colorAttachmentHandle.rt)) || (usesTargetTexture && IsDepthOnlyRenderTexture(cameraData.targetTexture)); - - int samples; - RenderTargetIdentifier colorAttachmentTarget; - // We are not rendering to Backbuffer so we have the RT and the information with it - // while also creating a new RenderTargetIdentifier to ignore the current depth slice (which might get bypassed in XR setup eventually) - if (new RenderTargetIdentifier(passColorAttachment.nameID, 0, depthSlice: 0) != BuiltinRenderTextureType.CameraTarget) - { - currentAttachmentDescriptor = new AttachmentDescriptor(depthOnly ? passColorAttachment.rt.descriptor.depthStencilFormat : passColorAttachment.rt.descriptor.graphicsFormat); - samples = passColorAttachment.rt.descriptor.msaaSamples; - colorAttachmentTarget = passColorAttachment.nameID; - } - else // In this case we might be rendering the the targetTexture or the Backbuffer, so less information is available - { - currentAttachmentDescriptor = new AttachmentDescriptor(pass.renderTargetFormat[0] != GraphicsFormat.None ? pass.renderTargetFormat[0] : UniversalRenderPipeline.MakeRenderTextureGraphicsFormat(cameraData.isHdrEnabled, cameraData.hdrColorBufferPrecision, Graphics.preserveFramebufferAlpha)); - - samples = cameraData.cameraTargetDescriptor.msaaSamples; - colorAttachmentTarget = usesTargetTexture ? new RenderTargetIdentifier(cameraData.targetTexture) : BuiltinRenderTextureType.CameraTarget; - } - - currentAttachmentDescriptor.ConfigureTarget(colorAttachmentTarget, ((uint)finalClearFlag & (uint)ClearFlag.Color) == 0, true); - - if (PassHasInputAttachments(pass)) - 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)); - m_ActiveDepthAttachmentDescriptor.ConfigureTarget(passDepthAttachment.nameID != BuiltinRenderTextureType.CameraTarget ? passDepthAttachment.nameID : - (usesTargetTexture ? new RenderTargetIdentifier(cameraData.targetTexture.depthBuffer) : BuiltinRenderTextureType.Depth), - ((uint)finalClearFlag & (uint)ClearFlag.Depth) == 0, true); - - if (finalClearFlag != ClearFlag.None) - { - // We don't clear color for Overlay render targets, however pipeline set's up depth only render passes as color attachments which we do need to clear - if ((cameraData.renderType != CameraRenderType.Overlay || depthOnly && ((uint)finalClearFlag & (uint)ClearFlag.Color) != 0)) - currentAttachmentDescriptor.ConfigureClear(finalClearColor, 1.0f, 0); - if (((uint)finalClearFlag & (uint)ClearFlag.Depth) != 0) - m_ActiveDepthAttachmentDescriptor.ConfigureClear(Color.black, 1.0f, 0); - } - - // resolving to the implicit color target's resolve surface TODO: handle m_CameraResolveTarget if present? - if (samples > 1) - { - currentAttachmentDescriptor.ConfigureResolveTarget(colorAttachmentTarget); - if (RenderingUtils.MultisampleDepthResolveSupported()) - m_ActiveDepthAttachmentDescriptor.ConfigureResolveTarget(m_ActiveDepthAttachmentDescriptor.loadStoreTarget); - } - - - if (m_UseOptimizedStoreActions) - { - currentAttachmentDescriptor.storeAction = m_FinalColorStoreAction[0]; - m_ActiveDepthAttachmentDescriptor.storeAction = m_FinalDepthStoreAction; - } - - int existingAttachmentIndex = FindAttachmentDescriptorIndexInList(currentAttachmentIdx, - currentAttachmentDescriptor, m_ActiveColorAttachmentDescriptors); - - if (existingAttachmentIndex == -1) - { - // add a new attachment - pass.m_ColorAttachmentIndices[0] = currentAttachmentIdx; - m_ActiveColorAttachmentDescriptors[currentAttachmentIdx] = currentAttachmentDescriptor; - currentAttachmentIdx++; - m_RenderPassesAttachmentCount[currentPassHash]++; - } - else - { - // attachment was already present - pass.m_ColorAttachmentIndices[0] = existingAttachmentIndex; - } - } - } - } - - internal void ExecuteNativeRenderPass(ScriptableRenderContext context, ScriptableRenderPass renderPass, UniversalCameraData cameraData, ref RenderingData renderingData) - { - using (new ProfilingScope(Profiling.execute)) - { - int currentPassIndex = renderPass.renderPassQueueIndex; - Hash128 currentPassHash = m_PassIndexToPassHash[currentPassIndex]; - int[] currentMergeablePasses = m_MergeableRenderPassesMap[currentPassHash]; - - int validColorBuffersCount = m_RenderPassesAttachmentCount[currentPassHash]; - - var depthOnly = (renderPass.colorAttachmentHandle.rt != null && IsDepthOnlyRenderTexture(renderPass.colorAttachmentHandle.rt)) || (cameraData.targetTexture != null && IsDepthOnlyRenderTexture(cameraData.targetTexture)); - bool useDepth = depthOnly|| (!renderPass.overrideCameraTarget || (renderPass.overrideCameraTarget && renderPass.depthAttachmentHandle.nameID != BuiltinRenderTextureType.CameraTarget));// && - - var attachments = - new NativeArray(useDepth && !depthOnly ? validColorBuffersCount + 1 : 1, Allocator.Temp); - - for (int i = 0; i < validColorBuffersCount; ++i) - attachments[i] = m_ActiveColorAttachmentDescriptors[i]; - - if (useDepth && !depthOnly) - attachments[validColorBuffersCount] = m_ActiveDepthAttachmentDescriptor; - - var rpDesc = InitializeRenderPassDescriptor(cameraData, renderPass); - - int validPassCount = GetValidPassIndexCount(currentMergeablePasses); - - var attachmentIndicesCount = GetSubPassAttachmentIndicesCount(renderPass); - - var attachmentIndices = new NativeArray(!depthOnly ? (int)attachmentIndicesCount : 0, Allocator.Temp); - if (!depthOnly) - { - for (int i = 0; i < attachmentIndicesCount; ++i) - { - attachmentIndices[i] = renderPass.m_ColorAttachmentIndices[i]; - } - } - - if (validPassCount == 1 || currentMergeablePasses[0] == currentPassIndex) // Check if it's the first pass - { - if (PassHasInputAttachments(renderPass)) - Debug.LogWarning("First pass in a RenderPass should not have input attachments."); - - context.BeginRenderPass(rpDesc.w, rpDesc.h, Math.Max(rpDesc.samples, 1), attachments, - useDepth ? (!depthOnly ? validColorBuffersCount : 0) : -1); - attachments.Dispose(); - - context.BeginSubPass(attachmentIndices); - - m_LastBeginSubpassPassIndex = currentPassIndex; - } - else - { - // Regarding input attachments, currently we always recreate a new subpass if it contains input attachments - // This might not the most optimal way though and it should be investigated in the future - // Whether merging subpasses with matching input attachments is a more viable option - if (!AreAttachmentIndicesCompatible(m_ActiveRenderPassQueue[m_LastBeginSubpassPassIndex], m_ActiveRenderPassQueue[currentPassIndex])) - { - context.EndSubPass(); - if (PassHasInputAttachments(m_ActiveRenderPassQueue[currentPassIndex])) - context.BeginSubPass(attachmentIndices, m_ActiveRenderPassQueue[currentPassIndex].m_InputAttachmentIndices); - else - context.BeginSubPass(attachmentIndices); - - m_LastBeginSubpassPassIndex = currentPassIndex; - } - else if (PassHasInputAttachments(m_ActiveRenderPassQueue[currentPassIndex])) - { - context.EndSubPass(); - context.BeginSubPass(attachmentIndices, m_ActiveRenderPassQueue[currentPassIndex].m_InputAttachmentIndices); - - m_LastBeginSubpassPassIndex = currentPassIndex; - } - } - - attachmentIndices.Dispose(); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - renderPass.Execute(context, ref renderingData); - #pragma warning restore CS0618 - - // Need to execute it immediately to avoid sync issues between context and cmd buffer - context.ExecuteCommandBuffer(renderingData.commandBuffer); - renderingData.commandBuffer.Clear(); - - if (validPassCount == 1 || currentMergeablePasses[validPassCount - 1] == currentPassIndex) // Check if it's the last pass - { - context.EndSubPass(); - context.EndRenderPass(); - - m_LastBeginSubpassPassIndex = 0; - } - - for (int i = 0; i < m_ActiveColorAttachmentDescriptors.Length; ++i) - { - m_ActiveColorAttachmentDescriptors[i] = RenderingUtils.emptyAttachment; - m_IsActiveColorAttachmentTransient[i] = false; - } - - m_ActiveDepthAttachmentDescriptor = RenderingUtils.emptyAttachment; - } - } - - internal void SetupInputAttachmentIndices(ScriptableRenderPass pass) - { - var validInputBufferCount = GetValidInputAttachmentCount(pass); - pass.m_InputAttachmentIndices = new NativeArray(validInputBufferCount, Allocator.Temp); - for (int i = 0; i < validInputBufferCount; i++) - { - pass.m_InputAttachmentIndices[i] = FindAttachmentDescriptorIndexInList(pass.m_InputAttachments[i], m_ActiveColorAttachmentDescriptors); - if (pass.m_InputAttachmentIndices[i] == -1) - { - Debug.LogWarning("RenderPass Input attachment not found in the current RenderPass"); - continue; - } - - // 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]]) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - m_IsActiveColorAttachmentTransient[pass.m_InputAttachmentIndices[i]] = pass.IsInputAttachmentTransient(i); - #pragma warning restore CS0618 - } - } - } - - 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; - } - } - - internal static uint GetSubPassAttachmentIndicesCount(ScriptableRenderPass pass) - { - uint numValidAttachments = 0; - - foreach (var attIdx in pass.m_ColorAttachmentIndices) - { - if (attIdx >= 0) - ++numValidAttachments; - } - - return numValidAttachments; - } - - internal static bool AreAttachmentIndicesCompatible(ScriptableRenderPass lastSubPass, ScriptableRenderPass currentSubPass) - { - uint lastSubPassAttCount = GetSubPassAttachmentIndicesCount(lastSubPass); - uint currentSubPassAttCount = GetSubPassAttachmentIndicesCount(currentSubPass); - - if (currentSubPassAttCount != lastSubPassAttCount) - return false; - - uint numEqualAttachments = 0; - for (int currPassIdx = 0; currPassIdx < currentSubPassAttCount; ++currPassIdx) - { - for (int lastPassIdx = 0; lastPassIdx < lastSubPassAttCount; ++lastPassIdx) - { - if (currentSubPass.m_ColorAttachmentIndices[currPassIdx] == lastSubPass.m_ColorAttachmentIndices[lastPassIdx]) - numEqualAttachments++; - } - } - - return (numEqualAttachments == currentSubPassAttCount); - } - - internal static uint GetValidColorAttachmentCount(AttachmentDescriptor[] colorAttachments) - { - uint nonNullColorBuffers = 0; - if (colorAttachments != null) - { - foreach (var attachment in colorAttachments) - { - if (attachment != RenderingUtils.emptyAttachment) - ++nonNullColorBuffers; - } - } - return nonNullColorBuffers; - } - - internal static int GetValidInputAttachmentCount(ScriptableRenderPass renderPass) - { - var length = renderPass.m_InputAttachments.Length; - if (length != 8) // overriden, there are attachments - return length; - else - { - for (int i = 0; i < length; ++i) - { - if (renderPass.m_InputAttachments[i] == null) - return i; - } - return length; - } - } - - internal static int FindAttachmentDescriptorIndexInList(int attachmentIdx, AttachmentDescriptor attachmentDescriptor, AttachmentDescriptor[] attachmentDescriptors) - { - int existingAttachmentIndex = -1; - for (int i = 0; i <= attachmentIdx; ++i) - { - AttachmentDescriptor att = attachmentDescriptors[i]; - - if (att.loadStoreTarget == attachmentDescriptor.loadStoreTarget && att.graphicsFormat == attachmentDescriptor.graphicsFormat) - { - existingAttachmentIndex = i; - break; - } - } - - return existingAttachmentIndex; - } - - internal static int FindAttachmentDescriptorIndexInList(RenderTargetIdentifier target, AttachmentDescriptor[] attachmentDescriptors) - { - for (int i = 0; i < attachmentDescriptors.Length; i++) - { - AttachmentDescriptor att = attachmentDescriptors[i]; - if (att.loadStoreTarget == target) - return i; - } - - return -1; - } - - internal static int GetValidPassIndexCount(int[] array) - { - if (array == null) - return 0; - - for (int i = 0; i < array.Length; ++i) - { - if (array[i] == -1) - return i; - } - return array.Length - 1; - } - - internal static RTHandle GetFirstAllocatedRTHandle(ScriptableRenderPass pass) - { - for (int i = 0; i < pass.colorAttachmentHandles.Length; ++i) - { - if (pass.colorAttachmentHandles[i].rt != null) - return pass.colorAttachmentHandles[i]; - } - return pass.colorAttachmentHandles[0]; - } - - internal static bool PassHasInputAttachments(ScriptableRenderPass renderPass) - { - return renderPass.m_InputAttachments.Length != 8 || renderPass.m_InputAttachments[0] != null; - } - - internal static Hash128 CreateRenderPassHash(int width, int height, int depthID, int sample, uint hashIndex) - { - return new Hash128((uint)(width << 4) + (uint)height, (uint)depthID, (uint)sample, hashIndex); - } - - internal static Hash128 CreateRenderPassHash(RenderPassDescriptor desc, uint hashIndex) - { - return CreateRenderPassHash(desc.w, desc.h, desc.depthID, desc.samples, hashIndex); - } - - internal static void GetRenderTextureDescriptor(UniversalCameraData cameraData, ScriptableRenderPass renderPass, out RenderTextureDescriptor targetRT) - { - if (!renderPass.overrideCameraTarget || (renderPass.colorAttachmentHandle.rt == null && renderPass.depthAttachmentHandle.rt == null)) - { - targetRT = cameraData.cameraTargetDescriptor; - - // In this case we want to rely on the pixelWidth/Height as the texture could be scaled from a script later and etc. - // and it's new dimensions might not be reflected on the targetTexture. This also applies to camera stacks rendering to a target texture. - if (cameraData.targetTexture != null) - { - targetRT.width = cameraData.scaledWidth; - targetRT.height = cameraData.scaledHeight; - } - } - else - { - var handle = GetFirstAllocatedRTHandle(renderPass); - targetRT = handle.rt != null ? handle.rt.descriptor : renderPass.depthAttachmentHandle.rt.descriptor; - } - } - - private RenderPassDescriptor InitializeRenderPassDescriptor(UniversalCameraData cameraData, ScriptableRenderPass renderPass) - { - GetRenderTextureDescriptor(cameraData, renderPass, out RenderTextureDescriptor targetRT); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - var depthTarget = renderPass.overrideCameraTarget ? renderPass.depthAttachmentHandle : cameraDepthTargetHandle; - var depthID = (targetRT.graphicsFormat == GraphicsFormat.None && targetRT.depthStencilFormat != GraphicsFormat.None) ? renderPass.colorAttachmentHandle.GetHashCode() : depthTarget.GetHashCode(); - #pragma warning restore CS0618 - - return new RenderPassDescriptor(targetRT.width, targetRT.height, targetRT.msaaSamples, depthID); - } - } -} -#endif diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs.meta deleted file mode 100644 index a705876477f..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/NativeRenderPass.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 5bda898891014be6a6c570d69d4e75d6 -timeCreated: 1616679760 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs index fdd8ec33ee8..5bc9649eff6 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs @@ -53,14 +53,6 @@ public partial class AdditionalLightsShadowCasterPass : ScriptableRenderPass private static Vector4[] s_EmptyAdditionalLightIndexToShadowParams; private static bool isAdditionalShadowParamsDirty; -#if URP_COMPATIBILITY_MODE - private const int k_EmptyShadowMapDimensions = 1; - private bool m_EmptyShadowmapNeedsClear; - private const string k_EmptyAdditionalLightShadowMapTextureName = "_EmptyAdditionalLightShadowmapTexture"; - private RTHandle m_EmptyAdditionalLightShadowmapTexture; - private PassData m_PassData; -#endif - // Classes private static class AdditionalShadowsConstantBuffer { @@ -82,13 +74,11 @@ private class PassData internal bool setKeywordForEmptyShadowmap; internal bool useStructuredBuffer; internal bool stripShadowsOffVariants; - internal Matrix4x4 viewMatrix; internal Vector2Int allocatedShadowAtlasSize; internal TextureHandle shadowmapTexture; internal UniversalLightData lightData; internal UniversalShadowData shadowData; internal AdditionalLightsShadowCasterPass pass; - internal readonly RendererList[] shadowRendererLists = new RendererList[ShaderOptions.k_MaxVisibleLightCountDesktop]; internal readonly RendererListHandle[] shadowRendererListsHdl = new RendererListHandle[ShaderOptions.k_MaxVisibleLightCountDesktop]; } @@ -125,11 +115,6 @@ public AdditionalLightsShadowCasterPass(RenderPassEvent evt) // Uniform buffers are faster on some platforms, but they have stricter size limitations if (!m_UseStructuredBuffer) m_AdditionalLightShadowSliceIndexTo_WorldShadowMatrix = new Matrix4x4[maxVisibleAdditionalLights]; - -#if URP_COMPATIBILITY_MODE - m_EmptyShadowmapNeedsClear = true; - m_PassData = new PassData(); -#endif } /// @@ -138,9 +123,6 @@ public AdditionalLightsShadowCasterPass(RenderPassEvent evt) public void Dispose() { m_AdditionalLightsShadowmapHandle?.Release(); -#if URP_COMPATIBILITY_MODE - m_EmptyAdditionalLightShadowmapTexture?.Release(); -#endif } // Returns the guard angle that must be added to a frustum angle covering a projection map of resolution sliceResolutionInTexels, @@ -637,11 +619,6 @@ public bool Setup(UniversalRenderingData renderingData, UniversalCameraData came m_MaxShadowDistanceSq = cameraData.maxShadowDistance * cameraData.maxShadowDistance; m_CascadeBorder = shadowData.mainLightShadowCascadeBorder; m_CreateEmptyShadowmap = false; - -#if URP_COMPATIBILITY_MODE - useNativeRenderPass = true; -#endif - return true; } @@ -685,11 +662,6 @@ bool SetupForEmptyRendering(bool stripShadowsOffVariants, bool shadowsEnabled, U shadowData.isKeywordAdditionalLightShadowsEnabled = true; m_CreateEmptyShadowmap = true; - -#if URP_COMPATIBILITY_MODE - useNativeRenderPass = false; -#endif - m_SetKeywordForEmptyShadowmap = shadowsEnabled; // Even though there are not real-time shadows, the lights might be using shadowmasks, @@ -757,69 +729,6 @@ bool SetupForEmptyRendering(bool stripShadowsOffVariants, bool shadowsEnabled, U return true; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - - if (m_CreateEmptyShadowmap) - { - // Required for scene view camera(URP renderer not initialized) - if (ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_EmptyAdditionalLightShadowmapTexture, k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_ShadowmapBufferBits, name: k_EmptyAdditionalLightShadowMapTextureName)) - m_EmptyShadowmapNeedsClear = true; - - if (!m_EmptyShadowmapNeedsClear) - { - return; - } - - ConfigureTarget(m_EmptyAdditionalLightShadowmapTexture); - m_EmptyShadowmapNeedsClear = false; - } - else - { - ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_AdditionalLightsShadowmapHandle, renderTargetWidth, renderTargetHeight, k_ShadowmapBufferBits, name: k_AdditionalLightShadowMapTextureName); - ConfigureTarget(m_AdditionalLightsShadowmapHandle); - } - - ConfigureClear(ClearFlag.All, Color.black); - - #pragma warning restore CS0618 - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalRenderingData universalRenderingData = frameData.Get(); - RasterCommandBuffer rasterCommandBuffer = CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer); - if (m_CreateEmptyShadowmap) - { - if (m_SetKeywordForEmptyShadowmap) - rasterCommandBuffer.EnableKeyword(ShaderGlobalKeywords.AdditionalLightShadows); - SetShadowParamsForEmptyShadowmap(rasterCommandBuffer); - universalRenderingData.commandBuffer.SetGlobalTexture(AdditionalShadowsConstantBuffer._AdditionalLightsShadowmapID, m_EmptyAdditionalLightShadowmapTexture); - return; - } - - UniversalShadowData shadowData = frameData.Get(); - if (!shadowData.supportsAdditionalLightShadows) - return; - - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - InitPassData(ref m_PassData, cameraData, lightData, shadowData); - m_PassData.allocatedShadowAtlasSize = m_AdditionalLightsShadowmapHandle.referenceSize; - InitRendererLists(ref universalRenderingData.cullResults, ref m_PassData, context, default(RenderGraph), false); - RenderAdditionalShadowmapAtlas(rasterCommandBuffer, ref m_PassData, false); - universalRenderingData.commandBuffer.SetGlobalTexture(AdditionalShadowsConstantBuffer._AdditionalLightsShadowmapID, m_AdditionalLightsShadowmapHandle.nameID); - } -#endif - /// /// Gets the additional light index from the global visible light index, which is used to index arrays _AdditionalLightsPosition, _AdditionalShadowParams, etc. /// @@ -855,7 +764,7 @@ internal static void SetShadowParamsForEmptyShadowmap(RasterCommandBuffer raster } } - private void RenderAdditionalShadowmapAtlas(RasterCommandBuffer cmd, ref PassData data, bool useRenderGraph) + private void RenderAdditionalShadowmapAtlas(RasterCommandBuffer cmd, ref PassData data) { NativeArray visibleLights = data.lightData.visibleLights; @@ -863,11 +772,6 @@ private void RenderAdditionalShadowmapAtlas(RasterCommandBuffer cmd, ref PassDat using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.AdditionalLightsShadow))) { - // For non-RG, need set the worldToCamera Matrix as that is not set for passes executed before normal rendering, - // otherwise shadows will behave incorrectly when Scene and Game windows are open at the same time (UUM-63267). - if (!useRenderGraph) - ShadowUtils.SetWorldToCameraAndCameraToWorldMatrices(cmd, data.viewMatrix); - bool anyShadowSliceRenderer = false; int shadowSlicesCount = m_ShadowSliceToAdditionalLightIndex.Count; if (shadowSlicesCount > 0) @@ -904,7 +808,7 @@ private void RenderAdditionalShadowmapAtlas(RasterCommandBuffer cmd, ref PassDat // For Directional lights, _LightDirection is used when applying shadow Normal Bias. // For Spot lights and Point lights _LightPosition is used to compute the actual light direction because it is different at each shadow caster geometry vertex. - RendererList shadowRendererList = useRenderGraph? data.shadowRendererListsHdl[globalShadowSliceIndex] : data.shadowRendererLists[globalShadowSliceIndex]; + RendererList shadowRendererList = data.shadowRendererListsHdl[globalShadowSliceIndex]; ShadowUtils.RenderShadowSlice(cmd, ref shadowSliceData, ref shadowRendererList, shadowSliceData.projectionMatrix, shadowSliceData.viewMatrix); additionalLightHasSoftShadows |= shadowLight.light.shadows == LightShadows.Soft; anyShadowSliceRenderer = true; @@ -979,7 +883,6 @@ private void InitPassData(ref PassData passData, UniversalCameraData cameraData, passData.lightData = lightData; passData.shadowData = shadowData; - passData.viewMatrix = cameraData.GetViewMatrix(); passData.stripShadowsOffVariants = cameraData.renderer.stripShadowsOffVariants; passData.emptyShadowmap = m_CreateEmptyShadowmap; @@ -987,7 +890,7 @@ private void InitPassData(ref PassData passData, UniversalCameraData cameraData, passData.useStructuredBuffer = m_UseStructuredBuffer; } - private void InitRendererLists(ref CullingResults cullResults, ref PassData passData, ScriptableRenderContext context, RenderGraph renderGraph, bool useRenderGraph) + private void InitRendererLists(ref CullingResults cullResults, ref PassData passData, RenderGraph renderGraph) { if (m_CreateEmptyShadowmap) return; @@ -1000,11 +903,7 @@ private void InitRendererLists(ref CullingResults cullResults, ref PassData pass ShadowDrawingSettings settings = new (cullResults, visibleLightIndex) { useRenderingLayerMaskTest = UniversalRenderPipeline.asset.useRenderingLayers }; - - if(useRenderGraph) - passData.shadowRendererListsHdl[globalShadowSliceIndex] = renderGraph.CreateShadowRendererList(ref settings); - else - passData.shadowRendererLists[globalShadowSliceIndex] = context.CreateShadowRendererList(ref settings); + passData.shadowRendererListsHdl[globalShadowSliceIndex] = renderGraph.CreateShadowRendererList(ref settings); } } @@ -1018,7 +917,7 @@ internal TextureHandle Render(RenderGraph graph, ContextContainer frameData) using (var builder = graph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { InitPassData(ref passData, cameraData, lightData, shadowData); - InitRendererLists(ref renderingData.cullResults, ref passData, default(ScriptableRenderContext), graph, true); + InitRendererLists(ref renderingData.cullResults, ref passData, graph); TextureHandle shadowTexture; if (!m_CreateEmptyShadowmap) @@ -1049,7 +948,7 @@ internal TextureHandle Render(RenderGraph graph, ContextContainer frameData) RasterCommandBuffer rasterCommandBuffer = context.cmd; if (!data.emptyShadowmap) { - data.pass.RenderAdditionalShadowmapAtlas(rasterCommandBuffer, ref data, true); + data.pass.RenderAdditionalShadowmapAtlas(rasterCommandBuffer, ref data); } else { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CapturePass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CapturePass.cs index 51397cb6007..d546667f5d5 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CapturePass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CapturePass.cs @@ -12,35 +12,12 @@ namespace UnityEngine.Rendering.Universal /// internal class CapturePass : ScriptableRenderPass { -#if URP_COMPATIBILITY_MODE - RTHandle m_CameraColorHandle; -#endif - public CapturePass(RenderPassEvent evt) { - base.profilingSampler = new ProfilingSampler("Capture Camera output"); + profilingSampler = new ProfilingSampler("Capture Camera output"); renderPassEvent = evt; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmdBuf = renderingData.commandBuffer; - - m_CameraColorHandle = renderingData.cameraData.renderer.GetCameraColorBackBuffer(cmdBuf); - - using (new ProfilingScope(cmdBuf, profilingSampler)) - { - var colorAttachmentIdentifier = m_CameraColorHandle.nameID; - var captureActions = renderingData.cameraData.captureActions; - for (captureActions.Reset(); captureActions.MoveNext();) - captureActions.Current(colorAttachmentIdentifier, renderingData.commandBuffer); - } - } -#endif - private class UnsafePassData { internal TextureHandle source; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ColorGradingLutPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ColorGradingLutPass.cs index 07d6bf46e81..5e671da15f3 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ColorGradingLutPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ColorGradingLutPass.cs @@ -17,12 +17,7 @@ public partial class ColorGradingLutPass : ScriptableRenderPass readonly Material m_LutBuilderHdr; internal readonly GraphicsFormat m_HdrLutFormat; internal readonly GraphicsFormat m_LdrLutFormat; - -#if URP_COMPATIBILITY_MODE - RTHandle m_InternalLut; - PassData m_PassData; -#endif - + bool m_AllowColorGradingACESHDR = true; /// @@ -36,9 +31,6 @@ public ColorGradingLutPass(RenderPassEvent evt, PostProcessData data) { profilingSampler = new ProfilingSampler("Blit Color LUT"); renderPassEvent = evt; -#if URP_COMPATIBILITY_MODE - overrideCameraTarget = true; -#endif m_LutBuilderLdr = PostProcessUtils.LoadShader(data.shaders.lutBuilderLdrPS, passName); m_LutBuilderHdr = PostProcessUtils.LoadShader(data.shaders.lutBuilderHdrPS, passName); @@ -64,11 +56,6 @@ public ColorGradingLutPass(RenderPassEvent evt, PostProcessData data) if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLES3 && Graphics.minOpenGLESVersion <= OpenGLESVersion.OpenGLES30 && SystemInfo.graphicsDeviceName.StartsWith("Adreno (TM) 3")) m_AllowColorGradingACESHDR = false; - -#if URP_COMPATIBILITY_MODE - base.useNativeRenderPass = false; - m_PassData = new PassData(); -#endif } /// @@ -77,10 +64,7 @@ public ColorGradingLutPass(RenderPassEvent evt, PostProcessData data) /// The RTHandle to use to render to. /// public void Setup(in RTHandle internalLut) - { -#if URP_COMPATIBILITY_MODE - m_InternalLut = internalLut; -#endif + { } /// @@ -112,33 +96,6 @@ public void ConfigureDescriptor(in UniversalPostProcessingData postProcessingDat filterMode = FilterMode.Bilinear; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalCameraData cameraData = frameData.Get(); - UniversalPostProcessingData postProcessingData = frameData.Get(); - - m_PassData.cameraData = cameraData; - - m_PassData.lutBuilderLdr = m_LutBuilderLdr; - m_PassData.lutBuilderHdr = m_LutBuilderHdr; - m_PassData.allowColorGradingACESHDR = m_AllowColorGradingACESHDR; - m_PassData.lutSize = postProcessingData.lutSize; - m_PassData.hdrGrading = postProcessingData.gradingMode == ColorGradingMode.HighDynamicRange; - -#if ENABLE_VR && ENABLE_XR_MODULE - if (renderingData.cameraData.xr.supportsFoveatedRendering) - renderingData.commandBuffer.SetFoveatedRenderingMode(FoveatedRenderingMode.Disabled); -#endif - - CoreUtils.SetRenderTarget(renderingData.commandBuffer, m_InternalLut, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, ClearFlag.None, Color.clear); - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, m_InternalLut); - } -#endif - private class PassData { internal UniversalCameraData cameraData; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyColorPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyColorPass.cs index 61590f4bd9a..244d5b501f4 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyColorPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyColorPass.cs @@ -19,12 +19,6 @@ public partial class CopyColorPass : ScriptableRenderPass Downsampling m_DownsamplingMethod; Material m_CopyColorMaterial; -#if URP_COMPATIBILITY_MODE - private RTHandle source { get; set; } - private RTHandle destination { get; set; } - private PassData m_PassData; -#endif - /// /// Creates a new CopyColorPass instance. /// @@ -44,11 +38,6 @@ public CopyColorPass(RenderPassEvent evt, Material samplingMaterial, Material co m_SampleOffsetShaderHandle = Shader.PropertyToID("_SampleOffset"); renderPassEvent = evt; m_DownsamplingMethod = Downsampling.None; - -#if URP_COMPATIBILITY_MODE - base.useNativeRenderPass = false; - m_PassData = new PassData(); -#endif } /// @@ -115,49 +104,9 @@ public void Setup(RenderTargetIdentifier source, RenderTargetHandle destination, /// The downsampling method to use. public void Setup(RTHandle source, RTHandle destination, Downsampling downsampling) { -#if URP_COMPATIBILITY_MODE - this.source = source; - this.destination = destination; -#endif m_DownsamplingMethod = downsampling; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - cmd.SetGlobalTexture(destination.name, destination.nameID); - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - m_PassData.samplingMaterial = m_SamplingMaterial; - m_PassData.copyColorMaterial = m_CopyColorMaterial; - m_PassData.downsamplingMethod = m_DownsamplingMethod; - m_PassData.sampleOffsetShaderHandle = m_SampleOffsetShaderHandle; - - var cmd = renderingData.commandBuffer; - - if (source == renderingData.cameraData.renderer.GetCameraColorFrontBuffer(cmd)) - { - source = renderingData.cameraData.renderer.cameraColorTargetHandle; - } - -#if ENABLE_VR && ENABLE_XR_MODULE - if (renderingData.cameraData.xr.supportsFoveatedRendering) - cmd.SetFoveatedRenderingMode(FoveatedRenderingMode.Disabled); -#endif - ScriptableRenderer.SetRenderTarget(cmd, destination, k_CameraTarget, clearFlag, clearColor); - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.CopyColor))) - { - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(cmd), m_PassData, source, renderingData.cameraData.xr.enabled); - } - } -#endif - private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RTHandle source, bool useDrawProceduralBlit) { var samplingMaterial = passData.samplingMaterial; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs index fcb93d919e5..d8955ab4b65 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs @@ -28,14 +28,6 @@ public partial class CopyDepthPass : ScriptableRenderPass internal bool m_CopyResolvedDepth; -#if URP_COMPATIBILITY_MODE - private RTHandle source { get; set; } - private RTHandle destination { get; set; } - - internal bool m_ShouldClear; - private PassData m_PassData; -#endif - /// /// Shader resource ids used to communicate with the shader implementation /// @@ -65,11 +57,6 @@ public CopyDepthPass(RenderPassEvent evt, Shader copyDepthShader, bool shouldCle m_CopyResolvedDepth = copyResolvedDepth; CopyToDepthXR = false; CopyToBackbuffer = false; - -#if URP_COMPATIBILITY_MODE - m_PassData = new PassData(); - m_ShouldClear = shouldClear; -#endif } /// @@ -79,11 +66,7 @@ public CopyDepthPass(RenderPassEvent evt, Shader copyDepthShader, bool shouldCle /// Destination Render Target public void Setup(RTHandle source, RTHandle destination) { -#if URP_COMPATIBILITY_MODE - this.source = source; - this.destination = destination; -#endif - this.MsaaSamples = -1; + MsaaSamples = -1; } /// @@ -94,29 +77,6 @@ public void Dispose() CoreUtils.Destroy(m_CopyDepthMaterial); } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 -#if UNITY_EDITOR - // This is a temporary workaround for Editor as not setting any depth here - // would lead to overwriting depth in certain scenarios (reproducable while running DX11 tests) - if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Direct3D11) - ConfigureTarget(destination, destination); - else -#endif - ConfigureTarget(destination); - - if (m_ShouldClear) - ConfigureClear(ClearFlag.All, Color.black); - - #pragma warning restore CS0618 - } -#endif - private class PassData { internal TextureHandle source; @@ -129,36 +89,6 @@ private class PassData internal bool isDstBackbuffer; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cameraData = renderingData.frameData.Get(); - - m_PassData.copyDepthMaterial = m_CopyDepthMaterial; - m_PassData.msaaSamples = MsaaSamples; - m_PassData.copyResolvedDepth = m_CopyResolvedDepth; - m_PassData.copyToDepth = CopyToDepth || CopyToDepthXR; - m_PassData.isDstBackbuffer = CopyToBackbuffer || CopyToDepthXR; - m_PassData.cameraData = cameraData; - var cmd = renderingData.commandBuffer; - cmd.SetGlobalTexture(ShaderConstants._CameraDepthAttachment, source.nameID); - -#if ENABLE_VR && ENABLE_XR_MODULE - if (m_PassData.cameraData.xr.enabled) - { - if (m_PassData.cameraData.xr.supportsFoveatedRendering) - cmd.SetFoveatedRenderingMode(FoveatedRenderingMode.Disabled); - } -#endif - - // We must perform a yflip if we're rendering into the backbuffer and we have a flipped source texture. - bool yflip = m_PassData.isDstBackbuffer && cameraData.IsHandleYFlipped(source); - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(cmd), m_PassData, this.source, yflip); - } -#endif - private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RTHandle source, bool yflip) { var copyDepthMaterial = passData.copyDepthMaterial; @@ -231,20 +161,6 @@ private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RTHa Blitter.BlitTexture(cmd, source, scaleBias, copyDepthMaterial, 0); } } - - /// - public override void OnCameraCleanup(CommandBuffer cmd) - { -#if URP_COMPATIBILITY_MODE - if (cmd == null) - throw new ArgumentNullException("cmd"); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - destination = k_CameraTarget; - #pragma warning restore CS0618 -#endif - } /// /// Sets up the Copy Depth pass for RenderGraph execution diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs index 60e1463abee..096f03e321f 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs @@ -22,42 +22,6 @@ public DeferredPass(RenderPassEvent evt, DeferredLights deferredLights) m_DeferredLights = deferredLights; } -#if URP_COMPATIBILITY_MODE - // ScriptableRenderPass - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescripor) - { - var lightingAttachment = m_DeferredLights.GbufferAttachments[m_DeferredLights.GBufferLightingIndex]; - var depthAttachment = m_DeferredLights.DepthAttachmentHandle; - - if (m_DeferredLights.UseFramebufferFetch) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureInputAttachments(m_DeferredLights.DeferredInputAttachments, m_DeferredLights.DeferredInputIsTransient); - #pragma warning restore CS0618 - } - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - // TODO: Cannot currently bind depth texture as read-only! - ConfigureTarget(lightingAttachment, depthAttachment); - #pragma warning restore CS0618 - } - - // ScriptableRenderPass - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - UniversalShadowData shadowData = frameData.Get(); - - m_DeferredLights.ExecuteDeferredPass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), cameraData, lightData, shadowData); - } -#endif - private class PassData { internal UniversalCameraData cameraData; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs index d2f247f3af4..6d3f19990f9 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs @@ -22,17 +22,6 @@ public partial class DepthNormalOnlyPass : ScriptableRenderPass private static readonly int s_CameraNormalsTextureID = Shader.PropertyToID(k_CameraNormalsTextureName); private static readonly int s_CameraRenderingLayersTextureID = Shader.PropertyToID("_CameraRenderingLayersTexture"); -#if URP_COMPATIBILITY_MODE - private RTHandle depthHandle { get; set; } - private RTHandle normalHandle { get; set; } - private RTHandle renderingLayersHandle { get; set; } - - private PassData m_PassData; - - private static readonly RTHandle[] k_ColorAttachment1 = new RTHandle[1]; - private static readonly RTHandle[] k_ColorAttachment2 = new RTHandle[2]; -#endif - /// /// Creates a new DepthNormalOnlyPass instance. /// @@ -47,12 +36,7 @@ public DepthNormalOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueRang profilingSampler = ProfilingSampler.Get(URPProfileId.DrawDepthNormalPrepass); m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask); renderPassEvent = evt; - this.shaderTagIds = k_DepthNormals; - -#if URP_COMPATIBILITY_MODE - useNativeRenderPass = false; - m_PassData = new PassData(); -#endif + shaderTagIds = k_DepthNormals; } /// @@ -77,10 +61,6 @@ public static GraphicsFormat GetGraphicsFormat() /// public void Setup(RTHandle depthHandle, RTHandle normalHandle) { -#if URP_COMPATIBILITY_MODE - this.depthHandle = depthHandle; - this.normalHandle = normalHandle; -#endif enableRenderingLayers = false; } @@ -93,42 +73,9 @@ public void Setup(RTHandle depthHandle, RTHandle normalHandle) public void Setup(RTHandle depthHandle, RTHandle normalHandle, RTHandle decalLayerHandle) { Setup(depthHandle, normalHandle); -#if URP_COMPATIBILITY_MODE - renderingLayersHandle = decalLayerHandle; -#endif enableRenderingLayers = true; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - RTHandle[] colorHandles; - if (enableRenderingLayers) - { - k_ColorAttachment2[0] = normalHandle; - k_ColorAttachment2[1] = renderingLayersHandle; - colorHandles = k_ColorAttachment2; - } - else - { - k_ColorAttachment1[0] = normalHandle; - colorHandles = k_ColorAttachment1; - } - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - if (renderingData.cameraData.renderer.useDepthPriming && (renderingData.cameraData.renderType == CameraRenderType.Base || renderingData.cameraData.clearDepth)) - ConfigureTarget(colorHandles, renderingData.cameraData.renderer.cameraDepthTargetHandle); - else - ConfigureTarget(colorHandles, depthHandle); - - ConfigureClear(ClearFlag.All, Color.black); - #pragma warning restore CS0618 - } -#endif - private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RendererList rendererList) { // Enable Rendering Layers @@ -143,29 +90,6 @@ private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, Rend cmd.SetKeyword(ShaderGlobalKeywords.WriteRenderingLayers, false); } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - - m_PassData.enableRenderingLayers = enableRenderingLayers; - var param = InitRendererListParams(universalRenderingData, cameraData,lightData); - var rendererList = context.CreateRendererList(ref param); - - var cmd = CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer); - - using (new ProfilingScope(cmd, profilingSampler)) - { - ExecutePass(cmd, m_PassData, rendererList); - } - } -#endif - /// public override void OnCameraCleanup(CommandBuffer cmd) { @@ -174,12 +98,6 @@ public override void OnCameraCleanup(CommandBuffer cmd) throw new ArgumentNullException("cmd"); } -#if URP_COMPATIBILITY_MODE - normalHandle = null; - depthHandle = null; - renderingLayersHandle = null; -#endif - // This needs to be reset as the renderer might change this in runtime (UUM-36069) shaderTagIds = k_DepthNormals; } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs index 83b7fe14507..d6d258d55ca 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs @@ -16,12 +16,6 @@ public partial class DepthOnlyPass : ScriptableRenderPass FilteringSettings m_FilteringSettings; -#if URP_COMPATIBILITY_MODE - private RTHandle destination { get; set; } - private GraphicsFormat depthStencilFormat; - private PassData m_PassData; -#endif - // Statics private static readonly ShaderTagId k_ShaderTagId = new ShaderTagId("DepthOnly"); private static readonly int s_CameraDepthTextureID = Shader.PropertyToID("_CameraDepthTexture"); @@ -40,12 +34,7 @@ public DepthOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, Lay profilingSampler = new ProfilingSampler("Draw Depth Only"); m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask); renderPassEvent = evt; - this.shaderTagId = k_ShaderTagId; - -#if URP_COMPATIBILITY_MODE - useNativeRenderPass = false; - m_PassData = new PassData(); -#endif + shaderTagId = k_ShaderTagId; } /// @@ -60,41 +49,8 @@ public void Setup( RenderTextureDescriptor baseDescriptor, RTHandle depthAttachmentHandle) { -#if URP_COMPATIBILITY_MODE - this.destination = depthAttachmentHandle; - this.depthStencilFormat = baseDescriptor.depthStencilFormat; -#endif } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - var desc = renderingData.cameraData.cameraTargetDescriptor; - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - - // 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.cameraDepthTargetHandle); - // 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 - { - useNativeRenderPass = true; - ConfigureTarget(destination); - ConfigureClear(ClearFlag.All, Color.black); - } - - #pragma warning restore CS0618 - } -#endif - private static void ExecutePass(RasterCommandBuffer cmd, RendererList rendererList) { using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.DepthPrepass))) @@ -103,23 +59,6 @@ private static void ExecutePass(RasterCommandBuffer cmd, RendererList rendererLi } } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - - var param = InitRendererListParams(universalRenderingData, cameraData, lightData); - RendererList rendererList = context.CreateRendererList(ref param); - - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), rendererList); - } -#endif - private class PassData { internal RendererListHandle rendererList; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs index a58e5d4e2b5..ce4dd6dd6d0 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs @@ -18,14 +18,6 @@ public partial class DrawObjectsPass : ScriptableRenderPass bool m_IsOpaque; -#if URP_COMPATIBILITY_MODE - /// - /// Used to indicate if the active target of the pass is the back buffer - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete + " #from(6000.3)")] - public bool m_IsActiveTargetBackBuffer; // TODO: Remove this when we remove non-RG path -#endif - /// /// Used to indicate whether transparent objects should receive shadows or not. /// @@ -33,10 +25,6 @@ public partial class DrawObjectsPass : ScriptableRenderPass static readonly int s_DrawObjectPassDataPropID = Shader.PropertyToID("_DrawObjectPassData"); -#if URP_COMPATIBILITY_MODE - PassData m_PassData; -#endif - /// /// Creates a new DrawObjectsPass instance. /// @@ -76,7 +64,8 @@ public DrawObjectsPass(string profilerTag, ShaderTagId[] shaderTagIds, bool opaq /// public DrawObjectsPass(string profilerTag, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference) : this(profilerTag, null, opaque, evt, renderQueueRange, layerMask, stencilState, stencilReference) - { } + { + } internal DrawObjectsPass(URPProfileId profileId, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference) { @@ -104,37 +93,8 @@ internal void Init(bool opaque, RenderPassEvent evt, RenderQueueRange renderQueu m_RenderStateBlock.mask = RenderStateMask.Stencil; m_RenderStateBlock.stencilState = stencilState; } - -#if URP_COMPATIBILITY_MODE -#pragma warning disable CS0618 - m_IsActiveTargetBackBuffer = false; -#pragma warning restore CS0618 - m_PassData = new PassData(); -#endif } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - - bool disableZWrite = CanDisableZWrite(cameraData, m_IsOpaque); - - InitPassData(cameraData, ref m_PassData, uint.MaxValue, m_IsActiveTargetBackBuffer); - InitRendererLists(universalRenderingData, cameraData, lightData, ref m_PassData, context, default(RenderGraph), false, disableZWrite); - - using (new ProfilingScope(renderingData.commandBuffer, profilingSampler)) - { - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, m_PassData.rendererList, m_PassData.objectsWithErrorRendererList, m_PassData.cameraData.IsCameraProjectionMatrixFlipped()); - } - } -#endif - internal static void ExecutePass(RasterCommandBuffer cmd, PassData data, RendererList rendererList, RendererList objectsWithErrorRendererList, bool yFlip) { // Global render pass data containing various settings. @@ -197,7 +157,7 @@ internal class PassData internal bool shouldTransparentsReceiveShadows; internal uint batchLayerMask; internal bool isActiveTargetBackBuffer; - internal RendererListHandle rendererListHdl; + internal RendererListHandle rendererListHdl; internal RendererListHandle objectsWithErrorRendererListHdl; internal DebugRendererLists debugRendererLists; @@ -219,7 +179,7 @@ internal void InitPassData(UniversalCameraData cameraData, ref PassData passData passData.isActiveTargetBackBuffer = isActiveTargetBackBuffer; } - internal void InitRendererLists(UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData, ref PassData passData, ScriptableRenderContext context, RenderGraph renderGraph, bool useRenderGraph, bool zWriteOff) + internal void InitRendererLists(UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData, ref PassData passData, RenderGraph renderGraph, bool zWriteOff) { ref Camera camera = ref cameraData.camera; var sortFlags = (m_IsOpaque) ? cameraData.defaultOpaqueSortFlags : SortingCriteria.CommonTransparent; @@ -229,11 +189,11 @@ internal void InitRendererLists(UniversalRenderingData renderingData, UniversalC var filterSettings = m_FilteringSettings; filterSettings.batchLayerMask = passData.batchLayerMask; #if UNITY_EDITOR - // When rendering the preview camera, we want the layer mask to be forced to Everything - if (cameraData.isPreviewCamera) - { - filterSettings.layerMask = -1; - } + // When rendering the preview camera, we want the layer mask to be forced to Everything + if (cameraData.isPreviewCamera) + { + filterSettings.layerMask = -1; + } #endif DrawingSettings drawSettings = RenderingUtils.CreateDrawingSettings(m_ShaderTagIdList, renderingData, cameraData, lightData, sortFlags); @@ -249,29 +209,14 @@ internal void InitRendererLists(UniversalRenderingData renderingData, UniversalC } var activeDebugHandler = GetActiveDebugHandler(cameraData); - if (useRenderGraph) + if (activeDebugHandler != null) { - if (activeDebugHandler != null) - { - passData.debugRendererLists = activeDebugHandler.CreateRendererListsWithDebugRenderState(renderGraph, ref renderingData.cullResults, ref drawSettings, ref filterSettings, ref m_RenderStateBlock); - } - else - { - RenderingUtils.CreateRendererListWithRenderStateBlock(renderGraph, ref renderingData.cullResults, drawSettings, filterSettings, m_RenderStateBlock, ref passData.rendererListHdl); - RenderingUtils.CreateRendererListObjectsWithError(renderGraph, ref renderingData.cullResults, camera, filterSettings, sortFlags, ref passData.objectsWithErrorRendererListHdl); - } + passData.debugRendererLists = activeDebugHandler.CreateRendererListsWithDebugRenderState(renderGraph, ref renderingData.cullResults, ref drawSettings, ref filterSettings, ref m_RenderStateBlock); } else { - if (activeDebugHandler != null) - { - passData.debugRendererLists = activeDebugHandler.CreateRendererListsWithDebugRenderState(context, ref renderingData.cullResults, ref drawSettings, ref filterSettings, ref m_RenderStateBlock); - } - else - { - RenderingUtils.CreateRendererListWithRenderStateBlock(context, ref renderingData.cullResults, drawSettings, filterSettings, m_RenderStateBlock, ref passData.rendererList); - RenderingUtils.CreateRendererListObjectsWithError(context, ref renderingData.cullResults, camera, filterSettings, sortFlags, ref passData.objectsWithErrorRendererList); - } + RenderingUtils.CreateRendererListWithRenderStateBlock(renderGraph, ref renderingData.cullResults, drawSettings, filterSettings, m_RenderStateBlock, ref passData.rendererListHdl); + RenderingUtils.CreateRendererListObjectsWithError(renderGraph, ref renderingData.cullResults, camera, filterSettings, sortFlags, ref passData.objectsWithErrorRendererListHdl); } } @@ -326,7 +271,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur RenderGraphUtils.UseDBufferIfValid(builder, resourceData); - InitRendererLists(renderingData, cameraData, lightData, ref passData, default(ScriptableRenderContext), renderGraph, true, disableZWrite); + InitRendererLists(renderingData, cameraData, lightData, ref passData, renderGraph, disableZWrite); var activeDebugHandler = GetActiveDebugHandler(cameraData); if (activeDebugHandler != null) @@ -380,11 +325,6 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur /// internal class DrawObjectsWithRenderingLayersPass : DrawObjectsPass { -#if URP_COMPATIBILITY_MODE - RTHandle[] m_ColorTargetIndentifiers; - RTHandle m_DepthTargetIndentifiers; -#endif - /// /// Creates a new DrawObjectsWithRenderingLayersPass instance. /// @@ -395,63 +335,12 @@ internal class DrawObjectsWithRenderingLayersPass : DrawObjectsPass /// The layer mask to use for creating filtering settings that control what objects get rendered. /// The stencil settings to use with this poss. /// The stencil reference value to use with this pass. - public DrawObjectsWithRenderingLayersPass(URPProfileId profilerTag, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference) : + public DrawObjectsWithRenderingLayersPass(URPProfileId profilerTag, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, + int stencilReference) : base(profilerTag, opaque, evt, renderQueueRange, layerMask, stencilState, stencilReference) { -#if URP_COMPATIBILITY_MODE - m_ColorTargetIndentifiers = new RTHandle[2]; -#endif - } - -#if URP_COMPATIBILITY_MODE - /// - /// Sets up the pass. - /// - /// Color attachment handle. - /// Texture used with rendering layers. - /// Depth attachment handle. - /// - public void Setup(RTHandle colorAttachment, RTHandle renderingLayersTexture, RTHandle depthAttachment) - { - if (colorAttachment == null) - throw new ArgumentException("Color attachment can not be null", "colorAttachment"); - if (renderingLayersTexture == null) - throw new ArgumentException("Rendering layers attachment can not be null", "renderingLayersTexture"); - if (depthAttachment == null) - throw new ArgumentException("Depth attachment can not be null", "depthAttachment"); - - m_ColorTargetIndentifiers[0] = colorAttachment; - m_ColorTargetIndentifiers[1] = renderingLayersTexture; - m_DepthTargetIndentifiers = depthAttachment; - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(m_ColorTargetIndentifiers, m_DepthTargetIndentifiers); - #pragma warning restore CS0618 } - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = renderingData.commandBuffer; - - // Enable Rendering Layers - cmd.SetKeyword(ShaderGlobalKeywords.WriteRenderingLayers, true); - - // Execute - base.Execute(context, ref renderingData); - - // Clean up - cmd.SetKeyword(ShaderGlobalKeywords.WriteRenderingLayers, false); - } -#endif - private class RenderingLayersPassData { internal PassData basePassData; @@ -463,7 +352,8 @@ public RenderingLayersPassData() } } - internal void Render(RenderGraph renderGraph, ContextContainer frameData, TextureHandle colorTarget, TextureHandle renderingLayersTexture, TextureHandle depthTarget, TextureHandle mainShadowsTexture, TextureHandle additionalShadowsTexture, RenderingLayerUtils.MaskSize maskSize, uint batchLayerMask = uint.MaxValue) + internal void Render(RenderGraph renderGraph, ContextContainer frameData, TextureHandle colorTarget, TextureHandle renderingLayersTexture, TextureHandle depthTarget, + TextureHandle mainShadowsTexture, TextureHandle additionalShadowsTexture, RenderingLayerUtils.MaskSize maskSize, uint batchLayerMask = uint.MaxValue) { using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { @@ -500,7 +390,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur RenderGraphUtils.UseDBufferIfValid(builder, resourceData); } - InitRendererLists(renderingData, cameraData, lightData, ref passData.basePassData, default(ScriptableRenderContext), renderGraph, true, disableZWrite); + InitRendererLists(renderingData, cameraData, lightData, ref passData.basePassData, renderGraph, disableZWrite); var activeDebugHandler = GetActiveDebugHandler(cameraData); if (activeDebugHandler != null) @@ -546,4 +436,4 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur } } } -} +} \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawScreenSpaceUIPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawScreenSpaceUIPass.cs index ba0617602f3..78782b7013f 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawScreenSpaceUIPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawScreenSpaceUIPass.cs @@ -15,10 +15,6 @@ internal class DrawScreenSpaceUIPass : ScriptableRenderPass // Whether to render on an offscreen render texture or on the current active render target bool m_RenderOffscreen; -#if URP_COMPATIBILITY_MODE - PassData m_PassData; -#endif - /// /// Creates a new DrawScreenSpaceUIPass instance. /// @@ -29,11 +25,6 @@ public DrawScreenSpaceUIPass(RenderPassEvent evt, bool renderOffscreen) profilingSampler = ProfilingSampler.Get(URPProfileId.DrawScreenSpaceUI); renderPassEvent = evt; m_RenderOffscreen = renderOffscreen; - -#if URP_COMPATIBILITY_MODE - useNativeRenderPass = false; - m_PassData = new PassData(); -#endif } /// @@ -103,61 +94,7 @@ public void Setup(UniversalCameraData cameraData, GraphicsFormat depthStencilFor RenderingUtils.ReAllocateHandleIfNeeded(ref m_DepthTarget, depthDescriptor, name: "_OverlayUITexture_Depth"); } } - -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - if(m_RenderOffscreen) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(m_ColorTarget, m_DepthTarget); - ConfigureClear(ClearFlag.Color, Color.clear); - #pragma warning restore CS0618 - cmd?.SetGlobalTexture(ShaderPropertyId.overlayUITexture, m_ColorTarget); - } - else - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - DebugHandler debugHandler = GetActiveDebugHandler(cameraData); - bool resolveToDebugScreen = debugHandler != null && debugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget); - - if (resolveToDebugScreen) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(debugHandler.DebugScreenColorHandle, debugHandler.DebugScreenDepthHandle); - #pragma warning restore CS0618 - } - else - { - // Get RTHandle alias to use RTHandle apis - var cameraTarget = RenderingUtils.GetCameraTargetIdentifier(ref renderingData); - RTHandleStaticHelpers.SetRTHandleStaticWrapper(cameraTarget); - var colorTargetHandle = RTHandleStaticHelpers.s_RTHandleWrapper; - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(colorTargetHandle); - #pragma warning restore CS0618 - } - } - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - using (new ProfilingScope(renderingData.commandBuffer, profilingSampler)) - { - RendererList rendererList = context.CreateUIOverlayRendererList(renderingData.cameraData.camera); - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, rendererList); - } - } -#endif - + //RenderGraph path private class PassData { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs index b6892bb91af..2cd6abca752 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs @@ -23,56 +23,6 @@ public DrawSkyboxPass(RenderPassEvent evt) renderPassEvent = evt; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - var activeDebugHandler = GetActiveDebugHandler(cameraData); - if (activeDebugHandler != null) - { - // TODO: The skybox needs to work the same as the other shaders, but until it does we'll not render it - // when certain debug modes are active (e.g. wireframe/overdraw modes) - if (activeDebugHandler.IsScreenClearNeeded) - { - return; - } - } - - var skyRendererList = CreateSkyboxRendererList(context, cameraData); - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), cameraData.xr, skyRendererList); - } - - private RendererList CreateSkyboxRendererList(ScriptableRenderContext context, UniversalCameraData cameraData) - { - var skyRendererList = new RendererList(); - -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - { - // Setup Legacy XR buffer states - if (cameraData.xr.singlePassEnabled) - { - skyRendererList = context.CreateSkyboxRendererList(cameraData.camera, - cameraData.GetProjectionMatrix(0), cameraData.GetViewMatrix(0), - cameraData.GetProjectionMatrix(1), cameraData.GetViewMatrix(1)); - } - else - { - skyRendererList = context.CreateSkyboxRendererList(cameraData.camera, cameraData.GetProjectionMatrix(0), cameraData.GetViewMatrix(0)); - } - } - else -#endif - { - skyRendererList = context.CreateSkyboxRendererList(cameraData.camera); - } - - return skyRendererList; - } -#endif - private RendererListHandle CreateSkyBoxRendererList(RenderGraph renderGraph, UniversalCameraData cameraData) { var skyRendererListHandle = new RendererListHandle(); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs index 22ccd188abc..bfed56e5557 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs @@ -14,11 +14,6 @@ namespace UnityEngine.Rendering.Universal.Internal public partial class FinalBlitPass : ScriptableRenderPass { -#if URP_COMPATIBILITY_MODE - RTHandle m_Source; - private PassData m_PassData; -#endif - // Use specialed URP fragment shader pass for debug draw support and color space conversion/encoding support. // See CoreBlit.shader and BlitHDROverlay.shader static class BlitPassNames @@ -53,10 +48,6 @@ struct BlitMaterialData public FinalBlitPass(RenderPassEvent evt, Material blitMaterial, Material blitHDRMaterial) { profilingSampler = ProfilingSampler.Get(URPProfileId.BlitFinalToBackBuffer); -#if URP_COMPATIBILITY_MODE - base.useNativeRenderPass = false; - m_PassData = new PassData(); -#endif renderPassEvent = evt; // Find sampler passes by name @@ -95,9 +86,6 @@ public void Setup(RenderTextureDescriptor baseDescriptor, RenderTargetHandle col /// public void Setup(RenderTextureDescriptor baseDescriptor, RTHandle colorHandle) { -#if URP_COMPATIBILITY_MODE - m_Source = colorHandle; -#endif } static void SetupHDROutput(ColorGamut hdrDisplayColorGamut, Material material, HDROutputUtils.Operation hdrOperation, Vector4 hdrOutputParameters, bool rendersOverlayUI) @@ -107,124 +95,6 @@ static void SetupHDROutput(ColorGamut hdrDisplayColorGamut, Material material, H CoreUtils.SetKeyword(material, ShaderKeywordStrings.HDROverlay, rendersOverlayUI); } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - DebugHandler debugHandler = GetActiveDebugHandler(cameraData); - bool resolveToDebugScreen = debugHandler != null && debugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget); - - if (resolveToDebugScreen) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(debugHandler.DebugScreenColorHandle, debugHandler.DebugScreenDepthHandle); - #pragma warning restore CS0618 - } - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalCameraData cameraData = frameData.Get(); - - bool outputsToHDR = renderingData.cameraData.isHDROutputActive; - bool outputsAlpha = false; - InitPassData(cameraData, ref m_PassData, outputsToHDR ? BlitType.HDR : BlitType.Core, outputsAlpha); - - if (m_PassData.blitMaterialData.material == null) - { - Debug.LogErrorFormat("Missing {0}. {1} render pass will not execute. Check for missing reference in the renderer resources.", m_PassData.blitMaterialData, GetType().Name); - return; - } - - var cameraTarget = RenderingUtils.GetCameraTargetIdentifier(ref renderingData); - DebugHandler debugHandler = GetActiveDebugHandler(cameraData); - bool resolveToDebugScreen = debugHandler != null && debugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget); - - // Get RTHandle alias to use RTHandle apis - RTHandleStaticHelpers.SetRTHandleStaticWrapper(cameraTarget); - var cameraTargetHandle = RTHandleStaticHelpers.s_RTHandleWrapper; - - var cmd = renderingData.commandBuffer; - - if (m_Source == cameraData.renderer.GetCameraColorFrontBuffer(cmd)) - { - m_Source = renderingData.cameraData.renderer.cameraColorTargetHandle; - } - - using (new ProfilingScope(cmd, profilingSampler)) - { - m_PassData.blitMaterialData.material.enabledKeywords = null; - - debugHandler?.UpdateShaderGlobalPropertiesForFinalValidationPass(cmd, cameraData, !resolveToDebugScreen); - - cmd.SetKeyword(ShaderGlobalKeywords.LinearToSRGBConversion, - cameraData.requireSrgbConversion); - - if (outputsToHDR) - { - VolumeStack stack = VolumeManager.instance.stack; - Tonemapping tonemapping = stack.GetComponent(); - - Vector4 hdrOutputLuminanceParams; - UniversalRenderPipeline.GetHDROutputLuminanceParameters(cameraData.hdrDisplayInformation, cameraData.hdrDisplayColorGamut, tonemapping, out hdrOutputLuminanceParams); - - HDROutputUtils.Operation hdrOperation = HDROutputUtils.Operation.None; - // If the HDRDebugView is on, we don't want the encoding - if (debugHandler == null || !debugHandler.HDRDebugViewIsActive(cameraData.resolveFinalTarget)) - hdrOperation |= HDROutputUtils.Operation.ColorEncoding; - // Color conversion may have happened in the Uber post process through color grading, so we don't want to reapply it - if (!cameraData.postProcessEnabled) - hdrOperation |= HDROutputUtils.Operation.ColorConversion; - - SetupHDROutput(cameraData.hdrDisplayColorGamut, m_PassData.blitMaterialData.material, hdrOperation, hdrOutputLuminanceParams, cameraData.rendersOverlayUI); - } - - if (resolveToDebugScreen) - { - // Blit to the debugger texture instead of the camera target - int shaderPassIndex = m_Source.rt?.filterMode == FilterMode.Bilinear ? m_PassData.blitMaterialData.bilinearSamplerPass : m_PassData.blitMaterialData.nearestSamplerPass; - Vector2 viewportScale = m_Source.useScaling ? new Vector2(m_Source.rtHandleProperties.rtHandleScale.x, m_Source.rtHandleProperties.rtHandleScale.y) : Vector2.one; - Blitter.BlitTexture(cmd, m_Source, viewportScale, m_PassData.blitMaterialData.material, shaderPassIndex); - - cameraData.renderer.ConfigureCameraTarget(debugHandler.DebugScreenColorHandle, debugHandler.DebugScreenDepthHandle); - } - // TODO RENDERGRAPH: See https://jira.unity3d.com/projects/URP/issues/URP-1737 - // This branch of the if statement must be removed for render graph and the new command list with a novel way of using Blitter with fill mode - else if (GL.wireframe && cameraData.isSceneViewCamera) - { - // This set render target is necessary so we change the LOAD state to DontCare. - cmd.SetRenderTarget(BuiltinRenderTextureType.CameraTarget, - RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, // color - RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare); // depth - cmd.Blit(m_Source.nameID, cameraTargetHandle.nameID); - } - else - { - // TODO: Final blit pass should always blit to backbuffer. The first time we do we don't need to Load contents to tile. - // We need to keep in the pipeline of first render pass to each render target to properly set load/store actions. - // meanwhile we set to load so split screen case works. - var loadAction = RenderBufferLoadAction.DontCare; - if (!cameraData.isSceneViewCamera && !cameraData.isDefaultViewport) - loadAction = RenderBufferLoadAction.Load; -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - loadAction = RenderBufferLoadAction.Load; -#endif - - CoreUtils.SetRenderTarget(renderingData.commandBuffer, cameraTargetHandle.nameID, loadAction, RenderBufferStoreAction.Store, ClearFlag.None, Color.clear); - Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(m_Source, cameraTargetHandle, cameraData); - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, m_Source, cameraTargetHandle, cameraData, scaleBias); - cameraData.renderer.ConfigureCameraTarget(cameraTargetHandle, cameraTargetHandle); - } - } - } -#endif private static void ExecutePass(RasterCommandBuffer cmd, PassData data, RTHandle source, RTHandle destination, UniversalCameraData cameraData, Vector4 scaleBias) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs index a2858698b0f..852025e1d74 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs @@ -25,10 +25,6 @@ internal class GBufferPass : ScriptableRenderPass FilteringSettings m_FilteringSettings; RenderStateBlock m_RenderStateBlock; -#if URP_COMPATIBILITY_MODE - private PassData m_PassData; -#endif - public GBufferPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference, DeferredLights deferredLights) { base.profilingSampler = new ProfilingSampler("Draw GBuffer"); @@ -61,99 +57,13 @@ public GBufferPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, Layer s_RenderStateBlocks[3] = DeferredLights.OverwriteStencil(m_RenderStateBlock, (int)StencilUsage.MaterialMask, (int)StencilUsage.MaterialUnlit); // Fill GBuffer, but skip lighting pass for ComplexLit s_RenderStateBlocks[4] = s_RenderStateBlocks[0]; } - -#if URP_COMPATIBILITY_MODE - m_PassData = new PassData(); -#endif } public void Dispose() { m_DeferredLights?.ReleaseGbufferResources(); } - -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - RTHandle[] gbufferAttachments = m_DeferredLights.GbufferAttachments; - - if (cmd != null) - { - var allocateGbufferDepth = true; - if (m_DeferredLights.UseFramebufferFetch && (m_DeferredLights.DepthCopyTexture != null && m_DeferredLights.DepthCopyTexture.rt != null)) - { - m_DeferredLights.GbufferAttachments[m_DeferredLights.GbufferDepthIndex] = m_DeferredLights.DepthCopyTexture; - allocateGbufferDepth = false; - } - // Create and declare the render targets used in the pass - for (int i = 0; i < gbufferAttachments.Length; ++i) - { - // Lighting buffer has already been declared with line ConfigureCameraTarget(m_ActiveCameraColorAttachment.Identifier(), ...) in DeferredRenderer.Setup - if (i == m_DeferredLights.GBufferLightingIndex) - continue; - - // Normal buffer may have already been created if there was a depthNormal prepass before. - // DepthNormal prepass is needed for forward-only materials when SSAO is generated between gbuffer and deferred lighting pass. - if (i == m_DeferredLights.GBufferNormalSmoothnessIndex && m_DeferredLights.HasNormalPrepass) - continue; - - if (i == m_DeferredLights.GbufferDepthIndex && !allocateGbufferDepth) - continue; - - // No need to setup temporaryRTs if we are using input attachments as they will be Memoryless - if (m_DeferredLights.UseFramebufferFetch && (i != m_DeferredLights.GbufferDepthIndex && !m_DeferredLights.HasDepthPrepass)) - continue; - - m_DeferredLights.ReAllocateGBufferIfNeeded(cameraTextureDescriptor, i); - - cmd.SetGlobalTexture(m_DeferredLights.GbufferAttachments[i].name, m_DeferredLights.GbufferAttachments[i].nameID); - } - } - - if (m_DeferredLights.UseFramebufferFetch) - m_DeferredLights.UpdateDeferredInputAttachments(); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(m_DeferredLights.GbufferAttachments, m_DeferredLights.DepthAttachment, m_DeferredLights.GbufferFormats); - - // We must explicitly specify we don't want any clear to avoid unwanted side-effects. - // ScriptableRenderer will implicitly force a clear the first time the camera color/depth targets are bound. - ConfigureClear(ClearFlag.None, Color.black); - #pragma warning restore CS0618 - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - - m_PassData.deferredLights = m_DeferredLights; - InitRendererLists(ref m_PassData, context, default(RenderGraph), universalRenderingData, cameraData, lightData, false); - - var cmd = renderingData.commandBuffer; - using (new ProfilingScope(cmd, profilingSampler)) - { - #if UNITY_EDITOR - // Need to clear the bounded targets to get scene-view filtering working. - if (CoreUtils.IsSceneFilteringEnabled() && cameraData.camera.sceneViewFilterMode == Camera.SceneViewFilterMode.ShowFiltered) - cmd.ClearRenderTarget(RTClearFlags.Color, Color.clear); - #endif - - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(cmd), m_PassData, m_PassData.rendererList, m_PassData.objectsWithErrorRendererList); - - // If any sub-system needs camera normal texture, make it available. - // Input attachments will only be used when this is not needed so safe to skip in that case - if (!m_DeferredLights.UseFramebufferFetch) - renderingData.commandBuffer.SetGlobalTexture(s_CameraNormalsTextureID, m_DeferredLights.GbufferAttachments[m_DeferredLights.GBufferNormalSmoothnessIndex]); - } - } -#endif - + static void ExecutePass(RasterCommandBuffer cmd, PassData data, RendererList rendererList, RendererList errorRendererList) { bool usesRenderingLayers = data.deferredLights.UseRenderingLayers && !data.deferredLights.HasRenderingLayerPrepass; @@ -187,18 +97,9 @@ private class PassData internal RendererListHandle objectsWithErrorRendererListHdl; internal TextureHandle screenSpaceIrradianceHdl; - -#if URP_COMPATIBILITY_MODE - internal TextureHandle[] gbuffer; - internal TextureHandle depth; - - // Required for code sharing purpose between RG and non-RG. - internal RendererList rendererList; - internal RendererList objectsWithErrorRendererList; -#endif } - private void InitRendererLists( ref PassData passData, ScriptableRenderContext context, RenderGraph renderGraph, UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData, bool useRenderGraph, uint batchLayerMask = uint.MaxValue) + private void InitRendererLists( ref PassData passData, ScriptableRenderContext context, RenderGraph renderGraph, UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData, uint batchLayerMask = uint.MaxValue) { // User can stack several scriptable renderers during rendering but deferred renderer should only lit pixels added by this gbuffer pass. // If we detect we are in such case (camera is in overlay mode), we clear the highest bits of stencil we have control of and use them to @@ -222,18 +123,8 @@ private void InitRendererLists( ref PassData passData, ScriptableRenderContext c tagName = s_ShaderTagUniversalMaterialType, isPassTagName = false }; - if (useRenderGraph) - { - passData.rendererListHdl = renderGraph.CreateRendererList(param); - RenderingUtils.CreateRendererListObjectsWithError(renderGraph, ref renderingData.cullResults, cameraData.camera, filterSettings, SortingCriteria.None, ref passData.objectsWithErrorRendererListHdl); - } -#if URP_COMPATIBILITY_MODE - else - { - passData.rendererList = context.CreateRendererList(ref param); - RenderingUtils.CreateRendererListObjectsWithError(context, ref renderingData.cullResults, cameraData.camera, filterSettings, SortingCriteria.None, ref passData.objectsWithErrorRendererList); - } -#endif + passData.rendererListHdl = renderGraph.CreateRendererList(param); + RenderingUtils.CreateRendererListObjectsWithError(renderGraph, ref renderingData.cullResults, cameraData.camera, filterSettings, SortingCriteria.None, ref passData.objectsWithErrorRendererListHdl); tagValues.Dispose(); stateBlocks.Dispose(); @@ -267,7 +158,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur builder.SetRenderAttachmentDepth(cameraDepth, AccessFlags.Write); passData.deferredLights = m_DeferredLights; - InitRendererLists(ref passData, default(ScriptableRenderContext), renderGraph, renderingData, cameraData, lightData, true); + InitRendererLists(ref passData, default, renderGraph, renderingData, cameraData, lightData); builder.UseRendererList(passData.rendererListHdl); builder.UseRendererList(passData.objectsWithErrorRendererListHdl); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/HDRDebugViewPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/HDRDebugViewPass.cs index b549df4c456..581d3ebfdbe 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/HDRDebugViewPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/HDRDebugViewPass.cs @@ -18,12 +18,6 @@ private enum HDRDebugPassId RTHandle m_PassthroughRT; Material m_material; -#if URP_COMPATIBILITY_MODE - PassDataCIExy m_PassDataCIExy; - RTHandle m_CIExyTarget; // xyBuffer; - PassDataDebugView m_PassDataDebugView; -#endif - /// /// Creates a new HDRDebugViewPass instance. /// @@ -33,13 +27,6 @@ public HDRDebugViewPass(Material mat) { profilingSampler = new ProfilingSampler("Blit HDR Debug Data"); renderPassEvent = RenderPassEvent.AfterRendering + 3; -#if URP_COMPATIBILITY_MODE - m_PassDataCIExy = new PassDataCIExy() { material = mat }; - m_PassDataDebugView = new PassDataDebugView() { material = mat }; - - // Disabling native render passes (for non-RG) because it renders to 2 different render targets - useNativeRenderPass = false; -#endif m_material = mat; } @@ -139,9 +126,6 @@ private static void ExecuteHDRDebugViewFinalPass(RasterCommandBuffer cmd, in Pas // Non-RenderGraph path public void Dispose() { -#if URP_COMPATIBILITY_MODE - m_CIExyTarget?.Release(); -#endif m_PassthroughRT?.Release(); } @@ -152,77 +136,11 @@ public void Dispose() /// Active DebugMode for HDR. public void Setup(UniversalCameraData cameraData, HDRDebugMode hdrdebugMode) { -#if URP_COMPATIBILITY_MODE - m_PassDataDebugView.hdrDebugMode = hdrdebugMode; -#endif - RenderTextureDescriptor descriptor = cameraData.cameraTargetDescriptor; DebugHandler.ConfigureColorDescriptorForDebugScreen(ref descriptor, cameraData.pixelWidth, cameraData.pixelHeight); RenderingUtils.ReAllocateHandleIfNeeded(ref m_PassthroughRT, descriptor, name: "_HDRDebugDummyRT"); - -#if URP_COMPATIBILITY_MODE - RenderTextureDescriptor descriptorCIE = cameraData.cameraTargetDescriptor; - HDRDebugViewPass.ConfigureDescriptorForCIEPrepass(ref descriptorCIE); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_CIExyTarget, descriptorCIE, name: "_xyBuffer"); -#endif } - -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - var cmd = renderingData.commandBuffer; - m_PassDataCIExy.luminanceParameters = m_PassDataDebugView.luminanceParameters = GetLuminanceParameters(cameraData); - m_PassDataDebugView.cameraData = cameraData; - - var sourceTexture = renderingData.cameraData.renderer.cameraColorTargetHandle; - - var cameraTarget = RenderingUtils.GetCameraTargetIdentifier(ref renderingData); - // Get RTHandle alias to use RTHandle apis - RTHandleStaticHelpers.SetRTHandleStaticWrapper(cameraTarget); - var cameraTargetHandle = RTHandleStaticHelpers.s_RTHandleWrapper; - - m_material.enabledKeywords = null; - GetActiveDebugHandler(cameraData)?.UpdateShaderGlobalPropertiesForFinalValidationPass(cmd, cameraData, true); - - CoreUtils.SetRenderTarget(cmd, m_CIExyTarget, ClearFlag.Color, Color.clear); - - ExecutePass(cmd, m_PassDataCIExy, m_PassDataDebugView, sourceTexture, m_CIExyTarget, cameraTargetHandle); - } - - private void ExecutePass(CommandBuffer cmd, PassDataCIExy dataCIExy, PassDataDebugView dataDebugView, RTHandle sourceTexture, RTHandle xyTarget, RTHandle destTexture) - { - RasterCommandBuffer rasterCmd = CommandBufferHelpers.GetRasterCommandBuffer(cmd); - - //CIExyPrepass - bool requiresCIExyData = dataDebugView.hdrDebugMode != HDRDebugMode.ValuesAbovePaperWhite; - if (requiresCIExyData) - { - using (new ProfilingScope(cmd, profilingSampler)) - { - ExecuteCIExyPrepass(cmd, dataCIExy, sourceTexture, xyTarget, m_PassthroughRT); - } - } - - //HDR DebugView - should always be the last stack of the camera - CoreUtils.SetRenderTarget(cmd, destTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, ClearFlag.None, Color.clear); - - using (new ProfilingScope(cmd, profilingSampler)) - { - Vector4 scaleBias = RenderingUtils.GetFinalBlitScaleBias(sourceTexture, destTexture, dataDebugView.cameraData); - ExecuteHDRDebugViewFinalPass(rasterCmd, dataDebugView, sourceTexture, scaleBias, destTexture, xyTarget); - } - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - dataDebugView.cameraData.renderer.ConfigureCameraTarget(destTexture, destTexture); - #pragma warning restore CS0618 - } -#endif - - //RenderGraph path + internal void RenderHDRDebug(RenderGraph renderGraph, UniversalCameraData cameraData, TextureHandle srcColor, TextureHandle overlayUITexture, TextureHandle dstColor, HDRDebugMode hdrDebugMode) { bool requiresCIExyData = hdrDebugMode != HDRDebugMode.ValuesAbovePaperWhite; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/InvokeOnRenderObjectCallbackPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/InvokeOnRenderObjectCallbackPass.cs index c2647206564..f1bd1fdf9b5 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/InvokeOnRenderObjectCallbackPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/InvokeOnRenderObjectCallbackPass.cs @@ -13,23 +13,7 @@ public InvokeOnRenderObjectCallbackPass(RenderPassEvent evt) { profilingSampler = new ProfilingSampler("Invoke OnRenderObject Callback"); renderPassEvent = evt; - -#if URP_COMPATIBILITY_MODE - //TODO: should we fix and re-enable native render pass for this pass? - // Currently disabled because when the callback is empty it causes an empty Begin/End RenderPass block, which causes artifacts on Vulkan - useNativeRenderPass = false; -#endif - } - - -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - renderingData.commandBuffer.InvokeOnRenderObjectCallbacks(); } -#endif private class PassData { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs index 58b3983c0e4..d62e73a3b70 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs @@ -33,13 +33,6 @@ public partial class MainLightShadowCasterPass : ScriptableRenderPass private static Vector4 s_EmptyShadowParams = new(0f, 0f, 1f, 0f); private static readonly Vector4 s_EmptyShadowmapSize = new(k_EmptyShadowMapDimensions, 1f / k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions); -#if URP_COMPATIBILITY_MODE - private bool m_EmptyShadowmapNeedsClear; - private RTHandle m_EmptyMainLightShadowmapTexture; - private const string k_EmptyMainLightShadowMapTextureName = "_EmptyMainLightShadowmapTexture"; - private PassData m_PassData; -#endif - // Classes private static class MainLightShadowConstantBuffer { @@ -66,7 +59,6 @@ private class PassData internal UniversalShadowData shadowData; internal MainLightShadowCasterPass pass; internal TextureHandle shadowmapTexture; - internal readonly RendererList[] shadowRendererLists = new RendererList[k_MaxCascades]; internal readonly RendererListHandle[] shadowRendererListsHandle = new RendererListHandle[k_MaxCascades]; } @@ -83,11 +75,6 @@ public MainLightShadowCasterPass(RenderPassEvent evt) m_MainLightShadowMatrices = new Matrix4x4[k_MaxCascades + 1]; m_CascadeSlices = new ShadowSliceData[k_MaxCascades]; m_CascadeSplitDistances = new Vector4[k_MaxCascades]; - -#if URP_COMPATIBILITY_MODE - m_PassData = new PassData(); - m_EmptyShadowmapNeedsClear = true; -#endif } /// @@ -96,10 +83,6 @@ public MainLightShadowCasterPass(RenderPassEvent evt) public void Dispose() { m_MainLightShadowmapTexture?.Release(); - -#if URP_COMPATIBILITY_MODE - m_EmptyMainLightShadowmapTexture?.Release(); -#endif } /// @@ -202,11 +185,7 @@ public bool Setup(UniversalRenderingData renderingData, UniversalCameraData came m_MaxShadowDistanceSq = cameraData.maxShadowDistance * cameraData.maxShadowDistance; m_CascadeBorder = shadowData.mainLightShadowCascadeBorder; - m_CreateEmptyShadowmap = false; -#if URP_COMPATIBILITY_MODE - useNativeRenderPass = true; -#endif - + m_CreateEmptyShadowmap = false; return true; } @@ -227,10 +206,6 @@ bool SetupForEmptyRendering(bool stripShadowsOffVariants, bool shadowsEnabled, L return false; m_CreateEmptyShadowmap = true; -#if URP_COMPATIBILITY_MODE - useNativeRenderPass = false; -#endif - m_SetKeywordForEmptyShadowmap = shadowsEnabled; // Even though there are not real-time shadows, the light might be using shadowmasks, @@ -255,65 +230,6 @@ bool SetupForEmptyRendering(bool stripShadowsOffVariants, bool shadowsEnabled, L return true; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - - if (m_CreateEmptyShadowmap) - { - // Required for scene view camera(URP renderer not initialized) - if (ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_EmptyMainLightShadowmapTexture, k_EmptyShadowMapDimensions, k_EmptyShadowMapDimensions, k_ShadowmapBufferBits, name: k_EmptyMainLightShadowMapTextureName)) - m_EmptyShadowmapNeedsClear = true; - - if (!m_EmptyShadowmapNeedsClear) - return; - - ConfigureTarget(m_EmptyMainLightShadowmapTexture); - m_EmptyShadowmapNeedsClear = false; - } - else - { - ShadowUtils.ShadowRTReAllocateIfNeeded(ref m_MainLightShadowmapTexture, m_RenderTargetWidth, m_RenderTargetHeight, k_ShadowmapBufferBits, name: k_MainLightShadowMapTextureName); - ConfigureTarget(m_MainLightShadowmapTexture); - } - - ConfigureClear(ClearFlag.All, Color.black); - - #pragma warning restore CS0618 - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - UniversalShadowData shadowData = frameData.Get(); - - RasterCommandBuffer rasterCommandBuffer = CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer); - if (m_CreateEmptyShadowmap) - { - if (m_SetKeywordForEmptyShadowmap) - rasterCommandBuffer.EnableKeyword(ShaderGlobalKeywords.MainLightShadows); - SetShadowParamsForEmptyShadowmap(rasterCommandBuffer); - universalRenderingData.commandBuffer.SetGlobalTexture(MainLightShadowConstantBuffer._MainLightShadowmapID, m_EmptyMainLightShadowmapTexture.nameID); - return; - } - - InitPassData(ref m_PassData, universalRenderingData, cameraData, lightData, shadowData); - InitRendererLists(ref m_PassData, context, default(RenderGraph), false); - - RenderMainLightCascadeShadowmap(rasterCommandBuffer, ref m_PassData, false); - universalRenderingData.commandBuffer.SetGlobalTexture(MainLightShadowConstantBuffer._MainLightShadowmapID, m_MainLightShadowmapTexture.nameID); - } -#endif - void Clear() { for (int i = 0; i < m_MainLightShadowMatrices.Length; ++i) @@ -332,7 +248,7 @@ internal static void SetShadowParamsForEmptyShadowmap(RasterCommandBuffer raster rasterCommandBuffer.SetGlobalVector(MainLightShadowConstantBuffer._ShadowParams, s_EmptyShadowParams); } - void RenderMainLightCascadeShadowmap(RasterCommandBuffer cmd, ref PassData data, bool isRenderGraph) + void RenderMainLightCascadeShadowmap(RasterCommandBuffer cmd, ref PassData data) { var lightData = data.lightData; @@ -347,17 +263,12 @@ void RenderMainLightCascadeShadowmap(RasterCommandBuffer cmd, ref PassData data, // Need to start by setting the Camera position and worldToCamera Matrix as that is not set for passes executed before normal rendering ShadowUtils.SetCameraPosition(cmd, data.cameraData.worldSpaceCameraPos); - // For non-RG, need set the worldToCamera Matrix as that is not set for passes executed before normal rendering, - // otherwise shadows will behave incorrectly when Scene and Game windows are open at the same time (UUM-63267). - if (!isRenderGraph) - ShadowUtils.SetWorldToCameraAndCameraToWorldMatrices(cmd, data.cameraData.GetViewMatrix()); - for (int cascadeIndex = 0; cascadeIndex < m_ShadowCasterCascadesCount; ++cascadeIndex) { Vector4 shadowBias = ShadowUtils.GetShadowBias(ref shadowLight, shadowLightIndex, data.shadowData, m_CascadeSlices[cascadeIndex].projectionMatrix, m_CascadeSlices[cascadeIndex].resolution); ShadowUtils.SetupShadowCasterConstantBuffer(cmd, ref shadowLight, shadowBias); cmd.SetKeyword(ShaderGlobalKeywords.CastingPunctualLightShadow, false); - RendererList shadowRendererList = isRenderGraph? data.shadowRendererListsHandle[cascadeIndex] : data.shadowRendererLists[cascadeIndex]; + RendererList shadowRendererList = data.shadowRendererListsHandle[cascadeIndex]; ShadowUtils.RenderShadowSlice(cmd, ref m_CascadeSlices[cascadeIndex], ref shadowRendererList, m_CascadeSlices[cascadeIndex].projectionMatrix, m_CascadeSlices[cascadeIndex].viewMatrix); } @@ -451,7 +362,7 @@ private void InitPassData( passData.shadowData = shadowData; } - private void InitRendererLists(ref PassData passData, ScriptableRenderContext context, RenderGraph renderGraph, bool useRenderGraph) + private void InitRendererLists(ref PassData passData, RenderGraph renderGraph) { int shadowLightIndex = passData.lightData.mainLightIndex; if (!m_CreateEmptyShadowmap && shadowLightIndex != -1) @@ -462,10 +373,7 @@ private void InitRendererLists(ref PassData passData, ScriptableRenderContext co for (int cascadeIndex = 0; cascadeIndex < m_ShadowCasterCascadesCount; ++cascadeIndex) { - if (useRenderGraph) passData.shadowRendererListsHandle[cascadeIndex] = renderGraph.CreateShadowRendererList(ref settings); - else - passData.shadowRendererLists[cascadeIndex] = context.CreateShadowRendererList(ref settings); } } } @@ -482,7 +390,7 @@ internal TextureHandle Render(RenderGraph graph, ContextContainer frameData) using (var builder = graph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { InitPassData(ref passData, renderingData, cameraData, lightData, shadowData); - InitRendererLists(ref passData, default(ScriptableRenderContext), graph, true); + InitRendererLists(ref passData, graph); if (!m_CreateEmptyShadowmap) { @@ -509,7 +417,7 @@ internal TextureHandle Render(RenderGraph graph, ContextContainer frameData) RasterCommandBuffer rasterCommandBuffer = context.cmd; if (!data.emptyShadowmap) { - data.pass.RenderMainLightCascadeShadowmap(rasterCommandBuffer, ref data, true); + data.pass.RenderMainLightCascadeShadowmap(rasterCommandBuffer, ref data); } else { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs index 180fc93f6ac..f88d3d5d99d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs @@ -20,12 +20,6 @@ sealed class MotionVectorRenderPass : ScriptableRenderPass readonly Material m_CameraMaterial; readonly FilteringSettings m_FilteringSettings; -#if URP_COMPATIBILITY_MODE - RTHandle m_Color; - RTHandle m_Depth; - private PassData m_PassData; -#endif - internal MotionVectorRenderPass(RenderPassEvent evt, Material cameraMaterial, LayerMask opaqueLayerMask) { @@ -35,38 +29,8 @@ internal MotionVectorRenderPass(RenderPassEvent evt, Material cameraMaterial, La m_FilteringSettings = new FilteringSettings(RenderQueueRange.opaque,opaqueLayerMask); ConfigureInput(ScriptableRenderPassInput.Depth); - -#if URP_COMPATIBILITY_MODE - m_PassData = new PassData(); -#endif - } - -#if URP_COMPATIBILITY_MODE - internal void Setup(RTHandle color, RTHandle depth) - { - m_Color = color; - m_Depth = depth; } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - cmd.SetGlobalTexture(m_Color.name, m_Color.nameID); - cmd.SetGlobalTexture(m_Depth.name, m_Depth.nameID); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(m_Color, m_Depth); - ConfigureClear(ClearFlag.Color | ClearFlag.Depth, Color.black); - - // Can become a Store based on 'StoreActionsOptimization.Auto' and/or if a user RendererFeature is added. - // We need to keep the MotionVecDepth in case of a user wants to extend the motion vectors - // using a custom RendererFeature. - ConfigureDepthStoreAction(RenderBufferStoreAction.DontCare); - #pragma warning restore CS0618 - } -#endif - + private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RendererList rendererList) { var cameraMaterial = passData.cameraMaterial; @@ -90,28 +54,6 @@ private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, Rend DrawObjectMotionVectors(cmd, passData.xr, ref rendererList); } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - - var cmd = CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer); - - // Profiling command - using (new ProfilingScope(cmd,profilingSampler)) - { - InitPassData(ref m_PassData, cameraData); - InitRendererLists(ref m_PassData, ref universalRenderingData.cullResults, universalRenderingData.supportsDynamicBatching, - context, default(RenderGraph), false); - - ExecutePass(cmd, m_PassData, m_PassData.rendererList); - } - } -#endif - private static DrawingSettings GetDrawingSettings(Camera camera, bool supportsDynamicBatching) { var sortingSettings = new SortingSettings(camera) { criteria = SortingCriteria.CommonOpaque }; @@ -199,14 +141,11 @@ private void InitPassData(ref PassData passData, UniversalCameraData cameraData) passData.cameraMaterial = m_CameraMaterial; } - private void InitRendererLists(ref PassData passData, ref CullingResults cullResults, bool supportsDynamicBatching, ScriptableRenderContext context, RenderGraph renderGraph, bool useRenderGraph) + private void InitRendererLists(ref PassData passData, ref CullingResults cullResults, bool supportsDynamicBatching, RenderGraph renderGraph) { var drawingSettings = GetDrawingSettings(passData.camera, supportsDynamicBatching); var renderStateBlock = new RenderStateBlock(RenderStateMask.Nothing); - if (useRenderGraph) - RenderingUtils.CreateRendererListWithRenderStateBlock(renderGraph, ref cullResults, drawingSettings, m_FilteringSettings, renderStateBlock, ref passData.rendererListHdl); - else - RenderingUtils.CreateRendererListWithRenderStateBlock(context, ref cullResults, drawingSettings, m_FilteringSettings, renderStateBlock, ref passData.rendererList); + RenderingUtils.CreateRendererListWithRenderStateBlock(renderGraph, ref cullResults, drawingSettings, m_FilteringSettings, renderStateBlock, ref passData.rendererListHdl); } internal void Render(RenderGraph renderGraph, ContextContainer frameData, TextureHandle cameraDepthTexture, TextureHandle motionVectorColor, TextureHandle motionVectorDepth) @@ -231,8 +170,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur passData.cameraDepth = cameraDepthTexture; builder.UseTexture(cameraDepthTexture, AccessFlags.Read); - InitRendererLists(ref passData, ref renderingData.cullResults, renderingData.supportsDynamicBatching, - default(ScriptableRenderContext), renderGraph, true); + InitRendererLists(ref passData, ref renderingData.cullResults, renderingData.supportsDynamicBatching, renderGraph); builder.UseRendererList(passData.rendererListHdl); if (motionVectorColor.IsValid()) @@ -256,17 +194,7 @@ public class MotionMatrixPassData { public MotionVectorsPersistentData motionData; public XRPass xr; - }; - -#if URP_COMPATIBILITY_MODE - internal static void SetMotionVectorGlobalMatrices(CommandBuffer cmd, UniversalCameraData cameraData) - { - if (cameraData.camera.TryGetComponent(out var additionalCameraData)) - { - additionalCameraData.motionVectorsPersistentData?.SetGlobalMotionMatrices(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData.xr); - } } -#endif internal static void SetRenderGraphMotionVectorGlobalMatrices(RenderGraph renderGraph, UniversalCameraData cameraData) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs deleted file mode 100644 index 6854695b923..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs +++ /dev/null @@ -1,1982 +0,0 @@ -#if URP_COMPATIBILITY_MODE -using System; -using System.Runtime.CompilerServices; -using UnityEngine.Experimental.Rendering; - -namespace UnityEngine.Rendering.Universal.CompatibilityMode -{ - /// - /// Renders the post-processing effect stack. - /// - internal class PostProcessPass : ScriptableRenderPass - { - RenderTextureDescriptor m_Descriptor; - RTHandle m_Source; - RTHandle m_Destination; - RTHandle m_Depth; - RTHandle m_InternalLut; - RTHandle m_MotionVectors; - RTHandle m_FullCoCTexture; - RTHandle m_HalfCoCTexture; - RTHandle m_PingTexture; - RTHandle m_PongTexture; - RTHandle[] m_BloomMipDown; - RTHandle[] m_BloomMipUp; - string[] m_BloomMipDownName; - string[] m_BloomMipUpName; - RTHandle m_BlendTexture; - RTHandle m_EdgeColorTexture; - RTHandle m_EdgeStencilTexture; - RTHandle m_TempTarget; - RTHandle m_TempTarget2; - RTHandle m_StreakTmpTexture; - RTHandle m_StreakTmpTexture2; - RTHandle m_ScreenSpaceLensFlareResult; - RTHandle m_UserLut; - - const string k_RenderPostProcessingTag = "Blit PostProcessing Effects"; - const string k_RenderFinalPostProcessingTag = "Blit Final PostProcessing"; - private static readonly ProfilingSampler m_ProfilingRenderPostProcessing = new ProfilingSampler(k_RenderPostProcessingTag); - private static readonly ProfilingSampler m_ProfilingRenderFinalPostProcessing = new ProfilingSampler(k_RenderFinalPostProcessingTag); - - MaterialLibrary m_Materials; - PostProcessData m_Data; - - // Builtin effects settings - DepthOfField m_DepthOfField; - MotionBlur m_MotionBlur; - ScreenSpaceLensFlare m_LensFlareScreenSpace; - PaniniProjection m_PaniniProjection; - Bloom m_Bloom; - LensDistortion m_LensDistortion; - ChromaticAberration m_ChromaticAberration; - Vignette m_Vignette; - ColorLookup m_ColorLookup; - ColorAdjustments m_ColorAdjustments; - Tonemapping m_Tonemapping; - FilmGrain m_FilmGrain; - - // Depth Of Field shader passes - const int k_GaussianDoFPassComputeCoc = 0; - const int k_GaussianDoFPassDownscalePrefilter = 1; - const int k_GaussianDoFPassBlurH = 2; - const int k_GaussianDoFPassBlurV = 3; - const int k_GaussianDoFPassComposite = 4; - - const int k_BokehDoFPassComputeCoc = 0; - const int k_BokehDoFPassDownscalePrefilter = 1; - const int k_BokehDoFPassBlur = 2; - const int k_BokehDoFPassPostFilter = 3; - const int k_BokehDoFPassComposite = 4; - - - // Misc - const int k_MaxPyramidSize = 16; - readonly GraphicsFormat m_DefaultColorFormat; // The default format for post-processing, follows back-buffer format in URP. - bool m_DefaultColorFormatIsAlpha; - readonly GraphicsFormat m_SMAAEdgeFormat; - readonly GraphicsFormat m_GaussianCoCFormat; - - int m_DitheringTextureIndex; - RenderTargetIdentifier[] m_MRT2; - Vector4[] m_BokehKernel; - int m_BokehHash; - // Needed if the device changes its render target width/height (ex, Mobile platform allows change of orientation) - float m_BokehMaxRadius; - float m_BokehRCPAspect; - - // True when this is the very last pass in the pipeline - bool m_IsFinalPass; - - // If there's a final post process pass after this pass. - // If yes, Film Grain and Dithering are setup in the final pass, otherwise they are setup in this pass. - bool m_HasFinalPass; - - // Some Android devices do not support sRGB backbuffer - // We need to do the conversion manually on those - // Also if HDR output is active - bool m_EnableColorEncodingIfNeeded; - - // Use Fast conversions between SRGB and Linear - bool m_UseFastSRGBLinearConversion; - - // Support Screen Space Lens Flare post process effect - bool m_SupportScreenSpaceLensFlare; - - // Support Data Driven Lens Flare post process effect - bool m_SupportDataDrivenLensFlare; - - // Blit to screen or color frontbuffer at the end - bool m_ResolveToScreen; - - // Renderer is using swapbuffer system - bool m_UseSwapBuffer; - - // RTHandle used as a temporary target when operations need to be performed before image scaling - RTHandle m_ScalingSetupTarget; - - // RTHandle used as a temporary target when operations need to be performed after upscaling - RTHandle m_UpscaledTarget; - - Material m_BlitMaterial; - - internal bool useLensFlare => !LensFlareCommonSRP.Instance.IsEmpty() && m_SupportDataDrivenLensFlare; - - /// - /// Creates a new PostProcessPass instance. - /// - /// The RenderPassEvent to use. - /// The PostProcessData resources to use. - /// The PostProcessParams run-time params to use. - /// - /// - /// - public PostProcessPass(RenderPassEvent evt, PostProcessData data, ref PostProcessParams postProcessParams) - { - profilingSampler = new ProfilingSampler(nameof(PostProcessPass)); - renderPassEvent = evt; - m_Data = data; - m_Materials = new MaterialLibrary(data); - - m_BloomMipUp = new RTHandle[k_MaxPyramidSize]; - m_BloomMipDown = new RTHandle[k_MaxPyramidSize]; - m_BloomMipDownName = new string[k_MaxPyramidSize]; - m_BloomMipUpName = new string[k_MaxPyramidSize]; - - for (int i = 0; i < k_MaxPyramidSize; i++) - { - m_BloomMipUpName[i] = "_BloomMipUp" + i; - m_BloomMipDownName[i] = "_BloomMipDown" + i; - } - - m_MRT2 = new RenderTargetIdentifier[2]; - base.useNativeRenderPass = false; - - m_BlitMaterial = postProcessParams.blitMaterial; - - // NOTE: Request color format is the back-buffer color format. It can be HDR or SDR (when HDR disabled). - // Request color might have alpha or might not have alpha. - // The actual post-process target can be different. A RenderTexture with a custom format. Not necessarily a back-buffer. - // A RenderTexture with a custom format can have an alpha channel, regardless of the back-buffer setting, - // so the post-processing should just use the current target format/alpha to toggle alpha output. - // - // However, we want to filter out the alpha shader variants when not used (common case). - // The rule is that URP post-processing format follows the back-buffer format setting. - - bool requestHDR = IsHDRFormat(postProcessParams.requestColorFormat); - bool requestAlpha = IsAlphaFormat(postProcessParams.requestColorFormat); - - // Texture format pre-lookup - // UUM-41070: We require `Linear | Render` but with the deprecated FormatUsage this was checking `Blend` - // For now, we keep checking for `Blend` until the performance hit of doing the correct checks is evaluated - if (requestHDR) - { - m_DefaultColorFormatIsAlpha = requestAlpha; - - const GraphicsFormatUsage usage = GraphicsFormatUsage.Blend; - if (SystemInfo.IsFormatSupported(postProcessParams.requestColorFormat, usage)) // Typically, RGBA16Float. - { - m_DefaultColorFormat = postProcessParams.requestColorFormat; - } - else if (SystemInfo.IsFormatSupported(GraphicsFormat.B10G11R11_UFloatPack32, usage)) // HDR fallback - { - // NOTE: Technically request format can be with alpha, however if it's not supported and we fall back here - // , we assume no alpha. Post-process default format follows the back buffer format. - // If support failed, it must have failed for back buffer too. - m_DefaultColorFormat = GraphicsFormat.B10G11R11_UFloatPack32; - m_DefaultColorFormatIsAlpha = false; - } - else - { - m_DefaultColorFormat = QualitySettings.activeColorSpace == ColorSpace.Linear - ? GraphicsFormat.R8G8B8A8_SRGB - : GraphicsFormat.R8G8B8A8_UNorm; - } - } - else // SDR - { - m_DefaultColorFormat = QualitySettings.activeColorSpace == ColorSpace.Linear - ? GraphicsFormat.R8G8B8A8_SRGB - : GraphicsFormat.R8G8B8A8_UNorm; - - m_DefaultColorFormatIsAlpha = true; - } - - // Only two components are needed for edge render texture, but on some vendors four components may be faster. - if (SystemInfo.IsFormatSupported(GraphicsFormat.R8G8_UNorm, GraphicsFormatUsage.Render) && SystemInfo.graphicsDeviceVendor.ToLowerInvariant().Contains("arm")) - m_SMAAEdgeFormat = GraphicsFormat.R8G8_UNorm; - else - m_SMAAEdgeFormat = GraphicsFormat.R8G8B8A8_UNorm; - - // UUM-41070: We require `Linear | Render` but with the deprecated FormatUsage this was checking `Blend` - // For now, we keep checking for `Blend` until the performance hit of doing the correct checks is evaluated - if (SystemInfo.IsFormatSupported(GraphicsFormat.R16_UNorm, GraphicsFormatUsage.Blend)) - m_GaussianCoCFormat = GraphicsFormat.R16_UNorm; - else if (SystemInfo.IsFormatSupported(GraphicsFormat.R16_SFloat, GraphicsFormatUsage.Blend)) - m_GaussianCoCFormat = GraphicsFormat.R16_SFloat; - else // Expect CoC banding - m_GaussianCoCFormat = GraphicsFormat.R8_UNorm; - } - - /// - /// Cleans up the Material Library used in the passes. - /// - public void Cleanup() - { - m_Materials.Cleanup(); - Dispose(); - } - - /// - /// Disposes used resources. - /// - public void Dispose() - { - foreach (var handle in m_BloomMipDown) - handle?.Release(); - foreach (var handle in m_BloomMipUp) - handle?.Release(); - m_ScalingSetupTarget?.Release(); - m_UpscaledTarget?.Release(); - m_FullCoCTexture?.Release(); - m_HalfCoCTexture?.Release(); - m_PingTexture?.Release(); - m_PongTexture?.Release(); - m_BlendTexture?.Release(); - m_EdgeColorTexture?.Release(); - m_EdgeStencilTexture?.Release(); - m_TempTarget?.Release(); - m_TempTarget2?.Release(); - m_StreakTmpTexture?.Release(); - m_StreakTmpTexture2?.Release(); - m_ScreenSpaceLensFlareResult?.Release(); - m_UserLut?.Release(); - } - - /// - /// Configures the pass. - /// - /// - /// - /// - /// - /// - /// - /// - public void Setup(in RenderTextureDescriptor baseDescriptor, in RTHandle source, bool resolveToScreen, in RTHandle depth, in RTHandle internalLut, in RTHandle motionVectors, bool hasFinalPass, bool enableColorEncoding) - { - m_Descriptor = baseDescriptor; - m_Descriptor.useMipMap = false; - m_Descriptor.autoGenerateMips = false; - m_Source = source; - m_Depth = depth; - m_InternalLut = internalLut; - m_MotionVectors = motionVectors; - m_IsFinalPass = false; - m_HasFinalPass = hasFinalPass; - m_EnableColorEncodingIfNeeded = enableColorEncoding; - m_ResolveToScreen = resolveToScreen; - m_UseSwapBuffer = true; - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - m_Destination = k_CameraTarget; - #pragma warning restore CS0618 - } - - /// - /// Configures the Final pass. - /// - /// - /// - /// - public void SetupFinalPass(in RTHandle source, bool useSwapBuffer = false, bool enableColorEncoding = true) - { - m_Source = source; - m_IsFinalPass = true; - m_HasFinalPass = false; - m_EnableColorEncodingIfNeeded = enableColorEncoding; - m_UseSwapBuffer = useSwapBuffer; - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - m_Destination = k_CameraTarget; - #pragma warning restore CS0618 - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - overrideCameraTarget = true; - } - - public bool CanRunOnTile() - { - // Check builtin & user effects here - return false; - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - // Start by pre-fetching all builtin effect settings we need - // Some of the color-grading settings are only used in the color grading lut pass - var stack = VolumeManager.instance.stack; - m_DepthOfField = stack.GetComponent(); - m_MotionBlur = stack.GetComponent(); - m_LensFlareScreenSpace = stack.GetComponent(); - m_PaniniProjection = stack.GetComponent(); - m_Bloom = stack.GetComponent(); - m_LensDistortion = stack.GetComponent(); - m_ChromaticAberration = stack.GetComponent(); - m_Vignette = stack.GetComponent(); - m_ColorLookup = stack.GetComponent(); - m_ColorAdjustments = stack.GetComponent(); - m_Tonemapping = stack.GetComponent(); - m_FilmGrain = stack.GetComponent(); - m_UseFastSRGBLinearConversion = renderingData.postProcessingData.useFastSRGBLinearConversion; - m_SupportScreenSpaceLensFlare = renderingData.postProcessingData.supportScreenSpaceLensFlare; - m_SupportDataDrivenLensFlare = renderingData.postProcessingData.supportDataDrivenLensFlare; - - var cmd = renderingData.commandBuffer; - if (m_IsFinalPass) - { - using (new ProfilingScope(cmd, m_ProfilingRenderFinalPostProcessing)) - { - RenderFinalPass(cmd, ref renderingData); - } - } - else if (CanRunOnTile()) - { - // TODO: Add a fast render path if only on-tile compatible effects are used and we're actually running on a platform that supports it - // Note: we can still work on-tile if FXAA is enabled, it'd be part of the final pass - } - else - { - // Regular render path (not on-tile) - we do everything in a single command buffer as it - // makes it easier to manage temporary targets' lifetime - using (new ProfilingScope(cmd, m_ProfilingRenderPostProcessing)) - { - Render(cmd, ref renderingData); - } - } - } - - bool IsHDRFormat(GraphicsFormat format) - { - return format == GraphicsFormat.B10G11R11_UFloatPack32 || - GraphicsFormatUtility.IsHalfFormat(format) || - GraphicsFormatUtility.IsFloatFormat(format); - } - - bool IsAlphaFormat(GraphicsFormat format) - { - return GraphicsFormatUtility.HasAlphaChannel(format); - } - - RenderTextureDescriptor GetCompatibleDescriptor() - => GetCompatibleDescriptor(m_Descriptor.width, m_Descriptor.height, m_Descriptor.graphicsFormat); - - RenderTextureDescriptor GetCompatibleDescriptor(int width, int height, GraphicsFormat format, GraphicsFormat depthStencilFormat = GraphicsFormat.None) - => GetCompatibleDescriptor(m_Descriptor, width, height, format, depthStencilFormat); - - internal static RenderTextureDescriptor GetCompatibleDescriptor(RenderTextureDescriptor desc, int width, int height, GraphicsFormat format, GraphicsFormat depthStencilFormat = GraphicsFormat.None) - { - desc.depthStencilFormat = depthStencilFormat; - desc.msaaSamples = 1; - desc.width = width; - desc.height = height; - desc.graphicsFormat = format; - return desc; - } - - bool RequireSRGBConversionBlitToBackBuffer(bool requireSrgbConversion) - { - return requireSrgbConversion && m_EnableColorEncodingIfNeeded; - } - - bool RequireHDROutput(UniversalCameraData cameraData) - { - // If capturing, don't convert to HDR. - // If not last in the stack, don't convert to HDR. - return cameraData.isHDROutputActive && cameraData.captureActions == null; - } - - void Render(CommandBuffer cmd, ref RenderingData renderingData) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - ref ScriptableRenderer renderer = ref cameraData.renderer; - bool isSceneViewCamera = cameraData.isSceneViewCamera; - - //Check amount of swaps we have to do - //We blit back and forth without msaa until the last blit. - bool useStopNan = cameraData.isStopNaNEnabled && m_Materials.stopNaN != null; - bool useSubPixeMorpAA = cameraData.antialiasing == AntialiasingMode.SubpixelMorphologicalAntiAliasing; - var dofMaterial = m_DepthOfField.mode.value == DepthOfFieldMode.Gaussian ? m_Materials.gaussianDepthOfField : m_Materials.bokehDepthOfField; - bool useDepthOfField = m_DepthOfField.IsActive() && !isSceneViewCamera && dofMaterial != null; - bool useLensFlareScreenSpace = m_LensFlareScreenSpace.IsActive() && m_SupportScreenSpaceLensFlare; - bool useMotionBlur = m_MotionBlur.IsActive() && !isSceneViewCamera; - bool usePaniniProjection = m_PaniniProjection.IsActive() && !isSceneViewCamera; - - // Disable MotionBlur in EditMode, so that editing remains clear and readable. - // NOTE: HDRP does the same via CoreUtils::AreAnimatedMaterialsEnabled(). - useMotionBlur = useMotionBlur && Application.isPlaying; - - // Note that enabling jitters uses the same CameraData::IsTemporalAAEnabled(). So if we add any other kind of overrides (like - // disable useTemporalAA if another feature is disabled) then we need to put it in CameraData::IsTemporalAAEnabled() as opposed - // to tweaking the value here. - bool useTemporalAA = cameraData.IsTemporalAAEnabled(); - if (cameraData.IsTemporalAARequested() && !useTemporalAA) - TemporalAA.ValidateAndWarn(cameraData); - - int amountOfPassesRemaining = (useStopNan ? 1 : 0) + (useSubPixeMorpAA ? 1 : 0) + (useDepthOfField ? 1 : 0) + (useLensFlare ? 1 : 0) + (useTemporalAA ? 1 : 0) + (useMotionBlur ? 1 : 0) + (usePaniniProjection ? 1 : 0); - - if (m_UseSwapBuffer && amountOfPassesRemaining > 0) - { - renderer.EnableSwapBufferMSAA(false); - } - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - // Don't use these directly unless you have a good reason to, use GetSource() and - // GetDestination() instead - RTHandle source = m_UseSwapBuffer ? renderer.cameraColorTargetHandle : m_Source; - RTHandle destination = m_UseSwapBuffer ? renderer.GetCameraColorFrontBuffer(cmd) : null; - #pragma warning restore CS0618 - - RTHandle GetSource() => source; - - RTHandle GetDestination() - { - if (destination == null) - { - RenderingUtils.ReAllocateHandleIfNeeded(ref m_TempTarget, GetCompatibleDescriptor(), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_TempTarget"); - destination = m_TempTarget; - } - else if (destination == m_Source && m_Descriptor.msaaSamples > 1) - { - // Avoid using m_Source.id as new destination, it may come with a depth buffer that we don't want, may have MSAA that we don't want etc - RenderingUtils.ReAllocateHandleIfNeeded(ref m_TempTarget2, GetCompatibleDescriptor(), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_TempTarget2"); - destination = m_TempTarget2; - } - return destination; - } - - void Swap(ref ScriptableRenderer r) - { - --amountOfPassesRemaining; - if (m_UseSwapBuffer) - { - r.SwapColorBuffer(cmd); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - source = r.cameraColorTargetHandle; - #pragma warning restore CS0618 - - //we want the last blit to be to MSAA - if (amountOfPassesRemaining == 0 && !m_HasFinalPass) - r.EnableSwapBufferMSAA(true); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - destination = r.GetCameraColorFrontBuffer(cmd); - #pragma warning restore CS0618 - } - else - { - CoreUtils.Swap(ref source, ref destination); - } - } - - // Setup projection matrix for cmd.DrawMesh() - cmd.SetGlobalMatrix(ShaderConstants._FullscreenProjMat, GL.GetGPUProjectionMatrix(Matrix4x4.identity, true)); - - // Optional NaN killer before post-processing kicks in - // stopNaN may be null on Adreno 3xx. It doesn't support full shader level 3.5, but SystemInfo.graphicsShaderLevel is 35. - if (useStopNan) - { - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.StopNaNs))) - { - Blitter.BlitCameraTexture(cmd, GetSource(), GetDestination(), RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, m_Materials.stopNaN, 0); - Swap(ref renderer); - } - } - - // Anti-aliasing - if (useSubPixeMorpAA) - { - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.SMAA))) - { - DoSubpixelMorphologicalAntialiasing(ref renderingData.cameraData, cmd, GetSource(), GetDestination()); - Swap(ref renderer); - } - } - - // Depth of Field - // Adreno 3xx SystemInfo.graphicsShaderLevel is 35, but instancing support is disabled due to buggy drivers. - // DOF shader uses #pragma target 3.5 which adds requirement for instancing support, thus marking the shader unsupported on those devices. - if (useDepthOfField) - { - var markerName = m_DepthOfField.mode.value == DepthOfFieldMode.Gaussian - ? URPProfileId.GaussianDepthOfField - : URPProfileId.BokehDepthOfField; - - using (new ProfilingScope(cmd, ProfilingSampler.Get(markerName))) - { - DoDepthOfField(ref renderingData.cameraData, cmd, GetSource(), GetDestination(), cameraData.pixelRect); - Swap(ref renderer); - } - } - - // Temporal Anti Aliasing - if (useTemporalAA) - { - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.TemporalAA))) - { - Debug.Assert(m_MotionVectors != null, "MotionVectors are invalid. TAA requires a motion vector texture."); - - TemporalAA.ExecutePass(cmd, m_Materials.temporalAntialiasing, ref renderingData.cameraData, source, destination, m_MotionVectors?.rt); - Swap(ref renderer); - } - } - - - // Motion blur - if (useMotionBlur) - { - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.MotionBlur))) - { - DoMotionBlur(cmd, GetSource(), GetDestination(), m_MotionVectors, ref renderingData.cameraData); - Swap(ref renderer); - } - } - - // Panini projection is done as a fullscreen pass after all depth-based effects are done - // and before bloom kicks in - if (usePaniniProjection) - { - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.PaniniProjection))) - { - DoPaniniProjection(cameraData.camera, cmd, GetSource(), GetDestination()); - Swap(ref renderer); - } - } - - // Combined post-processing stack - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.UberPostProcess))) - { - // Reset uber keywords - m_Materials.uber.shaderKeywords = null; - - // Bloom goes first - bool bloomActive = m_Bloom.IsActive(); - bool lensFlareScreenSpaceActive = m_LensFlareScreenSpace.IsActive(); - - // We need to still do the bloom pass if lens flare screen space is active because it uses _Bloom_Texture. - if (bloomActive || lensFlareScreenSpaceActive) - { - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.Bloom))) - SetupBloom(cmd, GetSource(), m_Materials.uber, cameraData.isAlphaOutputEnabled); - } - - // Lens Flare Screen Space - if (useLensFlareScreenSpace) - { - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.LensFlareScreenSpace))) - { - // We clamp the bloomMip value to avoid picking a mip that doesn't exist, since in URP you can set the number of maxIteration of the bloomPass. - int maxBloomMip = Mathf.Clamp(m_LensFlareScreenSpace.bloomMip.value, 0, m_Bloom.maxIterations.value/2); - DoLensFlareScreenSpace(cameraData.camera, cmd, GetSource(), m_BloomMipUp[0], m_BloomMipUp[maxBloomMip]); - } - } - - // Lens Flare - if (useLensFlare) - { - bool usePanini; - float paniniDistance; - float paniniCropToFit; - if (m_PaniniProjection.IsActive()) - { - usePanini = true; - paniniDistance = m_PaniniProjection.distance.value; - paniniCropToFit = m_PaniniProjection.cropToFit.value; - } - else - { - usePanini = false; - paniniDistance = 1.0f; - paniniCropToFit = 1.0f; - } - - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.LensFlareDataDrivenComputeOcclusion))) - { - LensFlareDataDrivenComputeOcclusion(ref cameraData, cmd, GetSource(), usePanini, paniniDistance, paniniCropToFit); - } - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.LensFlareDataDriven))) - { - LensFlareDataDriven(ref cameraData, cmd, GetSource(), usePanini, paniniDistance, paniniCropToFit); - } - } - - // Setup other effects constants - SetupLensDistortion(m_Materials.uber, isSceneViewCamera); - SetupChromaticAberration(m_Materials.uber); - SetupVignette(m_Materials.uber, cameraData.xr, m_Descriptor.width, m_Descriptor.height); - SetupColorGrading(cmd, ref renderingData, m_Materials.uber); - - // Only apply dithering & grain if there isn't a final pass. - SetupGrain(cameraData, m_Materials.uber); - SetupDithering(cameraData, m_Materials.uber); - - if (RequireSRGBConversionBlitToBackBuffer(cameraData.requireSrgbConversion)) - m_Materials.uber.EnableKeyword(ShaderKeywordStrings.LinearToSRGBConversion); - - bool requireHDROutput = RequireHDROutput(cameraData); - if (requireHDROutput) - { - // Color space conversion is already applied through color grading, do encoding if uber post is the last pass - // Otherwise encoding will happen in the final post process pass or the final blit pass - HDROutputUtils.Operation hdrOperation = !m_HasFinalPass && m_EnableColorEncodingIfNeeded ? HDROutputUtils.Operation.ColorEncoding : HDROutputUtils.Operation.None; - SetupHDROutput(cameraData.hdrDisplayInformation, cameraData.hdrDisplayColorGamut, m_Materials.uber, hdrOperation, cameraData.rendersOverlayUI); - } - - if (m_UseFastSRGBLinearConversion) - { - m_Materials.uber.EnableKeyword(ShaderKeywordStrings.UseFastSRGBLinearConversion); - } - - CoreUtils.SetKeyword(m_Materials.uber, ShaderKeywordStrings._ENABLE_ALPHA_OUTPUT, cameraData.isAlphaOutputEnabled); - - DebugHandler debugHandler = GetActiveDebugHandler(cameraData); - bool resolveToDebugScreen = debugHandler != null && debugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget); - debugHandler?.UpdateShaderGlobalPropertiesForFinalValidationPass(cmd, cameraData, !m_HasFinalPass && !resolveToDebugScreen); - - // Done with Uber, blit it - var colorLoadAction = RenderBufferLoadAction.DontCare; - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - if (m_Destination == k_CameraTarget && !cameraData.isDefaultViewport) - colorLoadAction = RenderBufferLoadAction.Load; - #pragma warning restore CS0618 - - // Note: We rendering to "camera target" we need to get the cameraData.targetTexture as this will get the targetTexture of the camera stack. - // Overlay cameras need to output to the target described in the base camera while doing camera stack. - RenderTargetIdentifier cameraTargetID = BuiltinRenderTextureType.CameraTarget; -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - cameraTargetID = cameraData.xr.renderTarget; -#endif - - if (!m_UseSwapBuffer) - m_ResolveToScreen = cameraData.resolveFinalTarget || m_Destination.nameID == cameraTargetID || m_HasFinalPass == true; - - // With camera stacking we not always resolve post to final screen as we might run post-processing in the middle of the stack. - if (m_UseSwapBuffer && !m_ResolveToScreen) - { - if (!m_HasFinalPass) - { - // We need to reenable this to be able to blit to the correct AA target - renderer.EnableSwapBufferMSAA(true); - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - destination = renderer.GetCameraColorFrontBuffer(cmd); - #pragma warning restore CS0618 - } - - Blitter.BlitCameraTexture(cmd, GetSource(), destination, colorLoadAction, RenderBufferStoreAction.Store, m_Materials.uber, 0); - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - renderer.ConfigureCameraColorTarget(destination); - #pragma warning restore CS0618 - Swap(ref renderer); - } - // TODO: Implement swapbuffer in 2DRenderer so we can remove this - // For now, when render post-processing in the middle of the camera stack (not resolving to screen) - // we do an extra blit to ping pong results back to color texture. In future we should allow a Swap of the current active color texture - // in the pipeline to avoid this extra blit. - else if (!m_UseSwapBuffer) - { - var firstSource = GetSource(); - Blitter.BlitCameraTexture(cmd, firstSource, GetDestination(), colorLoadAction, RenderBufferStoreAction.Store, m_Materials.uber, 0); - Blitter.BlitCameraTexture(cmd, GetDestination(), m_Destination, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, m_BlitMaterial, m_Destination.rt?.filterMode == FilterMode.Bilinear ? 1 : 0); - } - else if (m_ResolveToScreen) - { - if (resolveToDebugScreen) - { - // Blit to the debugger texture instead of the camera target - Blitter.BlitCameraTexture(cmd, GetSource(), debugHandler.DebugScreenColorHandle, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, m_Materials.uber, 0); - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - renderer.ConfigureCameraTarget(debugHandler.DebugScreenColorHandle, debugHandler.DebugScreenDepthHandle); - #pragma warning restore CS0618 - } - else - { - // Get RTHandle alias to use RTHandle apis - RenderTargetIdentifier cameraTarget = cameraData.targetTexture != null ? new RenderTargetIdentifier(cameraData.targetTexture) : cameraTargetID; - RTHandleStaticHelpers.SetRTHandleStaticWrapper(cameraTarget); - var cameraTargetHandle = RTHandleStaticHelpers.s_RTHandleWrapper; - - RenderingUtils.FinalBlit(cmd, cameraData, GetSource(), cameraTargetHandle, colorLoadAction, RenderBufferStoreAction.Store, m_Materials.uber, 0); - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - renderer.ConfigureCameraColorTarget(cameraTargetHandle); - #pragma warning restore CS0618 - } - } - } - } - #region Sub-pixel Morphological Anti-aliasing - - void DoSubpixelMorphologicalAntialiasing(ref CameraData cameraData, CommandBuffer cmd, RTHandle source, RTHandle destination) - { - var pixelRect = new Rect(Vector2.zero, new Vector2(cameraData.cameraTargetDescriptor.width, cameraData.cameraTargetDescriptor.height)); - var material = m_Materials.subpixelMorphologicalAntialiasing; - const int kStencilBit = 64; - - RenderingUtils.ReAllocateHandleIfNeeded(ref m_EdgeStencilTexture, GetCompatibleDescriptor(m_Descriptor.width, m_Descriptor.height, GraphicsFormat.None, GraphicsFormatUtility.GetDepthStencilFormat(24)), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_EdgeStencilTexture"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_EdgeColorTexture, GetCompatibleDescriptor(m_Descriptor.width, m_Descriptor.height, m_SMAAEdgeFormat), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_EdgeColorTexture"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_BlendTexture, GetCompatibleDescriptor(m_Descriptor.width, m_Descriptor.height, GraphicsFormat.R8G8B8A8_UNorm), FilterMode.Point, TextureWrapMode.Clamp, name: "_BlendTexture"); - - // Globals - var targetSize = m_EdgeColorTexture.useScaling ? m_EdgeColorTexture.rtHandleProperties.currentRenderTargetSize : new Vector2Int(m_EdgeColorTexture.rt.width, m_EdgeColorTexture.rt.height); - material.SetVector(ShaderConstants._Metrics, new Vector4(1f / targetSize.x, 1f / targetSize.y, targetSize.x, targetSize.y)); - material.SetTexture(ShaderConstants._AreaTexture, m_Data.textures.smaaAreaTex); - material.SetTexture(ShaderConstants._SearchTexture, m_Data.textures.smaaSearchTex); - material.SetFloat(ShaderConstants._StencilRef, (float)kStencilBit); - material.SetFloat(ShaderConstants._StencilMask, (float)kStencilBit); - - // Quality presets - material.shaderKeywords = null; - - switch (cameraData.antialiasingQuality) - { - case AntialiasingQuality.Low: - material.EnableKeyword(ShaderKeywordStrings.SmaaLow); - break; - case AntialiasingQuality.Medium: - material.EnableKeyword(ShaderKeywordStrings.SmaaMedium); - break; - case AntialiasingQuality.High: - material.EnableKeyword(ShaderKeywordStrings.SmaaHigh); - break; - } - - // Pass 1: Edge detection - RenderingUtils.Blit(cmd, source, pixelRect, - m_EdgeColorTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, - m_EdgeStencilTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, - ClearFlag.ColorStencil, Color.clear, // implicit depth=1.0f stencil=0x0 - material, 0); - - // Pass 2: Blend weights - RenderingUtils.Blit(cmd, m_EdgeColorTexture, pixelRect, - m_BlendTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, - m_EdgeStencilTexture, RenderBufferLoadAction.Load, RenderBufferStoreAction.DontCare, - ClearFlag.Color, Color.clear, material, 1); - - // Pass 3: Neighborhood blending - cmd.SetGlobalTexture(ShaderConstants._BlendTexture, m_BlendTexture.nameID); - Blitter.BlitCameraTexture(cmd, source, destination, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, 2); - } - - #endregion - - #region Depth Of Field - - // TODO: CoC reprojection once TAA gets in LW - // TODO: Proper LDR/gamma support - void DoDepthOfField(ref CameraData cameraData, CommandBuffer cmd, RTHandle source, RTHandle destination, Rect pixelRect) - { - if (m_DepthOfField.mode.value == DepthOfFieldMode.Gaussian) - DoGaussianDepthOfField(cmd, source, destination, pixelRect, cameraData.isAlphaOutputEnabled); - else if (m_DepthOfField.mode.value == DepthOfFieldMode.Bokeh) - DoBokehDepthOfField(cmd, source, destination, pixelRect, cameraData.isAlphaOutputEnabled); - } - - void DoGaussianDepthOfField(CommandBuffer cmd, RTHandle source, RTHandle destination, Rect pixelRect, bool enableAlphaOutput) - { - int downSample = 2; - var material = m_Materials.gaussianDepthOfField; - int wh = m_Descriptor.width / downSample; - int hh = m_Descriptor.height / downSample; - float farStart = m_DepthOfField.gaussianStart.value; - float farEnd = Mathf.Max(farStart, m_DepthOfField.gaussianEnd.value); - - // Assumes a radius of 1 is 1 at 1080p - // Past a certain radius our gaussian kernel will look very bad so we'll clamp it for - // very high resolutions (4K+). - float maxRadius = m_DepthOfField.gaussianMaxRadius.value * (wh / 1080f); - maxRadius = Mathf.Min(maxRadius, 2f); - - CoreUtils.SetKeyword(material, ShaderKeywordStrings._ENABLE_ALPHA_OUTPUT, enableAlphaOutput); - CoreUtils.SetKeyword(material, ShaderKeywordStrings.HighQualitySampling, m_DepthOfField.highQualitySampling.value); - material.SetVector(ShaderConstants._CoCParams, new Vector3(farStart, farEnd, maxRadius)); - - RenderingUtils.ReAllocateHandleIfNeeded(ref m_FullCoCTexture, GetCompatibleDescriptor(m_Descriptor.width, m_Descriptor.height, m_GaussianCoCFormat), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_FullCoCTexture"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_HalfCoCTexture, GetCompatibleDescriptor(wh, hh, m_GaussianCoCFormat), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_HalfCoCTexture"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_PingTexture, GetCompatibleDescriptor(wh, hh, GraphicsFormat.R16G16B16A16_SFloat), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_PingTexture"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_PongTexture, GetCompatibleDescriptor(wh, hh, GraphicsFormat.R16G16B16A16_SFloat), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_PongTexture"); - - PostProcessUtils.SetGlobalShaderSourceSize(cmd, m_FullCoCTexture); - cmd.SetGlobalVector(ShaderConstants._DownSampleScaleFactor, new Vector4(1.0f / downSample, 1.0f / downSample, downSample, downSample)); - - // Compute CoC - Blitter.BlitCameraTexture(cmd, source, m_FullCoCTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, k_GaussianDoFPassComputeCoc); - - // Downscale & prefilter color + coc - m_MRT2[0] = m_HalfCoCTexture.nameID; - m_MRT2[1] = m_PingTexture.nameID; - - cmd.SetGlobalTexture(ShaderConstants._FullCoCTexture, m_FullCoCTexture.nameID); - CoreUtils.SetRenderTarget(cmd, m_MRT2, m_HalfCoCTexture); - Vector2 viewportScale = source.useScaling ? new Vector2(source.rtHandleProperties.rtHandleScale.x, source.rtHandleProperties.rtHandleScale.y) : Vector2.one; - Blitter.BlitTexture(cmd, source, viewportScale, material, k_GaussianDoFPassDownscalePrefilter); - - // Blur - cmd.SetGlobalTexture(ShaderConstants._HalfCoCTexture, m_HalfCoCTexture.nameID); - cmd.SetGlobalTexture(ShaderConstants._ColorTexture, source); - Blitter.BlitCameraTexture(cmd, m_PingTexture, m_PongTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, k_GaussianDoFPassBlurH); - Blitter.BlitCameraTexture(cmd, m_PongTexture, m_PingTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, k_GaussianDoFPassBlurV); - - // Composite - cmd.SetGlobalTexture(ShaderConstants._ColorTexture, m_PingTexture.nameID); - cmd.SetGlobalTexture(ShaderConstants._FullCoCTexture, m_FullCoCTexture.nameID); - Blitter.BlitCameraTexture(cmd, source, destination, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, k_GaussianDoFPassComposite); - } - - void PrepareBokehKernel(float maxRadius, float rcpAspect) - { - const int kRings = 4; - const int kPointsPerRing = 7; - - // Check the existing array - if (m_BokehKernel == null) - m_BokehKernel = new Vector4[42]; - - // Fill in sample points (concentric circles transformed to rotated N-Gon) - int idx = 0; - float bladeCount = m_DepthOfField.bladeCount.value; - float curvature = 1f - m_DepthOfField.bladeCurvature.value; - float rotation = m_DepthOfField.bladeRotation.value * Mathf.Deg2Rad; - const float PI = Mathf.PI; - const float TWO_PI = Mathf.PI * 2f; - - for (int ring = 1; ring < kRings; ring++) - { - float bias = 1f / kPointsPerRing; - float radius = (ring + bias) / (kRings - 1f + bias); - int points = ring * kPointsPerRing; - - for (int point = 0; point < points; point++) - { - // Angle on ring - float phi = 2f * PI * point / points; - - // Transform to rotated N-Gon - // Adapted from "CryEngine 3 Graphics Gems" [Sousa13] - float nt = Mathf.Cos(PI / bladeCount); - float dt = Mathf.Cos(phi - (TWO_PI / bladeCount) * Mathf.Floor((bladeCount * phi + Mathf.PI) / TWO_PI)); - float r = radius * Mathf.Pow(nt / dt, curvature); - float u = r * Mathf.Cos(phi - rotation); - float v = r * Mathf.Sin(phi - rotation); - - float uRadius = u * maxRadius; - float vRadius = v * maxRadius; - float uRadiusPowTwo = uRadius * uRadius; - float vRadiusPowTwo = vRadius * vRadius; - float kernelLength = Mathf.Sqrt((uRadiusPowTwo + vRadiusPowTwo)); - float uRCP = uRadius * rcpAspect; - - m_BokehKernel[idx] = new Vector4(uRadius, vRadius, kernelLength, uRCP); - idx++; - } - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - static float GetMaxBokehRadiusInPixels(float viewportHeight) - { - // Estimate the maximum radius of bokeh (empirically derived from the ring count) - const float kRadiusInPixels = 14f; - return Mathf.Min(0.05f, kRadiusInPixels / viewportHeight); - } - - void DoBokehDepthOfField(CommandBuffer cmd, RTHandle source, RTHandle destination, Rect pixelRect, bool enableAlphaOutput) - { - int downSample = 2; - var material = m_Materials.bokehDepthOfField; - int wh = m_Descriptor.width / downSample; - int hh = m_Descriptor.height / downSample; - - // "A Lens and Aperture Camera Model for Synthetic Image Generation" [Potmesil81] - float F = m_DepthOfField.focalLength.value / 1000f; - float A = m_DepthOfField.focalLength.value / m_DepthOfField.aperture.value; - float P = m_DepthOfField.focusDistance.value; - float maxCoC = (A * F) / (P - F); - float maxRadius = GetMaxBokehRadiusInPixels(m_Descriptor.height); - float rcpAspect = 1f / (wh / (float)hh); - - CoreUtils.SetKeyword(material, ShaderKeywordStrings._ENABLE_ALPHA_OUTPUT, enableAlphaOutput); - CoreUtils.SetKeyword(material, ShaderKeywordStrings.UseFastSRGBLinearConversion, m_UseFastSRGBLinearConversion); - cmd.SetGlobalVector(ShaderConstants._CoCParams, new Vector4(P, maxCoC, maxRadius, rcpAspect)); - - // Prepare the bokeh kernel constant buffer - int hash = m_DepthOfField.GetHashCode(); - if (hash != m_BokehHash || maxRadius != m_BokehMaxRadius || rcpAspect != m_BokehRCPAspect) - { - m_BokehHash = hash; - m_BokehMaxRadius = maxRadius; - m_BokehRCPAspect = rcpAspect; - PrepareBokehKernel(maxRadius, rcpAspect); - } - - cmd.SetGlobalVectorArray(ShaderConstants._BokehKernel, m_BokehKernel); - - RenderingUtils.ReAllocateHandleIfNeeded(ref m_FullCoCTexture, GetCompatibleDescriptor(m_Descriptor.width, m_Descriptor.height, GraphicsFormat.R8_UNorm), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_FullCoCTexture"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_PingTexture, GetCompatibleDescriptor(wh, hh, GraphicsFormat.R16G16B16A16_SFloat), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_PingTexture"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_PongTexture, GetCompatibleDescriptor(wh, hh, GraphicsFormat.R16G16B16A16_SFloat), FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_PongTexture"); - - PostProcessUtils.SetGlobalShaderSourceSize(cmd, m_FullCoCTexture); - cmd.SetGlobalVector(ShaderConstants._DownSampleScaleFactor, new Vector4(1.0f / downSample, 1.0f / downSample, downSample, downSample)); - float uvMargin = (1.0f / m_Descriptor.height) * downSample; - cmd.SetGlobalVector(ShaderConstants._BokehConstants, new Vector4(uvMargin, uvMargin * 2.0f)); - - // Compute CoC - Blitter.BlitCameraTexture(cmd, source, m_FullCoCTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, k_BokehDoFPassComputeCoc); - cmd.SetGlobalTexture(ShaderConstants._FullCoCTexture, m_FullCoCTexture.nameID); - - // Downscale & prefilter color + coc - Blitter.BlitCameraTexture(cmd, source, m_PingTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, k_BokehDoFPassDownscalePrefilter); - - // Bokeh blur - Blitter.BlitCameraTexture(cmd, m_PingTexture, m_PongTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, k_BokehDoFPassBlur); - - // Post-filtering - Blitter.BlitCameraTexture(cmd, m_PongTexture, m_PingTexture, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, k_BokehDoFPassPostFilter); - - // Composite - cmd.SetGlobalTexture(ShaderConstants._DofTexture, m_PingTexture.nameID); - Blitter.BlitCameraTexture(cmd, source, destination, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, k_BokehDoFPassComposite); - } - - #endregion - - #region LensFlareDataDriven - - static float GetLensFlareLightAttenuation(Light light, Camera cam, Vector3 wo) - { - // Must always be true - if (light != null) - { - switch (light.type) - { - case LightType.Directional: - return LensFlareCommonSRP.ShapeAttenuationDirLight(light.transform.forward, cam.transform.forward); - case LightType.Point: - return LensFlareCommonSRP.ShapeAttenuationPointLight(); - case LightType.Spot: - return LensFlareCommonSRP.ShapeAttenuationSpotConeLight(light.transform.forward, wo, light.spotAngle, light.innerSpotAngle / 180.0f); - default: - return 1.0f; - } - } - - return 1.0f; - } - - void LensFlareDataDrivenComputeOcclusion(ref UniversalCameraData cameraData, CommandBuffer cmd, RenderTargetIdentifier source, bool usePanini, float paniniDistance, float paniniCropToFit) - { - if (!LensFlareCommonSRP.IsOcclusionRTCompatible()) - return; - - Camera camera = cameraData.camera; - - Matrix4x4 nonJitteredViewProjMatrix0; - int xrId0; -#if ENABLE_VR && ENABLE_XR_MODULE - // Not VR or Multi-Pass - if (cameraData.xr.enabled) - { - if (cameraData.xr.singlePassEnabled) - { - nonJitteredViewProjMatrix0 = GL.GetGPUProjectionMatrix(cameraData.GetProjectionMatrixNoJitter(0), true) * cameraData.GetViewMatrix(0); - xrId0 = 0; - } - else - { - var gpuNonJitteredProj = GL.GetGPUProjectionMatrix(camera.projectionMatrix, true); - nonJitteredViewProjMatrix0 = gpuNonJitteredProj * camera.worldToCameraMatrix; - xrId0 = cameraData.xr.multipassId; - } - } - else - { - nonJitteredViewProjMatrix0 = GL.GetGPUProjectionMatrix(cameraData.GetProjectionMatrixNoJitter(0), true) * cameraData.GetViewMatrix(0); - xrId0 = 0; - } -#else - var gpuNonJitteredProj = GL.GetGPUProjectionMatrix(camera.projectionMatrix, true); - nonJitteredViewProjMatrix0 = gpuNonJitteredProj * camera.worldToCameraMatrix; - xrId0 = cameraData.xr.multipassId; -#endif - - cmd.SetGlobalTexture(m_Depth.name, m_Depth.nameID); - - LensFlareCommonSRP.ComputeOcclusion( - m_Materials.lensFlareDataDriven, camera, cameraData.xr, cameraData.xr.multipassId, - (float)m_Descriptor.width, (float)m_Descriptor.height, - usePanini, paniniDistance, paniniCropToFit, true, - camera.transform.position, - nonJitteredViewProjMatrix0, - cmd, - false, false, null, null); - -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled && cameraData.xr.singlePassEnabled) - { - for (int xrIdx = 1; xrIdx < cameraData.xr.viewCount; ++xrIdx) - { - Matrix4x4 gpuVPXR = GL.GetGPUProjectionMatrix(cameraData.GetProjectionMatrixNoJitter(xrIdx), true) * cameraData.GetViewMatrix(xrIdx); - - cmd.SetGlobalTexture(m_Depth.name, m_Depth.nameID); - - // Bypass single pass version - LensFlareCommonSRP.ComputeOcclusion( - m_Materials.lensFlareDataDriven, camera, cameraData.xr, xrIdx, - (float)m_Descriptor.width, (int)m_Descriptor.height, - usePanini, paniniDistance, paniniCropToFit, true, - camera.transform.position, - gpuVPXR, - cmd, - false, false, null, null); - } - } -#endif - } - - void LensFlareDataDriven(ref UniversalCameraData cameraData, CommandBuffer cmd, RenderTargetIdentifier source, bool usePanini, float paniniDistance, float paniniCropToFit) - { - Camera camera = cameraData.camera; - var pixelRect = new Rect(Vector2.zero, new Vector2(m_Descriptor.width, m_Descriptor.height)); - -#if ENABLE_VR && ENABLE_XR_MODULE - // Not VR or Multi-Pass - if (!cameraData.xr.enabled || - (cameraData.xr.enabled && !cameraData.xr.singlePassEnabled)) - { -#endif - var gpuNonJitteredProj = GL.GetGPUProjectionMatrix(camera.projectionMatrix, true); - var gpuVP = gpuNonJitteredProj * camera.worldToCameraMatrix; - - LensFlareCommonSRP.DoLensFlareDataDrivenCommon( - m_Materials.lensFlareDataDriven, camera, pixelRect, cameraData.xr, cameraData.xr.multipassId, - (float)m_Descriptor.width, (float)m_Descriptor.height, - usePanini, paniniDistance, paniniCropToFit, true, - camera.transform.position, - gpuVP, - cmd, - false, false, null, null, - source, - (Light light, Camera cam, Vector3 wo) => { return GetLensFlareLightAttenuation(light, cam, wo); }, - false); -#if ENABLE_VR && ENABLE_XR_MODULE - } - else // data.hdCamera.xr.enabled && data.hdCamera.xr.singlePassEnabled - { - // Bypass single pass version - for (int xrIdx = 0; xrIdx < cameraData.xr.viewCount; ++xrIdx) - { - Matrix4x4 gpuVPXR = GL.GetGPUProjectionMatrix(cameraData.GetProjectionMatrixNoJitter(xrIdx), true) * cameraData.GetViewMatrix(xrIdx); - - LensFlareCommonSRP.DoLensFlareDataDrivenCommon( - m_Materials.lensFlareDataDriven, camera, pixelRect, cameraData.xr, cameraData.xr.multipassId, - (float)m_Descriptor.width, (float)m_Descriptor.height, - usePanini, paniniDistance, paniniCropToFit, true, - camera.transform.position, - gpuVPXR, - cmd, - false, false, null, null, - source, - (Light light, Camera cam, Vector3 wo) => { return GetLensFlareLightAttenuation(light, cam, wo); }, - false); - } - } -#endif - } - - #endregion - - #region LensFlareScreenSpace - - void DoLensFlareScreenSpace(Camera camera, CommandBuffer cmd, RenderTargetIdentifier source, RTHandle originalBloomTexture, RTHandle screenSpaceLensFlareBloomMipTexture) - { - int ratio = (int)m_LensFlareScreenSpace.resolution.value; - - int width = Mathf.Max(1, (int)m_Descriptor.width / ratio); - int height = Mathf.Max(1, (int)m_Descriptor.height / ratio); - var desc = GetCompatibleDescriptor(width, height, m_DefaultColorFormat); - - if (m_LensFlareScreenSpace.IsStreaksActive()) - { - RenderingUtils.ReAllocateHandleIfNeeded(ref m_StreakTmpTexture, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_StreakTmpTexture"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_StreakTmpTexture2, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_StreakTmpTexture2"); - } - - RenderingUtils.ReAllocateHandleIfNeeded(ref m_ScreenSpaceLensFlareResult, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_ScreenSpaceLensFlareResult"); - - LensFlareCommonSRP.DoLensFlareScreenSpaceCommon( - m_Materials.lensFlareScreenSpace, - camera, - (float)m_Descriptor.width, - (float)m_Descriptor.height, - m_LensFlareScreenSpace.tintColor.value, - originalBloomTexture, - screenSpaceLensFlareBloomMipTexture, - null, // We don't have any spectral LUT in URP - m_StreakTmpTexture, - m_StreakTmpTexture2, - new Vector4( - m_LensFlareScreenSpace.intensity.value, - m_LensFlareScreenSpace.firstFlareIntensity.value, - m_LensFlareScreenSpace.secondaryFlareIntensity.value, - m_LensFlareScreenSpace.warpedFlareIntensity.value), - new Vector4( - m_LensFlareScreenSpace.vignetteEffect.value, - m_LensFlareScreenSpace.startingPosition.value, - m_LensFlareScreenSpace.scale.value, - 0), // Free slot, not used - new Vector4( - m_LensFlareScreenSpace.samples.value, - m_LensFlareScreenSpace.sampleDimmer.value, - m_LensFlareScreenSpace.chromaticAbberationIntensity.value, - 0), // No need to pass a chromatic aberration sample count, hardcoded at 3 in shader - new Vector4( - m_LensFlareScreenSpace.streaksIntensity.value, - m_LensFlareScreenSpace.streaksLength.value, - m_LensFlareScreenSpace.streaksOrientation.value, - m_LensFlareScreenSpace.streaksThreshold.value), - new Vector4( - ratio, - m_LensFlareScreenSpace.warpedFlareScale.value.x, - m_LensFlareScreenSpace.warpedFlareScale.value.y, - 0), // Free slot, not used - cmd, - m_ScreenSpaceLensFlareResult, - false); - - cmd.SetGlobalTexture(ShaderConstants._Bloom_Texture, originalBloomTexture); - } - - #endregion - - #region Motion Blur - - internal static readonly int k_ShaderPropertyId_ViewProjM = Shader.PropertyToID("_ViewProjM"); - internal static readonly int k_ShaderPropertyId_PrevViewProjM = Shader.PropertyToID("_PrevViewProjM"); - internal static readonly int k_ShaderPropertyId_ViewProjMStereo = Shader.PropertyToID("_ViewProjMStereo"); - internal static readonly int k_ShaderPropertyId_PrevViewProjMStereo = Shader.PropertyToID("_PrevViewProjMStereo"); - - internal static void UpdateMotionBlurMatrices(ref Material material, Camera camera, XRPass xr) - { - MotionVectorsPersistentData motionData = null; - - if(camera.TryGetComponent(out var additionalCameraData)) - motionData = additionalCameraData.motionVectorsPersistentData; - - if (motionData == null) - return; - -#if ENABLE_VR && ENABLE_XR_MODULE - if (xr.enabled && xr.singlePassEnabled) - { - material.SetMatrixArray(k_ShaderPropertyId_PrevViewProjMStereo, motionData.previousViewProjectionStereo); - material.SetMatrixArray(k_ShaderPropertyId_ViewProjMStereo, motionData.viewProjectionStereo); - } - else -#endif - { - int viewProjMIdx = 0; -#if ENABLE_VR && ENABLE_XR_MODULE - if (xr.enabled) - viewProjMIdx = xr.multipassId; -#endif - - // TODO: These should be part of URP main matrix set. For now, we set them here for motion vector rendering. - material.SetMatrix(k_ShaderPropertyId_PrevViewProjM, motionData.previousViewProjectionStereo[viewProjMIdx]); - material.SetMatrix(k_ShaderPropertyId_ViewProjM, motionData.viewProjectionStereo[viewProjMIdx]); - } - } - - - void DoMotionBlur(CommandBuffer cmd, RTHandle source, RTHandle destination, RTHandle motionVectors, ref CameraData cameraData) - { - var material = m_Materials.cameraMotionBlur; - - UpdateMotionBlurMatrices(ref material, cameraData.camera, cameraData.xr); - - material.SetFloat("_Intensity", m_MotionBlur.intensity.value); - material.SetFloat("_Clamp", m_MotionBlur.clamp.value); - - int pass = (int)m_MotionBlur.quality.value; - var mode = m_MotionBlur.mode.value; - if (mode == MotionBlurMode.CameraAndObjects) - { - Debug.Assert(motionVectors != null, "Motion vectors are invalid. Per-object motion blur requires a motion vector texture."); - pass += 3; - material.SetTexture(MotionVectorRenderPass.k_MotionVectorTextureName, motionVectors); - } - - PostProcessUtils.SetGlobalShaderSourceSize(cmd, source); - - CoreUtils.SetKeyword(material, ShaderKeywordStrings._ENABLE_ALPHA_OUTPUT, cameraData.isAlphaOutputEnabled); - Blitter.BlitCameraTexture(cmd, source, destination, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, pass); - } - -#endregion - -#region Panini Projection - - // Back-ported & adapted from the work of the Stockholm demo team - thanks Lasse! - void DoPaniniProjection(Camera camera, CommandBuffer cmd, RTHandle source, RTHandle destination) - { - float distance = m_PaniniProjection.distance.value; - var viewExtents = CalcViewExtents(camera, m_Descriptor.width, m_Descriptor.height); - var cropExtents = CalcCropExtents(camera, distance, m_Descriptor.width, m_Descriptor.height); - - float scaleX = cropExtents.x / viewExtents.x; - float scaleY = cropExtents.y / viewExtents.y; - float scaleF = Mathf.Min(scaleX, scaleY); - - float paniniD = distance; - float paniniS = Mathf.Lerp(1f, Mathf.Clamp01(scaleF), m_PaniniProjection.cropToFit.value); - - var material = m_Materials.paniniProjection; - material.SetVector(ShaderConstants._Params, new Vector4(viewExtents.x, viewExtents.y, paniniD, paniniS)); - material.EnableKeyword( - 1f - Mathf.Abs(paniniD) > float.Epsilon - ? ShaderKeywordStrings.PaniniGeneric : ShaderKeywordStrings.PaniniUnitDistance - ); - Blitter.BlitCameraTexture(cmd, source, destination, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, material, 0); - } - - Vector2 CalcViewExtents(Camera camera, int width, int height) - { - float fovY = camera.fieldOfView * Mathf.Deg2Rad; - float aspect = width / (float)height; - - float viewExtY = Mathf.Tan(0.5f * fovY); - float viewExtX = aspect * viewExtY; - - return new Vector2(viewExtX, viewExtY); - } - - Vector2 CalcCropExtents(Camera camera, float d, int width, int height) - { - // given - // S----------- E--X------- - // | ` ~. /,´ - // |-- --- Q - // | ,/ ` - // 1 | ,´/ ` - // | ,´ / ´ - // | ,´ / ´ - // |,` / , - // O / - // | / , - // d | / - // | / , - // |/ . - // P - // | ´ - // | , ´ - // +- ´ - // - // have X - // want to find E - - float viewDist = 1f + d; - - var projPos = CalcViewExtents(camera, width, height); - var projHyp = Mathf.Sqrt(projPos.x * projPos.x + 1f); - - float cylDistMinusD = 1f / projHyp; - float cylDist = cylDistMinusD + d; - var cylPos = projPos * cylDistMinusD; - - return cylPos * (viewDist / cylDist); - } - -#endregion - -#region Bloom - - void SetupBloom(CommandBuffer cmd, RTHandle source, Material uberMaterial, bool enableAlphaOutput) - { - // Start at half-res - int downres = 1; - switch (m_Bloom.downscale.value) - { - case BloomDownscaleMode.Half: - downres = 1; - break; - case BloomDownscaleMode.Quarter: - downres = 2; - break; - default: - throw new System.ArgumentOutOfRangeException(); - } - int tw = m_Descriptor.width >> downres; - int th = m_Descriptor.height >> downres; - - // Determine the iteration count - int maxSize = Mathf.Max(tw, th); - int iterations = Mathf.FloorToInt(Mathf.Log(maxSize, 2f) - 1); - int mipCount = Mathf.Clamp(iterations, 1, m_Bloom.maxIterations.value); - - // Pre-filtering parameters - float clamp = m_Bloom.clamp.value; - float threshold = Mathf.GammaToLinearSpace(m_Bloom.threshold.value); - float thresholdKnee = threshold * 0.5f; // Hardcoded soft knee - - // Material setup - float scatter = Mathf.Lerp(0.05f, 0.95f, m_Bloom.scatter.value); - var bloomMaterial = m_Materials.bloom; - bloomMaterial.SetVector(ShaderConstants._Params, new Vector4(scatter, clamp, threshold, thresholdKnee)); - CoreUtils.SetKeyword(bloomMaterial, ShaderKeywordStrings.BloomHQ, m_Bloom.highQualityFiltering.value); - CoreUtils.SetKeyword(bloomMaterial, ShaderKeywordStrings._ENABLE_ALPHA_OUTPUT, enableAlphaOutput); - - // Prefilter - var desc = GetCompatibleDescriptor(tw, th, m_DefaultColorFormat); - for (int i = 0; i < mipCount; i++) - { - RenderingUtils.ReAllocateHandleIfNeeded(ref m_BloomMipUp[i], desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: m_BloomMipUpName[i]); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_BloomMipDown[i], desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: m_BloomMipDownName[i]); - desc.width = Mathf.Max(1, desc.width >> 1); - desc.height = Mathf.Max(1, desc.height >> 1); - } - - Blitter.BlitCameraTexture(cmd, source, m_BloomMipDown[0], RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, bloomMaterial, 0); - - // Downsample - gaussian pyramid - var lastDown = m_BloomMipDown[0]; - for (int i = 1; i < mipCount; i++) - { - // Classic two pass gaussian blur - use mipUp as a temporary target - // First pass does 2x downsampling + 9-tap gaussian - // Second pass does 9-tap gaussian using a 5-tap filter + bilinear filtering - Blitter.BlitCameraTexture(cmd, lastDown, m_BloomMipUp[i], RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, bloomMaterial, 1); - Blitter.BlitCameraTexture(cmd, m_BloomMipUp[i], m_BloomMipDown[i], RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, bloomMaterial, 2); - - lastDown = m_BloomMipDown[i]; - } - - // Upsample (bilinear by default, HQ filtering does bicubic instead - for (int i = mipCount - 2; i >= 0; i--) - { - var lowMip = (i == mipCount - 2) ? m_BloomMipDown[i + 1] : m_BloomMipUp[i + 1]; - var highMip = m_BloomMipDown[i]; - var dst = m_BloomMipUp[i]; - - cmd.SetGlobalTexture(ShaderConstants._SourceTexLowMip, lowMip); - Blitter.BlitCameraTexture(cmd, highMip, dst, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, bloomMaterial, 3); - } - - // Setup bloom on uber - var tint = m_Bloom.tint.value.linear; - var luma = ColorUtils.Luminance(tint); - tint = luma > 0f ? tint * (1f / luma) : Color.white; - - var bloomParams = new Vector4(m_Bloom.intensity.value, tint.r, tint.g, tint.b); - uberMaterial.SetVector(ShaderConstants._Bloom_Params, bloomParams); - - cmd.SetGlobalTexture(ShaderConstants._Bloom_Texture, m_BloomMipUp[0]); - - // Setup lens dirtiness on uber - // Keep the aspect ratio correct & center the dirt texture, we don't want it to be - // stretched or squashed - var dirtTexture = m_Bloom.dirtTexture.value == null ? Texture2D.blackTexture : m_Bloom.dirtTexture.value; - float dirtRatio = dirtTexture.width / (float)dirtTexture.height; - float screenRatio = m_Descriptor.width / (float)m_Descriptor.height; - var dirtScaleOffset = new Vector4(1f, 1f, 0f, 0f); - float dirtIntensity = m_Bloom.dirtIntensity.value; - - if (dirtRatio > screenRatio) - { - dirtScaleOffset.x = screenRatio / dirtRatio; - dirtScaleOffset.z = (1f - dirtScaleOffset.x) * 0.5f; - } - else if (screenRatio > dirtRatio) - { - dirtScaleOffset.y = dirtRatio / screenRatio; - dirtScaleOffset.w = (1f - dirtScaleOffset.y) * 0.5f; - } - - uberMaterial.SetVector(ShaderConstants._LensDirt_Params, dirtScaleOffset); - uberMaterial.SetFloat(ShaderConstants._LensDirt_Intensity, dirtIntensity); - uberMaterial.SetTexture(ShaderConstants._LensDirt_Texture, dirtTexture); - - // Keyword setup - a bit convoluted as we're trying to save some variants in Uber... - if (m_Bloom.highQualityFiltering.value) - uberMaterial.EnableKeyword(dirtIntensity > 0f ? ShaderKeywordStrings.BloomHQDirt : ShaderKeywordStrings.BloomHQ); - else - uberMaterial.EnableKeyword(dirtIntensity > 0f ? ShaderKeywordStrings.BloomLQDirt : ShaderKeywordStrings.BloomLQ); - } - -#endregion - -#region Lens Distortion - - void SetupLensDistortion(Material material, bool isSceneView) - { - float amount = 1.6f * Mathf.Max(Mathf.Abs(m_LensDistortion.intensity.value * 100f), 1f); - float theta = Mathf.Deg2Rad * Mathf.Min(160f, amount); - float sigma = 2f * Mathf.Tan(theta * 0.5f); - var center = m_LensDistortion.center.value * 2f - Vector2.one; - var p1 = new Vector4( - center.x, - center.y, - Mathf.Max(m_LensDistortion.xMultiplier.value, 1e-4f), - Mathf.Max(m_LensDistortion.yMultiplier.value, 1e-4f) - ); - var p2 = new Vector4( - m_LensDistortion.intensity.value >= 0f ? theta : 1f / theta, - sigma, - 1f / m_LensDistortion.scale.value, - m_LensDistortion.intensity.value * 100f - ); - - material.SetVector(ShaderConstants._Distortion_Params1, p1); - material.SetVector(ShaderConstants._Distortion_Params2, p2); - - if (m_LensDistortion.IsActive() && !isSceneView) - material.EnableKeyword(ShaderKeywordStrings.Distortion); - } - -#endregion - -#region Chromatic Aberration - - void SetupChromaticAberration(Material material) - { - material.SetFloat(ShaderConstants._Chroma_Params, m_ChromaticAberration.intensity.value * 0.05f); - - if (m_ChromaticAberration.IsActive()) - material.EnableKeyword(ShaderKeywordStrings.ChromaticAberration); - } - -#endregion - -#region Vignette - - void SetupVignette(Material material, XRPass xrPass, int width, int height) - { - var color = m_Vignette.color.value; - var center = m_Vignette.center.value; - var aspectRatio = width / (float)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 - ); - var v2 = new Vector4( - center.x, center.y, - m_Vignette.intensity.value * 3f, - m_Vignette.smoothness.value * 5f - ); - - material.SetVector(ShaderConstants._Vignette_Params1, v1); - material.SetVector(ShaderConstants._Vignette_Params2, v2); - } - -#endregion - -#region Color Grading - - void SetupColorGrading(CommandBuffer cmd, ref RenderingData renderingData, Material material) - { - ref var postProcessingData = ref renderingData.postProcessingData; - bool hdr = postProcessingData.gradingMode == ColorGradingMode.HighDynamicRange; - int lutHeight = postProcessingData.lutSize; - int lutWidth = lutHeight * lutHeight; - - // Source material setup - float postExposureLinear = Mathf.Pow(2f, m_ColorAdjustments.postExposure.value); - material.SetTexture(ShaderConstants._InternalLut, m_InternalLut); - material.SetVector(ShaderConstants._Lut_Params, new Vector4(1f / lutWidth, 1f / lutHeight, lutHeight - 1f, postExposureLinear)); - material.SetTexture(ShaderConstants._UserLut, m_ColorLookup.texture.value); - material.SetVector(ShaderConstants._UserLut_Params, !m_ColorLookup.IsActive() - ? Vector4.zero - : new Vector4(1f / m_ColorLookup.texture.value.width, - 1f / m_ColorLookup.texture.value.height, - m_ColorLookup.texture.value.height - 1f, - m_ColorLookup.contribution.value) - ); - - if (hdr) - { - material.EnableKeyword(ShaderKeywordStrings.HDRGrading); - } - else - { - switch (m_Tonemapping.mode.value) - { - case TonemappingMode.Neutral: material.EnableKeyword(ShaderKeywordStrings.TonemapNeutral); break; - case TonemappingMode.ACES: material.EnableKeyword(ShaderKeywordStrings.TonemapACES); break; - default: break; // None - } - } - } - -#endregion - -#region Film Grain - - void SetupGrain(UniversalCameraData cameraData, Material material) - { - if (!m_HasFinalPass && m_FilmGrain.IsActive()) - { - material.EnableKeyword(ShaderKeywordStrings.FilmGrain); - PostProcessUtils.ConfigureFilmGrain( - m_Data, - m_FilmGrain, - cameraData.pixelWidth, cameraData.pixelHeight, - material - ); - } - } - -#endregion - -#region 8-bit Dithering - - void SetupDithering(UniversalCameraData cameraData, Material material) - { - if (!m_HasFinalPass && cameraData.isDitheringEnabled) - { - material.EnableKeyword(ShaderKeywordStrings.Dithering); - m_DitheringTextureIndex = PostProcessUtils.ConfigureDithering( - m_Data, - m_DitheringTextureIndex, - cameraData.pixelWidth, cameraData.pixelHeight, - material - ); - } - } - - #endregion - -#region HDR Output - void SetupHDROutput(HDROutputUtils.HDRDisplayInformation hdrDisplayInformation, ColorGamut hdrDisplayColorGamut, Material material, HDROutputUtils.Operation hdrOperations, bool rendersOverlayUI) - { - Vector4 hdrOutputLuminanceParams; - UniversalRenderPipeline.GetHDROutputLuminanceParameters(hdrDisplayInformation, hdrDisplayColorGamut, m_Tonemapping, out hdrOutputLuminanceParams); - material.SetVector(ShaderPropertyId.hdrOutputLuminanceParams, hdrOutputLuminanceParams); - - HDROutputUtils.ConfigureHDROutput(material, hdrDisplayColorGamut, hdrOperations); - CoreUtils.SetKeyword(material, ShaderKeywordStrings.HDROverlay, rendersOverlayUI); - } -#endregion - -#region Final pass - - void RenderFinalPass(CommandBuffer cmd, ref RenderingData renderingData) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - var material = m_Materials.finalPass; - material.shaderKeywords = null; - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - PostProcessUtils.SetGlobalShaderSourceSize(cmd, cameraData.renderer.cameraColorTargetHandle); - #pragma warning restore CS0618 - - SetupGrain(renderingData.cameraData.universalCameraData, material); - SetupDithering(renderingData.cameraData.universalCameraData, material); - - if (RequireSRGBConversionBlitToBackBuffer(renderingData.cameraData.requireSrgbConversion)) - material.EnableKeyword(ShaderKeywordStrings.LinearToSRGBConversion); - - HDROutputUtils.Operation hdrOperations = HDROutputUtils.Operation.None; - bool requireHDROutput = RequireHDROutput(renderingData.cameraData.universalCameraData); - if (requireHDROutput) - { - // If there is a final post process pass, it's always the final pass so do color encoding - hdrOperations = m_EnableColorEncodingIfNeeded ? HDROutputUtils.Operation.ColorEncoding : HDROutputUtils.Operation.None; - // If the color space conversion wasn't applied by the uber pass, do it here - if (!cameraData.postProcessEnabled) - hdrOperations |= HDROutputUtils.Operation.ColorConversion; - - SetupHDROutput(cameraData.hdrDisplayInformation, cameraData.hdrDisplayColorGamut, material, hdrOperations, cameraData.rendersOverlayUI); - } - - CoreUtils.SetKeyword(material, ShaderKeywordStrings._ENABLE_ALPHA_OUTPUT, cameraData.isAlphaOutputEnabled); - - DebugHandler debugHandler = GetActiveDebugHandler(cameraData); - bool resolveToDebugScreen = debugHandler != null && debugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget); - debugHandler?.UpdateShaderGlobalPropertiesForFinalValidationPass(cmd, cameraData, m_IsFinalPass && !resolveToDebugScreen); - - if (m_UseSwapBuffer) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - m_Source = cameraData.renderer.GetCameraColorBackBuffer(cmd); - #pragma warning restore CS0618 - } - - RTHandle sourceTex = m_Source; - - var colorLoadAction = cameraData.isDefaultViewport ? RenderBufferLoadAction.DontCare : RenderBufferLoadAction.Load; - - bool isFxaaEnabled = (cameraData.antialiasing == AntialiasingMode.FastApproximateAntialiasing); - - // FSR is only considered "enabled" when we're performing upscaling. (downscaling uses a linear filter unconditionally) - bool isFsrEnabled = ((cameraData.imageScalingMode == ImageScalingMode.Upscaling) && (cameraData.upscalingFilter == ImageUpscalingFilter.FSR)); - - // Reuse RCAS pass as an optional standalone post sharpening pass for TAA. - // This avoids the cost of EASU and is available for other upscaling options. - // If FSR is enabled then FSR settings override the TAA settings and we perform RCAS only once. - bool isTaaSharpeningEnabled = (cameraData.IsTemporalAAEnabled() && cameraData.taaSettings.contrastAdaptiveSharpening > 0.0f) && !isFsrEnabled; - - // If target format has alpha and post-process needs to process/output alpha. - bool isAlphaOutputEnabled = cameraData.isAlphaOutputEnabled; - - if (cameraData.imageScalingMode != ImageScalingMode.None) - { - // When FXAA is enabled in scaled renders, we execute it in a separate blit since it's not designed to be used in - // situations where the input and output resolutions do not match. - // When FSR is active, we always need an additional pass since it has a very particular color encoding requirement. - - // NOTE: An ideal implementation could inline this color conversion logic into the UberPost pass, but the current code structure would make - // this process very complex. Specifically, we'd need to guarantee that the uber post output is always written to a UNORM format render - // target in order to preserve the precision of specially encoded color data. - bool isSetupRequired = (isFxaaEnabled || isFsrEnabled); - - // Make sure to remove any MSAA and attached depth buffers from the temporary render targets - var tempRtDesc = cameraData.cameraTargetDescriptor; - tempRtDesc.msaaSamples = 1; - tempRtDesc.depthStencilFormat = GraphicsFormat.None; - - // Select a UNORM format since we've already performed tonemapping. (Values are in 0-1 range) - // This improves precision and is required if we want to avoid excessive banding when FSR is in use. - if (!requireHDROutput) - tempRtDesc.graphicsFormat = UniversalRenderPipeline.MakeUnormRenderTextureGraphicsFormat(); - - m_Materials.scalingSetup.shaderKeywords = null; - - if (isSetupRequired) - { - if (requireHDROutput) - { - SetupHDROutput(cameraData.hdrDisplayInformation, cameraData.hdrDisplayColorGamut, m_Materials.scalingSetup, hdrOperations, cameraData.rendersOverlayUI); - } - - if (isFxaaEnabled) - { - m_Materials.scalingSetup.EnableKeyword(ShaderKeywordStrings.Fxaa); - } - - if (isFsrEnabled) - { - m_Materials.scalingSetup.EnableKeyword(hdrOperations.HasFlag(HDROutputUtils.Operation.ColorEncoding) ? ShaderKeywordStrings.Gamma20AndHDRInput : ShaderKeywordStrings.Gamma20); - } - - if (isAlphaOutputEnabled) - { - m_Materials.scalingSetup.EnableKeyword(ShaderKeywordStrings._ENABLE_ALPHA_OUTPUT); - } - - RenderingUtils.ReAllocateHandleIfNeeded(ref m_ScalingSetupTarget, tempRtDesc, FilterMode.Point, TextureWrapMode.Clamp, name: "_ScalingSetupTexture"); - Blitter.BlitCameraTexture(cmd, m_Source, m_ScalingSetupTarget, colorLoadAction, RenderBufferStoreAction.Store, m_Materials.scalingSetup, 0); - - sourceTex = m_ScalingSetupTarget; - } - - switch (cameraData.imageScalingMode) - { - case ImageScalingMode.Upscaling: - { - // In the upscaling case, set material keywords based on the selected upscaling filter - // Note: If FSR is enabled, we go down this path regardless of the current render scale. We do this because - // FSR still provides visual benefits at 100% scale. This will also make the transition between 99% and 100% - // scale less obvious for cases where FSR is used with dynamic resolution scaling. - switch (cameraData.upscalingFilter) - { - case ImageUpscalingFilter.Point: - { - // TAA post sharpening is an RCAS pass, avoid overriding it with point sampling. - if(!isTaaSharpeningEnabled) - material.EnableKeyword(ShaderKeywordStrings.PointSampling); - break; - } - - case ImageUpscalingFilter.Linear: - { - // Do nothing as linear is the default filter in the shader - break; - } - - case ImageUpscalingFilter.FSR: - { - m_Materials.easu.shaderKeywords = null; - - var upscaleRtDesc = cameraData.cameraTargetDescriptor; - upscaleRtDesc.msaaSamples = 1; - upscaleRtDesc.depthStencilFormat = GraphicsFormat.None; - upscaleRtDesc.width = cameraData.pixelWidth; - upscaleRtDesc.height = cameraData.pixelHeight; - - // EASU - RenderingUtils.ReAllocateHandleIfNeeded(ref m_UpscaledTarget, upscaleRtDesc, FilterMode.Point, TextureWrapMode.Clamp, name: "_UpscaledTexture"); - var fsrInputSize = new Vector2(cameraData.cameraTargetDescriptor.width, cameraData.cameraTargetDescriptor.height); - var fsrOutputSize = new Vector2(cameraData.pixelWidth, cameraData.pixelHeight); - FSRUtils.SetEasuConstants(cmd, fsrInputSize, fsrInputSize, fsrOutputSize); - - if (isAlphaOutputEnabled) - CoreUtils.SetKeyword(m_Materials.easu, ShaderKeywordStrings._ENABLE_ALPHA_OUTPUT, isAlphaOutputEnabled); - - Blitter.BlitCameraTexture(cmd, sourceTex, m_UpscaledTarget, colorLoadAction, RenderBufferStoreAction.Store, m_Materials.easu, 0); - - // RCAS - // Use the override value if it's available, otherwise use the default. - float sharpness = cameraData.fsrOverrideSharpness ? cameraData.fsrSharpness : FSRUtils.kDefaultSharpnessLinear; - - // Set up the parameters for the RCAS pass unless the sharpness value indicates that it wont have any effect. - if (cameraData.fsrSharpness > 0.0f) - { - // RCAS is performed during the final post blit, but we set up the parameters here for better logical grouping. - material.EnableKeyword(requireHDROutput ? ShaderKeywordStrings.EasuRcasAndHDRInput : ShaderKeywordStrings.Rcas); - FSRUtils.SetRcasConstantsLinear(cmd, sharpness); - } - - // Update the source texture for the next operation - sourceTex = m_UpscaledTarget; - PostProcessUtils.SetGlobalShaderSourceSize(cmd, m_UpscaledTarget); - - break; - } - } - - break; - } - - case ImageScalingMode.Downscaling: - { - // In the downscaling case, we don't perform any sort of filter override logic since we always want linear filtering - // and it's already the default option in the shader. - - // Also disable TAA post sharpening pass when downscaling. - isTaaSharpeningEnabled = false; - - break; - } - } - } - else if (isFxaaEnabled) - { - // In unscaled renders, FXAA can be safely performed in the FinalPost shader - material.EnableKeyword(ShaderKeywordStrings.Fxaa); - } - - // Reuse RCAS as a standalone sharpening filter for TAA. - // If FSR is enabled then it overrides the TAA setting and we skip it. - if(isTaaSharpeningEnabled) - { - material.EnableKeyword(ShaderKeywordStrings.Rcas); - FSRUtils.SetRcasConstantsLinear(cmd, cameraData.taaSettings.contrastAdaptiveSharpening); - } - - var cameraTarget = RenderingUtils.GetCameraTargetIdentifier(ref renderingData); - - if (resolveToDebugScreen) - { - // Blit to the debugger texture instead of the camera target - Blitter.BlitCameraTexture(cmd, sourceTex, debugHandler.DebugScreenColorHandle, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, material, 0); - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - cameraData.renderer.ConfigureCameraTarget(debugHandler.DebugScreenColorHandle, debugHandler.DebugScreenDepthHandle); - #pragma warning restore CS0618 - } - else - { - // Get RTHandle alias to use RTHandle apis - RTHandleStaticHelpers.SetRTHandleStaticWrapper(cameraTarget); - var cameraTargetHandle = RTHandleStaticHelpers.s_RTHandleWrapper; - RenderingUtils.FinalBlit(cmd, cameraData, sourceTex, cameraTargetHandle, colorLoadAction, RenderBufferStoreAction.Store, material, 0); - } - } - -#endregion - -#region Internal utilities - - class MaterialLibrary - { - public readonly Material stopNaN; - public readonly Material subpixelMorphologicalAntialiasing; - public readonly Material gaussianDepthOfField; - public readonly Material gaussianDepthOfFieldCoC; - public readonly Material bokehDepthOfField; - public readonly Material bokehDepthOfFieldCoC; - public readonly Material cameraMotionBlur; - public readonly Material paniniProjection; - public readonly Material bloom; - public readonly Material[] bloomUpsample; - public readonly Material temporalAntialiasing; - public readonly Material scalingSetup; - public readonly Material easu; - public readonly Material uber; - public readonly Material finalPass; - public readonly Material lensFlareDataDriven; - public readonly Material lensFlareScreenSpace; - - public MaterialLibrary(PostProcessData data) - { - // NOTE NOTE NOTE NOTE NOTE NOTE - // If you create something here you must also destroy it in Cleanup() - // or it will leak during enter/leave play mode cycles - // NOTE NOTE NOTE NOTE NOTE NOTE - stopNaN = Load(data.shaders.stopNanPS); - subpixelMorphologicalAntialiasing = Load(data.shaders.subpixelMorphologicalAntialiasingPS); - gaussianDepthOfField = Load(data.shaders.gaussianDepthOfFieldPS); - gaussianDepthOfFieldCoC = Load(data.shaders.gaussianDepthOfFieldPS); - bokehDepthOfField = Load(data.shaders.bokehDepthOfFieldPS); - bokehDepthOfFieldCoC = Load(data.shaders.bokehDepthOfFieldPS); - cameraMotionBlur = Load(data.shaders.cameraMotionBlurPS); - paniniProjection = Load(data.shaders.paniniProjectionPS); - bloom = Load(data.shaders.bloomPS); - temporalAntialiasing = Load(data.shaders.temporalAntialiasingPS); - scalingSetup = Load(data.shaders.scalingSetupPS); - easu = Load(data.shaders.easuPS); - uber = Load(data.shaders.uberPostPS); - finalPass = Load(data.shaders.finalPostPassPS); - lensFlareDataDriven = Load(data.shaders.LensFlareDataDrivenPS); - lensFlareScreenSpace = Load(data.shaders.LensFlareScreenSpacePS); - - bloomUpsample = new Material[k_MaxPyramidSize]; - for (uint i = 0; i < k_MaxPyramidSize; ++i) - bloomUpsample[i] = Load(data.shaders.bloomPS); - } - - Material Load(Shader shader) - { - if (shader == null) - { - Debug.LogErrorFormat($"Missing shader. PostProcessing render passes will not execute. Check for missing reference in the renderer resources."); - return null; - } - else if (!shader.isSupported) - { - return null; - } - - return CoreUtils.CreateEngineMaterial(shader); - } - - internal void Cleanup() - { - CoreUtils.Destroy(stopNaN); - CoreUtils.Destroy(subpixelMorphologicalAntialiasing); - CoreUtils.Destroy(gaussianDepthOfField); - CoreUtils.Destroy(gaussianDepthOfFieldCoC); - CoreUtils.Destroy(bokehDepthOfField); - CoreUtils.Destroy(bokehDepthOfFieldCoC); - CoreUtils.Destroy(cameraMotionBlur); - CoreUtils.Destroy(paniniProjection); - CoreUtils.Destroy(bloom); - CoreUtils.Destroy(temporalAntialiasing); - CoreUtils.Destroy(scalingSetup); - CoreUtils.Destroy(easu); - CoreUtils.Destroy(uber); - CoreUtils.Destroy(finalPass); - CoreUtils.Destroy(lensFlareDataDriven); - CoreUtils.Destroy(lensFlareScreenSpace); - - for (uint i = 0; i < k_MaxPyramidSize; ++i) - CoreUtils.Destroy(bloomUpsample[i]); - } - } - - // Precomputed shader ids to same some CPU cycles (mostly affects mobile) - static class ShaderConstants - { - public static readonly int _TempTarget = Shader.PropertyToID("_TempTarget"); - public static readonly int _TempTarget2 = Shader.PropertyToID("_TempTarget2"); - - public static readonly int _StencilRef = Shader.PropertyToID("_StencilRef"); - public static readonly int _StencilMask = Shader.PropertyToID("_StencilMask"); - - public static readonly int _FullCoCTexture = Shader.PropertyToID("_FullCoCTexture"); - public static readonly int _HalfCoCTexture = Shader.PropertyToID("_HalfCoCTexture"); - public static readonly int _DofTexture = Shader.PropertyToID("_DofTexture"); - public static readonly int _CoCParams = Shader.PropertyToID("_CoCParams"); - public static readonly int _BokehKernel = Shader.PropertyToID("_BokehKernel"); - public static readonly int _BokehConstants = Shader.PropertyToID("_BokehConstants"); - public static readonly int _PongTexture = Shader.PropertyToID("_PongTexture"); - public static readonly int _PingTexture = Shader.PropertyToID("_PingTexture"); - - public static readonly int _Metrics = Shader.PropertyToID("_Metrics"); - public static readonly int _AreaTexture = Shader.PropertyToID("_AreaTexture"); - public static readonly int _SearchTexture = Shader.PropertyToID("_SearchTexture"); - public static readonly int _EdgeTexture = Shader.PropertyToID("_EdgeTexture"); - public static readonly int _BlendTexture = Shader.PropertyToID("_BlendTexture"); - - public static readonly int _ColorTexture = Shader.PropertyToID("_ColorTexture"); - public static readonly int _Params = Shader.PropertyToID("_Params"); - public static readonly int _Params2 = Shader.PropertyToID("_Params2"); - public static readonly int _SourceTexLowMip = Shader.PropertyToID("_SourceTexLowMip"); - public static readonly int _Bloom_Params = Shader.PropertyToID("_Bloom_Params"); - public static readonly int _Bloom_Texture = Shader.PropertyToID("_Bloom_Texture"); - public static readonly int _LensDirt_Texture = Shader.PropertyToID("_LensDirt_Texture"); - public static readonly int _LensDirt_Params = Shader.PropertyToID("_LensDirt_Params"); - public static readonly int _LensDirt_Intensity = Shader.PropertyToID("_LensDirt_Intensity"); - public static readonly int _Distortion_Params1 = Shader.PropertyToID("_Distortion_Params1"); - public static readonly int _Distortion_Params2 = Shader.PropertyToID("_Distortion_Params2"); - 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"); - public static readonly int _UserLut = Shader.PropertyToID("_UserLut"); - public static readonly int _DownSampleScaleFactor = Shader.PropertyToID("_DownSampleScaleFactor"); - - public static readonly int _FlareOcclusionRemapTex = Shader.PropertyToID("_FlareOcclusionRemapTex"); - public static readonly int _FlareOcclusionTex = Shader.PropertyToID("_FlareOcclusionTex"); - public static readonly int _FlareOcclusionIndex = Shader.PropertyToID("_FlareOcclusionIndex"); - public static readonly int _FlareTex = Shader.PropertyToID("_FlareTex"); - public static readonly int _FlareColorValue = Shader.PropertyToID("_FlareColorValue"); - public static readonly int _FlareData0 = Shader.PropertyToID("_FlareData0"); - public static readonly int _FlareData1 = Shader.PropertyToID("_FlareData1"); - public static readonly int _FlareData2 = Shader.PropertyToID("_FlareData2"); - public static readonly int _FlareData3 = Shader.PropertyToID("_FlareData3"); - public static readonly int _FlareData4 = Shader.PropertyToID("_FlareData4"); - public static readonly int _FlareData5 = Shader.PropertyToID("_FlareData5"); - - public static readonly int _FullscreenProjMat = Shader.PropertyToID("_FullscreenProjMat"); - } - -#endregion - } -} -#endif diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs.meta deleted file mode 100644 index 4cc7cab51c6..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcessPass.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 858a96c3295017349ab0f956b9883bb9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ProbeVolumeDebugPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ProbeVolumeDebugPass.cs index 58e05adeb64..d1b3d30ea2d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ProbeVolumeDebugPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ProbeVolumeDebugPass.cs @@ -10,50 +10,16 @@ internal class ProbeVolumeDebugPass : ScriptableRenderPass { ComputeShader m_ComputeShader; -#if URP_COMPATIBILITY_MODE - RTHandle m_DepthTexture; - RTHandle m_NormalTexture; -#endif - /// /// Creates a new ProbeVolumeDebugPass instance. /// public ProbeVolumeDebugPass(RenderPassEvent evt, ComputeShader computeShader) { - base.profilingSampler = new ProfilingSampler("Dispatch APV Debug"); + profilingSampler = new ProfilingSampler("Dispatch APV Debug"); renderPassEvent = evt; m_ComputeShader = computeShader; } -#if URP_COMPATIBILITY_MODE - public void Setup(RTHandle depthBuffer, RTHandle normalBuffer) - { - m_DepthTexture = depthBuffer; - m_NormalTexture = normalBuffer; - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - if (!ProbeReferenceVolume.instance.isInitialized) - return; - - ref CameraData cameraData = ref renderingData.cameraData; - if (ProbeReferenceVolume.instance.GetProbeSamplingDebugResources(cameraData.camera, out var resultBuffer, out Vector2 coords)) - { - var cmd = renderingData.commandBuffer; - int kernel = m_ComputeShader.FindKernel("ComputePositionNormal"); - - cmd.SetComputeTextureParam(m_ComputeShader, kernel, "_CameraDepthTexture", m_DepthTexture); - cmd.SetComputeTextureParam(m_ComputeShader, kernel, "_NormalBufferTexture", m_NormalTexture); - cmd.SetComputeVectorParam(m_ComputeShader, "_positionSS", new Vector4(coords.x, coords.y, 0.0f, 0.0f)); - cmd.SetComputeBufferParam(m_ComputeShader, kernel, "_ResultBuffer", resultBuffer); - cmd.DispatchCompute(m_ComputeShader, kernel, 1, 1, 1); - } - } -#endif - class WriteApvData { public ComputeShader computeShader; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs index 4d8557dec4f..dd68d33c3e1 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using UnityEngine.Experimental.Rendering; using UnityEngine.Rendering.RenderGraphModule; using UnityEngine.Scripting.APIUpdating; @@ -100,7 +99,8 @@ public RenderObjectsPass(string profilerTag, RenderPassEvent renderPassEvent, st Init(renderPassEvent, shaderTags, renderQueueType, layerMask, cameraSettings); } - internal RenderObjectsPass(URPProfileId profileId, RenderPassEvent renderPassEvent, string[] shaderTags, RenderQueueType renderQueueType, int layerMask, RenderObjects.CustomCameraSettings cameraSettings) + internal RenderObjectsPass(URPProfileId profileId, RenderPassEvent renderPassEvent, string[] shaderTags, RenderQueueType renderQueueType, int layerMask, + RenderObjects.CustomCameraSettings cameraSettings) { profilingSampler = ProfilingSampler.Get(profileId); Init(renderPassEvent, shaderTags, renderQueueType, layerMask, cameraSettings); @@ -137,27 +137,6 @@ internal void Init(RenderPassEvent renderPassEvent, string[] shaderTags, RenderQ m_CameraSettings = cameraSettings; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalRenderingData universalRenderingData = renderingData.frameData.Get(); - UniversalCameraData cameraData = renderingData.frameData.Get(); - UniversalLightData lightData = renderingData.frameData.Get(); - - var cmd = CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer); - - using (new ProfilingScope(cmd, profilingSampler)) - { - InitPassData(cameraData, ref m_PassData); - InitRendererLists(universalRenderingData, lightData, ref m_PassData, context, default(RenderGraph), false); - - ExecutePass(m_PassData, cmd , m_PassData.rendererList, renderingData.cameraData.IsCameraProjectionMatrixFlipped()); - } - } -#endif - private static void ExecutePass(PassData passData, RasterCommandBuffer cmd, RendererList rendererList, bool isYFlipped) { Camera camera = passData.cameraData.camera; @@ -225,7 +204,7 @@ private void InitPassData(UniversalCameraData cameraData, ref PassData passData) } private void InitRendererLists(UniversalRenderingData renderingData, UniversalLightData lightData, - ref PassData passData, ScriptableRenderContext context, RenderGraph renderGraph, bool useRenderGraph) + ref PassData passData, RenderGraph renderGraph) { SortingCriteria sortingCriteria = (renderQueueType == RenderQueueType.Transparent) ? SortingCriteria.CommonTransparent @@ -238,30 +217,15 @@ private void InitRendererLists(UniversalRenderingData renderingData, UniversalLi drawingSettings.overrideShaderPassIndex = overrideShaderPassIndex; var activeDebugHandler = GetActiveDebugHandler(passData.cameraData); - var filterSettings = m_FilteringSettings; - if (useRenderGraph) + if (activeDebugHandler != null) { - if (activeDebugHandler != null) - { - passData.debugRendererLists = activeDebugHandler.CreateRendererListsWithDebugRenderState(renderGraph, - ref renderingData.cullResults, ref drawingSettings, ref m_FilteringSettings, ref m_RenderStateBlock); - } - else - { - RenderingUtils.CreateRendererListWithRenderStateBlock(renderGraph, ref renderingData.cullResults, drawingSettings, - m_FilteringSettings, m_RenderStateBlock, ref passData.rendererListHdl); - } + passData.debugRendererLists = activeDebugHandler.CreateRendererListsWithDebugRenderState(renderGraph, + ref renderingData.cullResults, ref drawingSettings, ref m_FilteringSettings, ref m_RenderStateBlock); } else { - if (activeDebugHandler != null) - { - passData.debugRendererLists = activeDebugHandler.CreateRendererListsWithDebugRenderState(context, ref renderingData.cullResults, ref drawingSettings, ref m_FilteringSettings, ref m_RenderStateBlock); - } - else - { - RenderingUtils.CreateRendererListWithRenderStateBlock(context, ref renderingData.cullResults, drawingSettings, m_FilteringSettings, m_RenderStateBlock, ref passData.rendererList); - } + RenderingUtils.CreateRendererListWithRenderStateBlock(renderGraph, ref renderingData.cullResults, drawingSettings, + m_FilteringSettings, m_RenderStateBlock, ref passData.rendererListHdl); } } @@ -304,7 +268,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if (ssaoTexture.IsValid()) builder.UseTexture(ssaoTexture, AccessFlags.Read); - InitRendererLists(renderingData, lightData, ref passData, default(ScriptableRenderContext), renderGraph, true); + InitRendererLists(renderingData, lightData, ref passData, renderGraph); var activeDebugHandler = GetActiveDebugHandler(passData.cameraData); if (activeDebugHandler != null) { @@ -330,4 +294,4 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer } } } -} +} \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceAmbientOcclusionPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceAmbientOcclusionPass.cs index 87d613175cd..c6481da2fbc 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceAmbientOcclusionPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScreenSpaceAmbientOcclusionPass.cs @@ -41,25 +41,6 @@ internal class ScreenSpaceAmbientOcclusionPass : ScriptableRenderPass private static readonly int s_CameraViewTopLeftCornerID = Shader.PropertyToID("_CameraViewTopLeftCorner"); private static readonly int s_CameraNormalsTextureID = Shader.PropertyToID("_CameraNormalsTexture"); -#if URP_COMPATIBILITY_MODE - private RTHandle[] m_SSAOTextures = new RTHandle[4]; - - private SSAOPassData m_PassData; - private ScriptableRenderer m_Renderer = null; - - private static readonly int[] m_BilateralTexturesIndices = { 0, 1, 2, 3 }; - private static readonly ShaderPasses[] m_BilateralPasses = { ShaderPasses.BilateralBlurHorizontal, ShaderPasses.BilateralBlurVertical, ShaderPasses.BilateralBlurFinal }; - private static readonly ShaderPasses[] m_BilateralAfterOpaquePasses = { ShaderPasses.BilateralBlurHorizontal, ShaderPasses.BilateralBlurVertical, ShaderPasses.BilateralAfterOpaque }; - - private static readonly int[] m_GaussianTexturesIndices = { 0, 1, 3, 3 }; - private static readonly ShaderPasses[] m_GaussianPasses = { ShaderPasses.GaussianBlurHorizontal, ShaderPasses.GaussianBlurVertical }; - private static readonly ShaderPasses[] m_GaussianAfterOpaquePasses = { ShaderPasses.GaussianBlurHorizontal, ShaderPasses.GaussianAfterOpaque }; - - private static readonly int[] m_KawaseTexturesIndices = { 0, 3 }; - private static readonly ShaderPasses[] m_KawasePasses = { ShaderPasses.KawaseBlur }; - private static readonly ShaderPasses[] m_KawaseAfterOpaquePasses = { ShaderPasses.KawaseAfterOpaque }; -#endif - // Enums private enum BlurTypes { @@ -143,9 +124,6 @@ internal bool Equals(ref SSAOMaterialParams other) internal ScreenSpaceAmbientOcclusionPass() { m_CurrentSettings = new ScreenSpaceAmbientOcclusionSettings(); -#if URP_COMPATIBILITY_MODE - m_PassData = new SSAOPassData(); -#endif } internal bool Setup(ref ScreenSpaceAmbientOcclusionSettings featureSettings, ref ScriptableRenderer renderer, ref Material material, ref Texture2D[] blueNoiseTextures) @@ -153,9 +131,6 @@ internal bool Setup(ref ScreenSpaceAmbientOcclusionSettings featureSettings, ref m_BlueNoiseTextures = blueNoiseTextures; m_Material = material; m_CurrentSettings = featureSettings; -#if URP_COMPATIBILITY_MODE - m_Renderer = renderer; -#endif // RenderPass Event + Source Settings (Depth / Depth&Normals if (renderer is UniversalRenderer { usesDeferredLighting: true }) @@ -207,16 +182,6 @@ internal bool Setup(ref ScreenSpaceAmbientOcclusionSettings featureSettings, ref && m_CurrentSettings.Falloff > 0.0f; } -#if URP_COMPATIBILITY_MODE - private static bool IsAfterOpaquePass(ref ShaderPasses pass) - { - return pass == ShaderPasses.BilateralAfterOpaque - || pass == ShaderPasses.GaussianAfterOpaque - || pass == ShaderPasses.KawaseAfterOpaque; - } - -#endif - private void SetupKeywordsAndParameters(ref ScreenSpaceAmbientOcclusionSettings settings, ref UniversalCameraData cameraData) { #if ENABLE_VR && ENABLE_XR_MODULE @@ -492,171 +457,6 @@ private void CreateRenderTextureHandles(RenderGraph renderGraph, UniversalResour resourceData.ssaoTexture = finalTexture; } - /*---------------------------------------------------------------------------------------------------------------------------------------- - ------------------------------------------------------------- RENDER-GRAPH -------------------------------------------------------------- - ----------------------------------------------------------------------------------------------------------------------------------------*/ - -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - ContextContainer frameData = renderingData.frameData; - UniversalCameraData cameraData = frameData.Get(); - - // Fill in the Pass data... - InitSSAOPassData(ref m_PassData); - - // Update keywords and other shader params - SetupKeywordsAndParameters(ref m_CurrentSettings, ref cameraData); - - // Set up the descriptors - int downsampleDivider = m_CurrentSettings.Downsample ? 2 : 1; - RenderTextureDescriptor descriptor = renderingData.cameraData.cameraTargetDescriptor; - descriptor.msaaSamples = 1; - descriptor.depthStencilFormat = GraphicsFormat.None; - - // AO PAss - m_AOPassDescriptor = descriptor; - m_AOPassDescriptor.width /= downsampleDivider; - m_AOPassDescriptor.height /= downsampleDivider; - bool useRedComponentOnly = m_SupportsR8RenderTextureFormat && m_BlurType > BlurTypes.Bilateral; - m_AOPassDescriptor.colorFormat = useRedComponentOnly ? RenderTextureFormat.R8 : RenderTextureFormat.ARGB32; - - // Allocate textures for the AO and blur - RenderingUtils.ReAllocateHandleIfNeeded(ref m_SSAOTextures[0], m_AOPassDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_SSAO_OcclusionTexture0"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_SSAOTextures[1], m_AOPassDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_SSAO_OcclusionTexture1"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_SSAOTextures[2], m_AOPassDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_SSAO_OcclusionTexture2"); - - // Upsample setup - m_AOPassDescriptor.width *= downsampleDivider; - m_AOPassDescriptor.height *= downsampleDivider; - m_AOPassDescriptor.colorFormat = m_SupportsR8RenderTextureFormat ? RenderTextureFormat.R8 : RenderTextureFormat.ARGB32; - - // Allocate texture for the final SSAO results - RenderingUtils.ReAllocateHandleIfNeeded(ref m_SSAOTextures[3], m_AOPassDescriptor, FilterMode.Bilinear, TextureWrapMode.Clamp, name: "_SSAO_OcclusionTexture"); - PostProcessUtils.SetGlobalShaderSourceSize(cmd, m_SSAOTextures[3]); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - // Configure targets and clear color - ConfigureTarget(m_CurrentSettings.AfterOpaque ? m_Renderer.cameraColorTargetHandle : m_SSAOTextures[3]); - ConfigureClear(ClearFlag.None, Color.white); - #pragma warning restore CS0618 - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - if (m_Material == null) - { - Debug.LogErrorFormat( - "{0}.Execute(): Missing material. ScreenSpaceAmbientOcclusion pass will not execute. Check for missing reference in the renderer resources.", - GetType().Name); - return; - } - - var cmd = renderingData.commandBuffer; - using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.SSAO))) - { - // We only want URP shaders to sample SSAO if After Opaque is off. - if (!m_CurrentSettings.AfterOpaque) - cmd.SetKeyword(ShaderGlobalKeywords.ScreenSpaceOcclusion, true); - - cmd.SetGlobalTexture(k_SSAOTextureName, m_SSAOTextures[3]); - - #if ENABLE_VR && ENABLE_XR_MODULE - bool isFoveatedEnabled = false; - if (renderingData.cameraData.xr.supportsFoveatedRendering) - { - // If we are downsampling we can't use the VRS texture - // If it's a non uniform raster foveated rendering has to be turned off because it will keep applying non uniform for the other passes. - // When calculating normals from depth, this causes artifacts that are amplified from VRS when going to say 4x4. Thus we disable foveated because of that - if (m_CurrentSettings.Downsample || SystemInfo.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.NonUniformRaster) || - (SystemInfo.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.FoveationImage) && m_CurrentSettings.Source == ScreenSpaceAmbientOcclusionSettings.DepthSource.Depth)) - { - cmd.SetFoveatedRenderingMode(FoveatedRenderingMode.Disabled); - } - // If we aren't downsampling and it's a VRS texture we can apply foveation in this case - else if (SystemInfo.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.FoveationImage)) - { - cmd.SetFoveatedRenderingMode(FoveatedRenderingMode.Enabled); - isFoveatedEnabled = true; - } - } - #endif - - GetPassOrder(m_BlurType, m_CurrentSettings.AfterOpaque, out int[] textureIndices, out ShaderPasses[] shaderPasses); - - // Execute the SSAO Occlusion pass - RTHandle cameraDepthTargetHandle = renderingData.cameraData.renderer.cameraDepthTargetHandle; - RenderAndSetBaseMap(ref cmd, ref renderingData, ref renderingData.cameraData.renderer, ref m_Material, ref cameraDepthTargetHandle, ref m_SSAOTextures[0], ShaderPasses.AmbientOcclusion); - - // Execute the Blur Passes - for (int i = 0; i < shaderPasses.Length; i++) - { - int baseMapIndex = textureIndices[i]; - int targetIndex = textureIndices[i + 1]; - RenderAndSetBaseMap(ref cmd, ref renderingData, ref renderingData.cameraData.renderer, ref m_Material, ref m_SSAOTextures[baseMapIndex], ref m_SSAOTextures[targetIndex], shaderPasses[i]); - } - - // Set the global SSAO Params - cmd.SetGlobalVector(s_AmbientOcclusionParamID, new Vector4(1f, 0f, 0f, m_CurrentSettings.DirectLightingStrength)); - #if ENABLE_VR && ENABLE_XR_MODULE - // Cleanup, making sure it doesn't stay enabled for a pass after that should not have it on - if (isFoveatedEnabled) - cmd.SetFoveatedRenderingMode(FoveatedRenderingMode.Disabled); - #endif - } - } - - private static void RenderAndSetBaseMap(ref CommandBuffer cmd, ref RenderingData renderingData, ref ScriptableRenderer renderer, ref Material mat, ref RTHandle baseMap, ref RTHandle target, ShaderPasses pass) - { - if (IsAfterOpaquePass(ref pass)) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - Blitter.BlitCameraTexture(cmd, baseMap, renderer.cameraColorTargetHandle, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, mat, (int)pass); - #pragma warning restore CS0618 - } - - else if (baseMap.rt == null) - { - // Obsolete usage of RTHandle aliasing a RenderTargetIdentifier - Vector2 viewportScale = baseMap.useScaling ? new Vector2(baseMap.rtHandleProperties.rtHandleScale.x, baseMap.rtHandleProperties.rtHandleScale.y) : Vector2.one; - - // Will set the correct camera viewport as well. - CoreUtils.SetRenderTarget(cmd, target); - Blitter.BlitTexture(cmd, baseMap.nameID, viewportScale, mat, (int)pass); - } - - else - Blitter.BlitCameraTexture(cmd, baseMap, target, mat, (int)pass); - } - - private static void GetPassOrder(BlurTypes blurType, bool isAfterOpaque, out int[] textureIndices, out ShaderPasses[] shaderPasses) - { - switch (blurType) - { - case BlurTypes.Bilateral: - textureIndices = m_BilateralTexturesIndices; - shaderPasses = isAfterOpaque ? m_BilateralAfterOpaquePasses : m_BilateralPasses; - break; - case BlurTypes.Gaussian: - textureIndices = m_GaussianTexturesIndices; - shaderPasses = isAfterOpaque ? m_GaussianAfterOpaquePasses : m_GaussianPasses; - break; - case BlurTypes.Kawase: - textureIndices = m_KawaseTexturesIndices; - shaderPasses = isAfterOpaque ? m_KawaseAfterOpaquePasses : m_KawasePasses; - break; - default: - throw new ArgumentOutOfRangeException(); - } - } -#endif - /// public override void OnCameraCleanup(CommandBuffer cmd) { @@ -669,12 +469,6 @@ public override void OnCameraCleanup(CommandBuffer cmd) public void Dispose() { -#if URP_COMPATIBILITY_MODE - m_SSAOTextures[0]?.Release(); - m_SSAOTextures[1]?.Release(); - m_SSAOTextures[2]?.Release(); - m_SSAOTextures[3]?.Release(); -#endif m_SSAOParamsPrev = default; } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs index 4ceadbab79e..0411d478b4c 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/ScriptableRenderPass.cs @@ -204,70 +204,10 @@ static RenderPassEventsEnumValues() /// public abstract partial class ScriptableRenderPass : IRenderGraphRecorder { -#if URP_COMPATIBILITY_MODE - /// - /// RTHandle alias for BuiltinRenderTextureType.CameraTarget which is the backbuffer. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public static RTHandle k_CameraTarget = RTHandles.Alloc(BuiltinRenderTextureType.CameraTarget); -#endif - /// /// The event when the render pass executes. /// public RenderPassEvent renderPassEvent { get; set; } - -#if URP_COMPATIBILITY_MODE - /// - /// The render target identifiers for color attachments. - /// This is obsolete, use colorAttachmentHandles instead. - /// - [Obsolete("Use colorAttachmentHandles. #from(2022.1) #breakingFrom(2023.2)", true)] - public RenderTargetIdentifier[] colorAttachments => throw new NotSupportedException("colorAttachments has been deprecated. Use colorAttachmentHandles instead."); - - /// - /// The render target identifier for color attachment. - /// This is obsolete, use colorAttachmentHandle instead. - /// - [Obsolete("Use colorAttachmentHandle. #from(2022.1) #breakingFrom(2023.2)", true)] - public RenderTargetIdentifier[] colorAttachment => throw new NotSupportedException("colorAttachment has been deprecated. Use colorAttachmentHandle instead."); - - /// - /// The render target identifier for depth attachment. - /// This is obsolete, use depthAttachmentHandle instead. - /// - [Obsolete("Use depthAttachmentHandle. #from(2022.1) #breakingFrom(2023.2)", true)] - public RenderTargetIdentifier depthAttachment => throw new NotSupportedException("depthAttachment has been deprecated. Use depthAttachmentHandle instead."); - - /// - /// List for the g-buffer attachment handles. - /// - public RTHandle[] colorAttachmentHandles => m_ColorAttachments; - - /// - /// The main color attachment handle. - /// - public RTHandle colorAttachmentHandle => m_ColorAttachments[0]; - - /// - /// The depth attachment handle. - /// - public RTHandle depthAttachmentHandle => m_DepthAttachment; - - /// - /// The store actions for Color. - /// - public RenderBufferStoreAction[] colorStoreActions => m_ColorStoreActions; - - /// - /// The store actions for Depth. - /// - public RenderBufferStoreAction depthStoreAction => m_DepthStoreAction; - - internal bool[] overriddenColorStoreActions => m_OverriddenColorStoreActions; - - internal bool overriddenDepthStoreAction => m_OverriddenDepthStoreAction; -#endif /// /// The input requirements for the ScriptableRenderPass, which has been set using ConfigureInput @@ -275,40 +215,14 @@ public abstract partial class ScriptableRenderPass : IRenderGraphRecorder /// public ScriptableRenderPassInput input => m_Input; -#if URP_COMPATIBILITY_MODE - /// - /// The flag to use when clearing. - /// - /// - public ClearFlag clearFlag => m_ClearFlag; - - /// - /// The color value to use when clearing. - /// - public Color clearColor => m_ClearColor; - - RenderBufferStoreAction[] m_ColorStoreActions = new RenderBufferStoreAction[] { RenderBufferStoreAction.Store }; - RenderBufferStoreAction m_DepthStoreAction = RenderBufferStoreAction.Store; -#endif - /// /// Setting this property to true forces rendering of all passes in the URP frame via an intermediate texture. Use this option for passes that do not support rendering directly to the backbuffer or that require sampling the active color target. Using this option might have a significant performance impact on untethered VR platforms. /// public bool requiresIntermediateTexture { get; set; } -#if URP_COMPATIBILITY_MODE - // by default all store actions are Store. The overridden flags are used to keep track of explicitly requested store actions, to - // help figuring out the correct final store action for merged render passes when using the RenderPass API. - private bool[] m_OverriddenColorStoreActions = new bool[] { false }; - private bool m_OverriddenDepthStoreAction = false; -#endif - private ProfilingSampler m_ProfingSampler; private string m_PassName; -#if URP_COMPATIBILITY_MODE - private RenderGraphSettings m_RenderGraphSettings; -#endif - + /// /// A ProfilingSampler for the entire render pass. Used as a profiling name by ScriptableRenderer when executing the pass. /// The default is named as the class type of the sub-class. @@ -319,23 +233,11 @@ protected internal ProfilingSampler profilingSampler { get { -#if URP_COMPATIBILITY_MODE - //We only need this in release (non-dev build) but putting it here to track it in more test automation. - if (m_RenderGraphSettings == null) - { - m_RenderGraphSettings = GraphicsSettings.GetRenderPipelineSettings(); - } -#endif #if (DEVELOPMENT_BUILD || UNITY_EDITOR) return m_ProfingSampler; #else - #if URP_COMPATIBILITY_MODE - //We only remove the sampler in release build when not in Compatibility Mode to avoid breaking user projects in the very unlikely scenario they would get the sampler. - return m_RenderGraphSettings.enableRenderCompatibilityMode ? m_ProfingSampler : null; - #else return null; - #endif #endif } set @@ -353,10 +255,7 @@ protected internal ProfilingSampler profilingSampler protected internal string passName{ get { return m_PassName; } } internal bool isBlitRenderPass { get; set; } - -#if URP_COMPATIBILITY_MODE - internal bool useNativeRenderPass { get; set; } -#endif + // index to track the position in the current frame internal int renderPassQueueIndex { get; set; } @@ -365,19 +264,7 @@ protected internal ProfilingSampler profilingSampler internal GraphicsFormat[] renderTargetFormat { get; set; } -#if URP_COMPATIBILITY_MODE - RTHandle[] m_ColorAttachments; - internal RTHandle[] m_InputAttachments = new RTHandle[8]; - internal bool[] m_InputAttachmentIsTransient = new bool[8]; - internal bool overrideCameraTarget { get; set; } - RTHandle m_DepthAttachment; -#endif - ScriptableRenderPassInput m_Input = ScriptableRenderPassInput.None; -#if URP_COMPATIBILITY_MODE - ClearFlag m_ClearFlag = ClearFlag.None; - Color m_ClearColor = Color.black; -#endif static internal DebugHandler GetActiveDebugHandler(UniversalCameraData cameraData) { @@ -393,31 +280,6 @@ static internal DebugHandler GetActiveDebugHandler(UniversalCameraData cameraDat public ScriptableRenderPass() { renderPassEvent = RenderPassEvent.AfterRenderingOpaques; -#if URP_COMPATIBILITY_MODE - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - m_ColorAttachments = new RTHandle[] { k_CameraTarget, null, null, null, null, null, null, null }; - m_DepthAttachment = k_CameraTarget; - #pragma warning restore CS0618 - m_InputAttachments = new RTHandle[] { null, null, null, null, null, null, null, null }; - m_InputAttachmentIsTransient = new bool[] { false, false, false, false, false, false, false, false }; - m_ColorStoreActions = new RenderBufferStoreAction[] { RenderBufferStoreAction.Store, 0, 0, 0, 0, 0, 0, 0 }; - m_DepthStoreAction = RenderBufferStoreAction.Store; - m_OverriddenColorStoreActions = new bool[] { false, false, false, false, false, false, false, false }; - m_OverriddenDepthStoreAction = false; - m_ClearFlag = ClearFlag.None; - m_ClearColor = Color.black; - overrideCameraTarget = false; - isBlitRenderPass = false; - useNativeRenderPass = true; - renderPassQueueIndex = -1; - renderTargetFormat = new GraphicsFormat[] - { - GraphicsFormat.None, GraphicsFormat.None, GraphicsFormat.None, - GraphicsFormat.None, GraphicsFormat.None, GraphicsFormat.None, GraphicsFormat.None, GraphicsFormat.None - }; -#endif - profilingSampler = new ProfilingSampler(this.GetType().Name); } @@ -432,288 +294,6 @@ public void ConfigureInput(ScriptableRenderPassInput passInput) m_Input = passInput; } -#if URP_COMPATIBILITY_MODE - /// - /// Configures the Store Action for a color attachment of this render pass. - /// - /// RenderBufferStoreAction to use - /// Index of the color attachment - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ConfigureColorStoreAction(RenderBufferStoreAction storeAction, uint attachmentIndex = 0) - { - m_ColorStoreActions[attachmentIndex] = storeAction; - m_OverriddenColorStoreActions[attachmentIndex] = true; - } - - /// - /// Configures the Store Actions for all the color attachments of this render pass. - /// - /// Array of RenderBufferStoreActions to use - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ConfigureColorStoreActions(RenderBufferStoreAction[] storeActions) - { - int count = Math.Min(storeActions.Length, m_ColorStoreActions.Length); - for (uint i = 0; i < count; ++i) - { - m_ColorStoreActions[i] = storeActions[i]; - m_OverriddenColorStoreActions[i] = true; - } - } - - /// - /// Configures the Store Action for the depth attachment of this render pass. - /// - /// RenderBufferStoreAction to use - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ConfigureDepthStoreAction(RenderBufferStoreAction storeAction) - { - m_DepthStoreAction = storeAction; - m_OverriddenDepthStoreAction = true; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal void ConfigureInputAttachments(RTHandle input, bool isTransient = false) - { - m_InputAttachments[0] = input; - m_InputAttachmentIsTransient[0] = isTransient; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal void ConfigureInputAttachments(RTHandle[] inputs) - { - m_InputAttachments = inputs; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal void ConfigureInputAttachments(RTHandle[] inputs, bool[] isTransient) - { - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - ConfigureInputAttachments(inputs); -#pragma warning restore CS0618 - - m_InputAttachmentIsTransient = isTransient; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal void SetInputAttachmentTransient(int idx, bool isTransient) - { - m_InputAttachmentIsTransient[idx] = isTransient; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal bool IsInputAttachmentTransient(int idx) - { - return m_InputAttachmentIsTransient[idx]; - } - - /// - /// Resets render targets to default. - /// This method effectively reset changes done by ConfigureTarget. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ResetTarget() - { - overrideCameraTarget = false; - - // Reset depth - m_DepthAttachment = null; - - // Reset colors - m_ColorAttachments[0] = null; - for (int i = 1; i < m_ColorAttachments.Length; ++i) - { - m_ColorAttachments[i] = null; - } - } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment identifier. - /// Depth attachment identifier. - /// - [Obsolete("Use RTHandles for colorAttachment and depthAttachment. #from(2022.1) #breakingFrom(2023.1)", true)] - public void ConfigureTarget(RenderTargetIdentifier colorAttachment, RenderTargetIdentifier depthAttachment) - { - throw new NotSupportedException("ConfigureTarget with RenderTargetIdentifier has been deprecated. Use RTHandles instead"); - } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment handle. - /// Depth attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ConfigureTarget(RTHandle colorAttachment, RTHandle depthAttachment) - { - overrideCameraTarget = true; - - m_DepthAttachment = depthAttachment; - m_ColorAttachments[0] = colorAttachment; - for (int i = 1; i < m_ColorAttachments.Length; ++i) - { - m_ColorAttachments[i] = null; - } - } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment identifier. - /// Depth attachment identifier. - /// - [Obsolete("Use RTHandles for colorAttachments and depthAttachment. #from(2022.1) #breakingFrom(2023.1)", true)] - public void ConfigureTarget(RenderTargetIdentifier[] colorAttachments, RenderTargetIdentifier depthAttachment) - { - throw new NotSupportedException("ConfigureTarget with RenderTargetIdentifier has been deprecated. Use it with RTHandles instead"); - } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment handle. - /// Depth attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ConfigureTarget(RTHandle[] colorAttachments, RTHandle depthAttachment) - { - overrideCameraTarget = true; - - uint nonNullColorBuffers = RenderingUtils.GetValidColorBufferCount(colorAttachments); - if (nonNullColorBuffers > SystemInfo.supportedRenderTargetCount) - Debug.LogError("Trying to set " + nonNullColorBuffers + " renderTargets, which is more than the maximum supported:" + SystemInfo.supportedRenderTargetCount); - - if (colorAttachments.Length > m_ColorAttachments.Length) - Debug.LogError("Trying to set " + colorAttachments.Length + " color attachments, which is more than the maximum supported:" + m_ColorAttachments.Length); - - for (int i = 0; i < colorAttachments.Length; ++i) - { - m_ColorAttachments[i] = colorAttachments[i]; - } - - for (int i = colorAttachments.Length; i < m_ColorAttachments.Length; ++i) - { - m_ColorAttachments[i] = null; - } - - m_DepthAttachment = depthAttachment; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal void ConfigureTarget(RTHandle[] colorAttachments, RTHandle depthAttachment, GraphicsFormat[] formats) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(colorAttachments, depthAttachment); - #pragma warning restore CS0618 - - for (int i = 0; i < formats.Length; ++i) - renderTargetFormat[i] = formats[i]; - } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment identifier. - /// - [Obsolete("Use RTHandle for colorAttachment. #from(2022.1) #breakingFrom(2023.1)", true)] - public void ConfigureTarget(RenderTargetIdentifier colorAttachment) - { - throw new NotSupportedException("ConfigureTarget with RenderTargetIdentifier has been deprecated. Use it with RTHandles instead"); - } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ConfigureTarget(RTHandle colorAttachment) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(colorAttachment, k_CameraTarget); - #pragma warning restore CS0618 - } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment identifiers. - /// - [Obsolete("Use RTHandles for colorAttachments. #from(2022.1) #breakingFrom(2023.1)", true)] - public void ConfigureTarget(RenderTargetIdentifier[] colorAttachments) - { - throw new NotSupportedException("ConfigureTarget with RenderTargetIdentifier has been deprecated. Use it with RTHandles instead"); - } - - /// - /// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget. - /// This method should be called inside Configure. - /// - /// Color attachment handle. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ConfigureTarget(RTHandle[] colorAttachments) - { - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - ConfigureTarget(colorAttachments, k_CameraTarget); -#pragma warning restore CS0618 - } - - /// - /// Configures clearing for the render targets for this render pass. Call this inside Configure. - /// - /// ClearFlag containing information about what targets to clear. - /// Clear color. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ConfigureClear(ClearFlag clearFlag, Color clearColor) - { - m_ClearFlag = clearFlag; - m_ClearColor = clearColor; - } - - /// - /// This method is called by the renderer before rendering a camera - /// Override this method if you need to to configure render targets and their clear state, and to create temporary render target textures. - /// If a render pass doesn't override this method, this render pass renders to the active Camera's render target. - /// You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear. - /// - /// CommandBuffer to enqueue rendering commands. This will be executed by the pipeline. - /// Current rendering state information - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public virtual void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { } - - /// - /// This method is called by the renderer before executing the render pass. - /// Override this method if you need to to configure render targets and their clear state, and to create temporary render target textures. - /// If a render pass doesn't override this method, this render pass renders to the active Camera's render target. - /// You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear. - /// - /// CommandBuffer to enqueue rendering commands. This will be executed by the pipeline. - /// Render texture descriptor of the camera render target. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public virtual void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { } -#endif - /// /// Called upon finish rendering a camera. You can use this callback to release any resources created /// by this render @@ -724,31 +304,6 @@ public virtual void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraT public virtual void OnCameraCleanup(CommandBuffer cmd) { } - -#if URP_COMPATIBILITY_MODE - /// - /// Called upon finish rendering a camera stack. You can use this callback to release any resources created - /// by this render pass that need to be cleanup once all cameras in the stack have finished rendering. - /// This method will be called once after rendering the last camera in the camera stack. - /// Cameras that don't have an explicit camera stack are also considered stacked rendering. - /// In that case the Base camera is the first and last camera in the stack. - /// - /// Use this CommandBuffer to cleanup any generated data - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public virtual void OnFinishCameraStackRendering(CommandBuffer cmd) - { } - - /// - /// Execute the pass. This is where custom rendering occurs. Specific details are left to the implementation - /// - /// Use this render context to issue any draw commands during execution - /// Current rendering state information - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public virtual void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - Debug.LogWarning("Execute is not implemented, the pass " + this.ToString() + " won't be executed in the current render loop."); - } -#endif /// public virtual void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) @@ -756,74 +311,6 @@ public virtual void RecordRenderGraph(RenderGraph renderGraph, ContextContainer Debug.LogWarning("The render pass " + this.ToString() + " does not have an implementation of the RecordRenderGraph method. Please implement this method, or consider turning on Compatibility Mode (RenderGraph disabled) in the menu Edit > Project Settings > Graphics > URP. Otherwise the render pass will have no effect. For more information, refer to https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest/index.html?subfolder=/manual/customizing-urp.html."); } -#if URP_COMPATIBILITY_MODE - /// - /// Add a blit command to the context for execution. This changes the active render target in the ScriptableRenderer to - /// destination. - /// - /// Command buffer to record command for execution. - /// Source texture or target identifier to blit from. - /// Destination texture or target identifier to blit into. This becomes the renderer active render target. - /// Material to use. - /// Shader pass to use. Default is 0. - /// - [Obsolete("Use RTHandles for source and destination. #from(2022.1) #breakingFrom(2023.1)", true)] - public void Blit(CommandBuffer cmd, RenderTargetIdentifier source, RenderTargetIdentifier destination, Material material = null, int passIndex = 0) - { - throw new NotSupportedException("Blit with RenderTargetIdentifier has been deprecated. Use RTHandles instead"); - } - - /// - /// Add a blit command to the context for execution. This changes the active render target in the ScriptableRenderer to - /// destination. - /// - /// Command buffer to record command for execution. - /// Source texture or target handle to blit from. - /// Destination texture or target handle to blit into. This becomes the renderer active render target. - /// Material to use. - /// Shader pass to use. Default is 0. - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void Blit(CommandBuffer cmd, RTHandle source, RTHandle destination, Material material = null, int passIndex = 0) - { - if (material == null) - Blitter.BlitCameraTexture(cmd, source, destination, bilinear: source.rt.filterMode == FilterMode.Bilinear); - else - Blitter.BlitCameraTexture(cmd, source, destination, material, passIndex); - } - - /// - /// Add a blit command to the context for execution. This applies the material to the color target. - /// - /// Command buffer to record command for execution. - /// RenderingData to access the active renderer. - /// Material to use. - /// Shader pass to use. Default is 0. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void Blit(CommandBuffer cmd, ref RenderingData data, Material material, int passIndex = 0) - { - var renderer = data.cameraData.renderer; - - Blit(cmd, renderer.cameraColorTargetHandle, renderer.GetCameraColorFrontBuffer(cmd), material, passIndex); - renderer.SwapColorBuffer(cmd); - } - - /// - /// Add a blit command to the context for execution. This applies the material to the color target. - /// - /// Command buffer to record command for execution. - /// RenderingData to access the active renderer. - /// Source texture or target identifier to blit from. - /// Material to use. - /// Shader pass to use. Default is 0. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void Blit(CommandBuffer cmd, ref RenderingData data, RTHandle source, Material material, int passIndex = 0) - { - var renderer = data.cameraData.renderer; - Blit(cmd, source, renderer.cameraColorTargetHandle, material, passIndex); - } -#endif - /// /// Creates DrawingSettings based on current the rendering state. /// @@ -916,7 +403,7 @@ public DrawingSettings CreateDrawingSettings(List shaderTagIdList, return lhs.renderPassEvent > rhs.renderPassEvent; } - static internal int GetRenderPassEventRange(RenderPassEvent renderPassEvent) + internal static int GetRenderPassEventRange(RenderPassEvent renderPassEvent) { int numEvents = RenderPassEventsEnumValues.values.Length; int currentIndex = 0; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/TransparentSettingsPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/TransparentSettingsPass.cs index 29395d49535..665f2d6ade5 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/TransparentSettingsPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/TransparentSettingsPass.cs @@ -25,18 +25,6 @@ public bool Setup() return !m_shouldReceiveShadows; } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - RasterCommandBuffer rasterCommandBuffer = CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer); - using (new ProfilingScope(rasterCommandBuffer, profilingSampler)) - { - ExecutePass(rasterCommandBuffer); - } - } -#endif - public static void ExecutePass(RasterCommandBuffer rasterCommandBuffer) { // ----------------------------------------------------------- diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs index 45947d5d336..ddaf62aeb78 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs @@ -10,27 +10,10 @@ namespace UnityEngine.Rendering.Universal /// public partial class XROcclusionMeshPass : ScriptableRenderPass { -#if URP_COMPATIBILITY_MODE - /// - /// Used to indicate if the active target of the pass is the back buffer - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete + " #from(6000.3)")] - public bool m_IsActiveTargetBackBuffer; // TODO: Remove this when we remove non-RG path - - PassData m_PassData; -#endif - public XROcclusionMeshPass(RenderPassEvent evt) { profilingSampler = new ProfilingSampler("Draw XR Occlusion Mesh"); renderPassEvent = evt; - -#if URP_COMPATIBILITY_MODE -#pragma warning disable CS0618 - m_IsActiveTargetBackBuffer = false; -#pragma warning restore CS0618 - m_PassData = new PassData(); -#endif } private static void ExecutePass(RasterCommandBuffer cmd, PassData data) @@ -44,18 +27,6 @@ private static void ExecutePass(RasterCommandBuffer cmd, PassData data) } } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - m_PassData.xr = renderingData.cameraData.xr; - m_PassData.isActiveTargetBackBuffer = m_IsActiveTargetBackBuffer; - m_PassData.shouldYFlip = !m_PassData.isActiveTargetBackBuffer; - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData); - } -#endif - private class PassData { internal XRPass xr; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessPasses.cs b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessPasses.cs deleted file mode 100644 index 4ae52816c64..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessPasses.cs +++ /dev/null @@ -1,136 +0,0 @@ -#if URP_COMPATIBILITY_MODE -using System; -using UnityEngine.Experimental.Rendering; -using UnityEngine.Rendering.Universal.Internal; - -namespace UnityEngine.Rendering.Universal.CompatibilityMode -{ - /// - /// Run-time creation parameters for post process passes. - /// - internal struct PostProcessParams - { - /// - /// The blit Material to use. - /// - /// - public Material blitMaterial; - /// - /// Requested GraphicsFormat for postprocess rendering. - /// - /// - public GraphicsFormat requestColorFormat; - - /// - /// A static factory function for default initialization of PostProcessParams. - /// - /// - public static PostProcessParams Create() - { - PostProcessParams ppParams; - ppParams.blitMaterial = null; - ppParams.requestColorFormat = GraphicsFormat.None; - return ppParams; - } - } - - /// - /// Type acts as wrapper for post process passes. Can we be recreated and destroyed at any point during runtime with post process data. - /// - internal struct PostProcessPasses : IDisposable - { - ColorGradingLutPass m_ColorGradingLutPass; - PostProcessPass m_PostProcessPass; - PostProcessPass m_FinalPostProcessPass; - - internal RTHandle m_AfterPostProcessColor; - internal RTHandle m_ColorGradingLut; - - PostProcessData m_RendererPostProcessData; - PostProcessData m_CurrentPostProcessData; - Material m_BlitMaterial; - - public ColorGradingLutPass colorGradingLutPass { get => m_ColorGradingLutPass; } - public PostProcessPass postProcessPass { get => m_PostProcessPass; } - public PostProcessPass finalPostProcessPass { get => m_FinalPostProcessPass; } - public RTHandle afterPostProcessColor { get => m_AfterPostProcessColor; } - public RTHandle colorGradingLut { get => m_ColorGradingLut; } - - public bool isCreated { get => m_CurrentPostProcessData != null; } - - /// - /// Creates post process passes with supplied data anda params. - /// - /// Post process resources. - /// Post process run-time creation parameters. - public PostProcessPasses(PostProcessData rendererPostProcessData, ref PostProcessParams postProcessParams) - { - m_ColorGradingLutPass = null; - m_PostProcessPass = null; - m_FinalPostProcessPass = null; - m_CurrentPostProcessData = null; - - m_AfterPostProcessColor = null; - m_ColorGradingLut = null; - - m_RendererPostProcessData = rendererPostProcessData; - m_BlitMaterial = postProcessParams.blitMaterial; - Recreate(rendererPostProcessData, ref postProcessParams); - } - - /// - /// Recreates post process passes with supplied data. If already contains valid post process passes, they will be replaced by new ones. - /// - /// Resources used for creating passes. In case of the null, no passes will be created. - /// Run-time parameters used for creating passes. - public void Recreate(PostProcessData data, ref PostProcessParams ppParams) - { - if (m_RendererPostProcessData) - data = m_RendererPostProcessData; - - if (data == m_CurrentPostProcessData) - return; - - if (m_CurrentPostProcessData != null) - { - m_ColorGradingLutPass?.Cleanup(); - - // We need to null post process passes to avoid using them - m_ColorGradingLutPass = null; - m_CurrentPostProcessData = null; - - m_PostProcessPass?.Cleanup(); - m_FinalPostProcessPass?.Cleanup(); - m_PostProcessPass = null; - m_FinalPostProcessPass = null; - } - - if (data != null) - { - m_ColorGradingLutPass = new ColorGradingLutPass(RenderPassEvent.BeforeRenderingPrePasses, data); - m_PostProcessPass = new PostProcessPass(RenderPassEvent.AfterRenderingPostProcessing - 1, data, ref ppParams); - m_FinalPostProcessPass = new PostProcessPass(RenderPassEvent.AfterRendering - 1, data, ref ppParams); - m_CurrentPostProcessData = data; - } - } - - public void Dispose() - { - // always dispose unmanaged resources - m_ColorGradingLutPass?.Cleanup(); - m_PostProcessPass?.Cleanup(); - m_FinalPostProcessPass?.Cleanup(); - m_AfterPostProcessColor?.Release(); - m_ColorGradingLut?.Release(); - } - - internal void ReleaseRenderTargets() - { - m_AfterPostProcessColor?.Release(); - m_PostProcessPass?.Dispose(); - m_FinalPostProcessPass?.Dispose(); - m_ColorGradingLut?.Release(); - } - } -} -#endif diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessPasses.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessPasses.cs.meta deleted file mode 100644 index f6ac801c118..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/PostProcessPasses.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c1fb44c6df759ae498bd738a433a1c60 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph.meta b/Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph.meta deleted file mode 100644 index a9e5da137ab..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1af1ea941365745b49edfb5efd32cf05 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph/RenderGraphGraphicsAutomatedTests.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph/RenderGraphGraphicsAutomatedTests.cs deleted file mode 100644 index 021b05f31ec..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph/RenderGraphGraphicsAutomatedTests.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine.Experimental.Rendering; - -namespace UnityEngine.Rendering -{ - /// - /// Utility class to connect SRP to automated test framework. - /// - public static class RenderGraphGraphicsAutomatedTests - { - // RenderGraph tests can be enabled from the command line. Cache result to avoid GC. - static bool activatedFromCommandLine - { -#if RENDER_GRAPH_REUSE_TESTS_STANDALONE - get => true; -#else - get => Array.Exists(Environment.GetCommandLineArgs(), arg => arg == "-render-graph-reuse-tests"); -#endif - } - - /// Obsolete, use forceRenderGraphState instead - [Obsolete] - public static bool enabled { get; set; } = activatedFromCommandLine; - - /// - /// Used by render pipelines to initialize RenderGraph tests. - /// True = RenderGraph, False = CompatibilityMode, null = no effect (keep as it is configured in the project settings). - /// - public static bool? forceRenderGraphState { get; set; } = activatedFromCommandLine ? true : null; - } -} diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph/RenderGraphGraphicsAutomatedTests.cs.meta b/Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph/RenderGraphGraphicsAutomatedTests.cs.meta deleted file mode 100644 index 06b8dbca993..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RenderGraph/RenderGraphGraphicsAutomatedTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f97d26789369242d4a39fdf71bb9e045 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RenderPipelineResources/Renderer2DResources.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RenderPipelineResources/Renderer2DResources.cs index c02dc34455c..ee5b6bf54ee 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RenderPipelineResources/Renderer2DResources.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RenderPipelineResources/Renderer2DResources.cs @@ -65,18 +65,6 @@ internal Shader geometryUnshadowShader set => this.SetValueAndNotify(ref m_GeometryUnshadowShader, value, nameof(m_GeometryUnshadowShader)); } -#if URP_COMPATIBILITY_MODE - [SerializeField, ResourcePath("Runtime/2D/Data/Textures/FalloffLookupTexture.png")] - [HideInInspector] - private Texture2D m_FallOffLookup; - - internal Texture2D fallOffLookup - { - get => m_FallOffLookup; - set => this.SetValueAndNotify(ref m_FallOffLookup, value, nameof(m_FallOffLookup)); - } -#endif - [SerializeField,ResourcePath("Shaders/Utils/CopyDepth.shader")] private Shader m_CopyDepthPS; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DecalRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DecalRendererFeature.cs index acaca5a0b12..f4cd828cf3d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DecalRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/DecalRendererFeature.cs @@ -537,62 +537,9 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD } } -#if URP_COMPATIBILITY_MODE - internal override bool SupportsNativeRenderPass() - { - return m_Technique == DecalTechnique.GBuffer || m_Technique == DecalTechnique.ScreenSpace; - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete + " #from(6000.2)")] - public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - if (renderer.cameraColorTargetHandle == null) - return; - - if (m_Technique == DecalTechnique.DBuffer) - { - m_DBufferRenderPass.Setup(renderingData.cameraData); - - var universalRenderer = renderer as UniversalRenderer; - if (universalRenderer.usesDeferredLighting) - { - m_DBufferRenderPass.Setup(renderingData.cameraData, renderer.cameraDepthTargetHandle); - - m_CopyDepthPass.Setup( - renderer.cameraDepthTargetHandle, - universalRenderer.m_DepthTexture - ); - } - else - { - m_DBufferRenderPass.Setup(renderingData.cameraData); - - m_CopyDepthPass.Setup( - universalRenderer.m_DepthTexture, - m_DBufferRenderPass.dBufferDepth - ); - m_CopyDepthPass.CopyToDepth = true; - m_CopyDepthPass.MsaaSamples = 1; - } - } - else if (m_Technique == DecalTechnique.GBuffer && m_DeferredLights.UseFramebufferFetch) - { - // Need to call Configure for both of these passes to setup input attachments as first frame otherwise will raise errors - m_GBufferRenderPass.Configure(null, renderingData.cameraData.cameraTargetDescriptor); - } - #pragma warning restore CS0618 - } -#endif - /// protected override void Dispose(bool disposing) { -#if URP_COMPATIBILITY_MODE - m_DBufferRenderPass?.Dispose(); -#endif m_CopyDepthPass?.Dispose(); CoreUtils.Destroy(m_DBufferClearMaterial); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs index 5599d00bd14..4e52a54f9b6 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs @@ -108,13 +108,6 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD renderer.EnqueuePass(m_FullScreenPass); } -#if URP_COMPATIBILITY_MODE - /// - protected override void Dispose(bool disposing) - { - m_FullScreenPass.Dispose(); - } -#endif internal class FullScreenRenderPass : ScriptableRenderPass { @@ -125,10 +118,6 @@ internal class FullScreenRenderPass : ScriptableRenderPass private static MaterialPropertyBlock s_SharedPropertyBlock = new MaterialPropertyBlock(); -#if URP_COMPATIBILITY_MODE - private RTHandle m_CopiedColor; -#endif - public FullScreenRenderPass(string passName) { profilingSampler = new ProfilingSampler(passName); @@ -142,37 +131,10 @@ public void SetupMembers(Material material, int passIndex, bool fetchActiveColor m_BindDepthStencilAttachment = bindDepthStencilAttachment; } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - // FullScreenPass manages its own RenderTarget. - // ResetTarget here so that ScriptableRenderer's active attachement can be invalidated when processing this ScriptableRenderPass. - ResetTarget(); -#pragma warning restore CS0618 - - if (m_FetchActiveColor) - ReAllocate(renderingData.cameraData.cameraTargetDescriptor); - } -#endif - internal void ReAllocate(RenderTextureDescriptor desc) { -#if URP_COMPATIBILITY_MODE - desc.msaaSamples = 1; - desc.depthStencilFormat = GraphicsFormat.None; - RenderingUtils.ReAllocateHandleIfNeeded(ref m_CopiedColor, desc, name: "_FullscreenPassColorCopy"); -#endif - } -#if URP_COMPATIBILITY_MODE - public void Dispose() - { - m_CopiedColor?.Release(); } -#endif private static void ExecuteCopyColorPass(RasterCommandBuffer cmd, RTHandle sourceTexture) { @@ -191,32 +153,6 @@ private static void ExecuteMainPass(RasterCommandBuffer cmd, RTHandle sourceText cmd.DrawProcedural(Matrix4x4.identity, material, passIndex, MeshTopology.Triangles, 3, 1, s_SharedPropertyBlock); } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - ref var cameraData = ref renderingData.cameraData; - var cmd = renderingData.commandBuffer; - - using (new ProfilingScope(cmd, profilingSampler)) - { - RasterCommandBuffer rasterCmd = CommandBufferHelpers.GetRasterCommandBuffer(cmd); - if (m_FetchActiveColor) - { - CoreUtils.SetRenderTarget(cmd, m_CopiedColor); - ExecuteCopyColorPass(rasterCmd, cameraData.renderer.cameraColorTargetHandle); - } - - if (m_BindDepthStencilAttachment) - CoreUtils.SetRenderTarget(cmd, cameraData.renderer.cameraColorTargetHandle, cameraData.renderer.cameraDepthTargetHandle); - else - CoreUtils.SetRenderTarget(cmd, cameraData.renderer.cameraColorTargetHandle); - - ExecuteMainPass(rasterCmd, m_FetchActiveColor ? m_CopiedColor : null, m_Material, m_PassIndex); - } - } -#endif - public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { UniversalResourceData resourcesData = frameData.Get(); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/OnTilePostProcessFeature.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/OnTilePostProcessFeature.cs index b9ca98f0afe..a9353ca6a54 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/OnTilePostProcessFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/OnTilePostProcessFeature.cs @@ -109,7 +109,7 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD // NOTE: Ideally, we check here if the Post Processing is enabled on the UniversalRenderer asset through a public API. In that case, the built in post processing will be enabled. // We currently do not have a public API for that, so we use internal API for now var universalRenderer = renderer as UniversalRenderer; - if (universalRenderer.isPostProcessPassRenderGraphActive) + if (universalRenderer.isPostProcessActive) { Debug.LogError("URP renderer(Universal Renderer Data) has post processing enabled, which conflicts with the On-Tile post processing feature. Only one of the post processing should be enabled. On-Tile post processing feature will not be added."); return; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs index 70ad2ac5cde..31e8f07f545 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs @@ -239,12 +239,5 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD return; renderer.EnqueuePass(renderObjectsPass); } - -#if URP_COMPATIBILITY_MODE - internal override bool SupportsNativeRenderPass() - { - return true; - } -#endif } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/ScreenSpaceShadows.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/ScreenSpaceShadows.cs index 7e68a874ab4..9ac588cc20e 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/ScreenSpaceShadows.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/ScreenSpaceShadows.cs @@ -79,9 +79,6 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD /// protected override void Dispose(bool disposing) { -#if URP_COMPATIBILITY_MODE - m_SSShadowsPass?.Dispose(); -#endif m_SSShadowsPass = null; CoreUtils.Destroy(m_Material); } @@ -114,29 +111,13 @@ private class ScreenSpaceShadowsPass : ScriptableRenderPass private ScreenSpaceShadowsSettings m_CurrentSettings; private int m_ScreenSpaceShadowmapTextureID; -#if URP_COMPATIBILITY_MODE - private PassData m_PassData; - private RTHandle m_RenderTarget; -#endif - internal ScreenSpaceShadowsPass() { profilingSampler = new ProfilingSampler("Blit Screen Space Shadows"); m_CurrentSettings = new ScreenSpaceShadowsSettings(); m_ScreenSpaceShadowmapTextureID = Shader.PropertyToID("_ScreenSpaceShadowmapTexture"); - -#if URP_COMPATIBILITY_MODE - m_PassData = new PassData(); -#endif } -#if URP_COMPATIBILITY_MODE - public void Dispose() - { - m_RenderTarget?.Release(); - } -#endif - internal bool Setup(ScreenSpaceShadowsSettings featureSettings, Material material) { m_CurrentSettings = featureSettings; @@ -145,33 +126,7 @@ internal bool Setup(ScreenSpaceShadowsSettings featureSettings, Material materia return m_Material != null; } - - -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - var desc = renderingData.cameraData.cameraTargetDescriptor; - desc.depthStencilFormat = GraphicsFormat.None; - desc.msaaSamples = 1; - // UUM-41070: We require `Linear | Render` but with the deprecated FormatUsage this was checking `Blend` - // For now, we keep checking for `Blend` until the performance hit of doing the correct checks is evaluated - desc.graphicsFormat = SystemInfo.IsFormatSupported(GraphicsFormat.R8_UNorm, GraphicsFormatUsage.Blend) - ? GraphicsFormat.R8_UNorm - : GraphicsFormat.B8G8R8A8_UNorm; - - RenderingUtils.ReAllocateHandleIfNeeded(ref m_RenderTarget, desc, FilterMode.Point, TextureWrapMode.Clamp, name: "_ScreenSpaceShadowmapTexture"); - cmd.SetGlobalTexture(m_RenderTarget.name, m_RenderTarget.nameID); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(m_RenderTarget); - ConfigureClear(ClearFlag.None, Color.white); - #pragma warning restore CS0618 - } -#endif - + private class PassData { internal TextureHandle target; @@ -229,16 +184,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer } } -#if URP_COMPATIBILITY_MODE - private static void ExecutePass(RasterCommandBuffer cmd, PassData data, RTHandle target) - { - Blitter.BlitTexture(cmd, target, Vector2.one, data.material, 0); - cmd.SetKeyword(ShaderGlobalKeywords.MainLightShadows, false); - cmd.SetKeyword(ShaderGlobalKeywords.MainLightShadowCascades, false); - cmd.SetKeyword(ShaderGlobalKeywords.MainLightShadowScreen, true); - } -#endif - private static void ExecutePass(UnsafeCommandBuffer cmd, PassData data, RTHandle target) { Blitter.BlitTexture(cmd, target, Vector2.one, data.material, 0); @@ -246,50 +191,15 @@ private static void ExecutePass(UnsafeCommandBuffer cmd, PassData data, RTHandle cmd.SetKeyword(ShaderGlobalKeywords.MainLightShadowCascades, false); cmd.SetKeyword(ShaderGlobalKeywords.MainLightShadowScreen, true); } - -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - if (m_Material == null) - { - Debug.LogErrorFormat("{0}.Execute(): Missing material. ScreenSpaceShadows pass will not execute. Check for missing reference in the renderer resources.", GetType().Name); - return; - } - - InitPassData(ref m_PassData); - var cmd = renderingData.commandBuffer; - using (new ProfilingScope(cmd, profilingSampler)) - { - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, m_RenderTarget); - } - } -#endif } private class ScreenSpaceShadowsPostPass : ScriptableRenderPass { -#if URP_COMPATIBILITY_MODE - private static readonly RTHandle k_CurrentActive = RTHandles.Alloc(BuiltinRenderTextureType.CurrentActive); -#endif - internal ScreenSpaceShadowsPostPass() { profilingSampler = new ProfilingSampler("Set Screen Space Shadow Keywords"); } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(k_CurrentActive); - #pragma warning restore CS0618 - } -#endif - private static void ExecutePass(RasterCommandBuffer cmd, UniversalShadowData shadowData) { int cascadesCount = shadowData.mainLightShadowCascadesCount; @@ -305,20 +215,6 @@ private static void ExecutePass(RasterCommandBuffer cmd, UniversalShadowData sha cmd.SetKeyword(ShaderGlobalKeywords.MainLightShadowCascades, receiveShadowsCascades); } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cmd = renderingData.commandBuffer; - UniversalShadowData shadowData = renderingData.frameData.Get(); - - using (new ProfilingScope(cmd, profilingSampler)) - { - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), shadowData); - } - } -#endif - internal class PassData { internal UniversalShadowData shadowData; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs index 23b09f1c1fc..97f54362248 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs @@ -167,124 +167,6 @@ internal static void SetScaleBiasRt(RasterCommandBuffer cmd, in UniversalCameraD cmd.SetGlobalVector(Shader.PropertyToID("_ScaleBiasRt"), scaleBiasRt); } -#if URP_COMPATIBILITY_MODE - internal static void SetScaleBiasRt(RasterCommandBuffer cmd, in RenderingData renderingData) - { - var renderer = renderingData.cameraData.renderer; - - // SetRenderTarget has logic to flip projection matrix when rendering to render texture. Flip the uv to account for that case. - CameraData cameraData = renderingData.cameraData; - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - bool isCameraColorFinalTarget = (cameraData.cameraType == CameraType.Game && renderer.cameraColorTargetHandle.nameID == BuiltinRenderTextureType.CameraTarget && cameraData.camera.targetTexture == null); - #pragma warning restore CS0618 - - bool yflip = !isCameraColorFinalTarget; - float flipSign = yflip ? -1.0f : 1.0f; - - Vector4 scaleBiasRt = (flipSign < 0.0f) - ? new Vector4(flipSign, 1.0f, -1.0f, 1.0f) - : new Vector4(flipSign, 0.0f, 1.0f, 1.0f); - - cmd.SetGlobalVector(Shader.PropertyToID("_ScaleBiasRt"), scaleBiasRt); - } -#endif - - internal static void Blit(CommandBuffer cmd, - RTHandle source, - Rect viewport, - RTHandle destination, - RenderBufferLoadAction loadAction, - RenderBufferStoreAction storeAction, - ClearFlag clearFlag, - Color clearColor, - Material material, - int passIndex = 0) - { - Vector2 viewportScale = source.useScaling ? new Vector2(source.rtHandleProperties.rtHandleScale.x, source.rtHandleProperties.rtHandleScale.y) : Vector2.one; - CoreUtils.SetRenderTarget(cmd, destination, loadAction, storeAction, ClearFlag.None, Color.clear); - cmd.SetViewport(viewport); - Blitter.BlitTexture(cmd, source, viewportScale, material, passIndex); - } - - internal static void Blit(CommandBuffer cmd, - RTHandle source, - Rect viewport, - RTHandle destinationColor, - RenderBufferLoadAction colorLoadAction, - RenderBufferStoreAction colorStoreAction, - RTHandle destinationDepthStencil, - RenderBufferLoadAction depthStencilLoadAction, - RenderBufferStoreAction depthStencilStoreAction, - ClearFlag clearFlag, - Color clearColor, - Material material, - int passIndex = 0) - { - Vector2 viewportScale = source.useScaling ? new Vector2(source.rtHandleProperties.rtHandleScale.x, source.rtHandleProperties.rtHandleScale.y) : Vector2.one; - CoreUtils.SetRenderTarget(cmd, - destinationColor, colorLoadAction, colorStoreAction, - destinationDepthStencil, depthStencilLoadAction, depthStencilStoreAction, - clearFlag, clearColor); // implicit depth=1.0f stencil=0x0 - cmd.SetViewport(viewport); - Blitter.BlitTexture(cmd, source, viewportScale, material, passIndex); - } - - internal static void FinalBlit( - CommandBuffer cmd, - UniversalCameraData cameraData, - RTHandle source, - RTHandle destination, - RenderBufferLoadAction loadAction, - RenderBufferStoreAction storeAction, - Material material, int passIndex) - { - bool isRenderToBackBufferTarget = !cameraData.isSceneViewCamera; -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - isRenderToBackBufferTarget = new RenderTargetIdentifier(destination.nameID, 0, CubemapFace.Unknown, -1) == new RenderTargetIdentifier(cameraData.xr.renderTarget, 0, CubemapFace.Unknown, -1); -#endif - - Vector2 viewportScale = source.useScaling ? new Vector2(source.rtHandleProperties.rtHandleScale.x, source.rtHandleProperties.rtHandleScale.y) : Vector2.one; - - // We y-flip if - // 1) we are blitting from render texture to back buffer(UV starts at bottom) and - // 2) renderTexture starts UV at top - bool yflip = isRenderToBackBufferTarget && cameraData.targetTexture == null && SystemInfo.graphicsUVStartsAtTop; - Vector4 scaleBias = yflip ? new Vector4(viewportScale.x, -viewportScale.y, 0, viewportScale.y) : new Vector4(viewportScale.x, viewportScale.y, 0, 0); - CoreUtils.SetRenderTarget(cmd, destination, loadAction, storeAction, ClearFlag.None, Color.clear); - if (isRenderToBackBufferTarget) - cmd.SetViewport(cameraData.pixelRect); - - // cmd.Blit must be used in Scene View for wireframe mode to make the full screen draw with fill mode - // This branch of the if statement must be removed for render graph and the new command list with a novel way of using Blitter with fill mode - if (GL.wireframe && cameraData.isSceneViewCamera) - { - // This set render target is necessary so we change the LOAD state to DontCare. - cmd.SetRenderTarget(BuiltinRenderTextureType.CameraTarget, - loadAction, storeAction, // color - RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare); // depth - - // Necessary to disable the wireframe here, since Vulkan is handling the wireframe differently - // to handle the Terrain "Draw Instanced" scenario (Ono: case-1205332). - if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Vulkan) - { - cmd.SetWireframe(false); - cmd.Blit(source, destination); - cmd.SetWireframe(true); - } - else - { - cmd.Blit(source, destination); - } - } - else if (source.rt == null) - Blitter.BlitTexture(cmd, source.nameID, scaleBias, material, passIndex); // Obsolete usage of RTHandle aliasing a RenderTargetIdentifier - else - Blitter.BlitTexture(cmd, source, scaleBias, material, passIndex); - } - // This is used to render materials that contain built-in shader passes not compatible with URP. // It will render those legacy passes with error/pink shader. [Conditional("DEVELOPMENT_BUILD"), Conditional("UNITY_EDITOR")] @@ -303,23 +185,6 @@ internal static void CreateRendererParamsObjectsWithError(ref CullingResults cul param = new RendererListParams(cullResults, errorSettings, filterSettings); } - [Conditional("DEVELOPMENT_BUILD"), Conditional("UNITY_EDITOR")] - internal static void CreateRendererListObjectsWithError(ScriptableRenderContext context, ref CullingResults cullResults, Camera camera, FilteringSettings filterSettings, SortingCriteria sortFlags, ref RendererList rl) - { - // TODO: When importing project, AssetPreviewUpdater::CreatePreviewForAsset will be called multiple times. - // This might be in a point that some resources required for the pipeline are not finished importing yet. - // Proper fix is to add a fence on asset import. - if (errorMaterial == null) - { - rl = RendererList.nullRendererList; - return; - } - - RendererListParams param = new RendererListParams(); - CreateRendererParamsObjectsWithError(ref cullResults, camera, filterSettings, sortFlags, ref param); - rl = context.CreateRendererList(ref param); - } - // This is used to render materials that contain built-in shader passes not compatible with URP. // It will render those legacy passes with error/pink shader. [Conditional("DEVELOPMENT_BUILD"), Conditional("UNITY_EDITOR")] @@ -345,48 +210,6 @@ internal static void DrawRendererListObjectsWithError(RasterCommandBuffer cmd, r cmd.DrawRendererList(rl); } - // Create a RendererList using a RenderStateBlock override is quite common so we have this optimized utility function for it - internal static void CreateRendererListWithRenderStateBlock(ScriptableRenderContext context, ref CullingResults cullResults, DrawingSettings ds, FilteringSettings fs, RenderStateBlock rsb, ref RendererList rl) - { - RendererListParams param = new RendererListParams(); - unsafe - { - // Taking references to stack variables in the current function does not require any pinning (as long as you stay within the scope) - // so we can safely alias it as a native array - RenderStateBlock* rsbPtr = &rsb; - var stateBlocks = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray(rsbPtr, 1, Allocator.None); - - var shaderTag = ShaderTagId.none; - var tagValues = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray(&shaderTag, 1, Allocator.None); - - // Inside CreateRendererList (below), we pass the NativeArrays to C++ by calling GetUnsafeReadOnlyPtr - // This will check read access but NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray does not set up the SafetyHandle (by design) so create/add it here - // NOTE: we explicitly share the handle -#if ENABLE_UNITY_COLLECTIONS_CHECKS - var safetyHandle = AtomicSafetyHandle.Create(); - AtomicSafetyHandle.SetAllowReadOrWriteAccess(safetyHandle, true); - - NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref stateBlocks, safetyHandle); - NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref tagValues, safetyHandle); -#endif - - // Create & schedule the RL - param = new RendererListParams(cullResults, ds, fs) - { - tagValues = tagValues, - stateBlocks = stateBlocks - - }; - - rl = context.CreateRendererList(ref param); - - // we need to explicitly release the SafetyHandle -#if ENABLE_UNITY_COLLECTIONS_CHECKS - AtomicSafetyHandle.Release(safetyHandle); -#endif - } - } - static ShaderTagId[] s_ShaderTagValues = new ShaderTagId[1]; static RenderStateBlock[] s_RenderStateBlocks = new RenderStateBlock[1]; // Create a RendererList using a RenderStateBlock override is quite common so we have this optimized utility function for it @@ -442,153 +265,7 @@ public static bool SupportsGraphicsFormat(GraphicsFormat format, FormatUsage usa GraphicsFormatUsage graphicsFormatUsage = (GraphicsFormatUsage)(1 << (int)usage); return SystemInfo.IsFormatSupported(format, graphicsFormatUsage); } - - /// - /// Return the last colorBuffer index actually referring to an existing RenderTarget - /// - /// - /// - internal static int GetLastValidColorBufferIndex(RenderTargetIdentifier[] colorBuffers) - { - int i = colorBuffers.Length - 1; - for (; i >= 0; --i) - { - if (colorBuffers[i] != 0) - break; - } - return i; - } - - /// - /// Return the number of items in colorBuffers actually referring to an existing RenderTarget - /// - /// - /// - internal static uint GetValidColorBufferCount(RTHandle[] colorBuffers) - { - uint nonNullColorBuffers = 0; - if (colorBuffers != null) - { - foreach (var identifier in colorBuffers) - { - if (identifier != null && identifier.nameID != 0) - ++nonNullColorBuffers; - } - } - return nonNullColorBuffers; - } - - /// - /// Return true if colorBuffers is an actual MRT setup - /// - /// - /// - internal static bool IsMRT(RTHandle[] colorBuffers) - { - return GetValidColorBufferCount(colorBuffers) > 1; - } - - /// - /// Return true if value can be found in source (without recurring to Linq) - /// - /// - /// - /// - internal static bool Contains(RenderTargetIdentifier[] source, RenderTargetIdentifier value) - { - foreach (var identifier in source) - { - if (identifier == value) - return true; - } - return false; - } - - /// - /// Return the index where value was found source. Otherwise, return -1. (without recurring to Linq) - /// - /// - /// - /// - internal static int IndexOf(RTHandle[] source, RenderTargetIdentifier value) - { - for (int i = 0; i < source.Length; ++i) - { - if (source[i] == value) - return i; - } - return -1; - } - - /// - /// Return the index where value was found source. Otherwise, return -1. (without recurring to Linq) - /// - /// - /// - /// - internal static int IndexOf(RTHandle[] source, RTHandle value) => IndexOf(source, value.nameID); - - /// - /// Return the number of RenderTargetIdentifiers in "source" that are valid (not 0) and different from "value" (without recurring to Linq) - /// - /// - /// - /// - internal static uint CountDistinct(RTHandle[] source, RTHandle value) - { - uint count = 0; - for (int i = 0; i < source.Length; ++i) - { - if (source[i] != null && source[i].nameID != 0 && source[i].nameID != value.nameID) - ++count; - } - return count; - } - - /// - /// Return the index of last valid (i.e different from 0) RenderTargetIdentifiers in "source" (without recurring to Linq) - /// - /// - /// - internal static int LastValid(RTHandle[] source) - { - for (int i = source.Length - 1; i >= 0; --i) - { - if (source[i] != null && source[i].nameID != 0) - return i; - } - return -1; - } - - /// - /// Return true if ClearFlag a contains ClearFlag b - /// - /// - /// - /// - internal static bool Contains(ClearFlag a, ClearFlag b) - { - return (a & b) == b; - } - - /// - /// Return true if "left" and "right" are the same (without recurring to Linq) - /// - /// - /// - /// - internal static bool SequenceEqual(RTHandle[] left, RTHandle[] right) - { - if (left.Length != right.Length) - return false; - - for (int i = 0; i < left.Length; ++i) - if (left[i]?.nameID != right[i]?.nameID) - return false; - - return true; - } - + internal static bool MultisampleDepthResolveSupported() { // Temporarily disabling depth resolve a driver bug on OSX when using some AMD graphics cards. Temporarily disabling depth resolve on that platform @@ -647,36 +324,6 @@ internal static bool RTHandleNeedsReAlloc( handle.name != descriptor.name; } - /// - /// Returns the RenderTargetIdentifier of the current camera target. - /// - /// - /// - internal static RenderTargetIdentifier GetCameraTargetIdentifier(ref RenderingData renderingData) - { - // Note: We need to get the cameraData.targetTexture as this will get the targetTexture of the camera stack. - // Overlay cameras need to output to the target described in the base camera while doing camera stack. - ref CameraData cameraData = ref renderingData.cameraData; - - RenderTargetIdentifier cameraTarget = (cameraData.targetTexture != null) ? new RenderTargetIdentifier(cameraData.targetTexture) : BuiltinRenderTextureType.CameraTarget; -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - { - if (cameraData.xr.singlePassEnabled) - { - cameraTarget = cameraData.xr.renderTarget; - } - else - { - int depthSlice = cameraData.xr.GetTextureArraySlice(); - cameraTarget = new RenderTargetIdentifier(cameraData.xr.renderTarget, 0, CubemapFace.Unknown, depthSlice); - } - } -#endif - - return cameraTarget; - } - /// /// Re-allocate fixed-size RTHandle if it is not allocated or doesn't match the descriptor /// @@ -1019,7 +666,7 @@ internal static void AddStaleResourceToPoolOrRelease(TextureDesc desc, RTHandle /// Criteria to sort objects being rendered. /// /// - static public DrawingSettings CreateDrawingSettings(ShaderTagId shaderTagId, ref RenderingData renderingData, SortingCriteria sortingCriteria) + public static DrawingSettings CreateDrawingSettings(ShaderTagId shaderTagId, ref RenderingData renderingData, SortingCriteria sortingCriteria) { UniversalRenderingData universalRenderingData = renderingData.frameData.Get(); UniversalCameraData cameraData = renderingData.frameData.Get(); @@ -1038,7 +685,7 @@ static public DrawingSettings CreateDrawingSettings(ShaderTagId shaderTagId, ref /// Criteria to sort objects being rendered. /// /// - static public DrawingSettings CreateDrawingSettings(ShaderTagId shaderTagId, UniversalRenderingData renderingData, + public static DrawingSettings CreateDrawingSettings(ShaderTagId shaderTagId, UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData, SortingCriteria sortingCriteria) { Camera camera = cameraData.camera; @@ -1050,13 +697,9 @@ static public DrawingSettings CreateDrawingSettings(ShaderTagId shaderTagId, Uni enableDynamicBatching = renderingData.supportsDynamicBatching, // Disable instancing for preview cameras. This is consistent with the built-in forward renderer. Also fixes case 1127324. - enableInstancing = camera.cameraType == CameraType.Preview ? false : true, + enableInstancing = camera.cameraType != CameraType.Preview, // stencil-based LOD doesn't support native render pass for now. - lodCrossFadeStencilMask = -#if URP_COMPATIBILITY_MODE - !(GraphicsSettings.TryGetRenderPipelineSettings(out var renderGraphSettings) && renderGraphSettings.enableRenderCompatibilityMode) && -#endif - renderingData.stencilLodCrossFadeEnabled ? (int)UniversalRendererStencilRef.CrossFadeStencilRef_All : 0, + lodCrossFadeStencilMask = renderingData.stencilLodCrossFadeEnabled ? (int)UniversalRendererStencilRef.CrossFadeStencilRef_All : 0, }; return settings; } @@ -1069,7 +712,7 @@ static public DrawingSettings CreateDrawingSettings(ShaderTagId shaderTagId, Uni /// Criteria to sort objects being rendered. /// /// - static public DrawingSettings CreateDrawingSettings(List shaderTagIdList, + public static DrawingSettings CreateDrawingSettings(List shaderTagIdList, ref RenderingData renderingData, SortingCriteria sortingCriteria) { UniversalRenderingData universalRenderingData = renderingData.frameData.Get(); @@ -1088,7 +731,7 @@ static public DrawingSettings CreateDrawingSettings(List shaderTagI /// Criteria to sort objects being rendered. /// /// - static public DrawingSettings CreateDrawingSettings(List shaderTagIdList, + public static DrawingSettings CreateDrawingSettings(List shaderTagIdList, UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData, SortingCriteria sortingCriteria) { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs index 2620ecccb6a..07b6b65726d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs @@ -38,7 +38,7 @@ namespace UnityEngine.Rendering.Universal /// public abstract partial class ScriptableRenderer : IDisposable { - private static partial class Profiling + private static class Profiling { private const string k_Name = nameof(ScriptableRenderer); public static readonly ProfilingSampler setPerCameraShaderVariables = new ProfilingSampler($"{k_Name}.{nameof(SetPerCameraShaderVariables)}"); @@ -55,33 +55,6 @@ private static partial class Profiling internal static readonly ProfilingSampler endXRRendering = new ProfilingSampler($"End XR Rendering"); internal static readonly ProfilingSampler initRenderGraphFrame = new ProfilingSampler($"Initialize Frame"); internal static readonly ProfilingSampler setEditorTarget = new ProfilingSampler($"Set Editor Target"); - -#if URP_COMPATIBILITY_MODE - public static readonly ProfilingSampler setupLights = new ProfilingSampler($"{k_Name}.{nameof(SetupLights)}"); - public static readonly ProfilingSampler setupRenderPasses = new ProfilingSampler($"{k_Name}.{nameof(SetupRenderPasses)}"); - public static readonly ProfilingSampler internalStartRendering = new ProfilingSampler($"{k_Name}.{nameof(InternalStartRendering)}"); - - public static class RenderBlock - { - private const string k_Name = nameof(RenderPassBlock); - public static readonly ProfilingSampler beforeRendering = new ProfilingSampler($"{k_Name}.{nameof(RenderPassBlock.BeforeRendering)}"); - public static readonly ProfilingSampler mainRenderingOpaque = new ProfilingSampler($"{k_Name}.{nameof(RenderPassBlock.MainRenderingOpaque)}"); - public static readonly ProfilingSampler mainRenderingTransparent = new ProfilingSampler($"{k_Name}.{nameof(RenderPassBlock.MainRenderingTransparent)}"); - public static readonly ProfilingSampler afterRendering = new ProfilingSampler($"{k_Name}.{nameof(RenderPassBlock.AfterRendering)}"); - } - - public static class RenderPass - { - private const string k_Name = nameof(ScriptableRenderPass); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - public static readonly ProfilingSampler configure = new ProfilingSampler($"{k_Name}.{nameof(ScriptableRenderPass.Configure)}"); - #pragma warning restore CS0618 - - public static readonly ProfilingSampler setRenderPassAttachments = new ProfilingSampler($"{k_Name}.{nameof(ScriptableRenderer.SetRenderPassAttachments)}"); - } -#endif } /// @@ -146,18 +119,6 @@ protected internal virtual bool SupportsCameraNormals() return false; } -#if URP_COMPATIBILITY_MODE - /// - /// Override to provide a custom profiling name - /// - protected ProfilingSampler profilingExecute { get; set; } -#endif - - /// - /// Used to determine whether to release render targets used by the renderer when the renderer is no more active. - /// - internal bool hasReleasedRTs = true; - /// /// Configures the supported features for this renderer. When creating custom renderers /// for Universal Render Pipeline you can choose to opt-in or out for specific features. @@ -191,44 +152,6 @@ public class RenderingFeatures /// internal static ScriptableRenderer current = null; -#if URP_COMPATIBILITY_MODE - /// - /// Set camera matrices. This method will set UNITY_MATRIX_V, UNITY_MATRIX_P, UNITY_MATRIX_VP to the camera matrices. - /// Additionally this will also set unity_CameraProjection and unity_CameraProjection. - /// If setInverseMatrices is set to true this function will also set UNITY_MATRIX_I_V and UNITY_MATRIX_I_VP. - /// This function has no effect when rendering in stereo. When in stereo rendering you cannot override camera matrices. - /// If you need to set general purpose view and projection matrices call instead. - /// - /// CommandBuffer to submit data to GPU. - /// CameraData containing camera matrices information. - /// Set this to true if you also need to set inverse camera matrices. - public static void SetCameraMatrices(CommandBuffer cmd, ref CameraData cameraData, bool setInverseMatrices) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - SetCameraMatrices(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData.universalCameraData, setInverseMatrices, cameraData.IsCameraProjectionMatrixFlipped()); - #pragma warning restore CS0618 - } - - /// - /// Set camera matrices. This method will set UNITY_MATRIX_V, UNITY_MATRIX_P, UNITY_MATRIX_VP to camera matrices. - /// Additionally this will also set unity_CameraProjection and unity_CameraProjection. - /// If setInverseMatrices is set to true this function will also set UNITY_MATRIX_I_V and UNITY_MATRIX_I_VP. - /// This function has no effect when rendering in stereo. When in stereo rendering you cannot override camera matrices. - /// If you need to set general purpose view and projection matrices call instead. - /// - /// CommandBuffer to submit data to GPU. - /// CameraData containing camera matrices information. - /// Set this to true if you also need to set inverse camera matrices. - public static void SetCameraMatrices(CommandBuffer cmd, UniversalCameraData cameraData, bool setInverseMatrices) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - SetCameraMatrices(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData, setInverseMatrices, cameraData.IsCameraProjectionMatrixFlipped()); - #pragma warning restore CS0618 - } -#endif - internal static void SetCameraMatrices(RasterCommandBuffer cmd, UniversalCameraData cameraData, bool setInverseMatrices, bool isTargetFlipped) { #if ENABLE_VR && ENABLE_XR_MODULE @@ -274,22 +197,6 @@ internal static void SetCameraMatrices(RasterCommandBuffer cmd, UniversalCameraD // TODO: Add SetPerCameraClippingPlaneProperties here once we are sure it correctly behaves in overlay camera for some time } -#if URP_COMPATIBILITY_MODE - /// - /// Set camera and screen shader variables as described in https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html - /// - /// CommandBuffer to submit data to GPU. - /// CameraData containing camera matrices information. - /// Base type for the CommandBuffer - void SetPerCameraShaderVariables(RasterCommandBuffer cmd, UniversalCameraData cameraData) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - SetPerCameraShaderVariables(cmd, cameraData, new Vector2Int(cameraData.cameraTargetDescriptor.width, cameraData.cameraTargetDescriptor.height), cameraData.IsCameraProjectionMatrixFlipped()); - #pragma warning restore CS0618 - } -#endif - void SetPerCameraShaderVariables(RasterCommandBuffer cmd, UniversalCameraData cameraData, Vector2Int cameraTargetSizeCopy, bool isTargetFlipped) { using var profScope = new ProfilingScope(Profiling.setPerCameraShaderVariables); @@ -451,16 +358,6 @@ private static void CalculateBillboardProperties( cameraXZAngle += 2 * Mathf.PI; } -#if URP_COMPATIBILITY_MODE - private void SetPerCameraClippingPlaneProperties(RasterCommandBuffer cmd, UniversalCameraData cameraData) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - SetPerCameraClippingPlaneProperties(cmd, in cameraData, cameraData.IsCameraProjectionMatrixFlipped()); - #pragma warning restore CS0618 - } -#endif - private void SetPerCameraClippingPlaneProperties(RasterCommandBuffer cmd, in UniversalCameraData cameraData, bool isTargetFlipped) { Matrix4x4 projectionMatrix = cameraData.GetGPUProjectionMatrix(isTargetFlipped); @@ -516,82 +413,6 @@ static void SetShaderTimeValues(IBaseCommandBuffer cmd, float time, float deltaT [Obsolete("Use cameraColorTargetHandle. #from(2022.1) #breakingFrom(2023.2)", true)] public RenderTargetIdentifier cameraColorTarget => throw new NotSupportedException("cameraColorTarget has been deprecated. Use cameraColorTargetHandle instead"); -#if URP_COMPATIBILITY_MODE - /// - /// Returns the camera color target for this renderer. - /// It's only valid to call cameraColorTargetHandle in the scope of ScriptableRenderPass. - /// . - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public RTHandle cameraColorTargetHandle - { - get - { - if (!m_IsPipelineExecuting) - { - Debug.LogError("You can only call cameraColorTargetHandle inside the scope of a ScriptableRenderPass. Otherwise the pipeline camera target texture might have not been created or might have already been disposed."); - return null; - } - - return m_CameraColorTarget; - } - } - - - /// - /// Returns the frontbuffer color target. Returns null if not implemented by the renderer. - /// It's only valid to call GetCameraColorFrontBuffer in the scope of ScriptableRenderPass. - /// - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - virtual internal RTHandle GetCameraColorFrontBuffer(CommandBuffer cmd) - { - return null; - } - - - /// - /// Returns the backbuffer color target. Returns null if not implemented by the renderer. - /// It's only valid to call GetCameraColorBackBuffer in the scope of ScriptableRenderPass. - /// - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - virtual internal RTHandle GetCameraColorBackBuffer(CommandBuffer cmd) - { - return null; - } - - /// - /// Returns the camera depth target for this renderer. - /// It's only valid to call cameraDepthTarget in the scope of ScriptableRenderPass. - /// . - /// - [Obsolete("Use cameraDepthTargetHandle. #from(2022.1) #breakingFrom(2023.1)", true)] - public RenderTargetIdentifier cameraDepthTarget => throw new NotSupportedException("cameraDepthTarget has been deprecated. Use cameraDepthTargetHandle instead"); - - /// - /// Returns the camera depth target for this renderer. - /// It's only valid to call cameraDepthTargetHandle in the scope of ScriptableRenderPass. - /// . - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public RTHandle cameraDepthTargetHandle - { - get - { - if (!m_IsPipelineExecuting) - { - Debug.LogError("You can only call cameraDepthTargetHandle inside the scope of a ScriptableRenderPass. Otherwise the pipeline camera target texture might have not been created or might have already been disposed."); - return null; - } - - return m_CameraDepthTarget; - } - } -#endif - /// /// Returns a list of renderer features added to this renderer. /// @@ -664,12 +485,6 @@ static class RenderPassBlock // Trying to access the camera target before or after might be that the pipeline texture have already been disposed. bool m_IsPipelineExecuting = false; -#if URP_COMPATIBILITY_MODE - // Temporary variable to disable custom passes using render pass ( due to it potentially breaking projects with custom render features ) - // To enable it - override SupportsNativeRenderPass method in the feature and return true - internal bool disableNativeRenderPassInFeatures = false; -#endif - internal bool useRenderPassEnabled = false; // Used to cache nameID of m_ActiveColorAttachments for CoreUtils without allocating arrays at each call static RenderTargetIdentifier[] m_ActiveColorAttachmentIDs = new RenderTargetIdentifier[8]; @@ -740,10 +555,6 @@ public ScriptableRenderer(ScriptableRendererData data) #if DEVELOPMENT_BUILD || UNITY_EDITOR DebugHandler = new DebugHandler(); #endif -#if URP_COMPATIBILITY_MODE - profilingExecute = new ProfilingSampler($"{nameof(ScriptableRenderer)}.{nameof(ScriptableRenderer.Execute)}: {data.name}"); -#endif - foreach (var feature in data.rendererFeatures) { if (feature == null) @@ -752,10 +563,6 @@ public ScriptableRenderer(ScriptableRendererData data) feature.Create(); m_RendererFeatures.Add(feature); } - -#if URP_COMPATIBILITY_MODE - ResetNativeRenderPassFrameData(); -#endif useRenderPassEnabled = data.useNativeRenderPass; Clear(CameraRenderType.Base); m_ActiveRenderPassQueue.Clear(); @@ -793,7 +600,6 @@ public void Dispose() } Dispose(true); - hasReleasedRTs = true; GC.SuppressFinalize(this); } @@ -812,68 +618,6 @@ internal virtual void ReleaseRenderTargets() { } -#if URP_COMPATIBILITY_MODE - /// - /// Configures the camera target. - /// - /// Camera color target. Pass BuiltinRenderTextureType.CameraTarget if rendering to backbuffer. - /// Camera depth target. Pass BuiltinRenderTextureType.CameraTarget if color has depth or rendering to backbuffer. - [Obsolete("Use RTHandles for colorTarget and depthTarget. #from(2022.1) #breakingFrom(2023.1)", true)] - public void ConfigureCameraTarget(RenderTargetIdentifier colorTarget, RenderTargetIdentifier depthTarget) - { - throw new NotSupportedException("ConfigureCameraTarget with RenderTargetIdentifier has been deprecated. Use it with RTHandles instead"); - } - - /// - /// Configures the camera target. - /// - /// Camera color target. Pass k_CameraTarget if rendering to backbuffer. - /// Camera depth target. Pass k_CameraTarget if color has depth or rendering to backbuffer. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public void ConfigureCameraTarget(RTHandle colorTarget, RTHandle depthTarget) - { - m_CameraColorTarget = colorTarget; - m_CameraDepthTarget = depthTarget; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal void ConfigureCameraTarget(RTHandle colorTarget, RTHandle depthTarget, RTHandle resolveTarget) - { - m_CameraColorTarget = colorTarget; - m_CameraDepthTarget = depthTarget; - m_CameraResolveTarget = resolveTarget; - } - - // This should be removed when early camera color target assignment is removed. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal void ConfigureCameraColorTarget(RTHandle colorTarget) - { - m_CameraColorTarget = colorTarget; - } - - /// - /// Configures the render passes that will execute for this renderer. - /// This method is called per-camera every frame. - /// - /// Use this render context to issue any draw commands during execution. - /// Current render state information. - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public virtual void Setup(ScriptableRenderContext context, ref RenderingData renderingData) { } - - /// - /// Override this method to implement the lighting setup for the renderer. You can use this to - /// compute and upload light CBUFFER for example. - /// - /// Use this render context to issue any draw commands during execution. - /// Current render state information. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public virtual void SetupLights(ScriptableRenderContext context, ref RenderingData renderingData) - { - } -#endif - /// /// Override this method to configure the culling parameters for the renderer. You can use this to configure if /// lights should be culled per-object or the maximum shadow distance for example. @@ -1329,217 +1073,7 @@ internal void RecordCustomRenderGraphPasses(RenderGraph renderGraph, RenderPassE { RecordCustomRenderGraphPasses(renderGraph, injectionPoint, injectionPoint); } - -#if URP_COMPATIBILITY_MODE - internal void SetPerCameraProperties(ScriptableRenderContext context, UniversalCameraData cameraData, Camera camera, - CommandBuffer cmd) - { - if (cameraData.renderType == CameraRenderType.Base) - { - context.SetupCameraProperties(camera); - SetPerCameraShaderVariables(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData); - } - else - { - // Set new properties - SetPerCameraShaderVariables(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData); - SetPerCameraClippingPlaneProperties(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData); - SetPerCameraBillboardProperties(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData); - } - } - - /// - /// Execute the enqueued render passes. This automatically handles editor and stereo rendering. - /// - /// Use this render context to issue any draw commands during execution. - /// Current render state information. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - 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.sceneOverrideMode == DebugSceneOverrideMode.None; - hasReleasedRTs = false; - m_IsPipelineExecuting = true; - UniversalCameraData cameraData = renderingData.frameData.Get(); - Camera camera = cameraData.camera; - - // Let renderer features call their own setup functions when targets are valid - if (rendererFeatures.Count != 0 && !renderingData.cameraData.isPreviewCamera) - SetupRenderPasses(in renderingData); - - CommandBuffer cmd = renderingData.commandBuffer; - - // TODO: move skybox code from C++ to URP in order to remove the call to context.Submit() inside DrawSkyboxPass - // Until then, we can't use nested profiling scopes with XR multipass - CommandBuffer cmdScope = renderingData.cameraData.xr.enabled ? null : cmd; - - using (new ProfilingScope(cmdScope, profilingExecute)) - { - InternalStartRendering(context, ref renderingData); - - // Cache the time for after the call to `SetupCameraProperties` and set the time variables in shader - // For now we set the time variables per camera, as we plan to remove `SetupCameraProperties`. - // Setting the time per frame would take API changes to pass the variable to each camera render. - // Once `SetupCameraProperties` is gone, the variable should be set higher in the call-stack. -#if UNITY_EDITOR - float time = Application.isPlaying ? Time.time : Time.realtimeSinceStartup; -#else - float time = Time.time; -#endif - float deltaTime = Time.deltaTime; - float smoothDeltaTime = Time.smoothDeltaTime; - - // Initialize Camera Render State - ClearRenderingState(CommandBufferHelpers.GetRasterCommandBuffer(cmd)); - SetShaderTimeValues(CommandBufferHelpers.GetRasterCommandBuffer(cmd), time, deltaTime, smoothDeltaTime); - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - using (new ProfilingScope(Profiling.sortRenderPasses)) - { - // Sort the render pass queue - SortStable(m_ActiveRenderPassQueue); - - } - - using (new ProfilingScope(Profiling.RenderPass.configure)) - { - foreach (var pass in activeRenderPassQueue) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - pass.Configure(cmd, cameraData.cameraTargetDescriptor); - #pragma warning restore CS0618 - } - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } - - SetupNativeRenderPassFrameData(cameraData, useRenderPassEnabled); - - using var renderBlocks = new RenderBlocks(m_ActiveRenderPassQueue); - - using (new ProfilingScope(Profiling.setupLights)) - { - SetupLights(context, ref renderingData); - } - -#if VISUAL_EFFECT_GRAPH_0_0_1_OR_NEWER - using (new ProfilingScope(Profiling.setupCamera)) - { - //Camera variables need to be setup for the VFXManager.ProcessCameraCommand to work properly. - //VFXManager.ProcessCameraCommand needs to be called before any rendering (incl. shadows) - SetPerCameraProperties(context, cameraData, camera, cmd); - - VFX.VFXCameraXRSettings cameraXRSettings; - cameraXRSettings.viewTotal = cameraData.xr.enabled ? 2u : 1u; - cameraXRSettings.viewCount = cameraData.xr.enabled ? (uint)cameraData.xr.viewCount : 1u; - cameraXRSettings.viewOffset = (uint)cameraData.xr.multipassId; - - if (cameraData.xr.enabled) - cameraData.xr.StartSinglePass(cmd); - - VFX.VFXManager.ProcessCameraCommand(camera, cmd, cameraXRSettings, renderingData.cullResults); - - if (cameraData.xr.enabled) - cameraData.xr.StopSinglePass(cmd); - } -#endif - - // Before Render Block. This render blocks always execute in mono rendering. - // Camera is not setup. - // Used to render input textures like shadowmaps. - if (renderBlocks.GetLength(RenderPassBlock.BeforeRendering) > 0) - { - // TODO: Separate command buffers per pass break the profiling scope order/hierarchy. - // If a single buffer is used and passed as a param to passes, - // put all of the "block" scopes back into the command buffer. (null -> cmd) - using var profScope = new ProfilingScope(Profiling.RenderBlock.beforeRendering); - ExecuteBlock(RenderPassBlock.BeforeRendering, in renderBlocks, context, ref renderingData); - } - - using (new ProfilingScope(Profiling.setupCamera)) - { - // This is still required because of the following reasons: - // - Camera billboard properties. - // - Camera frustum planes: unity_CameraWorldClipPlanes[6] - // - _ProjectionParams.x logic is deep inside GfxDevice - // NOTE: The only reason we have to call this here and not at the beginning (before shadows) - // is because this need to be called for each eye in multi pass VR. - // The side effect is that this will override some shader properties we already setup and we will have to - // reset them. - SetPerCameraProperties(context, cameraData, camera, cmd); - - // Reset shader time variables as they were overridden in SetupCameraProperties. If we don't do it we might have a mismatch between shadows and main rendering - SetShaderTimeValues(CommandBufferHelpers.GetRasterCommandBuffer(cmd), time, deltaTime, smoothDeltaTime); - } - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - BeginXRRendering(cmd, context, ref renderingData.cameraData); - - // In the opaque and transparent blocks the main rendering executes. - - // Opaque blocks... - if (renderBlocks.GetLength(RenderPassBlock.MainRenderingOpaque) > 0) - { - // TODO: Separate command buffers per pass break the profiling scope order/hierarchy. - // If a single buffer is used (passed as a param) for passes, - // put all of the "block" scopes back into the command buffer. (i.e. null -> cmd) - using var profScope = new ProfilingScope(Profiling.RenderBlock.mainRenderingOpaque); - ExecuteBlock(RenderPassBlock.MainRenderingOpaque, in renderBlocks, context, ref renderingData); - } - - // Transparent blocks... - if (renderBlocks.GetLength(RenderPassBlock.MainRenderingTransparent) > 0) - { - using var profScope = new ProfilingScope(Profiling.RenderBlock.mainRenderingTransparent); - ExecuteBlock(RenderPassBlock.MainRenderingTransparent, in renderBlocks, context, ref renderingData); - } - -#if ENABLE_VR && ENABLE_XR_MODULE - // Late latching is not supported after this point in the frame - if (cameraData.xr.enabled) - cameraData.xrUniversal.canMarkLateLatch = false; -#endif - - // Draw Gizmos... - if (drawGizmos) - { - DrawGizmos(context, camera, GizmoSubset.PreImageEffects, ref renderingData); - } - - // In this block after rendering drawing happens, e.g, post processing, video player capture. - if (renderBlocks.GetLength(RenderPassBlock.AfterRendering) > 0) - { - using var profScope = new ProfilingScope(Profiling.RenderBlock.afterRendering); - ExecuteBlock(RenderPassBlock.AfterRendering, in renderBlocks, context, ref renderingData); - } - - EndXRRendering(cmd, context, ref renderingData.cameraData); - - DrawWireOverlay(context, camera); - - if (drawGizmos) - { - DrawGizmos(context, camera, GizmoSubset.PostImageEffects, ref renderingData); - } - - InternalFinishRenderingExecute(context, cmd, cameraData.resolveFinalTarget); - - for (int i = 0; i < m_ActiveRenderPassQueue.Count; ++i) - { - m_ActiveRenderPassQueue[i].m_ColorAttachmentIndices.Dispose(); - m_ActiveRenderPassQueue[i].m_InputAttachmentIndices.Dispose(); - } - } - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } -#endif - + /// /// Enqueues a render pass for execution. /// @@ -1547,11 +1081,6 @@ public void Execute(ScriptableRenderContext context, ref RenderingData rendering public void EnqueuePass(ScriptableRenderPass pass) { m_ActiveRenderPassQueue.Add(pass); - -#if URP_COMPATIBILITY_MODE - if (disableNativeRenderPassInFeatures) - pass.useNativeRenderPass = false; -#endif } /// @@ -1659,15 +1188,7 @@ internal void AddRenderPasses(ref RenderingData renderingData) continue; } -#if URP_COMPATIBILITY_MODE - if (!rendererFeatures[i].SupportsNativeRenderPass()) - disableNativeRenderPassInFeatures = true; -#endif - rendererFeatures[i].AddRenderPasses(this, ref renderingData); -#if URP_COMPATIBILITY_MODE - disableNativeRenderPassInFeatures = false; -#endif } // Remove any null render pass that might have been added by user by mistake @@ -1682,28 +1203,7 @@ internal void AddRenderPasses(ref RenderingData renderingData) if (count > 0 && m_StoreActionsOptimizationSetting == StoreActionsOptimization.Auto) m_UseOptimizedStoreActions = false; } - -#if URP_COMPATIBILITY_MODE - /// - /// Calls Setup for each feature added to this renderer. - /// - /// - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - protected void SetupRenderPasses(in RenderingData renderingData) - { - using var profScope = new ProfilingScope(Profiling.setupRenderPasses); - - // Add render passes from custom renderer features - for (int i = 0; i < rendererFeatures.Count; ++i) - { - if (!rendererFeatures[i].isActive) - continue; - - rendererFeatures[i].SetupRenderPasses(this, in renderingData); - } - } -#endif + static void ClearRenderingState(IBaseCommandBuffer cmd) { using var profScope = new ProfilingScope(Profiling.clearRenderingState); @@ -1748,83 +1248,6 @@ internal void Clear(CameraRenderType cameraType) m_CameraDepthTarget = null; } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - void ExecuteBlock(int blockIndex, in RenderBlocks renderBlocks, - ScriptableRenderContext context, ref RenderingData renderingData, bool submit = false) - { - UniversalCameraData cameraData = renderingData.frameData.Get(); - - foreach (int currIndex in renderBlocks.GetRange(blockIndex)) - { - var renderPass = m_ActiveRenderPassQueue[currIndex]; - ExecuteRenderPass(context, renderPass, cameraData, ref renderingData); - } - - if (submit) - context.Submit(); - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - private bool IsRenderPassEnabled(ScriptableRenderPass renderPass) - { - return renderPass.useNativeRenderPass && useRenderPassEnabled; - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - void ExecuteRenderPass(ScriptableRenderContext context, ScriptableRenderPass renderPass, UniversalCameraData cameraData, ref RenderingData renderingData) - { - // TODO: Separate command buffers per pass break the profiling scope order/hierarchy. - // If a single buffer is used (passed as a param) and passed to renderPass.Execute, put the scope into command buffer (i.e. null -> cmd) - using var profScope = new ProfilingScope(renderPass.profilingSampler); - - - var cmd = renderingData.commandBuffer; - - // Selectively enable foveated rendering - if (cameraData.xr.supportsFoveatedRendering) - { - if ((renderPass.renderPassEvent >= RenderPassEvent.BeforeRenderingPrePasses && renderPass.renderPassEvent < RenderPassEvent.BeforeRenderingPostProcessing) - || (renderPass.renderPassEvent > RenderPassEvent.AfterRendering && XRSystem.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.FoveationImage))) - { - cmd.SetFoveatedRenderingMode(FoveatedRenderingMode.Enabled); - } - } - - // Track CPU only as GPU markers for this scope were "too noisy". - using (new ProfilingScope(Profiling.RenderPass.setRenderPassAttachments)) - SetRenderPassAttachments(cmd, renderPass, cameraData); - - // Also, we execute the commands recorded at this point to ensure SetRenderTarget is called before RenderPass.Execute - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - if (IsRenderPassEnabled(renderPass) && cameraData.isRenderPassSupportedCamera) - ExecuteNativeRenderPass(context, renderPass, cameraData, ref renderingData); // cmdBuffer is executed inside - else - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - renderPass.Execute(context, ref renderingData); - #pragma warning restore CS0618 - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } - - if (cameraData.xr.enabled) - { - if (cameraData.xr.supportsFoveatedRendering) - cmd.SetFoveatedRenderingMode(FoveatedRenderingMode.Disabled); - - // Inform the late latching system for XR once we're done with a render pass - XRSystemUniversal.UnmarkShaderProperties(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData.xrUniversal); - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } - } -#endif - // Scene filtering is enabled when in prefab editing mode internal bool IsSceneFilteringEnabled(Camera camera) { @@ -1835,478 +1258,6 @@ internal bool IsSceneFilteringEnabled(Camera camera) return false; } -#if URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - void SetRenderPassAttachments(CommandBuffer cmd, ScriptableRenderPass renderPass, UniversalCameraData cameraData) - { - Camera camera = cameraData.camera; - ClearFlag cameraClearFlag = GetCameraClearFlag(cameraData); - - // Invalid configuration - use current attachment setup - // Note: we only check color buffers. This is only technically correct because for shadowmaps and depth only passes - // we bind depth as color and Unity handles it underneath. so we never have a situation that all color buffers are null and depth is bound. - uint validColorBuffersCount = RenderingUtils.GetValidColorBufferCount(renderPass.colorAttachmentHandles); - if (validColorBuffersCount == 0) - return; - - // We use a different code path for MRT since it calls a different version of API SetRenderTarget - if (RenderingUtils.IsMRT(renderPass.colorAttachmentHandles)) - { - // In the MRT path we assume that all color attachments are REAL color attachments, - // and that the depth attachment is a REAL depth attachment too. - - // Determine what attachments need to be cleared. ---------------- - - bool needCustomCameraColorClear = false; - bool needCustomCameraDepthClear = false; - - int cameraColorTargetIndex = RenderingUtils.IndexOf(renderPass.colorAttachmentHandles, m_CameraColorTarget); - if (cameraColorTargetIndex != -1 && (m_FirstTimeCameraColorTargetIsBound)) - { - m_FirstTimeCameraColorTargetIsBound = false; // register that we did clear the camera target the first time it was bound - - // Overlay cameras composite on top of previous ones. They don't clear. - // MTT: Commented due to not implemented yet - // if (renderingData.cameraData.renderType == CameraRenderType.Overlay) - // clearFlag = ClearFlag.None; - - // We need to specifically clear the camera color target. - // But there is still a chance we don't need to issue individual clear() on each render-targets if they all have the same clear parameters. - needCustomCameraColorClear = (cameraClearFlag & ClearFlag.Color) != (renderPass.clearFlag & ClearFlag.Color) - || cameraData.backgroundColor != renderPass.clearColor; - } - - // Note: if we have to give up the assumption that no depthTarget can be included in the MRT colorAttachments, we might need something like this: - // int cameraTargetDepthIndex = IndexOf(renderPass.colorAttachments, m_CameraDepthTarget); - // if( !renderTargetAlreadySet && cameraTargetDepthIndex != -1 && m_FirstTimeCameraDepthTargetIsBound) - // { ... - // } - var depthTargetID = m_CameraDepthTarget.nameID; -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - depthTargetID = new RenderTargetIdentifier(depthTargetID, 0, CubemapFace.Unknown, -1); -#endif - if (new RenderTargetIdentifier(renderPass.depthAttachmentHandle.nameID, 0) == new RenderTargetIdentifier(depthTargetID, 0) // Strip the depthSlice - && m_FirstTimeCameraDepthTargetIsBound) - { - m_FirstTimeCameraDepthTargetIsBound = false; - needCustomCameraDepthClear = (cameraClearFlag & ClearFlag.DepthStencil) != (renderPass.clearFlag & ClearFlag.DepthStencil); - } - - // Perform all clear operations needed. ---------------- - // We try to minimize calls to SetRenderTarget(). - - // We get here only if cameraColorTarget needs to be handled separately from the rest of the color attachments. - if (needCustomCameraColorClear) - { - // Clear camera color render-target separately from the rest of the render-targets. - - if ((cameraClearFlag & ClearFlag.Color) != 0 && (!IsRenderPassEnabled(renderPass) || !cameraData.isRenderPassSupportedCamera)) - SetRenderTarget(cmd, renderPass.colorAttachmentHandles[cameraColorTargetIndex], renderPass.depthAttachmentHandle, ClearFlag.Color, cameraData.backgroundColor); - - if ((renderPass.clearFlag & ClearFlag.Color) != 0) - { - uint otherTargetsCount = RenderingUtils.CountDistinct(renderPass.colorAttachmentHandles, m_CameraColorTarget); - var nonCameraAttachments = m_TrimmedColorAttachmentCopies[otherTargetsCount]; - int writeIndex = 0; - for (int readIndex = 0; readIndex < renderPass.colorAttachmentHandles.Length; ++readIndex) - { - if (renderPass.colorAttachmentHandles[readIndex] != null && - renderPass.colorAttachmentHandles[readIndex].nameID != 0 && - renderPass.colorAttachmentHandles[readIndex].nameID != m_CameraColorTarget.nameID) - { - nonCameraAttachments[writeIndex] = renderPass.colorAttachmentHandles[readIndex]; - ++writeIndex; - } - } - var nonCameraAttachmentIDs = m_TrimmedColorAttachmentCopyIDs[otherTargetsCount]; - for (int i = 0; i < otherTargetsCount; ++i) - nonCameraAttachmentIDs[i] = nonCameraAttachments[i].nameID; - - if (writeIndex != otherTargetsCount) - Debug.LogError("writeIndex and otherTargetsCount values differed. writeIndex:" + writeIndex + " otherTargetsCount:" + otherTargetsCount); - if (!IsRenderPassEnabled(renderPass) || !cameraData.isRenderPassSupportedCamera) - SetRenderTarget(cmd, nonCameraAttachments, nonCameraAttachmentIDs, m_CameraDepthTarget, ClearFlag.Color, renderPass.clearColor); - } - } - - // Bind all attachments, clear color only if there was no custom behaviour for cameraColorTarget, clear depth as needed. - ClearFlag finalClearFlag = ClearFlag.None; - finalClearFlag |= needCustomCameraDepthClear ? (cameraClearFlag & ClearFlag.DepthStencil) : (renderPass.clearFlag & ClearFlag.DepthStencil); - finalClearFlag |= needCustomCameraColorClear ? (IsRenderPassEnabled(renderPass) ? (cameraClearFlag & ClearFlag.Color) : 0) : (renderPass.clearFlag & ClearFlag.Color); - - if (IsRenderPassEnabled(renderPass) && cameraData.isRenderPassSupportedCamera) - SetNativeRenderPassMRTAttachmentList(renderPass, cameraData, needCustomCameraColorClear, finalClearFlag); - - // Only setup render target if current render pass attachments are different from the active ones. - if (!RenderingUtils.SequenceEqual(renderPass.colorAttachmentHandles, m_ActiveColorAttachments) - || renderPass.depthAttachmentHandle.nameID != m_ActiveDepthAttachment - || finalClearFlag != ClearFlag.None) - { - int lastValidRTindex = RenderingUtils.LastValid(renderPass.colorAttachmentHandles); - if (lastValidRTindex >= 0) - { - int rtCount = lastValidRTindex + 1; - var trimmedAttachments = m_TrimmedColorAttachmentCopies[rtCount]; - for (int i = 0; i < rtCount; ++i) - trimmedAttachments[i] = renderPass.colorAttachmentHandles[i]; - var trimmedAttachmentIDs = m_TrimmedColorAttachmentCopyIDs[rtCount]; - for (int i = 0; i < rtCount; ++i) - trimmedAttachmentIDs[i] = trimmedAttachments[i].nameID; - - if (!IsRenderPassEnabled(renderPass) || !cameraData.isRenderPassSupportedCamera) - { - var depthAttachment = m_CameraDepthTarget; - - if (renderPass.overrideCameraTarget) - depthAttachment = renderPass.depthAttachmentHandle; - else - m_FirstTimeCameraDepthTargetIsBound = false; - - // Only one RTHandle is necessary to set the viewport in dynamic scaling, use depth - SetRenderTarget(cmd, trimmedAttachments, trimmedAttachmentIDs, depthAttachment, finalClearFlag, renderPass.clearColor); - } - -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - { - // SetRenderTarget might alter the internal device state(winding order). - // Non-stereo buffer is already updated internally when switching render target. We update stereo buffers here to keep the consistency. - int xrTargetIndex = RenderingUtils.IndexOf(renderPass.colorAttachmentHandles, cameraData.xr.renderTarget); - bool renderIntoTexture = xrTargetIndex == -1; - cameraData.PushBuiltinShaderConstantsXR(CommandBufferHelpers.GetRasterCommandBuffer(cmd), renderIntoTexture); - XRSystemUniversal.MarkShaderProperties(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData.xrUniversal, renderIntoTexture); - } -#endif - } - } - } - else - { - // Currently in non-MRT case, color attachment can actually be a depth attachment. - - var passColorAttachment = renderPass.colorAttachmentHandle; - var passDepthAttachment = renderPass.depthAttachmentHandle; - - // When render pass doesn't call ConfigureTarget we assume it's expected to render to camera target - // which might be backbuffer or the framebuffer render textures. - - if (!renderPass.overrideCameraTarget) - { - // Default render pass attachment for passes before main rendering is current active - // early return so we don't change current render target setup. - if (renderPass.renderPassEvent < RenderPassEvent.BeforeRenderingPrePasses) - return; - - // Otherwise default is the pipeline camera target. - passColorAttachment = m_CameraColorTarget; - passDepthAttachment = m_CameraDepthTarget; - } - - ClearFlag finalClearFlag = ClearFlag.None; - Color finalClearColor; - - if (passColorAttachment.nameID == m_CameraColorTarget.nameID && m_FirstTimeCameraColorTargetIsBound) - { - m_FirstTimeCameraColorTargetIsBound = false; // register that we did clear the camera target the first time it was bound - - finalClearFlag |= (cameraClearFlag & ClearFlag.Color); - - // on platforms that support Load and Store actions having the clear flag means that the action will be DontCare, which is something we want when the color target is bound the first time - // (passColorAttachment.nameID != BuiltinRenderTextureType.CameraTarget) check below ensures camera UI's clearFlag is respected when targeting built-in backbuffer. - if (SystemInfo.usesLoadStoreActions && new RenderTargetIdentifier(passColorAttachment.nameID, 0, depthSlice: 0) != BuiltinRenderTextureType.CameraTarget) - finalClearFlag |= renderPass.clearFlag; - - finalClearColor = cameraData.backgroundColor; - - if (m_FirstTimeCameraDepthTargetIsBound) - { - // m_CameraColorTarget can be an opaque pointer to a RenderTexture with depth-surface. - // We cannot infer this information here, so we must assume both camera color and depth are first-time bound here (this is the legacy behaviour). - m_FirstTimeCameraDepthTargetIsBound = false; - finalClearFlag |= (cameraClearFlag & ClearFlag.DepthStencil); - } - } - else - { - finalClearFlag |= (renderPass.clearFlag & ClearFlag.Color); - finalClearColor = renderPass.clearColor; - } - - // Condition (m_CameraDepthTarget!=BuiltinRenderTextureType.CameraTarget) below prevents m_FirstTimeCameraDepthTargetIsBound flag from being reset during non-camera passes (such as Color Grading LUT). This ensures that in those cases, cameraDepth will actually be cleared during the later camera pass. - if (new RenderTargetIdentifier(m_CameraDepthTarget.nameID, 0, depthSlice: 0) != BuiltinRenderTextureType.CameraTarget && (passDepthAttachment.nameID == m_CameraDepthTarget.nameID || passColorAttachment.nameID == m_CameraDepthTarget.nameID) && m_FirstTimeCameraDepthTargetIsBound) - { - m_FirstTimeCameraDepthTargetIsBound = false; - - finalClearFlag |= (cameraClearFlag & ClearFlag.DepthStencil); - - // finalClearFlag |= (cameraClearFlag & ClearFlag.Color); // <- m_CameraDepthTarget is never a color-surface, so no need to add this here. - } - else - finalClearFlag |= (renderPass.clearFlag & ClearFlag.DepthStencil); - - // If scene filtering is enabled (prefab edit mode), the filtering is implemented compositing some builtin ImageEffect passes. - // For the composition to work, we need to clear the color buffer alpha to 0 - // How filtering works: - // - SRP frame is fully rendered as background - // - builtin ImageEffect pass grey-out of the full scene previously rendered - // - SRP frame rendering only the objects belonging to the prefab being edited (with clearColor.a = 0) - // - builtin ImageEffect pass compositing the two previous passes - // TODO: We should implement filtering fully in SRP to remove builtin dependencies - if (IsSceneFilteringEnabled(camera)) - { - finalClearColor.a = 0; - finalClearFlag &= ~ClearFlag.Depth; - } - - // If the debug-handler needs to clear the screen, update "finalClearColor" accordingly... - if ((DebugHandler != null) && DebugHandler.IsActiveForCamera(cameraData.isPreviewCamera)) - { - DebugHandler.TryGetScreenClearColor(ref finalClearColor); - } - // Disabling Native RenderPass if not using RTHandles as we will be relying on info inside handles object - if (IsRenderPassEnabled(renderPass) && cameraData.isRenderPassSupportedCamera) - { - SetNativeRenderPassAttachmentList(renderPass, cameraData, passColorAttachment, passDepthAttachment, finalClearFlag, finalClearColor); - } - else - { - // As alternative we would need a way to check if rts are not going to be used as shader resource - bool colorAttachmentChanged = false; - - // Special handling for the first attachment to support `renderPass.overrideCameraTarget`. - if (passColorAttachment.nameID != m_ActiveColorAttachments[0]) - colorAttachmentChanged = true; - // Check the rest of attachments (1-8) - for (int i = 1; i < m_ActiveColorAttachments.Length; i++) - { - if (renderPass.colorAttachmentHandles[i] != m_ActiveColorAttachments[i]) - { - colorAttachmentChanged = true; - break; - } - } - - // Only setup render target if current render pass attachments are different from the active ones - if (colorAttachmentChanged || passDepthAttachment.nameID != m_ActiveDepthAttachment || finalClearFlag != ClearFlag.None || - renderPass.colorStoreActions[0] != m_ActiveColorStoreActions[0] || renderPass.depthStoreAction != m_ActiveDepthStoreAction) - { - SetRenderTarget(cmd, passColorAttachment, passDepthAttachment, finalClearFlag, finalClearColor, renderPass.colorStoreActions[0], renderPass.depthStoreAction); - -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - { - // SetRenderTarget might alter the internal device state(winding order). - // Non-stereo buffer is already updated internally when switching render target. We update stereo buffers here to keep the consistency. - bool renderIntoTexture = passColorAttachment.nameID != cameraData.xr.renderTarget; - cameraData.PushBuiltinShaderConstantsXR(CommandBufferHelpers.GetRasterCommandBuffer(cmd), renderIntoTexture); - XRSystemUniversal.MarkShaderProperties(CommandBufferHelpers.GetRasterCommandBuffer(cmd), cameraData.xrUniversal, renderIntoTexture); - } -#endif - } - } - } - -#if ENABLE_SHADER_DEBUG_PRINT - ShaderDebugPrintManager.instance.SetShaderDebugPrintInputConstants(cmd, ShaderDebugPrintInputProducer.Get()); - ShaderDebugPrintManager.instance.SetShaderDebugPrintBindings(cmd); -#endif - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - void BeginXRRendering(CommandBuffer cmd, ScriptableRenderContext context, ref CameraData cameraData) - { -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - { - if (cameraData.xrUniversal.isLateLatchEnabled) - cameraData.xrUniversal.canMarkLateLatch = true; - - cameraData.xr.StartSinglePass(cmd); - - if (cameraData.xr.supportsFoveatedRendering) - { - cmd.ConfigureFoveatedRendering(cameraData.xr.foveatedRenderingInfo); - - if (XRSystem.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.NonUniformRaster)) - cmd.SetKeyword(ShaderGlobalKeywords.FoveatedRenderingNonUniformRaster, true); - } - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } -#endif - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - void EndXRRendering(CommandBuffer cmd, ScriptableRenderContext context, ref CameraData cameraData) - { -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - { - cameraData.xr.StopSinglePass(cmd); - - - if (XRSystem.foveatedRenderingCaps != FoveatedRenderingCaps.None) - { - if (XRSystem.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.NonUniformRaster)) - cmd.SetKeyword(ShaderGlobalKeywords.FoveatedRenderingNonUniformRaster, false); - - cmd.ConfigureFoveatedRendering(IntPtr.Zero); - } - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } -#endif - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal static void SetRenderTarget(CommandBuffer cmd, RTHandle colorAttachment, RTHandle depthAttachment, ClearFlag clearFlag, Color clearColor) - { - m_ActiveColorAttachments[0] = colorAttachment; - for (int i = 1; i < m_ActiveColorAttachments.Length; ++i) - m_ActiveColorAttachments[i] = null; - for (int i = 0; i < m_ActiveColorAttachments.Length; ++i) - m_ActiveColorAttachmentIDs[i] = m_ActiveColorAttachments[i]?.nameID ?? 0; - - m_ActiveColorStoreActions[0] = RenderBufferStoreAction.Store; - m_ActiveDepthStoreAction = RenderBufferStoreAction.Store; - for (int i = 1; i < m_ActiveColorStoreActions.Length; ++i) - m_ActiveColorStoreActions[i] = RenderBufferStoreAction.Store; - - m_ActiveDepthAttachment = depthAttachment; - - RenderBufferLoadAction colorLoadAction = ((uint)clearFlag & (uint)ClearFlag.Color) != 0 ? RenderBufferLoadAction.DontCare : RenderBufferLoadAction.Load; - - RenderBufferLoadAction depthLoadAction = ((uint)clearFlag & (uint)ClearFlag.Depth) != 0 || ((uint)clearFlag & (uint)ClearFlag.Stencil) != 0 ? - RenderBufferLoadAction.DontCare : RenderBufferLoadAction.Load; - - // Storing depth and color in the same RT should only be possible with alias RTHandles, those that create rendertargets with RTAlloc() - if (colorAttachment.rt == null && depthAttachment.rt == null && depthAttachment.nameID == k_CameraTarget.nameID) - SetRenderTarget(cmd, colorAttachment, colorLoadAction, RenderBufferStoreAction.Store, - colorAttachment, depthLoadAction, RenderBufferStoreAction.Store, clearFlag, clearColor); - else - SetRenderTarget(cmd, colorAttachment, colorLoadAction, RenderBufferStoreAction.Store, - depthAttachment, depthLoadAction, RenderBufferStoreAction.Store, clearFlag, clearColor); - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal static void SetRenderTarget(CommandBuffer cmd, RTHandle colorAttachment, RTHandle depthAttachment, ClearFlag clearFlag, Color clearColor, RenderBufferStoreAction colorStoreAction, RenderBufferStoreAction depthStoreAction) - { - m_ActiveColorAttachments[0] = colorAttachment; - for (int i = 1; i < m_ActiveColorAttachments.Length; ++i) - m_ActiveColorAttachments[i] = null; - for (int i = 0; i < m_ActiveColorAttachments.Length; ++i) - m_ActiveColorAttachmentIDs[i] = m_ActiveColorAttachments[i]?.nameID ?? 0; - - m_ActiveColorStoreActions[0] = colorStoreAction; - m_ActiveDepthStoreAction = depthStoreAction; - for (int i = 1; i < m_ActiveColorStoreActions.Length; ++i) - m_ActiveColorStoreActions[i] = RenderBufferStoreAction.Store; - - m_ActiveDepthAttachment = depthAttachment; - - RenderBufferLoadAction colorLoadAction = ((uint)clearFlag & (uint)ClearFlag.Color) != 0 ? - RenderBufferLoadAction.DontCare : RenderBufferLoadAction.Load; - - RenderBufferLoadAction depthLoadAction = ((uint)clearFlag & (uint)ClearFlag.Depth) != 0 ? - RenderBufferLoadAction.DontCare : RenderBufferLoadAction.Load; - - // if we shouldn't use optimized store actions then fall back to the conservative safe (un-optimal!) route and just store everything - if (!m_UseOptimizedStoreActions) - { - if (colorStoreAction != RenderBufferStoreAction.StoreAndResolve) - colorStoreAction = RenderBufferStoreAction.Store; - if (depthStoreAction != RenderBufferStoreAction.StoreAndResolve) - depthStoreAction = RenderBufferStoreAction.Store; - } - - - SetRenderTarget(cmd, colorAttachment, colorLoadAction, colorStoreAction, - depthAttachment, depthLoadAction, depthStoreAction, clearFlag, clearColor); - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - static void SetRenderTarget(CommandBuffer cmd, - RTHandle colorAttachment, - RenderBufferLoadAction colorLoadAction, - RenderBufferStoreAction colorStoreAction, - RTHandle depthAttachment, - RenderBufferLoadAction depthLoadAction, - RenderBufferStoreAction depthStoreAction, - ClearFlag clearFlags, - Color clearColor) - { - // XRTODO: Revisit the logic. Why treat CameraTarget depth specially? - if (depthAttachment.nameID == BuiltinRenderTextureType.CameraTarget) - CoreUtils.SetRenderTarget(cmd, colorAttachment, colorLoadAction, colorStoreAction, - colorAttachment, depthLoadAction, depthStoreAction, clearFlags, clearColor); - else - CoreUtils.SetRenderTarget(cmd, colorAttachment, colorLoadAction, colorStoreAction, - depthAttachment, depthLoadAction, depthStoreAction, clearFlags, clearColor); - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - static void SetRenderTarget(CommandBuffer cmd, RTHandle[] colorAttachments, RenderTargetIdentifier[] colorAttachmentIDs, RTHandle depthAttachment, ClearFlag clearFlag, Color clearColor) - { - m_ActiveColorAttachments = colorAttachments; - m_ActiveColorAttachmentIDs = colorAttachmentIDs; - m_ActiveDepthAttachment = depthAttachment; - - CoreUtils.SetRenderTarget(cmd, m_ActiveColorAttachmentIDs, depthAttachment, clearFlag, clearColor); - } -#endif - - internal virtual void SwapColorBuffer(CommandBuffer cmd) { } - internal virtual void EnableSwapBufferMSAA(bool enable) { } - -#if URP_COMPATIBILITY_MODE - [Conditional("UNITY_EDITOR")] - void DrawGizmos(ScriptableRenderContext context, Camera camera, GizmoSubset gizmoSubset, ref RenderingData renderingData) - { -#if UNITY_EDITOR - if (!Handles.ShouldRenderGizmos() || camera.sceneViewFilterMode == Camera.SceneViewFilterMode.ShowFiltered) - return; - - var cmd = renderingData.commandBuffer; - using (new ProfilingScope(cmd, Profiling.drawGizmos)) - { - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - context.DrawGizmos(camera, gizmoSubset); - } - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); -#endif - } - - [Conditional("UNITY_EDITOR")] - void DrawWireOverlay(ScriptableRenderContext context, Camera camera) - { - context.DrawWireOverlay(camera); - } - - void InternalStartRendering(ScriptableRenderContext context, ref RenderingData renderingData) - { - using (new ProfilingScope(Profiling.internalStartRendering)) - { - for (int i = 0; i < m_ActiveRenderPassQueue.Count; ++i) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - m_ActiveRenderPassQueue[i].OnCameraSetup(renderingData.commandBuffer, ref renderingData); - #pragma warning restore CS0618 - } - } - - context.ExecuteCommandBuffer(renderingData.commandBuffer); - renderingData.commandBuffer.Clear(); - } -#endif - // Common ScriptableRenderer.Execute and RenderGraph path void InternalFinishRenderingCommon(CommandBuffer cmd, bool resolveFinalTarget) { @@ -2318,15 +1269,6 @@ void InternalFinishRenderingCommon(CommandBuffer cmd, bool resolveFinalTarget) // Happens when rendering the last camera in the camera stack. if (resolveFinalTarget) { -#if URP_COMPATIBILITY_MODE - for (int i = 0; i < m_ActiveRenderPassQueue.Count; ++i) - { - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - m_ActiveRenderPassQueue[i].OnFinishCameraStackRendering(cmd); -#pragma warning restore CS0618 - } -#endif FinishRendering(cmd); @@ -2337,19 +1279,6 @@ void InternalFinishRenderingCommon(CommandBuffer cmd, bool resolveFinalTarget) } } -#if URP_COMPATIBILITY_MODE - // ScriptableRenderer.Execute path - void InternalFinishRenderingExecute(ScriptableRenderContext context, CommandBuffer cmd, bool resolveFinalTarget) - { - InternalFinishRenderingCommon(cmd, resolveFinalTarget); - - ResetNativeRenderPassFrameData(); - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } -#endif - private protected int AdjustAndGetScreenMSAASamples(RenderGraph renderGraph, bool useIntermediateColorTarget) { // In the editor (ConfigureTargetTexture in PlayModeView.cs) and many platforms, the system render target is always allocated without MSAA @@ -2389,95 +1318,6 @@ internal static void SortStable(List list) } } - internal struct RenderBlocks : IDisposable - { - private NativeArray m_BlockEventLimits; - private NativeArray m_BlockRanges; - private NativeArray m_BlockRangeLengths; - public RenderBlocks(List activeRenderPassQueue) - { - // Upper limits for each block. Each block will contains render passes with events below the limit. - m_BlockEventLimits = new NativeArray(k_RenderPassBlockCount, Allocator.Temp); - m_BlockRanges = new NativeArray(m_BlockEventLimits.Length + 1, Allocator.Temp); - m_BlockRangeLengths = new NativeArray(m_BlockRanges.Length, Allocator.Temp); - - m_BlockEventLimits[RenderPassBlock.BeforeRendering] = RenderPassEvent.BeforeRenderingPrePasses; - m_BlockEventLimits[RenderPassBlock.MainRenderingOpaque] = RenderPassEvent.AfterRenderingOpaques; - m_BlockEventLimits[RenderPassBlock.MainRenderingTransparent] = RenderPassEvent.AfterRenderingPostProcessing; - m_BlockEventLimits[RenderPassBlock.AfterRendering] = (RenderPassEvent)Int32.MaxValue; - - // blockRanges[0] is always 0 - // blockRanges[i] is the index of the first RenderPass found in m_ActiveRenderPassQueue that has a ScriptableRenderPass.renderPassEvent higher than blockEventLimits[i] (i.e, should be executed after blockEventLimits[i]) - // blockRanges[blockEventLimits.Length] is m_ActiveRenderPassQueue.Count - FillBlockRanges(activeRenderPassQueue); - m_BlockEventLimits.Dispose(); - - for (int i = 0; i < m_BlockRanges.Length - 1; i++) - { - m_BlockRangeLengths[i] = m_BlockRanges[i + 1] - m_BlockRanges[i]; - } - } - - // RAII like Dispose pattern implementation for 'using' keyword - public void Dispose() - { - m_BlockRangeLengths.Dispose(); - m_BlockRanges.Dispose(); - } - - // Fill in render pass indices for each block. End index is startIndex + 1. - void FillBlockRanges(List activeRenderPassQueue) - { - int currRangeIndex = 0; - int currRenderPass = 0; - m_BlockRanges[currRangeIndex++] = 0; - - // For each block, it finds the first render pass index that has an event - // higher than the block limit. - for (int i = 0; i < m_BlockEventLimits.Length - 1; ++i) - { - while (currRenderPass < activeRenderPassQueue.Count && - activeRenderPassQueue[currRenderPass].renderPassEvent < m_BlockEventLimits[i]) - currRenderPass++; - - m_BlockRanges[currRangeIndex++] = currRenderPass; - } - - m_BlockRanges[currRangeIndex] = activeRenderPassQueue.Count; - } - - public int GetLength(int index) - { - return m_BlockRangeLengths[index]; - } - - // Minimal foreach support - public struct BlockRange : IDisposable - { - int m_Current; - int m_End; - public BlockRange(int begin, int end) - { - Assertions.Assert.IsTrue(begin <= end); - m_Current = begin < end ? begin : end; - m_End = end >= begin ? end : begin; - m_Current -= 1; - } - - public BlockRange GetEnumerator() { return this; } - public bool MoveNext() { return ++m_Current < m_End; } - public int Current { get => m_Current; } - public void Dispose() { } - } - - public BlockRange GetRange(int index) - { - return new BlockRange(m_BlockRanges[index], m_BlockRanges[index + 1]); - } - } - - internal virtual bool supportsNativeRenderPassRendergraphCompiler { get => false; } - /// /// Used to determine if this renderer supports the use of GPU occlusion culling. /// diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRendererFeature.cs index 17f78cbcb18..d157518219e 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRendererFeature.cs @@ -64,16 +64,6 @@ public virtual void OnCameraPreCull(ScriptableRenderer renderer, in CameraData c /// Rendering state. Use this to setup render passes. public abstract void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData); -#if URP_COMPATIBILITY_MODE - /// - /// Callback after render targets are initialized. This allows for accessing targets from renderer after they are created and ready. - /// - /// Renderer used for adding render passes. - /// Rendering state. Use this to setup render passes. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete + " #from(6000.2)")] - public virtual void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData) { } -#endif - void OnEnable() { // UUM-44048: If the pipeline is not created, don't call Create() as it may allocate RTHandles or do other @@ -90,16 +80,6 @@ void OnValidate() Create(); } -#if URP_COMPATIBILITY_MODE - /// - /// Override this method and return true if the feature should use the Native RenderPass API - /// - internal virtual bool SupportsNativeRenderPass() - { - return false; - } -#endif - /// /// Override this method and return true that renderer would produce rendering layers texture. /// diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Settings/RenderGraphSettings.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Settings/RenderGraphSettings.cs index 8029bf3058f..b49f2508b0d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Settings/RenderGraphSettings.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Settings/RenderGraphSettings.cs @@ -39,6 +39,7 @@ namespace UnityEngine.Rendering.Universal [SupportedOnRenderPipeline(typeof(UniversalRenderPipelineAsset))] [Categorization.CategoryInfo(Name = "Render Graph", Order = 50)] [Categorization.ElementInfo(Order = -10)] + [Obsolete("These settings are not used. #from(6000.4)", false)] public class RenderGraphSettings : IRenderPipelineGraphicsSettings { #region Version @@ -54,69 +55,17 @@ internal enum Version : int public int version => (int)m_Version; #endregion - bool IRenderPipelineGraphicsSettings.isAvailableInPlayerBuild => true; - - #region SerializeFields - - [SerializeField] - [Tooltip("When enabled, URP does not use the Render Graph API to construct and execute the frame. Use this option only for compatibility purposes.")] - [RecreatePipelineOnChange] - private bool m_EnableRenderCompatibilityMode; - #endregion + bool IRenderPipelineGraphicsSettings.isAvailableInPlayerBuild => false; #region Data Accessors /// /// When enabled, Universal Rendering Pipeline will not use Render Graph API to construct and execute the frame. /// - public bool enableRenderCompatibilityMode -#if URP_COMPATIBILITY_MODE - { - get - { - if (RenderGraphGraphicsAutomatedTests.forceRenderGraphState.HasValue) - return !RenderGraphGraphicsAutomatedTests.forceRenderGraphState.Value; - return m_EnableRenderCompatibilityMode; - } - set - { - this.SetValueAndNotify(ref m_EnableRenderCompatibilityMode, value, nameof(m_EnableRenderCompatibilityMode)); - } - } -#else - { - //Temporarilly keep this boolean for all third parties support - get => false; - [Obsolete("Compatibility Mode is being removed. This setter is not accessible without the define URP_COMPATIBILITY_MODE. #from(6000.3) #breakingFrom(6000.3)", true)] set { } - } -#endif + [Obsolete("This property is not used. #from(6000.4)", false)] + public bool enableRenderCompatibilityMode => false; #endregion - - #region Upgrade and checks - - internal void SetCompatibilityModeFromUpgrade(bool value) => m_EnableRenderCompatibilityMode = value; - -#if UNITY_EDITOR - internal bool GetSerializedCompatibilityModeForBuildCheck() => m_EnableRenderCompatibilityMode; - - internal void AddCompatibilityModeDefineForCurrentPlateform() - { - //There is no public API to iterate on all installed target plateform. Only updating current one. - var activeBuildTarget = EditorUserBuildSettings.activeBuildTarget; - var activeBuildTargetGroup = BuildPipeline.GetBuildTargetGroup(activeBuildTarget); - var namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(activeBuildTargetGroup); - - string defineSymbols = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget); - if (!string.IsNullOrEmpty(defineSymbols)) - defineSymbols += ";"; - defineSymbols += $"URP_COMPATIBILITY_MODE"; - PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, defineSymbols); - AssetDatabase.SaveAssets(); //saving is required to recompile after the define is added. - } -#endif - - #endregion } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/ShadowUtils.cs b/Packages/com.unity.render-pipelines.universal/Runtime/ShadowUtils.cs index 8f20c1098b4..49aeae15d1a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/ShadowUtils.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/ShadowUtils.cs @@ -522,21 +522,10 @@ internal static void SetCameraPosition(RasterCommandBuffer cmd, Vector3 worldSpa cmd.SetGlobalVector(ShaderPropertyId.worldSpaceCameraPos, worldSpaceCameraPos); } - internal static void SetWorldToCameraAndCameraToWorldMatrices(RasterCommandBuffer cmd, Matrix4x4 viewMatrix) - { - // There's an inconsistency in handedness between unity_matrixV and unity_WorldToCamera - // Unity changes the handedness of unity_WorldToCamera (see Camera::CalculateMatrixShaderProps) - // we will also change it here to avoid breaking existing shaders. (case 1257518) - Matrix4x4 worldToCameraMatrix = Matrix4x4.Scale(new Vector3(1.0f, 1.0f, -1.0f)) * viewMatrix; - Matrix4x4 cameraToWorldMatrix = worldToCameraMatrix.inverse; - cmd.SetGlobalMatrix(ShaderPropertyId.worldToCameraMatrix, worldToCameraMatrix); - cmd.SetGlobalMatrix(ShaderPropertyId.cameraToWorldMatrix, cameraToWorldMatrix); - } - private static RenderTextureDescriptor GetTemporaryShadowTextureDescriptor(int width, int height, int bits) { - var format = Experimental.Rendering.GraphicsFormatUtility.GetDepthStencilFormat(bits, 0); - RenderTextureDescriptor rtd = new RenderTextureDescriptor(width, height, Experimental.Rendering.GraphicsFormat.None, format); + var format = GraphicsFormatUtility.GetDepthStencilFormat(bits, 0); + RenderTextureDescriptor rtd = new RenderTextureDescriptor(width, height, GraphicsFormat.None, format); rtd.shadowSamplingMode = RenderingUtils.SupportsRenderTextureFormat(RenderTextureFormat.Shadowmap) ? ShadowSamplingMode.CompareDepths : ShadowSamplingMode.None; return rtd; } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs index a41843de18f..501ae9e7f15 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs @@ -80,9 +80,6 @@ public static class Renderer { const string k_Name = nameof(ScriptableRenderer); public static readonly ProfilingSampler setupCullingParameters = new ProfilingSampler($"{k_Name}.{nameof(ScriptableRenderer.SetupCullingParameters)}"); -#if URP_COMPATIBILITY_MODE - public static readonly ProfilingSampler setup = new ProfilingSampler($"{k_Name}.{nameof(ScriptableRenderer.Setup)}"); -#endif }; public static class Context @@ -191,11 +188,6 @@ internal static bool UseDynamicBranchFogKeyword() internal static RenderGraph s_RenderGraph; internal static RTHandleResourcePool s_RTHandlePool; -#if URP_COMPATIBILITY_MODE - // internal for tests - internal static bool useRenderGraph; -#endif - // Store locally the value on the instance due as the Render Pipeline Asset data might change before the disposal of the asset, making some APV Resources leak. internal bool apvIsEnabled = false; @@ -275,14 +267,6 @@ public UniversalRenderPipeline(UniversalRenderPipelineAsset asset) DecalProjector.defaultMaterial = asset.decalMaterial; s_RenderGraph = new RenderGraph("URPRenderGraph"); -#if URP_COMPATIBILITY_MODE - useRenderGraph = !GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode; - -#if !UNITY_EDITOR - Debug.Log($"RenderGraph is now {(useRenderGraph ? "enabled" : "disabled")}."); -#endif -#endif - s_RTHandlePool = new RTHandleResourcePool(); DebugManager.instance.RefreshEditor(); @@ -868,28 +852,9 @@ static void RenderSingleCamera(ScriptableRenderContext context, UniversalCameraD CreateShadowAtlasAndCullShadowCasters(lightData, shadowData, cameraData, ref data.cullResults, ref context); renderer.AddRenderPasses(ref legacyRenderingData); - -#if URP_COMPATIBILITY_MODE - if (!useRenderGraph) - { - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - using (new ProfilingScope(Profiling.Pipeline.Renderer.setup)) - { - renderer.Setup(context, ref legacyRenderingData); - } - - // Timing scope inside - renderer.Execute(context, ref legacyRenderingData); - #pragma warning restore CS0618 - } - else -#endif - { RenderTextureUVOriginStrategy uvOriginStrategy = UniversalRenderPipeline.renderTextureUVOriginStrategy; RecordAndExecuteRenderGraph(s_RenderGraph, context, renderer, cmd, cameraData.camera, uvOriginStrategy); renderer.FinishRenderGraphRendering(cmd); - } } // When ProfilingSample goes out of scope, an "EndSample" command is enqueued into CommandBuffer cmd context.ExecuteCommandBuffer(cmd); // Sends to ScriptableRenderContext all the commands enqueued since cmd.Clear, i.e the "EndSample" command @@ -897,15 +862,6 @@ static void RenderSingleCamera(ScriptableRenderContext context, UniversalCameraD using (new ProfilingScope(Profiling.Pipeline.Context.submit)) { -#if URP_COMPATIBILITY_MODE - // Render Graph will do the validation by itself, so this is redundant in that case - if (!useRenderGraph && renderer.useRenderPassEnabled && !context.SubmitForRenderPassValidation()) - { - renderer.useRenderPassEnabled = false; - cmd.SetKeyword(ShaderGlobalKeywords.RenderPassEnabled, false); - Debug.LogWarning("Rendering command not supported inside a native RenderPass found. Falling back to non-RenderPass rendering path"); - } -#endif context.Submit(); // Actually execute the commands that we previously sent to the ScriptableRenderContext context } ScriptableRenderer.current = null; @@ -1487,13 +1443,7 @@ static void InitializeStackedCameraData(Camera baseCamera, UniversalAdditionalCa cameraData.renderScale = disableRenderScale ? 1.0f : settings.renderScale; // Convert the upscaling filter selection from the pipeline asset into an image upscaling filter - cameraData.upscalingFilter = ResolveUpscalingFilterSelection(new Vector2(cameraData.pixelWidth, cameraData.pixelHeight), cameraData.renderScale, settings.upscalingFilter, -#if URP_COMPATIBILITY_MODE - GraphicsSettings.TryGetRenderPipelineSettings(out var renderGraphSettings) && !renderGraphSettings.enableRenderCompatibilityMode -#else - true -#endif - ); + cameraData.upscalingFilter = ResolveUpscalingFilterSelection(new Vector2(cameraData.pixelWidth, cameraData.pixelHeight), cameraData.renderScale, settings.upscalingFilter); bool upscalerSupportsTemporalAntiAliasing = cameraData.upscalingFilter == ImageUpscalingFilter.STP; bool upscalerSupportsSharpening = cameraData.upscalingFilter == ImageUpscalingFilter.FSR; @@ -1704,15 +1654,6 @@ static UniversalRenderingData CreateRenderingData(ContextContainer frameData, Un data.supportsDynamicBatching = settings.supportsDynamicBatching; data.perObjectData = GetPerObjectLightFlags(universalLightData, settings, renderingMode); -#if URP_COMPATIBILITY_MODE - // Render graph does not support RenderingData.commandBuffer as its execution timeline might break. - // RenderingData.commandBuffer is available only for the old non-RG execute code path. - if(useRenderGraph) - data.m_CommandBuffer = null; - else - data.m_CommandBuffer = cmd; -#endif - UniversalRenderer universalRenderer = renderer as UniversalRenderer; if (universalRenderer != null) { @@ -2236,14 +2177,14 @@ static void CheckAndApplyDebugSettings(ref RenderingData renderingData) /// Scale being applied to the final image size /// Upscaling filter selected by the user /// Either the original filter provided, or the best replacement available - static ImageUpscalingFilter ResolveUpscalingFilterSelection(Vector2 imageSize, float renderScale, UpscalingFilterSelection selection, bool enableRenderGraph) + static ImageUpscalingFilter ResolveUpscalingFilterSelection(Vector2 imageSize, float renderScale, UpscalingFilterSelection selection) { // By default we just use linear filtering since it's the most compatible choice ImageUpscalingFilter filter = ImageUpscalingFilter.Linear; // Fall back to the automatic filter if the selected filter isn't supported on the current platform or rendering environment - if (((selection == UpscalingFilterSelection.FSR) && (!FSRUtils.IsSupported())) - || ((selection == UpscalingFilterSelection.STP) && (!STP.IsSupported() || !enableRenderGraph)) + if ((selection == UpscalingFilterSelection.FSR && !FSRUtils.IsSupported()) + || (selection == UpscalingFilterSelection.STP && !STP.IsSupported()) ) { selection = UpscalingFilterSelection.Auto; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs index 32480573a10..0c46f196f96 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs @@ -103,21 +103,6 @@ internal RenderingData(ContextContainer frameData) internal UniversalRenderingData universalRenderingData => frameData.Get(); -#if URP_COMPATIBILITY_MODE - // Non-rendergraph path only. Do NOT use with rendergraph! - internal ref CommandBuffer commandBuffer - { - get - { - ref var cmd = ref frameData.Get().m_CommandBuffer; - if (cmd == null) - Debug.LogError("RenderingData.commandBuffer is null. RenderGraph does not support this property. Please use the command buffer provided by the RenderGraphContext."); - - return ref cmd; - } - } -#endif - /// /// Returns culling results that exposes handles to visible objects, lights and probes. /// You can use this to draw objects with ScriptableRenderContext.DrawRenderers @@ -295,34 +280,6 @@ internal Matrix4x4 GetProjectionMatrixNoJitter(int viewIndex = 0) return frameData.Get().GetProjectionMatrixNoJitter(viewIndex); } -#if URP_COMPATIBILITY_MODE - /// - /// Returns the camera GPU projection matrix. This contains platform specific changes to handle y-flip and reverse z. Includes camera jitter if required by active features. - /// Similar to GL.GetGPUProjectionMatrix but queries URP internal state to know if the pipeline is rendering to render texture. - /// For more info on platform differences regarding camera projection check: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html - /// - /// View index in case of stereo rendering. By default viewIndex is set to 0. - /// - /// - public Matrix4x4 GetGPUProjectionMatrix(int viewIndex = 0) - { - return frameData.Get().GetGPUProjectionMatrix(viewIndex); - } - - /// - /// Returns the camera GPU projection matrix. This contains platform specific changes to handle y-flip and reverse z. Does not include any camera jitter. - /// Similar to GL.GetGPUProjectionMatrix but queries URP internal state to know if the pipeline is rendering to render texture. - /// For more info on platform differences regarding camera projection check: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html - /// - /// View index in case of stereo rendering. By default viewIndex is set to 0. - /// - /// - public Matrix4x4 GetGPUProjectionMatrixNoJitter(int viewIndex = 0) - { - return frameData.Get().GetGPUProjectionMatrixNoJitter(viewIndex); - } -#endif - internal Matrix4x4 GetGPUProjectionMatrix(bool renderIntoTexture, int viewIndex = 0) { return frameData.Get().GetGPUProjectionMatrix(renderIntoTexture, viewIndex); @@ -476,21 +433,6 @@ public bool IsHandleYFlipped(RTHandle handle) return frameData.Get().IsHandleYFlipped(handle); } -#if URP_COMPATIBILITY_MODE - /// - /// True if the camera device projection matrix is flipped. This happens when the pipeline is rendering - /// to a render texture in non OpenGL platforms. If you are doing a custom Blit pass to copy camera textures - /// (_CameraColorTexture, _CameraDepthAttachment) you need to check this flag to know if you should flip the - /// matrix when rendering with for cmd.Draw* and reading from camera textures. - /// - /// True if the camera device projection matrix is flipped. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public bool IsCameraProjectionMatrixFlipped() - { - return frameData.Get().IsCameraProjectionMatrixFlipped(); - } -#endif - /// /// True if the render target's projection matrix is flipped. This happens when the pipeline is rendering /// to a render texture in non OpenGL platforms. If you are doing a custom Blit pass to copy camera textures diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineGlobalSettings.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineGlobalSettings.cs index 31d2e797eb8..ac3d4289bc2 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineGlobalSettings.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineGlobalSettings.cs @@ -102,9 +102,6 @@ public static void UpgradeAsset(EntityId assetInstanceID) if (asset.m_AssetVersion < 6) { MigrateToRenderPipelineGraphicsSettings(asset); -#pragma warning disable 618 // Type or member is obsolete - asset.m_EnableRenderGraph = false; -#pragma warning restore 618 // Type or member is obsolete asset.m_AssetVersion = 6; } @@ -185,7 +182,6 @@ public static void MigrateToRenderPipelineGraphicsSettings(UniversalRenderPipeli MigrateToShaderStrippingSetting(data); MigrateToURPShaderStrippingSetting(data); MigrateDefaultVolumeProfile(data); - MigrateToRenderGraphSettings(data); } private static T GetOrCreateGraphicsSettings(UniversalRenderPipelineGlobalSettings data) @@ -217,15 +213,6 @@ static void MigrateToShaderStrippingSetting(UniversalRenderPipelineGlobalSetting #pragma warning restore 618 } - static void MigrateToRenderGraphSettings(UniversalRenderPipelineGlobalSettings data) - { - var rgSettings = GetOrCreateGraphicsSettings(data); - -#pragma warning disable 618 // Type or member is obsolete - rgSettings.SetCompatibilityModeFromUpgrade(!data.m_EnableRenderGraph); -#pragma warning restore 618 - } - static void MigrateToURPShaderStrippingSetting(UniversalRenderPipelineGlobalSettings data) { var urpShaderStrippingSetting = GetOrCreateGraphicsSettings(data); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs index 7aafc73ae0c..acf0aa6165e 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs @@ -61,14 +61,6 @@ public sealed partial class UniversalRenderer : ScriptableRenderer static readonly List k_DepthNormalsOnly = new List { new ShaderTagId("DepthNormalsOnly") }; -#if URP_COMPATIBILITY_MODE - static class ProfilingCompatibilityMode - { - private const string k_Name = nameof(UniversalRenderer); - public static readonly ProfilingSampler createCameraRenderTarget = new ProfilingSampler($"{k_Name}.{nameof(CreateCameraRenderTarget)}"); - } -#endif - /// public override int SupportedCameraStackingTypes() { @@ -122,10 +114,6 @@ internal RenderingMode renderingModeActual { return deferredModeUnsupported ? RenderingMode.Forward : RenderingMode.Deferred; case RenderingMode.DeferredPlus: -#if URP_COMPATIBILITY_MODE - if (GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode) - return RenderingMode.ForwardPlus; -#endif return deferredModeUnsupported ? RenderingMode.ForwardPlus : RenderingMode.DeferredPlus; case RenderingMode.Forward: @@ -205,33 +193,8 @@ internal RenderingMode renderingModeActual { Material m_ClusterDeferredMaterial = null; Material m_CameraMotionVecMaterial = null; -#if URP_COMPATIBILITY_MODE - CopyDepthPass m_PrimedDepthCopyPass; - CopyDepthPass m_GBufferCopyDepthPass; - - internal RenderTargetBufferSystem m_ColorBufferSystem; - internal RTHandle m_ActiveCameraColorAttachment; - internal RTHandle m_ActiveCameraDepthAttachment; - internal RTHandle m_CameraDepthAttachment; - internal RTHandle m_CameraDepthAttachment_D3d_11; - internal RTHandle m_DepthTexture; - RTHandle m_NormalsTexture; - RTHandle m_DecalLayersTexture; - RTHandle m_OpaqueColor; - RTHandle m_MotionVectorColor; - RTHandle m_MotionVectorDepth; - - bool m_DepthPrimingRecommended; - bool m_VulkanEnablePreTransform; - - CompatibilityMode.PostProcessPasses m_PostProcessPasses; - internal ColorGradingLutPass colorGradingLutPass { get => m_PostProcessPasses.colorGradingLutPass; } - internal CompatibilityMode.PostProcessPass postProcessPass { get => m_PostProcessPasses.postProcessPass; } - internal CompatibilityMode.PostProcessPass finalPostProcessPass { get => m_PostProcessPasses.finalPostProcessPass; } - internal RTHandle colorGradingLut { get => m_PostProcessPasses.colorGradingLut; } -#endif - internal bool isPostProcessPassRenderGraphActive { get => m_PostProcess != null; } - + internal bool isPostProcessActive { get => m_PostProcess != null; } + internal DeferredLights deferredLights { get => m_DeferredLights; } internal LayerMask prepassLayerMask { get; set; } internal LayerMask opaqueLayerMask { get; set; } @@ -286,20 +249,7 @@ public UniversalRenderer(UniversalRendererData data) : base(data) m_DefaultStencilState.SetZFailOperation(stencilData.zFailOperation); m_IntermediateTextureMode = data.intermediateTextureMode; - -#if URP_COMPATIBILITY_MODE - if (GraphicsSettings.TryGetRenderPipelineSettings(out var renderGraphSettings) - && !renderGraphSettings.enableRenderCompatibilityMode) - { -#endif - prepassLayerMask = data.prepassLayerMask; -#if URP_COMPATIBILITY_MODE - } - else - { - prepassLayerMask = data.opaqueLayerMask; - } -#endif + prepassLayerMask = data.prepassLayerMask; opaqueLayerMask = data.opaqueLayerMask; transparentLayerMask = data.transparentLayerMask; shadowTransparentReceive = data.shadowTransparentReceive; @@ -338,14 +288,6 @@ public UniversalRenderer(UniversalRendererData data) : base(data) this.m_CameraDepthTextureFormat = data.depthTextureFormat; useRenderPassEnabled = data.useNativeRenderPass; -#if URP_COMPATIBILITY_MODE -#if UNITY_ANDROID || UNITY_IOS || UNITY_TVOS || UNITY_EMBEDDED_LINUX - this.m_DepthPrimingRecommended = false; -#else - this.m_DepthPrimingRecommended = true; -#endif -#endif - // Note: Since all custom render passes inject first and we have stable sort, // we inject the builtin passes in the before events. m_MainLightShadowCasterPass = new MainLightShadowCasterPass(RenderPassEvent.BeforeRenderingShadows); @@ -358,14 +300,6 @@ public UniversalRenderer(UniversalRendererData data) : base(data) #endif m_DepthPrepass = new DepthOnlyPass(RenderPassEvent.BeforeRenderingPrePasses, RenderQueueRange.opaque, prepassLayerMask); m_DepthNormalPrepass = new DepthNormalOnlyPass(RenderPassEvent.BeforeRenderingPrePasses, RenderQueueRange.opaque, prepassLayerMask); - -#if URP_COMPATIBILITY_MODE - if (renderingModeRequested == RenderingMode.Forward || renderingModeRequested == RenderingMode.ForwardPlus) - { - m_PrimedDepthCopyPass = new CopyDepthPass(RenderPassEvent.AfterRenderingPrePasses, copyDephPS, true, true); - } -#endif - if (renderingModeRequested == RenderingMode.Deferred || renderingModeRequested == RenderingMode.DeferredPlus) { var deferredInitParams = new DeferredLights.InitParams(); @@ -393,9 +327,6 @@ public UniversalRenderer(UniversalRendererData data) : base(data) new ShaderTagId("LightweightForward") // Legacy shaders (do not have a gbuffer pass) are considered forward-only for backward compatibility }; int forwardOnlyStencilRef = stencilData.stencilReference | (int)StencilUsage.MaterialUnlit; -#if URP_COMPATIBILITY_MODE - m_GBufferCopyDepthPass = new CopyDepthPass(RenderPassEvent.BeforeRenderingGbuffer + 1, copyDephPS, true, customPassName: "Copy GBuffer Depth"); -#endif m_DeferredPass = new DeferredPass(RenderPassEvent.BeforeRenderingDeferredLights, m_DeferredLights); m_RenderOpaqueForwardOnlyPass = new DrawObjectsPass("Draw Opaques Forward Only", forwardOnlyShaderTagIds, true, RenderPassEvent.BeforeRenderingOpaques, RenderQueueRange.opaque, data.opaqueLayerMask, forwardOnlyStencilState, forwardOnlyStencilRef); } @@ -434,27 +365,12 @@ public UniversalRenderer(UniversalRendererData data) : base(data) m_DrawOffscreenUIPass = new DrawScreenSpaceUIPass(RenderPassEvent.BeforeRenderingPostProcessing, true); m_DrawOverlayUIPass = new DrawScreenSpaceUIPass(RenderPassEvent.AfterRendering + k_AfterFinalBlitPassQueueOffset, false); // after m_FinalBlitPass - -#if URP_COMPATIBILITY_MODE - if (!UniversalRenderPipeline.useRenderGraph) + + //No postProcessData means that post processes are disabled + if (data.postProcessData != null) { - // URP post-processing format follows the back-buffer format. - var postProcessParams = CompatibilityMode.PostProcessParams.Create(); - postProcessParams.blitMaterial = m_BlitMaterial; - postProcessParams.requestColorFormat = asset == null - ? GraphicsFormat.B10G11R11_UFloatPack32 - : UniversalRenderPipeline.MakeRenderTextureGraphicsFormat(asset.supportsHDR, asset.hdrColorBufferPrecision, false); - m_PostProcessPasses = new CompatibilityMode.PostProcessPasses(data.postProcessData, ref postProcessParams); - } - else -#endif - { - //No postProcessData means that post processes are disabled - if (data.postProcessData != null) - { - m_PostProcess = new PostProcess(data.postProcessData); - m_ColorGradingLutPassRenderGraph = new ColorGradingLutPass(RenderPassEvent.BeforeRenderingPrePasses, data.postProcessData); - } + m_PostProcess = new PostProcess(data.postProcessData); + m_ColorGradingLutPassRenderGraph = new ColorGradingLutPass(RenderPassEvent.BeforeRenderingPrePasses, data.postProcessData); } m_CapturePass = new CapturePass(RenderPassEvent.AfterRendering); @@ -466,12 +382,6 @@ public UniversalRenderer(UniversalRendererData data) : base(data) m_ProbeVolumeDebugPass = new ProbeVolumeDebugPass(RenderPassEvent.BeforeRenderingTransparents, debugShaders.probeVolumeSamplingDebugComputeShader); #endif -#if URP_COMPATIBILITY_MODE - // RenderTexture format depends on camera and pipeline (HDR, non HDR, etc) - // Samples (MSAA) depend on camera and pipeline - m_ColorBufferSystem = new RenderTargetBufferSystem("_CameraColorAttachment"); -#endif - supportedRenderingFeatures = new RenderingFeatures(); if (renderingModeRequested == RenderingMode.Deferred || renderingModeRequested == RenderingMode.DeferredPlus) @@ -483,10 +393,6 @@ public UniversalRenderer(UniversalRendererData data) : base(data) LensFlareCommonSRP.mergeNeeded = 0; LensFlareCommonSRP.maxLensFlareWithOcclusionTemporalSample = 1; LensFlareCommonSRP.Initialize(); - -#if URP_COMPATIBILITY_MODE - m_VulkanEnablePreTransform = GraphicsSettings.HasShaderDefine(BuiltinShaderDefine.UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION); -#endif } /// @@ -495,12 +401,6 @@ protected override void Dispose(bool disposing) m_ForwardLights.Cleanup(); m_GBufferPass?.Dispose(); -#if URP_COMPATIBILITY_MODE - m_PostProcessPasses.Dispose(); - m_PrimedDepthCopyPass?.Dispose(); - m_GBufferCopyDepthPass?.Dispose(); -#endif - m_FinalBlitPass?.Dispose(); m_DrawOffscreenUIPass?.Dispose(); m_DrawOverlayUIPass?.Dispose(); @@ -539,7 +439,7 @@ protected override void Dispose(bool disposing) LensFlareCommonSRP.Dispose(); #if ENABLE_VR && ENABLE_XR_MODULE - Experimental.Rendering.XRSystem.Dispose(); + XRSystem.Dispose(); #endif } @@ -547,122 +447,11 @@ internal override void ReleaseRenderTargets() { if (m_DeferredLights != null && !m_DeferredLights.UseFramebufferFetch) m_GBufferPass?.Dispose(); - -#if URP_COMPATIBILITY_MODE - m_ColorBufferSystem.Dispose(); - m_PostProcessPasses.ReleaseRenderTargets(); - m_CameraDepthAttachment?.Release(); - m_CameraDepthAttachment_D3d_11?.Release(); - m_DepthTexture?.Release(); - m_NormalsTexture?.Release(); - m_DecalLayersTexture?.Release(); - m_OpaqueColor?.Release(); - m_MotionVectorColor?.Release(); - m_MotionVectorDepth?.Release(); -#endif - + m_MainLightShadowCasterPass?.Dispose(); m_AdditionalLightsShadowCasterPass?.Dispose(); - - hasReleasedRTs = true; } -#if URP_COMPATIBILITY_MODE - void SetupFinalPassDebug(UniversalCameraData cameraData) - { - //NOTE: See SetupRenderGraphFinalPassDebug for RG. - - if ((DebugHandler != null) && DebugHandler.IsActiveForCamera(cameraData.isPreviewCamera)) - { - if (DebugHandler.TryGetFullscreenDebugMode(out DebugFullScreenMode fullScreenDebugMode, out int textureHeightPercent) && - (fullScreenDebugMode != DebugFullScreenMode.ReflectionProbeAtlas || usesClusterLightLoop)) - { - Camera camera = cameraData.camera; - float screenWidth = camera.pixelWidth; - float screenHeight = camera.pixelHeight; - - var relativeSize = Mathf.Clamp01(textureHeightPercent / 100f); - var height = relativeSize * screenHeight; - var width = relativeSize * screenWidth; - - RenderTexture tex = null; - if (fullScreenDebugMode == DebugFullScreenMode.ReflectionProbeAtlas) - { - tex = m_ForwardLights.reflectionProbeManager.atlasRT; - } - else if (fullScreenDebugMode == DebugFullScreenMode.MainLightShadowMap) - { - tex = m_MainLightShadowCasterPass.m_MainLightShadowmapTexture.rt; - } - else if (fullScreenDebugMode == DebugFullScreenMode.AdditionalLightsShadowMap) - { - tex = m_AdditionalLightsShadowCasterPass.m_AdditionalLightsShadowmapHandle.rt; - } - else if (fullScreenDebugMode == DebugFullScreenMode.AdditionalLightsCookieAtlas && m_LightCookieManager != null) - { - tex = m_LightCookieManager?.AdditionalLightsCookieAtlasTexture?.rt; - } - - if (tex != null) CorrectForTextureAspectRatio(ref width, ref height, tex.width, tex.height); - - float normalizedSizeX = width / screenWidth; - float normalizedSizeY = height / screenHeight; - - Rect normalizedRect = new Rect(1 - normalizedSizeX, 1 - normalizedSizeY, normalizedSizeX, normalizedSizeY); - Vector4 dataRangeRemap = Vector4.zero; // zero = off, .x = old min, .y = old max, .z = new min, .w = new max - - switch (fullScreenDebugMode) - { - case DebugFullScreenMode.Depth: - { - DebugHandler.SetDebugRenderTarget(m_DepthTexture, normalizedRect, true, dataRangeRemap); - break; - } - case DebugFullScreenMode.MotionVector: - { - // Motion vectors are in signed UV space, zoom in for visualization. (note: another option is to use (dir.xy, mag) visualization) - const float zoom = 0.01f; - dataRangeRemap.x = -zoom; - dataRangeRemap.y = zoom; - dataRangeRemap.z = 0; - dataRangeRemap.w = 1.0f; - DebugHandler.SetDebugRenderTarget(m_MotionVectorColor, normalizedRect, true, dataRangeRemap); - break; - } - case DebugFullScreenMode.AdditionalLightsShadowMap: - { - DebugHandler.SetDebugRenderTarget(m_AdditionalLightsShadowCasterPass.m_AdditionalLightsShadowmapHandle, normalizedRect, false, dataRangeRemap); - break; - } - case DebugFullScreenMode.MainLightShadowMap: - { - DebugHandler.SetDebugRenderTarget(m_MainLightShadowCasterPass.m_MainLightShadowmapTexture, normalizedRect, false, dataRangeRemap); - break; - } - case DebugFullScreenMode.AdditionalLightsCookieAtlas: - { - DebugHandler.SetDebugRenderTarget(m_LightCookieManager?.AdditionalLightsCookieAtlasTexture, normalizedRect, false, dataRangeRemap); - break; - } - case DebugFullScreenMode.ReflectionProbeAtlas: - { - DebugHandler.SetDebugRenderTarget(m_ForwardLights.reflectionProbeManager.atlasRTHandle, normalizedRect, false, dataRangeRemap); - break; - } - default: - { - break; - } - } - } - else - { - DebugHandler.ResetDebugRenderTarget(); - } - } - } -#endif - /// /// Returns if the camera renders to a offscreen depth texture. /// @@ -677,43 +466,6 @@ void SetupFinalPassDebug(UniversalCameraData cameraData) /// Returns true if the camera renders to depth without any color buffer. It will return false otherwise. public static bool IsOffscreenDepthTexture(UniversalCameraData cameraData) => cameraData.targetTexture != null && cameraData.targetTexture.format == RenderTextureFormat.Depth; -#if URP_COMPATIBILITY_MODE - bool IsDepthPrimingEnabled(UniversalCameraData cameraData) - { -#if UNITY_EDITOR - // We need to disable depth-priming for DrawCameraMode.Wireframe, since depth-priming forces ZTest to Equal - // for opaques rendering, which breaks wireframe rendering. - if (cameraData.isSceneViewCamera) - { - foreach (var sceneViewObject in UnityEditor.SceneView.sceneViews) - { - var sceneView = sceneViewObject as UnityEditor.SceneView; - if (sceneView != null && sceneView.camera == cameraData.camera && sceneView.cameraMode.drawMode == UnityEditor.DrawCameraMode.Wireframe) - return false; - } - } -#endif -#if UNITY_EDITOR || DEVELOPMENT_BUILD - if (DebugHandler is { IsDepthPrimingCompatible: false }) - return false; -#endif - // depth priming requires an extra depth copy, disable it on platforms not supporting it (like GLES when MSAA is on) - if (!CanCopyDepth(cameraData)) - return false; - - // Depth Priming causes rendering errors with WebGL and WebGPU on Apple Arm64 GPUs. - bool isNotWebGL = !IsWebGL(); - bool depthPrimingRequested = (m_DepthPrimingRecommended && m_DepthPrimingMode == DepthPrimingMode.Auto) || m_DepthPrimingMode == DepthPrimingMode.Forced; - bool isForwardRenderingMode = m_RenderingMode == RenderingMode.Forward || m_RenderingMode == RenderingMode.ForwardPlus; - bool isFirstCameraToWriteDepth = cameraData.renderType == CameraRenderType.Base || cameraData.clearDepth; - // Depth is not rendered in a depth-only camera setup with depth priming (UUM-38158) - bool isNotOffscreenDepthTexture = !IsOffscreenDepthTexture(cameraData); - bool isNotMSAA = cameraData.cameraTargetDescriptor.msaaSamples == 1; - - return depthPrimingRequested && isForwardRenderingMode && isFirstCameraToWriteDepth && isNotOffscreenDepthTexture && isNotWebGL && isNotMSAA; - } -#endif - static bool IsWebGL() { // Both WebGL and WebGPU have issues with depth priming on Apple Arm64 @@ -762,876 +514,6 @@ static bool HasPassesRequiringIntermediateTexture(List act return false; } -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void Setup(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - UniversalShadowData shadowData = frameData.Get(); - UniversalPostProcessingData postProcessingData = frameData.Get(); - - m_ForwardLights.PreSetup(universalRenderingData, cameraData, lightData); - - Camera camera = cameraData.camera; - RenderTextureDescriptor cameraTargetDescriptor = cameraData.cameraTargetDescriptor; - - var cmd = universalRenderingData.commandBuffer; - if (DebugHandler != null) - { - DebugHandler.Setup(universalRenderingData.commandBuffer, cameraData.isPreviewCamera); - - if (DebugHandler.IsActiveForCamera(cameraData.isPreviewCamera)) - { - if (DebugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget)) - { - RenderTextureDescriptor colorDesc = cameraData.cameraTargetDescriptor; - DebugHandler.ConfigureColorDescriptorForDebugScreen(ref colorDesc, cameraData.pixelWidth, cameraData.pixelHeight); - RenderingUtils.ReAllocateHandleIfNeeded(ref DebugHandler.DebugScreenColorHandle, colorDesc, name: "_DebugScreenColor"); - - RenderTextureDescriptor depthDesc = cameraData.cameraTargetDescriptor; - DebugHandler.ConfigureDepthDescriptorForDebugScreen(ref depthDesc, cameraDepthTextureFormat, cameraData.pixelWidth, cameraData.pixelHeight); - RenderingUtils.ReAllocateHandleIfNeeded(ref DebugHandler.DebugScreenDepthHandle, depthDesc, name: "_DebugScreenDepth"); - } - - if (DebugHandler.HDRDebugViewIsActive(cameraData.resolveFinalTarget)) - { - DebugHandler.hdrDebugViewPass.Setup(cameraData, DebugHandler.DebugDisplaySettings.lightingSettings.hdrDebugMode); - EnqueuePass(DebugHandler.hdrDebugViewPass); - } - } - } - - if (cameraData.cameraType != CameraType.Game) - useRenderPassEnabled = false; - -#if UNITY_EDITOR - useRenderPassEnabled = false; // UUM-73849 : Disable Native Render Pass in the editor for compatibility mode. - // (Compatibility mode is no longer in development. Disable it to prevent unexpected problems.) -#endif - - // Because of the shortcutting done by depth only offscreen cameras, useDepthPriming must be computed early - useDepthPriming = IsDepthPrimingEnabled(cameraData); - - // Special path for depth only offscreen cameras. Only write opaques + transparents. - if (IsOffscreenDepthTexture(cameraData)) - { - ConfigureCameraTarget(k_CameraTarget, k_CameraTarget); - EnqueuePass(m_RenderOpaqueForwardPass); - - // TODO: Transparents might have force Z write option in the future. -#if ENABLE_ADAPTIVE_PERFORMANCE - if (!needTransparencyPass) - return; -#endif - EnqueuePass(m_RenderTransparentForwardPass); - return; - } - - // Assign the camera color target early in case it is needed during AddRenderPasses. - bool isPreviewCamera = cameraData.isPreviewCamera; - var createColorTexture = ((HasActiveRenderFeatures(rendererFeatures) && m_IntermediateTextureMode == IntermediateTextureMode.Always) && !isPreviewCamera) || - (Application.isEditor && usesClusterLightLoop); - createColorTexture |= HasPassesRequiringIntermediateTexture(activeRenderPassQueue); - - // Gather render pass history requests and update history textures. - UpdateCameraHistory(cameraData); - - // Gather render pass require rendering layers event and mask size - bool requiresRenderingLayer = RenderingLayerUtils.RequireRenderingLayers(this, rendererFeatures, - cameraTargetDescriptor.msaaSamples, - out var renderingLayersEvent, out var renderingLayerMaskSize); - - // All passes that use write to rendering layers are excluded from gl - // So we disable it to avoid setting multiple render targets - if (IsGLDevice()) - requiresRenderingLayer = false; - - bool deferredLighting = usesDeferredLighting; - bool renderingLayerProvidesByDepthNormalPass = false; - bool renderingLayerProvidesRenderObjectPass = false; - if (requiresRenderingLayer && !deferredLighting) - { - switch (renderingLayersEvent) - { - case RenderingLayerUtils.Event.DepthNormalPrePass: - renderingLayerProvidesByDepthNormalPass = true; - break; - case RenderingLayerUtils.Event.Opaque: - renderingLayerProvidesRenderObjectPass = true; - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - - // Gather render pass input requirements - RenderPassInputSummary renderPassInputs = GetRenderPassInputs(cameraData.IsTemporalAAEnabled(), postProcessingData.isEnabled, cameraData.isSceneViewCamera, renderingLayerProvidesByDepthNormalPass, activeRenderPassQueue, m_MotionVectorPass); - - // TODO: investigate the order of call, had to change because of requiresRenderingLayer - if (m_DeferredLights != null) - { - m_DeferredLights.RenderingLayerMaskSize = renderingLayerMaskSize; - m_DeferredLights.UseDecalLayers = requiresRenderingLayer; - - // TODO: This needs to be setup early, otherwise gbuffer attachments will be allocated with wrong size - m_DeferredLights.HasNormalPrepass = renderPassInputs.requiresNormalsTexture; - - m_DeferredLights.ResolveMixedLightingMode(lightData); - - // Once the mixed lighting mode has been discovered, we know how many MRTs we need for the gbuffer. - // Subtractive mixed lighting requires shadowMask output, which is actually used to store unity_ProbesOcclusion values. - m_DeferredLights.CreateGbufferResources(); - - if (m_DeferredLights.UseFramebufferFetch) - { - // At this point we only have injected renderer features in the queue and can do assumptions on whether we'll need Framebuffer Fetch - foreach (var pass in activeRenderPassQueue) - { - if (pass.renderPassEvent >= RenderPassEvent.AfterRenderingGbuffer && - pass.renderPassEvent <= RenderPassEvent.BeforeRenderingDeferredLights) - { - m_DeferredLights.DisableFramebufferFetchInput(); - break; - } - } - } - } - - // Should apply post-processing after rendering this camera? - bool applyPostProcessing = cameraData.postProcessEnabled && m_PostProcessPasses.isCreated; - - // There's at least a camera in the camera stack that applies post-processing - bool anyPostProcessing = postProcessingData.isEnabled && m_PostProcessPasses.isCreated; - - // If Camera's PostProcessing is enabled and if there any enabled PostProcessing requires depth texture as shader read resource (Motion Blur/DoF) - bool cameraHasPostProcessingWithDepth = applyPostProcessing && cameraData.postProcessingRequiresDepthTexture; - - // TODO: We could cache and generate the LUT before rendering the stack - bool generateColorGradingLUT = cameraData.postProcessEnabled && m_PostProcessPasses.isCreated; - bool isSceneViewOrPreviewCamera = cameraData.isSceneViewCamera || cameraData.isPreviewCamera; - // This indicates whether the renderer will output a depth texture. - bool requiresDepthTexture = cameraData.requiresDepthTexture || renderPassInputs.requiresDepthTexture || useDepthPriming; - -#if UNITY_EDITOR - bool isGizmosEnabled = UnityEditor.Handles.ShouldRenderGizmos(); -#else - bool isGizmosEnabled = false; -#endif - - bool mainLightShadows = m_MainLightShadowCasterPass.Setup(universalRenderingData, cameraData, lightData, shadowData); - bool additionalLightShadows = m_AdditionalLightsShadowCasterPass.Setup(universalRenderingData, cameraData, lightData, shadowData); - bool transparentsNeedSettingsPass = m_TransparentSettingsPass.Setup(); - - bool forcePrepass = (m_CopyDepthMode == CopyDepthMode.ForcePrepass); - - // Depth prepass is generated in the following cases: - // - If game or offscreen camera requires it we check if we can copy the depth from the rendering opaques pass and use that instead. - // - Scene or preview cameras always require a depth texture. We do a depth pre-pass to simplify it and it shouldn't matter much for editor. - // - Render passes require it - bool requiresDepthPrepass = (requiresDepthTexture || cameraHasPostProcessingWithDepth) && (!CanCopyDepth(cameraData) || forcePrepass); - requiresDepthPrepass |= isSceneViewOrPreviewCamera; - requiresDepthPrepass |= isGizmosEnabled; - requiresDepthPrepass |= isPreviewCamera; - requiresDepthPrepass |= renderPassInputs.requiresDepthPrepass; - requiresDepthPrepass |= renderPassInputs.requiresNormalsTexture; - requiresDepthPrepass |= IsGLESDevice() && postProcessPass?.useLensFlare == true; - - // Current aim of depth prepass is to generate a copy of depth buffer, it is NOT to prime depth buffer and reduce overdraw on non-mobile platforms. - // When deferred renderer is enabled, depth buffer is already accessible so depth prepass is not needed. - // The only exception is for generating depth-normal textures: SSAO pass needs it and it must run before forward-only geometry. - // DepthNormal prepass will render: - // - forward-only geometry when deferred renderer is enabled - // - all geometry when forward renderer is enabled - if (requiresDepthPrepass && deferredLighting && !renderPassInputs.requiresNormalsTexture) - requiresDepthPrepass = false; - - requiresDepthPrepass |= useDepthPriming; - - // If possible try to merge the opaque and skybox passes instead of splitting them when "Depth Texture" is required. - // The copying of depth should normally happen after rendering opaques. - // But if we only require it for post processing or the scene camera then we do it after rendering transparent objects - // Aim to have the most optimized render pass event for Depth Copy (The aim is to minimize the number of render passes) - if (requiresDepthTexture) - { - bool copyDepthAfterTransparents = m_CopyDepthMode == CopyDepthMode.AfterTransparents; - - RenderPassEvent copyDepthPassEvent = copyDepthAfterTransparents ? RenderPassEvent.AfterRenderingTransparents : RenderPassEvent.AfterRenderingOpaques; - // RenderPassInputs's requiresDepthTexture is configured through ScriptableRenderPass's ConfigureInput function - if (renderPassInputs.requiresDepthTexture) - { - // Do depth copy before the render pass that requires depth texture as shader read resource - copyDepthPassEvent = (RenderPassEvent)Mathf.Min((int)RenderPassEvent.AfterRenderingTransparents, ((int)renderPassInputs.requiresDepthTextureEarliestEvent) - 1); - } - m_CopyDepthPass.renderPassEvent = copyDepthPassEvent; - - // In case we are making the copy depth pass earlier, we need to force set these variables to disable - // depth resolve as the render pass event itself has been moved earlier and it's not possible anymore - if (copyDepthPassEvent < RenderPassEvent.AfterRenderingTransparents) - { - m_CopyDepthPass.m_CopyResolvedDepth = false; - m_CopyDepthMode = CopyDepthMode.AfterOpaques; - } - } - else if (cameraHasPostProcessingWithDepth || isSceneViewOrPreviewCamera || isGizmosEnabled) - { - // If only post process requires depth texture, we can re-use depth buffer from main geometry pass instead of enqueuing a depth copy pass, but no proper API to do that for now, so resort to depth copy pass for now - m_CopyDepthPass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents; - } - - - createColorTexture |= RequiresIntermediateColorTexture(cameraData, in renderPassInputs, usesDeferredLighting, applyPostProcessing); - createColorTexture &= !isPreviewCamera; - - // If camera requires depth and there's no depth pre-pass we create a depth texture that can be read later by effect requiring it. - // When deferred renderer is enabled, we must always create a depth texture and CANNOT use BuiltinRenderTextureType.CameraTarget. This is to get - // around a bug where during gbuffer pass (MRT pass), the camera depth attachment is correctly bound, but during - // deferred pass ("camera color" + "camera depth"), the implicit depth surface of "camera color" is used instead of "camera depth", - // because BuiltinRenderTextureType.CameraTarget for depth means there is no explicit depth attachment... - bool createDepthTexture = (requiresDepthTexture || cameraHasPostProcessingWithDepth) && !requiresDepthPrepass; - createDepthTexture |= !cameraData.resolveFinalTarget; - // Deferred renderer always need to access depth buffer. - createDepthTexture |= (deferredLighting && !useRenderPassEnabled); - // Some render cases (e.g. Material previews) have shown we need to create a depth texture when we're forcing a prepass. - createDepthTexture |= useDepthPriming; - // Todo seems like with mrt depth is not taken from first target - createDepthTexture |= (renderingLayerProvidesRenderObjectPass); - -#if ENABLE_VR && ENABLE_XR_MODULE - // URP can't handle msaa/size mismatch between depth RT and color RT(for now we create intermediate textures to ensure they match) - if (cameraData.xr.enabled) - createColorTexture |= createDepthTexture; -#endif -#if UNITY_ANDROID || UNITY_WEBGL || UNITY_EMBEDDED_LINUX - // GLES can not use render texture's depth buffer with the color buffer of the backbuffer - // in such case we create a color texture for it too. - // If Vulkan PreTransform is enabled we can't mix backbuffer and intermediate render target due to screen orientation mismatch - if (SystemInfo.graphicsDeviceType != GraphicsDeviceType.Vulkan || m_VulkanEnablePreTransform) - createColorTexture |= createDepthTexture; -#endif - - // If there is any scaling, the color and depth need to be the same resolution and the target texture - // will not be the proper size in this case. Same happens with GameView. - // This introduces the final blit pass. - if (RTHandles.rtHandleProperties.rtHandleScale.x != 1.0f || RTHandles.rtHandleProperties.rtHandleScale.y != 1.0f) - createColorTexture |= createDepthTexture; - - if (useRenderPassEnabled || useDepthPriming) - createColorTexture |= createDepthTexture; - - // If gfxAPI yflips intermediate texture, we can't mix-use backbuffer(not flipped) and render texture(flipped) due to different flip state/clipspace y. - // This introduces the final blit pass. - if (SystemInfo.graphicsUVStartsAtTop) - createColorTexture |= createDepthTexture; - - //Set rt descriptors so preview camera's have access should it be needed - var colorDescriptor = cameraTargetDescriptor; - colorDescriptor.useMipMap = false; - colorDescriptor.autoGenerateMips = false; - colorDescriptor.depthStencilFormat = GraphicsFormat.None; - m_ColorBufferSystem.SetCameraSettings(colorDescriptor, FilterMode.Bilinear); - - // Configure all settings require to start a new camera stack (base camera only) - if (cameraData.renderType == CameraRenderType.Base) - { - // Scene filtering redraws the objects on top of the resulting frame. It has to draw directly to the sceneview buffer. - bool sceneViewFilterEnabled = camera.sceneViewFilterMode == Camera.SceneViewFilterMode.ShowFiltered; - bool intermediateRenderTexture = (createColorTexture || createDepthTexture) && !sceneViewFilterEnabled; - - // RTHandles do not support combining color and depth in the same texture so we create them separately - // Should be independent from filtered scene view - createDepthTexture |= createColorTexture; - - RenderTargetIdentifier targetId = BuiltinRenderTextureType.CameraTarget; -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - targetId = cameraData.xr.renderTarget; -#endif - - if (m_TargetColorHandle == null) - { - m_TargetColorHandle = RTHandles.Alloc(targetId); - } - else if (m_TargetColorHandle.nameID != targetId) - { - RTHandleStaticHelpers.SetRTHandleUserManagedWrapper(ref m_TargetColorHandle, targetId); - } - - if (m_TargetDepthHandle == null) - { - m_TargetDepthHandle = RTHandles.Alloc(targetId); - } - else if (m_TargetDepthHandle.nameID != targetId) - { - RTHandleStaticHelpers.SetRTHandleUserManagedWrapper(ref m_TargetDepthHandle, targetId); - } - - // Doesn't create texture for Overlay cameras as they are already overlaying on top of created textures. - if (intermediateRenderTexture) - CreateCameraRenderTarget(context, ref cameraTargetDescriptor, cmd, cameraData); - - m_RenderOpaqueForwardPass.m_IsActiveTargetBackBuffer = !intermediateRenderTexture; - m_RenderTransparentForwardPass.m_IsActiveTargetBackBuffer = !intermediateRenderTexture; -#if ENABLE_VR && ENABLE_XR_MODULE - m_XROcclusionMeshPass.m_IsActiveTargetBackBuffer = !intermediateRenderTexture; -#endif - - m_ActiveCameraColorAttachment = createColorTexture ? m_ColorBufferSystem.PeekBackBuffer() : m_TargetColorHandle; - m_ActiveCameraDepthAttachment = createDepthTexture ? m_CameraDepthAttachment : m_TargetDepthHandle; - } - else - { - cameraData.baseCamera.TryGetComponent(out var baseCameraData); - var baseRenderer = (UniversalRenderer)baseCameraData.scriptableRenderer; - if (m_ColorBufferSystem != baseRenderer.m_ColorBufferSystem) - { - m_ColorBufferSystem.Dispose(); - m_ColorBufferSystem = baseRenderer.m_ColorBufferSystem; - } - m_ActiveCameraColorAttachment = m_ColorBufferSystem.PeekBackBuffer(); - m_ActiveCameraDepthAttachment = baseRenderer.m_ActiveCameraDepthAttachment; - m_TargetColorHandle = baseRenderer.m_TargetColorHandle; - m_TargetDepthHandle = baseRenderer.m_TargetDepthHandle; - } - - if (rendererFeatures.Count != 0 && !isPreviewCamera) - ConfigureCameraColorTarget(m_ColorBufferSystem.PeekBackBuffer()); - - bool copyColorPass = cameraData.requiresOpaqueTexture || renderPassInputs.requiresColorTexture; - // Check the createColorTexture logic above: intermediate color texture is not available for preview cameras. - // Because intermediate color is not available and copyColor pass requires it, we disable CopyColor pass here. - copyColorPass &= !isPreviewCamera; - - // Assign camera targets (color and depth) - ConfigureCameraTarget(m_ActiveCameraColorAttachment, m_ActiveCameraDepthAttachment); - - if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Direct3D11) - cmd.CopyTexture(m_CameraDepthAttachment, m_CameraDepthAttachment_D3d_11); - - bool hasPassesAfterPostProcessing = activeRenderPassQueue.Find(x => x.renderPassEvent == RenderPassEvent.AfterRenderingPostProcessing) != null; - - if (mainLightShadows) - EnqueuePass(m_MainLightShadowCasterPass); - - if (additionalLightShadows) - EnqueuePass(m_AdditionalLightsShadowCasterPass); - - bool requiresDepthCopyPass = !requiresDepthPrepass - && (cameraData.requiresDepthTexture || cameraHasPostProcessingWithDepth || renderPassInputs.requiresDepthTexture) - && createDepthTexture; - - if ((DebugHandler != null) && DebugHandler.IsActiveForCamera(cameraData.isPreviewCamera)) - { - DebugHandler.TryGetFullscreenDebugMode(out var fullScreenMode); - if (fullScreenMode == DebugFullScreenMode.Depth) - { - requiresDepthPrepass = true; - } - - if (!DebugHandler.IsLightingActive) - { - mainLightShadows = false; - additionalLightShadows = false; - - if (!isSceneViewOrPreviewCamera) - { - requiresDepthPrepass = false; - useDepthPriming = false; - generateColorGradingLUT = false; - copyColorPass = false; - requiresDepthCopyPass = false; - } - } - - if (useRenderPassEnabled) - useRenderPassEnabled = DebugHandler.IsRenderPassSupported; - } - - cameraData.renderer.useDepthPriming = useDepthPriming; - - if (deferredLighting) - { - if (m_DeferredLights.UseFramebufferFetch && (RenderPassEvent.AfterRenderingGbuffer == renderPassInputs.requiresDepthNormalAtEvent || !useRenderPassEnabled)) - m_DeferredLights.DisableFramebufferFetchInput(); - } - - // Allocate m_DepthTextureCompatibilityMode if used - if ((deferredLighting && !this.useRenderPassEnabled) || requiresDepthPrepass || requiresDepthCopyPass) - { - var depthDescriptor = cameraTargetDescriptor; - if (requiresDepthPrepass && !deferredLighting) - { - depthDescriptor.graphicsFormat = GraphicsFormat.None; - depthDescriptor.depthStencilFormat = cameraDepthTextureFormat; - } - else - { - depthDescriptor.graphicsFormat = GraphicsFormat.R32_SFloat; - depthDescriptor.depthStencilFormat = GraphicsFormat.None; - } - - depthDescriptor.msaaSamples = 1;// Depth-Only pass don't use MSAA - RenderingUtils.ReAllocateHandleIfNeeded(ref m_DepthTexture, depthDescriptor, FilterMode.Point, wrapMode: TextureWrapMode.Clamp, name: "_CameraDepthTexture"); - - cmd.SetGlobalTexture(m_DepthTexture.name, m_DepthTexture.nameID); - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } - - bool renderingLayerAsGBuffer = deferredLighting && m_DeferredLights.UseRenderingLayers; - - if (requiresRenderingLayer || renderingLayerAsGBuffer) - { - ref var renderingLayersTexture = ref m_DecalLayersTexture; - string renderingLayersTextureName = "_CameraRenderingLayersTexture"; - - if (renderingLayerAsGBuffer) - { - renderingLayersTexture = ref m_DeferredLights.GbufferAttachments[(int)m_DeferredLights.GBufferRenderingLayers]; - renderingLayersTextureName = renderingLayersTexture.name; - } - - var renderingLayersDescriptor = cameraTargetDescriptor; - renderingLayersDescriptor.depthStencilFormat = GraphicsFormat.None; - // Never have MSAA on this depth texture. When doing MSAA depth priming this is the texture that is resolved to and used for post-processing. - if (!renderingLayerProvidesRenderObjectPass) - renderingLayersDescriptor.msaaSamples = 1;// Depth-Only pass don't use MSAA - // Find compatible render-target format for storing normals. - // Shader code outputs normals in signed format to be compatible with deferred gbuffer layout. - // Deferred gbuffer format is signed so that normals can be blended for terrain geometry. - if (renderingLayerAsGBuffer) - renderingLayersDescriptor.graphicsFormat = m_DeferredLights.GetGBufferFormat(m_DeferredLights.GBufferRenderingLayers); // the one used by the gbuffer. - else - renderingLayersDescriptor.graphicsFormat = RenderingLayerUtils.GetFormat(renderingLayerMaskSize); - - if (renderingLayerAsGBuffer) - { - m_DeferredLights.ReAllocateGBufferIfNeeded(renderingLayersDescriptor, (int)m_DeferredLights.GBufferRenderingLayers); - } - else - { - RenderingUtils.ReAllocateHandleIfNeeded(ref renderingLayersTexture, renderingLayersDescriptor, FilterMode.Point, TextureWrapMode.Clamp, name: renderingLayersTextureName); - } - - cmd.SetGlobalTexture(renderingLayersTexture.name, renderingLayersTexture.nameID); - RenderingLayerUtils.SetupProperties(CommandBufferHelpers.GetRasterCommandBuffer(cmd), renderingLayerMaskSize); - if (deferredLighting) // As this is requested by render pass we still want to set it - cmd.SetGlobalTexture("_CameraRenderingLayersTexture", renderingLayersTexture.nameID); - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } - - // Allocate normal texture if used - if (requiresDepthPrepass && renderPassInputs.requiresNormalsTexture) - { - ref var normalsTexture = ref m_NormalsTexture; - string normalsTextureName = DepthNormalOnlyPass.k_CameraNormalsTextureName; - - if (deferredLighting) - { - normalsTexture = ref m_DeferredLights.GbufferAttachments[(int)m_DeferredLights.GBufferNormalSmoothnessIndex]; - normalsTextureName = normalsTexture.name; - } - - var normalDescriptor = cameraTargetDescriptor; - normalDescriptor.depthStencilFormat = GraphicsFormat.None; - // Never have MSAA on this depth texture. When doing MSAA depth priming this is the texture that is resolved to and used for post-processing. - normalDescriptor.msaaSamples = useDepthPriming ? cameraTargetDescriptor.msaaSamples : 1;// Depth-Only passes don't use MSAA, unless depth priming is enabled - // Find compatible render-target format for storing normals. - // Shader code outputs normals in signed format to be compatible with deferred gbuffer layout. - // Deferred gbuffer format is signed so that normals can be blended for terrain geometry. - if (deferredLighting) - normalDescriptor.graphicsFormat = m_DeferredLights.GetGBufferFormat(m_DeferredLights.GBufferNormalSmoothnessIndex); // the one used by the gbuffer. - else - normalDescriptor.graphicsFormat = DepthNormalOnlyPass.GetGraphicsFormat(); - - if (deferredLighting) - { - m_DeferredLights.ReAllocateGBufferIfNeeded(normalDescriptor, (int)m_DeferredLights.GBufferNormalSmoothnessIndex); - } - else - { - RenderingUtils.ReAllocateHandleIfNeeded(ref normalsTexture, normalDescriptor, FilterMode.Point, TextureWrapMode.Clamp, name: normalsTextureName); - } - - cmd.SetGlobalTexture(normalsTexture.name, normalsTexture.nameID); - if (deferredLighting) // As this is requested by render pass we still want to set it - cmd.SetGlobalTexture(DepthNormalOnlyPass.k_CameraNormalsTextureName, normalsTexture.nameID); - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } - - if (requiresDepthPrepass) - { - if (renderPassInputs.requiresNormalsTexture) - { - if (deferredLighting) - { - // In deferred mode, depth-normal prepass does really primes the depth and normal buffers, instead of creating a copy. - // It is necessary because we need to render depth&normal for forward-only geometry and it is the only way - // to get them before the SSAO pass. - - int gbufferNormalIndex = m_DeferredLights.GBufferNormalSmoothnessIndex; - if (m_DeferredLights.UseRenderingLayers) - m_DepthNormalPrepass.Setup(m_ActiveCameraDepthAttachment, m_DeferredLights.GbufferAttachments[gbufferNormalIndex], m_DeferredLights.GbufferAttachments[m_DeferredLights.GBufferRenderingLayers]); - else if (renderingLayerProvidesByDepthNormalPass) - m_DepthNormalPrepass.Setup(m_ActiveCameraDepthAttachment, m_DeferredLights.GbufferAttachments[gbufferNormalIndex], m_DecalLayersTexture); - else - m_DepthNormalPrepass.Setup(m_ActiveCameraDepthAttachment, m_DeferredLights.GbufferAttachments[gbufferNormalIndex]); - - // Only render forward-only geometry, as standard geometry will be rendered as normal into the gbuffer. - if (RenderPassEvent.AfterRenderingGbuffer <= renderPassInputs.requiresDepthNormalAtEvent && - renderPassInputs.requiresDepthNormalAtEvent <= RenderPassEvent.BeforeRenderingOpaques) - m_DepthNormalPrepass.shaderTagIds = k_DepthNormalsOnly; - } - else - { - if (renderingLayerProvidesByDepthNormalPass) - m_DepthNormalPrepass.Setup(m_DepthTexture, m_NormalsTexture, m_DecalLayersTexture); - else - m_DepthNormalPrepass.Setup(m_DepthTexture, m_NormalsTexture); - } - - EnqueuePass(m_DepthNormalPrepass); - } - else - { - // Deferred renderers does not require a depth-prepass to generate samplable depth texture. - if (!deferredLighting) - { - m_DepthPrepass.Setup(cameraTargetDescriptor, m_DepthTexture); - EnqueuePass(m_DepthPrepass); - } - } - } - - // depth priming still needs to copy depth because the prepass doesn't target anymore CameraDepthTexture - // TODO: this is unoptimal, investigate optimizations - if (useDepthPriming) - { - m_PrimedDepthCopyPass.Setup(m_ActiveCameraDepthAttachment, m_DepthTexture); - EnqueuePass(m_PrimedDepthCopyPass); - } - - if (generateColorGradingLUT) - { - colorGradingLutPass.ConfigureDescriptor(in postProcessingData, out var desc, out var filterMode); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_PostProcessPasses.m_ColorGradingLut, desc, filterMode, TextureWrapMode.Clamp, anisoLevel: 0, name: "_InternalGradingLut"); - colorGradingLutPass.Setup(colorGradingLut); - EnqueuePass(colorGradingLutPass); - } - -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.hasValidOcclusionMesh) - EnqueuePass(m_XROcclusionMeshPass); -#endif - - bool lastCameraInTheStack = cameraData.resolveFinalTarget; - - if (deferredLighting) - { - if (m_DeferredLights.UseFramebufferFetch && (RenderPassEvent.AfterRenderingGbuffer == renderPassInputs.requiresDepthNormalAtEvent || !useRenderPassEnabled)) - m_DeferredLights.DisableFramebufferFetchInput(); - - EnqueueDeferred(cameraData.cameraTargetDescriptor, requiresDepthPrepass, renderPassInputs.requiresNormalsTexture, renderingLayerProvidesByDepthNormalPass, mainLightShadows, additionalLightShadows); - } - else - { - // Optimized store actions are very important on tile based GPUs and have a great impact on performance. - // if MSAA is enabled and any of the following passes need a copy of the color or depth target, make sure the MSAA'd surface is stored - // if following passes won't use it then just resolve (the Resolve action will still store the resolved surface, but discard the MSAA'd surface, which is very expensive to store). - RenderBufferStoreAction opaquePassColorStoreAction = RenderBufferStoreAction.Store; - if (cameraTargetDescriptor.msaaSamples > 1) - opaquePassColorStoreAction = copyColorPass ? RenderBufferStoreAction.StoreAndResolve : RenderBufferStoreAction.Store; - - - // make sure we store the depth only if following passes need it. - RenderBufferStoreAction opaquePassDepthStoreAction = (copyColorPass || requiresDepthCopyPass || !lastCameraInTheStack) ? RenderBufferStoreAction.Store : RenderBufferStoreAction.DontCare; -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled && cameraData.xr.copyDepth) - { - opaquePassDepthStoreAction = RenderBufferStoreAction.Store; - } -#endif - - // handle multisample depth resolve by setting the appropriate store actions if supported - if (requiresDepthCopyPass && cameraTargetDescriptor.msaaSamples > 1 && RenderingUtils.MultisampleDepthResolveSupported()) - { - bool isCopyDepthAfterTransparent = m_CopyDepthPass.renderPassEvent == RenderPassEvent.AfterRenderingTransparents; - - // we could StoreAndResolve when the depth copy is after opaque, but performance wise doing StoreAndResolve of depth targets is more expensive than a simple Store + following depth copy pass on Apple GPUs, - // because of the extra resolve step. So, unless we are copying the depth after the transparent pass, just Store the depth target. - if (isCopyDepthAfterTransparent && !copyColorPass) - { - if (opaquePassDepthStoreAction == RenderBufferStoreAction.Store) - opaquePassDepthStoreAction = RenderBufferStoreAction.StoreAndResolve; - else if (opaquePassDepthStoreAction == RenderBufferStoreAction.DontCare) - opaquePassDepthStoreAction = RenderBufferStoreAction.Resolve; - } - } - - DrawObjectsPass renderOpaqueForwardPass = null; - if (renderingLayerProvidesRenderObjectPass) - { - renderOpaqueForwardPass = m_RenderOpaqueForwardWithRenderingLayersPass; - m_RenderOpaqueForwardWithRenderingLayersPass.Setup(m_ActiveCameraColorAttachment, m_DecalLayersTexture, m_ActiveCameraDepthAttachment); - } - else - renderOpaqueForwardPass = m_RenderOpaqueForwardPass; - - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - renderOpaqueForwardPass.ConfigureColorStoreAction(opaquePassColorStoreAction); - renderOpaqueForwardPass.ConfigureDepthStoreAction(opaquePassDepthStoreAction); -#pragma warning restore CS0618 - - // If there is any custom render pass renders to opaque pass' target before opaque pass, - // we can't clear color as it contains the valid rendering output. - bool hasPassesBeforeOpaque = activeRenderPassQueue.Find(x => (x.renderPassEvent <= RenderPassEvent.BeforeRenderingOpaques) && !x.overrideCameraTarget) != null; - ClearFlag opaqueForwardPassClearFlag = (hasPassesBeforeOpaque || cameraData.renderType != CameraRenderType.Base || camera.clearFlags == CameraClearFlags.Nothing) - ? ClearFlag.None - : ClearFlag.Color; -#if ENABLE_VR && ENABLE_XR_MODULE - // workaround for DX11 and DX12 XR test failures. - // XRTODO: investigate DX XR clear issues. - if (SystemInfo.usesLoadStoreActions) -#endif - { - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - renderOpaqueForwardPass.ConfigureClear(opaqueForwardPassClearFlag, Color.black); -#pragma warning restore CS0618 - } - - EnqueuePass(renderOpaqueForwardPass); - } - - if (camera.clearFlags == CameraClearFlags.Skybox && cameraData.renderType != CameraRenderType.Overlay) - { - if (RenderSettings.skybox != null || (camera.TryGetComponent(out Skybox cameraSkybox) && cameraSkybox.material != null)) - EnqueuePass(m_DrawSkyboxPass); - } - - // If a depth texture was created we necessarily need to copy it, otherwise we could have render it to a renderbuffer. - // 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 && !(deferredLighting && useRenderPassEnabled && !renderPassInputs.requiresDepthTexture)) - { - m_CopyDepthPass.Setup(m_ActiveCameraDepthAttachment, m_DepthTexture); - EnqueuePass(m_CopyDepthPass); - } - - // Set the depth texture to the far Z if we do not have a depth prepass or copy depth - // Don't do this for Overlay cameras to not lose depth data in between cameras (as Base is guaranteed to be first) - if (cameraData.renderType == CameraRenderType.Base && !requiresDepthPrepass && !requiresDepthCopyPass) - Shader.SetGlobalTexture("_CameraDepthTexture", SystemInfo.usesReversedZBuffer ? Texture2D.blackTexture : Texture2D.whiteTexture); - - if (copyColorPass) - { - // TODO: Downsampling method should be stored in the renderer instead of in the asset. - // We need to migrate this data to renderer. For now, we query the method in the active asset. - Downsampling downsamplingMethod = UniversalRenderPipeline.asset.opaqueDownsampling; - var descriptor = cameraTargetDescriptor; - CopyColorPass.ConfigureDescriptor(downsamplingMethod, ref descriptor, out var filterMode); - - RenderingUtils.ReAllocateHandleIfNeeded(ref m_OpaqueColor, descriptor, filterMode, TextureWrapMode.Clamp, name: "_CameraOpaqueTexture"); - m_CopyColorPass.Setup(m_ActiveCameraColorAttachment, m_OpaqueColor, downsamplingMethod); - EnqueuePass(m_CopyColorPass); - } - - // Motion vectors - if (renderPassInputs.requiresMotionVectors) - { - var colorDesc = cameraTargetDescriptor; - colorDesc.graphicsFormat = MotionVectorRenderPass.k_TargetFormat; - colorDesc.depthStencilFormat = GraphicsFormat.None; - colorDesc.msaaSamples = 1; // Disable MSAA, consider a pixel resolve for half left velocity and half right velocity --> no velocity, which is untrue. - RenderingUtils.ReAllocateHandleIfNeeded(ref m_MotionVectorColor, colorDesc, FilterMode.Point, TextureWrapMode.Clamp, name: MotionVectorRenderPass.k_MotionVectorTextureName); - - var depthDescriptor = cameraTargetDescriptor; - depthDescriptor.graphicsFormat = GraphicsFormat.None; - depthDescriptor.depthStencilFormat = cameraTargetDescriptor.depthStencilFormat; - depthDescriptor.msaaSamples = 1; - RenderingUtils.ReAllocateHandleIfNeeded(ref m_MotionVectorDepth, depthDescriptor, FilterMode.Point, TextureWrapMode.Clamp, name: MotionVectorRenderPass.k_MotionVectorDepthTextureName); - - MotionVectorRenderPass.SetMotionVectorGlobalMatrices(cmd, cameraData); - - m_MotionVectorPass.Setup(m_MotionVectorColor, m_MotionVectorDepth); - EnqueuePass(m_MotionVectorPass); - } - -#if UNITY_EDITOR - // this needs to be before transparency - m_ProbeVolumeDebugPass.Setup(m_DepthTexture, m_NormalsTexture); - EnqueuePass(m_ProbeVolumeDebugPass); -#endif -#if ENABLE_ADAPTIVE_PERFORMANCE - if (needTransparencyPass) -#endif - { - if (transparentsNeedSettingsPass) - { - EnqueuePass(m_TransparentSettingsPass); - } - - // if this is not lastCameraInTheStack we still need to Store, since the MSAA buffer might be needed by the Overlay cameras - RenderBufferStoreAction transparentPassColorStoreAction = cameraTargetDescriptor.msaaSamples > 1 && lastCameraInTheStack && !isPreviewCamera ? RenderBufferStoreAction.Resolve : RenderBufferStoreAction.Store; - RenderBufferStoreAction transparentPassDepthStoreAction = lastCameraInTheStack ? RenderBufferStoreAction.DontCare : RenderBufferStoreAction.Store; - - // If CopyDepthPass pass event is scheduled on or after AfterRenderingTransparent, we will need to store the depth buffer or resolve (store for now until latest trunk has depth resolve support) it for MSAA case - if (requiresDepthCopyPass && m_CopyDepthPass.renderPassEvent >= RenderPassEvent.AfterRenderingTransparents) - { - transparentPassDepthStoreAction = RenderBufferStoreAction.Store; - - // handle depth resolve on platforms supporting it - if (cameraTargetDescriptor.msaaSamples > 1 && RenderingUtils.MultisampleDepthResolveSupported()) - transparentPassDepthStoreAction = RenderBufferStoreAction.Resolve; - } - - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - m_RenderTransparentForwardPass.ConfigureColorStoreAction(transparentPassColorStoreAction); - m_RenderTransparentForwardPass.ConfigureDepthStoreAction(transparentPassDepthStoreAction); -#pragma warning restore CS0618 - EnqueuePass(m_RenderTransparentForwardPass); - } - EnqueuePass(m_OnRenderObjectCallbackPass); - -#if VISUAL_EFFECT_GRAPH_0_0_1_OR_NEWER - // SetupVFXCameraBuffer will interrogate VFXManager to automatically enable RequestAccess on RawColor and/or RawDepth. This must be done before SetupRawColorDepthHistory. - // SetupVFXCameraBuffer will also provide the GetCurrentTexture from history manager to the VFXManager which can be sampled during the next VFX.Update for the following frame. - SetupVFXCameraBuffer(cameraData); -#endif - - // "Raw render" color/depth history. - // Should include opaque and transparent geometry before TAA or any post-processing effects. No UI overlays etc. - SetupRawColorDepthHistory(cameraData, ref cameraTargetDescriptor); - - bool shouldRenderUI = cameraData.rendersOverlayUI; - bool outputToHDR = cameraData.isHDROutputActive; - if (shouldRenderUI && outputToHDR) - { - m_DrawOffscreenUIPass.Setup(cameraData, cameraDepthTextureFormat); - EnqueuePass(m_DrawOffscreenUIPass); - } - - bool hasCaptureActions = cameraData.captureActions != null && lastCameraInTheStack; - - // When FXAA or scaling is active, we must perform an additional pass at the end of the frame for the following reasons: - // 1. FXAA expects to be the last shader running on the image before it's presented to the screen. Since users are allowed - // to add additional render passes after post processing occurs, we can't run FXAA until all of those passes complete as well. - // The FinalPost pass is guaranteed to execute after user authored passes so FXAA is always run inside of it. - // 2. UberPost can only handle upscaling with linear filtering. All other filtering methods require the FinalPost pass. - // 3. TAA sharpening using standalone RCAS pass is required. (When upscaling is not enabled). - bool applyFinalPostProcessing = anyPostProcessing && lastCameraInTheStack && - ((cameraData.antialiasing == AntialiasingMode.FastApproximateAntialiasing) || - ((cameraData.imageScalingMode == ImageScalingMode.Upscaling) && (cameraData.upscalingFilter != ImageUpscalingFilter.Linear)) || - (cameraData.IsTemporalAAEnabled() && cameraData.taaSettings.contrastAdaptiveSharpening > 0.0f)) && - (DebugHandler == null || (DebugHandler != null && DebugHandler.IsPostProcessingAllowed)); - - // When post-processing is enabled we can use the stack to resolve rendering to camera target (screen or RT). - // However when there are render passes executing after post we avoid resolving to screen so rendering continues (before sRGBConversion etc) - bool resolvePostProcessingToCameraTarget = !hasCaptureActions && !hasPassesAfterPostProcessing && !applyFinalPostProcessing; - bool needsColorEncoding = DebugHandler == null || !DebugHandler.HDRDebugViewIsActive(cameraData.resolveFinalTarget); - - if (applyPostProcessing) - { - var desc = CompatibilityMode.PostProcessPass.GetCompatibleDescriptor(cameraTargetDescriptor, cameraTargetDescriptor.width, cameraTargetDescriptor.height, cameraTargetDescriptor.graphicsFormat, GraphicsFormat.None); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_PostProcessPasses.m_AfterPostProcessColor, desc, FilterMode.Point, TextureWrapMode.Clamp, name: "_AfterPostProcessTexture"); - } - - if (lastCameraInTheStack) - { - SetupFinalPassDebug(cameraData); - - // Post-processing will resolve to final target. No need for final blit pass. - if (applyPostProcessing) - { - // if resolving to screen we need to be able to perform sRGBConversion in post-processing if necessary - bool doSRGBEncoding = resolvePostProcessingToCameraTarget && needsColorEncoding; - postProcessPass.Setup(cameraTargetDescriptor, m_ActiveCameraColorAttachment, resolvePostProcessingToCameraTarget, m_ActiveCameraDepthAttachment, colorGradingLut, m_MotionVectorColor, applyFinalPostProcessing, doSRGBEncoding); - EnqueuePass(postProcessPass); - } - - var sourceForFinalPass = m_ActiveCameraColorAttachment; - - // Do FXAA or any other final post-processing effect that might need to run after AA. - if (applyFinalPostProcessing) - { - finalPostProcessPass.SetupFinalPass(sourceForFinalPass, true, needsColorEncoding); - EnqueuePass(finalPostProcessPass); - } - - if (cameraData.captureActions != null) - { - EnqueuePass(m_CapturePass); - } - - // if post-processing then we already resolved to camera target while doing post. - // Also only do final blit if camera is not rendering to RT. - bool cameraTargetResolved = - // final PP always blit to camera target - applyFinalPostProcessing || - // no final PP but we have PP stack. In that case it blit unless there are render pass after PP - (applyPostProcessing && !hasPassesAfterPostProcessing && !hasCaptureActions) || - // offscreen camera rendering to a texture, we don't need a blit pass to resolve to screen - m_ActiveCameraColorAttachment.nameID == m_TargetColorHandle.nameID; - - // We need final blit to resolve to screen - if (!cameraTargetResolved) - { - m_FinalBlitPass.Setup(cameraTargetDescriptor, sourceForFinalPass); - EnqueuePass(m_FinalBlitPass); - } - - // We can explicitely render the overlay UI from URP when HDR output is not enabled. - // SupportedRenderingFeatures.active.rendersUIOverlay should also be set to true. - if (shouldRenderUI && cameraData.isLastBaseCamera && !outputToHDR) - { - EnqueuePass(m_DrawOverlayUIPass); - } - -#if ENABLE_VR && ENABLE_XR_MODULE - if (cameraData.xr.enabled) - { - // active depth is depth target, we don't need a blit pass to resolve - bool depthTargetResolved = m_ActiveCameraDepthAttachment.nameID == cameraData.xr.renderTarget; - - if (!depthTargetResolved && cameraData.xr.copyDepth) - { - m_XRCopyDepthPass.Setup(m_ActiveCameraDepthAttachment, m_TargetDepthHandle); - m_XRCopyDepthPass.CopyToDepthXR = true; - EnqueuePass(m_XRCopyDepthPass); - } - } -#endif - } - // stay in RT so we resume rendering on stack after post-processing - else if (applyPostProcessing) - { - postProcessPass.Setup(cameraTargetDescriptor, m_ActiveCameraColorAttachment, false, m_ActiveCameraDepthAttachment, colorGradingLut, m_MotionVectorColor, false, false); - EnqueuePass(postProcessPass); - } - -#if UNITY_EDITOR - if (isSceneViewOrPreviewCamera || (isGizmosEnabled && lastCameraInTheStack)) - { - // Scene view camera should always resolve target (not stacked) - m_FinalDepthCopyPass.Setup(m_DepthTexture, k_CameraTarget); - m_FinalDepthCopyPass.MsaaSamples = 0; - m_FinalDepthCopyPass.CopyToBackbuffer = cameraData.isGameCamera; - // Turning off unnecessary NRP in Editor because of MSAA mistmatch between CameraTargetDescriptor vs camera backbuffer - // NRP layer considers this being a pass with MSAA samples by checking CameraTargetDescriptor taken from RP asset - // while the camera backbuffer has a single sample - m_FinalDepthCopyPass.useNativeRenderPass = false; - EnqueuePass(m_FinalDepthCopyPass); - } -#endif - } -#endif - static void SetupVFXCameraBuffer(UniversalCameraData cameraData) { if (cameraData != null && cameraData.historyManager != null) @@ -1657,89 +539,6 @@ static void SetupVFXCameraBuffer(UniversalCameraData cameraData) } } -#if URP_COMPATIBILITY_MODE - // "Raw render" color/depth history. - // Should include opaque and transparent geometry before TAA or any post-processing effects. No UI overlays etc. - void SetupRawColorDepthHistory(UniversalCameraData cameraData, ref RenderTextureDescriptor cameraTargetDescriptor) - { - if (cameraData != null && cameraData.historyManager != null) - { - var history = cameraData.historyManager; - - bool xrMultipassEnabled = false; - int multipassId = 0; -#if ENABLE_VR && ENABLE_XR_MODULE - xrMultipassEnabled = cameraData.xr.enabled && !cameraData.xr.singlePassEnabled; - multipassId = cameraData.xr.multipassId; -#endif - - // m_ActiveCameraColorAttachmentCompatibilityMode will be used as source and cast to a Texture. - // Casting empty handle to Texture asserts, so it can't be used for checking null. - // RTHandle could also be set from an external Texture. However it can't be null checked without casting. - // It is assumed that checking the RenderTexture for active color attachment is enough. - if (history.IsAccessRequested() && m_ActiveCameraColorAttachment?.rt != null) - { - var colorHistory = history.GetHistoryForWrite(); - if (colorHistory != null) - { - colorHistory.Update(ref cameraTargetDescriptor, xrMultipassEnabled); - if (colorHistory.GetCurrentTexture(multipassId) != null) - { - m_HistoryRawColorCopyPass.Setup(m_ActiveCameraColorAttachment, colorHistory.GetCurrentTexture(multipassId), Downsampling.None); - // See pass creation for actual execution order. - EnqueuePass(m_HistoryRawColorCopyPass); - } - } - } - - if (history.IsAccessRequested() && m_ActiveCameraDepthAttachment?.rt != null) - { - var depthHistory = history.GetHistoryForWrite(); - if (depthHistory != null) - { - if (m_HistoryRawDepthCopyPass.CopyToDepth == false) - { - // Fall back to R32_Float if depth copy is disabled. - var tempColorDepthDesc = cameraTargetDescriptor; - tempColorDepthDesc.colorFormat = RenderTextureFormat.RFloat; - tempColorDepthDesc.graphicsFormat = GraphicsFormat.R32_SFloat; - tempColorDepthDesc.depthStencilFormat = GraphicsFormat.None; - depthHistory.Update(ref tempColorDepthDesc, xrMultipassEnabled); - } - else - { - var tempColorDepthDesc = cameraData.cameraTargetDescriptor; - tempColorDepthDesc.graphicsFormat = GraphicsFormat.None; - depthHistory.Update(ref tempColorDepthDesc, xrMultipassEnabled); - } - - if (depthHistory.GetCurrentTexture(multipassId) != null) - { - m_HistoryRawDepthCopyPass.Setup(m_ActiveCameraDepthAttachment, depthHistory.GetCurrentTexture(multipassId)); - // See pass creation for actual execution order. - EnqueuePass(m_HistoryRawDepthCopyPass); - } - } - } - } - } - - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - public override void SetupLights(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - - m_ForwardLights.SetupLights(CommandBufferHelpers.GetUnsafeCommandBuffer(renderingData.commandBuffer), - universalRenderingData, cameraData, lightData); - - if (usesDeferredLighting) - m_DeferredLights.SetupLights(renderingData.commandBuffer, cameraData, new Vector2Int(cameraData.cameraTargetDescriptor.width, cameraData.cameraTargetDescriptor.height), lightData); - } -#endif - /// public override void SetupCullingParameters(ref ScriptableCullingParameters cullingParameters, ref CameraData cameraData) @@ -1793,50 +592,8 @@ public override void SetupCullingParameters(ref ScriptableCullingParameters cull /// public override void FinishRendering(CommandBuffer cmd) { -#if URP_COMPATIBILITY_MODE - m_ColorBufferSystem.Clear(); - m_ActiveCameraColorAttachment = null; - m_ActiveCameraDepthAttachment = null; -#endif } -#if URP_COMPATIBILITY_MODE - void EnqueueDeferred(RenderTextureDescriptor cameraTargetDescriptor, bool hasDepthPrepass, bool hasNormalPrepass, bool hasRenderingLayerPrepass, bool applyMainShadow, bool applyAdditionalShadow) - { - m_DeferredLights.Setup( - applyAdditionalShadow ? m_AdditionalLightsShadowCasterPass : null, - hasDepthPrepass, - hasNormalPrepass, - hasRenderingLayerPrepass, - m_DepthTexture, - m_ActiveCameraDepthAttachment, - m_ActiveCameraColorAttachment - ); - // Need to call Configure for both of these passes to setup input attachments as first frame otherwise will raise errors - if (useRenderPassEnabled && m_DeferredLights.UseFramebufferFetch) - { - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - m_GBufferPass.Configure(null, cameraTargetDescriptor); - m_DeferredPass.Configure(null, cameraTargetDescriptor); -#pragma warning restore CS0618 - } - - EnqueuePass(m_GBufferPass); - - //Must copy depth for deferred shading: TODO wait for API fix to bind depth texture as read-only resource. - if (!useRenderPassEnabled || !m_DeferredLights.UseFramebufferFetch) - { - m_GBufferCopyDepthPass.Setup(m_CameraDepthAttachment, m_DepthTexture); - EnqueuePass(m_GBufferCopyDepthPass); - } - - EnqueuePass(m_DeferredPass); - - EnqueuePass(m_RenderOpaqueForwardOnlyPass); - } -#endif - struct RenderPassInputSummary { internal bool requiresDepthTexture; @@ -1906,72 +663,7 @@ static RenderPassInputSummary GetRenderPassInputs(bool isTemporalAAEnabled, bool return inputSummary; } - -#if URP_COMPATIBILITY_MODE - void CreateCameraRenderTarget(ScriptableRenderContext context, ref RenderTextureDescriptor descriptor, CommandBuffer cmd, UniversalCameraData cameraData) - { - using (new ProfilingScope(ProfilingCompatibilityMode.createCameraRenderTarget)) - { - if (m_ColorBufferSystem.PeekBackBuffer() == null || m_ColorBufferSystem.PeekBackBuffer().nameID != BuiltinRenderTextureType.CameraTarget) - { - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - m_ActiveCameraColorAttachment = m_ColorBufferSystem.GetBackBuffer(cmd); - ConfigureCameraColorTarget(m_ActiveCameraColorAttachment); -#pragma warning restore CS0618 - - cmd.SetGlobalTexture("_CameraColorTexture", m_ActiveCameraColorAttachment.nameID); - //Set _AfterPostProcessTexture, users might still rely on this although it is now always the cameratarget due to swapbuffer - cmd.SetGlobalTexture("_AfterPostProcessTexture", m_ActiveCameraColorAttachment.nameID); - } - - if (m_CameraDepthAttachment == null || m_CameraDepthAttachment.nameID != BuiltinRenderTextureType.CameraTarget) - { - var depthDescriptor = descriptor; - depthDescriptor.useMipMap = false; - depthDescriptor.autoGenerateMips = false; - depthDescriptor.bindMS = false; - - bool hasMSAA = depthDescriptor.msaaSamples > 1 && (SystemInfo.supportsMultisampledTextures != 0); - - // if MSAA is enabled and we are not resolving depth, which we only do if the CopyDepthPass is AfterTransparents, - // then we want to bind the multisampled surface. - if (hasMSAA) - { - // if depth priming is enabled the copy depth primed pass is meant to do the MSAA resolve, so we want to bind the MS surface - if (IsDepthPrimingEnabled(cameraData)) - depthDescriptor.bindMS = true; - else - depthDescriptor.bindMS = !(RenderingUtils.MultisampleDepthResolveSupported() && m_CopyDepthMode == CopyDepthMode.AfterTransparents); - } - - // binding MS surfaces is not supported by the GLES backend, and it won't be fixed after investigating - // the high performance impact of potential fixes, which would make it more expensive than depth prepass (fogbugz 1339401 for more info) - if (IsGLESDevice()) - depthDescriptor.bindMS = false; - - depthDescriptor.graphicsFormat = GraphicsFormat.None; - depthDescriptor.depthStencilFormat = cameraDepthAttachmentFormat; - RenderingUtils.ReAllocateHandleIfNeeded(ref m_CameraDepthAttachment, depthDescriptor, FilterMode.Point, TextureWrapMode.Clamp, name: "_CameraDepthAttachment"); - - if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Direct3D11) - { - RenderingUtils.ReAllocateHandleIfNeeded(ref m_CameraDepthAttachment_D3d_11, depthDescriptor, FilterMode.Point, TextureWrapMode.Clamp, name: "_CameraDepthAttachment_Temp"); - cmd.SetGlobalTexture(m_CameraDepthAttachment.name, m_CameraDepthAttachment_D3d_11.nameID); - } - else - cmd.SetGlobalTexture(m_CameraDepthAttachment.name, m_CameraDepthAttachment.nameID); - - // update the descriptor to match the depth attachment - descriptor.depthStencilFormat = depthDescriptor.depthStencilFormat; - } - } - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - } -#endif - + internal static bool PlatformRequiresExplicitMsaaResolve() { #if UNITY_EDITOR @@ -2070,45 +762,5 @@ static bool CanCopyDepth(UniversalCameraData cameraData) return supportsDepthCopy || msaaDepthResolve; } - -#if URP_COMPATIBILITY_MODE - internal override void SwapColorBuffer(CommandBuffer cmd) - { - m_ColorBufferSystem.Swap(); - - // Disable obsolete warning for internal usage -#pragma warning disable CS0618 - //Check if we are using the depth that is attached to color buffer - if (m_ActiveCameraDepthAttachment.nameID != BuiltinRenderTextureType.CameraTarget) - ConfigureCameraTarget(m_ColorBufferSystem.GetBackBuffer(cmd), m_ActiveCameraDepthAttachment); - else - ConfigureCameraColorTarget(m_ColorBufferSystem.GetBackBuffer(cmd)); -#pragma warning restore CS0618 - - m_ActiveCameraColorAttachment = m_ColorBufferSystem.GetBackBuffer(cmd); - cmd.SetGlobalTexture("_CameraColorTexture", m_ActiveCameraColorAttachment.nameID); - //Set _AfterPostProcessTexture, users might still rely on this although it is now always the cameratarget due to swapbuffer - cmd.SetGlobalTexture("_AfterPostProcessTexture", m_ActiveCameraColorAttachment.nameID); - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal override RTHandle GetCameraColorFrontBuffer(CommandBuffer cmd) - { - return m_ColorBufferSystem.GetFrontBuffer(cmd); - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsoleteFrom2023_3)] - internal override RTHandle GetCameraColorBackBuffer(CommandBuffer cmd) - { - return m_ColorBufferSystem.GetBackBuffer(cmd); - } - - internal override void EnableSwapBufferMSAA(bool enable) - { - m_ColorBufferSystem.EnableMSAA(enable); - } -#endif - - internal override bool supportsNativeRenderPassRendergraphCompiler => true; } } diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/BlitToRTHandle/BlitToRTHandlePass.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/BlitToRTHandle/BlitToRTHandlePass.cs index 33fbaa598c1..827535da3ed 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/BlitToRTHandle/BlitToRTHandlePass.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/BlitToRTHandle/BlitToRTHandlePass.cs @@ -25,45 +25,6 @@ public BlitToRTHandlePass(RenderPassEvent evt, Material mat) m_Material = mat; } -#if URP_COMPATIBILITY_MODE // Compatibility Mode is being removed -#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member - - // Unity calls the Configure method in the Compatibility mode (non-RenderGraph path) - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - // Configure the custom RTHandle - var desc = cameraTextureDescriptor; - desc.depthBufferBits = 0; - desc.msaaSamples = 1; - RenderingUtils.ReAllocateIfNeeded(ref m_OutputHandle, desc, FilterMode.Bilinear, TextureWrapMode.Clamp, name: k_OutputName ); - - // Set the RTHandle as the output target in the Compatibility mode - ConfigureTarget(m_OutputHandle); - } - - // Unity calls the Execute method in the Compatibility mode - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - // Set camera color as the input - m_InputHandle = renderingData.cameraData.renderer.cameraColorTargetHandle; - - CommandBuffer cmd = CommandBufferPool.Get(); - using (new ProfilingScope(cmd, m_ProfilingSampler)) - { - // Blit the input RTHandle to the output one - Blitter.BlitCameraTexture(cmd, m_InputHandle, m_OutputHandle, m_Material, 0); - - // Make the output texture available for the shaders in the scene - cmd.SetGlobalTexture(m_OutputId, m_OutputHandle.nameID); - } - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - CommandBufferPool.Release(cmd); - } - -#pragma warning restore 618, 672 -#endif - // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitCopyDepthPass.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitCopyDepthPass.cs index c8bf2fb8c51..40c98cedd19 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitCopyDepthPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitCopyDepthPass.cs @@ -49,52 +49,6 @@ public DepthBlitCopyDepthPass(RenderPassEvent evt, Shader copyDepthShader, m_Keyword_OutputDepth = GlobalKeyword.Create(ShaderKeywordStrings._OUTPUT_DEPTH); } -#if URP_COMPATIBILITY_MODE // Compatibility Mode is being removed -#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member - - // Set the RTHandle as the output target in the Compatibility mode. - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - // Create an RTHandle for storing the depth - RenderingUtils.ReAllocateHandleIfNeeded(ref depthRT, m_Desc, m_FilterMode, m_WrapMode, name: m_Name ); - ConfigureTarget(depthRT); - } - - // Unity calls the Execute method in the Compatibility mode - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cameraData = renderingData.cameraData; - if (cameraData.camera.cameraType != CameraType.Game) - return; - - // Bind the depth buffer to material - RTHandle source = cameraData.renderer.cameraDepthTargetHandle; - m_CopyDepthMaterial.SetTexture(m_DepthBufferId, source); - - CommandBuffer cmd = CommandBufferPool.Get(); - using (new ProfilingScope(cmd, m_ProfilingSampler)) - { - // Enable an MSAA shader keyword based on the source texture MSAA sample count. - int cameraSamples = source.rt.antiAliasing; - cmd.SetKeyword(m_Keyword_DepthMsaa2, cameraSamples == 2); - cmd.SetKeyword(m_Keyword_DepthMsaa4, cameraSamples == 4); - cmd.SetKeyword(m_Keyword_DepthMsaa8, cameraSamples == 8); - - // This example does not copy the depth values back to the depth buffer, so we disable this keyword. - cmd.SetKeyword(m_Keyword_OutputDepth, false); - - // Perform the blit operation - Blitter.BlitTexture(cmd, source, m_ScaleBias, m_CopyDepthMaterial, 0); - } - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - CommandBufferPool.Release(cmd); - } - -#pragma warning restore 618, 672 -#endif - // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitDepthOnlyPass.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitDepthOnlyPass.cs index 30529934c39..2d030ece87e 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitDepthOnlyPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitDepthOnlyPass.cs @@ -33,47 +33,6 @@ public DepthBlitDepthOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueR m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask); } -#if URP_COMPATIBILITY_MODE // Compatibility Mode is being removed -#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member - - // Unity calls the Configure method in the Compatibility mode (non-RenderGraph path) - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) - { - // Create an RTHandle for storing the depth - RenderingUtils.ReAllocateHandleIfNeeded(ref depthRT, m_Desc, m_FilterMode, m_WrapMode, name: m_Name ); - ConfigureTarget(depthRT); - } - - // Unity calls the Execute method in the Compatibility mode - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cameraData = renderingData.cameraData; - if (cameraData.camera.cameraType != CameraType.Game) - return; - - // Setup the RendererList for drawing objects with the shader tag "DepthOnly". - var sortFlags = cameraData.defaultOpaqueSortFlags; - var drawSettings = RenderingUtils.CreateDrawingSettings(k_ShaderTagId, ref renderingData, sortFlags); - drawSettings.perObjectData = PerObjectData.None; - RendererListParams param = new RendererListParams(renderingData.cullResults, drawSettings, m_FilteringSettings); - param.filteringSettings.batchLayerMask = uint.MaxValue; - RendererList rendererList = context.CreateRendererList(ref param); - - CommandBuffer cmd = CommandBufferPool.Get(); - using (new ProfilingScope(cmd, m_ProfilingSampler)) - { - cmd.ClearRenderTarget(true,false, Color.black); - cmd.DrawRendererList(rendererList); - } - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - CommandBufferPool.Release(cmd); - } - -#pragma warning restore 618, 672 -#endif - // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitEdgePass.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitEdgePass.cs index c901673578b..faad002cfa6 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitEdgePass.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DepthBlit/DepthBlitEdgePass.cs @@ -22,35 +22,6 @@ public void SetRTHandle(ref RTHandle depthHandle) m_DepthHandle = depthHandle; } -#if URP_COMPATIBILITY_MODE // Compatibility Mode is being removed -#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member - - // Unity calls the Execute method in the Compatibility mode - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cameraData = renderingData.cameraData; - if (cameraData.camera.cameraType != CameraType.Game) - return; - - if (m_DepthHandle == null) - return; - - RTHandle destination = cameraData.renderer.cameraColorTargetHandle; - - CommandBuffer cmd = CommandBufferPool.Get(); - using (new ProfilingScope(cmd, m_ProfilingSampler)) - { - Blitter.BlitCameraTexture(cmd, m_DepthHandle, destination, m_Material, 0); - } - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - CommandBufferPool.Release(cmd); - } - -#pragma warning restore 618, 672 -#endif - // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_CopyColor.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_CopyColor.cs index 513d304ccc6..d8e1e371a13 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_CopyColor.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_CopyColor.cs @@ -25,40 +25,6 @@ public void SetRTHandles(ref RTHandle dest, int slice) m_Material = Blitter.GetBlitMaterial(TextureDimension.Tex2DArray); } -#if URP_COMPATIBILITY_MODE // Compatibility Mode is being removed -#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member - - // Unity calls the Configure method in the Compatibility mode (non-RenderGraph path) - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescripor) - { - ConfigureTarget(m_OutputHandle); - } - - // Unity calls the Execute method in the Compatibility mode - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cameraData = renderingData.cameraData; - if (cameraData.camera.cameraType != CameraType.Game) - return; - - RTHandle source = cameraData.renderer.cameraColorTargetHandle; - - Vector2 viewportScale = source.useScaling ? new Vector2(source.rtHandleProperties.rtHandleScale.x, source.rtHandleProperties.rtHandleScale.y) : Vector2.one; - - CommandBuffer cmd = CommandBufferPool.Get(); - using (new ProfilingScope(cmd, m_ProfilingSampler)) - { - CoreUtils.SetRenderTarget(cmd, m_OutputHandle, depthSlice: m_Slice); - Blitter.BlitTexture(cmd, source, viewportScale, m_Material, 0); - } - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - CommandBufferPool.Release(cmd); - } - -#pragma warning restore 618, 672 -#endif - // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Distort.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Distort.cs index ae9d2f261cd..cfb2aca45ea 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Distort.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Distort.cs @@ -25,39 +25,6 @@ public void SetRTHandles(ref RTHandle srcRT) m_DistortTunnelTexHandle = srcRT; } -#if URP_COMPATIBILITY_MODE // Compatibility Mode is being removed -#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member - - // Unity calls the OnCameraSetup method in the Compatibility mode (non-RenderGraph path) - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - m_OutputHandle = renderingData.cameraData.renderer.cameraColorTargetHandle; - ConfigureTarget(m_OutputHandle); - } - - // Unity calls the Execute method in the Compatibility mode - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cameraData = renderingData.cameraData; - if (cameraData.camera.cameraType != CameraType.Game) - return; - - if (m_Material == null) - return; - - CommandBuffer cmd = CommandBufferPool.Get(); - using (new ProfilingScope(cmd, m_ProfilingSampler)) - { - Blitter.BlitCameraTexture(cmd, m_DistortTunnelTexHandle, m_OutputHandle, m_Material, 0); - } - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - CommandBufferPool.Release(cmd); - } - -#pragma warning restore 618, 672 -#endif - // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Tunnel.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Tunnel.cs index 0822a9bf6ee..e00c9f81fa8 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Tunnel.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/DistortTunnel/DistortTunnelPass_Tunnel.cs @@ -38,41 +38,6 @@ public void SetRTHandles(ref RTHandle dest, int slice) m_Slice = slice; } -#if URP_COMPATIBILITY_MODE // Compatibility Mode is being removed -#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member - - // Unity calls the Configure method in the Compatibility mode (non-RenderGraph path) - public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescripor) - { - ConfigureTarget(m_OutputHandle); - } - - // Unity calls the Execute method in the Compatibility mode - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var cameraData = renderingData.cameraData; - if (cameraData.camera.cameraType != CameraType.Game) - return; - - // Get the "Tunnel" renderer object from the scene (example-specific code) - SetTunnelObject(); - if (!m_TunnelObject) - return; - - CommandBuffer cmd = CommandBufferPool.Get(); - using (new ProfilingScope(cmd, m_ProfilingSampler)) - { - CoreUtils.SetRenderTarget(cmd, m_OutputHandle, depthSlice: m_Slice); - cmd.DrawRenderer(m_TunnelObject, m_TunnelObject.sharedMaterial,0,0); - } - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - CommandBufferPool.Release(cmd); - } - -#pragma warning restore 618, 672 -#endif - // Unity calls the RecordRenderGraph method to add and configure one or more render passes in the render graph system. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { diff --git a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/KeepFrame/KeepFrameFeature.cs b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/KeepFrame/KeepFrameFeature.cs index c4902f094e6..629b9c94f04 100644 --- a/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/KeepFrame/KeepFrameFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Samples~/URPPackageSamples/RendererFeatures/KeepFrame/KeepFrameFeature.cs @@ -24,34 +24,6 @@ public void Setup(RTHandle destination) m_Destination = destination; } -#if URP_COMPATIBILITY_MODE // Compatibility Mode is being removed -#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member - - // Override the Execute method to implement the rendering logic. - // This method is used only in the Compatibility Mode path. - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - // Skip rendering if the camera isn't a game camera. - if (renderingData.cameraData.camera.cameraType != CameraType.Game) - return; - - // Set the source texture as the camera color target. - var source = renderingData.cameraData.renderer.cameraColorTargetHandle; - - // Get a command buffer. - CommandBuffer cmd = CommandBufferPool.Get("CopyFramePass"); - - // Blit the camera color target to the destination texture. - Blit(cmd, source, m_Destination); - - // Execute the command buffer. - context.ExecuteCommandBuffer(cmd); - CommandBufferPool.Release(cmd); - } - -#pragma warning restore 618, 672 -#endif - // Override the RecordRenderGraph method to implement the rendering logic. // This method is used only in the render graph system path. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) @@ -116,31 +88,6 @@ static void ExecutePass(RasterCommandBuffer cmd, RTHandle source, Material mater Blitter.BlitTexture(cmd, source, viewportScale, material, 0); } -#if URP_COMPATIBILITY_MODE // Compatibility Mode is being removed -#pragma warning disable 618, 672 // Type or member is obsolete, Member overrides obsolete member - - // Override the Execute method to implement the rendering logic. - // This method is used only in the Compatibility Mode path. - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - // Get a command buffer. - CommandBuffer cmd = CommandBufferPool.Get(nameof(DrawOldFramePass)); - cmd.SetGlobalTexture(m_TextureName, m_Handle); - - // Set the source texture as the camera color target. - var source = renderingData.cameraData.renderer.cameraColorTargetHandle; - - // Blit the camera color target to the destination texture. - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(cmd), source, m_DrawOldFrameMaterial); - - // Execute the command buffer. - context.ExecuteCommandBuffer(cmd); - CommandBufferPool.Release(cmd); - } - -#pragma warning restore 618, 672 -#endif - // Override the RecordRenderGraph method to implement the rendering logic. // This method is used only in the render graph system path. public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/NativeRenderPassTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Editor/NativeRenderPassTests.cs deleted file mode 100644 index c8ea8532b3b..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/NativeRenderPassTests.cs +++ /dev/null @@ -1,130 +0,0 @@ -#if URP_COMPATIBILITY_MODE -using System; -using NUnit.Framework; -using UnityEngine.TestTools; -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.Rendering.Universal; - - -namespace UnityEditor.Rendering.Universal.Tests -{ - [TestFixture] - class NativeRenderPassTests - { - internal class TestHelper - { - internal UniversalRendererData rendererData; - internal UniversalCameraData cameraData; - internal UniversalRenderPipelineAsset urpAsset; - internal ScriptableRenderer scriptableRenderer; - - public TestHelper() - { - try - { - rendererData = ScriptableObject.CreateInstance(); - - urpAsset = UniversalRenderPipelineAsset.Create(rendererData); - urpAsset.name = "TestHelper_URPAsset"; - GraphicsSettings.defaultRenderPipeline = urpAsset; - - scriptableRenderer = urpAsset.GetRenderer(0); - - cameraData = new UniversalCameraData(); - - ResetData(); - } - catch (Exception e) - { - Debug.LogError(e.StackTrace); - Cleanup(); - } - } - - internal void ResetData() - { - scriptableRenderer.useRenderPassEnabled = true; - } - - internal void Cleanup() - { - ScriptableObject.DestroyImmediate(urpAsset); - ScriptableObject.DestroyImmediate(rendererData); - } - } - - private TestHelper m_TestHelper; - - private RenderPipelineAsset m_PreviousRenderPipelineAssetGraphicsSettings; - private RenderPipelineAsset m_PreviousRenderPipelineAssetQualitySettings; - public class TestRenderPassUseNRP : ScriptableRenderPass - { - public TestRenderPassUseNRP() - { - // Initialize with this argument to true, to avoid other unrelated errors - overrideCameraTarget = true; - // Enable the use of Native Render Pass. This is set to true by defalult, but we want to make it explicit - useNativeRenderPass = true; - } - } - - [OneTimeSetUp] - public void OneTimeSetup() - { - m_PreviousRenderPipelineAssetGraphicsSettings = GraphicsSettings.defaultRenderPipeline; - m_PreviousRenderPipelineAssetQualitySettings = QualitySettings.renderPipeline; - GraphicsSettings.defaultRenderPipeline = null; - QualitySettings.renderPipeline = null; - } - - [SetUp] - public void Setup() - { - m_TestHelper = new(); - m_TestHelper.ResetData(); - } - - [TearDown] - public void TearDown() - { - m_TestHelper.Cleanup(); - } - - [OneTimeTearDown] - public void OneTimeTearDown() - { - GraphicsSettings.defaultRenderPipeline = m_PreviousRenderPipelineAssetGraphicsSettings; - QualitySettings.renderPipeline = m_PreviousRenderPipelineAssetQualitySettings; - } - - public void InitializeRenderPassQueue(ScriptableRenderer renderer, int count) - { - for (int i = 0; i < count; i++) - { - renderer.EnqueuePass(new TestRenderPassUseNRP()); - } - } - - [Test] - public void UnderLimitRenderPassInNRP() - { - // Use kRenderPassMaxCount so this is the maximun allowed - InitializeRenderPassQueue(m_TestHelper.scriptableRenderer, ScriptableRenderer.kRenderPassMaxCount); - // Check that no exception is thrown. - Assert.DoesNotThrow(() => m_TestHelper.scriptableRenderer.SetupNativeRenderPassFrameData(m_TestHelper.cameraData, true)); - } - - [Test] - public void OverLimitRenderPassInNRP() - { - // Increase by one the maximum allowed render passes - InitializeRenderPassQueue(m_TestHelper.scriptableRenderer, ScriptableRenderer.kRenderPassMaxCount+1); - // Check that a logError is thrown, but no other errors are thrown. - m_TestHelper.scriptableRenderer.SetupNativeRenderPassFrameData( m_TestHelper.cameraData, true ); - LogAssert.Expect(LogType.Error, $"Exceeded the maximum number of Render Passes (${ScriptableRenderer.kRenderPassMaxCount}). Please consider using Render Graph to support a higher number of render passes with Native RenderPass, note support will be enabled by default."); - } - - } -} -#endif diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/NativeRenderPassTests.cs.meta b/Packages/com.unity.render-pipelines.universal/Tests/Editor/NativeRenderPassTests.cs.meta deleted file mode 100644 index 755bd730b8a..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/NativeRenderPassTests.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 1cf07d652e262fc499d69d0633434677 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderPassCullingTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderPassCullingTests.cs index 2747926a424..4168f18fb1c 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderPassCullingTests.cs +++ b/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderPassCullingTests.cs @@ -25,15 +25,6 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer var lightsInScene = Object.FindObjectsByType(FindObjectsSortMode.None); Assert.IsTrue(cullingResults.visibleLights.Length == lightsInScene.Length); } - -#if URP_COMPATIBILITY_MODE - /// - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - // This path does not implement the CullContextData. - } -#endif } class RenderGraphTestsCulling diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderTextureDescriptorDimensionsTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderTextureDescriptorDimensionsTests.cs index 6c56a68202b..dafa8cdbe0b 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderTextureDescriptorDimensionsTests.cs +++ b/Packages/com.unity.render-pipelines.universal/Tests/Editor/RenderTextureDescriptorDimensionsTests.cs @@ -106,26 +106,5 @@ public void TextureDescriptor_FromCameraData(RenderScaleTestCase testCase) var desc = CreateRenderTextureDescriptor(); CheckDimensions(desc, testCase); } - -#if URP_COMPATIBILITY_MODE - public class TestRTDimensionNativeRenderPass : ScriptableRenderPass {} - - [TestCaseSource(nameof(TestCasesTextureDimension))] - public void TextureDescriptor_FromNativeRenderPass(RenderScaleTestCase testCase) - { - // Setup needed data for the test - m_CameraData.renderScale = testCase.renderScale; - m_Camera.targetTexture = (testCase.cameraTargetIsRenderTexture) ? m_RT : null; - - // Initialize scaledWidth and scaledHeight using the helper function - UniversalRenderPipeline.InitializeScaledDimensions(m_Camera, m_CameraData); - - m_CameraData.cameraTargetDescriptor = CreateRenderTextureDescriptor(); - - var nativeRenderPass = new TestRTDimensionNativeRenderPass(); - ScriptableRenderer.GetRenderTextureDescriptor(m_CameraData, nativeRenderPass, out var desc); - CheckDimensions(desc, testCase); - } -#endif } } diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/URPGlobalSettingsMigrationTests/RenderGraphSettingsMigrationTest.cs b/Packages/com.unity.render-pipelines.universal/Tests/Editor/URPGlobalSettingsMigrationTests/RenderGraphSettingsMigrationTest.cs deleted file mode 100644 index 562c781fb2c..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/URPGlobalSettingsMigrationTests/RenderGraphSettingsMigrationTest.cs +++ /dev/null @@ -1,76 +0,0 @@ -using NUnit.Framework; -using UnityEngine.Rendering; -using UnityEngine.Rendering.Universal; -using ShaderVariantLogLevel = UnityEngine.Rendering.ShaderVariantLogLevel; - -namespace UnityEditor.Rendering.Universal.Test.GlobalSettingsMigration -{ - class RenderGraphSettingsMigrationTest : RenderPipelineGraphicsSettingsMigrationTestBase - { - class TestCase1 : IRenderPipelineGraphicsSettingsTestCase - { - public void SetUp(UniversalRenderPipelineGlobalSettings globalSettingsAsset, - UniversalRenderPipelineAsset renderPipelineAsset) - { -#pragma warning disable 618 // Type or member is obsolete - globalSettingsAsset.m_EnableRenderGraph = true; -#pragma warning restore 618 - - globalSettingsAsset.m_AssetVersion = 5; - } - - public bool IsMigrationCorrect(RenderGraphSettings settings, out string message) - { - message = string.Empty; -#if URP_COMPATIBILITY_MODE - return !settings.enableRenderCompatibilityMode; -#else - // Without URP_COMPATIBILITY_MODE define, this should always return false regardless of migration. - return settings.enableRenderCompatibilityMode == false; -#endif - } - } - - class TestCase2 : IRenderPipelineGraphicsSettingsTestCase - { - public void SetUp(UniversalRenderPipelineGlobalSettings globalSettingsAsset, - UniversalRenderPipelineAsset renderPipelineAsset) - { -#pragma warning disable 618 // Type or member is obsolete - globalSettingsAsset.m_EnableRenderGraph = false; -#pragma warning restore 618 - - globalSettingsAsset.m_AssetVersion = 5; - } - - public bool IsMigrationCorrect(RenderGraphSettings settings, out string message) - { - message = string.Empty; -#if URP_COMPATIBILITY_MODE - return settings.enableRenderCompatibilityMode; -#else - // Without URP_COMPATIBILITY_MODE define, this should always return false regardless of migration. - return settings.enableRenderCompatibilityMode == false; -#endif - } - } - - - static TestCaseData[] s_TestCaseDatas = - { - new TestCaseData(new TestCase1()) - .SetName( - "When performing a migration of m_EnableRenderGraph ( true ), settings are being transferred correctly"), - new TestCaseData(new TestCase2()) - .SetName( - "When performing a migration of m_EnableRenderGraph ( false ), settings are being transferred correctly"), - - }; - - [Test, TestCaseSource(nameof(s_TestCaseDatas))] - public void PerformMigration(IRenderPipelineGraphicsSettingsTestCase testCase) - { - base.DoTest(testCase); - } - } -} diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Editor/URPGlobalSettingsMigrationTests/RenderGraphSettingsMigrationTest.cs.meta b/Packages/com.unity.render-pipelines.universal/Tests/Editor/URPGlobalSettingsMigrationTests/RenderGraphSettingsMigrationTest.cs.meta deleted file mode 100644 index 0e3755fa525..00000000000 --- a/Packages/com.unity.render-pipelines.universal/Tests/Editor/URPGlobalSettingsMigrationTests/RenderGraphSettingsMigrationTest.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 1fdba7e0238dbcf44b6aa0b3a928e966 \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Editor/CompatibilityModeInitializer.cs b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Editor/CompatibilityModeInitializer.cs deleted file mode 100644 index 32b623ae35d..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Editor/CompatibilityModeInitializer.cs +++ /dev/null @@ -1,46 +0,0 @@ -using UnityEditor; -using UnityEditor.Build; -using UnityEngine; -using UnityEngine.TestTools.Graphics; - -// This class detects the -urp-compatibility-mode command line argument and adds the URP_COMPATIBILITY_MODE define -// to the active build target in order to be able to run editor/playmode tests that require URP Compatibility Mode. -#if UNITY_EDITOR -[InitializeOnLoad] -public static class CompatibilityModeInitializer -{ - static CompatibilityModeInitializer() - { - if (RuntimeSettings.urpCompatibilityMode && !HasCompatibilityModeScriptingDefine()) - { - SetCompatibilityModeScriptingDefine(); - Debug.Log($"Added URP_COMPATIBILITY_MODE scripting define to '{GetNamedBuildTarget().TargetName}' build target in project settings."); - } - } - - static NamedBuildTarget GetNamedBuildTarget() - { - var activeBuildTarget = EditorUserBuildSettings.activeBuildTarget; - var activeBuildTargetGroup = BuildPipeline.GetBuildTargetGroup(activeBuildTarget); - return NamedBuildTarget.FromBuildTargetGroup(activeBuildTargetGroup); - } - - static bool HasCompatibilityModeScriptingDefine() - { - var namedBuildTarget = GetNamedBuildTarget(); - return PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget).Contains("URP_COMPATIBILITY_MODE"); - } - - static void SetCompatibilityModeScriptingDefine() - { - var namedBuildTarget = GetNamedBuildTarget(); - var defines = PlayerSettings.GetScriptingDefineSymbols(namedBuildTarget); - if (!string.IsNullOrEmpty(defines)) - defines += ";"; - defines += "URP_COMPATIBILITY_MODE"; - - PlayerSettings.SetScriptingDefineSymbols(namedBuildTarget, defines); - AssetDatabase.SaveAssets(); // Recompile - } -} -#endif diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Editor/CompatibilityModeInitializer.cs.meta b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Editor/CompatibilityModeInitializer.cs.meta deleted file mode 100644 index 828842c8db7..00000000000 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Editor/CompatibilityModeInitializer.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: c0916db7b21e4af68e1dba2626828a9e -timeCreated: 1750758473 \ No newline at end of file diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/CustomRenderPipeline/CustomRenderer.cs b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/CustomRenderPipeline/CustomRenderer.cs index 4d4de49a5f6..83452d24fa8 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/CustomRenderPipeline/CustomRenderer.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/CustomRenderPipeline/CustomRenderer.cs @@ -35,36 +35,6 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } -#if !UNITY_6000_3_OR_NEWER || URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)] - public override void Setup(ScriptableRenderContext context, ref RenderingData renderingData) - { - ConfigureCameraTarget(k_CameraTarget, k_CameraTarget); - - foreach (var feature in rendererFeatures) - { - feature.AddRenderPasses(this, ref renderingData); - feature.SetupRenderPasses(this, in renderingData); - } - EnqueuePass(m_RenderOpaqueForwardPass); - - bool mainLightShadows = m_MainLightShadowCasterPass.Setup(ref renderingData); - bool additionalLightShadows = m_AdditionalLightsShadowCasterPass.Setup(ref renderingData); - - if (mainLightShadows) - EnqueuePass(m_MainLightShadowCasterPass); - if (additionalLightShadows) - EnqueuePass(m_AdditionalLightsShadowCasterPass); - } - - - static ProfilingSampler s_SetupLights = new ProfilingSampler("Setup URP lights."); - private class SetupLightPassData - { - internal RenderingData renderingData; - internal ForwardLights forwardLights; - }; -#endif private void SetupRenderGraphLights(RenderGraph renderGraph) { UniversalRenderingData renderingData = frameData.Get(); @@ -172,19 +142,5 @@ internal override void OnRecordRenderGraph(RenderGraph renderGraph, ScriptableRe m_RenderOpaqueForwardPass.Render(renderGraph, frameData, targetHandle, depthHandle, mainShadowsTexture, additionalShadowsTexture); } - -#if !UNITY_6000_3_OR_NEWER || URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)] - public override void SetupLights(ScriptableRenderContext context, ref RenderingData renderingData) - { - UniversalRenderingData universalRenderingData = frameData.Get(); - UniversalCameraData cameraData = frameData.Get(); - UniversalLightData lightData = frameData.Get(); - - m_ForwardLights.SetupLights(CommandBufferHelpers.GetUnsafeCommandBuffer(universalRenderingData.commandBuffer), universalRenderingData, cameraData, lightData); - } -#endif - - internal override bool supportsNativeRenderPassRendergraphCompiler => true; } } diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/DrawRenderingLayers/DrawRenderingLayersFeature.cs b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/DrawRenderingLayers/DrawRenderingLayersFeature.cs index 631a86c88d9..36199b3ea38 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/DrawRenderingLayers/DrawRenderingLayersFeature.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/DrawRenderingLayers/DrawRenderingLayersFeature.cs @@ -25,16 +25,6 @@ public void Setup(RTHandle renderingLayerTestTextureHandle) m_TestRenderingLayersTextureHandle = renderingLayerTestTextureHandle; } -#if !UNITY_6000_3_OR_NEWER || URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - m_PassData.viewportScale = m_TestRenderingLayersTextureHandle.useScaling ? new Vector2(m_TestRenderingLayersTextureHandle.rtHandleProperties.rtHandleScale.x, m_TestRenderingLayersTextureHandle.rtHandleProperties.rtHandleScale.y) : Vector2.one; - - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData); - } -#endif - private void ExecutePass(RasterCommandBuffer cmd, PassData data) { using (new ProfilingScope(cmd, m_ProfilingSampler)) @@ -98,22 +88,6 @@ public void Setup(RTHandle renderingLayerTestTextureHandle, Material material) m_RenderingLayerColors[i] = Color.HSVToRGB(i / 32f, 1, 1); } -#if !UNITY_6000_3_OR_NEWER || URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - ConfigureTarget(m_ColoredRenderingLayersTextureHandle); - ConfigureClear(ClearFlag.ColorStencil, Color.black); - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - RasterCommandBuffer cmd = CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer); - ExecutePass(cmd); - } -#endif - private void ExecutePass(RasterCommandBuffer cmd) { using (new ProfilingScope(cmd, m_ProfilingSampler)) diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/OutputTextureFeature.cs b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/OutputTextureFeature.cs index a636ff600fd..8be40a8340b 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/OutputTextureFeature.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/OutputTextureFeature.cs @@ -67,37 +67,6 @@ public void Setup(ScriptableRenderer renderer, Material material, ScriptableRend ConfigureInput(inputRequirement); } -#if !UNITY_6000_3_OR_NEWER || URP_COMPATIBILITY_MODE - // This method is called before executing the render pass. - // It can be used to configure render targets and their clear state. Also to create temporary render target textures. - // When empty this render pass will render to the active camera render target. - // You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear. - // The render pipeline will ensure target setup and clearing happens in a performant manner. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - } - - // Here you can implement the rendering logic. - // Use ScriptableRenderContext to issue drawing commands or execute command buffers - // https://docs.unity3d.com/ScriptReference/Rendering.ScriptableRenderContext.html - // You don't have to call ScriptableRenderContext.submit, the render pipeline will call it at specific points in the pipeline. - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = CommandBufferPool.Get(); - - CoreUtils.SetRenderTarget(cmd, m_Renderer.cameraColorTargetHandle, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, ClearFlag.None, Color.clear); - m_PassData.profilingSampler = m_ProfilingSampler; - m_PassData.material = m_Material; - m_PassData.outputAdjust = m_OutputAdjustParams; - ExecutePass(m_PassData, CommandBufferHelpers.GetRasterCommandBuffer(cmd)); - - context.ExecuteCommandBuffer(cmd); - CommandBufferPool.Release(cmd); - } -#endif - private class PassData { internal ProfilingSampler profilingSampler; diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/SetInputRequirements.cs b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/SetInputRequirements.cs index 73eb4ba25f5..9c39c195667 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/SetInputRequirements.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/SetInputRequirements.cs @@ -47,18 +47,6 @@ public void Setup(ScriptableRenderPassInput inputRequirement) ConfigureInput(inputRequirement); } -#if !UNITY_6000_3_OR_NEWER || URP_COMPATIBILITY_MODE - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - } - - [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - } -#endif - internal class PassData { } diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/UniversalGraphicsTestBase.cs b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/UniversalGraphicsTestBase.cs index 8a6eb18b3b1..4d7516de39f 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/UniversalGraphicsTestBase.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/UniversalGraphicsTestBase.cs @@ -115,14 +115,6 @@ public static IEnumerable FixtureParams { get { - if (RuntimeSettings.urpCompatibilityMode) - { - yield return new TestFixtureData( - RenderGraphContext.CompatibilityMode, - GpuResidentDrawerContext.GRDDisabled - ); - } - yield return new TestFixtureData( RenderGraphContext.RenderGraphMode, GpuResidentDrawerContext.GRDDisabled @@ -130,14 +122,6 @@ public static IEnumerable FixtureParams if (GraphicsTestPlatform.Current.IsEditorPlatform) { - if (RuntimeSettings.urpCompatibilityMode) - { - yield return new TestFixtureData( - RenderGraphContext.CompatibilityMode, - GpuResidentDrawerContext.GRDEnabled - ); - } - yield return new TestFixtureData( RenderGraphContext.RenderGraphMode, GpuResidentDrawerContext.GRDEnabled diff --git a/Tests/SRPTests/Projects/ShaderGraph/Assets/CommonAssets/Scripts/ShaderGraphGraphicsTests.cs b/Tests/SRPTests/Projects/ShaderGraph/Assets/CommonAssets/Scripts/ShaderGraphGraphicsTests.cs index 6f86be3493e..603f9859a81 100644 --- a/Tests/SRPTests/Projects/ShaderGraph/Assets/CommonAssets/Scripts/ShaderGraphGraphicsTests.cs +++ b/Tests/SRPTests/Projects/ShaderGraph/Assets/CommonAssets/Scripts/ShaderGraphGraphicsTests.cs @@ -29,7 +29,8 @@ public class ShaderGraphGraphicsTests [IgnoreGraphicsTest("ArtisticNodes", "Unstable - see https://jira.unity3d.com/browse/UUM-111610", runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.WindowsEditor })] [IgnoreGraphicsTest("SamplerStateTests", "Unstable - see https://jira.unity3d.com/browse/UUM-111610", runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.WindowsEditor })] [IgnoreGraphicsTest("TransformNode", "Test is unstable", colorSpaces: new ColorSpace[] { ColorSpace.Linear }, runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.Android }, graphicsDeviceTypes: new GraphicsDeviceType[] { GraphicsDeviceType.Vulkan })] - + [IgnoreGraphicsTest("InstancedRendering", "Test requires conversion to Render Graph")] + [SceneGraphicsTest("Assets/Scenes")] [UnityTest, Category("ShaderGraph")] public IEnumerator Run(SceneGraphicsTestCase testCase) diff --git a/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/AfterOpaqueCustomRendering.cs b/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/AfterOpaqueCustomRendering.cs deleted file mode 100644 index 7c3e4788548..00000000000 --- a/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/AfterOpaqueCustomRendering.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.Rendering.Universal; - -[ExecuteAlways] -public class AfterOpaqueCustomRendering : MonoBehaviour -{ - public static event System.Action OnExecute; - - class CustomRenderPass : ScriptableRenderPass - { - // This method is called before executing the render pass. - // It can be used to configure render targets and their clear state. Also to create temporary render target textures. - // When empty this render pass will render to the active camera render target. - // You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear. - // The render pipeline will ensure target setup and clearing happens in a performant manner. - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - } - - // Here you can implement the rendering logic. - // Use ScriptableRenderContext to issue drawing commands or execute command buffers - // https://docs.unity3d.com/ScriptReference/Rendering.ScriptableRenderContext.html - // You don't have to call ScriptableRenderContext.submit, the render pipeline will call it at specific points in the pipeline. - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = CommandBufferPool.Get(name: "AfterOpaqueCustomPass"); - OnExecute?.Invoke(cmd); - context.ExecuteCommandBuffer(cmd); - CommandBufferPool.Release(cmd); - } - - // Cleanup any allocated resources that were created during the execution of this render pass. - public override void OnCameraCleanup(CommandBuffer cmd) - { - } - } - - private CustomRenderPass m_ScriptablePass = new() { renderPassEvent = RenderPassEvent.AfterRenderingOpaques }; - - private void OnEnable() - { - RenderPipelineManager.beginCameraRendering += OnBeginCamera; - } - - private void OnDisable() - { - RenderPipelineManager.beginCameraRendering -= OnBeginCamera; - } - - private void OnBeginCamera(ScriptableRenderContext ctx, Camera camera) - { - #pragma warning disable CS0618 // Type or member is obsolete - camera.GetUniversalAdditionalCameraData().scriptableRenderer.EnqueuePass(m_ScriptablePass); - #pragma warning restore CS0618 // Type or member is obsolete - } -} diff --git a/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/AfterOpaqueCustomRendering.cs.meta b/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/AfterOpaqueCustomRendering.cs.meta deleted file mode 100644 index 3e16b4bc8d0..00000000000 --- a/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/AfterOpaqueCustomRendering.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 58f5cbdda52284e348bb225b91cda9b6 \ No newline at end of file diff --git a/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/InstancedRenderingTest.cs b/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/InstancedRenderingTest.cs index 09dc26d3547..e81cf4df7cb 100644 --- a/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/InstancedRenderingTest.cs +++ b/Tests/SRPTests/Projects/ShaderGraph/Assets/Scenes/InstancedRendering/InstancedRenderingTest.cs @@ -56,13 +56,11 @@ public struct MyTransform private void OnEnable() { - AfterOpaqueCustomRendering.OnExecute += OnAfterOpaque; DoRender(null, true); } private void OnDisable() { - AfterOpaqueCustomRendering.OnExecute -= OnAfterOpaque; m_Matrices = null; if (m_ClonedMaterial != null) diff --git a/Tests/SRPTests/Projects/ShaderGraph/Assets/TestbedAssets/SRP/LWNoBatching.asset b/Tests/SRPTests/Projects/ShaderGraph/Assets/TestbedAssets/SRP/LWNoBatching.asset index 41bb36a0b5f..7d5e9d905a9 100644 --- a/Tests/SRPTests/Projects/ShaderGraph/Assets/TestbedAssets/SRP/LWNoBatching.asset +++ b/Tests/SRPTests/Projects/ShaderGraph/Assets/TestbedAssets/SRP/LWNoBatching.asset @@ -12,8 +12,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} m_Name: LWNoBatching m_EditorClassIdentifier: - k_AssetVersion: 9 - k_AssetPreviousVersion: 9 + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 m_RendererType: 1 m_RendererData: {fileID: 0} m_RendererDataList: @@ -24,8 +24,23 @@ MonoBehaviour: m_OpaqueDownsampling: 1 m_SupportsTerrainHoles: 1 m_SupportsHDR: 0 + m_HDRColorBufferPrecision: 0 m_MSAA: 4 m_RenderScale: 1 + m_UpscalingFilter: 0 + m_FsrOverrideSharpness: 0 + m_FsrSharpness: 0.92 + m_EnableLODCrossFade: 1 + m_LODCrossFadeDitheringType: 1 + m_ShEvalMode: 0 + m_LightProbeSystem: 0 + m_ProbeVolumeMemoryBudget: 1024 + m_ProbeVolumeBlendingMemoryBudget: 256 + m_SupportProbeVolumeGPUStreaming: 0 + m_SupportProbeVolumeDiskStreaming: 0 + m_SupportProbeVolumeScenarios: 0 + m_SupportProbeVolumeScenarioBlending: 0 + m_ProbeVolumeSHBands: 1 m_MainLightRenderingMode: 1 m_MainLightShadowsSupported: 1 m_MainLightShadowmapResolution: 2048 @@ -36,6 +51,9 @@ MonoBehaviour: m_AdditionalLightsShadowResolutionTierLow: 128 m_AdditionalLightsShadowResolutionTierMedium: 256 m_AdditionalLightsShadowResolutionTierHigh: 512 + m_ReflectionProbeBlending: 0 + m_ReflectionProbeBoxProjection: 0 + m_ReflectionProbeAtlas: 1 m_ShadowDistance: 50 m_ShadowCascadeCount: 2 m_Cascade2Split: 0.25 @@ -44,19 +62,82 @@ MonoBehaviour: m_CascadeBorder: 0.1 m_ShadowDepthBias: 1 m_ShadowNormalBias: 1 + m_AnyShadowsSupported: 1 m_SoftShadowsSupported: 0 + m_ConservativeEnclosingSphere: 0 + m_NumIterationsEnclosingSphere: 64 + m_SoftShadowQuality: 2 + m_AdditionalLightsCookieResolution: 2048 + m_AdditionalLightsCookieFormat: 3 m_UseSRPBatcher: 0 m_SupportsDynamicBatching: 1 m_MixedLightingSupported: 1 + m_SupportsLightCookies: 1 + m_SupportsLightLayers: 0 m_DebugLevel: 0 + m_StoreActionsOptimization: 0 m_UseAdaptivePerformance: 1 m_ColorGradingMode: 0 m_ColorGradingLutSize: 32 + m_AllowPostProcessAlphaOutput: 0 m_UseFastSRGBLinearConversion: 0 + m_SupportDataDrivenLensFlare: 1 + m_SupportScreenSpaceLensFlare: 1 + m_GPUResidentDrawerMode: 0 + m_SmallMeshScreenPercentage: 0 + m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 m_ShadowType: 1 m_LocalShadowsSupported: 0 m_LocalShadowsAtlasResolution: 256 m_MaxPixelLights: 4 m_ShadowAtlasResolution: 1024 + m_VolumeFrameworkUpdateMode: 0 + m_VolumeProfile: {fileID: 0} + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + m_PrefilteringModeMainLightShadows: 1 + m_PrefilteringModeAdditionalLight: 4 + m_PrefilteringModeAdditionalLightShadows: 1 + m_PrefilterXRKeywords: 0 + m_PrefilteringModeForwardPlus: 1 + m_PrefilteringModeDeferredRendering: 1 + m_PrefilteringModeScreenSpaceOcclusion: 1 + m_PrefilterDebugKeywords: 0 + m_PrefilterWriteRenderingLayers: 0 + m_PrefilterHDROutput: 0 + m_PrefilterAlphaOutput: 0 + m_PrefilterSSAODepthNormals: 0 + m_PrefilterSSAOSourceDepthLow: 0 + m_PrefilterSSAOSourceDepthMedium: 0 + m_PrefilterSSAOSourceDepthHigh: 0 + m_PrefilterSSAOInterleaved: 0 + m_PrefilterSSAOBlueNoise: 0 + m_PrefilterSSAOSampleCountLow: 0 + m_PrefilterSSAOSampleCountMedium: 0 + m_PrefilterSSAOSampleCountHigh: 0 + m_PrefilterDBufferMRT1: 0 + m_PrefilterDBufferMRT2: 0 + m_PrefilterDBufferMRT3: 0 + m_PrefilterSoftShadowsQualityLow: 0 + m_PrefilterSoftShadowsQualityMedium: 0 + m_PrefilterSoftShadowsQualityHigh: 0 + m_PrefilterSoftShadows: 0 + m_PrefilterScreenCoord: 0 + m_PrefilterScreenSpaceIrradiance: 0 + m_PrefilterNativeRenderPass: 0 + m_PrefilterUseLegacyLightmaps: 0 + m_PrefilterBicubicLightmapSampling: 0 + m_PrefilterReflectionProbeRotation: 0 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 0 m_ShaderVariantLogLevel: 0 m_ShadowCascades: 1 + m_Textures: + blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} diff --git a/Tests/SRPTests/Projects/ShaderGraph/Assets/TestbedAssets/SRP/LightweightAsset.asset b/Tests/SRPTests/Projects/ShaderGraph/Assets/TestbedAssets/SRP/LightweightAsset.asset index 8e0a0627d11..e93ad48c094 100644 --- a/Tests/SRPTests/Projects/ShaderGraph/Assets/TestbedAssets/SRP/LightweightAsset.asset +++ b/Tests/SRPTests/Projects/ShaderGraph/Assets/TestbedAssets/SRP/LightweightAsset.asset @@ -12,8 +12,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} m_Name: LightweightAsset m_EditorClassIdentifier: - k_AssetVersion: 9 - k_AssetPreviousVersion: 9 + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 m_RendererType: 1 m_RendererData: {fileID: 0} m_RendererDataList: @@ -24,8 +24,23 @@ MonoBehaviour: m_OpaqueDownsampling: 1 m_SupportsTerrainHoles: 1 m_SupportsHDR: 0 + m_HDRColorBufferPrecision: 0 m_MSAA: 4 m_RenderScale: 1 + m_UpscalingFilter: 0 + m_FsrOverrideSharpness: 0 + m_FsrSharpness: 0.92 + m_EnableLODCrossFade: 1 + m_LODCrossFadeDitheringType: 1 + m_ShEvalMode: 0 + m_LightProbeSystem: 0 + m_ProbeVolumeMemoryBudget: 1024 + m_ProbeVolumeBlendingMemoryBudget: 256 + m_SupportProbeVolumeGPUStreaming: 0 + m_SupportProbeVolumeDiskStreaming: 0 + m_SupportProbeVolumeScenarios: 0 + m_SupportProbeVolumeScenarioBlending: 0 + m_ProbeVolumeSHBands: 1 m_MainLightRenderingMode: 1 m_MainLightShadowsSupported: 1 m_MainLightShadowmapResolution: 2048 @@ -36,6 +51,9 @@ MonoBehaviour: m_AdditionalLightsShadowResolutionTierLow: 128 m_AdditionalLightsShadowResolutionTierMedium: 256 m_AdditionalLightsShadowResolutionTierHigh: 512 + m_ReflectionProbeBlending: 0 + m_ReflectionProbeBoxProjection: 0 + m_ReflectionProbeAtlas: 1 m_ShadowDistance: 50 m_ShadowCascadeCount: 2 m_Cascade2Split: 0.25 @@ -44,19 +62,82 @@ MonoBehaviour: m_CascadeBorder: 0.1 m_ShadowDepthBias: 1 m_ShadowNormalBias: 1 + m_AnyShadowsSupported: 1 m_SoftShadowsSupported: 0 + m_ConservativeEnclosingSphere: 0 + m_NumIterationsEnclosingSphere: 64 + m_SoftShadowQuality: 2 + m_AdditionalLightsCookieResolution: 2048 + m_AdditionalLightsCookieFormat: 3 m_UseSRPBatcher: 1 m_SupportsDynamicBatching: 0 m_MixedLightingSupported: 1 + m_SupportsLightCookies: 1 + m_SupportsLightLayers: 0 m_DebugLevel: 0 + m_StoreActionsOptimization: 0 m_UseAdaptivePerformance: 1 m_ColorGradingMode: 0 m_ColorGradingLutSize: 32 + m_AllowPostProcessAlphaOutput: 0 m_UseFastSRGBLinearConversion: 0 + m_SupportDataDrivenLensFlare: 1 + m_SupportScreenSpaceLensFlare: 1 + m_GPUResidentDrawerMode: 0 + m_SmallMeshScreenPercentage: 0 + m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 m_ShadowType: 1 m_LocalShadowsSupported: 0 m_LocalShadowsAtlasResolution: 256 m_MaxPixelLights: 4 m_ShadowAtlasResolution: 1024 + m_VolumeFrameworkUpdateMode: 0 + m_VolumeProfile: {fileID: 0} + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + m_PrefilteringModeMainLightShadows: 1 + m_PrefilteringModeAdditionalLight: 4 + m_PrefilteringModeAdditionalLightShadows: 1 + m_PrefilterXRKeywords: 0 + m_PrefilteringModeForwardPlus: 1 + m_PrefilteringModeDeferredRendering: 1 + m_PrefilteringModeScreenSpaceOcclusion: 1 + m_PrefilterDebugKeywords: 0 + m_PrefilterWriteRenderingLayers: 0 + m_PrefilterHDROutput: 0 + m_PrefilterAlphaOutput: 0 + m_PrefilterSSAODepthNormals: 0 + m_PrefilterSSAOSourceDepthLow: 0 + m_PrefilterSSAOSourceDepthMedium: 0 + m_PrefilterSSAOSourceDepthHigh: 0 + m_PrefilterSSAOInterleaved: 0 + m_PrefilterSSAOBlueNoise: 0 + m_PrefilterSSAOSampleCountLow: 0 + m_PrefilterSSAOSampleCountMedium: 0 + m_PrefilterSSAOSampleCountHigh: 0 + m_PrefilterDBufferMRT1: 0 + m_PrefilterDBufferMRT2: 0 + m_PrefilterDBufferMRT3: 0 + m_PrefilterSoftShadowsQualityLow: 0 + m_PrefilterSoftShadowsQualityMedium: 0 + m_PrefilterSoftShadowsQualityHigh: 0 + m_PrefilterSoftShadows: 0 + m_PrefilterScreenCoord: 0 + m_PrefilterScreenSpaceIrradiance: 0 + m_PrefilterNativeRenderPass: 0 + m_PrefilterUseLegacyLightmaps: 0 + m_PrefilterBicubicLightmapSampling: 0 + m_PrefilterReflectionProbeRotation: 0 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 0 m_ShaderVariantLogLevel: 0 m_ShadowCascades: 1 + m_Textures: + blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Test/Runtime/Renderer2DTests.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Test/Runtime/Renderer2DTests.cs index bdcf0366b2e..36df44c638f 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Test/Runtime/Renderer2DTests.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Test/Runtime/Renderer2DTests.cs @@ -95,14 +95,8 @@ public void OverlayRendererUsesRenderTexturesFromBase() Renderer2D baseRenderer = m_BaseCameraData.scriptableRenderer as Renderer2D; Renderer2D overlayRenderer = m_OverlayCameraData.scriptableRenderer as Renderer2D; - -#if URP_COMPATIBILITY_MODE - Assert.AreEqual(baseRenderer.m_ColorTextureHandle, overlayRenderer.m_ColorTextureHandle); - Assert.AreEqual(baseRenderer.m_DepthTextureHandle, overlayRenderer.m_DepthTextureHandle); -#else Assert.AreEqual(baseRenderer.m_RenderGraphCameraColorHandles, overlayRenderer.m_RenderGraphCameraColorHandles); Assert.AreEqual(baseRenderer.m_RenderGraphCameraDepthHandle, overlayRenderer.m_RenderGraphCameraDepthHandle); -#endif } [Test] diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/190_SampleDepth/CopyDepthPrepassFeature.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/190_SampleDepth/CopyDepthPrepassFeature.cs index c32326fb508..c761065c3cc 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/190_SampleDepth/CopyDepthPrepassFeature.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/190_SampleDepth/CopyDepthPrepassFeature.cs @@ -26,20 +26,9 @@ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingD return; } - if (!GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode) - renderer.EnqueuePass(copyDepthPasses); - else - copyDepthPasses.EnqueuePasses(renderer); + renderer.EnqueuePass(copyDepthPasses); } -#if URP_COMPATIBILITY_MODE - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData) - { - copyDepthPasses.SetupForNonRGPath(renderer, renderingData.cameraData.cameraTargetDescriptor); - } -#endif - public override void Create() { Init(); @@ -85,29 +74,6 @@ public ThreeCopyDepths(ref Shader copyDepthShader) m_CopyDepthPass3 = new CopyDepthPass(RenderPassEvent.AfterRenderingOpaques, copyDepthShader, copyToDepth: true, copyResolvedDepth: true, customPassName: "Third Copy"); } -#if URP_COMPATIBILITY_MODE - public void SetupForNonRGPath(ScriptableRenderer renderer, RenderTextureDescriptor cameraTextureDescriptor) - { - var depthDesc = cameraTextureDescriptor; - depthDesc.graphicsFormat = GraphicsFormat.None; //Depth only rendering - depthDesc.depthStencilFormat = cameraTextureDescriptor.depthStencilFormat; - depthDesc.msaaSamples = 1; - RenderingUtils.ReAllocateHandleIfNeeded(ref m_Depth1, depthDesc, name: "CopiedDepth1"); - RenderingUtils.ReAllocateHandleIfNeeded(ref m_Depth2, depthDesc, name: "CopiedDepth2"); - - #pragma warning disable CS0618 // Type or member is obsolete - m_CopyDepthPass1.Setup(renderer.cameraDepthTargetHandle, m_Depth1); - m_CopyDepthPass2.Setup(m_Depth1, m_Depth2); - m_CopyDepthPass3.Setup(m_Depth2, renderer.cameraDepthTargetHandle); - #pragma warning restore CS0618 // Type or member is obsolete - } - - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - } -#endif - internal void EnqueuePasses(ScriptableRenderer renderer) { renderer.EnqueuePass(m_CopyDepthPass1); diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/206_Motion_Vectors/CaptureMotionVectorsPass.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/206_Motion_Vectors/CaptureMotionVectorsPass.cs index ae7faaa62ef..86261a2a37a 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/206_Motion_Vectors/CaptureMotionVectorsPass.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/206_Motion_Vectors/CaptureMotionVectorsPass.cs @@ -27,22 +27,6 @@ public void SetIntensity(float intensity) m_intensity = intensity; } -#if URP_COMPATIBILITY_MODE - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer rawcmd = CommandBufferPool.Get(); - var cmd = CommandBufferHelpers.GetRasterCommandBuffer(rawcmd); - - ExecutePass(renderingData.cameraData.renderer.cameraColorTargetHandle, cmd, renderingData.cameraData.camera, m_Material, m_intensity); - - context.ExecuteCommandBuffer(rawcmd); - rawcmd.Clear(); - - CommandBufferPool.Release(rawcmd); - } -#endif - static void ExecutePass(RTHandle targetHandle, RasterCommandBuffer cmd, Camera camera, Material material, float motionIntensity) { if (camera.cameraType != CameraType.Game) diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/245_Normal_Reconstruction/NormalReconstructionTestFeature.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/245_Normal_Reconstruction/NormalReconstructionTestFeature.cs index 37f67e876a4..0c59c42a2af 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/245_Normal_Reconstruction/NormalReconstructionTestFeature.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/245_Normal_Reconstruction/NormalReconstructionTestFeature.cs @@ -39,21 +39,6 @@ public void Setup(Material material) m_Material = material; } -#if URP_COMPATIBILITY_MODE - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = CommandBufferPool.Get(); - - ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(cmd), renderingData.cameraData); - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - CommandBufferPool.Release(cmd); - } -#endif - static void ExecutePass(RasterCommandBuffer cmd, in CameraData cameraData) { using (new ProfilingScope(cmd, m_ProfilingSampler)) diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/280_HistoryRawColorDepth/280_HistoryVisualizerRendererFeature.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/280_HistoryRawColorDepth/280_HistoryVisualizerRendererFeature.cs index 9298ef8c51a..9bb67fed2f0 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/280_HistoryRawColorDepth/280_HistoryVisualizerRendererFeature.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/280_HistoryRawColorDepth/280_HistoryVisualizerRendererFeature.cs @@ -49,28 +49,6 @@ public void RequestHistory(UniversalCameraHistory historyManager) } } -#if URP_COMPATIBILITY_MODE - // For the Execute path only. - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - RequestHistory(renderingData.cameraData.historyManager); - } - - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = CommandBufferPool.Get(); - - ExecutePass(cmd, ref renderingData); - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - CommandBufferPool.Release(cmd); - } -#endif - RTHandle GetHistorySourceTexture(UniversalCameraHistory historyManager, int multipassId) { RTHandle historyTexture = null; @@ -94,42 +72,7 @@ RTHandle GetHistorySourceTexture(UniversalCameraHistory historyManager, int mult return historyTexture; } - -#if URP_COMPATIBILITY_MODE - void ExecutePass(CommandBuffer cmd, ref RenderingData renderingData) - { - if (m_Material == null) - return; - - var cameraData = renderingData.cameraData; - if(cameraData.historyManager == null) - return; - - UniversalRenderer renderer = cameraData.renderer as UniversalRenderer; - - #pragma warning disable CS0618 // Type or member is obsolete - ConfigureTarget(renderer?.cameraColorTargetHandle); - #pragma warning restore CS0618 // Type or member is obsolete - - int multipassId = 0; -#if ENABLE_VR && ENABLE_XR_MODULE - multipassId = cameraData.xr.multipassId; -#endif - RTHandle historyTexture = GetHistorySourceTexture(cameraData.historyManager, multipassId); - - // TODO: add screen offset - // Visualizes the history buffer as 1/4th screen bottom-left overlay. - m_Material.SetTexture(kHistoryShaderName, historyTexture); - Camera cam = cameraData.camera; - Rect r = cam.pixelRect; - r.width /= 2; - r.height /= 2; - cmd.SetViewport(r); - cmd.DrawProcedural(Matrix4x4.identity, m_Material, 0, MeshTopology.Triangles, 3, 1); - cmd.SetViewport(cam.pixelRect); - } -#endif - + // Cleanup any allocated resources that were created during the execution of this render pass. public override void OnCameraCleanup(CommandBuffer cmd) { diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/300_RandomUAV/RandomUAVFeature.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/300_RandomUAV/RandomUAVFeature.cs index 8395d4390ca..0876aad8c56 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/300_RandomUAV/RandomUAVFeature.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/300_RandomUAV/RandomUAVFeature.cs @@ -75,14 +75,6 @@ public RandomUAVPass(string profilerTag, string profilerTagOutput) m_ProfilingOutputSampler = new ProfilingSampler(profilerTagOutput); } -#if URP_COMPATIBILITY_MODE - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - // Don't do anything as this is a RenderGraph only feature - } -#endif - public void Setup(ScriptableRenderer renderer, Material randomUAVFillMaterial, Material randomUAVReadWriteMaterial, Material randomUAVFinalOutputMaterial) { m_Renderer = renderer; diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/310_Swapbuffer_Depth/SwapbufferBlitFeature.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/310_Swapbuffer_Depth/SwapbufferBlitFeature.cs index 3666ba490a4..2d53629747f 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/310_Swapbuffer_Depth/SwapbufferBlitFeature.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/310_Swapbuffer_Depth/SwapbufferBlitFeature.cs @@ -8,33 +8,6 @@ public class SwapbufferBlitFeature : ScriptableRendererFeature { class CustomRenderPass : ScriptableRenderPass { -#if URP_COMPATIBILITY_MODE - // This method is called before executing the render pass. - // It can be used to configure render targets and their clear state. Also to create temporary render target textures. - // When empty this render pass will render to the active camera render target. - // You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear. - // The render pipeline will ensure target setup and clearing happens in a performant manner. - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - } - - // Here you can implement the rendering logic. - // Use ScriptableRenderContext to issue drawing commands or execute command buffers - // https://docs.unity3d.com/ScriptReference/Rendering.ScriptableRenderContext.html - // You don't have to call ScriptableRenderContext.submit, the render pipeline will call it at specific points in the pipeline. - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - - CommandBuffer cmd = CommandBufferPool.Get(name: "SwapColorBufferPass"); - Blit(cmd, ref renderingData, null); - - context.ExecuteCommandBuffer(cmd); - CommandBufferPool.Release(cmd); - } -#endif - public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { // TODO: this test needs update for RenderGraph if and when we have a swapbuffer solution for it. Be it utils or somewhere else diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/325_DepthCopy/CaptureDepthFeature.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/325_DepthCopy/CaptureDepthFeature.cs index e40cc72180a..97d75eb7eea 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/325_DepthCopy/CaptureDepthFeature.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/325_DepthCopy/CaptureDepthFeature.cs @@ -37,39 +37,6 @@ public void Setup(Material material) m_Material = material; } -#if URP_COMPATIBILITY_MODE - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - var desc = renderingData.cameraData.cameraTargetDescriptor; - desc.graphicsFormat = GraphicsFormat.R32_SFloat; - desc.depthStencilFormat = GraphicsFormat.None; - desc.msaaSamples = 1; - - RenderingUtils.ReAllocateHandleIfNeeded(ref m_CapturedDepthRT, desc, FilterMode.Point, TextureWrapMode.Clamp, name: "_CapturedDepthTexture"); - - // Disable obsolete warning for internal usage - #pragma warning disable CS0618 - ConfigureTarget(m_CapturedDepthRT); - ConfigureClear(ClearFlag.Color, Color.black); - #pragma warning restore CS0618 - } - - - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = CommandBufferPool.Get(); - - Blitter.BlitTexture(cmd, Vector2.one, m_Material, 0); - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - CommandBufferPool.Release(cmd); - } -#endif - class CaptureDepthPassData { public Material material; @@ -116,21 +83,6 @@ public DrawDepthPass(CaptureDepthPass capturePass) renderPassEvent = RenderPassEvent.AfterRendering; } -#if URP_COMPATIBILITY_MODE - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = CommandBufferPool.Get(); - - Blitter.BlitTexture(cmd, m_CapturePass.m_CapturedDepthRT, Vector2.one, 0, false); - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - CommandBufferPool.Release(cmd); - } -#endif - class DrawDepthPassData { public TextureHandle source; diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/URPGlobalSettingsStrippingTests.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/URPGlobalSettingsStrippingTests.cs index 34abe9b8cf3..fcd48f13431 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/URPGlobalSettingsStrippingTests.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Test/Runtime/URPGlobalSettingsStrippingTests.cs @@ -9,7 +9,6 @@ public class URPGlobalSettingsStrippingTests // Runtime settings [TestCase(typeof(ShaderStrippingSetting), true)] [TestCase(typeof(URPDefaultVolumeProfileSettings), true)] - [TestCase(typeof(RenderGraphSettings), true)] [TestCase(typeof(UniversalRendererResources), true)] [TestCase(typeof(UniversalRenderPipelineRuntimeTextures), true)] [TestCase(typeof(UniversalRenderPipelineRuntimeShaders), true)] diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/060_Deferred/Deferred_GBuffer_Visualization_RenderFeature.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/060_Deferred/Deferred_GBuffer_Visualization_RenderFeature.cs index 6e08c88b5ea..738adf1cb2a 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/060_Deferred/Deferred_GBuffer_Visualization_RenderFeature.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/060_Deferred/Deferred_GBuffer_Visualization_RenderFeature.cs @@ -33,79 +33,6 @@ public void Setup(Material material, LocalKeyword[] shaderKeywords) m_ShaderKeywords = shaderKeywords; } -#if !UNITY_6000_3_OR_NEWER || URP_COMPATIBILITY_MODE - // This method is called before executing the render pass. - // It can be used to configure render targets and their clear state. Also to create temporary render target textures. - // When empty this render pass will render to the active camera render target. - // You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear. - // The render pipeline will ensure target setup and clearing happens in a performant manner. - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) - { - } - - // Here you can implement the rendering logic. - // Use ScriptableRenderContext to issue drawing commands or execute command buffers - // https://docs.unity3d.com/ScriptReference/Rendering.ScriptableRenderContext.html - // You don't have to call ScriptableRenderContext.submit, the render pipeline will call it at specific points in the pipeline. - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = CommandBufferPool.Get(); - - UniversalRenderer renderer = renderingData.cameraData.renderer as UniversalRenderer; - - #pragma warning disable CS0618 // Type or member is obsolete - ConfigureTarget(renderer?.cameraColorTargetHandle); - ConfigureClear(ClearFlag.Color, Color.yellow); - #pragma warning restore CS0618 // Type or member is obsolete - - ExecutePass(cmd, m_Material, renderer.cameraColorTargetHandle.referenceSize, m_ShaderKeywords); - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - CommandBufferPool.Release(cmd); - } - - static void ExecutePass(CommandBuffer cmd, Material material, Vector2Int targetSize, LocalKeyword[] shaderKeywords) - { - if (material == null) - return; - - const int Width = 3; - const int Height = 3; - - int tileWidthPixel = targetSize.x / Width; - int tileHeightPixel = targetSize.y / Height; - - LocalKeyword gBufferKeywordOld = shaderKeywords[shaderKeywords.Length - 1]; - - for (int y = 0; y < Height; ++y) - { - int yCoord = tileHeightPixel * y; - - for (int x = 0; x < Width; ++x) - { - int gBufferIdx = y * Width + x; - int xCoord = tileWidthPixel * x; - - cmd.SetKeyword(material, gBufferKeywordOld, false); - - if (gBufferIdx < shaderKeywords.Length) - { - LocalKeyword gBufferKeyword = shaderKeywords[gBufferIdx]; - cmd.SetKeyword(material, gBufferKeyword, true); - gBufferKeywordOld = gBufferKeyword; - } - - cmd.SetViewport(new Rect(xCoord, yCoord, tileWidthPixel, tileHeightPixel)); - cmd.DrawProcedural(Matrix4x4.identity, material, 0, MeshTopology.Triangles, 3, 1); - } - } - } -#endif - static void ExecutePass(RasterCommandBuffer cmd, Material material, Vector2Int targetSize, LocalKeyword[] shaderKeywords) { if (material == null) diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_PostPro/Assets/Scenes/250_ScreenCoordOverrideRenderPass/ScreenCoordOverrideRenderPass.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_PostPro/Assets/Scenes/250_ScreenCoordOverrideRenderPass/ScreenCoordOverrideRenderPass.cs index 6af943c4dd2..9a3cb74deb3 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_PostPro/Assets/Scenes/250_ScreenCoordOverrideRenderPass/ScreenCoordOverrideRenderPass.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_PostPro/Assets/Scenes/250_ScreenCoordOverrideRenderPass/ScreenCoordOverrideRenderPass.cs @@ -17,27 +17,6 @@ public void Setup(RenderPassEvent renderPassEvent, Material material) m_Material = material; } -#if URP_COMPATIBILITY_MODE - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - var target = renderingData.cameraData.renderer.cameraColorTargetHandle; - var descriptor = renderingData.cameraData.cameraTargetDescriptor; - descriptor.depthBufferBits = 0; - RenderingUtils.ReAllocateHandleIfNeeded(ref m_TempTex, descriptor, FilterMode.Point, TextureWrapMode.Clamp, name: "_TempTex"); - - var cmd = CommandBufferPool.Get(k_CommandBufferName); - - CoreUtils.SetRenderTarget(cmd, m_TempTex); - cmd.SetViewProjectionMatrices(Matrix4x4.identity, Matrix4x4.identity); - Blitter.BlitTexture(cmd, target, new Vector4(1, 1, 0, 0), m_Material, 0); - Blitter.BlitCameraTexture(cmd, m_TempTex, target); - - context.ExecuteCommandBuffer(cmd); - CommandBufferPool.Release(cmd); - } -#endif - public void Cleanup() { m_TempTex?.Release(); diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/MotionVectorVisualization/CaptureMotionVectorsPass.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/MotionVectorVisualization/CaptureMotionVectorsPass.cs index 6557c35506c..28c9e40c8d5 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/MotionVectorVisualization/CaptureMotionVectorsPass.cs +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/MotionVectorVisualization/CaptureMotionVectorsPass.cs @@ -22,22 +22,6 @@ public void SetIntensity(float intensity) m_intensity = intensity; } -#if URP_COMPATIBILITY_MODE - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - //Todo: test code is not working for XR - CommandBuffer cmd = CommandBufferPool.Get(); - - bool isGameCamera = renderingData.cameraData.camera.cameraType == CameraType.Game; - ExecutePass(renderingData.cameraData.renderer.cameraColorTargetHandle, cmd, isGameCamera, m_Material, m_intensity); - - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - CommandBufferPool.Release(cmd); - } -#endif - static void ExecutePass(RTHandle targetHandle, CommandBuffer cmd, bool isGameCamera, Material material, float motionIntensity) { if (!isGameCamera) diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Scripts/OutputTextureFeature.cs b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Scripts/OutputTextureFeature.cs index d0f6ea4ec2f..4a0432af6df 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Scripts/OutputTextureFeature.cs +++ b/Tests/SRPTests/Projects/VisualEffectGraph_URP/Assets/GraphicsTests/Scripts/OutputTextureFeature.cs @@ -66,31 +66,6 @@ public void Setup(ScriptableRenderer renderer, Material material, ScriptableRend ConfigureInput(inputRequirement); } -#if URP_COMPATIBILITY_MODE - // Here you can implement the rendering logic. - // Use ScriptableRenderContext to issue drawing commands or execute command buffers - // https://docs.unity3d.com/ScriptReference/Rendering.ScriptableRenderContext.html - // You don't have to call ScriptableRenderContext.submit, the render pipeline will call it at specific points in the pipeline. - [Obsolete("This rendering path is for compatibility mode only (when Render Graph is disabled). Use Render Graph API instead.", false)] - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - CommandBuffer cmd = CommandBufferPool.Get(); - - // SetRenderTarget has logic to flip projection matrix when rendering to render texture. Flip the uv to account for that case. - bool yflip = renderingData.cameraData.IsCameraProjectionMatrixFlipped(); - - CoreUtils.SetRenderTarget(cmd, m_Renderer.cameraColorTargetHandle, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, ClearFlag.None, Color.clear); - - m_PassData.profilingSampler = m_ProfilingSampler; - m_PassData.material = m_Material; - - ExecutePass(m_PassData,CommandBufferHelpers.GetRasterCommandBuffer(cmd), yflip); - - context.ExecuteCommandBuffer(cmd); - CommandBufferPool.Release(cmd); - } -#endif - internal class PassData { internal ProfilingSampler profilingSampler; From d6cdf28dd41b340cb5693df717c2b25baeb33f8f Mon Sep 17 00:00:00 2001 From: Yohann Vaast Date: Fri, 17 Oct 2025 00:08:51 +0000 Subject: [PATCH 094/115] RenderGraph - Fix a crash on old IOS devices due to attachments exceeding the maximum Pixel Storage size --- .../RenderGraph/Compiler/PassesData.cs | 35 +++++++++++++++++++ .../RenderGraph/Compiler/ResourcesData.cs | 5 +++ 2 files changed, 40 insertions(+) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/PassesData.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/PassesData.cs index bebc36471e9..09555b465e4 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/PassesData.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/PassesData.cs @@ -5,6 +5,7 @@ using UnityEngine.Rendering; using System.Collections.Generic; using Unity.Collections; +using UnityEngine.Experimental.Rendering; namespace UnityEngine.Rendering.RenderGraphModule.NativeRenderPassCompiler { @@ -1016,6 +1017,12 @@ public static PassBreakAudit CanMerge(CompilerContextData contextData, int activ } } + // Determines if the pixel storage limit is reached after adding the new 'pass to merge' attachments to the current native render pass. + if (TotalAttachmentsSizeExceedPixelStorageLimit(contextData, ref nativePass, ref attachmentsToTryAdding)) + { + return new PassBreakAudit(PassBreakReason.AttachmentLimitReached, passIdToMerge); + } + // We check first if we are at risk of having too many subpasses, // only then we do the costlier subpass merging check, short circuiting it whenever possible bool canAddAnExtraSubpass = (nativePass.numGraphPasses < NativePassCompiler.k_MaxSubpass); @@ -1028,6 +1035,34 @@ public static PassBreakAudit CanMerge(CompilerContextData contextData, int activ return new PassBreakAudit(PassBreakReason.Merged, passIdToMerge); } + static bool TotalAttachmentsSizeExceedPixelStorageLimit(CompilerContextData contextData, ref NativePassData nativePass, ref FixedAttachmentArray attachmentsToTryAdding) + { + // TODO: We are currently only checking for iOS GPU Family 1 to 3 since the storage size is much more restricted (16 bytes for Family 1 and 32 for Family 2 & 3). + // This is temporary. Later on, we should check all iOS GPU Families but also Android (Vulkan) to avoid the same potential restrictions. + if (Application.platform == RuntimePlatform.IPhonePlayer && SystemInfo.maxTiledPixelStorageSize <= 32) + { + int totalSize = 0; + + // Iterate over current attachments + for (int i = 0; i < nativePass.fragments.size; ++i) + { + ref readonly var unvResource = ref contextData.UnversionedResourceData(nativePass.fragments[i].resource); + totalSize += SystemInfo.GetTiledRenderTargetStorageSize(unvResource.graphicsFormat, unvResource.msaaSamples); + } + + // Iterate over new attachments to add + for (int i = 0; i < attachmentsToTryAdding.size; ++i) + { + ref readonly var unvResource = ref contextData.UnversionedResourceData(attachmentsToTryAdding[i].resource); + totalSize += SystemInfo.GetTiledRenderTargetStorageSize(unvResource.graphicsFormat, unvResource.msaaSamples); + } + + return totalSize > SystemInfo.maxTiledPixelStorageSize; + } + + return false; + } + // This function follows the structure of TryMergeNativeSubPass but only tests if the new native subpass can be // merged with the last one, allowing for early returns. It does not modify the state // ref for nativePass is used for performance reasons. The method should not modify nativePass. diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs index 609798da279..e117c199ef9 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/ResourcesData.cs @@ -2,6 +2,7 @@ using System.Runtime.CompilerServices; using Unity.Collections; using UnityEngine.Rendering; +using UnityEngine.Experimental.Rendering; namespace UnityEngine.Rendering.RenderGraphModule.NativeRenderPassCompiler { @@ -29,6 +30,7 @@ internal struct ResourceUnversionedData public readonly int height; public readonly int volumeDepth; public readonly int msaaSamples; + public readonly GraphicsFormat graphicsFormat; public int latestVersionNumber; // mostly readonly, can be decremented only if all passes using the last version are culled @@ -62,6 +64,7 @@ public ResourceUnversionedData(TextureResource rll, ref RenderTargetInfo info, r discard = desc.discardBuffer; bindMS = info.bindMS; textureUVOrigin = rll.textureUVOrigin; + graphicsFormat = desc.format; } public ResourceUnversionedData(IRenderGraphResource rll, ref BufferDesc _, bool isResourceShared) @@ -87,6 +90,7 @@ public ResourceUnversionedData(IRenderGraphResource rll, ref BufferDesc _, bool discard = false; bindMS = false; textureUVOrigin = TextureUVOriginSelection.Unknown; + graphicsFormat = GraphicsFormat.None; } public ResourceUnversionedData(IRenderGraphResource rll, ref RayTracingAccelerationStructureDesc _, bool isResourceShared) @@ -112,6 +116,7 @@ public ResourceUnversionedData(IRenderGraphResource rll, ref RayTracingAccelerat discard = false; bindMS = false; textureUVOrigin = TextureUVOriginSelection.Unknown; + graphicsFormat = GraphicsFormat.None; } public void InitializeNullResource() From 80bb548b1b6634930ee4730c28e9b60fa2bb07a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Duverne?= Date: Fri, 17 Oct 2025 05:31:46 +0000 Subject: [PATCH 095/115] Document Shader Graph template browser --- .../Documentation~/TableOfContents.md | 1 + .../create-shader-graph-template.md | 35 +++++------------ .../images/template-browser.png | Bin 0 -> 279863 bytes .../Documentation~/template-browser.md | 36 ++++++++++++++++++ .../Documentation~/ui-reference.md | 1 + 5 files changed, 48 insertions(+), 25 deletions(-) create mode 100644 Packages/com.unity.shadergraph/Documentation~/images/template-browser.png create mode 100644 Packages/com.unity.shadergraph/Documentation~/template-browser.md diff --git a/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md b/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md index 485f86204e4..59e48029acc 100644 --- a/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md +++ b/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md @@ -8,6 +8,7 @@ * [My first Shader Graph](First-Shader-Graph.md) * [Create a new shader graph from a template](create-shader-graph-template.md) * [Shader Graph UI reference](ui-reference.md) + * [Shader Graph template browser](template-browser.md) * [Shader Graph Window](Shader-Graph-Window.md) * [Blackboard](Blackboard.md) * [Main Preview](Main-Preview.md) diff --git a/Packages/com.unity.shadergraph/Documentation~/create-shader-graph-template.md b/Packages/com.unity.shadergraph/Documentation~/create-shader-graph-template.md index cbaae299484..5e791693749 100644 --- a/Packages/com.unity.shadergraph/Documentation~/create-shader-graph-template.md +++ b/Packages/com.unity.shadergraph/Documentation~/create-shader-graph-template.md @@ -1,35 +1,20 @@ # Create a new shader graph from a template -To create a shader graph from a template, use the Template Browser window. You can then adapt the shader graph to your needs. +To create a new shader graph from a template, follow these steps: -You can also share custom templates with your team through the Template Browser window, to maintain consistency across shaders in a project. This feature is particularly useful for projects with unique lighting setups or specific shader requirements. +1. In the **Project** window, right-click and select **Create** > **Shader Graph** > **From Template**. -The Template Browser window displays only templates that are compatible with the current project. + The [template browser](template-browser.md) opens. -# Create a new shader graph using a template +1. Select the desired template and click **Create**. -To create a new shader graph using a template: + Unity creates a new shader graph asset in your project. -1. In the **Project** window, right-click and select **Create** > **Shader Graph** > **From Template...**. +1. Name the shader graph asset. - The Template Browser window opens. +You can now edit the graph in the [Shader Graph window](Shader-Graph-Window.md). -1. Select the desired template. +## Additional resources - Unity creates a new shader graph asset. - -1. Name the shader graph asset and edit it. - -## Create a custom shader graph template - -To create a custom shader graph template: - -1. Select a shader graph asset in your project. - -1. In the **Inspector** window, enable **Use As Template**. - -1. Expand the **Template** foldout (triangle). - -1. Set the metadata that describes the template in the Template Browser window. - -1. Click anywhere in the **Project** window to preview and save the template metadata. +* [Shader Graph template browser](template-browser.md) +* [Create a custom shader graph template](template-browser.md#create-a-custom-shader-graph-template) diff --git a/Packages/com.unity.shadergraph/Documentation~/images/template-browser.png b/Packages/com.unity.shadergraph/Documentation~/images/template-browser.png new file mode 100644 index 0000000000000000000000000000000000000000..7a736e64d7fbe31e8290cd8733ef328ecf000814 GIT binary patch literal 279863 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%0DkcinnkVtpn+|YF(y0M^f=YaZ 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%0D`1Q7a6DI9^x5GrM!4{Qdij!UACl(Ttj?y)b=r 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

K6=O5>e$0TD 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 nWy3-oC*xsm?&L~cqhEqcgpV*+nZ|2Uu&JvYRL **Shader Graph** > **From Template**. + +![The template browser](images/template-browser.png) + +| Label | Name | Description | +| :--- | :--- | :--- | +| **A** | Template list | Lists all the available templates you can select and start from to create a new shader graph. | +| **B** | Template details | Displays a picture and description of the selected template. | +| **C** | Action buttons | Finish the asset creation flow. The options are:

| + +**Note**: The template browser displays only templates that are compatible with the current project. + +### Create a custom shader graph template + +You can create your own shader graph templates to have them available in the template browser. You can share these templates with your team to maintain consistency across shaders, for example in projects with unique lighting setups or specific shader requirements. + +To create a custom shader graph template, follow these steps: + +1. In the **Project** window, select the shader graph asset you want to use as a template. + +1. In the **Inspector** window, select **Use As Template**. + +1. Expand the **Template** section. + +1. Optional: Set the metadata that describes the template in the template browser: **Name**, **Category**, **Description**, **Icon**, and **Thumbnail**. + +> [!NOTE] +> By default, when you convert an existing shader graph asset into a template, you can no longer assign it to any materials through the [Material Inspector](https://docs.unity3d.com/Manual/class-Material.html). However, it remains active for materials that were already using it. To make the shader graph asset available again for any materials, enable the **Expose As Shader** option in the shader graph asset Inspector. + +## Additional resources + +* [Create a new shader graph from a template](create-shader-graph-template.md) diff --git a/Packages/com.unity.shadergraph/Documentation~/ui-reference.md b/Packages/com.unity.shadergraph/Documentation~/ui-reference.md index f9263c7c2be..4abf26114eb 100644 --- a/Packages/com.unity.shadergraph/Documentation~/ui-reference.md +++ b/Packages/com.unity.shadergraph/Documentation~/ui-reference.md @@ -4,6 +4,7 @@ Explore the main user interface elements you need to know to create and configur | Topic | Description | | :--- | :--- | +| [Shader Graph template browser](template-browser.md) | Browse the list of available templates to create your shader graphs from. | | [Shader Graph Window](Shader-Graph-Window.md) | Display and edit your shader graph assets in Unity, including the Blackboard, the Main Preview, and the Graph Inspector. | | [Create Node Menu](Create-Node-Menu.md) | Create nodes in your graph and create block nodes in the Master Stack. | | [Graph Settings Tab](Graph-Settings-Tab.md) | Change settings that affect your shader graph as a whole. | From 89dfd278a9da824d4b988995f3fe6da42cfa923e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Carr=C3=A8re?= Date: Fri, 17 Oct 2025 05:31:50 +0000 Subject: [PATCH 096/115] DOCG-7803: Add references for Custom interpolator vertex block and node --- .../Documentation~/Built-In-Blocks.md | 53 +++++++++++------- .../Custom-Interpolators-landing.md | 8 +++ .../Custom-Interpolators-reference.md | 20 +++++++ .../Documentation~/Custom-Interpolators.md | 12 +++- .../Documentation~/TableOfContents.md | 4 +- .../Blocks-Fragment-Alpha-Clip-Threshold.png | Bin 10629 -> 0 bytes .../images/Blocks-Fragment-Alpha.png | Bin 7295 -> 0 bytes .../Blocks-Fragment-Ambient-Occlusion.png | Bin 9710 -> 0 bytes .../images/Blocks-Fragment-Base-Color.png | Bin 8006 -> 0 bytes .../images/Blocks-Fragment-Emission.png | Bin 8178 -> 0 bytes .../images/Blocks-Fragment-Metallic.png | Bin 8131 -> 0 bytes .../images/Blocks-Fragment-NormalOS.png | Bin 12995 -> 0 bytes .../images/Blocks-Fragment-NormalTS.png | Bin 12590 -> 0 bytes .../images/Blocks-Fragment-NormalWS.png | Bin 12704 -> 0 bytes .../images/Blocks-Fragment-Smoothness.png | Bin 9524 -> 0 bytes .../images/Blocks-Fragment-Specular.png | Bin 8353 -> 0 bytes .../images/Blocks-Vertex-Color.png | Bin 5573 -> 0 bytes .../images/Blocks-Vertex-Normal.png | Bin 7679 -> 0 bytes .../images/Blocks-Vertex-Position.png | Bin 7065 -> 0 bytes .../images/Blocks-Vertex-Tangent.png | Bin 7799 -> 0 bytes 20 files changed, 73 insertions(+), 24 deletions(-) create mode 100644 Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators-landing.md create mode 100644 Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators-reference.md delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Alpha-Clip-Threshold.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Alpha.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Ambient-Occlusion.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Base-Color.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Emission.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Metallic.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-NormalOS.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-NormalTS.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-NormalWS.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Smoothness.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Specular.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Color.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Normal.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Position.png delete mode 100644 Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Tangent.png diff --git a/Packages/com.unity.shadergraph/Documentation~/Built-In-Blocks.md b/Packages/com.unity.shadergraph/Documentation~/Built-In-Blocks.md index 202a46d2499..4768547dc5c 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Built-In-Blocks.md +++ b/Packages/com.unity.shadergraph/Documentation~/Built-In-Blocks.md @@ -1,24 +1,37 @@ -# Built In Blocks +# Built-In Blocks + +Define standard inputs and outputs for the Master Stack. ## Vertex Blocks -| | Name | Type | Binding | Description | -|:-----------|:----------------|:---------|:----------------------|:------------| -| ![image](images/Blocks-Vertex-Position.png) | Position | Vector 3 | Object Space Position | Defines the absolute object space vertex position per vertex.| -| ![image](images/Blocks-Vertex-Normal.png) | Normal | Vector 3 | Object Space Normal | Defines the absolute object space vertex normal per vertex.| -| ![image](images/Blocks-Vertex-Tangent.png) | Tangent | Vector 3 | Object Space Tangent | Defines the absolute object space vertex tangent per vertex.| -| ![image](images/Blocks-Vertex-Color.png) | Color | Vector 4 | Vertex Color | Defines vertex color. Expected range 0 - 1. | + +Set per-vertex attributes and pass data to fragments. + +| Name | Type | Binding | Description | +|:--------------------|:---------|:----------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Position | Vector 3 | Object Space Position | Defines the absolute object space vertex position per vertex. | +| Normal | Vector 3 | Object Space Normal | Defines the absolute object space vertex normal per vertex. | +| Tangent | Vector 3 | Object Space Tangent | Defines the absolute object space vertex tangent per vertex. | +| Color | Vector 4 | Vertex Color | Defines vertex color. Expected range 0 - 1. | +| Custom Interpolator | Vector 4, vector 3, vector 2, or float | Custom Interpolator | Passes custom data from the vertex stage to the fragment stage. | ## Fragment Blocks -| | Name | Type | Binding | Description | -|:-----------|:---------|:---------|:---------------------|:------------| -| ![image](images/Blocks-Fragment-Base-Color.png) | Base Color | Vector 3 | None | Defines material's base color value. Expected range 0 - 1. | -| ![image](images/Blocks-Fragment-NormalTS.png) | Normal (Tangent Space) | Vector 3 | Tangent Space Normal | Defines material's normal value in tangent space. | -| ![image](images/Blocks-Fragment-NormalOS.png) | Normal (Object Space) | Vector 3| Object Space Normal | Defines material's normal value in object space. | -| ![image](images/Blocks-Fragment-NormalWS.png) | Normal (World Space) | Vector 3 | World Space Normal | Defines material's normal value in world space. | -| ![image](images/Blocks-Fragment-Emission.png) | Emission | Vector 3 | None | Defines material's emission color value. Expects positive values. | -| ![image](images/Blocks-Fragment-Metallic.png) | Metallic | Float | None | Defines material's metallic value, where 0 is non-metallic and 1 is metallic. | -| ![image](images/Blocks-Fragment-Specular.png) | Specular | Vector 3 | None | Defines material's specular color value. Expected range 0 - 1. | -| ![image](images/Blocks-Fragment-Smoothness.png) | Smoothness | Float | None | Defines material's smoothness value. Expected range 0 - 1. | -| ![image](images/Blocks-Fragment-Ambient-Occlusion.png) | Ambient Occlusion | Float | None | Defines material's ambient occlusion value. Expected range 0 - 1. | -| ![image](images/Blocks-Fragment-Alpha.png) | Alpha | Float | None | Defines material's alpha value. Used for transparency and/or alpha clip. Expected range 0 - 1. | -| ![image](images/Blocks-Fragment-Alpha-Clip-Threshold.png) | Alpha Clip Threshold | Float | None | Fragments with an alpha below this value are discarded. Expected range 0 - 1. | + +Specify per-pixel material properties used for shading. + +| Name | Type | Binding | Description | +|:-----------------------|:---------|:---------------------|:-----------------------------------------------------------------------------------------------| +| Base Color | Vector 3 | None | Defines material's base color value. Expected range 0 - 1. | +| Normal (Tangent Space) | Vector 3 | Tangent Space Normal | Defines material's normal value in tangent space. | +| Normal (Object Space) | Vector 3 | Object Space Normal | Defines material's normal value in object space. | +| Normal (World Space) | Vector 3 | World Space Normal | Defines material's normal value in world space. | +| Emission | Vector 3 | None | Defines material's emission color value. Expects positive values. | +| Metallic | Float | None | Defines material's metallic value, where 0 is non-metallic and 1 is metallic. | +| Specular | Vector 3 | None | Defines material's specular color value. Expected range 0 - 1. | +| Smoothness | Float | None | Defines material's smoothness value. Expected range 0 - 1. | +| Ambient Occlusion | Float | None | Defines material's ambient occlusion value. Expected range 0 - 1. | +| Alpha | Float | None | Defines material's alpha value. Used for transparency and/or alpha clip. Expected range 0 - 1. | +| Alpha Clip Threshold | Float | None | Fragments with an alpha below this value are discarded. Expected range 0 - 1. | + +## Additional resources + +[Add a custom interpolator](Custom-Interpolators.md) diff --git a/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators-landing.md b/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators-landing.md new file mode 100644 index 00000000000..adada98c7c2 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators-landing.md @@ -0,0 +1,8 @@ +# Using Custom Interpolators + +Use custom interpolators to pass custom data from the vertex shader to the fragment shader. + +| **Page** | **Description** | +|--------------------------------------------------------------------|---------------------------------------------------------------------------------| +| [Custom Interpolators](Custom-Interpolators.md) | Learn how to use and manage custom interpolators according to your needs. | +| [Custom Interpolator reference](Custom-Interpolators-reference.md) | Explore the Custom Interpolator properties. | diff --git a/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators-reference.md b/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators-reference.md new file mode 100644 index 00000000000..e4668c1c0f2 --- /dev/null +++ b/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators-reference.md @@ -0,0 +1,20 @@ +# Custom Interpolator reference + +Transfer custom data from the vertex stage to the fragment stage. + +You first create a custom interpolator block node in the Vertex context. You can then add a custom interpolator node in the workspace and connect it to a block node in the Fragment context. + +The following descriptions and settings apply to both the Vertex block and the Fragment node. + +## Settings + +| Property | Description | +|:------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Name** | Sets the unique name of the custom interpolator to identify and reference it in the graph. | +| **Type** | Sets the number of channels the Custom Interpolator exposes. The default value is **Vector 4**, which exposes x, y, z, and w channels. | +| **Interpolation** | Selects how Unity interpolates the value from vertex to fragment across the surface. The following options are available:
  • Linear: Applies the default linear interpolation, which preserves correct rates of change in screen space.
  • No Perspective: Doesn't correct perspective, which can warp data, depending on the angle between the surface and the camera.
  • No Interpolation: Doesn't interpolate the data, which creates hard edges between triangles.
| + +## Additional resources + +* [Built-in blocks](Built-In-Blocks.md) +* [Add a custom interpolator](Custom-Interpolators.md) diff --git a/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators.md b/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators.md index eabcb1a1885..507a3921bfb 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators.md +++ b/Packages/com.unity.shadergraph/Documentation~/Custom-Interpolators.md @@ -27,9 +27,10 @@ You can't limit the number of channels another user creates in a shader graph. H ## Add a custom interpolator block to the Master Stack 1. Right-click in the **Vertex** context to create a block node. -2. Select **Custom Interpolator**. -3. In the **Node Settings** tab of the **Graph Inspector** window, select a data type, for example **Vector 4**. -4. In the same tab, enter a name for the interpolator. +1. Select **Custom Interpolator**. +1. In the **Node Settings** tab of the **Graph Inspector** window, select a data type, for example **Vector 4**. +1. Select an [interpolation method](Custom-Interpolators-reference.md). +1. In the same tab, enter a name for the interpolator. ## Write data to the interpolator @@ -51,3 +52,8 @@ The graph now writes Vertex ID values into the custom interpolator. ## Delete a custom interpolator If you delete a custom interpolator that's associated with nodes that are still in your graph, Unity displays an alert. If you want to keep using these nodes, you can create a new custom interpolator and associate the nodes with it. This prevents the alert from appearing. + +## Additional resources + +* [Built In Blocks](Built-In-Blocks.md) +* [Custom Interpolator reference](Custom-Interpolators-reference.md) diff --git a/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md b/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md index 59e48029acc..03a0c6fdc7c 100644 --- a/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md +++ b/Packages/com.unity.shadergraph/Documentation~/TableOfContents.md @@ -46,7 +46,9 @@ * [Port Bindings](Port-Bindings.md) * [Shader Stage](Shader-Stage.md) * [Surface options](surface-options.md) - * [Custom Interpolators](Custom-Interpolators.md) + * [Using Custom Interpolators](Custom-Interpolators-landing.md) + * [Custom Interpolators](Custom-Interpolators.md) + * [Custom Interpolator reference](Custom-Interpolators-reference.md) * [Node Library](Node-Library.md) * [Artistic](Artistic-Nodes.md) * Adjustment diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Alpha-Clip-Threshold.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Alpha-Clip-Threshold.png deleted file mode 100644 index fc825b9dc1838a3c4bcc8d7900fa122646bb3d5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10629 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 diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Alpha.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Alpha.png deleted file mode 100644 index 439e5d27ee8318ed75f5fc46751ec8ed9ad7346d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7295 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 diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Ambient-Occlusion.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Ambient-Occlusion.png deleted file mode 100644 index 8a9eead10290a96b263babac8c7b07b63a8614ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9710 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 TrxL#PKeBLG1Fd`wyTJbfP4q&7 diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Base-Color.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Base-Color.png deleted file mode 100644 index ed2dff6d2cf3549a9065847b916b99d80fe6f601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8006 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 l+ed#rk=r`1?{BP diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Emission.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Emission.png deleted file mode 100644 index 402ba4867e082c93715c84f0878c1e51f7a496ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8178 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 diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-NormalOS.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-NormalOS.png deleted file mode 100644 index 4033fefb73fd6bd1ffc3202677cd9dc8c5436e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12995 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 SmgR$gGtt#F)F@SRAp8$T^{5K~ diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-NormalTS.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-NormalTS.png deleted file mode 100644 index 3347ae2d95424d67f2b8c23de07840d794ebd8fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12590 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 diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-NormalWS.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-NormalWS.png deleted file mode 100644 index 5b64475606dec51366e8e7c16f6d54645f2fcef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12704 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 diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Smoothness.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Fragment-Smoothness.png deleted file mode 100644 index d14faa9055c119277268c3293e046bbb15987482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9524 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 Z;|@0XF^<}Gc2KhvgsRc3U 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 aMSQlroo6`cxBQKNBETD%>fh3J3I8udjD64m diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Color.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Color.png deleted file mode 100644 index 027bf61ee2ccf04fde612a8e93fe9189e1c0e442..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5573 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 diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Normal.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Normal.png deleted file mode 100644 index 215c5f6969460bbf8e52a91f047dec784666adcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7679 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 K^#WD9%l`v>4`u2A diff --git a/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Tangent.png b/Packages/com.unity.shadergraph/Documentation~/images/Blocks-Vertex-Tangent.png deleted file mode 100644 index 50121c1808f32d735afe495240752e4b0a42babe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7799 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 From 13c7bae0d4a412c13fcd85adc3d94d2d5d02a811 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Fri, 17 Oct 2025 05:31:54 +0000 Subject: [PATCH 097/115] [VFX] Fix node search help icon was blurry --- .../Editor/UIResources/uss/VFXFilterWindow.uss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXFilterWindow.uss b/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXFilterWindow.uss index 52ad4e83fcd..78f41cf7ec7 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXFilterWindow.uss +++ b/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXFilterWindow.uss @@ -326,11 +326,12 @@ Label.category { border-width: 0; border-radius: 3px; background-color: rgba(0, 0, 0, 0); - background-image: resource("Icons/_Help@2x.png"); + background-size: 16px 16px; + background-image: resource("Icons/_Help.png"); } .dark #HelpButton { - background-image: resource("Icons/d__Help@2x.png"); + background-image: resource("Icons/d__Help.png"); } #HelpButton:hover { From e752c7ee75b31dc19a568262a0560ad52f601aa6 Mon Sep 17 00:00:00 2001 From: Gabriel de la Cruz Date: Fri, 17 Oct 2025 05:31:54 +0000 Subject: [PATCH 098/115] [VFX] Exposed property value not properly restored with multi selection --- .../Editor/Inspector/VisualEffectEditor.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VisualEffectEditor.cs b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VisualEffectEditor.cs index 6e6319ce44d..df33d5b3412 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Inspector/VisualEffectEditor.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Inspector/VisualEffectEditor.cs @@ -1171,10 +1171,6 @@ protected virtual void DrawParameters(VisualEffectResource resource) else { otherSourceProperty.FindPropertyRelative("m_Overridden").boolValue = !wasOverriden; - if (!wasOverriden) - { - SetObjectValue(otherSourceProperty.FindPropertyRelative("m_Value"), GetObjectValue(actualDisplayedPropertyValue)); - } PropertyOverrideChanged(); } otherObject.ApplyModifiedProperties(); From 5d027cd60c07500b722e53c3526a05ad1f22d2ee Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Fri, 17 Oct 2025 05:31:55 +0000 Subject: [PATCH 099/115] [VFX] Fixed wrapping issue and added missing tooltips in Control Panel --- .../com.unity.visualeffectgraph/Editor/Debug/VFXUIDebug.cs | 4 +++- .../Editor/UIResources/uss/VFXComponentBoard.uss | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/Debug/VFXUIDebug.cs b/Packages/com.unity.visualeffectgraph/Editor/Debug/VFXUIDebug.cs index cd431b56def..7ad48051466 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Debug/VFXUIDebug.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Debug/VFXUIDebug.cs @@ -749,6 +749,7 @@ VisualElement SetSystemInfosTitle() { var toggleAll = new Toggle(); toggleAll.value = true; + toggleAll.tooltip = "Show/Hide all particle system curves"; toggleAll.RegisterValueChangedCallback(ToggleAll); var SystemInfoName = new TextElement(); @@ -786,13 +787,14 @@ void AddSystemInfoEntry(string systemName, int id, Color color) m_SystemInfosContainer.Add(statContainer); var toggle = new Toggle(); + toggle.tooltip = "Show/Hide particle system curve"; toggle.value = true; var name = new Button(); name.name = "debug-system-stat-entry-name"; name.text = systemName; + name.tooltip = "Click to frame on the particle system"; name.style.color = color; - name.style.backgroundColor = new Color(0.16f, 0.16f, 0.16f); name.clickable.clicked += FocusParticleSystem(systemName); var alive = new TextElement(); diff --git a/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXComponentBoard.uss b/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXComponentBoard.uss index 27530c2d97f..0f3ef186729 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXComponentBoard.uss +++ b/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXComponentBoard.uss @@ -177,6 +177,10 @@ VFXComponentBoard.graphElement > .mainContainer width: 25%; } +#debug-system-stat-entry-container > Button { + white-space: normal; +} + #debug-system-stat-entry-container > Toggle { width: auto; } From 46b11c7ed47b11d82d9acfccf40293cecc05ac44 Mon Sep 17 00:00:00 2001 From: Thomas Zeng Date: Fri, 17 Oct 2025 05:31:55 +0000 Subject: [PATCH 100/115] [URP] Adjusted max render scale value from 2.0 to 3.0. --- .../Runtime/UniversalRenderPipeline.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs index 501ae9e7f15..f08e4d15532 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipeline.cs @@ -111,7 +111,7 @@ public static float minRenderScale ///
public static float maxRenderScale { - get => 2.0f; + get => 3.0f; } /// From fd7a70f8ebedaf90147f1609073b5107cbb8425f Mon Sep 17 00:00:00 2001 From: Kenny Tan Date: Fri, 17 Oct 2025 11:46:13 +0000 Subject: [PATCH 101/115] [UUM-116762][UUM-116667][6000.4] Fix Custom Render Texture warning when using in Rendergraph2D --- .../LightBatchingDebugger.cs | 2 +- .../2D/Rendergraph/DrawNormal2DPass.cs | 2 +- .../2D/Rendergraph/DrawRenderer2DPass.cs | 2 +- .../2D/Rendergraph/Renderer2DRendergraph.cs | 26 ++++++++++++++----- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/LightBatchingDebugger/LightBatchingDebugger.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/LightBatchingDebugger/LightBatchingDebugger.cs index 61b1ad6a746..5d2abf1da88 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/LightBatchingDebugger/LightBatchingDebugger.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/LightBatchingDebugger/LightBatchingDebugger.cs @@ -440,7 +440,7 @@ private void OnSelectionChanged() private void RefreshView() { PopulateData(); - batchListView.RefreshItems(); + batchListView?.RefreshItems(); OnSelectionChanged(); ResetDirty(); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs index 59fda26b1a5..17a1b37d4c0 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawNormal2DPass.cs @@ -52,7 +52,7 @@ public void Render(RenderGraph graph, ContextContainer frameData, int batchIndex builder.SetRenderAttachment(universal2DResourceData.normalsTexture[batchIndex], 0); // Depth needed for sprite mask stencil or z test for 3d meshes - if (rendererData.useDepthStencilBuffer) + if (Renderer2D.IsDepthUsageAllowed(frameData, rendererData)) { var depth = universal2DResourceData.normalsDepth.IsValid() ? universal2DResourceData.normalsDepth : commonResourceData.activeDepthTexture; builder.SetRenderAttachmentDepth(depth); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs index 28ef30c7e54..cdd7cae77d2 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/DrawRenderer2DPass.cs @@ -177,7 +177,7 @@ public void Render(RenderGraph graph, ContextContainer frameData, int batchIndex // Set color and depth attachments builder.SetRenderAttachment(commonResourceData.activeColorTexture, 0); - if (rendererData.useDepthStencilBuffer) + if (Renderer2D.IsDepthUsageAllowed(frameData, rendererData)) builder.SetRenderAttachmentDepth(commonResourceData.activeDepthTexture); builder.AllowGlobalStateModification(true); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs index 3f721a5ad5a..98b3a088113 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs @@ -143,15 +143,28 @@ public Renderer2D(Renderer2DData data) : base(data) #endif } - private bool IsPixelPerfectCameraEnabled(UniversalCameraData cameraData) + internal static bool IsDepthUsageAllowed(ContextContainer frameData, Renderer2DData rendererData) { - PixelPerfectCamera ppc = null; + UniversalCameraData cameraData = frameData.Get(); + + bool allowDepth = rendererData.useDepthStencilBuffer; + + // 3D Render Textures with depth/stencil buffer are not supported + if (cameraData.targetTexture != null) + allowDepth &= cameraData.targetTexture.dimension != TextureDimension.Tex3D; + + return allowDepth; + } + + private bool IsPixelPerfectCameraEnabled(UniversalCameraData cameraData, out PixelPerfectCamera ppc) + { + ppc = null; // Pixel Perfect Camera doesn't support camera stacking. if (cameraData.renderType == CameraRenderType.Base && cameraData.resolveFinalTarget) cameraData.camera.TryGetComponent(out ppc); - return ppc != null && ppc.enabled && ppc.cropFrame != PixelPerfectCamera.CropFrame.None; + return ppc != null && ppc.enabled; } private RenderPassInputSummary GetRenderPassInputs() @@ -193,7 +206,7 @@ ImportResourceSummary GetImportResourceSummary(RenderGraph renderGraph, Universa // Clear back buffer color if pixel perfect crop frame is used // Non-base cameras the back buffer should never be cleared - bool ppcEnabled = IsPixelPerfectCameraEnabled(cameraData); + bool ppcEnabled = IsPixelPerfectCameraEnabled(cameraData, out var ppc) && ppc.cropFrame != PixelPerfectCamera.CropFrame.None; bool clearColorBackbufferOnFirstUse = (cameraData.renderType == CameraRenderType.Base) && (!m_CreateColorTexture || ppcEnabled); bool clearDepthBackbufferOnFirstUse = (cameraData.renderType == CameraRenderType.Base) && !m_CreateColorTexture; @@ -546,7 +559,7 @@ void CreateCameraNormalsTextures(RenderGraph renderGraph, RenderTextureDescripto for (int i = 0; i < resourceData.normalsTexture.Length; ++i) resourceData.normalsTexture[i] = UniversalRenderer.CreateRenderGraphTexture(renderGraph, desc, "_NormalMap", true, RendererLighting.k_NormalClearColor); - if (m_Renderer2DData.useDepthStencilBuffer) + if (IsDepthUsageAllowed(frameData, m_Renderer2DData)) { // Normals pass can reuse active depth if same dimensions, if not create a new depth texture #if !(ENABLE_VR && ENABLE_XR_MODULE) @@ -900,8 +913,7 @@ private void OnAfterRendering(RenderGraph renderGraph) bool applyPostProcessing = cameraData.postProcessEnabled && m_PostProcess != null; bool anyPostProcessing = postProcessingData.isEnabled && m_PostProcess != null; - cameraData.camera.TryGetComponent(out var ppc); - bool requirePixelPerfectUpscale = IsPixelPerfectCameraEnabled(cameraData) && ppc.requiresUpscalePass; + bool requirePixelPerfectUpscale = IsPixelPerfectCameraEnabled(cameraData, out var ppc) && ppc.requiresUpscalePass; // When using Upscale Render Texture on a Pixel Perfect Camera, we want all post-processing effects done with a low-res RT, // and only upscale the low-res RT to fullscreen when blitting it to camera target. Also, final post processing pass is not run in this case, From fa86eb3f67943d4335f6e5c29373379c37839f58 Mon Sep 17 00:00:00 2001 From: Kenny Tan Date: Fri, 17 Oct 2025 18:15:17 +0000 Subject: [PATCH 102/115] [UUM-121472][6000.4][URP 2D] Fix mesh and sprite normals for shadergraph --- .../ShaderGraph/Includes/MeshNormalPass.hlsl | 1 - .../Includes/SpriteNormalPass.hlsl | 1 - .../Scenes/065_2D_Lights_SkinMesh.unity | 10 + .../Rabbit/CTRL_Rabbit.controller | 359 ----- .../Rabbit/RabbitSGMat 0.mat | 65 + ...controller.meta => RabbitSGMat 0.mat.meta} | 4 +- .../Rabbit/RabbitSGMat 1.mat | 65 + .../Rabbit/RabbitSGMat 1.mat.meta | 8 + .../Rabbit/RabbitSpriteLit.shadergraph | 1212 +++++++++++++++++ .../Rabbit/RabbitSpriteLit.shadergraph.meta | 18 + .../065_2D_Lights_SkinMesh_Shadergraph.unity | 531 ++++++++ ..._2D_Lights_SkinMesh_Shadergraph.unity.meta | 7 + 12 files changed, 1918 insertions(+), 363 deletions(-) delete mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/CTRL_Rabbit.controller create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 0.mat rename Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/{CTRL_Rabbit.controller.meta => RabbitSGMat 0.mat.meta} (64%) create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 1.mat create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 1.mat.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSpriteLit.shadergraph create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSpriteLit.shadergraph.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh_Shadergraph.unity create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh_Shadergraph.unity.meta diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/MeshNormalPass.hlsl b/Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/MeshNormalPass.hlsl index e7e373d02c0..e8b4c147048 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/MeshNormalPass.hlsl +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/MeshNormalPass.hlsl @@ -6,7 +6,6 @@ PackedVaryings vert(Attributes input) { Varyings output = (Varyings)0; output = BuildVaryings(input); - output.normalWS = TransformObjectToWorldDir(input.normalOS); PackedVaryings packedOutput = PackVaryings(output); return packedOutput; } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/SpriteNormalPass.hlsl b/Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/SpriteNormalPass.hlsl index e1d9bcb94d4..27e4957eee7 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/SpriteNormalPass.hlsl +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/SpriteNormalPass.hlsl @@ -6,7 +6,6 @@ PackedVaryings vert(Attributes input) input.positionOS = UnityFlipSprite(input.positionOS, unity_SpriteProps.xy); output = BuildVaryings(input); output.color *= unity_SpriteColor; - output.normalWS = -GetViewForwardDir(); PackedVaryings packedOutput = PackVaryings(output); return packedOutput; } diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh.unity index 3ce0e369aad..ed2715b192c 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh.unity +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh.unity @@ -313,6 +313,11 @@ PrefabInstance: propertyPath: m_LocalScale.y value: 2 objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalScale.z + value: 2 + objectReference: {fileID: 0} - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, type: 3} propertyPath: m_LocalPosition.x @@ -363,6 +368,11 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 6098476769238461331, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_Controller + value: + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/CTRL_Rabbit.controller b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/CTRL_Rabbit.controller deleted file mode 100644 index 21261b6d72e..00000000000 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/CTRL_Rabbit.controller +++ /dev/null @@ -1,359 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1107 &-9128674337006444690 -AnimatorStateMachine: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Base Layer - m_ChildStates: - - serializedVersion: 1 - m_State: {fileID: 1386550815491730113} - m_Position: {x: 410, y: 210, z: 0} - - serializedVersion: 1 - m_State: {fileID: 6634100124105693670} - m_Position: {x: 410, y: 120, z: 0} - - serializedVersion: 1 - m_State: {fileID: 7035327779463598656} - m_Position: {x: 410, y: 310, z: 0} - m_ChildStateMachines: [] - m_AnyStateTransitions: [] - m_EntryTransitions: [] - m_StateMachineTransitions: {} - m_StateMachineBehaviours: [] - m_AnyStatePosition: {x: 50, y: 20, z: 0} - m_EntryPosition: {x: 50, y: 120, z: 0} - m_ExitPosition: {x: 800, y: 120, z: 0} - m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} - m_DefaultState: {fileID: 6634100124105693670} ---- !u!1101 &-8891521440388725937 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: - - m_ConditionMode: 3 - m_ConditionEvent: linearVelocityX - m_EventTreshold: 1 - - m_ConditionMode: 4 - m_ConditionEvent: moveValueX - m_EventTreshold: -0.2 - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 1386550815491730113} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.25 - m_TransitionOffset: 0 - m_ExitTime: 0 - m_HasExitTime: 0 - m_HasFixedDuration: 1 - m_InterruptionSource: 0 - m_OrderedInterruption: 1 - m_CanTransitionToSelf: 1 ---- !u!1101 &-7464871240678240807 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: - - m_ConditionMode: 4 - m_ConditionEvent: linearVelocityX - m_EventTreshold: 1 - - m_ConditionMode: 3 - m_ConditionEvent: moveValueX - m_EventTreshold: -0.2 - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 6634100124105693670} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.25 - m_TransitionOffset: 0 - m_ExitTime: 0.55357146 - m_HasExitTime: 0 - m_HasFixedDuration: 1 - m_InterruptionSource: 0 - m_OrderedInterruption: 1 - m_CanTransitionToSelf: 1 ---- !u!1101 &-2259264521369673422 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: - - m_ConditionMode: 3 - m_ConditionEvent: linearVelocityX - m_EventTreshold: 1 - - m_ConditionMode: 3 - m_ConditionEvent: moveValueX - m_EventTreshold: 0.2 - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 1386550815491730113} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.25 - m_TransitionOffset: 0 - m_ExitTime: 0 - m_HasExitTime: 0 - m_HasFixedDuration: 1 - m_InterruptionSource: 2 - m_OrderedInterruption: 0 - m_CanTransitionToSelf: 1 ---- !u!1101 &-2090918365273008557 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: - - m_ConditionMode: 4 - m_ConditionEvent: linearVelocityX - m_EventTreshold: 1 - - m_ConditionMode: 4 - m_ConditionEvent: moveValueX - m_EventTreshold: 0.2 - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 6634100124105693670} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.25 - m_TransitionOffset: 0 - m_ExitTime: 0 - m_HasExitTime: 0 - m_HasFixedDuration: 1 - m_InterruptionSource: 2 - m_OrderedInterruption: 0 - m_CanTransitionToSelf: 1 ---- !u!91 &9100000 -AnimatorController: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: CTRL_Rabbit - serializedVersion: 5 - m_AnimatorParameters: - - m_Name: linearVelocityX - m_Type: 1 - m_DefaultFloat: 0 - m_DefaultInt: 0 - m_DefaultBool: 0 - m_Controller: {fileID: 9100000} - - m_Name: moveValueX - m_Type: 1 - m_DefaultFloat: 0 - m_DefaultInt: 0 - m_DefaultBool: 0 - m_Controller: {fileID: 9100000} - - m_Name: linearVelocityY - m_Type: 1 - m_DefaultFloat: 0 - m_DefaultInt: 0 - m_DefaultBool: 0 - m_Controller: {fileID: 9100000} - - m_Name: isGrounded - m_Type: 4 - m_DefaultFloat: 0 - m_DefaultInt: 0 - m_DefaultBool: 0 - m_Controller: {fileID: 9100000} - - m_Name: hasLanded - m_Type: 9 - m_DefaultFloat: 0 - m_DefaultInt: 0 - m_DefaultBool: 0 - m_Controller: {fileID: 9100000} - m_AnimatorLayers: - - serializedVersion: 5 - m_Name: Base Layer - m_StateMachine: {fileID: -9128674337006444690} - m_Mask: {fileID: 0} - m_Motions: [] - m_Behaviours: [] - m_BlendingMode: 0 - m_SyncedLayerIndex: -1 - m_DefaultWeight: 0 - m_IKPass: 0 - m_SyncedLayerAffectsTiming: 0 - m_Controller: {fileID: 9100000} ---- !u!1101 &278033246825605514 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: - - m_ConditionMode: 3 - m_ConditionEvent: linearVelocityX - m_EventTreshold: 11 - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 7035327779463598656} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.25 - m_TransitionOffset: 0 - m_ExitTime: 6 - m_HasExitTime: 1 - m_HasFixedDuration: 1 - m_InterruptionSource: 3 - m_OrderedInterruption: 0 - m_CanTransitionToSelf: 1 ---- !u!1102 &1386550815491730113 -AnimatorState: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: run - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: - - {fileID: -2090918365273008557} - - {fileID: -7464871240678240807} - - {fileID: 278033246825605514} - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: 6189153785341448634} - m_Tag: - m_SpeedParameter: linearVelocityX - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: ---- !u!1101 &4127658399013601447 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: - - m_ConditionMode: 4 - m_ConditionEvent: linearVelocityX - m_EventTreshold: 11 - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 1386550815491730113} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.25 - m_TransitionOffset: 0 - m_ExitTime: 0 - m_HasExitTime: 0 - m_HasFixedDuration: 1 - m_InterruptionSource: 0 - m_OrderedInterruption: 1 - m_CanTransitionToSelf: 1 ---- !u!206 &6189153785341448634 -BlendTree: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Blend Tree - m_Childs: - - serializedVersion: 2 - m_Motion: {fileID: -8489698727061325761, guid: 44c140d2f39da44cf99ca658382e0a55, type: 3} - m_Threshold: 6 - m_Position: {x: 0, y: 0} - m_TimeScale: 0.5 - m_CycleOffset: 0 - m_DirectBlendParameter: linearVelocityX - m_Mirror: 0 - - serializedVersion: 2 - m_Motion: {fileID: -8489698727061325761, guid: 44c140d2f39da44cf99ca658382e0a55, type: 3} - m_Threshold: 12 - m_Position: {x: 0, y: 0} - m_TimeScale: 2 - m_CycleOffset: 0 - m_DirectBlendParameter: linearVelocityX - m_Mirror: 0 - m_BlendParameter: linearVelocityX - m_BlendParameterY: linearVelocityX - m_MinThreshold: 6 - m_MaxThreshold: 12 - m_UseAutomaticThresholds: 0 - m_NormalizedBlendValues: 0 - m_BlendType: 0 ---- !u!1102 &6634100124105693670 -AnimatorState: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Idle - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: - - {fileID: -2259264521369673422} - - {fileID: -8891521440388725937} - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: 2122646230122354891, guid: 44c140d2f39da44cf99ca658382e0a55, type: 3} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: ---- !u!1102 &7035327779463598656 -AnimatorState: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: fastrun - m_Speed: 3 - m_CycleOffset: 0 - m_Transitions: - - {fileID: 4127658399013601447} - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: 7400000, guid: f6d46f454455e4c37bdd0da21aa6e0df, type: 2} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 0.mat b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 0.mat new file mode 100644 index 00000000000..8fb764dbf80 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 0.mat @@ -0,0 +1,65 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: RabbitSGMat 0 + m_Shader: {fileID: -6465566751694194690, guid: 025ce8dca3a9d6143aefb9e2cdc2dd42, + type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 2800000, guid: 9f9f3017d358d44ccb736a7bd6592786, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMap: + m_Texture: {fileID: 2800000, guid: d17e49d624142453c8a863e0ac64900b, type: 3} + 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: [] + m_Colors: + - White: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &8237059753624161021 +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: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/CTRL_Rabbit.controller.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 0.mat.meta similarity index 64% rename from Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/CTRL_Rabbit.controller.meta rename to Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 0.mat.meta index dd6df3f4443..fb48a0b14d4 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/CTRL_Rabbit.controller.meta +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 0.mat.meta @@ -1,8 +1,8 @@ fileFormatVersion: 2 -guid: 2d7b1e5c4ab7f4bc7bc7abf2aa661718 +guid: 435a2f546d47bd348876e1cc4c677120 NativeFormatImporter: externalObjects: {} - mainObjectFileID: 9100000 + mainObjectFileID: 2100000 userData: assetBundleName: assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 1.mat b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 1.mat new file mode 100644 index 00000000000..6261c923872 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 1.mat @@ -0,0 +1,65 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: RabbitSGMat 1 + m_Shader: {fileID: -6465566751694194690, guid: 025ce8dca3a9d6143aefb9e2cdc2dd42, + type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 2800000, guid: 106c5cc4c76c646dea6d654713640294, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NormalMap: + m_Texture: {fileID: 2800000, guid: 1ad007c25893a4418ba1f09c7a8146eb, type: 3} + 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: [] + m_Colors: + - White: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &8237059753624161021 +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: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 1.mat.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 1.mat.meta new file mode 100644 index 00000000000..5b6f4b0ec09 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSGMat 1.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3a9336001693c9d498c4f6b0dd63cf16 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSpriteLit.shadergraph b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSpriteLit.shadergraph new file mode 100644 index 00000000000..248f2ba3877 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSpriteLit.shadergraph @@ -0,0 +1,1212 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "514a8ce02e4a4fa681b90a90d3e839c2", + "m_Properties": [ + { + "m_Id": "d401b5c1617d4d8fa74fda08a28be573" + }, + { + "m_Id": "77ece1b84d1844a1a29038dff3b05cf5" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "36f527c348c84fb3a6d37625e041f27b" + } + ], + "m_Nodes": [ + { + "m_Id": "f175a76b6d5c4744b27aa6f3a8243a0b" + }, + { + "m_Id": "d16d670086a44e2cb7645b3a55ae85ec" + }, + { + "m_Id": "01bf3fdd78684d8e89b968e38df24b98" + }, + { + "m_Id": "9c4b5c837b1a4855bdbd05f54b4fd5db" + }, + { + "m_Id": "0cad9c89fff74bc296cd51c51e6c5dbd" + }, + { + "m_Id": "bfd127873db24f72b1f3e5f473dc2503" + }, + { + "m_Id": "4bc3eba0038a410b8b6e7c25ea419ed6" + }, + { + "m_Id": "05d37e1d04714b9fa662fe26a7994cb5" + }, + { + "m_Id": "3c90342919d6490e9b3eee154279747f" + }, + { + "m_Id": "2f97c8a5800d46e38d620c0be110a8bc" + }, + { + "m_Id": "45122eccdc864de3bc413b1f084d6f67" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "05d37e1d04714b9fa662fe26a7994cb5" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3c90342919d6490e9b3eee154279747f" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2f97c8a5800d46e38d620c0be110a8bc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "45122eccdc864de3bc413b1f084d6f67" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3c90342919d6490e9b3eee154279747f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9c4b5c837b1a4855bdbd05f54b4fd5db" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3c90342919d6490e9b3eee154279747f" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4bc3eba0038a410b8b6e7c25ea419ed6" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "45122eccdc864de3bc413b1f084d6f67" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bfd127873db24f72b1f3e5f473dc2503" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [ + { + "m_Id": "f175a76b6d5c4744b27aa6f3a8243a0b" + }, + { + "m_Id": "d16d670086a44e2cb7645b3a55ae85ec" + }, + { + "m_Id": "01bf3fdd78684d8e89b968e38df24b98" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 200.0 + }, + "m_Blocks": [ + { + "m_Id": "9c4b5c837b1a4855bdbd05f54b4fd5db" + }, + { + "m_Id": "0cad9c89fff74bc296cd51c51e6c5dbd" + }, + { + "m_Id": "bfd127873db24f72b1f3e5f473dc2503" + }, + { + "m_Id": "4bc3eba0038a410b8b6e7c25ea419ed6" + } + ] + }, + "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_SubDatas": [], + "m_ActiveTargets": [ + { + "m_Id": "c5bce52bcd5146adb0386aae19a0d9eb" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "01bf3fdd78684d8e89b968e38df24b98", + "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": "cef1b914f234419187751200ae1c1530" + } + ], + "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.Vector1MaterialSlot", + "m_ObjectId": "02b89de564bb4f728f9ee9eed9477a24", + "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_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "054506f6c3e444c9acabdbd6e3ed9f31", + "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_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "05d37e1d04714b9fa662fe26a7994cb5", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -737.0, + "y": 0.0, + "width": 127.0, + "height": 33.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "dd87aca122594b448f0fcc6ed0143cb5" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "d401b5c1617d4d8fa74fda08a28be573" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0892ce6c38fd47f8be3616c9a428babb", + "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_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "0cad9c89fff74bc296cd51c51e6c5dbd", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.SpriteMask", + "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": "194325f07b984ff697e728dee7c10fb4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.SpriteMask" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBAMaterialSlot", + "m_ObjectId": "194325f07b984ff697e728dee7c10fb4", + "m_Id": 0, + "m_DisplayName": "Sprite Mask", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SpriteMask", + "m_StageCapability": 2, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "2f97c8a5800d46e38d620c0be110a8bc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -691.0, + "y": 377.9999694824219, + "width": 144.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "4215d70d74d948418a160ad4566493dd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "77ece1b84d1844a1a29038dff3b05cf5" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "35f165b2e81241d588e753630e8f9442", + "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_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "36f527c348c84fb3a6d37625e041f27b", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "d401b5c1617d4d8fa74fda08a28be573" + }, + { + "m_Id": "77ece1b84d1844a1a29038dff3b05cf5" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "3c90342919d6490e9b3eee154279747f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -529.0, + "y": 0.0, + "width": 208.0, + "height": 433.0 + } + }, + "m_Slots": [ + { + "m_Id": "f04d1d3837884b1cbcd278a0e4b6b7c4" + }, + { + "m_Id": "c21c93de0209498bbd79999830fb7d74" + }, + { + "m_Id": "054506f6c3e444c9acabdbd6e3ed9f31" + }, + { + "m_Id": "02b89de564bb4f728f9ee9eed9477a24" + }, + { + "m_Id": "61ba529fe50e46d584355b3fb05f1621" + }, + { + "m_Id": "d3b4b9f8bda848c599f6726a29ca0c03" + }, + { + "m_Id": "9aac67e52c0748378621963b8c5ef918" + }, + { + "m_Id": "d10a39ce4a784306b4743aedff005da9" + } + ], + "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_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "4215d70d74d948418a160ad4566493dd", + "m_Id": 0, + "m_DisplayName": "NormalMap", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "45122eccdc864de3bc413b1f084d6f67", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -517.0, + "y": 351.0, + "width": 208.0, + "height": 433.0 + } + }, + "m_Slots": [ + { + "m_Id": "dee6c5706a0e4d189b841459b04615ba" + }, + { + "m_Id": "84a09cf598564512be8f79a3d4886dd6" + }, + { + "m_Id": "35f165b2e81241d588e753630e8f9442" + }, + { + "m_Id": "a4ba6c08d9fa479b9e313231d4bb788f" + }, + { + "m_Id": "6547c369b9324d88a1aad5df6b669c58" + }, + { + "m_Id": "5786b461a7c8452b9ef86da3c4eb88da" + }, + { + "m_Id": "e73fb90cc9cc49508cf09063b24b7bd4" + }, + { + "m_Id": "6d8005a9b0cf4efa95c7f754a752a56b" + } + ], + "synonyms": [ + "tex2d" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 1, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "4bc3eba0038a410b8b6e7c25ea419ed6", + "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": "0892ce6c38fd47f8be3616c9a428babb" + } + ], + "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.Texture2DInputMaterialSlot", + "m_ObjectId": "5786b461a7c8452b9ef86da3c4eb88da", + "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": "", + "m_Guid": "" + }, + "m_DefaultType": 3 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "61ba529fe50e46d584355b3fb05f1621", + "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_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6547c369b9324d88a1aad5df6b669c58", + "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_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "6d8005a9b0cf4efa95c7f754a752a56b", + "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.Internal.Texture2DShaderProperty", + "m_ObjectId": "77ece1b84d1844a1a29038dff3b05cf5", + "m_Guid": { + "m_GuidSerialized": "ae0d01d0-d94f-4679-a8f6-e458e3f176cb" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "NormalMap", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "NormalMap", + "m_DefaultReferenceName": "_NormalMap", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": { + "m_SerializedTexture": "", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "useTexelSize": true, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "7a3b9597b5f6411780c8552810ffd7c5", + "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.5, + "y": 0.5, + "z": 0.5 + }, + "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": "84a09cf598564512be8f79a3d4886dd6", + "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": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "9aac67e52c0748378621963b8c5ef918", + "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.BlockNode", + "m_ObjectId": "9c4b5c837b1a4855bdbd05f54b4fd5db", + "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": "7a3b9597b5f6411780c8552810ffd7c5" + } + ], + "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": "a4ba6c08d9fa479b9e313231d4bb788f", + "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_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "b5b7e7168d7b470b8517ac7023db7b9f", + "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.BlockNode", + "m_ObjectId": "bfd127873db24f72b1f3e5f473dc2503", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.NormalTS", + "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": "f2d0369975124643a3eeb59e1983b651" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.NormalTS" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c21c93de0209498bbd79999830fb7d74", + "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": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "c5bce52bcd5146adb0386aae19a0d9eb", + "m_Datas": [], + "m_ActiveSubTarget": { + "m_Id": "d9c9122b3f5d4700b814b8a8c239f12a" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZTestMode": 4, + "m_ZWriteControl": 1, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_DisableTint": false, + "m_Sort3DAs2DCompatible": false, + "m_AdditionalMotionVectorMode": 0, + "m_AlembicMotionVectors": false, + "m_SupportsLODCrossFade": false, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "cef1b914f234419187751200ae1c1530", + "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.SamplerStateMaterialSlot", + "m_ObjectId": "d10a39ce4a784306b4743aedff005da9", + "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.BlockNode", + "m_ObjectId": "d16d670086a44e2cb7645b3a55ae85ec", + "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": "b5b7e7168d7b470b8517ac7023db7b9f" + } + ], + "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.Texture2DInputMaterialSlot", + "m_ObjectId": "d3b4b9f8bda848c599f6726a29ca0c03", + "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": "", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "d401b5c1617d4d8fa74fda08a28be573", + "m_Guid": { + "m_GuidSerialized": "60388ea1-7855-49ed-b493-ed8057cc17ad" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "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_PerRendererData": false, + "m_customAttributes": [], + "m_Value": { + "m_SerializedTexture": "", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "useTexelSize": true, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalSpriteLitSubTarget", + "m_ObjectId": "d9c9122b3f5d4700b814b8a8c239f12a" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "dd87aca122594b448f0fcc6ed0143cb5", + "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.Vector4MaterialSlot", + "m_ObjectId": "dee6c5706a0e4d189b841459b04615ba", + "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.UVMaterialSlot", + "m_ObjectId": "e73fb90cc9cc49508cf09063b24b7bd4", + "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.Vector4MaterialSlot", + "m_ObjectId": "f04d1d3837884b1cbcd278a0e4b6b7c4", + "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.BlockNode", + "m_ObjectId": "f175a76b6d5c4744b27aa6f3a8243a0b", + "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": "fdb9b96e1c2e4bf3982e2ff017ea484b" + } + ], + "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.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "f2d0369975124643a3eeb59e1983b651", + "m_Id": 0, + "m_DisplayName": "Normal (Tangent Space)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "NormalTS", + "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_Space": 3 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "fdb9b96e1c2e4bf3982e2ff017ea484b", + "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 +} + diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSpriteLit.shadergraph.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSpriteLit.shadergraph.meta new file mode 100644 index 00000000000..2fd00180ece --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh/Rabbit/RabbitSpriteLit.shadergraph.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 025ce8dca3a9d6143aefb9e2cdc2dd42 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} + useAsTemplate: 0 + exposeTemplateAsShader: 0 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh_Shadergraph.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh_Shadergraph.unity new file mode 100644 index 00000000000..f9a3b2d01a8 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh_Shadergraph.unity @@ -0,0 +1,531 @@ +%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: 10 + 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: 3 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + 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_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + 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 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &652049016 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 652049019} + - component: {fileID: 652049018} + - component: {fileID: 652049017} + - component: {fileID: 652049020} + - component: {fileID: 652049021} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &652049017 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652049016} + m_Enabled: 1 +--- !u!20 &652049018 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652049016} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + 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: 5 + 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: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &652049019 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652049016} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &652049020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652049016} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData + m_RenderShadows: 0 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: 2 + 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_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!114 &652049021 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652049016} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73231aa468d81ea49bc3d914080de185, type: 3} + m_Name: + m_EditorClassIdentifier: UniversalGraphicsTests::UniversalGraphicsTestSettings + ImageComparisonSettings: + TargetWidth: 512 + TargetHeight: 512 + TargetMSAASamples: 1 + PerPixelCorrectnessThreshold: 0.001 + PerPixelGammaThreshold: 0.003921569 + PerPixelAlphaThreshold: 0.003921569 + RMSEThreshold: 0 + AverageCorrectnessThreshold: 0.005 + IncorrectPixelsThreshold: 0.0000038146973 + UseHDR: 0 + UseBackBuffer: 0 + ImageResolution: 0 + ActiveImageTests: 1 + ActivePixelTests: 7 + WaitFrames: 0 + XRCompatible: 1 + gpuDrivenCompatible: 1 + CheckMemoryAllocation: 1 + renderBackendCompatibility: 2 + SetBackBufferResolution: 0 +--- !u!1001 &1737688778 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 458180813252086991, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 435a2f546d47bd348876e1cc4c677120, type: 2} + - target: {fileID: 1398665126493047632, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 435a2f546d47bd348876e1cc4c677120, type: 2} + - target: {fileID: 1632170264282057549, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 435a2f546d47bd348876e1cc4c677120, type: 2} + - target: {fileID: 2737911938454885460, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 435a2f546d47bd348876e1cc4c677120, type: 2} + - target: {fileID: 3676411556188011445, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_Name + value: Player + objectReference: {fileID: 0} + - target: {fileID: 3844793788667601060, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 435a2f546d47bd348876e1cc4c677120, type: 2} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalScale.x + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalScale.y + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalScale.z + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.17 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalPosition.y + value: -1.61 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4089589904225066195, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4119827975184519139, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 3a9336001693c9d498c4f6b0dd63cf16, type: 2} + - target: {fileID: 4793552231630281593, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 435a2f546d47bd348876e1cc4c677120, type: 2} + - target: {fileID: 5130528909240275021, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 3a9336001693c9d498c4f6b0dd63cf16, type: 2} + - target: {fileID: 6098476769238461331, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_Avatar + value: + objectReference: {fileID: 9000000, guid: 44c140d2f39da44cf99ca658382e0a55, type: 3} + - target: {fileID: 6098476769238461331, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: m_Controller + value: + objectReference: {fileID: 0} + - target: {fileID: 6415978003458686069, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 3a9336001693c9d498c4f6b0dd63cf16, type: 2} + - target: {fileID: 8796635485950567628, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 3a9336001693c9d498c4f6b0dd63cf16, type: 2} + - target: {fileID: 9079113487404157822, guid: 9b40ed50f44de45b19eb4780897e047c, + type: 3} + propertyPath: 'm_Materials.Array.data[0]' + value: + objectReference: {fileID: 2100000, guid: 3a9336001693c9d498c4f6b0dd63cf16, type: 2} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 9b40ed50f44de45b19eb4780897e047c, type: 3} +--- !u!1 &1989874459 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1989874461} + - component: {fileID: 1989874460} + m_Layer: 0 + m_Name: Light 2D + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1989874460 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1989874459} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 073797afb82c5a1438f328866b10b3f0, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.Light2D + m_ComponentVersion: 2 + m_LightType: 3 + m_BlendStyleIndex: 0 + m_FalloffIntensity: 0.5 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_LightVolumeIntensity: 1 + m_LightVolumeEnabled: 0 + m_ApplyToSortingLayers: eb0feddf00000000e980ef06 + m_LightCookieSprite: {fileID: 0} + m_DeprecatedPointLightCookieSprite: {fileID: 0} + m_LightOrder: 0 + m_AlphaBlendOnOverlap: 0 + m_OverlapOperation: 0 + m_NormalMapDistance: 3 + m_NormalMapQuality: 1 + m_UseNormalMap: 0 + m_ShadowsEnabled: 0 + m_ShadowIntensity: 0.75 + m_ShadowSoftness: 0.3 + m_ShadowSoftnessFalloffIntensity: 0.5 + m_ShadowVolumeIntensityEnabled: 0 + m_ShadowVolumeIntensity: 0.75 + m_LocalBounds: + m_Center: {x: 0, y: -0.00000011920929, z: 0} + m_Extent: {x: 0.9985302, y: 0.99853027, z: 0} + m_PointLightInnerAngle: 360 + m_PointLightOuterAngle: 360 + m_PointLightInnerRadius: 0 + m_PointLightOuterRadius: 4.9685483 + m_ShapeLightParametricSides: 5 + m_ShapeLightParametricAngleOffset: 0 + m_ShapeLightParametricRadius: 1 + m_ShapeLightFalloffSize: 0.5 + m_ShapeLightFalloffOffset: {x: 0, y: 0} + m_ShapePath: + - {x: -0.5, y: -0.5, z: 0} + - {x: 0.5, y: -0.5, z: 0} + - {x: 0.5, y: 0.5, z: 0} + - {x: -0.5, y: 0.5, z: 0} +--- !u!4 &1989874461 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1989874459} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.5, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 652049019} + - {fileID: 1989874461} + - {fileID: 1737688778} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh_Shadergraph.unity.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh_Shadergraph.unity.meta new file mode 100644 index 00000000000..9a16a38aa89 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/065_2D_Lights_SkinMesh_Shadergraph.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2742d1ce1e35ccd4db46f4c6a5913ade +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 4027e0f9b595649ec74e8c8e31741039018656d7 Mon Sep 17 00:00:00 2001 From: Esmeralda Salamone Date: Fri, 17 Oct 2025 18:15:21 +0000 Subject: [PATCH 103/115] [ShaderGraph] Subwindows are always visible. --- .../Editor/Drawing/Inspector/WindowDockingLayout.cs | 6 +++--- .../Editor/Drawing/Manipulators/WindowDraggable.cs | 2 +- .../Editor/Drawing/Views/GraphEditorView.cs | 2 +- .../Editor/Drawing/Views/GraphSubWindow.cs | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Packages/com.unity.shadergraph/Editor/Drawing/Inspector/WindowDockingLayout.cs b/Packages/com.unity.shadergraph/Editor/Drawing/Inspector/WindowDockingLayout.cs index 2aa508502a5..e9a3727bd66 100644 --- a/Packages/com.unity.shadergraph/Editor/Drawing/Inspector/WindowDockingLayout.cs +++ b/Packages/com.unity.shadergraph/Editor/Drawing/Inspector/WindowDockingLayout.cs @@ -82,10 +82,10 @@ public void CalculateDockingCornerAndOffset(Rect layout, Rect parentLayout) m_Size = layout.size; } - public void ClampToParentWindow() + public void ClampToParentWindow(Rect parentLayout) { - m_HorizontalOffset = Mathf.Max(0f, m_HorizontalOffset); - m_VerticalOffset = Mathf.Max(0f, m_VerticalOffset); + m_HorizontalOffset = Mathf.Clamp(m_HorizontalOffset, 0, parentLayout.width - m_Size.x); + m_VerticalOffset = Mathf.Clamp(m_VerticalOffset, 0, parentLayout.height - m_Size.y); } public void ApplyPosition(VisualElement target) diff --git a/Packages/com.unity.shadergraph/Editor/Drawing/Manipulators/WindowDraggable.cs b/Packages/com.unity.shadergraph/Editor/Drawing/Manipulators/WindowDraggable.cs index d5c49bd9d28..43d4c614cd6 100644 --- a/Packages/com.unity.shadergraph/Editor/Drawing/Manipulators/WindowDraggable.cs +++ b/Packages/com.unity.shadergraph/Editor/Drawing/Manipulators/WindowDraggable.cs @@ -106,7 +106,7 @@ void OnMouseUp(MouseUpEvent evt) // Recalculate which corner to dock to m_WindowDockingLayout.CalculateDockingCornerAndOffset(target.layout, target.parent.layout); - m_WindowDockingLayout.ClampToParentWindow(); + m_WindowDockingLayout.ClampToParentWindow(target.parent.layout); // Use the docking results to figure which of left/right and top/bottom needs to be set. m_WindowDockingLayout.ApplyPosition(target); diff --git a/Packages/com.unity.shadergraph/Editor/Drawing/Views/GraphEditorView.cs b/Packages/com.unity.shadergraph/Editor/Drawing/Views/GraphEditorView.cs index 299a31c838c..eacf96e3fbc 100644 --- a/Packages/com.unity.shadergraph/Editor/Drawing/Views/GraphEditorView.cs +++ b/Packages/com.unity.shadergraph/Editor/Drawing/Views/GraphEditorView.cs @@ -1473,7 +1473,7 @@ void SerializeMasterPreviewLayout(GeometryChangedEvent evt) void UpdateSerializedWindowLayout() { m_FloatingWindowsLayout.previewLayout.CalculateDockingCornerAndOffset(m_MasterPreviewView.layout, m_GraphView.layout); - m_FloatingWindowsLayout.previewLayout.ClampToParentWindow(); + m_FloatingWindowsLayout.previewLayout.ClampToParentWindow(m_GraphView.layout); blackboardController.blackboard.ClampToParentLayout(m_GraphView.layout); diff --git a/Packages/com.unity.shadergraph/Editor/Drawing/Views/GraphSubWindow.cs b/Packages/com.unity.shadergraph/Editor/Drawing/Views/GraphSubWindow.cs index c2e99305daa..84f1986ce9a 100644 --- a/Packages/com.unity.shadergraph/Editor/Drawing/Views/GraphSubWindow.cs +++ b/Packages/com.unity.shadergraph/Editor/Drawing/Views/GraphSubWindow.cs @@ -291,7 +291,7 @@ void BuildManipulators() public void ClampToParentLayout(Rect parentLayout) { windowDockingLayout.CalculateDockingCornerAndOffset(layout, parentLayout); - windowDockingLayout.ClampToParentWindow(); + windowDockingLayout.ClampToParentWindow(parentLayout); // If the parent shader graph window is being resized smaller than this window on either axis if (parentLayout.width < this.layout.width || parentLayout.height < this.layout.height) @@ -361,7 +361,7 @@ void SerializeLayout() void OnMoveEnd(MouseUpEvent upEvent) { windowDockingLayout.CalculateDockingCornerAndOffset(layout, ParentView.layout); - windowDockingLayout.ClampToParentWindow(); + windowDockingLayout.ClampToParentWindow(ParentView.layout); SerializeLayout(); } From 0e1ce39a84fdd40f1e4da072f03845d25b143c18 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Fri, 17 Oct 2025 18:15:22 +0000 Subject: [PATCH 104/115] [VFX] Do not close editor when save as under the same asset name --- .../Editor/GraphView/Views/VFXView.cs | 16 +++++++++++----- .../AllTests/Editor/Tests/VFXGUITests.cs | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs index 671cb69d0af..7b7531071d0 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs @@ -1790,14 +1790,20 @@ internal void OnSave() internal void SaveAs(string newPath) { - m_ComponentBoard?.DeactivateBoundsRecordingIfNeeded(); //Avoids saving the graph with unnecessary bounds computations - var resource = controller.graph.visualEffectResource; - var oldFilePath = AssetDatabase.GetAssetPath(resource); - if (!AssetDatabase.CopyAsset(oldFilePath, newPath)) + if (string.Compare(newPath, oldFilePath, StringComparison.InvariantCultureIgnoreCase) == 0) { - Debug.Log($"Could not save VFX Graph at {newPath}"); + this.OnSave(); + } + else + { + m_ComponentBoard?.DeactivateBoundsRecordingIfNeeded(); //Avoids saving the graph with unnecessary bounds computations + + if (!AssetDatabase.CopyAsset(oldFilePath, newPath)) + { + Debug.LogError($"Could not save VFX Graph at {newPath}"); + } } } diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXGUITests.cs b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXGUITests.cs index 6668d4894af..98071481a99 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXGUITests.cs +++ b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXGUITests.cs @@ -980,6 +980,24 @@ public IEnumerator Check_Selection_Is_Emptied_On_Delete() Assert.IsTrue(Selection.objects?.Length == 1); } + [UnityTest, Description("Covers: UUM-121821")] + public IEnumerator Check_SaveAs_On_Same_File_Do_Not_Close_Editor() + { + // Prepare + var window = CreateSimpleVFXGraph(); + yield return null; + var assetPath = AssetDatabase.GetAssetPath(window.displayedResource.asset); + + // Act + window.graphView.SaveAs(assetPath); + + for (var i = 0; i < 10; i++) + yield return null; + + // Assert + Assert.IsNotNull(window.displayedResource, "The displayedResource is null, which mean the No Asset window is displayed"); + } + private void CheckNumericPropertyRM(Func> creator, UnityEngine.PropertyAttribute attribute, T initialValue, List<(T, T)> testCases) { // Arrange From bb8d32871f950f07e7356001dab34b918fdcc459 Mon Sep 17 00:00:00 2001 From: Rasmus Roenn Nielsen Date: Fri, 17 Oct 2025 18:15:23 +0000 Subject: [PATCH 105/115] Avoid heap allocations when drawing APV gizmos (UUM-121201) --- .../ProbeVolume/ProbeSubdivisionContext.cs | 19 +- .../Lighting/ProbeVolume/ProbeVolumeGizmos.cs | 210 ++++++++++++++++ .../ProbeVolume/ProbeVolumeGizmos.cs.meta | 3 + .../ProbeVolume/ProbeAdjustmentVolume.cs | 7 +- .../Lighting/ProbeVolume/ProbeVolume.cs | 224 +++--------------- .../ProbeVolumeBakingSet.Editor.cs | 1 + 6 files changed, 258 insertions(+), 206 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeGizmos.cs create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeGizmos.cs.meta diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeSubdivisionContext.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeSubdivisionContext.cs index cd804267330..f54e06a7637 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeSubdivisionContext.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeSubdivisionContext.cs @@ -77,11 +77,24 @@ IEnumerator Subdivide(bool showProgress) var ctx = AdaptiveProbeVolumes.PrepareProbeSubdivisionContext(perSceneDataList, true); var contributors = GIContributors.Find(GIContributors.ContributorFilter.All); + var cullCtx = new ProbeVolume.CellCullingContext + { + ActiveCamera = null, + FrustumPlanes = stackalloc Plane[6] + }; + ProbeVolume.PrepareCellCulling(ref cullCtx); + + var sceneToBakingSetMap = ProbeVolumeBakingSet.SceneToBakingSet.Instance; + var probeRefVol = ProbeReferenceVolume.instance; + // Cull all the cells that are not visible (we don't need them for realtime debug) - ctx.cells.RemoveAll(c => + for (int i = ctx.cells.Count - 1; i >= 0; i--) { - return probeVolume.ShouldCullCell(c.position); - }); + var cell = ctx.cells[i]; + bool shouldRemove = probeVolume.ShouldCullCell(cullCtx, sceneToBakingSetMap, probeRefVol, cell.position); + if (shouldRemove) + ctx.cells.RemoveAt(i); + } Camera activeCamera = Camera.current ?? SceneView.lastActiveSceneView.camera; diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeGizmos.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeGizmos.cs new file mode 100644 index 00000000000..284417560ac --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeGizmos.cs @@ -0,0 +1,210 @@ +using System.Collections.Generic; +using UnityEditor; + +namespace UnityEngine.Rendering +{ + internal static class ProbeVolumeGizmos + { + static MeshGizmo _brickMeshGizmo; + static MeshGizmo _cellMeshGizmo; + static double _lastDrawAt = 0; + + static readonly string _gizmoPath = "Packages/com.unity.render-pipelines.core/Editor/Resources/Gizmos"; + static readonly string _probeAdjustmentVolumeIconPath = _gizmoPath + "/ProbeTouchupVolume.png"; + static readonly string _probeVolumeIconPath = _gizmoPath + "/ProbeVolume.png"; + + static ProbeVolumeGizmos() + { + EditorApplication.update += Update; + } + + static void Update() + { + bool resourcesAllocated = _brickMeshGizmo != null || _cellMeshGizmo != null; + + if (resourcesAllocated) + { + bool shouldCleanUp = EditorApplication.timeSinceStartup - _lastDrawAt > 1.0; + if (shouldCleanUp) + { + _brickMeshGizmo?.Dispose(); + _brickMeshGizmo = null; + _cellMeshGizmo?.Dispose(); + _cellMeshGizmo = null; + } + } + } + + [DrawGizmo(GizmoType.Active | GizmoType.Selected | GizmoType.NonSelected)] + static void DrawProbeAdjustmentVolumes(ProbeAdjustmentVolume volume, GizmoType gizmoType) + { + Gizmos.DrawIcon(volume.transform.position, _probeAdjustmentVolumeIconPath, true); + } + + [DrawGizmo(GizmoType.Active | GizmoType.Selected | GizmoType.NonSelected)] + static void DrawProbeVolumeGizmos(ProbeVolume volume, GizmoType gizmoType) + { + _lastDrawAt = EditorApplication.timeSinceStartup; + + Gizmos.DrawIcon(volume.transform.position, _probeVolumeIconPath, true); + + var probeRefVolume = ProbeReferenceVolume.instance; + var sceneToBakingSetMap = ProbeVolumeBakingSet.SceneToBakingSet.Instance; + var allVolumes = ProbeVolume.instances; + + if (!probeRefVolume.isInitialized || allVolumes.Count == 0) + return; + + // Only the first PV of the available ones will draw gizmos. + if (allVolumes[0] != volume) + return; + + var debugDisplay = probeRefVolume.probeVolumeDebug; + + float minBrickSize = probeRefVolume.MinBrickSize(); + var cellSizeInMeters = probeRefVolume.MaxBrickSize(); + var probeOffset = probeRefVolume.ProbeOffset() + ProbeVolumeDebug.currentOffset; + if (debugDisplay.realtimeSubdivision) + { + var bakingSet = ProbeVolumeBakingSet.GetBakingSetForScene(volume.gameObject.scene); + if (bakingSet == null) + return; + + // Overwrite settings with data from profile + minBrickSize = ProbeVolumeBakingSet.GetMinBrickSize(bakingSet.minDistanceBetweenProbes); + cellSizeInMeters = ProbeVolumeBakingSet.GetCellSizeInBricks(bakingSet.simplificationLevels) * minBrickSize; + probeOffset = bakingSet.probeOffset; + } + + if (debugDisplay.drawBricks) + { + var subDivColors = probeRefVolume.subdivisionDebugColors; + + if (_brickMeshGizmo == null) + _brickMeshGizmo = new MeshGizmo((int)(Mathf.Pow(3, ProbeBrickIndex.kMaxSubdivisionLevels) * MeshGizmo.vertexCountPerCube)); + _brickMeshGizmo.Clear(); + + if (debugDisplay.realtimeSubdivision) + { + // realtime subdiv cells are already culled + foreach (var kp in probeRefVolume.realtimeSubdivisionInfo) + { + var cellVolume = kp.Key; + + foreach (var brick in kp.Value) + DrawAndAddBrick(_brickMeshGizmo, brick, minBrickSize, probeOffset, subDivColors); + } + } + else + { + var cullCtx = new ProbeVolume.CellCullingContext + { + ActiveCamera = null, + FrustumPlanes = stackalloc Plane[6] + }; + ProbeVolume.PrepareCellCulling(ref cullCtx); + + foreach (var cell in probeRefVolume.cells.Values) + { + if (!cell.loaded) + continue; + + if (volume.ShouldCullCell(cullCtx, sceneToBakingSetMap, probeRefVolume, cell.desc.position)) + continue; + + if (cell.data.bricks == null) + continue; + + foreach (var brick in cell.data.bricks) + DrawAndAddBrick(_brickMeshGizmo, brick, minBrickSize, probeOffset, subDivColors); + } + } + + _brickMeshGizmo.RenderWireframe(Matrix4x4.identity, gizmoName: "Brick Gizmo Rendering"); + } + + if (debugDisplay.drawCells) + { + Color s_LoadedColor = new Color(0, 1, 0.5f, 0.2f); + Color s_UnloadedColor = new Color(1, 0.0f, 0.0f, 0.2f); + Color s_StreamingColor = new Color(0.0f, 0.0f, 1.0f, 0.2f); + Color s_LowScoreColor = new Color(0, 0, 0, 0.2f); + Color s_HighScoreColor = new Color(1, 1, 0, 0.2f); + + var oldGizmoMatrix = Gizmos.matrix; + Gizmos.matrix = Matrix4x4.identity; + + if (_cellMeshGizmo == null) + _cellMeshGizmo = new MeshGizmo(); + _cellMeshGizmo.Clear(); + + float minStreamingScore = probeRefVolume.minStreamingScore; + float streamingScoreRange = probeRefVolume.maxStreamingScore - probeRefVolume.minStreamingScore; + + if (debugDisplay.realtimeSubdivision) + { + foreach (var kp in probeRefVolume.realtimeSubdivisionInfo) + { + DrawAndAddCell(_cellMeshGizmo, kp.Key.center, s_LoadedColor, cellSizeInMeters); + } + } + else + { + var cullCtx = new ProbeVolume.CellCullingContext + { + ActiveCamera = null, + FrustumPlanes = stackalloc Plane[6] + }; + ProbeVolume.PrepareCellCulling(ref cullCtx); + + foreach (var cell in probeRefVolume.cells.Values) + { + if (volume.ShouldCullCell(cullCtx, sceneToBakingSetMap, probeRefVolume, cell.desc.position)) + continue; + + Color color; + if (debugDisplay.displayCellStreamingScore) + { + float lerpFactor = (cell.streamingInfo.streamingScore - minStreamingScore) / streamingScoreRange; + color = Color.Lerp(s_HighScoreColor, s_LowScoreColor, lerpFactor); + } + else + { + if (cell.streamingInfo.IsStreaming()) + color = s_StreamingColor; + else + color = cell.loaded ? s_LoadedColor : s_UnloadedColor; + } + + var positionF = new Vector4(cell.desc.position.x, cell.desc.position.y, cell.desc.position.z, 0.0f); + var center = (Vector4)probeOffset + positionF * cellSizeInMeters + cellSizeInMeters * 0.5f * Vector4.one; + DrawAndAddCell(_cellMeshGizmo, center, color, cellSizeInMeters); + } + } + + _cellMeshGizmo.RenderWireframe(Gizmos.matrix, gizmoName: "Brick Gizmo Rendering"); + Gizmos.matrix = oldGizmoMatrix; + } + } + + static void DrawAndAddCell(MeshGizmo meshGizmo, Vector4 center, Color color, float cellSizeInMeters) + { + Gizmos.color = color; + Gizmos.DrawCube(center, Vector3.one * cellSizeInMeters); + var wireColor = color; + wireColor.a = 1.0f; + meshGizmo.AddWireCube(center, Vector3.one * cellSizeInMeters, wireColor); + } + + static void DrawAndAddBrick(MeshGizmo meshGizmo, ProbeBrickIndex.Brick brick, float minBrickSize, Vector3 probeOffset, Color[] subDivColors) + { + if (brick.subdivisionLevel < 0) + return; + + float brickSize = minBrickSize * ProbeReferenceVolume.CellSize(brick.subdivisionLevel); + Vector3 scaledSize = new Vector3(brickSize, brickSize, brickSize); + Vector3 scaledPos = probeOffset + new Vector3(brick.position.x * minBrickSize, brick.position.y * minBrickSize, brick.position.z * minBrickSize) + scaledSize / 2; + meshGizmo.AddWireCube(scaledPos, scaledSize, subDivColors[brick.subdivisionLevel]); + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeGizmos.cs.meta b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeGizmos.cs.meta new file mode 100644 index 00000000000..569399895c3 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeGizmos.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1d0eb70f099740d48a54003f68140928 +timeCreated: 1760362000 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeAdjustmentVolume.cs b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeAdjustmentVolume.cs index 503baeee8ab..72f08c797de 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeAdjustmentVolume.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeAdjustmentVolume.cs @@ -227,11 +227,6 @@ internal Vector3 GetVirtualOffset() return Vector3.zero; return (transform.rotation * Quaternion.Euler(virtualOffsetRotation) * Vector3.forward) * virtualOffsetDistance; } - - void OnDrawGizmos() - { - Gizmos.DrawIcon(transform.position, ProbeVolume.s_gizmosLocationPath + "ProbeTouchupVolume.png", true); - } #endif // Migration related stuff @@ -259,7 +254,7 @@ void ISerializationCallbackReceiver.OnAfterDeserialize() { if (version == Version.Count) // deserializing and object without version version = Version.Initial; // reset to run the migration - + if (version < Version.Mode) { #pragma warning disable 618 // Type or member is obsolete diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs index a6a719f22d1..402319fb0f8 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using UnityEngine.SceneManagement; @@ -178,24 +179,8 @@ internal void GetSubdivisionOverride(int maxSubdivisionLevel, out int minLevel, } } - // Momentarily moving the gizmo rendering for bricks and cells to Probe Volume itself, - // only the first probe volume in the scene will render them. The reason is that we dont have any - // other non-hidden component related to APV. - #region APVGizmo - internal static List instances = new(); - MeshGizmo brickGizmos; - MeshGizmo cellGizmo; - - void DisposeGizmos() - { - brickGizmos?.Dispose(); - brickGizmos = null; - cellGizmo?.Dispose(); - cellGizmo = null; - } - void OnEnable() { instances.Add(this); @@ -204,20 +189,34 @@ void OnEnable() void OnDisable() { instances.Remove(this); - DisposeGizmos(); } - // Only the first PV of the available ones will draw gizmos. - bool IsResponsibleToDrawGizmo() => instances.Count > 0 && instances[0] == this; + internal ref struct CellCullingContext + { + public Camera ActiveCamera; + public Span FrustumPlanes; + } + + internal static void PrepareCellCulling(ref CellCullingContext ctx) + { + ctx.ActiveCamera = Camera.current; +#if UNITY_EDITOR + if (ctx.ActiveCamera == null) + ctx.ActiveCamera = UnityEditor.SceneView.lastActiveSceneView.camera; +#endif - internal bool ShouldCullCell(Vector3 cellPosition) + Debug.Assert(ctx.FrustumPlanes.Length == 6); + GeometryUtility.CalculateFrustumPlanes(ctx.ActiveCamera, ctx.FrustumPlanes); + } + + internal bool ShouldCullCell(in CellCullingContext ctx, Dictionary sceneToBakingSetMap, ProbeReferenceVolume probeRefVolume, Vector3 cellPosition) { - var cellSizeInMeters = ProbeReferenceVolume.instance.MaxBrickSize(); - var probeOffset = ProbeReferenceVolume.instance.ProbeOffset() + ProbeVolumeDebug.currentOffset; - var debugDisplay = ProbeReferenceVolume.instance.probeVolumeDebug; + var cellSizeInMeters = probeRefVolume.MaxBrickSize(); + var probeOffset = probeRefVolume.ProbeOffset() + ProbeVolumeDebug.currentOffset; + var debugDisplay = probeRefVolume.probeVolumeDebug; if (debugDisplay.realtimeSubdivision) { - var bakingSet = ProbeVolumeBakingSet.GetBakingSetForScene(gameObject.scene); + var bakingSet = ProbeVolumeBakingSet.GetBakingSetForScene(sceneToBakingSetMap, gameObject.scene.GetGUID()); if (bakingSet == null) return true; @@ -225,193 +224,24 @@ internal bool ShouldCullCell(Vector3 cellPosition) cellSizeInMeters = ProbeVolumeBakingSet.GetMinBrickSize(bakingSet.minDistanceBetweenProbes) * ProbeVolumeBakingSet.GetCellSizeInBricks(bakingSet.simplificationLevels); probeOffset = bakingSet.probeOffset + ProbeVolumeDebug.currentOffset; } - Camera activeCamera = Camera.current; -#if UNITY_EDITOR - if (activeCamera == null) - activeCamera = UnityEditor.SceneView.lastActiveSceneView.camera; -#endif - if (activeCamera == null) + if (ctx.ActiveCamera == null) return true; - var cameraTransform = activeCamera.transform; + var cameraTransform = ctx.ActiveCamera.transform; Vector3 cellCenterWS = probeOffset + cellPosition * cellSizeInMeters + Vector3.one * (cellSizeInMeters / 2.0f); // Round down to cell size distance float roundedDownDist = Mathf.Floor(Vector3.Distance(cameraTransform.position, cellCenterWS) / cellSizeInMeters) * cellSizeInMeters; - if (roundedDownDist > ProbeReferenceVolume.instance.probeVolumeDebug.subdivisionViewCullingDistance) + if (roundedDownDist > probeRefVolume.probeVolumeDebug.subdivisionViewCullingDistance) return true; - var frustumPlanes = GeometryUtility.CalculateFrustumPlanes(activeCamera); var volumeAABB = new Bounds(cellCenterWS, cellSizeInMeters * Vector3.one); - return !GeometryUtility.TestPlanesAABB(frustumPlanes, volumeAABB); + return !GeometryUtility.TestPlanesAABB(ctx.FrustumPlanes, volumeAABB); } - - - struct CellDebugData - { - public Vector4 center; - public Color color; - } - - // Path to the gizmos location - internal readonly static string s_gizmosLocationPath = "Packages/com.unity.render-pipelines.core/Editor/Resources/Gizmos/"; - - // TODO: We need to get rid of Handles.DrawWireCube to be able to have those at runtime as well. - void OnDrawGizmos() - { - Gizmos.DrawIcon(transform.position, s_gizmosLocationPath + "ProbeVolume.png", true); - - if (!ProbeReferenceVolume.instance.isInitialized || !IsResponsibleToDrawGizmo()) - return; - - var debugDisplay = ProbeReferenceVolume.instance.probeVolumeDebug; - - float minBrickSize = ProbeReferenceVolume.instance.MinBrickSize(); - var cellSizeInMeters = ProbeReferenceVolume.instance.MaxBrickSize(); - var probeOffset = ProbeReferenceVolume.instance.ProbeOffset() + ProbeVolumeDebug.currentOffset; - if (debugDisplay.realtimeSubdivision) - { - var bakingSet = ProbeVolumeBakingSet.GetBakingSetForScene(gameObject.scene); - if (bakingSet == null) - return; - - // Overwrite settings with data from profile - minBrickSize = ProbeVolumeBakingSet.GetMinBrickSize(bakingSet.minDistanceBetweenProbes); - cellSizeInMeters = ProbeVolumeBakingSet.GetCellSizeInBricks(bakingSet.simplificationLevels) * minBrickSize; - probeOffset = bakingSet.probeOffset; - } - - if (debugDisplay.drawBricks) - { - var subdivColors = ProbeReferenceVolume.instance.subdivisionDebugColors; - - IEnumerable GetVisibleBricks() - { - if (debugDisplay.realtimeSubdivision) - { - // realtime subdiv cells are already culled - foreach (var kp in ProbeReferenceVolume.instance.realtimeSubdivisionInfo) - { - var cellVolume = kp.Key; - - foreach (var brick in kp.Value) - { - yield return brick; - } - } - } - else - { - foreach (var cell in ProbeReferenceVolume.instance.cells.Values) - { - if (!cell.loaded) - continue; - - if (ShouldCullCell(cell.desc.position)) - continue; - - if (cell.data.bricks == null) - continue; - - foreach (var brick in cell.data.bricks) - yield return brick; - } - } - } - - if (brickGizmos == null) - brickGizmos = new MeshGizmo((int)(Mathf.Pow(3, ProbeBrickIndex.kMaxSubdivisionLevels) * MeshGizmo.vertexCountPerCube)); - - brickGizmos.Clear(); - foreach (var brick in GetVisibleBricks()) - { - if (brick.subdivisionLevel < 0) - continue; - - float brickSize = minBrickSize * ProbeReferenceVolume.CellSize(brick.subdivisionLevel); - Vector3 scaledSize = new Vector3(brickSize, brickSize, brickSize); - Vector3 scaledPos = probeOffset + new Vector3(brick.position.x * minBrickSize, brick.position.y * minBrickSize, brick.position.z * minBrickSize) + scaledSize / 2; - brickGizmos.AddWireCube(scaledPos, scaledSize, subdivColors[brick.subdivisionLevel]); - } - - brickGizmos.RenderWireframe(Matrix4x4.identity, gizmoName: "Brick Gizmo Rendering"); - } - - if (debugDisplay.drawCells) - { - IEnumerable GetVisibleCellDebugData() - { - Color s_LoadedColor = new Color(0, 1, 0.5f, 0.2f); - Color s_UnloadedColor = new Color(1, 0.0f, 0.0f, 0.2f); - Color s_StreamingColor = new Color(0.0f, 0.0f, 1.0f, 0.2f); - Color s_LowScoreColor = new Color(0, 0, 0, 0.2f); - Color s_HighScoreColor = new Color(1, 1, 0, 0.2f); - - var prv = ProbeReferenceVolume.instance; - - float minStreamingScore = prv.minStreamingScore; - float streamingScoreRange = prv.maxStreamingScore - prv.minStreamingScore; - - if (debugDisplay.realtimeSubdivision) - { - foreach (var kp in prv.realtimeSubdivisionInfo) - { - var center = kp.Key.center; - yield return new CellDebugData { center = center, color = s_LoadedColor }; - } - } - else - { - foreach (var cell in ProbeReferenceVolume.instance.cells.Values) - { - if (ShouldCullCell(cell.desc.position)) - continue; - - var positionF = new Vector4(cell.desc.position.x, cell.desc.position.y, cell.desc.position.z, 0.0f); - var output = new CellDebugData(); - output.center = (Vector4)probeOffset + positionF * cellSizeInMeters + cellSizeInMeters * 0.5f * Vector4.one; - if (debugDisplay.displayCellStreamingScore) - { - float lerpFactor = (cell.streamingInfo.streamingScore - minStreamingScore) / streamingScoreRange; - output.color = Color.Lerp(s_HighScoreColor, s_LowScoreColor, lerpFactor); - } - else - { - if (cell.streamingInfo.IsStreaming()) - output.color = s_StreamingColor; - else - output.color = cell.loaded ? s_LoadedColor : s_UnloadedColor; - } - yield return output; - } - } - } - - var oldGizmoMatrix = Gizmos.matrix; - - if (cellGizmo == null) - cellGizmo = new MeshGizmo(); - cellGizmo.Clear(); - foreach (var cell in GetVisibleCellDebugData()) - { - Gizmos.color = cell.color; - Gizmos.matrix = Matrix4x4.identity; - - Gizmos.DrawCube(cell.center, Vector3.one * cellSizeInMeters); - var wireColor = cell.color; - wireColor.a = 1.0f; - cellGizmo.AddWireCube(cell.center, Vector3.one * cellSizeInMeters, wireColor); - } - cellGizmo.RenderWireframe(Gizmos.matrix, gizmoName: "Brick Gizmo Rendering"); - Gizmos.matrix = oldGizmoMatrix; - } - } - #endregion - #endif // UNITY_EDITOR } } // UnityEngine.Rendering.HDPipeline diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.Editor.cs b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.Editor.cs index bf777c2c424..a8534637637 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.Editor.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolumeBakingSet.Editor.cs @@ -339,6 +339,7 @@ internal static Dictionary SyncBaking return sceneToBakingSet; } + internal static ProbeVolumeBakingSet GetBakingSetForScene(Dictionary mapping, string sceneGUID) { return mapping.GetValueOrDefault(sceneGUID, null)?.Get(); } internal static ProbeVolumeBakingSet GetBakingSetForScene(string sceneGUID) { return SceneToBakingSet.Instance.GetValueOrDefault(sceneGUID, null)?.Get(); } internal static ProbeVolumeBakingSet GetBakingSetForScene(Scene scene) => GetBakingSetForScene(scene.GetGUID()); From 9f9f9d2e89108378e37add4f46a71ee71f41ccbd Mon Sep 17 00:00:00 2001 From: Edward Blais Date: Sat, 18 Oct 2025 00:50:18 +0000 Subject: [PATCH 106/115] [content automatically redacted] touching PlatformDependent folder --- .../UniversalRenderPipelineLightUI.Drawers.cs | 8 +- .../Editor/ShaderBuildPreprocessor.cs | 4 +- .../ProjectSettings/ProjectSettings.asset | 191 ++++++------ .../ProjectSettings/ProjectSettings.asset | 235 +++++++-------- .../ProjectSettings/ProjectSettings.asset | 241 ++++++++------- .../ProjectSettings/ProjectSettings.asset | 231 +++++++------- .../ProjectSettings/ProjectSettings.asset | 231 +++++++------- .../ProjectSettings/ProjectSettings.asset | 241 ++++++++------- .../ProjectSettings/ProjectSettings.asset | 157 +++++----- .../ProjectSettings/ProjectSettings.asset | 215 +++++++------ .../ProjectSettings/ProjectSettings.asset | 243 ++++++++------- .../ProjectSettings/ProjectSettings.asset | 243 ++++++++------- .../ProjectSettings/ProjectSettings.asset | 253 ++++++++-------- .../ProjectSettings/ProjectSettings.asset | 279 +++++++++-------- .../ProjectSettings/ProjectSettings.asset | 219 +++++++------- .../ProjectSettings/ProjectSettings.asset | 223 +++++++------- .../ProjectSettings/ProjectSettings.asset | 259 ++++++++-------- .../ProjectSettings/ProjectSettings.asset | 283 +++++++++--------- .../ProjectSettings/ProjectSettings.asset | 195 ++++++------ .../ProjectSettings/ProjectSettings.asset | 195 ++++++------ .../ProjectSettings/ProjectSettings.asset | 281 +++++++++-------- .../ProjectSettings/ProjectSettings.asset | 241 ++++++++------- .../ProjectSettings/ProjectSettings.asset | 243 ++++++++------- 23 files changed, 2422 insertions(+), 2489 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/Lighting/UniversalRenderPipelineLightUI.Drawers.cs b/Packages/com.unity.render-pipelines.universal/Editor/Lighting/UniversalRenderPipelineLightUI.Drawers.cs index 17247ffdafa..425d9f544ff 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/Lighting/UniversalRenderPipelineLightUI.Drawers.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/Lighting/UniversalRenderPipelineLightUI.Drawers.cs @@ -343,14 +343,12 @@ static void DrawShadowsContent(UniversalRenderPipelineSerializedLight serialized // this min bound should match the calculation in SharedLightData::GetNearPlaneMinBound() float nearPlaneMinBound = Mathf.Min(0.01f * serializedLight.settings.range.floatValue, 0.1f); EditorGUILayout.Slider(serializedLight.settings.shadowsNearPlane, nearPlaneMinBound, 10.0f, Styles.ShadowNearPlane); - var isHololens = false; var isQuest = false; #if XR_MANAGEMENT_4_0_1_OR_NEWER var buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); var buildTargetSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(buildTargetGroup); if (buildTargetSettings != null && buildTargetSettings.AssignedSettings != null && buildTargetSettings.AssignedSettings.activeLoaders.Count > 0) { - isHololens = buildTargetGroup == BuildTargetGroup.WSA; isQuest = buildTargetGroup == BuildTargetGroup.Android; } @@ -359,10 +357,10 @@ static void DrawShadowsContent(UniversalRenderPipelineSerializedLight serialized if (serializedLight.settings.light.shadows == LightShadows.Soft) EditorGUILayout.PropertyField(serializedLight.softShadowQualityProp, Styles.SoftShadowQuality); - if (isHololens || isQuest) + if (isQuest) { EditorGUILayout.HelpBox( - "Per-light soft shadow quality level is not supported on HoloLens and Oculus platforms. Use the Soft Shadow Quality setting in the URP Asset instead", + "Per-light soft shadow quality level is not supported on the Meta platforms. Use the Soft Shadow Quality setting in the URP Asset instead", MessageType.Warning ); } @@ -375,7 +373,7 @@ static void DrawShadowsContent(UniversalRenderPipelineSerializedLight serialized EditorGUILayout.PropertyField(serializedLight.customShadowLayers, Styles.customShadowLayers); if (serializedLight.customShadowLayers.boolValue) { - using (new EditorGUI.IndentLevelScope()) + using (new EditorGUI.IndentLevelScope()) EditorGUILayout.PropertyField(serializedLight.shadowRenderingLayers, Styles.ShadowLayer); } // Undo the changes in the light component because the SyncLightAndShadowLayers will change the value automatically when link is ticked diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ShaderBuildPreprocessor.cs b/Packages/com.unity.render-pipelines.universal/Editor/ShaderBuildPreprocessor.cs index b69643de379..2cbc9128f4e 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ShaderBuildPreprocessor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/ShaderBuildPreprocessor.cs @@ -169,7 +169,6 @@ internal sealed class PlatformBuildTimeDetect { private static PlatformBuildTimeDetect s_PlatformInfo; internal bool isStandaloneXR { get; private set; } - internal bool isHololens { get; private set; } internal bool isQuest { get; private set; } internal bool isSwitch { get; private set; } internal bool isSwitch2 { get; private set; } @@ -185,7 +184,6 @@ private PlatformBuildTimeDetect() if (buildTargetSettings != null && buildTargetSettings.AssignedSettings != null && buildTargetSettings.AssignedSettings.activeLoaders.Count > 0) { isStandaloneXR = buildTargetGroup == BuildTargetGroup.Standalone; - isHololens = buildTargetGroup == BuildTargetGroup.WSA; isQuest = buildTargetGroup == BuildTargetGroup.Android; } #endif @@ -313,7 +311,7 @@ private static void GetGlobalAndPlatformSettings(bool isDevelopmentBuild) if (platformBuildTimeDetect.isStandaloneXR) s_StripDebugDisplayShaders = true; - if (platformBuildTimeDetect.isHololens || platformBuildTimeDetect.isQuest) + if (platformBuildTimeDetect.isQuest) { s_KeepOffVariantForAdditionalLights = true; s_UseSoftShadowQualityLevelKeywords = true; diff --git a/Templates/com.unity.template.hdrp-blank/ProjectSettings/ProjectSettings.asset b/Templates/com.unity.template.hdrp-blank/ProjectSettings/ProjectSettings.asset index 711e056b683..c18cbd35f17 100644 --- a/Templates/com.unity.template.hdrp-blank/ProjectSettings/ProjectSettings.asset +++ b/Templates/com.unity.template.hdrp-blank/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1024 defaultScreenHeight: 768 defaultScreenWidthWeb: 960 @@ -142,12 +141,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -172,7 +169,7 @@ PlayerSettings: AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -222,8 +219,8 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -234,10 +231,10 @@ PlayerSettings: metalCompileShaderBinary: 0 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 VisionOSManualSigningProvisioningProfileType: 0 @@ -247,7 +244,7 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: + templatePackageId: templateDefaultScene: Assets/OutdoorsScene.unity useCustomMainManifest: 0 useCustomLauncherManifest: 0 @@ -261,8 +258,8 @@ PlayerSettings: AndroidTargetDevices: 0 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} - AndroidKeystoreName: - AndroidKeyaliasName: + AndroidKeystoreName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -388,92 +385,92 @@ PlayerSettings: m_Width: 432 m_Height: 432 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 324 m_Height: 324 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 216 m_Height: 216 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 162 m_Height: 162 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 108 m_Height: 108 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 81 m_Height: 81 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 0 - m_SubKind: + m_SubKind: m_BuildTargetBatching: - m_BuildTarget: Standalone m_StaticBatching: 1 @@ -563,13 +560,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 10.13.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -577,8 +574,8 @@ PlayerSettings: switchUseCPUProfiler: 0 switchEnableFileSystemTrace: 0 switchLTOSetting: 0 - switchNSODependencies: - switchCompilerFlags: + switchNSODependencies: + switchCompilerFlags: switchSupportedNpadStyles: 22 switchNativeFsCacheSize: 32 switchIsHoldTypeHorizontal: 0 @@ -602,35 +599,35 @@ PlayerSettings: switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -658,9 +655,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -676,19 +673,19 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 32 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -721,7 +718,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 1 gcWBarrierValidation: 0 @@ -730,15 +727,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: com.unity.template-starter-kit - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: com.unity.template-starter-kit wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -753,23 +750,23 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -782,36 +779,36 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 0 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 1 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/BatchRendererGroup_HDRP/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/BatchRendererGroup_HDRP/ProjectSettings/ProjectSettings.asset index f9be27c31a9..bd29430f2f8 100644 --- a/Tests/SRPTests/Projects/BatchRendererGroup_HDRP/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/BatchRendererGroup_HDRP/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -141,12 +140,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 useHDRDisplay: 0 D3DHDRBitDepth: 0 @@ -207,7 +204,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -215,9 +212,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -227,9 +224,9 @@ PlayerSettings: metalAPIValidation: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 @@ -252,7 +249,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 @@ -352,13 +349,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 10.13.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -367,39 +364,39 @@ PlayerSettings: switchUseGOLDLinker: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -432,11 +429,11 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 @@ -444,7 +441,7 @@ PlayerSettings: switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -464,14 +461,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -500,35 +497,35 @@ PlayerSettings: switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 1 ps4ApplicationParam1: 0 @@ -556,9 +553,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 0 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -585,18 +582,18 @@ PlayerSettings: - libSceNpToolkit2.prx - libSceS3DConversion.prx ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 16 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -617,7 +614,7 @@ PlayerSettings: Lumin: UNITY_POST_PROCESSING_STACK_V2 Nintendo Switch: UNITY_POST_PROCESSING_STACK_V2 PS4: UNITY_POST_PROCESSING_STACK_V2 - Standalone: + Standalone: WebGL: UNITY_POST_PROCESSING_STACK_V2 Windows Store Apps: UNITY_POST_PROCESSING_STACK_V2 XboxOne: UNITY_POST_PROCESSING_STACK_V2 @@ -634,7 +631,7 @@ PlayerSettings: allowUnsafeCode: 1 useDeterministicCompilation: 1 enableRoslynAnalyzers: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 assemblyVersionValidation: 1 @@ -643,15 +640,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: Template_HD - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: Template_HD wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -666,22 +663,22 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -694,32 +691,32 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: UNet: 1 luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: + m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 - playerDataPath: + playerDataPath: forceSRGBBlit: 1 virtualTexturingSupportEnabled: 0 insecureHttpOption: 0 diff --git a/Tests/SRPTests/Projects/BatchRendererGroup_URP/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/BatchRendererGroup_URP/ProjectSettings/ProjectSettings.asset index 5358156362e..e38a9801e9b 100644 --- a/Tests/SRPTests/Projects/BatchRendererGroup_URP/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/BatchRendererGroup_URP/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -145,12 +144,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -175,7 +172,7 @@ PlayerSettings: AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -227,8 +224,8 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -239,10 +236,10 @@ PlayerSettings: metalCompileShaderBinary: 0 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 VisionOSManualSigningProvisioningProfileType: 0 @@ -266,7 +263,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -390,13 +387,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 11.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -405,40 +402,40 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -471,18 +468,18 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -502,14 +499,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -541,35 +538,35 @@ PlayerSettings: switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 1 ps4ApplicationParam1: 0 @@ -597,9 +594,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 0 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -626,19 +623,19 @@ PlayerSettings: - libSceNpToolkit2.prx - libSceS3DConversion.prx ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 16 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 1 @@ -704,7 +701,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 1 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -713,15 +710,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: Template_HD - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: Template_HD wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -737,23 +734,23 @@ PlayerSettings: syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -766,37 +763,37 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: UNet: 1 luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 0 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/BuiltInGraphicsTest_Foundation/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/BuiltInGraphicsTest_Foundation/ProjectSettings/ProjectSettings.asset index eb9b86418bc..3e9f16bd7f6 100644 --- a/Tests/SRPTests/Projects/BuiltInGraphicsTest_Foundation/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/BuiltInGraphicsTest_Foundation/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -131,12 +130,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 1 useHDRDisplay: 0 D3DHDRBitDepth: 0 @@ -156,7 +153,7 @@ PlayerSettings: AndroidMinSdkVersion: 19 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -196,7 +193,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -204,9 +201,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] iOSBackgroundModes: 0 @@ -215,9 +212,9 @@ PlayerSettings: metalAPIValidation: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 @@ -226,8 +223,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -239,7 +236,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 1 AndroidIsGame: 1 @@ -321,11 +318,11 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - switchNMETAOverride: - switchNetLibKey: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -334,37 +331,37 @@ PlayerSettings: switchUseGOLDLinker: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -395,11 +392,11 @@ PlayerSettings: switchSmallIcons_12: {fileID: 0} switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 @@ -407,7 +404,7 @@ PlayerSettings: switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -427,14 +424,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -459,35 +456,35 @@ PlayerSettings: switchPlayerConnectionEnabled: 1 switchUseNewStyleFilepaths: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -515,9 +512,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -532,18 +529,18 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -577,7 +574,7 @@ PlayerSettings: allowUnsafeCode: 0 useDeterministicCompilation: 1 enableRoslynAnalyzers: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 assemblyVersionValidation: 1 @@ -586,15 +583,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: GraphicsTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -609,22 +606,22 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -637,28 +634,28 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: + m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 virtualTexturingSupportEnabled: 0 diff --git a/Tests/SRPTests/Projects/BuiltInGraphicsTest_Lighting/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/BuiltInGraphicsTest_Lighting/ProjectSettings/ProjectSettings.asset index eb9b86418bc..3e9f16bd7f6 100644 --- a/Tests/SRPTests/Projects/BuiltInGraphicsTest_Lighting/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/BuiltInGraphicsTest_Lighting/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -131,12 +130,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 1 useHDRDisplay: 0 D3DHDRBitDepth: 0 @@ -156,7 +153,7 @@ PlayerSettings: AndroidMinSdkVersion: 19 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -196,7 +193,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -204,9 +201,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] iOSBackgroundModes: 0 @@ -215,9 +212,9 @@ PlayerSettings: metalAPIValidation: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 @@ -226,8 +223,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -239,7 +236,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 1 AndroidIsGame: 1 @@ -321,11 +318,11 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - switchNMETAOverride: - switchNetLibKey: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -334,37 +331,37 @@ PlayerSettings: switchUseGOLDLinker: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -395,11 +392,11 @@ PlayerSettings: switchSmallIcons_12: {fileID: 0} switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 @@ -407,7 +404,7 @@ PlayerSettings: switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -427,14 +424,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -459,35 +456,35 @@ PlayerSettings: switchPlayerConnectionEnabled: 1 switchUseNewStyleFilepaths: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -515,9 +512,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -532,18 +529,18 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -577,7 +574,7 @@ PlayerSettings: allowUnsafeCode: 0 useDeterministicCompilation: 1 enableRoslynAnalyzers: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 assemblyVersionValidation: 1 @@ -586,15 +583,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: GraphicsTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -609,22 +606,22 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -637,28 +634,28 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: + m_VersionName: apiCompatibilityLevel: 6 activeInputHandler: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 virtualTexturingSupportEnabled: 0 diff --git a/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/ProjectSettings.asset index 53a9b382f48..f927c4c0d10 100644 --- a/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1024 defaultScreenHeight: 768 defaultScreenWidthWeb: 960 @@ -139,12 +138,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 0 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 useHDRDisplay: 0 @@ -166,7 +163,7 @@ PlayerSettings: AndroidMinSdkVersion: 22 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -207,7 +204,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -215,9 +212,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -227,9 +224,9 @@ PlayerSettings: metalAPIValidation: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 @@ -253,7 +250,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 @@ -393,13 +390,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 10.13.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -408,40 +405,40 @@ PlayerSettings: switchUseGOLDLinker: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -474,11 +471,11 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 @@ -486,7 +483,7 @@ PlayerSettings: switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -506,14 +503,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -543,35 +540,35 @@ PlayerSettings: switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 1 ps4ApplicationParam1: 0 @@ -599,9 +596,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 0 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -628,19 +625,19 @@ PlayerSettings: - libSceNpToolkit2.prx - libSceS3DConversion.prx ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 16 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -673,7 +670,7 @@ PlayerSettings: allowUnsafeCode: 0 useDeterministicCompilation: 1 selectedPlatform: 0 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -682,15 +679,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: Template_3D - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: Template_3D wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -705,23 +702,23 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -734,35 +731,35 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: UNet: 1 luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 hmiLogStartupTiming: 0 - hmiCpuConfiguration: + hmiCpuConfiguration: apiCompatibilityLevel: 6 activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/HDRP_PerformanceTests/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/HDRP_PerformanceTests/ProjectSettings/ProjectSettings.asset index c5627515052..0b83748bcd5 100644 --- a/Tests/SRPTests/Projects/HDRP_PerformanceTests/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_PerformanceTests/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -141,12 +140,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -214,7 +211,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -222,9 +219,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -235,10 +232,10 @@ PlayerSettings: metalCompileShaderBinary: 0 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - bratwurstManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + bratwurstManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 bratwurstManualSigningProvisioningProfileType: 0 @@ -248,8 +245,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -263,7 +260,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -370,13 +367,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 10.13.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -384,8 +381,8 @@ PlayerSettings: switchUseCPUProfiler: 0 switchEnableFileSystemTrace: 0 switchLTOSetting: 0 - switchNSODependencies: - switchCompilerFlags: + switchNSODependencies: + switchCompilerFlags: switchSupportedNpadStyles: 3 switchNativeFsCacheSize: 32 switchIsHoldTypeHorizontal: 0 @@ -409,35 +406,35 @@ PlayerSettings: switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -465,9 +462,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -494,19 +491,19 @@ PlayerSettings: - libSceNpToolkit2.prx - libSceS3DConversion.prx ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -552,7 +549,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -562,15 +559,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: GraphicsTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -585,23 +582,23 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -614,36 +611,36 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/ProjectSettings.asset index 7f67c83c3a7..0ededd02aa8 100644 --- a/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -147,12 +146,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -259,8 +256,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -273,8 +270,8 @@ PlayerSettings: AndroidAllowedArchitectures: -1 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} - AndroidKeystoreName: - AndroidKeyaliasName: + AndroidKeystoreName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -488,40 +485,40 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -554,18 +551,18 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -585,14 +582,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -624,35 +621,35 @@ PlayerSettings: switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 1 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -680,9 +677,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -709,19 +706,19 @@ PlayerSettings: - libSceNpToolkit2.prx - libSceS3DConversion.prx ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 32 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -764,15 +761,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: HDRP_RuntimeTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: HDRP_RuntimeTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -788,23 +785,23 @@ PlayerSettings: syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -817,22 +814,22 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 hmiCpuConfiguration: @@ -842,11 +839,11 @@ PlayerSettings: captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/HDRP_Tests/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/HDRP_Tests/ProjectSettings/ProjectSettings.asset index aca984117dc..6ad26cb02fc 100644 --- a/Tests/SRPTests/Projects/HDRP_Tests/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_Tests/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -139,12 +138,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 1 enableOpenGLProfilerGPURecorders: 1 useHDRDisplay: 0 @@ -207,7 +204,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -215,9 +212,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -227,9 +224,9 @@ PlayerSettings: metalAPIValidation: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 @@ -238,8 +235,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -253,7 +250,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 1 @@ -374,13 +371,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 10.13.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -389,40 +386,40 @@ PlayerSettings: switchUseGOLDLinker: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -455,11 +452,11 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 @@ -467,7 +464,7 @@ PlayerSettings: switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -487,14 +484,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -524,35 +521,35 @@ PlayerSettings: switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -580,9 +577,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -598,19 +595,19 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -650,7 +647,7 @@ PlayerSettings: allowUnsafeCode: 1 useDeterministicCompilation: 1 selectedPlatform: 0 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -659,15 +656,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: GraphicsTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -682,23 +679,23 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -711,34 +708,34 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 hmiLogStartupTiming: 0 - hmiCpuConfiguration: + hmiCpuConfiguration: apiCompatibilityLevel: 6 activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/MultipleSRP_Tests/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/MultipleSRP_Tests/ProjectSettings/ProjectSettings.asset index 092f89fe541..b54c50a1d7c 100644 --- a/Tests/SRPTests/Projects/MultipleSRP_Tests/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/MultipleSRP_Tests/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -145,12 +144,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -174,7 +171,7 @@ PlayerSettings: AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -226,8 +223,8 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -238,10 +235,10 @@ PlayerSettings: metalCompileShaderBinary: 0 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 VisionOSManualSigningProvisioningProfileType: 0 @@ -264,8 +261,8 @@ PlayerSettings: AndroidTargetArchitectures: 1 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} - AndroidKeystoreName: - AndroidKeyaliasName: + AndroidKeystoreName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -418,13 +415,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 11.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -433,40 +430,40 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -499,18 +496,18 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -530,14 +527,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -569,35 +566,35 @@ PlayerSettings: switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 1 ps4ApplicationParam1: 0 @@ -625,9 +622,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 0 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -643,19 +640,19 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 16 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -689,7 +686,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 1 gcWBarrierValidation: 0 @@ -698,15 +695,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: SRP Test Project - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: SRP Test Project wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -722,23 +719,23 @@ PlayerSettings: syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -751,37 +748,37 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: UNet: 1 luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 0 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/RPCore_PerformanceTests/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/RPCore_PerformanceTests/ProjectSettings/ProjectSettings.asset index 8a0779e4193..a4b1400247f 100644 --- a/Tests/SRPTests/Projects/RPCore_PerformanceTests/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/RPCore_PerformanceTests/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -138,12 +137,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 useHDRDisplay: 0 @@ -161,7 +158,7 @@ PlayerSettings: AndroidMinSdkVersion: 22 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -174,10 +171,10 @@ PlayerSettings: strictShaderVariantMatching: 0 VertexChannelCompressionMask: 4054 iPhoneSdkVersion: 988 - iOSTargetOSVersionString: + iOSTargetOSVersionString: tvOSSdkVersion: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: + tvOSTargetOSVersionString: uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 @@ -202,7 +199,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -210,9 +207,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -222,9 +219,9 @@ PlayerSettings: metalAPIValidation: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 @@ -233,8 +230,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -247,8 +244,8 @@ PlayerSettings: AndroidTargetDevices: 0 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} - AndroidKeystoreName: - AndroidKeyaliasName: + AndroidKeystoreName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 @@ -298,13 +295,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: - macOSTargetOSVersion: - switchNMETAOverride: - switchNetLibKey: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + macOSTargetOSVersion: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -313,40 +310,40 @@ PlayerSettings: switchUseGOLDLinker: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -379,11 +376,11 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 @@ -391,7 +388,7 @@ PlayerSettings: switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -411,14 +408,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -448,35 +445,35 @@ PlayerSettings: switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -504,9 +501,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -522,19 +519,19 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 32 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -562,7 +559,7 @@ PlayerSettings: allowUnsafeCode: 0 useDeterministicCompilation: 1 selectedPlatform: 0 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 1 gcWBarrierValidation: 0 @@ -571,15 +568,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: MultipleSRP_PerformanceTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: MultipleSRP_PerformanceTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -593,23 +590,23 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -622,34 +619,34 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 hmiLogStartupTiming: 0 - hmiCpuConfiguration: + hmiCpuConfiguration: apiCompatibilityLevel: 6 activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/SRP_SmokeTest/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/SRP_SmokeTest/ProjectSettings/ProjectSettings.asset index 330d61de827..dd412ff6c06 100644 --- a/Tests/SRPTests/Projects/SRP_SmokeTest/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/SRP_SmokeTest/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1024 defaultScreenHeight: 768 defaultScreenWidthWeb: 960 @@ -144,12 +143,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -173,7 +170,7 @@ PlayerSettings: AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 0 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -225,8 +222,8 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -237,10 +234,10 @@ PlayerSettings: metalCompileShaderBinary: 0 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 VisionOSManualSigningProvisioningProfileType: 0 @@ -263,8 +260,8 @@ PlayerSettings: AndroidTargetArchitectures: 1 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} - AndroidKeystoreName: - AndroidKeyaliasName: + AndroidKeystoreName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -293,92 +290,92 @@ PlayerSettings: m_Width: 432 m_Height: 432 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 324 m_Height: 324 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 216 m_Height: 216 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 162 m_Height: 162 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 108 m_Height: 108 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 81 m_Height: 81 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 0 - m_SubKind: + m_SubKind: m_BuildTargetBatching: - m_BuildTarget: Standalone m_StaticBatching: 1 @@ -472,13 +469,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 11.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -487,40 +484,40 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -553,18 +550,18 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -584,14 +581,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -623,35 +620,35 @@ PlayerSettings: switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 1 ps4ApplicationParam1: 0 @@ -679,9 +676,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 0 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -697,19 +694,19 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 16 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -760,7 +757,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -769,15 +766,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: Template_3D - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: Template_3D wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -793,23 +790,23 @@ PlayerSettings: syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -822,37 +819,37 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: UNet: 1 luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 0 embeddedLinuxEnableGamepadInput: 0 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/ShaderGraph/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/ShaderGraph/ProjectSettings/ProjectSettings.asset index d20240a7aec..85672160566 100644 --- a/Tests/SRPTests/Projects/ShaderGraph/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/ShaderGraph/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1024 defaultScreenHeight: 768 defaultScreenWidthWeb: 960 @@ -123,7 +122,6 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 0 vrSettings: @@ -150,7 +148,6 @@ PlayerSettings: sharedDepthBuffer: 0 dashSupport: 0 enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 protectGraphicsMemory: 0 enableFrameTimingStats: 0 useHDRDisplay: 0 @@ -165,7 +162,7 @@ PlayerSettings: AndroidMinSdkVersion: 16 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -221,7 +218,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -229,9 +226,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreeniPadCustomXibPath: iOSUseLaunchScreenStoryboard: 0 - iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] iOSBackgroundModes: 0 @@ -240,9 +237,9 @@ PlayerSettings: metalAPIValidation: 1 metalCompileShaderBinary: 1 iOSRenderExtraFrameOnPause: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 @@ -256,7 +253,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 1 AndroidIsGame: 1 @@ -302,47 +299,47 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - switchNetLibKey: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -373,11 +370,11 @@ PlayerSettings: switchSmallIcons_12: {fileID: 0} switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 @@ -385,7 +382,7 @@ PlayerSettings: switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -404,14 +401,14 @@ PlayerSettings: switchRatingsInt_9: 0 switchRatingsInt_10: 0 switchRatingsInt_11: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -435,34 +432,34 @@ PlayerSettings: switchNetworkInterfaceManagerInitializeEnabled: 1 switchPlayerConnectionEnabled: 1 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 1 ps4ApplicationParam1: 0 @@ -489,9 +486,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 0 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -503,17 +500,17 @@ PlayerSettings: ps4contentSearchFeaturesUsed: 0 ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLDataCaching: 0 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -544,7 +541,7 @@ PlayerSettings: managedStrippingLevel: {} incrementalIl2cppBuild: {} allowUnsafeCode: 0 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -552,15 +549,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: Template_3D - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: Template_3D wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -575,22 +572,22 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -603,7 +600,7 @@ PlayerSettings: XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 xboxOneScriptCompiler: 1 - XboxOneOverrideIdentityName: + XboxOneOverrideIdentityName: vrEditorSettings: daydream: daydreamIconForeground: {fileID: 0} @@ -611,28 +608,28 @@ PlayerSettings: cloudServicesEnabled: UNet: 1 luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: + m_VersionName: facebookSdkVersion: 7.9.4 - facebookAppId: + facebookAppId: facebookCookies: 1 facebookLogging: 1 facebookStatus: 1 facebookXfbml: 0 facebookFrictionlessRequests: 1 apiCompatibilityLevel: 6 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 projectName: Template_3D - organizationId: + organizationId: cloudEnabled: 0 enableNativePlatformBackendsForNewInputSystem: 0 disableOldInputManagerSupport: 0 diff --git a/Tests/SRPTests/Projects/ShaderGraphUniversalStereo/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/ShaderGraphUniversalStereo/ProjectSettings/ProjectSettings.asset index 05d2d7449e0..a55be73a4b0 100644 --- a/Tests/SRPTests/Projects/ShaderGraphUniversalStereo/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/ShaderGraphUniversalStereo/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 640 defaultScreenHeight: 360 defaultScreenWidthWeb: 960 @@ -122,7 +121,6 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: @@ -152,7 +150,6 @@ PlayerSettings: protectedContext: 0 v2Signing: 1 enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 useHDRDisplay: 0 D3DHDRBitDepth: 0 @@ -167,7 +164,7 @@ PlayerSettings: AndroidMinSdkVersion: 19 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -223,7 +220,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -231,9 +228,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreeniPadCustomXibPath: iOSUseLaunchScreenStoryboard: 0 - iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] iOSBackgroundModes: 0 @@ -241,9 +238,9 @@ PlayerSettings: metalEditorSupport: 1 metalAPIValidation: 1 iOSRenderExtraFrameOnPause: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 @@ -251,13 +248,13 @@ PlayerSettings: iOSAutomaticallyDetectAndAddCapabilities: 1 appleEnableProMotion: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: AndroidTargetArchitectures: 1 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 1 AndroidIsGame: 1 @@ -329,47 +326,47 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - switchNetLibKey: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -400,11 +397,11 @@ PlayerSettings: switchSmallIcons_12: {fileID: 0} switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 @@ -412,7 +409,7 @@ PlayerSettings: switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -431,14 +428,14 @@ PlayerSettings: switchRatingsInt_9: 0 switchRatingsInt_10: 0 switchRatingsInt_11: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -462,34 +459,34 @@ PlayerSettings: switchNetworkInterfaceManagerInitializeEnabled: 1 switchPlayerConnectionEnabled: 1 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -516,9 +513,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -531,18 +528,18 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -571,7 +568,7 @@ PlayerSettings: managedStrippingLevel: {} incrementalIl2cppBuild: {} allowUnsafeCode: 0 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -579,15 +576,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: GraphicsTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -602,22 +599,22 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -629,28 +626,28 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: + XboxOneOverrideIdentityName: vrEditorSettings: daydream: daydreamIconForeground: {fileID: 0} daydreamIconBackground: {fileID: 0} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: + m_VersionName: apiCompatibilityLevel: 6 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 enableNativePlatformBackendsForNewInputSystem: 0 disableOldInputManagerSupport: 0 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/ProjectSettings/ProjectSettings.asset index 46d39733069..d2e7f5e0d47 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -147,12 +146,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 1 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -256,8 +253,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -271,7 +268,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -303,37 +300,37 @@ PlayerSettings: m_Width: 1280 m_Height: 768 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 800 m_Height: 480 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 400 m_Height: 240 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 4640 m_Height: 1440 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 2320 m_Height: 720 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 3840 m_Height: 1440 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 1920 m_Height: 720 m_Kind: 1 - m_SubKind: + m_SubKind: - m_BuildTarget: iPhone m_Icons: - m_Textures: [] @@ -437,92 +434,92 @@ PlayerSettings: m_Width: 432 m_Height: 432 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 324 m_Height: 324 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 216 m_Height: 216 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 162 m_Height: 162 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 108 m_Height: 108 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 81 m_Height: 81 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 0 - m_SubKind: + m_SubKind: m_BuildTargetBatching: [] m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: @@ -610,40 +607,40 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -676,18 +673,18 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -707,14 +704,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -746,35 +743,35 @@ PlayerSettings: switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -802,9 +799,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -820,19 +817,19 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -885,10 +882,10 @@ PlayerSettings: m_MobileRenderingPath: 1 metroPackageName: GraphicsTests metroPackageVersion: 1.0.0.0 - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} @@ -908,23 +905,23 @@ PlayerSettings: syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -937,22 +934,22 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 hmiCpuConfiguration: @@ -962,11 +959,11 @@ PlayerSettings: captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/ProjectSettings/ProjectSettings.asset index a21a4d25463..855a239e51e 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -146,12 +145,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -178,7 +175,7 @@ PlayerSettings: AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -230,8 +227,8 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -242,10 +239,10 @@ PlayerSettings: metalCompileShaderBinary: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 VisionOSManualSigningProvisioningProfileType: 0 @@ -255,8 +252,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -270,7 +267,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -278,7 +275,7 @@ PlayerSettings: AndroidIsGame: 1 androidAppCategory: 3 useAndroidAppCategory: 1 - androidAppCategoryOther: + androidAppCategoryOther: AndroidEnableTango: 0 androidEnableBanner: 1 androidUseLowAccuracyLocation: 0 @@ -399,92 +396,92 @@ PlayerSettings: m_Width: 432 m_Height: 432 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 324 m_Height: 324 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 216 m_Height: 216 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 162 m_Height: 162 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 108 m_Height: 108 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 81 m_Height: 81 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 0 - m_SubKind: + m_SubKind: m_BuildTargetBatching: - m_BuildTarget: Standalone m_StaticBatching: 0 @@ -557,13 +554,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 11.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -572,40 +569,40 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -638,18 +635,18 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -669,14 +666,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -708,35 +705,35 @@ PlayerSettings: switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -764,9 +761,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -782,19 +779,19 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 1 @@ -839,7 +836,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -848,15 +845,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: GraphicsTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -872,23 +869,23 @@ PlayerSettings: syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -901,36 +898,36 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/ProjectSettings/ProjectSettings.asset index 74dcbfd99cb..617f9284e04 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -141,12 +140,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -173,7 +170,7 @@ PlayerSettings: AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -216,7 +213,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -224,9 +221,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -237,10 +234,10 @@ PlayerSettings: metalCompileShaderBinary: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - bratwurstManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + bratwurstManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 bratwurstManualSigningProvisioningProfileType: 0 @@ -250,8 +247,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -265,7 +262,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -391,92 +388,92 @@ PlayerSettings: m_Width: 432 m_Height: 432 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 324 m_Height: 324 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 216 m_Height: 216 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 162 m_Height: 162 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 108 m_Height: 108 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 81 m_Height: 81 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 0 - m_SubKind: + m_SubKind: m_BuildTargetBatching: - m_BuildTarget: Standalone m_StaticBatching: 0 @@ -554,13 +551,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 10.13.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -569,8 +566,8 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchUseGOLDLinker: 0 switchLTOSetting: 0 - switchNSODependencies: - switchCompilerFlags: + switchNSODependencies: + switchCompilerFlags: switchSupportedNpadStyles: 3 switchNativeFsCacheSize: 32 switchIsHoldTypeHorizontal: 0 @@ -594,35 +591,35 @@ PlayerSettings: switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -650,9 +647,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -668,19 +665,19 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -724,7 +721,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -733,15 +730,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: GraphicsTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -756,23 +753,23 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -785,36 +782,36 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_PostPro/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_PostPro/ProjectSettings/ProjectSettings.asset index e5518e18169..a80fa8c57a2 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_PostPro/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_PostPro/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -141,12 +140,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 1 @@ -172,7 +169,7 @@ PlayerSettings: AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -215,7 +212,7 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: + iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -223,9 +220,9 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -236,10 +233,10 @@ PlayerSettings: metalCompileShaderBinary: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - bratwurstManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + bratwurstManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 bratwurstManualSigningProvisioningProfileType: 0 @@ -249,8 +246,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -264,7 +261,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -390,92 +387,92 @@ PlayerSettings: m_Width: 432 m_Height: 432 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 324 m_Height: 324 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 216 m_Height: 216 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 162 m_Height: 162 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 108 m_Height: 108 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 81 m_Height: 81 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 0 - m_SubKind: + m_SubKind: m_BuildTargetBatching: [] m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: @@ -547,13 +544,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 10.13.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -562,8 +559,8 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchUseGOLDLinker: 0 switchLTOSetting: 0 - switchNSODependencies: - switchCompilerFlags: + switchNSODependencies: + switchCompilerFlags: switchSupportedNpadStyles: 3 switchNativeFsCacheSize: 32 switchIsHoldTypeHorizontal: 0 @@ -587,35 +584,35 @@ PlayerSettings: switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -643,9 +640,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -673,19 +670,19 @@ PlayerSettings: - libSceNpToolkit2.prx - libSceS3DConversion.prx ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -730,7 +727,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -739,15 +736,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: GraphicsTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -762,23 +759,23 @@ PlayerSettings: metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -791,36 +788,36 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/ProjectSettings.asset index f622392d472..ebe022edb9b 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -144,12 +143,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 1 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -174,7 +171,7 @@ PlayerSettings: AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -226,8 +223,8 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -238,10 +235,10 @@ PlayerSettings: metalCompileShaderBinary: 1 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 VisionOSManualSigningProvisioningProfileType: 0 @@ -251,8 +248,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -265,7 +262,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -294,92 +291,92 @@ PlayerSettings: m_Width: 432 m_Height: 432 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 324 m_Height: 324 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 216 m_Height: 216 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 162 m_Height: 162 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 108 m_Height: 108 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 81 m_Height: 81 m_Kind: 2 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 1 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 192 m_Height: 192 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 144 m_Height: 144 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 96 m_Height: 96 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 72 m_Height: 72 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 48 m_Height: 48 m_Kind: 0 - m_SubKind: + m_SubKind: - m_Textures: [] m_Width: 36 m_Height: 36 m_Kind: 0 - m_SubKind: + m_SubKind: m_BuildTargetBatching: [] m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: @@ -448,13 +445,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 11.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -463,40 +460,40 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -529,18 +526,18 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -560,14 +557,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -599,35 +596,35 @@ PlayerSettings: switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 11 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 2 ps4ApplicationParam1: 0 @@ -655,9 +652,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -673,19 +670,19 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -728,7 +725,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -737,15 +734,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: GraphicsTests - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: GraphicsTests wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -761,23 +758,23 @@ PlayerSettings: syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -790,36 +787,36 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 0 embeddedLinuxEnableGamepadInput: 0 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/ProjectSettings/ProjectSettings.asset index d5ed11f2964..6d83db01a60 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1024 defaultScreenHeight: 768 defaultScreenWidthWeb: 960 @@ -144,12 +143,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 0 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -178,7 +175,7 @@ PlayerSettings: AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 - aotOptions: + aotOptions: stripEngineCode: 1 iPhoneStrippingLevel: 0 iPhoneScriptCallOptimization: 0 @@ -230,8 +227,8 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -242,10 +239,10 @@ PlayerSettings: metalCompileShaderBinary: 0 iOSRenderExtraFrameOnPause: 1 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 VisionOSManualSigningProvisioningProfileType: 0 @@ -255,8 +252,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -269,7 +266,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -376,13 +373,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 11.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -391,40 +388,40 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x0005000C10000001 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -457,9 +454,9 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 switchPresenceGroupId: 0x0005000C10000001 switchLogoHandling: 0 @@ -468,7 +465,7 @@ PlayerSettings: switchStartupUserAccount: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -489,13 +486,13 @@ PlayerSettings: switchRatingsInt_11: 0 switchRatingsInt_12: 0 switchLocalCommunicationIds_0: 0x0005000C10000001 - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -527,35 +524,35 @@ PlayerSettings: switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 1 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 120 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 1 ps4ApplicationParam1: 0 @@ -583,9 +580,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -613,19 +610,19 @@ PlayerSettings: - libSceS3DConversion.prx - libSceSmart.prx ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 0 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -670,7 +667,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -680,15 +677,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: VFXEditor - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: VFXEditor wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -704,23 +701,23 @@ PlayerSettings: syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -733,36 +730,36 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 2 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 hmiLoadingImage: {fileID: 0} diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_URP/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/VisualEffectGraph_URP/ProjectSettings/ProjectSettings.asset index f4bf4e81e1c..391570a6f26 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_URP/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/VisualEffectGraph_URP/ProjectSettings/ProjectSettings.asset @@ -41,7 +41,6 @@ PlayerSettings: height: 1 m_SplashScreenLogos: [] m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1920 defaultScreenHeight: 1080 defaultScreenWidthWeb: 960 @@ -144,12 +143,10 @@ PlayerSettings: preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 0 vrSettings: enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 allowHDRDisplaySupport: 0 @@ -230,8 +227,8 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreenCustomStoryboardPath: - iOSLaunchScreeniPadCustomStoryboardPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] macOSURLSchemes: [] @@ -242,10 +239,10 @@ PlayerSettings: metalCompileShaderBinary: 0 iOSRenderExtraFrameOnPause: 1 iosCopyPluginsCodeInsteadOfSymlink: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - VisionOSManualSigningProvisioningProfileID: + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 VisionOSManualSigningProvisioningProfileType: 0 @@ -255,8 +252,8 @@ PlayerSettings: appleEnableProMotion: 0 shaderPrecisionModel: 0 clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: + templatePackageId: + templateDefaultScene: useCustomMainManifest: 0 useCustomLauncherManifest: 0 useCustomMainGradleTemplate: 0 @@ -269,7 +266,7 @@ PlayerSettings: AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: + AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 @@ -376,13 +373,13 @@ PlayerSettings: enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - bluetoothUsageDescription: + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: macOSTargetOSVersion: 11.0 - switchNMETAOverride: - switchNetLibKey: + switchNMETAOverride: + switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 @@ -391,40 +388,40 @@ PlayerSettings: switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchCompilerFlags: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchTitleNames_15: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchPublisherNames_15: + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -457,18 +454,18 @@ PlayerSettings: switchSmallIcons_13: {fileID: 0} switchSmallIcons_14: {fileID: 0} switchSmallIcons_15: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: switchMainThreadStackSize: 1048576 - switchPresenceGroupId: + switchPresenceGroupId: switchLogoHandling: 0 switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 - switchApplicationErrorCodeCategory: + switchApplicationErrorCodeCategory: switchUserAccountSaveDataSize: 0 switchUserAccountSaveDataJournalSize: 0 switchApplicationAttribute: 0 @@ -488,14 +485,14 @@ PlayerSettings: switchRatingsInt_10: 0 switchRatingsInt_11: 0 switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 switchAllowsVideoCapturing: 1 @@ -527,35 +524,35 @@ PlayerSettings: switchRamDiskSpaceSize: 12 switchUpgradedPlayerSettingsToNMETA: 0 ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: + ps4NPTitleSecret: + ps4NPTrophyPackPath: ps4ParentalLevel: 1 ps4ContentID: ED1633-NPXX51362_00-0000000000000000 ps4Category: 0 ps4MasterVersion: 01.00 ps4AppVersion: 01.00 ps4AppType: 0 - ps4ParamSfxPath: + ps4ParamSfxPath: ps4VideoOutPixelFormat: 0 ps4VideoOutInitialWidth: 1920 ps4VideoOutBaseModeInitialWidth: 1920 ps4VideoOutReprojectionRate: 120 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4ExtraSceSysFile: - ps4NPtitleDatPath: + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: + ps4RemotePlayKeyMappingDir: ps4PlayTogetherPlayerCount: 0 ps4EnterButtonAssignment: 1 ps4ApplicationParam1: 0 @@ -583,9 +580,9 @@ PlayerSettings: ps4ScriptOptimizationLevel: 2 ps4Audio3dVirtualSpeakerCount: 14 ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: ps4PatchDayOne: 0 ps4attribUserManagement: 0 ps4attribMoveSupport: 0 @@ -613,19 +610,19 @@ PlayerSettings: - libSceS3DConversion.prx - libSceSmart.prx ps4attribVROutputEnabled: 0 - monoEnv: + monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 - spritePackerPolicy: + spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLShowDiagnostics: 0 webGLDataCaching: 0 webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: + webGLEmscriptenArgs: + webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 @@ -685,7 +682,7 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - additionalIl2CppArgs: + additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 gcWBarrierValidation: 0 @@ -695,15 +692,15 @@ PlayerSettings: m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: VFXEditor - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: VFXEditor wsaImages: {} - metroTileShortName: + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 @@ -719,23 +716,23 @@ PlayerSettings: syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} - metroFTAName: + metroFTAName: metroFTAFileTypes: [] - metroProtocolName: - vcxProjDefaultLanguage: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: + XboxOneDescription: XboxOneLanguage: - enus XboxOneCapability: [] @@ -748,36 +745,36 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - XboxOneOverrideIdentityPublisher: + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: vrEditorSettings: {} cloudServicesEnabled: {} luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: luminCert: - m_CertPath: + m_CertPath: m_SignPackage: 1 luminIsChannelApp: 0 luminVersion: m_VersionCode: 1 - m_VersionName: - hmiPlayerDataPath: + m_VersionName: + hmiPlayerDataPath: hmiForceSRGBBlit: 0 embeddedLinuxEnableGamepadInput: 0 - hmiCpuConfiguration: + hmiCpuConfiguration: hmiLogStartupTiming: 0 - qnxGraphicConfPath: + qnxGraphicConfPath: apiCompatibilityLevel: 6 captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 - cloudProjectId: + cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: + organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 1 hmiLoadingImage: {fileID: 0} From fdb6f44163319c45a797620f5aac2c596cf142d6 Mon Sep 17 00:00:00 2001 From: Qing Gu Date: Sat, 18 Oct 2025 00:50:19 +0000 Subject: [PATCH 107/115] Fix MVPVV with Quad View --- .../Runtime/RenderGraph/RenderGraphPass.cs | 4 ++++ .../Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs | 6 +++++- .../Runtime/Passes/CopyDepthPass.cs | 6 +++++- .../Runtime/Passes/DepthNormalOnlyPass.cs | 6 +++++- .../Runtime/Passes/DepthOnlyPass.cs | 6 +++++- .../Runtime/Passes/DrawObjectsPass.cs | 12 ++++++++++-- .../Runtime/Passes/DrawSkyboxPass.cs | 6 +++++- .../Runtime/Passes/FinalBlitPass.cs | 6 +++++- .../Runtime/Passes/MotionVectorRenderPass.cs | 6 +++++- .../Passes/PostProcess/FinalPostProcessPass.cs | 7 ++++++- .../Passes/PostProcess/UberPostProcessPass.cs | 7 ++++++- .../Runtime/Passes/RenderObjectsPass.cs | 6 +++++- .../Runtime/Passes/XRDepthMotionPass.cs | 7 ++++++- .../Runtime/Passes/XROcclusionMeshPass.cs | 6 +++++- .../Runtime/ScriptableRenderer.cs | 7 ++++++- .../Runtime/TemporalAA.cs | 12 ++++++++++-- 16 files changed, 93 insertions(+), 17 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphPass.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphPass.cs index e92dea42a27..dc50c917066 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphPass.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphPass.cs @@ -119,6 +119,9 @@ public void Clear() shadingRateFragmentSize = ShadingRateFragmentSize.FragmentSize1x1; primitiveShadingRateCombiner = ShadingRateCombiner.Keep; fragmentShadingRateCombiner = ShadingRateCombiner.Keep; + + // Invalidate ExtendedFeatureFlags + extendedFeatureFlags = ExtendedFeatureFlags.None; } // Check if the pass has any render targets set-up @@ -453,6 +456,7 @@ public void ComputeHash(ref HashFNV1A32 generator, RenderGraphResourceRegistry r generator.Append(allowPassCulling); generator.Append(allowGlobalState); generator.Append(enableFoveatedRasterization); + generator.Append(extendedFeatureFlags); var depthHandle = depthAccess.textureHandle.handle; if (depthHandle.IsValid()) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs index dc06896cb13..c39b4161b6f 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalScreenSpaceRenderPass.cs @@ -104,7 +104,11 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if (cameraData.xr.enabled) { - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } var param = CreateRenderListParams(renderingData, passData.cameraData, lightData); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs index d8955ab4b65..b2580f64bb2 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/CopyDepthPass.cs @@ -205,7 +205,11 @@ public void Render(RenderGraph renderGraph, TextureHandle destination, TextureHa if (cameraData.xr.enabled) { - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } if (CopyToDepth) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs index 6d3f19990f9..fbe1f400563 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs @@ -146,7 +146,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur if (cameraData.xr.enabled) { builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } if (setGlobalTextures) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs index d6d258d55ca..9b62da952f9 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs @@ -95,7 +95,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, ref Te if (cameraData.xr.enabled) { builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } builder.SetRenderFunc((PassData data, RasterGraphContext context) => diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs index ce4dd6dd6d0..9eadc1adfd9 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs @@ -289,7 +289,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur { bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer; builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } #if ENABLE_VR && ENABLE_XR_MODULE && PLATFORM_ANDROID if (isMainOpaquePass) { @@ -410,7 +414,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur { bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer; builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } builder.SetRenderFunc((RenderingLayersPassData data, RasterGraphContext context) => diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs index 2cd6abca752..e42715d93bd 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs @@ -108,7 +108,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Script { bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer; builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } builder.SetRenderFunc((PassData data, RasterGraphContext context) => diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs index bfed56e5557..e80cb8082f1 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs @@ -168,7 +168,11 @@ override public void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // This is a screen-space pass, make sure foveated rendering is disabled for non-uniform renders bool passSupportsFoveation = !XRSystem.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.NonUniformRaster); builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } // Optimization: In XR, we don't have split screen use case. // The access flag can be set to WriteAll if there is a full screen blit and no alpha blending, diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs index f88d3d5d99d..3a45b84d488 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs @@ -161,7 +161,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur if (cameraData.xr.enabled) { builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } builder.SetRenderAttachment(motionVectorColor, 0, AccessFlags.Write); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs index 1fb766d1cb3..7977b316cc0 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/FinalPostProcessPass.cs @@ -114,7 +114,12 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // This is a screen-space pass, make sure foveated rendering is disabled for non-uniform renders bool passSupportsFoveation = !Experimental.Rendering.XRSystem.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.NonUniformRaster); builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } #endif diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs index a36547755a4..b2a332f9646 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/PostProcess/UberPostProcessPass.cs @@ -117,7 +117,12 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer // This is a screen-space pass, make sure foveated rendering is disabled for non-uniform renders passSupportsFoveation &= !Experimental.Rendering.XRSystem.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.NonUniformRaster); builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } #endif builder.AllowGlobalStateModification(true); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs index dd68d33c3e1..4785a269ca0 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs @@ -283,7 +283,11 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if (cameraData.xr.enabled) { builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } builder.SetRenderFunc((PassData data, RasterGraphContext rgContext) => diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XRDepthMotionPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XRDepthMotionPass.cs index 7ce30e221b3..d7c849e22b2 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XRDepthMotionPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XRDepthMotionPass.cs @@ -201,7 +201,12 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData) using (var builder = renderGraph.AddRasterRenderPass("XR Motion Pass", out var passData, base.profilingSampler)) { builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } // Setup Color and Depth attachments builder.SetRenderAttachment(xrMotionVectorColor, 0, AccessFlags.Write); builder.SetRenderAttachmentDepth(xrMotionVectorDepth, AccessFlags.Write); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs index ddaf62aeb78..40eab2bd252 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs @@ -54,7 +54,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, in Tex { bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer; builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } builder.SetRenderFunc((PassData data, RasterGraphContext context) => diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs index 07b6b65726d..fe6b67ecf7e 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/ScriptableRenderer.cs @@ -927,7 +927,12 @@ internal void EndRenderGraphXRRendering(RenderGraph renderGraph) passData.cameraData = cameraData; builder.AllowGlobalStateModification(true); - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + + // Apply MultiviewRenderRegionsCompatible flag only for the first pass in multipass + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } builder.SetRenderFunc((EndXRPassData data, RasterGraphContext context) => { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/TemporalAA.cs b/Packages/com.unity.render-pipelines.universal/Runtime/TemporalAA.cs index 3b1aee7ee29..bf8a3747256 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/TemporalAA.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/TemporalAA.cs @@ -496,7 +496,11 @@ internal static void Render(RenderGraph renderGraph, Material taaMaterial, Unive if (cameraData.xr.enabled) { - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only for the first pass in multipass + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } passData.material = taaMaterial; @@ -554,7 +558,11 @@ internal static void Render(RenderGraph renderGraph, Material taaMaterial, Unive if (cameraData.xr.enabled) { - builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + // Apply MultiviewRenderRegionsCompatible flag only to the peripheral view in Quad Views + if (cameraData.xr.multipassId == 0) + { + builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); + } } passData.material = taaMaterial; From 463922b0f476775b0e96e3e9a5e050e8c0ffbf99 Mon Sep 17 00:00:00 2001 From: Jonny Kelso Date: Sat, 18 Oct 2025 00:50:24 +0000 Subject: [PATCH 108/115] [content automatically redacted] touching PlatformDependent folder --- .../BatchRendererGroup_HDRP/ProjectSettings/EditorSettings.asset | 1 - .../Projects/HDRP_DXR_Tests/ProjectSettings/EditorSettings.asset | 1 - .../HDRP_PerformanceTests/ProjectSettings/EditorSettings.asset | 1 - .../HDRP_RuntimeTests/ProjectSettings/EditorSettings.asset | 1 - .../Projects/HDRP_Tests/ProjectSettings/EditorSettings.asset | 1 - .../RPCore_PerformanceTests/ProjectSettings/EditorSettings.asset | 1 - .../Projects/SRP_SmokeTest/ProjectSettings/EditorSettings.asset | 1 - .../ProjectSettings/EditorSettings.asset | 1 - .../ProjectSettings/EditorSettings.asset | 1 - .../ProjectSettings/EditorSettings.asset | 1 - .../ProjectSettings/EditorSettings.asset | 1 - .../VisualEffectGraph_HDRP/ProjectSettings/EditorSettings.asset | 1 - .../VisualEffectGraph_URP/ProjectSettings/EditorSettings.asset | 1 - 13 files changed, 13 deletions(-) diff --git a/Tests/SRPTests/Projects/BatchRendererGroup_HDRP/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/BatchRendererGroup_HDRP/ProjectSettings/EditorSettings.asset index ea6d49547a4..d7c2887addc 100644 --- a/Tests/SRPTests/Projects/BatchRendererGroup_HDRP/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/BatchRendererGroup_HDRP/ProjectSettings/EditorSettings.asset @@ -36,5 +36,4 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 diff --git a/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/EditorSettings.asset index 34ccd0b8ff2..a1a3e97d55e 100644 --- a/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_DXR_Tests/ProjectSettings/EditorSettings.asset @@ -40,7 +40,6 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 m_CacheServerValidationMode: 2 m_CacheServerDownloadBatchSize: 128 diff --git a/Tests/SRPTests/Projects/HDRP_PerformanceTests/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/HDRP_PerformanceTests/ProjectSettings/EditorSettings.asset index f6c454911fe..5ad410e3ce6 100644 --- a/Tests/SRPTests/Projects/HDRP_PerformanceTests/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_PerformanceTests/ProjectSettings/EditorSettings.asset @@ -36,5 +36,4 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 diff --git a/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/EditorSettings.asset index cba560f68b7..107b6bcbbb5 100644 --- a/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/EditorSettings.asset @@ -32,5 +32,4 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 diff --git a/Tests/SRPTests/Projects/HDRP_Tests/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/HDRP_Tests/ProjectSettings/EditorSettings.asset index 553b74788e8..5204f41cb2d 100644 --- a/Tests/SRPTests/Projects/HDRP_Tests/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_Tests/ProjectSettings/EditorSettings.asset @@ -32,5 +32,4 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 diff --git a/Tests/SRPTests/Projects/RPCore_PerformanceTests/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/RPCore_PerformanceTests/ProjectSettings/EditorSettings.asset index 6b1a33398a7..6eff7330460 100644 --- a/Tests/SRPTests/Projects/RPCore_PerformanceTests/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/RPCore_PerformanceTests/ProjectSettings/EditorSettings.asset @@ -40,7 +40,6 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 m_CacheServerValidationMode: 2 m_CacheServerDownloadBatchSize: 128 diff --git a/Tests/SRPTests/Projects/SRP_SmokeTest/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/SRP_SmokeTest/ProjectSettings/EditorSettings.asset index b58924dbbe0..7f781c82597 100644 --- a/Tests/SRPTests/Projects/SRP_SmokeTest/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/SRP_SmokeTest/ProjectSettings/EditorSettings.asset @@ -40,7 +40,6 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 m_CacheServerValidationMode: 2 m_CacheServerDownloadBatchSize: 128 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/ProjectSettings/EditorSettings.asset index 08c263660a9..355f96e9d0f 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/ProjectSettings/EditorSettings.asset @@ -38,5 +38,4 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/ProjectSettings/EditorSettings.asset index e81a3f8f7a0..341f7d000ff 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/ProjectSettings/EditorSettings.asset @@ -40,7 +40,6 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 m_CacheServerValidationMode: 2 m_CacheServerDownloadBatchSize: 128 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/ProjectSettings/EditorSettings.asset index 7c67e548905..6dbe44dbe67 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/ProjectSettings/EditorSettings.asset @@ -37,5 +37,4 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/EditorSettings.asset index 7bccbc8df75..93f9be6c2a3 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/EditorSettings.asset @@ -41,7 +41,6 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 m_CacheServerValidationMode: 2 m_CacheServerDownloadBatchSize: 128 diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/ProjectSettings/EditorSettings.asset index 17536dc9692..ecc13310d80 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/VisualEffectGraph_HDRP/ProjectSettings/EditorSettings.asset @@ -36,5 +36,4 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 diff --git a/Tests/SRPTests/Projects/VisualEffectGraph_URP/ProjectSettings/EditorSettings.asset b/Tests/SRPTests/Projects/VisualEffectGraph_URP/ProjectSettings/EditorSettings.asset index 17536dc9692..ecc13310d80 100644 --- a/Tests/SRPTests/Projects/VisualEffectGraph_URP/ProjectSettings/EditorSettings.asset +++ b/Tests/SRPTests/Projects/VisualEffectGraph_URP/ProjectSettings/EditorSettings.asset @@ -36,5 +36,4 @@ EditorSettings: m_CacheServerNamespacePrefix: default m_CacheServerEnableDownload: 1 m_CacheServerEnableUpload: 1 - m_CacheServerEnableAuth: 0 m_CacheServerEnableTls: 0 From db0b1898848e6669eeec948ed27252f065875aa2 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Sat, 18 Oct 2025 00:50:28 +0000 Subject: [PATCH 109/115] [VFX] Restore panels visibility when the VFX Graph editor is opened --- .../Editor/GraphView/Views/VFXView.cs | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs index 7b7531071d0..ceb9fa87a97 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs @@ -589,10 +589,10 @@ public VFXView() flexSpacer.style.flexGrow = 1f; m_Toolbar.Add(flexSpacer); - var toggleBlackboard = new ToolbarToggle { tooltip = "Blackboard" }; - toggleBlackboard.Add(new Image { image = EditorGUIUtility.LoadIcon(Path.Combine(VisualEffectGraphPackageInfo.assetPackagePath, "Editor/UIResources/VFX/variableswindow.png")) }); - toggleBlackboard.RegisterCallback>(ToggleBlackboard); - m_Toolbar.Add(toggleBlackboard); + m_ToggleBlackboard = new ToolbarToggle { tooltip = "Blackboard" }; + m_ToggleBlackboard.Add(new Image { image = EditorGUIUtility.LoadIcon(Path.Combine(VisualEffectGraphPackageInfo.assetPackagePath, "Editor/UIResources/VFX/variableswindow.png")) }); + m_ToggleBlackboard.RegisterCallback>(ToggleBlackboard); + m_Toolbar.Add(m_ToggleBlackboard); m_ToggleComponentBoard = new ToolbarToggle { tooltip = "Displays controls for the GameObject currently attached" }; m_ToggleComponentBoard.Add(new Image { image = EditorGUIUtility.LoadIcon(Path.Combine(VisualEffectGraphPackageInfo.assetPackagePath, "Editor/UIResources/VFX/controls.png")) }); @@ -625,11 +625,6 @@ public VFXView() m_LockedElement.Add(lockLabel); m_Blackboard = new VFXBlackboard(this); - bool blackboardVisible = BoardPreferenceHelper.IsVisible(BoardPreferenceHelper.Board.blackboard, true); - if (blackboardVisible) - Add(m_Blackboard); - toggleBlackboard.value = blackboardVisible; - m_ComponentBoard = new VFXComponentBoard(this); m_ProfilingBoard = new VFXProfilingBoard(this); @@ -655,6 +650,7 @@ public VFXView() canPasteSerializedData = VFXCanPaste; viewDataKey = "VFXView"; + m_FirstResize = true; RegisterCallback(OnGeometryChanged); } @@ -971,6 +967,7 @@ void OnToggleLock(ChangeEvent evt) } } + readonly Toggle m_ToggleBlackboard; void ToggleBlackboard(ChangeEvent e) { ToggleBlackboard(); @@ -1021,48 +1018,49 @@ void OnToggleProfilingBoard() void OnFirstComponentBoardGeometryChanged(GeometryChangedEvent e) { - if (m_FirstResize) - { - m_ComponentBoard.ValidatePosition(); - m_ComponentBoard.UnregisterCallback(OnFirstComponentBoardGeometryChanged); - } + m_ComponentBoard.ValidatePosition(); + m_ComponentBoard.UnregisterCallback(OnFirstComponentBoardGeometryChanged); } void OnFirstProfilingBoardGeometryChanged(GeometryChangedEvent e) { - if (m_FirstResize) - { - m_ProfilingBoard.ValidatePosition(); - m_ProfilingBoard.UnregisterCallback(OnFirstProfilingBoardGeometryChanged); - } + m_ProfilingBoard.ValidatePosition(); + m_ProfilingBoard.UnregisterCallback(OnFirstProfilingBoardGeometryChanged); } void OnFirstBlackboardGeometryChanged(GeometryChangedEvent e) { - if (m_FirstResize) - { - m_Blackboard.ValidatePosition(); - m_Blackboard.UnregisterCallback(OnFirstBlackboardGeometryChanged); - } + m_Blackboard.ValidatePosition(); + m_Blackboard.UnregisterCallback(OnFirstBlackboardGeometryChanged); } - public bool m_FirstResize = false; + bool m_FirstResize; void OnGeometryChanged(GeometryChangedEvent e) { - m_FirstResize = true; + if (m_FirstResize) + { + if (BoardPreferenceHelper.IsVisible(BoardPreferenceHelper.Board.blackboard, true)) + m_ToggleBlackboard.value = true; + if (BoardPreferenceHelper.IsVisible(BoardPreferenceHelper.Board.componentBoard, false)) + m_ToggleComponentBoard.value = true; + if (BoardPreferenceHelper.IsVisible(BoardPreferenceHelper.Board.profilingBoard, false)) + m_ToggleProfilingBoard.value = true; + m_FirstResize = false; + } + m_ComponentBoard.ValidatePosition(); m_ProfilingBoard.ValidatePosition(); m_Blackboard.ValidatePosition(); } - Toggle m_ToggleComponentBoard; + readonly Toggle m_ToggleComponentBoard; void ToggleComponentBoard(ChangeEvent e) { ToggleComponentBoard(); } - Toggle m_ToggleProfilingBoard; + readonly Toggle m_ToggleProfilingBoard; void ToggleProfilingBoard(ChangeEvent e) { OnToggleProfilingBoard(); From 26919e6093ae298471ac2e22fe7611025eadcf61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Chapelain?= Date: Sat, 18 Oct 2025 00:50:44 +0000 Subject: [PATCH 110/115] [HDRP] Fix perceptual smoothness in Specular occlusion for shader graphs --- .../Editor/Material/Eye/ShaderGraph/ShaderPass.template.hlsl | 2 +- .../Editor/Material/Fabric/ShaderGraph/ShaderPass.template.hlsl | 2 +- .../Editor/Material/Hair/ShaderGraph/ShaderPass.template.hlsl | 2 +- .../Editor/Material/Lit/ShaderGraph/ShaderPass.template.hlsl | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/ShaderPass.template.hlsl b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/ShaderPass.template.hlsl index d5fbc8ec195..9510cb8e922 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/ShaderPass.template.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/ShaderPass.template.hlsl @@ -89,7 +89,7 @@ void BuildSurfaceData(FragInputs fragInputs, inout SurfaceDescription surfaceDes // Just use the value passed through via the slot (not active otherwise) #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL) // If we have bent normal and ambient occlusion, process a specular occlusion - surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness)); + surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness)); #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO) surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness)); #endif diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/ShaderPass.template.hlsl b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/ShaderPass.template.hlsl index f462d96f711..18543296072 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/ShaderPass.template.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/ShaderPass.template.hlsl @@ -96,7 +96,7 @@ void BuildSurfaceData(FragInputs fragInputs, inout SurfaceDescription surfaceDes // Just use the value passed through via the slot (not active otherwise) #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL) // If we have bent normal and ambient occlusion, process a specular occlusion - surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness)); + surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness)); #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO) surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness)); #endif diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/ShaderPass.template.hlsl b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/ShaderPass.template.hlsl index c0b26b4ba29..b6bda6e4bae 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/ShaderPass.template.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/ShaderPass.template.hlsl @@ -136,7 +136,7 @@ void BuildSurfaceData(FragInputs fragInputs, inout SurfaceDescription surfaceDes // Just use the value passed through via the slot (not active otherwise) #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL) // If we have bent normal and ambient occlusion, process a specular occlusion - surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, N, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness)); + surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, N, surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness)); #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO) surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(N, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness)); #endif diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/ShaderPass.template.hlsl b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/ShaderPass.template.hlsl index c9a5e99713d..0acc9e1d765 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/ShaderPass.template.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/ShaderPass.template.hlsl @@ -132,7 +132,7 @@ void BuildSurfaceData(FragInputs fragInputs, inout SurfaceDescription surfaceDes // Just use the value passed through via the slot (not active otherwise) #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL) // If we have bent normal and ambient occlusion, process a specular occlusion - surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness)); + surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness)); #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO) surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness)); #endif From ce12b63dacbe8cbc57c6d670631d5a442daf8e70 Mon Sep 17 00:00:00 2001 From: Angela Dematte Date: Mon, 20 Oct 2025 02:23:05 +0000 Subject: [PATCH 111/115] Disable unstable tests --- .../Tests/Runtime/RuntimeTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.render-pipelines.universal/Tests/Runtime/RuntimeTests.cs b/Packages/com.unity.render-pipelines.universal/Tests/Runtime/RuntimeTests.cs index 1bca05b7aa3..a47b3fa88bf 100644 --- a/Packages/com.unity.render-pipelines.universal/Tests/Runtime/RuntimeTests.cs +++ b/Packages/com.unity.render-pipelines.universal/Tests/Runtime/RuntimeTests.cs @@ -53,6 +53,7 @@ public IEnumerator PipelineHasCorrectColorSpace() // When switching to Built-in it sets "" as global shader tag. #if UNITY_EDITOR // TODO This API call does not reset in player [UnityTest] + [Ignore("Unstable: https://jira.unity3d.com/browse/UUM-122594")] public IEnumerator PipelineSetsAndRestoreGlobalShaderTagCorrectly() { AssetCheck(); From 55e939263d92ba04d3c3451772eee1e57ba8244c Mon Sep 17 00:00:00 2001 From: Adrien Moulin Date: Mon, 20 Oct 2025 02:23:08 +0000 Subject: [PATCH 112/115] [UUM-121776] - Graphics/URP - Fix RG API SetRenderAttachmentDepth() usage in URP --- .../RenderGraph/IRenderGraphBuilder.cs | 263 ++++++++++-------- .../RenderGraph/RenderGraphUtilsBlit.cs | 2 +- .../NewPostProcessRendererFeature.cs.txt | 2 +- .../ScreenSpace/DecalGBufferRenderPass.cs | 4 +- .../AdditionalLightsShadowCasterPass.cs | 2 +- .../Runtime/Passes/DeferredPass.cs | 4 +- .../Runtime/Passes/DepthNormalOnlyPass.cs | 2 +- .../Runtime/Passes/DepthOnlyPass.cs | 2 +- .../Runtime/Passes/DrawSkyboxPass.cs | 2 +- .../Runtime/Passes/GBufferPass.cs | 2 +- .../Passes/MainLightShadowCasterPass.cs | 2 +- .../Runtime/Passes/MotionVectorRenderPass.cs | 2 +- .../Runtime/Passes/RenderObjectsPass.cs | 3 +- .../Runtime/Passes/XRDepthMotionPass.cs | 2 +- .../Runtime/Passes/XROcclusionMeshPass.cs | 2 +- .../FullScreenPassRendererFeature.cs | 2 +- .../RendererFeatures/OnTilePostProcessPass.cs | 2 +- 17 files changed, 162 insertions(+), 138 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/IRenderGraphBuilder.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/IRenderGraphBuilder.cs index 5b53db80e89..288cb9528a6 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/IRenderGraphBuilder.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/IRenderGraphBuilder.cs @@ -141,137 +141,160 @@ public interface IBaseRenderGraphBuilder : IDisposable public interface IRenderAttachmentRenderGraphBuilder : IBaseRenderGraphBuilder { /// - /// Use the texture as an rendertarget attachment. - /// - /// Writing: - /// Indicate this pass will write a texture through rendertarget rasterization writes. - /// The graph will automatically bind the texture as an MRT output on the indicated index slot. - /// Write in shader as float4 out : SV_Target{index} = value; This texture always needs to be written as an - /// render target (SV_Targetx) writing using other methods (like `operator[] =` ) may not work even if - /// using the current fragment+sampleIdx pos. When using operator[] please use the UseTexture function instead. - /// Reading: - /// Indicates this pass will read a texture on the current fragment position but not unnecessarily modify it. Although not explicitly visible in shader code - /// Reading may happen depending on the rasterization state, e.g. Blending (read and write) or Z-Testing (read only) may read the buffer. - /// - /// Note: The rendergraph does not know what content will be rendered in the bound texture. By default it assumes only partial data - /// is written (e.g. a small rectangle is drawn on the screen) so it will preserve the existing rendertarget content (e.g. behind/around the triangle) - /// if you know you will write the full screen the AccessFlags.WriteAll should be used instead as it will give better performance. + /// Binds the texture as a color render target (MRT attachment) for this pass. /// - /// Texture to use during this pass. - /// Index the shader will use to access this texture. - /// How this pass will access the texture. Default value is set to AccessFlag.Write + /// The texture to bind as a render target for this pass. + /// The MRT slot the shader writes to. This maps to `SV_Target` in the shader, for example, a value of `1` maps to `SV_Target1`. + /// The access mode for the texture. The default value is `AccessFlags.Write`. + /// + /// Potential access flags: + /// - Write: This pass outputs to the texture using render target rasterization. The render graph binds + /// the texture to the specified MRT slot (index). In HLSL, write to the slot using + /// `float4 outColor : SV_Target{index} = value;`. + /// To use random-access writes, use `SetRandomAccessAttachment` (UAV). + /// Don't write to this target with UAV-style indexed access (`operator[]`). + /// - Read: This pass might read the current contents of the render target implicitly, depending + /// on rasterization state (for example, blending operations that read before writing). + /// + /// The render graph can't determine how much of the target you overwrite. By default, it + /// assumes partial updates and preserves existing content. If you fully overwrite the target + /// (for example, in a fullscreen pass), use `AccessFlags.WriteAll` for better performance. + /// void SetRenderAttachment(TextureHandle tex, int index, AccessFlags flags = AccessFlags.Write) { SetRenderAttachment(tex, index, flags, 0, -1); } /// - /// Use the texture as an rendertarget attachment. - /// - /// Writing: - /// Indicate this pass will write a texture through rendertarget rasterization writes. - /// The graph will automatically bind the texture as an MRT output on the indicated index slot. - /// Write in shader as float4 out : SV_Target{index} = value; This texture always needs to be written as an - /// render target (SV_Targetx) writing using other methods (like `operator[] =` ) may not work even if - /// using the current fragment+sampleIdx pos. When using operator[] please use the UseTexture function instead. - /// Reading: - /// Indicates this pass will read a texture on the current fragment position but not unnecessarily modify it. Although not explicitly visible in shader code - /// Reading may happen depending on the rasterization state, e.g. Blending (read and write) or Z-Testing (read only) may read the buffer. - /// + /// Binds the texture as a color render target (MRT attachment) for this pass. /// - /// Texture to use during this pass. - /// Index the shader will use to access this texture. - /// How this pass will access the texture. - /// Selects which mip map to used. - /// Used to index into a texture array. Use -1 to use bind all slices. - /// + /// The texture to bind as a render target for this pass. + /// The MRT slot the shader writes to (corresponds to `SV_Target{index}`). + /// How this pass accesses the texture. Defaults to `AccessFlags.Write`. + /// The mip level to bind. + /// The array slice to bind. Use -1 to bind all slices. /// - /// Note: The rendergraph does not know what content will be rendered in the bound texture. By default it assumes only partial data - /// is written (e.g. a small rectangle is drawn on the screen) so it will preserve the existing rendertarget content (e.g. behind/around the triangle) - /// if you know you will write the full screen the AccessFlags.WriteAll should be used instead as it will give better performance. + /// Potential access flags: + /// - Write: This pass outputs to the texture using render target rasterization. The render graph binds + /// the texture to the specified MRT slot (index). In HLSL, write to the slot using + /// `float4 outColor : SV_Target{index} = value;`. + /// To use random-access writes, use `SetRandomAccessAttachment` (UAV). + /// Don't write to this target with UAV-style indexed access (`operator[]`). + /// - Read: This pass might read the current contents of the render target implicitly, depending + /// on rasterization state (for example, blending operations that read before writing). + /// + /// The render graph can't determine how much of the target you overwrite. By default, it + /// assumes partial updates and preserves existing content. If you fully overwrite the target + /// (for example, in a fullscreen pass), use `AccessFlags.WriteAll` for better performance. /// - /// Note: Using same texture handle with different depth slices at different rendertarget indices is not supported. + /// Using the same texture handle with different depth slices at different render target indices is not supported. /// void SetRenderAttachment(TextureHandle tex, int index, AccessFlags flags, int mipLevel, int depthSlice); /// - /// Use the texture as a depth buffer for the Z-Buffer hardware. Note you can only test-against and write-to a single depth texture in a pass. - /// If you want to write depth to more than one texture you will need to register the second texture as SetRenderAttachment and manually calculate - /// and write the depth value in the shader. - /// Calling SetRenderAttachmentDepth twice on the same builder is an error. - /// Write: - /// Indicate a texture will be written with the current fragment depth by the ROPs (but not for depth reading (i.e. z-test == always)). - /// Read: - /// Indicate a texture will be used as an input for the depth testing unit. + /// Binds the texture as the depth buffer for this pass. /// - /// Texture to use during this pass. - /// How this pass will access the texture. Default value is set to AccessFlag.Write - void SetRenderAttachmentDepth(TextureHandle tex, AccessFlags flags = AccessFlags.Write) + /// The texture to use as the depth buffer for this pass. + /// Access mode for the texture in this pass. Defaults to `AccessFlag.ReadWrite`. + /// + /// + /// Potential access flags: + /// - Write: The pass writes fragment depth to the bound depth buffer (required if `ZWrite` is enabled in shader code). + /// - Read: The pass reads from the bound depth buffer for depth testing (required if `ZTest` is set to an operation other than `Disabled`, `Never`, or `Always` in shader code). + /// + /// Only one depth buffer can be tested against or written to in a single pass. + /// To output depth to multiple textures, register the additional texture as a color + /// attachment using `SetRenderAttachment()`, then compute and write the depth value in the shader. + /// If you call `SetRenderAttachmentDepth()` more than once on the same builder, it results in an error. + /// + void SetRenderAttachmentDepth(TextureHandle tex, AccessFlags flags = AccessFlags.ReadWrite) { SetRenderAttachmentDepth(tex, flags, 0, -1); } /// - /// Use the texture as a depth buffer for the Z-Buffer hardware. Note you can only test-against and write-to a single depth texture in a pass. - /// If you want to write depth to more than one texture you will need to register the second texture as SetRenderAttachment and manually calculate - /// and write the depth value in the shader. - /// Calling SetRenderAttachmentDepth twice on the same builder is an error. - /// Write: - /// Indicate a texture will be written with the current fragment depth by the ROPs (but not for depth reading (i.e. z-test == always)). - /// Read: - /// Indicate a texture will be used as an input for the depth testing unit. + /// Binds the texture as the depth buffer for this pass. /// - /// Texture to use during this pass. - /// How this pass will access the texture. - /// Selects which mip map to used. - /// Used to index into a texture array. Use -1 to use bind all slices. - /// + /// The texture to use as the depth buffer for this pass. + /// How this pass will access the depth texture (for example, `AccessFlags.Read`, `AccessFlags.Write`, `AccessFlags.ReadWrite`). + /// The mip level to bind. + /// The array slice to bind. Use -1 to bind all slices. /// - /// Using same texture handle with different depth slices at different rendertarget indices is not supported. + /// Potential access flags: + /// - Write: The pass writes fragment depth to the bound depth buffer (required if `ZWrite` is enabled in shader code). + /// - Read: The pass reads from the bound depth buffer for depth testing (required if `ZTest` is set to an operation other than `Disabled`, `Never`, or `Always` in shader code). + /// + /// Only one depth texture can be read from or written to in a single pass. + /// To output depth to multiple textures, register the additional texture as a color + /// attachment using `SetRenderAttachment()`, then compute and write the depth value in the shader. + /// If you call `SetRenderAttachmentDepth()` more than once on the same builder, it results in an error. + /// + /// Using the same texture handle with different depth slices at different render target indices is not supported. /// void SetRenderAttachmentDepth(TextureHandle tex, AccessFlags flags, int mipLevel, int depthSlice); /// - /// Use the texture as an random access attachment. This is called "Unordered Access View" in DX12 and "Storage Image" in Vulkan. - /// - /// This informs the graph that any shaders in the pass will access the texture as a random access attachment through RWTexture2d<T>, RWTexture3d<T>,... - /// The texture can then be read/written by regular HLSL commands (including atomics, etc.). - /// - /// As in other parts of the Unity graphics APIs random access textures share the index-based slots with render targets and input attachments (if any). See CommandBuffer.SetRandomWriteTarget for details. + /// Binds the texture as a random-access attachment for this pass + /// (DX12: Unordered Access View, Vulkan: Storage Image). /// - /// Texture to use during this pass. - /// Index the shader will use to access this texture. This is set in the shader through the `register(ux)` keyword. - /// How this pass will access the texture. Default value is set to AccessFlag.ReadWrite. - /// The value passed to 'input'. You should not use the returned value it will be removed in the future. + /// The texture to expose as a UAV in this pass. + /// The binding slot the shader uses to access this UAV (HLSL: `register(u[index])`). + /// Access mode for this texture in the pass. Defaults to `AccessFlags.ReadWrite`. + /// + /// This declares that shaders in the pass will access the texture via + /// `RWTexture2D`, `RWTexture3D`, etc., enabling read/write operations, + /// atomics, and other UAV-style operations using standard HLSL. + /// + /// The value passed to the `tex` parameter. The return value is deprecated. + /// + /// + /// Random-access (UAV) textures share index-based binding slots with + /// render targets and input attachments. Refer to `CommandBuffer.SetRandomWriteTarget` + /// for platform-specific details and constraints. + /// TextureHandle SetRandomAccessAttachment(TextureHandle tex, int index, AccessFlags flags = AccessFlags.ReadWrite); /// - /// Use the buffer as an random access attachment. This is called "Unordered Access View" in DX12 and "Storage Buffer" in Vulkan. - /// - /// This informs the graph that any shaders in the pass will access the buffer as a random access attachment through RWStructuredBuffer, RWByteAddressBuffer,... - /// The buffer can then be read/written by regular HLSL commands (including atomics, etc.). - /// - /// As in other parts of the Unity graphics APIs random access buffers share the index-based slots with render targets and input attachments (if any). See CommandBuffer.SetRandomWriteTarget for details. + /// Binds the buffer as a random-access attachment for this pass + /// (DX12: Unordered Access View, Vulkan: Storage Buffer). /// - /// Buffer to use during this pass. - /// Index the shader will use to access this texture. This is set in the shader through the `register(ux)` keyword. - /// How this pass will access the buffer. Default value is set to AccessFlag.Read. - /// The value passed to 'input'. You should not use the returned value it will be removed in the future. + /// The buffer to expose as a UAV in this pass. + /// The binding slot the shader uses to access this UAV (HLSL: `register(u[index])`). + /// Access mode for this buffer in the pass. Defaults to `AccessFlags.Read`. + /// + /// The value passed to the `buffer` parameter. The return value is deprecated. + /// + /// + /// This declares that shaders in the pass will access the buffer via + /// `RWStructuredBuffer`, `RWByteAddressBuffer`, etc., enabling read/write, + /// atomics, and other UAV-style operations using standard HLSL. + /// + /// Random-access (UAV) buffers share index-based binding slots with + /// render targets and input attachments. Refer to `CommandBuffer.SetRandomWriteTarget` + /// for platform-specific details and constraints. + /// BufferHandle UseBufferRandomAccess(BufferHandle tex, int index, AccessFlags flags = AccessFlags.Read); /// - /// Use the buffer as an random access attachment. This is called "Unordered Access View" in DX12 and "Storage Buffer" in Vulkan. - /// - /// This informs the graph that any shaders in the pass will access the buffer as a random access attachment through RWStructuredBuffer, RWByteAddressBuffer,... - /// The buffer can then be read/written by regular HLSL commands (including atomics, etc.). - /// - /// As in other parts of the Unity graphics APIs random access buffers share the index-based slots with render targets and input attachments (if any). See CommandBuffer.SetRandomWriteTarget for details. + /// Binds the buffer as a random-access attachment for this pass + /// (DX12: Unordered Access View, Vulkan: Storage Buffer). /// - /// Buffer to use during this pass. - /// Index the shader will use to access this texture. This is set in the shader through the `register(ux)` keyword. - /// Whether to leave the append/consume counter value unchanged. The default is to preserve the value. - /// How this pass will access the buffer. Default value is set to AccessFlag.Read. - /// The value passed to 'input'. You should not use the returned value it will be removed in the future. + /// The buffer to expose as a UAV in this pass. + /// The binding slot the shader uses to access this UAV (HLSL: `register(u[index])`). + /// Whether to keep the current append/consume counter unchanged for this UAV buffer. Defaults to preserving the existing counter value. + /// Access mode for this buffer in the pass. Defaults to `AccessFlags.Read`. + /// + /// The value passed to the `buffer` parameter. The return value is deprecated. + /// + /// + /// This declares that shaders in the pass will access the buffer via + /// `RWStructuredBuffer`, `RWByteAddressBuffer`, etc., enabling read/write, + /// atomics, and other UAV-style operations using standard HLSL. + /// + /// Random-access (UAV) buffers share index-based binding slots with + /// render targets and input attachments. Refer to `CommandBuffer.SetRandomWriteTarget` + /// for platform-specific details and constraints. + /// BufferHandle UseBufferRandomAccess(BufferHandle tex, int index, bool preserveCounterValue, AccessFlags flags = AccessFlags.Read); } @@ -317,42 +340,42 @@ public void SetRenderFunc(BaseRenderFunc public interface IRasterRenderGraphBuilder : IRenderAttachmentRenderGraphBuilder { /// - /// Use the texture as an input attachment. - /// - /// This informs the graph that any shaders in pass will only read from this texture at the current fragment position using the - /// LOAD_FRAMEBUFFER_INPUT(idx)/LOAD_FRAMEBUFFER_INPUT_MS(idx,sampleIdx) macros. The index passed to LOAD_FRAMEBUFFER_INPUT needs - /// to match the index passed to SetInputAttachment for this texture. - /// + /// Binds the texture as an input attachment for this pass. + /// + /// Shaders might read this texture at the current fragment using + /// `LOAD_FRAMEBUFFER_INPUT(idx)` or `LOAD_FRAMEBUFFER_INPUT_MS(idx, sampleIdx)`. + /// The `idx` used in the shader must match the `index` provided to `SetInputAttachment`. /// /// - /// This API is not universally supported across all platforms. In particular, using input attachments in combination with MSAA may be unsupported on certain targets. - /// To ensure compatibility, use `RenderGraphUtils.IsFramebufferFetchSupportedOnCurrentPlatform` to verify support at runtime, as platform capabilities may vary. + /// Platform support varies. Input attachments, especially with MSAA, might be unsupported on + /// some targets. Use `RenderGraphUtils.IsFramebufferFetchSupportedOnCurrentPlatform` at + /// runtime to check compatibility. /// - /// Texture to use during this pass. - /// Index the shader will use to access this texture. - /// How this pass will access the texture. Default value is set to AccessFlag.Read. Writing is currently not supported on any platform. + /// The texture to expose as an input attachment. + /// The binding index used by the shader macros (`idx`). + /// The access mode for this texture. Defaults to `AccessFlags.Read`. Writing is currently not supported on any platform. void SetInputAttachment(TextureHandle tex, int index, AccessFlags flags = AccessFlags.Read) { SetInputAttachment(tex, index, flags, 0, -1); } /// - /// Use the texture as an input attachment. - /// - /// This informs the graph that any shaders in pass will only read from this texture at the current fragment position using the - /// LOAD_FRAMEBUFFER_INPUT(idx)/LOAD_FRAMEBUFFER_INPUT_MS(idx,sampleIdx) macros. The index passed to LOAD_FRAMEBUFFER_INPUT needs - /// to match the index passed to SetInputAttachment for this texture. - /// + /// Binds the texture as an input attachment for this pass. + /// + /// Shaders might read this texture at the current fragment using + /// `LOAD_FRAMEBUFFER_INPUT(idx)` or `LOAD_FRAMEBUFFER_INPUT_MS(idx, sampleIdx)`. + /// The `idx` used in the shader must match the `index` provided in `SetInputAttachment`. /// - /// Texture to use during this pass. - /// Index the shader will use to access this texture. - /// How this pass will access the texture. Writing is currently not supported on any platform. - /// Selects which mip map to used. - /// Used to index into a texture array. Use -1 to use bind all slices. - /// /// - /// Using same texture handle with different depth slices at different rendertarget indices is not supported. + /// Platform support varies. Input attachments, especially with MSAA, might be unsupported on + /// some targets. Use `RenderGraphUtils.IsFramebufferFetchSupportedOnCurrentPlatform` at + /// runtime to check compatibility. /// + /// The texture to expose as an input attachment. + /// The binding index used by the shader macros (`idx`). + /// The access mode for the texture. Defaults to `AccessFlags.Read`. Writing is currently not supported on any platform. + /// The mip level to bind. + /// The array slice to bind. Use -1 to bind all slices. void SetInputAttachment(TextureHandle tex, int index, AccessFlags flags, int mipLevel, int depthSlice); /// diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphUtilsBlit.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphUtilsBlit.cs index 76620b94986..2552aed1337 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphUtilsBlit.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphUtilsBlit.cs @@ -212,7 +212,7 @@ public static IBaseRenderGraphBuilder AddCopyPass( passData.isMSAA = isMSAA; passData.force2DForXR = isXRArrayTextureActive && (!isArrayTexture); - builder.SetInputAttachment(source, 0, AccessFlags.Read); + builder.SetInputAttachment(source, 0); builder.SetRenderAttachment(destination, 0, AccessFlags.Write); builder.SetRenderFunc((CopyPassData data, RasterGraphContext context) => CopyRenderFunc(data, context)); diff --git a/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessRendererFeature.cs.txt b/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessRendererFeature.cs.txt index 427893244d7..4062811ba2d 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessRendererFeature.cs.txt +++ b/Packages/com.unity.render-pipelines.universal/Editor/RendererFeatures/NewPostProcessRendererFeature.cs.txt @@ -242,7 +242,7 @@ public sealed class #FEATURE_TYPE# : ScriptableRendererFeature // Bind the depth-stencil buffer. // This is a demonstration. The code isn't used in the example. if (kBindDepthStencilAttachment) - builder.SetRenderAttachmentDepth(resourcesData.activeDepthTexture, AccessFlags.Write); + builder.SetRenderAttachmentDepth(resourcesData.activeDepthTexture); // Set the render method. builder.SetRenderFunc((MainPassData data, RasterGraphContext context) => ExecuteMainPass(data, context)); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs index 2de0180c6b3..a98bc6d2776 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Decal/ScreenSpace/DecalGBufferRenderPass.cs @@ -102,9 +102,9 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer if (renderGraph.nativeRenderPassesEnabled) { if (resourceData.gBuffer[4].IsValid()) - builder.SetInputAttachment(resourceData.gBuffer[4], 0, AccessFlags.Read); + builder.SetInputAttachment(resourceData.gBuffer[4], 0); if (m_DecalLayers && resourceData.gBuffer[5].IsValid()) - builder.SetInputAttachment(resourceData.gBuffer[5], 1, AccessFlags.Read); + builder.SetInputAttachment(resourceData.gBuffer[5], 1); } else { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs index 5bc9649eff6..52b00fc619d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/AdditionalLightsShadowCasterPass.cs @@ -928,7 +928,7 @@ internal TextureHandle Render(RenderGraph graph, ContextContainer frameData) } shadowTexture = UniversalRenderer.CreateRenderGraphTexture(graph, m_AdditionalLightShadowDescriptor, k_AdditionalLightShadowMapTextureName, true, ShadowUtils.m_ForceShadowPointSampling ? FilterMode.Point : FilterMode.Bilinear); - builder.SetRenderAttachmentDepth(shadowTexture, AccessFlags.Write); + builder.SetRenderAttachmentDepth(shadowTexture, AccessFlags.ReadWrite); } else { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs index 096f03e321f..4df68f9df43 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DeferredPass.cs @@ -45,7 +45,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur passData.shadowData = shadowData; builder.SetRenderAttachment(color, 0, AccessFlags.Write); - builder.SetRenderAttachmentDepth(depth, AccessFlags.Write); + builder.SetRenderAttachmentDepth(depth, AccessFlags.ReadWrite); passData.deferredLights = m_DeferredLights; if (!m_DeferredLights.UseFramebufferFetch) @@ -63,7 +63,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur { if (i != m_DeferredLights.GBufferLightingIndex) { - builder.SetInputAttachment(gbuffer[i], idx, AccessFlags.Read); + builder.SetInputAttachment(gbuffer[i], idx); idx++; } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs index fbe1f400563..6ae6f6677f3 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs @@ -129,7 +129,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { builder.SetRenderAttachment(cameraNormalsTexture, 0, AccessFlags.Write); - builder.SetRenderAttachmentDepth(cameraDepthTexture, AccessFlags.Write); + builder.SetRenderAttachmentDepth(cameraDepthTexture, AccessFlags.ReadWrite); passData.enableRenderingLayers = enableRenderingLayers; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs index 9b62da952f9..ffe91a574b1 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs @@ -86,7 +86,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, ref Te passData.rendererList = renderGraph.CreateRendererList(param); builder.UseRendererList(passData.rendererList); - builder.SetRenderAttachmentDepth(cameraDepthTexture, AccessFlags.Write); + builder.SetRenderAttachmentDepth(cameraDepthTexture, AccessFlags.ReadWrite); if (setGlobalDepth) builder.SetGlobalTextureAfterPass(cameraDepthTexture, s_CameraDepthTextureID); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs index e42715d93bd..ace645a9a60 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs @@ -101,7 +101,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Script passData.material = skyboxMaterial; builder.UseRendererList(skyRendererListHandle); builder.SetRenderAttachment(colorTarget, 0, AccessFlags.Write); - builder.SetRenderAttachmentDepth(depthTarget, AccessFlags.Write); + builder.SetRenderAttachmentDepth(depthTarget, AccessFlags.ReadWrite); builder.AllowPassCulling(false); if (cameraData.xr.enabled) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs index 852025e1d74..3eab752f673 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs @@ -155,7 +155,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur RenderGraphUtils.UseDBufferIfValid(builder, resourceData); - builder.SetRenderAttachmentDepth(cameraDepth, AccessFlags.Write); + builder.SetRenderAttachmentDepth(cameraDepth, AccessFlags.ReadWrite); passData.deferredLights = m_DeferredLights; InitRendererLists(ref passData, default, renderGraph, renderingData, cameraData, lightData); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs index d62e73a3b70..6149bd16a93 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MainLightShadowCasterPass.cs @@ -400,7 +400,7 @@ internal TextureHandle Render(RenderGraph graph, ContextContainer frameData) } shadowTexture = UniversalRenderer.CreateRenderGraphTexture(graph, m_MainLightShadowDescriptor, k_MainLightShadowMapTextureName, true, ShadowUtils.m_ForceShadowPointSampling ? FilterMode.Point : FilterMode.Bilinear); - builder.SetRenderAttachmentDepth(shadowTexture, AccessFlags.Write); + builder.SetRenderAttachmentDepth(shadowTexture, AccessFlags.ReadWrite); } else { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs index 3a45b84d488..de405fb5f15 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs @@ -169,7 +169,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur } builder.SetRenderAttachment(motionVectorColor, 0, AccessFlags.Write); - builder.SetRenderAttachmentDepth(motionVectorDepth, AccessFlags.Write); + builder.SetRenderAttachmentDepth(motionVectorDepth, AccessFlags.ReadWrite); InitPassData(ref passData, cameraData); passData.cameraDepth = cameraDepthTexture; builder.UseTexture(cameraDepthTexture, AccessFlags.Read); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs index 4785a269ca0..ff637b4090d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs @@ -244,8 +244,9 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer passData.color = resourceData.activeColorTexture; builder.SetRenderAttachment(resourceData.activeColorTexture, 0, AccessFlags.Write); + // TODO: Take into account user-specific settings to decide depth flag if (cameraData.imageScalingMode != ImageScalingMode.Upscaling || passData.renderPassEvent != RenderPassEvent.AfterRenderingPostProcessing) - builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.Write); + builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.ReadWrite); TextureHandle mainShadowsTexture = resourceData.mainShadowsTexture; TextureHandle additionalShadowsTexture = resourceData.additionalShadowsTexture; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XRDepthMotionPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XRDepthMotionPass.cs index d7c849e22b2..b08f32a148d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XRDepthMotionPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XRDepthMotionPass.cs @@ -209,7 +209,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData) } // Setup Color and Depth attachments builder.SetRenderAttachment(xrMotionVectorColor, 0, AccessFlags.Write); - builder.SetRenderAttachmentDepth(xrMotionVectorDepth, AccessFlags.Write); + builder.SetRenderAttachmentDepth(xrMotionVectorDepth, AccessFlags.ReadWrite); // Setup RendererList InitObjectMotionRendererLists(ref passData, ref renderingData.cullResults, renderGraph, cameraData.camera); diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs index 40eab2bd252..1dd8decf92b 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs @@ -45,7 +45,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, in Tex passData.xr = cameraData.xr; passData.cameraColorAttachment = cameraColorAttachment; builder.SetRenderAttachment(cameraColorAttachment, 0); - builder.SetRenderAttachmentDepth(cameraDepthAttachment, AccessFlags.Write); + builder.SetRenderAttachmentDepth(cameraDepthAttachment, AccessFlags.ReadWrite); passData.isActiveTargetBackBuffer = resourceData.isActiveTargetBackBuffer; diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs index 4e52a54f9b6..5737fa52bbc 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/FullScreenPassRendererFeature.cs @@ -249,7 +249,7 @@ private void AddFullscreenRenderPassInputPass(RenderGraph renderGraph, Universal builder.SetRenderAttachment(destination, 0, AccessFlags.Write); if (m_BindDepthStencilAttachment) - builder.SetRenderAttachmentDepth(resourcesData.activeDepthTexture, AccessFlags.Write); + builder.SetRenderAttachmentDepth(resourcesData.activeDepthTexture, AccessFlags.ReadWrite); builder.SetRenderFunc((MainPassData data, RasterGraphContext rgContext) => { diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/OnTilePostProcessPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/OnTilePostProcessPass.cs index c8c669ac32a..c7f306328af 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/OnTilePostProcessPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RendererFeatures/OnTilePostProcessPass.cs @@ -183,7 +183,7 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer } else { - builder.SetInputAttachment(source, 0, AccessFlags.Read); + builder.SetInputAttachment(source, 0); // MSAA shader resolve keywords require global state modification builder.AllowGlobalStateModification(true); } From a1b5f0ba507b02f659e3bf1fc481b9a30f469325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Leli=C3=A8vre?= Date: Tue, 21 Oct 2025 00:54:42 +0000 Subject: [PATCH 113/115] Add volumetric slider cutoff --- .../fog-volume-override-reference.md | 57 ++-- .../Documentation~/troubleshoot-fog.md | 41 ++- .../Sky/AtmosphericScattering/FogEditor.cs | 11 + .../Lighting/AtmosphericScattering/Fog.cs | 6 +- .../HDRenderPipeline.VolumetricLighting.cs | 3 +- ...DRenderPipeline.VolumetricLighting.cs.hlsl | 2 +- .../VolumetricLighting.compute | 259 +++++++++--------- 7 files changed, 218 insertions(+), 161 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/fog-volume-override-reference.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/fog-volume-override-reference.md index fb2b8324fab..ca7b044d82c 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/fog-volume-override-reference.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/fog-volume-override-reference.md @@ -10,34 +10,35 @@ Refer to [Create a global fog effect](create-a-global-fog-effect.md) for more in [!include[](snippets/Volume-Override-Enable-Properties.md)] -| Property | Function | -| :----------------------- | :----------------------------------------------------------- | -| **State** | Controls whether the fog is enabled. | -| **Fog Attenuation Distance** | Controls the density at the base of the fog and determines how far you can see through the fog in meters. At this distance, the fog has absorbed and out-scattered 63% of background light. | -| **Base Height** | The height of the boundary between the constant (homogeneous) fog and the exponential fog. | -| **Maximum Height** | Controls the rate of falloff for the height fog in meters. Higher values stretch the fog vertically. At this height , the falloff reduces the initial base density by 63%. | -| **Max Fog Distance** | Controls the distance (in meters) when applying fog to the skybox or background. Also determines the range of the Distant Fog. For optimal results, set this to be larger than the Camera’s Far value for its Clipping Plane. Otherwise, a discrepancy occurs between the fog on the Scene’s GameObjects and on the skybox. Note that the Camera’s Far Clipping Plane is flat whereas HDRP applies fog within a sphere surrounding the Camera. | -| **Color Mode** | Use the drop-down to select the mode HDRP uses to calculate the color of the fog.
• **Sky Color**: HDRP shades the fog with a color it samples from the sky cubemap and its mipmaps.
• **Constant Color**: HDRP shades the fog with the color you set manually in the **Constant Color** field that appears when you select this option. | -| **- Tint** | HDR color multiplied with the sky color.
This property only appears when you select **Sky Color** from the **Color Mode** drop-down. | -| **- Mip Fog Near** | The distance (in meters) from the Camera that HDRP stops sampling the lowest resolution mipmap for the fog color.
This property only appears when you select **Sky Color** from the **Color Mode** drop-down. | -| **- Mip Fog Far** | The distance (in meters) from the Camera that HDRP starts sampling the highest resolution mipmap for the fog color.
This property only appears when you select **Sky Color** from the **Color Mode** drop-down. | -| **- Mip Fog Max Mip** | Use the slider to set the maximum mipmap that HDRP uses for the mip fog. This defines the mipmap that HDRP samples for distances greater than **Mip Fog Far**.
This property only appears when you select **Sky Color** from the **Color Mode** drop-down. | -| **- Constant Color** | Use the color picker to select the color of the fog.
This property only appears when you select **Constant Color** from the **Color Mode** drop-down. | -| **Volumetric Fog** | Indicates whether HDRP should calculate volumetric fog or not. | -| - **Albedo** | The color of the volumetric fog to. Volumetric fog tints lighting, so the fog scatters light to this color. It only tints lighting emitted by Lights behind or within the fog. This means that it doesn't tint lighting that reflects off GameObjects behind or within the fog - reflected lighting only gets dimmer (fades to black) as fog density increases. For example, if you shine a Light at a white wall through fog with a red **Albedo**, the fog looks red. If you shine a Light at a white wall and view it from the other side of the fog, the fog darkens the light but doesn’t tint it red. | -| - **Ambient Light Probe Dimmer** | The amount to dim the intensity of the global ambient light probe that the sky generates. A value of 0 doesn't dim the light probe and a value of 1 fully dims the light probe. | -| - **Volumetric Fog Distance** | The distance (in meters) from the Camera at which the volumetric fog section of the frustum ends. | -| - **Denoising Mode** | The denoising technique to use for the volumetric fog. The options are:
• **None**: Applies no denoising.
• **Reprojection**: A denoising technique that's effective for static lighting, but can lead to severe ghosting for highly dynamic lighting.
• **Gaussian**: A denoising technique that's better than **Reprojection** for dynamic lighting.
• **Both**: Applies both **Reprojection** and **Gaussian** techniques. Using both techniques can produce high quality results but significantly increases the resource intensity of the effect. | -| - **Slice Distribution Uniformity** | The uniformity of the distribution of slices along the Camera's forward axis. HDRP samples volumetric fog at multiple distances from the Camera. Each of these sample areas is called a slice. A value of 0 makes the distribution of slices exponential (the spacing between the slices increases with the distance from the Camera) which gives greater precision near to the Camera, and lower precision further away. A value of 1 results in a uniform distribution which gives the same level of precision regardless of the distance to the Camera. | -| - **Quality** | Specifies the preset HDRP uses to populate the values of the following nested properties. The options are:
• **Low**: A preset that emphasizes performance over quality.
• **Medium**: A preset that balances performance and quality.
• **High**: A preset that emphasizes quality over performance.
• **Custom**: Allows you to override each property individually.
If you select any value other than **Custom**, **Fog Control Mode** switches to **Balance**. | -| - - **Fog Control Mode** | Specifies the method to use to control the performance and quality of the volumetric fog. The options are:
• **Balance**: Uses a performance-oriented approach to define the quality of the volumetric fog.
• **Manual**: Gives you access to the internal set of properties which directly control the effect. | -| - - - **Volumetric Fog Budget** | The performance to quality ratio of the volumetric fog. A value of 0 being the least resource-intensive and a value of 1 being the highest quality.
This property only appears if you set **Fog Control Mode** to **Balance**. | -| - - - **Resolution Depth Ratio** | The ratio HDRP uses to share resources between the screen (x-axis and y-axis) and the depth (z-axis) resolutions.
This property only appears if you set **Fog Control Mode** to **Balance**. | -| - - - **Screen Resolution Percentage** | The resolution of the volumetric buffer (3D texture) along the x-axis and y-axis relative to the resolution of the screen.
This property only appears if you set **Fog Control Mode** to **Manual**. | -| - - - **Volume Slice Count** | The number of slices to use for the volumetric buffer (3D texture) along the camera's focal axis.
This property only appears if you set **Fog Control Mode** to **Manual**. | -| - **Directional Lights Only** | Indicates whether HDRP only process volumetric fog for directional [Lights](Light-Component.md) or for all Lights. Including non-directional Lights increases the resource intensity of the effect. | -| - **Anisotropy** | Controls the angular distribution of scattered light. 0 is isotropic, 1 is forward scattering, and -1 is backward scattering. Note that non-zero values have a moderate performance impact. High values may have compatibility issues with the **Enable Reprojection for Volumetrics** Frame Setting. This is an experimental property that HDRP applies to both global and local fog. | -| - **Multiple Scattering Intensity** | Specifies how much light is scattered the further away from the camera. | +| Property | Function | +|:-----------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **State** | Controls whether the fog is enabled. | +| **Fog Attenuation Distance** | Controls the density at the base of the fog and determines how far you can see through the fog in meters. At this distance, the fog has absorbed and out-scattered 63% of background light. | +| **Base Height** | The height of the boundary between the constant (homogeneous) fog and the exponential fog. | +| **Maximum Height** | Controls the rate of falloff for the height fog in meters. Higher values stretch the fog vertically. At this height , the falloff reduces the initial base density by 63%. | +| **Max Fog Distance** | Controls the distance (in meters) when applying fog to the skybox or background. Also determines the range of the Distant Fog. For optimal results, set this to be larger than the Camera’s Far value for its Clipping Plane. Otherwise, a discrepancy occurs between the fog on the Scene’s GameObjects and on the skybox. Note that the Camera’s Far Clipping Plane is flat whereas HDRP applies fog within a sphere surrounding the Camera. | +| **Color Mode** | Use the drop-down to select the mode HDRP uses to calculate the color of the fog.
• **Sky Color**: HDRP shades the fog with a color it samples from the sky cubemap and its mipmaps.
• **Constant Color**: HDRP shades the fog with the color you set manually in the **Constant Color** field that appears when you select this option. | +| **- Tint** | HDR color multiplied with the sky color.
This property only appears when you select **Sky Color** from the **Color Mode** drop-down. | +| **- Mip Fog Near** | The distance (in meters) from the Camera that HDRP stops sampling the lowest resolution mipmap for the fog color.
This property only appears when you select **Sky Color** from the **Color Mode** drop-down. | +| **- Mip Fog Far** | The distance (in meters) from the Camera that HDRP starts sampling the highest resolution mipmap for the fog color.
This property only appears when you select **Sky Color** from the **Color Mode** drop-down. | +| **- Mip Fog Max Mip** | Use the slider to set the maximum mipmap that HDRP uses for the mip fog. This defines the mipmap that HDRP samples for distances greater than **Mip Fog Far**.
This property only appears when you select **Sky Color** from the **Color Mode** drop-down. | +| **- Constant Color** | Use the color picker to select the color of the fog.
This property only appears when you select **Constant Color** from the **Color Mode** drop-down. | +| **Volumetric Fog** | Indicates whether HDRP should calculate volumetric fog or not. | +| - **Albedo** | The color of the volumetric fog to. Volumetric fog tints lighting, so the fog scatters light to this color. It only tints lighting emitted by Lights behind or within the fog. This means that it doesn't tint lighting that reflects off GameObjects behind or within the fog - reflected lighting only gets dimmer (fades to black) as fog density increases. For example, if you shine a Light at a white wall through fog with a red **Albedo**, the fog looks red. If you shine a Light at a white wall and view it from the other side of the fog, the fog darkens the light but doesn’t tint it red. | +| - **Ambient Light Probe Dimmer** | The amount to dim the intensity of the global ambient light probe that the sky generates. A value of 0 doesn't dim the light probe and a value of 1 fully dims the light probe. | +| - **Volumetric Fog Distance** | The distance (in meters) from the Camera at which the volumetric fog section of the frustum ends. | +| - **Denoising Mode** | The denoising technique to use for the volumetric fog. The options are:
• **None**: Applies no denoising.
• **Reprojection**: A denoising technique that's effective for static lighting, but can lead to severe ghosting for highly dynamic lighting.
• **Gaussian**: A denoising technique that's better than **Reprojection** for dynamic lighting.
• **Both**: Applies both **Reprojection** and **Gaussian** techniques. Using both techniques can produce high quality results but significantly increases the resource intensity of the effect. | +| - **Slice Distribution Uniformity** | The uniformity of the distribution of slices along the Camera's forward axis. HDRP samples volumetric fog at multiple distances from the Camera. Each of these sample areas is called a slice. A value of 0 makes the distribution of slices exponential (the spacing between the slices increases with the distance from the Camera) which gives greater precision near to the Camera, and lower precision further away. A value of 1 results in a uniform distribution which gives the same level of precision regardless of the distance to the Camera. | +| - **Quality** | Specifies the preset HDRP uses to populate the values of the following nested properties. The options are:
• **Low**: A preset that emphasizes performance over quality.
• **Medium**: A preset that balances performance and quality.
• **High**: A preset that emphasizes quality over performance.
• **Custom**: Allows you to override each property individually.
If you select any value other than **Custom**, **Fog Control Mode** switches to **Balance**. | +| - - **Fog Control Mode** | Specifies the method to use to control the performance and quality of the volumetric fog. The options are:
• **Balance**: Uses a performance-oriented approach to define the quality of the volumetric fog.
• **Manual**: Gives you access to the internal set of properties which directly control the effect. | +| - - - **Volumetric Fog Budget** | The performance to quality ratio of the volumetric fog. A value of 0 being the least resource-intensive and a value of 1 being the highest quality.
This property only appears if you set **Fog Control Mode** to **Balance**. | +| - - - **Resolution Depth Ratio** | The ratio HDRP uses to share resources between the screen (x-axis and y-axis) and the depth (z-axis) resolutions.
This property only appears if you set **Fog Control Mode** to **Balance**. | +| - - - **Screen Resolution Percentage** | The resolution of the volumetric buffer (3D texture) along the x-axis and y-axis relative to the resolution of the screen.
This property only appears if you set **Fog Control Mode** to **Manual**. | +| - - - **Volume Slice Count** | The number of slices to use for the volumetric buffer (3D texture) along the camera's focal axis.
This property only appears if you set **Fog Control Mode** to **Manual**. | +| - **Directional Lights Only** | Indicates whether HDRP only process volumetric fog for directional [Lights](Light-Component.md) or for all Lights. Including non-directional Lights increases the resource intensity of the effect. | +| - **Anisotropy** | Controls the angular distribution of scattered light. 0 is isotropic, 1 is forward scattering, and -1 is backward scattering. Note that non-zero values have a moderate performance impact. High values may have compatibility issues with the **Enable Reprojection for Volumetrics** Frame Setting. This is an experimental property that HDRP applies to both global and local fog. | +| - **Volumetric Lighting Density Cutoff** | Skips calculating volumetric lighting in areas where fog is below a certain density. If you use [Local Volumetric Fog Volumes](local-volumetric-fog-volume-reference.md), increase this value to improve performance.

When you set a value, Unity calculates the fog density using the **Fog Attenuation Distance** value, and displays the density below the property. | +| - **Multiple Scattering Intensity** | Specifies how much light is scattered the further away from the camera. | ## Light-specific Properties diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/troubleshoot-fog.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/troubleshoot-fog.md index 76a18f445a9..1e3ea19cc82 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/troubleshoot-fog.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/troubleshoot-fog.md @@ -6,18 +6,19 @@ This document explains how to fix some common visual artifacts that can appear w A slice artifact is the appearance of thin layers around the edge of the volumetric fog. To fix this issue, go to the Local Volumetric Fog component and adjust the following settings: -- **Blend Distance**: Set this value above 0. +- **Blend Distance**: Set this value above 0 to improve visual transitions at the volume’s border and reduce slice artifacts. - **Slice Distribution Uniformity**: Increase this value to make the edge of the fog more detailed as it gets closer to the camera. -- **Volumetric Fog Distance**: Set this property between 20 and 100 to reduce the appearance of artifacts. ## Sharp edges To remove the appearance of sharp areas or corners in a volumetric fog, open the [Global Fog](create-a-global-fog-effect.md) component and set the **Denoising Mode** property to one of the following modes: - **None**. -- **Reprojection**: This mode can cause edges to have a blurry artifact (ghosting). -- **Gaussian**: Use this setting for blurry fog with no hard shapes. +- **Reprojection**: Disables denoising for fog with sharp edges or hard corners. This option maintains detail, but can introduce ghosting artifacts, and doubles the amount of memory volumetric fog uses. +- **Gaussian**: Creates soft, blurry fog with undefined shapes. This mode smooths out noise but can blur out sharp features. - **Both**: Applies both Reprojection and Gaussian techniques. This setting significantly increases the volumetric fog's memory usage and GPU time. +For more physically accurate blending between the fog and the environment, set **Falloff Mode** to **Exponential**. + ## Light flickering To stop light from flickering in a fog volume, change the following properties: @@ -27,3 +28,35 @@ To stop light from flickering in a fog volume, change the following properties: - **Volumetric Fog Distance**: Set this value between the **Distance Fade Start** and **Distance Fade End** values set in the Local Volumetric Fog component. This makes the fog fade out at the same point as its maximum distance, which reduces light flickering in the distant areas of the fog volume. - **Radius**: Increase this value in the [Light](Light-Component.md) component. This lowers the intensity of the light source which makes flickering artifacts less visible. +## Optimize fog performance + +How to optimize volumetric fog depends on the content of your scene and the quality you want. For more information about fog properties, refer to [Fog Volume Override reference](fog-volume-override-reference.md) and [Local Volumetric Fog Volume reference](local-volumetric-fog-volume-reference.md). + +To make sure all parameters are visible in the **Inspector** window, follow these steps in each Local Volumetric Fog Volume: + +1. Set **Quality** to **Custom**. +2. Set **Fog Control Mode** to **Manual**. +3. At the top of the **Fog** component, open the **More** (⋮) menu and enable **Advanced Properties**. + +Try adjusting the following properties: + +- Decrease the **Distance** parameter to reduce the number of fog slices HDRP renders. For long-distance fog, adjust the **Slice Distribution Uniformity** and **Slice Count** instead. +- Decrease **Volume Slice Count** to reduce the number of fog slices along the camera's forward axis, to reduce GPU and memory usage. Or increase **Volume Slice Count** and reduce **Slice Distribution Uniformity** to focus more slices further from the camera. +- Set the near and far clipping planes of the camera, to avoid fog rendering too close to the camera. This is particularly important in scenarios such as top-down views, where there may be a significant distance between the camera and the first visible fog or objects. +- Set **Denoising Mode** to **Gaussian** instead of **Reprojection**, so the fog uses less memory. +- Reduce the **Screen Resolution Percentage** value to a low value, to limit how much memory and computation fog uses, especially if you have highly diffuse fog. +- Enable **Directional Lights Only**, especially if you have a large or outdoor scene where only sunlight should contribute to volumetric effects. + +### Skip lighting calculations in areas with low-density fog + +To skip lighting calculations for areas where the fog density is below a certain threshold, use the **Volumetric Lighting Density Cutoff** property. + +This property can improve performance if you use [Local Volumetric Fog Volumes](local-volumetric-fog-volume-reference.md). It doesn't affect scenes with constant or height-based fog because all areas have the same density. + +Follow these steps: + +1. To remove global fog from the scene, set a very high **Fog Attenuation Distance**. +2. Add Local Volumetric Fog Volumes where you want fog to appear. +3. Increase the **Volumetric Lighting Density Cutoff** gradually, until important fog features begin to disappear. + +**Note**: This property doesn't take into account changes applied by the **Anisotropy** property. The visibility of fog might not correspond directly to the **Volumetric Lighting Density Cutoff** value in scenes with a lot of anisotropic scattering. diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/AtmosphericScattering/FogEditor.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/AtmosphericScattering/FogEditor.cs index 8f4a2a826f0..b4366d42317 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/AtmosphericScattering/FogEditor.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/Sky/AtmosphericScattering/FogEditor.cs @@ -23,6 +23,7 @@ class FogEditor : VolumeComponentWithQualityEditor protected SerializedDataParameter m_EnableVolumetricFog; protected SerializedDataParameter m_Anisotropy; + protected SerializedDataParameter m_VolumetricLightingDensityCutoff; protected SerializedDataParameter m_MultipleScatteringIntensity; protected SerializedDataParameter m_DepthExtent; protected SerializedDataParameter m_GlobalLightProbeDimmer; @@ -63,6 +64,7 @@ public override void OnEnable() m_BaseHeight = Unpack(o.Find(x => x.baseHeight)); m_MaximumHeight = Unpack(o.Find(x => x.maximumHeight)); m_Anisotropy = Unpack(o.Find(x => x.anisotropy)); + m_VolumetricLightingDensityCutoff = Unpack(o.Find(x => x.volumetricLightingDensityCutoff)); m_MultipleScatteringIntensity = Unpack(o.Find(x => x.multipleScatteringIntensity)); m_GlobalLightProbeDimmer = Unpack(o.Find(x => x.globalLightProbeDimmer)); @@ -173,6 +175,15 @@ public override void OnInspectorGUI() EndAdditionalPropertiesScope(); } + PropertyField(m_VolumetricLightingDensityCutoff); + if (m_VolumetricLightingDensityCutoff.value.floatValue > 0.0f) + { + using (new IndentLevelScope()) + { + float currentMinExtinction = VolumeRenderingUtils.ExtinctionFromMeanFreePath(m_MeanFreePath.value.floatValue); + EditorGUILayout.HelpBox($"The current minimum density for the fog is {currentMinExtinction:F3} (calculated from the Fog Distance).", MessageType.Info, wide: true); + } + } } } PropertyField(m_MultipleScatteringIntensity); diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/AtmosphericScattering/Fog.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/AtmosphericScattering/Fog.cs index 333581ca12a..9e68737a2f7 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/AtmosphericScattering/Fog.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/AtmosphericScattering/Fog.cs @@ -157,6 +157,10 @@ public float resolutionDepthRatio [Tooltip("When enabled, HDRP only includes directional Lights when it evaluates volumetric fog.")] public BoolParameter directionalLightsOnly = new BoolParameter(false); + /// Indicates at which fog density the lighting should be ignored. Every voxel containing less fog density than this value will be ignored by the volumetric lighting. + [Tooltip("Improves performance by skipping the lighting evaluation in areas with low-density fog. When the value is above 0, HDRP skips calculating volumetric lighting in areas where the fog density is below this value.")] + public FloatParameter volumetricLightingDensityCutoff = new(0.0f); + internal static bool IsFogEnabled(HDCamera hdCamera) { return hdCamera.frameSettings.IsEnabled(FrameSettingsField.AtmosphericScattering) && hdCamera.volumeStack.GetComponent().enabled.value; @@ -177,7 +181,7 @@ internal static bool IsVolumetricFogEnabled(HDCamera hdCamera) internal static bool IsVolumetricReprojectionEnabled(HDCamera hdCamera) { var fog = hdCamera.volumeStack.GetComponent(); - + return (fog.denoisingMode.value & FogDenoisingMode.Reprojection) != 0; } diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs index 9fc1b7e08ec..b90de28afbd 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs @@ -85,7 +85,7 @@ unsafe struct ShaderVariablesVolumetric public uint _VolumeCount; public uint _IsObliqueProjectionMatrix; public float _HalfVoxelArcLength; - public uint _Padding2; + public float _VolumetricLightingExtinctionCutoff; } /// Falloff mode for the local volumetric fog blend distance. @@ -997,6 +997,7 @@ unsafe void UpdateShaderVariableslVolumetrics(ref ShaderVariablesVolumetric cb, // Compute the arc length of a single froxel at 1m from the camera. // This value can be used to quickly compute the arc length of a single froxel cb._HalfVoxelArcLength = Mathf.Deg2Rad * hdCamera.camera.fieldOfView / currParams.viewportSize.y / 2.0f; + cb._VolumetricLightingExtinctionCutoff = fog.volumetricLightingDensityCutoff.value; if (updateVoxelizationFields) { diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs.hlsl b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs.hlsl index ba3132f9546..1d86bd312c4 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs.hlsl +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/HDRenderPipeline.VolumetricLighting.cs.hlsl @@ -62,7 +62,7 @@ CBUFFER_START(ShaderVariablesVolumetric) uint _VolumeCount; uint _IsObliqueProjectionMatrix; float _HalfVoxelArcLength; - uint _Padding2; + float _VolumetricLightingExtinctionCutoff; CBUFFER_END // Generated from UnityEngine.Rendering.HighDefinition.VolumetricMaterialDataCBuffer diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/VolumetricLighting.compute b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/VolumetricLighting.compute index f3a3cb75887..b020ca75bbe 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/VolumetricLighting.compute +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/VolumetricLighting/VolumetricLighting.compute @@ -619,145 +619,152 @@ void FillVolumetricLightingBuffer(LightLoopContext context, uint featureFlags, float extinction = density.a; float anisotropy = _GlobalFogAnisotropy; - // Perform per-pixel randomization by adding an offset and then sampling uniformly - // (in the log space) in a vein similar to Stochastic Universal Sampling: - // https://en.wikipedia.org/wiki/Stochastic_universal_sampling - float perPixelRandomOffset = GenerateHashedRandomFloat(posInput.positionSS); - - #ifdef ENABLE_REPROJECTION - // This is a time-based sequence of 7 equidistant numbers from 1/14 to 13/14. - // Each of them is the centroid of the interval of length 2/14. - float rndVal = frac(perPixelRandomOffset + _VBufferSampleOffset.z); - #else - float rndVal = frac(perPixelRandomOffset + 0.5); - #endif + float voxelOpticalDepth = extinction * dt; - VoxelLighting aggregateLighting; - ZERO_INITIALIZE(VoxelLighting, aggregateLighting); + // When extinction is 0, we can skip the light evaluation as we there be no contribution + // We can write the value of previous voxels in the buffer + if (extinction > _VolumetricLightingExtinctionCutoff) + { + // Perform per-pixel randomization by adding an offset and then sampling uniformly + // (in the log space) in a vein similar to Stochastic Universal Sampling: + // https://en.wikipedia.org/wiki/Stochastic_universal_sampling + float perPixelRandomOffset = GenerateHashedRandomFloat(posInput.positionSS); + + #ifdef ENABLE_REPROJECTION + // This is a time-based sequence of 7 equidistant numbers from 1/14 to 13/14. + // Each of them is the centroid of the interval of length 2/14. + float rndVal = frac(perPixelRandomOffset + _VBufferSampleOffset.z); + #else + float rndVal = frac(perPixelRandomOffset + 0.5); + #endif - // Prevent division by 0. - extinction = max(extinction, FLT_MIN); + VoxelLighting aggregateLighting; + ZERO_INITIALIZE(VoxelLighting, aggregateLighting); - if (featureFlags & LIGHTFEATUREFLAGS_DIRECTIONAL) - { - VoxelLighting lighting = EvaluateVoxelLightingDirectional(context, featureFlags, posInput, - centerWS, ray, t0, t1, dt, rndVal, - extinction, anisotropy, t < waterDistance); + // Prevent division by 0. + extinction = max(extinction, FLT_MIN); - aggregateLighting.radianceNoPhase += lighting.radianceNoPhase; - aggregateLighting.radianceComplete += lighting.radianceComplete; - } + if (featureFlags & LIGHTFEATUREFLAGS_DIRECTIONAL) + { + VoxelLighting lighting = EvaluateVoxelLightingDirectional(context, featureFlags, posInput, + centerWS, ray, t0, t1, dt, rndVal, + extinction, anisotropy, t < waterDistance); - #ifdef SUPPORT_LOCAL_LIGHTS - { - VoxelLighting lighting = EvaluateVoxelLightingLocal(context, groupIdx, featureFlags, posInput, - lightCount, lightStart, - centerWS, ray, t0, t1, dt, rndVal, - extinction, anisotropy); + aggregateLighting.radianceNoPhase += lighting.radianceNoPhase; + aggregateLighting.radianceComplete += lighting.radianceComplete; + } - aggregateLighting.radianceNoPhase += lighting.radianceNoPhase; - aggregateLighting.radianceComplete += lighting.radianceComplete; - } - #endif + #ifdef SUPPORT_LOCAL_LIGHTS + { + VoxelLighting lighting = EvaluateVoxelLightingLocal(context, groupIdx, featureFlags, posInput, + lightCount, lightStart, + centerWS, ray, t0, t1, dt, rndVal, + extinction, anisotropy); - #if SAMPLE_PROBE_VOLUMES - { - float3 apvDiffuseGI = EvaluateVoxelDiffuseGI(posInput, ray, t0, dt, rndVal, extinction); - aggregateLighting.radianceNoPhase += apvDiffuseGI; - aggregateLighting.radianceComplete += apvDiffuseGI; + aggregateLighting.radianceNoPhase += lighting.radianceNoPhase; + aggregateLighting.radianceComplete += lighting.radianceComplete; + } + #endif - } - #endif + #if SAMPLE_PROBE_VOLUMES + { + float3 apvDiffuseGI = EvaluateVoxelDiffuseGI(posInput, ray, t0, dt, rndVal, extinction); + aggregateLighting.radianceNoPhase += apvDiffuseGI; + aggregateLighting.radianceComplete += apvDiffuseGI; - #ifdef ENABLE_REPROJECTION - // Clamp here to prevent generation of NaNs. - float4 voxelValue = float4(aggregateLighting.radianceNoPhase, extinction * dt); - float4 linearizedVoxelValue = LinearizeRGBD(voxelValue); - float4 normalizedVoxelValue = linearizedVoxelValue * rcp(dt); - float4 normalizedBlendValue = normalizedVoxelValue; + } + #endif - #if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) && defined(USING_STEREO_MATRICES) - // With XR single-pass, remove the camera-relative offset for the reprojected sample - centerWS -= _WorldSpaceCameraPosViewOffset; - #endif + #ifdef ENABLE_REPROJECTION + // Clamp here to prevent generation of NaNs. + float4 voxelValue = float4(aggregateLighting.radianceNoPhase, extinction * dt); + float4 linearizedVoxelValue = LinearizeRGBD(voxelValue); + float4 normalizedVoxelValue = linearizedVoxelValue * rcp(dt); + float4 normalizedBlendValue = normalizedVoxelValue; - // Reproject the history at 'centerWS'. - float4 reprojValue = SampleVBuffer(TEXTURE3D_ARGS(_VBufferHistory, s_linear_clamp_sampler), - centerWS, - _PrevCamPosRWS.xyz, - UNITY_MATRIX_PREV_VP, - _VBufferPrevViewportSize, - _VBufferHistoryViewportScale.xyz, - _VBufferHistoryViewportLimit.xyz, - _VBufferPrevDistanceEncodingParams, - _VBufferPrevDistanceDecodingParams, - false, false, true) * float4(GetInversePreviousExposureMultiplier().xxx, 1); - - bool reprojSuccess = (_VBufferHistoryIsValid != 0) && (reprojValue.a != 0); - - if (reprojSuccess) - { - // Perform temporal blending in the log space ("Pixar blend"). - normalizedBlendValue = lerp(normalizedVoxelValue, reprojValue, ComputeHistoryWeight()); - } + #if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) && defined(USING_STEREO_MATRICES) + // With XR single-pass, remove the camera-relative offset for the reprojected sample + centerWS -= _WorldSpaceCameraPosViewOffset; + #endif + + // Reproject the history at 'centerWS'. + float4 reprojValue = SampleVBuffer(TEXTURE3D_ARGS(_VBufferHistory, s_linear_clamp_sampler), + centerWS, + _PrevCamPosRWS.xyz, + UNITY_MATRIX_PREV_VP, + _VBufferPrevViewportSize, + _VBufferHistoryViewportScale.xyz, + _VBufferHistoryViewportLimit.xyz, + _VBufferPrevDistanceEncodingParams, + _VBufferPrevDistanceDecodingParams, + false, false, true) * float4(GetInversePreviousExposureMultiplier().xxx, 1); + + bool reprojSuccess = (_VBufferHistoryIsValid != 0) && (reprojValue.a != 0); + + if (reprojSuccess) + { + // Perform temporal blending in the log space ("Pixar blend"). + normalizedBlendValue = lerp(normalizedVoxelValue, reprojValue, ComputeHistoryWeight()); + } - // Store the feedback for the voxel. - // TODO: dynamic lights (which update their position, rotation, cookie or shadow at runtime) - // do not support reprojection and should neither read nor write to the history buffer. - // This will cause them to alias, but it is the only way to prevent ghosting. - _VBufferFeedback[voxelCoord] = clamp(normalizedBlendValue * float4(GetCurrentExposureMultiplier().xxx, 1), 0, HALF_MAX); - - float4 linearizedBlendValue = normalizedBlendValue * dt; - float4 blendValue = DelinearizeRGBD(linearizedBlendValue); - - #ifdef ENABLE_ANISOTROPY - // Estimate the influence of the phase function on the results of the current frame. - float3 phaseCurrFrame; - - phaseCurrFrame.r = SafeDiv(aggregateLighting.radianceComplete.r, aggregateLighting.radianceNoPhase.r); - phaseCurrFrame.g = SafeDiv(aggregateLighting.radianceComplete.g, aggregateLighting.radianceNoPhase.g); - phaseCurrFrame.b = SafeDiv(aggregateLighting.radianceComplete.b, aggregateLighting.radianceNoPhase.b); - - // Warning: in general, this does not work! - // For a voxel with a single light, 'phaseCurrFrame' is monochromatic, and since - // we don't jitter anisotropy, its value does not change from frame to frame - // for a static camera/scene. This is fine. - // If you have two lights per voxel, we compute: - // phaseCurrFrame = (phaseA * lightingA + phaseB * lightingB) / (lightingA + lightingB). - // 'phaseA' and 'phaseB' are still (different) constants for a static camera/scene. - // 'lightingA' and 'lightingB' are jittered, so they change from frame to frame. - // Therefore, 'phaseCurrFrame' becomes temporarily unstable and can cause flickering in practice. :-( - blendValue.rgb *= phaseCurrFrame; - #endif // ENABLE_ANISOTROPY - - #else // NO REPROJECTION - - #ifdef ENABLE_ANISOTROPY - float4 blendValue = float4(aggregateLighting.radianceComplete, extinction * dt); - #else - float4 blendValue = float4(aggregateLighting.radianceNoPhase, extinction * dt); - #endif // ENABLE_ANISOTROPY - - #endif // ENABLE_REPROJECTION - - // Compute the transmittance from the camera to 't0'. - float transmittance = TransmittanceFromOpticalDepth(opticalDepth); - - #ifdef ENABLE_ANISOTROPY - float phase = _CornetteShanksConstant; - #else - float phase = IsotropicPhaseFunction(); - #endif // ENABLE_ANISOTROPY - - // Integrate the contribution of the probe over the interval. - // Integral{a, b}{Transmittance(0, t) * L_s(t) dt} = Transmittance(0, a) * Integral{a, b}{Transmittance(0, t - a) * L_s(t) dt}. - float3 probeRadiance = probeInScatteredRadiance * TransmittanceIntegralHomogeneousMedium(extinction, dt); - - // Accumulate radiance along the ray. - totalRadiance += transmittance * scattering * (phase * blendValue.rgb + probeRadiance); + // Store the feedback for the voxel. + // TODO: dynamic lights (which update their position, rotation, cookie or shadow at runtime) + // do not support reprojection and should neither read nor write to the history buffer. + // This will cause them to alias, but it is the only way to prevent ghosting. + _VBufferFeedback[voxelCoord] = clamp(normalizedBlendValue * float4(GetCurrentExposureMultiplier().xxx, 1), 0, HALF_MAX); + + float4 linearizedBlendValue = normalizedBlendValue * dt; + float4 blendValue = DelinearizeRGBD(linearizedBlendValue); + + #ifdef ENABLE_ANISOTROPY + // Estimate the influence of the phase function on the results of the current frame. + float3 phaseCurrFrame; + + phaseCurrFrame.r = SafeDiv(aggregateLighting.radianceComplete.r, aggregateLighting.radianceNoPhase.r); + phaseCurrFrame.g = SafeDiv(aggregateLighting.radianceComplete.g, aggregateLighting.radianceNoPhase.g); + phaseCurrFrame.b = SafeDiv(aggregateLighting.radianceComplete.b, aggregateLighting.radianceNoPhase.b); + + // Warning: in general, this does not work! + // For a voxel with a single light, 'phaseCurrFrame' is monochromatic, and since + // we don't jitter anisotropy, its value does not change from frame to frame + // for a static camera/scene. This is fine. + // If you have two lights per voxel, we compute: + // phaseCurrFrame = (phaseA * lightingA + phaseB * lightingB) / (lightingA + lightingB). + // 'phaseA' and 'phaseB' are still (different) constants for a static camera/scene. + // 'lightingA' and 'lightingB' are jittered, so they change from frame to frame. + // Therefore, 'phaseCurrFrame' becomes temporarily unstable and can cause flickering in practice. :-( + blendValue.rgb *= phaseCurrFrame; + #endif // ENABLE_ANISOTROPY + + #else // NO REPROJECTION + + #ifdef ENABLE_ANISOTROPY + float4 blendValue = float4(aggregateLighting.radianceComplete, extinction * dt); + #else + float4 blendValue = float4(aggregateLighting.radianceNoPhase, extinction * dt); + #endif // ENABLE_ANISOTROPY + + #endif // ENABLE_REPROJECTION + + // Compute the transmittance from the camera to 't0'. + float transmittance = TransmittanceFromOpticalDepth(opticalDepth); + + #ifdef ENABLE_ANISOTROPY + float phase = _CornetteShanksConstant; + #else + float phase = IsotropicPhaseFunction(); + #endif // ENABLE_ANISOTROPY + + // Integrate the contribution of the probe over the interval. + // Integral{a, b}{Transmittance(0, t) * L_s(t) dt} = Transmittance(0, a) * Integral{a, b}{Transmittance(0, t - a) * L_s(t) dt}. + float3 probeRadiance = probeInScatteredRadiance * TransmittanceIntegralHomogeneousMedium(extinction, dt); + + // Accumulate radiance along the ray. + totalRadiance += transmittance * scattering * (phase * blendValue.rgb + probeRadiance); + } // Compute the optical depth up to the center of the interval. - opticalDepth += 0.5 * blendValue.a; + opticalDepth += 0.5 * voxelOpticalDepth; // Store the voxel data. // Note: for correct filtering, the data has to be stored in the perceptual space. @@ -767,7 +774,7 @@ void FillVolumetricLightingBuffer(LightLoopContext context, uint featureFlags, _VBufferLighting[voxelCoord] = max(0, LinearizeRGBD(float4(/*FastTonemap*/(totalRadiance), opticalDepth)) * float4(GetCurrentExposureMultiplier().xxx, 1)); // Compute the optical depth up to the end of the interval. - opticalDepth += 0.5 * blendValue.a; + opticalDepth += 0.5 * voxelOpticalDepth; if (t0 * 0.99 > ray.maxDist) { From 9ebe484b0fb6344486cfa6afc19d617bc8e12edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20V=C3=A1zquez?= Date: Tue, 21 Oct 2025 00:54:46 +0000 Subject: [PATCH 114/115] Render Pipeline Converter - Disable the tool while running playmode. --- .../Window/RenderPipelineConvertersEditor.cs | 31 +++++++++++++++++++ .../RenderPipelineConvertersEditor.uxml | 1 + 2 files changed, 32 insertions(+) diff --git a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.cs b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.cs index 15322b8f99a..8bf227682cc 100644 --- a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.cs +++ b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.cs @@ -168,11 +168,40 @@ internal static void DontSaveToLayout(EditorWindow wnd) void OnEnable() { GraphicsToolLifetimeAnalytic.WindowOpened(); + + // Subscribe to play mode changes + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + + // If CreateGUI already ran, update UI state now + UpdateUiForPlayMode(EditorApplication.isPlaying); } private void OnDisable() { GraphicsToolLifetimeAnalytic.WindowClosed(); + + EditorApplication.playModeStateChanged -= OnPlayModeStateChanged; + } + + private void OnPlayModeStateChanged(PlayModeStateChange state) + { + // Update visibility whenever state changes + UpdateUiForPlayMode(EditorApplication.isPlaying); + } + + private void UpdateUiForPlayMode(bool isPlaying) + { + if (rootVisualElement == null) + return; + + var disabledHelpBox = rootVisualElement.Q("disabledToolHelpBox"); + var convertersMainVE = rootVisualElement.Q("converterEditorMainVE"); + + if (disabledHelpBox == null || convertersMainVE == null) + return; + + disabledHelpBox.style.display = isPlaying ? DisplayStyle.Flex : DisplayStyle.None; + convertersMainVE.SetEnabled(!isPlaying); } public void CreateGUI() @@ -255,6 +284,8 @@ public void CreateGUI() HideUnhideConverters(); EnableOrDisableConvertButton(); + + UpdateUiForPlayMode(EditorApplication.isPlaying); } private bool CanEnableConvert() diff --git a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.uxml b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.uxml index a3fc45bf0ab..f4ee802dca7 100644 --- a/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.uxml +++ b/Packages/com.unity.render-pipelines.core/Editor-PrivateShared/Tools/Converter/Window/RenderPipelineConvertersEditor.uxml @@ -1,4 +1,5 @@ + From 76cdeec313118b34c5e07478a172d9fa08613340 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Tue, 21 Oct 2025 00:54:52 +0000 Subject: [PATCH 115/115] [VFX] Give more human readable names to samples --- .../Samples~/VFXGraphAdditions/.sample.json | 4 ++-- .../Samples~/VFXOutputEventHandlers/.sample.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Packages/com.unity.visualeffectgraph/Samples~/VFXGraphAdditions/.sample.json b/Packages/com.unity.visualeffectgraph/Samples~/VFXGraphAdditions/.sample.json index 59e22d25b56..01b0dbabe4b 100644 --- a/Packages/com.unity.visualeffectgraph/Samples~/VFXGraphAdditions/.sample.json +++ b/Packages/com.unity.visualeffectgraph/Samples~/VFXGraphAdditions/.sample.json @@ -1,5 +1,5 @@ { - "displayName" : "VisualEffectGraph Additions", + "displayName" : "Visual Effect Graph Additions", "description" : "Additional Assets for use with Visual Effect Graph", "createSeparatePackage": false -} \ No newline at end of file +} diff --git a/Packages/com.unity.visualeffectgraph/Samples~/VFXOutputEventHandlers/.sample.json b/Packages/com.unity.visualeffectgraph/Samples~/VFXOutputEventHandlers/.sample.json index 4b50723e93f..b846f710de6 100644 --- a/Packages/com.unity.visualeffectgraph/Samples~/VFXOutputEventHandlers/.sample.json +++ b/Packages/com.unity.visualeffectgraph/Samples~/VFXOutputEventHandlers/.sample.json @@ -1,5 +1,5 @@ { - "displayName" : "OutputEvent Helpers", + "displayName" : "Output Event Helpers", "description" : "Additional Helper Scripts that intercept Output Events and interact with Game Objects", "createSeparatePackage": false -} \ No newline at end of file +}