From cf9e4d7f862b49f6f649f45e578e2fa49b98e2ca Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 1 Oct 2025 14:38:22 +0000 Subject: [PATCH 01/49] [Port] [6000.3] Deprecate com.unity.xr.interaction.subsystems package --- Tests/SRPTests/Projects/ShaderGraph/Packages/manifest.json | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/SRPTests/Projects/ShaderGraph/Packages/manifest.json b/Tests/SRPTests/Projects/ShaderGraph/Packages/manifest.json index 7499176cf2d..0645b04a069 100644 --- a/Tests/SRPTests/Projects/ShaderGraph/Packages/manifest.json +++ b/Tests/SRPTests/Projects/ShaderGraph/Packages/manifest.json @@ -11,7 +11,6 @@ "com.unity.testtools.codecoverage": "1.1.0", "com.unity.ugui": "2.0.0", "com.unity.visualeffectgraph": "file:../../../../../Packages/com.unity.visualeffectgraph", - "com.unity.xr.interactionsubsystems": "1.0.1", "com.unity.xr.management": "4.5.0", "com.unity.test-framework": "file:../../../../../Packages/com.unity.test-framework", "com.unity.modules.ai": "1.0.0", From 51d7c5138d1b114edde7e509dada0166cbf08ff6 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 1 Oct 2025 14:38:22 +0000 Subject: [PATCH 02/49] [Port] [6000.3] [URP] Fixed SSAO precision issue on Mobile devices --- .../ShaderLibrary/SSAO.hlsl | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/ShaderLibrary/SSAO.hlsl b/Packages/com.unity.render-pipelines.universal/ShaderLibrary/SSAO.hlsl index efa4bd13a51..e355b6f6256 100644 --- a/Packages/com.unity.render-pipelines.universal/ShaderLibrary/SSAO.hlsl +++ b/Packages/com.unity.render-pipelines.universal/ShaderLibrary/SSAO.hlsl @@ -278,15 +278,13 @@ half3 ReconstructNormal(float2 uv, float linearDepth, float3 vpos, float2 pixelD #if defined(_SOURCE_DEPTH_LOW) return half3(normalize(cross(ddy(vpos), ddx(vpos)))); #else - float2 delta = float2(_SourceSize.zw * 2.0); - - pixelDensity = rcp(pixelDensity); + float2 delta = float2(_SourceSize.zw * 2.0) * rcp(pixelDensity); // Sample the neighbour fragments - float2 lUV = float2(-delta.x, 0.0) * pixelDensity; - float2 rUV = float2(delta.x, 0.0) * pixelDensity; - float2 uUV = float2(0.0, delta.y) * pixelDensity; - float2 dUV = float2(0.0, -delta.y) * pixelDensity; + float2 lUV = float2(-delta.x, 0.0); + float2 rUV = float2(delta.x, 0.0); + float2 uUV = float2(0.0, delta.y); + float2 dUV = float2(0.0, -delta.y); float3 l1 = float3(uv + lUV, 0.0); l1.z = SampleAndGetLinearEyeDepth(l1.xy); // Left1 float3 r1 = float3(uv + rUV, 0.0); r1.z = SampleAndGetLinearEyeDepth(r1.xy); // Right1 @@ -316,17 +314,17 @@ half3 ReconstructNormal(float2 uv, float linearDepth, float3 vpos, float2 pixelD // h == 1.0 && v == 1.0: p1 = right, p2 = up // h == 0.0 && v == 1.0: p1 = up, p2 = left // Calculate the view space positions for the three points... - half3 P1; - half3 P2; + float3 P1; + float3 P2; if (closest_vertical == 0) { - P1 = half3(closest_horizontal == 0 ? l1 : d1); - P2 = half3(closest_horizontal == 0 ? d1 : r1); + P1 = closest_horizontal == 0 ? l1 : d1; + P2 = closest_horizontal == 0 ? d1 : r1; } else { - P1 = half3(closest_horizontal == 0 ? u1 : r1); - P2 = half3(closest_horizontal == 0 ? l1 : u1); + P1 = closest_horizontal == 0 ? u1 : r1; + P2 = closest_horizontal == 0 ? l1 : u1; } // Use the cross product to calculate the normal... From 47a218980d460e9ed9820a02f6fdec614319f0d8 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 1 Oct 2025 14:38:24 +0000 Subject: [PATCH 03/49] [Port] [6000.3] DOCG-7425 Add HDRP render graph docs --- .../Images/render-graph-viewer-hdrp.png | Bin 0 -> 76841 bytes ...aph-viewer-icon-acceleration-structure.png | Bin 0 -> 1484 bytes .../render-graph-viewer-icon-buffer.png | Bin 0 -> 1442 bytes .../render-graph-viewer-icon-texture.png | Bin 0 -> 1716 bytes .../Documentation~/TableOfContents.md | 7 +- .../render-graph-introduction.md | 25 +++ .../Documentation~/render-graph-view.md | 63 ++++++++ .../render-graph-viewer-reference.md | 153 ++++++++++++++++++ .../Documentation~/render-graph.md | 4 - .../Documentation~/render-passes-landing.md | 19 +++ .../rendering-and-post-processing.md | 3 +- 11 files changed, 266 insertions(+), 8 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-hdrp.png create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-icon-acceleration-structure.png create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-icon-buffer.png create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-icon-texture.png create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-introduction.md create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-view.md create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-viewer-reference.md delete mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph.md create mode 100644 Packages/com.unity.render-pipelines.high-definition/Documentation~/render-passes-landing.md diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-hdrp.png b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-hdrp.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ae2c42f0e04ecd9d17c5b0d5e819c486912567 GIT binary patch literal 76841 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 Yy5YDY&!Z})75~xF)Si2Nwz2#F0g5-p+5i9m literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-icon-acceleration-structure.png b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-icon-acceleration-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..80bba685a27defd50c7034942b1269ce2e0da05d GIT binary patch literal 1484 zcmZ8hc~sI_6#gNoJV_*=;bPr($Bt|pY5lK|QFCsR9iSuy}G_=QAP8l3GAcvIg{*&2i4aqYbz_oZc7$gH=qWO0dFFW z;<;2l}?zLO+b`^Mok)=+k7-ue(1}_K&)e`6wFQSyDdniRzmND5D6O+l9 zf6id3B(qp|bd|5wNa=%GdaHNivt~{}7luSu$db_9eCvVoeeZz;h5+v&+l1oj`Gppg z6P%bOstE66r~}V&g`S#p;Rk>M+wfvB{wy?`m}q%rqKS<9t#NIA zoyBJBx}pYui2=%MnIg&Azl?{mXOMW+lSpdgYogKa=>{~W_(o5qS4OgZ(W8->^O#s? zGg?BzcPP|deGc?N!gXZ%lk51-E;8}sjd@m2^B#nCIBrbb1j58h3e4d}XD z;OsrvdwkFP=m5i>CSM$N$2N)kR>oSztbOy=vrmJxc3q)kl$U>r9|o~%gis^#V1h9O zS+}rR9!c}#xoca)ypH;YS57>%Wp3>58a<9Y!(rKHQj=!448)11}Mv0Vpx1%AP^9FbKrB4pS?KB5#Q|KT;6A+G4VjB^;-takw`XmY-Dh3#tj9Mx=s*0~Ut^18>>_4mYk7 zXc=LTu{QI*$P^1A+xsWFkQ%C`k`3|YqJvYL^VBza_qONW9U3CqR3Kn%ZHrjSGz*WCiN)f@MILpMfipa*(O+BA z+>9mh7JB{j`P9(a+1YoTXI2_rlGcVxeXN5|>?~1Q>ReIE>S@yoFTFhXQFVS<-+Fa1 zZCduGeivK`Evsnv{x%zWJ0nP|W>#D D{~>OD literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-icon-buffer.png b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Images/render-graph-viewer-icon-buffer.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a9efe7eb847c571650b96b62412ee1ec2d0c33 GIT binary patch literal 1442 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 literal 0 HcmV?d00001 diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md index 437d65cd327..0d54da51e27 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/TableOfContents.md @@ -243,7 +243,11 @@ * [Use the Rendering Debugger](use-the-rendering-debugger.md) * [Add controls to the Rendering Debugger](add-controls-to-the-rendering-debugger.md) * [Rendering and post-processing](rendering-and-post-processing.md) - * [Execution order reference](rendering-execution-order.md) + * [Render passes](render-passes-landing.md) + * [Render graph system](render-graph-introduction.md) + * [Analyze the render graph](render-graph-view.md) + * [Render Graph Viewer reference](render-graph-viewer-reference.md) + * [Execution order reference](rendering-execution-order.md) * [Understand post-processing](Post-Processing-Main.md) * [Anti-aliasing](Anti-Aliasing.md) * [Dynamic resolution](Dynamic-Resolution.md) @@ -309,7 +313,6 @@ * [Understand custom pass variables](AOVs.md) * [Manage a custom pass without a GameObject](Global-Custom-Pass-API.md) * [Injection points](Custom-Pass-Injection-Points.md) - * [Customize the High Definition Render Pipeline (HDRP)](render-graph.md) * [Test and debug rendering and post-processing](rendering-troubleshoot.md) * [Troubleshoot a custom pass](Custom-Pass-Troubleshooting.md) * [Troubleshoot a custom post-processing effect](rendering-troubleshoot-custom-post-processes.md) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-introduction.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-introduction.md new file mode 100644 index 00000000000..81ccfdbf1a3 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-introduction.md @@ -0,0 +1,25 @@ +# Render graph system in HDRP + +The render graph system is a set of APIs from the [Core Scriptable Render Pipeline (SRP) package](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest). The High Definition Render Pipeline (HDRP) uses these APIs to create the render passes in the render pipeline. + +The render graph system automatically optimizes the graph to minimize the number of render passes, and the memory and bandwidth the render passes use. + +**Note:** Unlike in the Universal Render Pipeline (URP), you can't use the render graph system to write custom render passes in HDRP. Use [Custom Passes](Custom-Pass.md) instead. + +## How the render graph system optimizes rendering + +The render graph system does the following to optimize rendering: + +- Avoids allocating resources the frame doesn’t use. +- Removes render passes if the final frame doesn’t use their output. +- Optimizes GPU memory, for example by reusing allocated memory if a texture has the same properties as an earlier texture. +- Automatically synchronizes the compute and graphics GPU command queues, if compute shaders are used. + +On mobile platforms that use tile-based deferred rendering (TBDR), the render graph system can also merge multiple render passes into a single native render pass. A native render pass keeps textures in tile memory, rather than copying textures from the GPU to the CPU. As a result, HDRP uses less memory bandwidth and rendering time. + +To check how the render graph system optimizes rendering, refer to [Analyze the render graph](render-graph-view.md) + +## Additional resources + +- [Optimizing draw calls](reduce-draw-calls-landing-hdrp.md) +- [Reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-view.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-view.md new file mode 100644 index 00000000000..360b4bf59bf --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-view.md @@ -0,0 +1,63 @@ +--- +uid: hdrp-render-graph-view +--- +# Analyze the render graph in HDRP + +To analyze the render graph in HDRP, use the **Render Graph Viewer** window. + +The render graph is the optimized sequence of render passes the High Definition Render Pipeline (HDRP) steps through each frame. The Render Graph Viewer displays both built-in render passes and any [custom passes](Custom-Pass.md) you create. + +For more information about the **Render Graph Viewer** window, refer to [Render Graph Viewer window reference](render-graph-viewer-reference.md). + +## Open the Render Graph Viewer window + +Go to **Window** > **Analysis** > **Render Graph Viewer**. + +The **Render Graph Viewer** window displays the render graph for the active camera by default. To select another camera, use the dropdown in the toolbar. + + +## View the render graph for a build + +To connect the Render Graph Viewer window to a build, enable **Development Build** in the **Build Profiles** window when you build the project. If you build for WebGL or Universal Windows Platform (UWP), enable both **Development Build** and **Autoconnect Profiler**. + +After you build your project, follow these steps: + +1. Run your built project. +2. In the **Render Graph Viewer** window, select the **Target Selection** dropdown. The dropdown is set to **Editor** by default. +3. In the **Local** section, select your build. + +Your build appears in the **Local** section only if the build is running. + +## Example: Check how HDRP uses a resource + +You can use the resource access blocks next to a resource name to check how the render passes use the resource. + +![Render Graph Viewer example](Images/render-graph-viewer-hdrp.png) + +In this example, the **Ambient Occlusion** texture goes through the following stages: + +1. During the first 19 render passes between **Set Global Sky Texture** and **Temporal Denoise GTAO**, the texture doesn't exist. The resource assess blocks are dotted lines. + +2. The **Upsample GTAO** render pass creates the texture, and has write-only access to it. The resource access block is red. + +3. The next four render passes don't have access to the texture. The resource access blocks are gray. + +4. The **Deferred Lighting** render pass has read-only access to the texture. The resource access block is green. + +6. The **Forward (+ Emissive) Opaque** render pass has read-only access to the texture. The resource access block is green. + +7. Unity destroys the texture, because it's no longer needed. The resource access blocks are blank. + +## Check how HDRP optimized a render pass + +To check the details of a render pass, for example to find out why it's not a native render pass or a merged pass, do either of the following: + +- Select the render pass name to display the details in the Pass List. +- Below the render pass name, hover your cursor over the gray, blue, or flashing blue resource access overview block. + +For more information about displaying details of a render pass, refer to [Render Graph Viewer window reference](render-graph-viewer-reference.md). + +## Additional resources + +- [Optimizing draw calls](reduce-draw-calls-landing-hdrp.md) +- [Reduce rendering work on the CPU](reduce-rendering-work-on-cpu.md) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-viewer-reference.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-viewer-reference.md new file mode 100644 index 00000000000..09ca879fee0 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph-viewer-reference.md @@ -0,0 +1,153 @@ +--- +uid: hdrp-render-graph-viewer-reference +--- + +# Render Graph Viewer window reference for HDRP + +The **Render Graph Viewer** window displays the [render graph](render-graph-introduction.md) for the current scene in the High Definition Render Pipeline (HDRP). + +For more information about the **Render Graph Viewer** window, refer to [Analyze a render graph](render-graph-view.md). + +## Toolbar + +|**Control**|**Description**| +|-|-| +|**Refresh**|Selects whether to update the window automatically. The options are:
  • **Auto Update**: Updates the window automatically.
  • **Pause**: Doesn't update the window automatically.
| +|**Target Selection**|Selects which project the window connects to. For more information, refer to [View the render graph for a built project](render-graph-view.md#built-project). The options are:
  • **Editor**: Connects to the project in the Unity Editor.
  • **Local**: Connects to a built project on the same device.
  • **Remote**: Connects to a built project on a different device.
  • **Direct Connection**: Connects to an application through an IP address.
| +|**Camera**|Selects the camera to display the rendering loop for.| +|**Pass Filter**|Selects which render passes to display. For more information, refer to [Pass Filter dropdown](#pass-filter-property).| +|**Resource Filter**|Selects which resources to display. For more information, refer to [Resource Filter dropdown](#resource-filter-property).| +|**View Options**|Selects whether to display how the render pass stores and loads the resource in the main window.| + + +### Pass Filter dropdown + +|**Control**|**Description**| +|-|-| +|**Culled Passes**|Displays render passes that HDRP hasn't included in the render graph because they have no effect on the final image.| +|**Raster Passes**|Displays only raster render passes created using `renderGraph.AddRasterRenderPass`.| +|**Unsafe Passes**|Displays only render passes that use the `AddUnsafePass` API to use `CommandBuffer` interface APIs such as `SetRenderTarget`.| +|**Compute Passes**|Displays only compute render passes created using `renderGraph.AddComputePass`.| + + +### Resource Filter dropdown + +|**Control**|**Description**| +|-|-| +|**Imported Resources**|Displays only resources imported into the render graph using `ImportTexure`.| +|**Textures**|Displays only textures.| +|**Buffers**|Displays only buffers.| +|**Acceleration Structures**|Displays only acceleration structures used in compute render passes.| + +## Main window + +The main window is a timeline graph that displays the render passes in the render graph. It displays the following: + +- On the left, the list of resources the render passes use, in the order HDRP creates them. +- At the top, the list of render passes, in the order HDRP executes them. + +At the point where a render pass and a texture meet on the graph, a resource access block displays how the render pass uses the resource. The access block uses the following icons and colors: + +|**Access block icon or color**|**Description**| +|-|-| +|Dotted lines|The resource hasn't been created yet.| +|Green|The render pass has read-only access to the resource. The render pass can read the resource.| +|Red|The render pass has write-only access to the resource. The render pass can write to the resource.| +|Green and red|The render pass has read-write access to the resource. The render pass can read from or write to the resource.| +|Gray|The render pass can't access the resource.| +|Globe icon|The render pass sets the texture as a global resource. If the globe icon has a gray background, the resource was imported into the render graph as a `TextureHandle` object, and the pass uses the `SetGlobalTextureAfterPass` API.| +|**F**|The render pass can read the resource from on-chip GPU memory.| +|Blank|The resource has been deallocated in memory, so it no longer exists.| + +If you enable **View Options** > **Load Store Actions**, the access block displays triangles that represent how the render pass loads the resource (top-left) and stores the resource (bottom-right). The triangles use the following colors: + +|**Triangle color**|**Load or store action**| +|-|-| +|Blue|Clear| +|Green|Load| +|Red|Store| +|Gray|Don't Care| + +Select an access block to display the resource in the Resource List and the render pass in the Pass Inspector List. + +### Render passes + +|**Control**|**Description**| +|-|-| +|Render pass name|The name of the render pass. This name is set in the `AddRasterRenderPass` or `AddComputePass` method.| +|Merge bar|If HDRP merged this pass with other passes, the Render Graph Viewer displays a blue bar below the merged passes.| +|Resource access overview bar|When you select a render pass name, the resource access overview bar displays information about the pass you selected and related passes. Hover your cursor over an overview block for more information. Select an overview block to open the C# file for the render pass.

Overview blocks use the following colors:
  • White: The selected pass.
  • Gray: The pass isn't related to the selected pass.
  • Blue: The pass reads from or writes to a resource the selected pass uses.
  • Flashing blue: The pass reads from or writes to a resource the selected pass uses, and can be merged with the current pass.
| + +### Resources + +|**Property**|**Description**| +|-|-| +|Resource type|The type of the resource. Refer to the following screenshot.| +|Resource name|The resource name.| +|Imported resource|Displays a left-facing arrow if the resource is imported.| + +### Render graph viewer icons + +|**Icon**|**Description**| +|-|-| +|![Texture icon](Images/render-graph-viewer-icon-texture.png)|A texture.| +|![Acceleration structure icon](Images/render-graph-viewer-icon-acceleration-structure.png)|An acceleration structure.| +|![Buffer icon](Images/render-graph-viewer-icon-buffer.png)|A buffer.| + +## Resource List + +Select a resource in the Resource List to expand or collapse information about the resource. + +You can also use the Search bar to find a resource by name. + +|**Property**|**Description**| +|-|-| +|Resource name|The resource name.| +|Imported resource|Displays a left-facing arrow if the resource is imported.| +|**Size**|The resource size in pixels.| +|**Format**|The texture format. For more information about texture formats, refer to [GraphicsFormat](https://docs.unity3d.com/Documentation/ScriptReference/Experimental.Rendering.GraphicsFormat.html).| +|**Clear**|Displays **True** if HDRP clears the texture.| +|**BindMS**|Whether the texture is bound as a multisampled texture. For more information about multisampled textures, refer to [RenderTextureDescriptor.BindMS](https://docs.unity3d.com/ScriptReference/RenderTextureDescriptor-bindMS.html).| +|**Samples**|How many times Multisample Anti-aliasing (MSAA) samples the texture. Refer to [Anti-aliasing](anti-aliasing.md).| +|**Memoryless**|Displays **True** if the resource is stored in tile memory on mobile platforms that use tile-based deferred rendering (TBDR). For more information about TBDR, refer to [Render graph system introduction](render-graph-introduction.md).| + +## Pass List + +Select a render pass in the main window to display information about the render pass in the Pass List. + +You can also use the Search bar to find a render pass by name. + +|**Property**|**Description**| +|-|-| +|Pass name|The render pass name. If HDRP merged multiple passes, this property displays the names of all the merged passes.| +|**Native Render Pass Info**|Displays information about whether HDRP created a native render pass for this render pass by merging multiple render passes. For more information about native render passes, refer to [Introduction to the render graph system](render-graph-introduction.md).| +|**Pass break reasoning**|Displays the reasons why HDRP could not merge this render pass with the next render pass. | + +### Render Graph Pass Info + +The **Render Graph Pass Info** section displays information about the render pass, and each of the resources it uses. + +If HDRP merged multiple passes into this pass, the section displays information for each merged pass. + +|**Property**|**Description**| +|-|-| +|**Name**|The render pass name.| +|**Attachment dimensions**|The size of a resource the render pass uses, in pixels. Displays **0x0x0** if the render pass doesn't use a resource.| +|**Has depth attachment**|Whether the resource has a depth texture.| +|**MSAA samples**|How many times Multisample Anti-aliasing (MSAA) samples the texture. Refer to [Anti-aliasing](anti-aliasing.md). | +|**Async compute**|Whether the render pass accesses the resource using a compute shader.| + +### Attachments Load/Store Actions + +The **Attachments Load/Store Actions** section displays the resources the render pass uses. The section displays **No attachments** if the render pass doesn't use any resources. + +|**Property**|**Description**| +|-|-| +|**Name**|The resource name.| +|**Load Action**|The load action for the resource. Refer to [`RenderBufferLoadAction`](https://docs.unity3d.com/ScriptReference/Rendering.RenderBufferLoadAction.html).| +|**Store Action**|The store action for the resource, and how HDRP uses the resource later in another render pass or outside the graph. Refer to [`RenderBufferStoreAction`](https://docs.unity3d.com/ScriptReference/Rendering.RenderBufferStoreAction.html).| + +## Additional resources + +- [Frame Debugger](https://docs.unity3d.com/Manual/frame-debugger-window.html) +- [Optimization](Optimization.md) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph.md deleted file mode 100644 index 1b63f398632..00000000000 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-graph.md +++ /dev/null @@ -1,4 +0,0 @@ -# Customize the High Definition Render Pipeline (HDRP) - -The High Definition Render Pipeline (HDRP) uses the [render graph system](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest/index.html?subfolder=/manual/render-graph-system.html) in its implementation. This means that if you want to extend HDRP and implement your own render pipeline features, you need to learn how the render graph system works and how to write rendering code using it. For information on the render graph system and how to use it to write render pipeline features, see the [render graph system](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest/index.html?subfolder=/manual/render-graph-system.html) documentation. - diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-passes-landing.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-passes-landing.md new file mode 100644 index 00000000000..93997068be7 --- /dev/null +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/render-passes-landing.md @@ -0,0 +1,19 @@ +--- +uid: hdrp-render-passes +--- +# Render passes in HDRP + +Explore the sequence of render passes in the High Definition Render Pipeline (HDRP) and how to analyze them. + +|**Topic**|**Description**| +|-|-| +|[Render graph system in HDRP](render-graph-introduction.md)|What the render graph system is, and how it optimizes rendering.| +|[Analyze the render graph](render-graph-view.md)|Analyze the sequence of render passes in HDRP using the Render Graph Viewer.| +|[Render Graph Viewer window reference](render-graph-viewer-reference.md)|Reference for the **Render Graph Viewer** window.| +|[Execution order reference](rendering-execution-order.md)|Learn the order in which HDRP executes render passes.| + +## Additional resources + +- [Frame Debugger](https://docs.unity3d.com/Manual/frame-debugger-window.html) +- [Use the Rendering Debugger](use-the-rendering-debugger.md) + diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-and-post-processing.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-and-post-processing.md index b2e7215b017..1583248ce6b 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-and-post-processing.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/rendering-and-post-processing.md @@ -4,7 +4,7 @@ Control how the High Definition Render Pipeline (HDRP) renders a scene and apply |Page|Description| |-|-| -|[Execution order reference](rendering-execution-order.md)|Learn the order in which HDRP executes render passes.| +|[Render passes](render-passes-landing.md)|Learn about and analyze the sequence of render passes in HDRP.| |[Understand post-processing](Post-Processing-Main.md)|Learn how HDRP performs post-processing.| |[Anti-aliasing](Anti-Aliasing.md)|Use an antialiasing method to reduce the appearance of jagged edges.| |[Dynamic resolution](Dynamic-Resolution.md)|Change the screen resolution automatically to maintain a stable frame rate.| @@ -16,6 +16,5 @@ Control how the High Definition Render Pipeline (HDRP) renders a scene and apply |[Motion effects](motion-effects.md)|Apply effects to simulate the appearance of objects moving at speed.| |[Runtime effects](runtime-effects.md)|Use HDRP's API to control properties in a script at runtime.| |[Custom rendering effects](Custom-rendering.md)|Create an effect in a script and control when and how HDRP renders it.| -|[Customize the High Definition Render Pipeline (HDRP)](render-graph.md)|Uses the [render graph system](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest/index.html?subfolder=/manual/render-graph-system.html) to add render pipeline features to HDRP.| |[Troubleshoot rendering and post-processing issues]()|Fix common issues with custom effects.| From adcd9ceaa8d95f9f26adca2eea18c7a18314c99b Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 1 Oct 2025 14:38:24 +0000 Subject: [PATCH 04/49] [Port] [6000.3] Fix unselectable None option in Rendering Debugger > Volume > Camera --- .../Editor/Debugging/DebugState.cs | 29 +++++++++++++++ .../Debugging/DebugDisplaySettingsVolumes.cs | 28 ++++++--------- .../Debug/DebugDisplaySettingsCamera.cs | 35 ++++++------------- 3 files changed, 50 insertions(+), 42 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugState.cs b/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugState.cs index 2e72da47421..c9dafbe881b 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugState.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Debugging/DebugState.cs @@ -182,6 +182,35 @@ public sealed class DebugStateInt : DebugState { } [Serializable, DebugState(typeof(DebugUI.ObjectPopupField), typeof(DebugUI.CameraSelector), typeof(DebugUI.ObjectField))] public sealed class DebugStateObject : DebugState { + [SerializeField] string m_UserData; + + /// + public override void SetValue(object value, DebugUI.IValueField field) + { + // DebugStateObject is used to serialize the selected camera reference in DebugUI.CameraSelector. For SceneView Camera this doesn't work because + // the camera is never saved and always recreated. So we use a special string to identify this case and restore the reference later. + if (field is DebugUI.CameraSelector && SceneView.lastActiveSceneView != null && (Camera)value == SceneView.lastActiveSceneView.camera) + { + m_UserData = "SceneViewCamera"; + } + else + { + m_UserData = null; + } + base.SetValue(value, field); + } + + /// + public override object GetValue() + { + if (value == null && m_UserData != null && m_UserData == "SceneViewCamera" && SceneView.lastActiveSceneView != null && SceneView.lastActiveSceneView.camera != null) + { + value = SceneView.lastActiveSceneView.camera; + } + + return base.GetValue(); + } + /// /// Returns the hash code of the Debug Item. /// diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugDisplaySettingsVolumes.cs b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugDisplaySettingsVolumes.cs index b3721d1c4dc..a176848d3dc 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugDisplaySettingsVolumes.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Debugging/DebugDisplaySettingsVolumes.cs @@ -59,23 +59,10 @@ public Type selectedComponentType /// Current camera to debug. public Camera selectedCamera { - get - { -#if UNITY_EDITOR - // By default pick the one scene camera - if (m_SelectedCamera == null && SceneView.lastActiveSceneView != null) - { - var sceneCamera = SceneView.lastActiveSceneView.camera; - if (sceneCamera != null) - m_SelectedCamera = sceneCamera; - } -#endif - - return m_SelectedCamera; - } + get => m_SelectedCamera; set { - if (value != null && value != m_SelectedCamera) + if (value != m_SelectedCamera) { m_SelectedCamera = value; OnSelectionChanged(); @@ -333,7 +320,7 @@ public static DebugUI.EnumField CreateComponentSelector(SettingsPanel panel, Act }; } - public static DebugUI.ObjectPopupField CreateCameraSelector(SettingsPanel panel, Action, Object> refresh) + public static DebugUI.CameraSelector CreateCameraSelector(SettingsPanel panel, Action, Object> refresh) { return new DebugUI.CameraSelector() { @@ -708,7 +695,14 @@ public override void Dispose() public SettingsPanel(DebugDisplaySettingsVolume data) : base(data) { - AddWidget(WidgetFactory.CreateCameraSelector(this, (_, __) => Refresh())); + var cameraSelector = WidgetFactory.CreateCameraSelector(this, (_, __) => Refresh()); + + // Select first camera if none is selected + var availableCameras = cameraSelector.getObjects() as List; + if (data.selectedCamera == null && availableCameras is { Count: > 0 }) + data.selectedCamera = availableCameras[0]; + + AddWidget(cameraSelector); AddWidget(WidgetFactory.CreateComponentSelector(this, (_, __) => Refresh())); Func hiddenCallback = () => data.selectedCamera == null || data.selectedComponent <= 0; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplaySettingsCamera.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplaySettingsCamera.cs index 46509f724a9..d84ccbe9e4c 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplaySettingsCamera.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplaySettingsCamera.cs @@ -10,29 +10,8 @@ class DebugDisplaySettingsCamera : IDebugDisplaySettingsData [Serializable] public class FrameSettingsDebugData { - private Camera m_SelectedCamera; - public Camera selectedCamera - { - get - { -#if UNITY_EDITOR - if (m_SelectedCamera == null && UnityEditor.SceneView.lastActiveSceneView != null) - { - var sceneCamera = UnityEditor.SceneView.lastActiveSceneView.camera; - if (sceneCamera != null) - m_SelectedCamera = sceneCamera; - } -#endif - return m_SelectedCamera; - } - set - { - if (value != null && value != m_SelectedCamera) - { - m_SelectedCamera = value; - } - } - } + public Camera selectedCamera { get; set; } + public Dictionary registeredCameras = new (); } @@ -98,8 +77,8 @@ public static DebugUI.CameraSelector CreateCameraSelector(SettingsPanel panel, getter = () => panel.data.frameSettingsData.selectedCamera, setter = value => { - if (value is Camera cam && value != panel.data.frameSettingsData.selectedCamera) - panel.data.frameSettingsData.selectedCamera = cam; + if (value != panel.data.frameSettingsData.selectedCamera) + panel.data.frameSettingsData.selectedCamera = value as Camera; }, onValueChanged = refresh }; @@ -134,6 +113,12 @@ public SettingsPanel(DebugDisplaySettingsCamera data) : base(data) { m_CameraSelector = WidgetFactory.CreateCameraSelector(this, (_, __) => Refresh()); + + // Select first camera if none is selected + var availableCameras = m_CameraSelector.getObjects() as List; + if (data.frameSettingsData.selectedCamera == null && availableCameras is { Count: > 0 }) + data.frameSettingsData.selectedCamera = availableCameras[0]; + AddWidget(m_CameraSelector); if (GetOrCreateFrameSettingsWidgets(out var frameSettingsWidgets)) From 67ff3a5eac748ca08e9729a400b23649e4308f44 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 1 Oct 2025 14:38:24 +0000 Subject: [PATCH 05/49] [Port] [6000.3] docg-7282: Add Matrix Data types --- .../Documentation~/Property-Types.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Packages/com.unity.shadergraph/Documentation~/Property-Types.md b/Packages/com.unity.shadergraph/Documentation~/Property-Types.md index 94e50de03fb..f6a40dd9de9 100644 --- a/Packages/com.unity.shadergraph/Documentation~/Property-Types.md +++ b/Packages/com.unity.shadergraph/Documentation~/Property-Types.md @@ -185,3 +185,27 @@ Defines a **Boolean** value. Displays a **ToggleUI** field in the material inspe | Field | Type | Description | |:-------------|:------|:------------| | Default | Boolean | The default value of the [Property](https://docs.unity3d.com/Manual/SL-Properties.html). | + +## Matrix 2x2 + +Defines a Matrix 2. Matrices do not display in the **Inspector** window of the material. + +| Field | Type | +|:--------|:---------| +| Default | Matrix 2 | + +## Matrix 3x3 + +Defines a Matrix 3 value. Can't be displayed in the material inspector. + +| Field | Type | +|:--------|:---------| +| Default | Matrix 3 | + +## Matrix 4x4 + +Defines a Matrix 4 value. Can't be displayed in the material inspector. + +| Field | Type | +|:--------|:---------| +| Default | Matrix 4 | From 9d72ddb68fafdfdf06a331bb1b715cb264e26cf9 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 1 Oct 2025 14:38:25 +0000 Subject: [PATCH 06/49] [Port] [6000.3] [VFX] Prevent the sticky note title from vanishing when empty --- .../Editor/UIResources/uss/VFXStickyNote.uss | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXStickyNote.uss b/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXStickyNote.uss index 7abefe16dce..7cd18ac4e87 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXStickyNote.uss +++ b/Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXStickyNote.uss @@ -14,6 +14,7 @@ VFXStickyNote > #node-border { VFXStickyNote #title-bar { flex-direction: row; + min-height: 27px; } VFXStickyNote #title { From c4f7390692b62283bd663b1af31e8338d1afe7fb Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 1 Oct 2025 14:38:25 +0000 Subject: [PATCH 07/49] [Port] [6000.3] 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 f5ff2c6733f5b86032d4c5d0e8cf1258d9083191 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 1 Oct 2025 23:00:36 +0000 Subject: [PATCH 08/49] [Port] [6000.3] Fix Android glitch by using a different overload for SetRenderTarget --- .../Runtime/Passes/FinalBlitPass.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 33b6140cb0d..3f4debe42e5 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs @@ -218,7 +218,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData loadAction = RenderBufferLoadAction.Load; #endif - CoreUtils.SetRenderTarget(renderingData.commandBuffer, cameraTargetHandle, loadAction, RenderBufferStoreAction.Store, ClearFlag.None, Color.clear); + CoreUtils.SetRenderTarget(renderingData.commandBuffer, cameraTargetHandle.nameID, loadAction, RenderBufferStoreAction.Store, ClearFlag.None, Color.clear); ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, m_Source, cameraTargetHandle, cameraData); cameraData.renderer.ConfigureCameraTarget(cameraTargetHandle, cameraTargetHandle); } From 1d1fcc1307608a9558785e73888ccc7e3876bb0a Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Fri, 3 Oct 2025 02:33:33 +0000 Subject: [PATCH 09/49] [content automatically redacted] touching PlatformDependent folder --- .../Runtime/Lighting/LightEvaluation.hlsl | 19 +- .../Tests/HDRP_Runtime_Graphics_Tests.cs | 16 +- .../ProjectSettings/ProjectSettings.asset | 203 +++++++++++++++--- 3 files changed, 191 insertions(+), 47 deletions(-) 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 1b8a20ce70c..b4c5c59a837 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 @@ -408,18 +408,27 @@ float4 EvaluateCookie_Punctual(LightLoopContext lightLoopContext, LightData ligh float z = positionLS.z; float r = light.range; + cookie.a = 1.0; // Box lights have no range attenuation, so we must clip manually. - bool isInBounds = Max3(abs(positionCS.x), abs(positionCS.y), abs(z - 0.5 * r) - 0.5 * r + 1) <= light.boxLightSafeExtent; - if (lightType != GPULIGHTTYPE_PROJECTOR_PYRAMID && lightType != GPULIGHTTYPE_PROJECTOR_BOX) + if ( Max3(abs(positionCS.x), abs(positionCS.y), abs(z - 0.5 * r) - 0.5 * r + 1) > light.boxLightSafeExtent ) { - isInBounds = isInBounds && (dot(positionCS, positionCS) <= light.iesCut * light.iesCut); + cookie.a = 0.0; + } + else + { + if (lightType != GPULIGHTTYPE_PROJECTOR_PYRAMID && lightType != GPULIGHTTYPE_PROJECTOR_BOX) + { + float iesCut = light.iesCut; + if (dot(positionCS, positionCS) > (iesCut * iesCut)) + { + cookie.a = 0; + } + } } - float2 positionNDC = positionCS * 0.5 + 0.5; // Manually clamp to border (black). cookie.rgb = SampleCookie2D(positionNDC, light.cookieScaleOffset, lod); - cookie.a = isInBounds ? 1.0 : 0.0; } #else diff --git a/Tests/SRPTests/Projects/HDRP_RuntimeTests/Assets/Tests/HDRP_Runtime_Graphics_Tests.cs b/Tests/SRPTests/Projects/HDRP_RuntimeTests/Assets/Tests/HDRP_Runtime_Graphics_Tests.cs index 81ff50a5d31..9afc0226f22 100644 --- a/Tests/SRPTests/Projects/HDRP_RuntimeTests/Assets/Tests/HDRP_Runtime_Graphics_Tests.cs +++ b/Tests/SRPTests/Projects/HDRP_RuntimeTests/Assets/Tests/HDRP_Runtime_Graphics_Tests.cs @@ -25,7 +25,7 @@ public class HDRP_Runtime_Graphics_Tests )] [IgnoreGraphicsTest( "001-HDTemplate$", - "Huge divergence: missing textures, wrong tonemapping, wrong reflections, etc. Needs further investigation.", + "Small issue with incorrect rendering on bubble. Some half overflow issue and flickering artifacts. Will need image update when fixed", runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.Switch } )] [IgnoreGraphicsTest( @@ -44,22 +44,12 @@ public class HDRP_Runtime_Graphics_Tests "", graphicsDeviceTypes: new GraphicsDeviceType[] { GraphicsDeviceType.Metal } )] - [IgnoreGraphicsTest( - "002-HDMaterials$", - "Multiple materials are fully black or completely missing.", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.Switch } - )] [IgnoreGraphicsTest( "004-CloudsFlaresDecals$", "Area with cloud-coverage is blue on Intel-based MacOS (CI).", graphicsDeviceTypes: new[] { GraphicsDeviceType.Metal }, architectures: new [] { Architecture.X64 } )] - [IgnoreGraphicsTest( - "006-Compositor$", - "Quite different compositing results from the reference (strong shadows on the BG + character not-so blue).", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.Switch } - )] [IgnoreGraphicsTest( "007-BasicAPV$", "https://jira.unity3d.com/browse/UUM-54029", @@ -69,12 +59,12 @@ public class HDRP_Runtime_Graphics_Tests [IgnoreGraphicsTest( "011-HighQualityLines$", "Getting NVN_QUEUE_GET_ERROR_RESULT_GPU_ERROR_MMU_FAULT GPU Error. Needs further investigation.", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.Switch } + runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.Switch, RuntimePlatform.Switch2 } )] [IgnoreGraphicsTest( "012-SVL_Check$", "https://jira.unity3d.com/browse/UUM-70791", - runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.PS4, RuntimePlatform.PS5, RuntimePlatform.Switch } + runtimePlatforms: new RuntimePlatform[] { RuntimePlatform.PS4, RuntimePlatform.PS5, RuntimePlatform.Switch, RuntimePlatform.Switch2 } )] public IEnumerator Run(SceneGraphicsTestCase testCase) { diff --git a/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/ProjectSettings.asset b/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/ProjectSettings.asset index 204d19f92ae..7f67c83c3a7 100644 --- a/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/ProjectSettings.asset +++ b/Tests/SRPTests/Projects/HDRP_RuntimeTests/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,7 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 26 + serializedVersion: 28 productGUID: b239be22d64c0414ca94a51008491fbc AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 @@ -48,6 +48,8 @@ PlayerSettings: defaultScreenHeightWeb: 600 m_StereoRenderingPath: 0 m_ActiveColorSpace: 1 + unsupportedMSAAFallback: 0 + m_SpriteBatchMaxVertexCount: 65535 m_SpriteBatchVertexThreshold: 300 m_MTRendering: 1 mipStripping: 0 @@ -68,25 +70,29 @@ PlayerSettings: androidStartInFullscreen: 1 androidRenderOutsideSafeArea: 1 androidUseSwappy: 0 + androidDisplayOptions: 1 androidBlitType: 0 - androidResizableWindow: 0 + androidResizeableActivity: 0 androidDefaultWindowWidth: 1920 androidDefaultWindowHeight: 1080 androidMinimumWindowWidth: 400 androidMinimumWindowHeight: 300 androidFullscreenMode: 1 + androidAutoRotationBehavior: 1 + androidPredictiveBackSupport: 1 androidApplicationEntry: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 runInBackground: 1 - captureSingleScreen: 0 muteOtherAudioSources: 0 Prepare IOS For Recording: 0 Force IOS Speakers When Recording: 0 + audioSpatialExperience: 0 deferSystemGesturesMode: 0 hideHomeButton: 0 submitAnalytics: 1 usePlayerLog: 1 + dedicatedServerOptimizations: 1 bakeCollisionMeshes: 0 forceSingleInstance: 0 useFlipModelSwapchain: 1 @@ -116,8 +122,8 @@ PlayerSettings: xboxOneDisableEsram: 0 xboxOneEnableTypeOptimization: 0 xboxOnePresentImmediateThreshold: 0 - switchQueueCommandMemory: 1048576 - switchQueueControlMemory: 16384 + switchQueueCommandMemory: 8388608 + switchQueueControlMemory: 1048576 switchQueueComputeMemory: 262144 switchNVNShaderPoolsGranularity: 33554432 switchNVNDefaultPoolsGranularity: 16777216 @@ -126,15 +132,17 @@ PlayerSettings: switchAllowGpuScratchShrinking: 0 switchNVNMaxPublicTextureIDCount: 0 switchNVNMaxPublicSamplerIDCount: 0 + switchMaxWorkerMultiple: 8 switchNVNGraphicsFirmwareMemory: 32 - stadiaPresentMode: 0 - stadiaTargetFramerate: 0 + switchGraphicsJobsSyncAfterKick: 1 vulkanNumSwapchainBuffers: 3 vulkanEnableSetSRGBWrite: 0 vulkanEnablePreTransform: 0 vulkanEnableLateAcquireNextImage: 0 vulkanEnableCommandBufferRecycling: 1 loadStoreDebugModeEnabled: 0 + visionOSBundleVersion: 1.0 + tvOSBundleVersion: 1.0 bundleVersion: 1.0 preloadedAssets: [] metroInputSource: 0 @@ -147,6 +155,7 @@ PlayerSettings: isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 + allowHDRDisplaySupport: 0 useHDRDisplay: 0 hdrBitDepth: 0 m_ColorGamuts: 00000000 @@ -155,6 +164,7 @@ PlayerSettings: resetResolutionOnWindowResize: 0 androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 + androidMinAspectRatio: 1 applicationIdentifier: Android: com.DefaultCompany.HDRP_RuntimeTests Lumin: com.DefaultCompany.HDRPRuntimeTests @@ -163,13 +173,15 @@ PlayerSettings: tvOS: com.DefaultCompany.HDRPRuntimeTests buildNumber: Standalone: 0 + VisionOS: 0 iPhone: 0 tvOS: 0 overrideDefaultApplicationIdentifier: 1 AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 22 + AndroidMinSdkVersion: 25 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 + AndroidPreferredDataLocation: 1 aotOptions: nimt-trampolines=1024 stripEngineCode: 1 iPhoneStrippingLevel: 0 @@ -183,10 +195,14 @@ PlayerSettings: strictShaderVariantMatching: 1 VertexChannelCompressionMask: 4054 iPhoneSdkVersion: 988 - iOSTargetOSVersionString: 13.0 + iOSSimulatorArchitecture: 0 + iOSTargetOSVersionString: 15.0 tvOSSdkVersion: 0 + tvOSSimulatorArchitecture: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: 13.0 + tvOSTargetOSVersionString: 15.0 + VisionOSSdkVersion: 0 + VisionOSTargetOSVersionString: 1.0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 @@ -211,7 +227,6 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -219,7 +234,6 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: iOSLaunchScreenCustomStoryboardPath: iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] @@ -229,13 +243,16 @@ PlayerSettings: iOSMetalForceHardShadows: 0 metalEditorSupport: 1 metalAPIValidation: 1 + metalCompileShaderBinary: 0 iOSRenderExtraFrameOnPause: 0 iosCopyPluginsCodeInsteadOfSymlink: 0 appleDeveloperTeamID: iOSManualSigningProvisioningProfileID: tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 iOSRequireARKit: 0 iOSAutomaticallyDetectAndAddCapabilities: 1 @@ -253,15 +270,19 @@ PlayerSettings: useCustomGradleSettingsTemplate: 0 useCustomProguardFile: 0 AndroidTargetArchitectures: 1 - AndroidTargetDevices: 0 + AndroidAllowedArchitectures: -1 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 + AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 + androidAppCategory: 3 + useAndroidAppCategory: 1 + androidAppCategoryOther: AndroidEnableTango: 0 androidEnableBanner: 1 androidUseLowAccuracyLocation: 0 @@ -271,14 +292,106 @@ PlayerSettings: height: 180 banner: {fileID: 0} androidGamepadSupportLevel: 0 - chromeosInputEmulation: 1 AndroidMinifyRelease: 0 AndroidMinifyDebug: 0 AndroidValidateAppBundleSize: 1 AndroidAppBundleSizeToValidate: 150 AndroidReportGooglePlayAppDependencies: 1 + androidSymbolsSizeThreshold: 800 m_BuildTargetIcons: [] - m_BuildTargetPlatformIcons: [] + m_BuildTargetPlatformIcons: + - m_BuildTarget: Android + m_Icons: + - m_Textures: [] + m_Width: 432 + m_Height: 432 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 324 + m_Height: 324 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 216 + m_Height: 216 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 162 + m_Height: 162 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 108 + m_Height: 108 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 81 + m_Height: 81 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 0 + m_SubKind: m_BuildTargetBatching: [] m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: [] @@ -315,22 +428,39 @@ PlayerSettings: iPhone: 1 tvOS: 1 m_BuildTargetGroupLightmapEncodingQuality: - - m_BuildTarget: Standalone + - serializedVersion: 2 + m_BuildTarget: Standalone m_EncodingQuality: 2 - - m_BuildTarget: Android + - serializedVersion: 2 + m_BuildTarget: Android + m_EncodingQuality: 2 + - serializedVersion: 2 + m_BuildTarget: Lumin + m_EncodingQuality: 2 + - serializedVersion: 2 + m_BuildTarget: WindowsStoreApps m_EncodingQuality: 2 - - m_BuildTarget: Lumin + - serializedVersion: 2 + m_BuildTarget: iOS m_EncodingQuality: 2 - - m_BuildTarget: Windows Store Apps + - serializedVersion: 2 + m_BuildTarget: Switch + m_EncodingQuality: 2 + - serializedVersion: 2 + m_BuildTarget: Switch2 m_EncodingQuality: 2 m_BuildTargetGroupHDRCubemapEncodingQuality: - - m_BuildTarget: Standalone + - serializedVersion: 2 + m_BuildTarget: Standalone m_EncodingQuality: 2 - - m_BuildTarget: Android + - serializedVersion: 2 + m_BuildTarget: Android m_EncodingQuality: 2 - - m_BuildTarget: Lumin + - serializedVersion: 2 + m_BuildTarget: Lumin m_EncodingQuality: 1 - - m_BuildTarget: Windows Store Apps + - serializedVersion: 2 + m_BuildTarget: WindowsStoreApps m_EncodingQuality: 2 m_BuildTargetGroupLightmapSettings: [] m_BuildTargetGroupLoadStoreDebugModeSettings: [] @@ -339,6 +469,7 @@ PlayerSettings: playModeTestRunnerEnabled: 1 runPlayModeTestAsEditModeTest: 0 actionOnDotNetUnhandledException: 1 + editorGfxJobOverride: 1 enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 @@ -346,7 +477,7 @@ PlayerSettings: locationUsageDescription: microphoneUsageDescription: bluetoothUsageDescription: - macOSTargetOSVersion: 10.13.0 + macOSTargetOSVersion: 12.0 switchNMETAOverride: switchNetLibKey: switchSocketMemoryPoolSize: 6144 @@ -354,7 +485,7 @@ PlayerSettings: switchSocketConcurrencyLimit: 14 switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 - switchUseGOLDLinker: 0 + switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 switchNSODependencies: @@ -432,7 +563,6 @@ PlayerSettings: switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 - switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 switchApplicationErrorCodeCategory: @@ -474,6 +604,7 @@ PlayerSettings: switchNativeFsCacheSize: 32 switchIsHoldTypeHorizontal: 0 switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 switchSocketConfigEnabled: 0 switchTcpInitialSendBufferSize: 32 switchTcpInitialReceiveBufferSize: 64 @@ -484,13 +615,14 @@ PlayerSettings: switchSocketBufferEfficiency: 4 switchSocketInitializeEnabled: 1 switchNetworkInterfaceManagerInitializeEnabled: 1 - switchPlayerConnectionEnabled: 1 + switchDisableHTCSPlayerConnection: 0 switchUseNewStyleFilepaths: 0 switchUseLegacyFmodPriorities: 0 switchUseMicroSleepForYield: 1 switchEnableRamDiskSupport: 0 switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 + switchUpgradedPlayerSettingsToNMETA: 1 ps4NPAgeRating: 12 ps4NPTitleSecret: ps4NPTrophyPackPath: @@ -605,6 +737,11 @@ PlayerSettings: webGLMemoryGeometricGrowthStep: 0.2 webGLMemoryGeometricGrowthCap: 96 webGLPowerPreference: 2 + webGLWebAssemblyTable: 0 + webGLWebAssemblyBigInt: 0 + webGLCloseOnQuit: 0 + webWasm2023: 0 + webEnableSubmoduleStrippingCompatibility: 0 scriptingDefineSymbols: {} additionalCompilerArguments: {} platformArchitecture: {} @@ -618,7 +755,6 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 1 useDeterministicCompilation: 1 - selectedPlatform: 0 additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 @@ -649,6 +785,7 @@ PlayerSettings: metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} metroSplashScreenUseBackgroundColor: 0 + syncCapabilities: 0 platformCapabilities: {} metroTargetDeviceFamilies: {} metroFTAName: @@ -698,9 +835,11 @@ PlayerSettings: hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 - hmiLogStartupTiming: 0 hmiCpuConfiguration: + hmiLogStartupTiming: 0 + qnxGraphicConfPath: apiCompatibilityLevel: 6 + captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 cloudProjectId: @@ -711,5 +850,11 @@ PlayerSettings: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 virtualTexturingSupportEnabled: 1 insecureHttpOption: 0 + androidVulkanDenyFilterList: [] + androidVulkanAllowFilterList: [] + androidVulkanDeviceFilterListAsset: {fileID: 0} + d3d12DeviceFilterListAsset: {fileID: 0} + allowedHttpConnections: 3 From 092b677b7c0600b8e617109cd615555f33e6cd61 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Fri, 3 Oct 2025 02:33:34 +0000 Subject: [PATCH 10/49] [Port] [6000.3] 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 309ee019c83277e05b90b3660380020243a2656f Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Fri, 3 Oct 2025 02:33:34 +0000 Subject: [PATCH 11/49] [Port] [6000.3] [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 992145cfbf1cc0e98efa3e8ed20d7a124f54192e Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Fri, 3 Oct 2025 02:33:34 +0000 Subject: [PATCH 12/49] [Port] [6000.3] [HDRP] Fixing script link in Water sample Cave scene --- .../Scenes/Scene Resources/CaveSampleDescription.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Samples~/WaterSamples/Scenes/Scene Resources/CaveSampleDescription.json b/Packages/com.unity.render-pipelines.high-definition/Samples~/WaterSamples/Scenes/Scene Resources/CaveSampleDescription.json index d4e7c8c028f..039d127107b 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Samples~/WaterSamples/Scenes/Scene Resources/CaveSampleDescription.json +++ b/Packages/com.unity.render-pipelines.high-definition/Samples~/WaterSamples/Scenes/Scene Resources/CaveSampleDescription.json @@ -19,7 +19,7 @@ You can open the Custom Pass

Custom Local Volumetric Fog

• To simulate light rays bouncing on the water surface, a Local Volumetric Fog with a custom material is used. -• This shader, simply sample the caustics texture passed by the script on the Water Surface using absolute world position node. +• This shader, simply sample the caustics texture passed by the BindTexture script on the Water Surface using absolute world position node. You can open the Local Volumetric Fog Shader Graph for more details. From 93febb9ea65d26a0e084f77eb3ec171ed1ea9b62 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Fri, 3 Oct 2025 02:33:35 +0000 Subject: [PATCH 13/49] [Port] [6000.3] 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 1f05fd686e678183295e4df97936dc016f742214 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Sat, 4 Oct 2025 01:38:48 +0000 Subject: [PATCH 14/49] [Port] [6000.3] 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 c17a5db1524b5c2e66a3ee55b9de30281d2abe33 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Sat, 4 Oct 2025 01:38:48 +0000 Subject: [PATCH 15/49] [Port] [6000.3] 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: Sat, 4 Oct 2025 01:38:48 +0000 Subject: [PATCH 16/49] [Port] [6000.3] 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 ce27bb9311a054b723eec363b19e7dd2d3d86756 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Sat, 4 Oct 2025 01:38:49 +0000 Subject: [PATCH 17/49] [Port] [6000.3] 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 4134989acb2cb25a2ada765c4c760d8bcb64e5f5 Mon Sep 17 00:00:00 2001 From: Adrien Moulin Date: Sat, 4 Oct 2025 01:38:49 +0000 Subject: [PATCH 18/49] [Backport][6.3][UUM-102113] - Fixed Render Graph pass merging with VRS --- .../Compiler/CompilerContextData.cs | 4 +- .../Compiler/NativePassCompiler.cs | 29 ++--- .../RenderGraph/Compiler/PassesData.cs | 22 ++-- .../RenderGraph/RenderGraphBuilders.cs | 18 ++-- .../Runtime/RenderGraph/RenderGraphPass.cs | 10 ++ .../NativePassCompilerRenderGraphTests.cs | 101 ++++++++++++------ 6 files changed, 120 insertions(+), 64 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/CompilerContextData.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/CompilerContextData.cs index d408644c86c..0a008a7005b 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/CompilerContextData.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/CompilerContextData.cs @@ -180,8 +180,8 @@ public bool TryAddToFragmentList(TextureAccess access, int listFirstIndex, int n } } - // Validate that we're correctly building up the fragment lists we can only append to the last list - // not int the middle of lists + // Validate that we're correctly building up the fragment lists, we can only append to the last list + // not in the middle of the other lists Debug.Assert(listFirstIndex + numItems == fragmentData.Length); fragmentData.Add(new PassFragmentData( diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs index e9d827c25be..1c8f15dfabd 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs @@ -247,16 +247,18 @@ bool TrySetupRasterFragmentList(ref PassData ctxPass, ref RenderGraphPass inputP } } - // shading rate - if (inputPass.hasShadingRateImage && - inputPass.shadingRateAccess.textureHandle.handle.IsValid()) + // shading rate image - this is a specific type of attachment (more of an image resource that can't be sampled, only used by the rasterizer) + if (inputPass.hasShadingRateImage && inputPass.shadingRateAccess.textureHandle.handle.IsValid()) { - ctxPass.shadingRateImageIndex = ctx.fragmentData.Length; - ctx.TryAddToFragmentList(inputPass.shadingRateAccess, ctxPass.shadingRateImageIndex, 0, out errorMessage); + if (ctx.TryAddToFragmentList(inputPass.shadingRateAccess, ctxPass.firstFragment, ctxPass.numFragments, out errorMessage)) + { + ctxPass.shadingRateImageIndex = ctx.fragmentData.Length - 1; + } if (errorMessage != null) { - errorMessage = $"when trying to add VRS attachment of type {inputPass.shadingRateAccess.textureHandle.handle.type} at index {inputPass.shadingRateAccess.textureHandle.handle.index} - {errorMessage}"; + errorMessage = + $"when trying to add VRS attachment of type {inputPass.shadingRateAccess.textureHandle.handle.type} at index {inputPass.shadingRateAccess.textureHandle.handle.index} - {errorMessage}"; return false; } } @@ -269,9 +271,7 @@ bool TrySetupRasterFragmentList(ref PassData ctxPass, ref RenderGraphPass inputP // Skip unused fragment input slots if (!inputPass.fragmentInputAccess[ci].textureHandle.IsValid()) continue; - var resource = inputPass.fragmentInputAccess[ci].textureHandle; - if (ctx.TryAddToFragmentList(inputPass.fragmentInputAccess[ci], ctxPass.firstFragmentInput, - ctxPass.numFragmentInputs, out errorMessage)) + if (ctx.TryAddToFragmentList(inputPass.fragmentInputAccess[ci], ctxPass.firstFragmentInput, ctxPass.numFragmentInputs, out errorMessage)) { ctxPass.TryAddFragmentInput(inputPass.fragmentInputAccess[ci].textureHandle.handle, ctx, out errorMessage); } @@ -294,8 +294,7 @@ bool TrySetupRasterFragmentList(ref PassData ctxPass, ref RenderGraphPass inputP // Skip unused random write slots if (!uav.h.IsValid()) continue; - if (ctx.TryAddToRandomAccessResourceList(uav.h, ci, uav.preserveCounterValue, - ctxPass.firstRandomAccessResource, ctxPass.numRandomAccessResources, out errorMessage)) + if (ctx.TryAddToRandomAccessResourceList(uav.h, ci, uav.preserveCounterValue, ctxPass.firstRandomAccessResource, ctxPass.numRandomAccessResources, out errorMessage)) { ctxPass.AddRandomAccessResource(); } @@ -465,8 +464,12 @@ void CullUnusedRenderPasses() // Flow upstream from this node foreach (ref readonly var input in passData.Inputs(ctx)) { - int inputPassIndex = ctx.resources[input.resource].writePassId; - toVisitPassIds.Push(inputPassIndex); + ref var inputVersionedDataRes = ref ctx.resources[input.resource]; + + if (inputVersionedDataRes.written) + { + toVisitPassIds.Push(inputVersionedDataRes.writePassId); + } } // We need this node, don't cull it 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 7859f019546..358738d6609 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 @@ -262,14 +262,17 @@ public readonly ReadOnlySpan Outputs(CompilerContextData ctx) public readonly ReadOnlySpan Inputs(CompilerContextData ctx) => ctx.inputData.MakeReadOnlySpan(firstInput, numInputs); + // RenderAttachments - MRT colors and depth [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly ReadOnlySpan Fragments(CompilerContextData ctx) => ctx.fragmentData.MakeReadOnlySpan(firstFragment, numFragments); + // ShadingRateImageAttachment [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly PassFragmentData ShadingRateImage(CompilerContextData ctx) => ctx.fragmentData[shadingRateImageIndex]; + // RenderInputAttachments [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly ReadOnlySpan FragmentInputs(CompilerContextData ctx) => ctx.fragmentData.MakeReadOnlySpan(firstFragmentInput, numFragmentInputs); @@ -881,11 +884,15 @@ public static PassBreakAudit CanMerge(CompilerContextData contextData, int activ foreach (ref readonly var input in passToMerge.Inputs(contextData)) { var inputResource = input.resource; - var writingPassId = contextData.resources[inputResource].writePassId; - // Is the writing pass enclosed in the current native renderpass - if (writingPassId >= nativePass.firstGraphPass && writingPassId < nativePass.lastGraphPass + 1) + + ref readonly var inputDataVersioned = ref contextData.VersionedResourceData(inputResource); + + bool isWrittenInCurrNativePass = inputDataVersioned.written && (inputDataVersioned.writePassId >= nativePass.firstGraphPass && inputDataVersioned.writePassId < nativePass.lastGraphPass + 1); + + if (isWrittenInCurrNativePass) { - // If it's not used as a fragment, it's used as some sort of texture read of load so we need so sync it out + // If it's not used as a fragment, it's used as some sort of texture read or load so we need to break the current native render pass + // as we can't sample and write to it in the same native render pass if (!passToMerge.IsUsedAsFragment(inputResource, contextData)) { return new PassBreakAudit(PassBreakReason.NextPassReadsTexture, passIdToMerge); @@ -893,7 +900,6 @@ public static PassBreakAudit CanMerge(CompilerContextData contextData, int activ } } - // Gather which attachments to add to the current renderpass var attachmentsToTryAdding = new FixedAttachmentArray(); @@ -929,7 +935,7 @@ public static PassBreakAudit CanMerge(CompilerContextData contextData, int activ } } - // Check if this fragment is already sampled in the native renderpass not as a fragment but as an input + // Check if this fragment is already sampled in the native renderpass as a standard texture for (int i = nativePass.firstGraphPass; i <= nativePass.lastGraphPass; ++i) { ref var earlierPassData = ref contextData.passData.ElementAt(i); @@ -948,7 +954,6 @@ public static PassBreakAudit CanMerge(CompilerContextData contextData, int activ } } - foreach (ref readonly var fragmentInput in passToMerge.FragmentInputs(contextData)) { bool alreadyAttached = false; @@ -1283,7 +1288,8 @@ void AddDepthAttachmentFirstDuringMerge(CompilerContextData contextData, in Pass } } - // We also need to update the shading rate image index (VRS) + // We also need to update the shading rate image SRI index (used for VRS) + // This is unlikely to happen because the SRI is always added last, after color and input attachments if (hasShadingRateImage && shadingRateImageIndex == 0) { shadingRateImageIndex = prevDepthIdx; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphBuilders.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphBuilders.cs index de45306a944..f34f8a29503 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphBuilders.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphBuilders.cs @@ -493,6 +493,13 @@ public TextureHandle SetRandomAccessAttachment(TextureHandle input, int index, A return input; } + public void SetShadingRateImageAttachment(in TextureHandle tex) + { + CheckNotUseFragment(tex); + var versionedTextureHandle = new TextureHandle(UseResource(tex.handle, AccessFlags.Read)); + m_RenderPass.SetShadingRateImageRaw(versionedTextureHandle); + } + public BufferHandle UseBufferRandomAccess(BufferHandle input, int index, AccessFlags flags = AccessFlags.Read) { var h = UseBuffer(input, flags); @@ -588,17 +595,6 @@ void CheckFrameBufferFetchEmulationIsSupported(in TextureHandle tex) } } - public void SetShadingRateImageAttachment(in TextureHandle sriTextureHandle) - { - CheckNotUseFragment(sriTextureHandle); - - // shading rate image access flag is always read, only 1 mip and 1 slice - var newSriTextureHandle = new TextureHandle(); - newSriTextureHandle.handle = UseResource(sriTextureHandle.handle, AccessFlags.Read); - - m_RenderPass.SetShadingRateImage(newSriTextureHandle, AccessFlags.Read, 0, 0); - } - public void SetShadingRateFragmentSize(ShadingRateFragmentSize shadingRateFragmentSize) { m_RenderPass.SetShadingRateFragmentSize(shadingRateFragmentSize); 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 8643987c676..e92dea42a27 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphPass.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphPass.cs @@ -553,6 +553,16 @@ public void ComputeHash(ref HashFNV1A32 generator, RenderGraphResourceRegistry r generator.Append(GetRenderFuncHash()); } + public void SetShadingRateImageRaw(in TextureHandle shadingRateImage) + { + if (ShadingRateInfo.supportsPerImageTile) + { + hasShadingRateImage = true; + // shading rate image access flag is always read, only 1 mip and 1 slice + shadingRateAccess = new TextureAccess(shadingRateImage, AccessFlags.Read, 0, 0); + } + } + public void SetShadingRateImage(in TextureHandle shadingRateImage, AccessFlags accessFlags, int mipLevel, int depthSlice) { if (ShadingRateInfo.supportsPerImageTile) 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 6fb2d3b6ab9..c23458c0215 100644 --- a/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs @@ -48,7 +48,7 @@ TestRenderTargets ImportAndCreateRenderTargets(RenderGraph g) var extraDepthBufferHandle = RTHandles.Alloc(depthBuffer, "Extra Depth Buffer"); var extraDepthBufferBottomLeftHandle = RTHandles.Alloc(depthBuffer, "Extra Depth Buffer Bottom Left"); var extraTextureTopLeftHandle = RTHandles.Alloc(backBuffer, "ExtraTextureTopLeft"); - var extraTextureBottomLeftHandle = RTHandles.Alloc(backBuffer,"ExtraTextureBottomLeft"); + var extraTextureBottomLeftHandle = RTHandles.Alloc(backBuffer, "ExtraTextureBottomLeft"); ImportResourceParams importParams = new ImportResourceParams(); importParams.textureUVOrigin = TextureUVOrigin.TopLeft; @@ -1629,57 +1629,98 @@ public void UpdateSubpassAttachmentIndices_WhenDepthAttachmentIsAdded() Assert.IsTrue(subPassDesc3.inputs[0] == 3); } -/* //VRS bug. It seems that there is a bug with VRS forcing pass breaking between passes using the same shading rate image where it shouldn't: UUM-102113. [Test] - public void UpdateShadingRateImageIndex_WhenDepthAttachmentIsAdded() + public void MergePasses_WhenSameShadingRateImage() { var g = AllocateRenderGraph(); - var buffers = ImportAndCreateBuffers(g); + var renderTargets = ImportAndCreateRenderTargets(g); - using (var builder = g.AddRasterRenderPass("NoDepth_Subpass0", out var passData)) + using (var builder = g.AddRasterRenderPass("Pass0", out var passData)) { - builder.SetShadingRateImageAttachment(buffers.extraTextures[0]); - builder.SetRenderAttachment(buffers.extraTextures[1], 0); + builder.SetRenderAttachment(renderTargets.extraTextures[1], 0); + builder.SetShadingRateImageAttachment(renderTargets.extraTextures[0]); builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); builder.AllowPassCulling(false); } - // Render Pass - // attachments: [extraTextures[0], extraTextures[1]] - // shading rate image : [0] - // subpass 0: color outputs : [1] - - using (var builder = g.AddRasterRenderPass("Depth_Subpass1", out var passData)) + // Same attachments, we should merge in the same subpass as Pass0's one + using (var builder = g.AddRasterRenderPass("Pass1", out var passData)) { - builder.SetShadingRateImageAttachment(buffers.extraTextures[0]); - builder.SetRenderAttachmentDepth(buffers.depthBuffer, AccessFlags.Write); - builder.SetRenderAttachment(buffers.extraTextures[2], 0); + builder.SetRenderAttachment(renderTargets.extraTextures[1], 0); + builder.SetShadingRateImageAttachment(renderTargets.extraTextures[0]); builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); builder.AllowPassCulling(false); } - // Render Pass - // attachments: [depthBuffer, extraTextures[1], extraTextures[0], extraTextures[2]] - // shading rate image : [0 -> 2] - // subpass 0: color outputs : [1] - // subpass 1: color outputs : [3] + // Same shading rate image but different render attachments, we should stay in the same native render pass but in a different subpass + using (var builder = g.AddRasterRenderPass("Pass2", out var passData)) + { + builder.SetRenderAttachment(renderTargets.extraTextures[2], 0); + builder.SetShadingRateImageAttachment(renderTargets.extraTextures[0]); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } var result = g.CompileNativeRenderGraph(g.ComputeGraphHash()); var passes = result.contextData.GetNativePasses(); // All graph passes are merged in the same render pass - Assert.IsTrue(passes != null && passes.Count == 1 && passes[0].numGraphPasses == 2 && passes[0].numNativeSubPasses == 2); + Assert.IsTrue(passes != null && passes.Count == 1 && passes[0].numGraphPasses == 3 && passes[0].numNativeSubPasses == 2); - // Depth is the first attachment - Assert.IsTrue(passes[0].attachments[0].handle.index == buffers.depthBuffer.handle.index); - Assert.IsTrue(passes[0].attachments[1].handle.index == buffers.extraTextures[1].handle.index); - Assert.IsTrue(passes[0].attachments[2].handle.index == buffers.extraTextures[0].handle.index); - Assert.IsTrue(passes[0].attachments[3].handle.index == buffers.extraTextures[2].handle.index); + // If no SRI support, we just discard the API call + if (ShadingRateInfo.supportsPerImageTile) + { + var shadingRateImageAttachmentIndex = passes[0].shadingRateImageIndex; + Assert.IsTrue(shadingRateImageAttachmentIndex == 1); // always after color and depth attachments + Assert.IsTrue(passes[0].attachments[shadingRateImageAttachmentIndex].handle.index == renderTargets.extraTextures[0].handle.index); + } + } + + [Test] + public void BreakPasses_WhenNoOrDifferentShadingRateImage() + { + var g = AllocateRenderGraph(); + var renderTargets = ImportAndCreateRenderTargets(g); + + using (var builder = g.AddRasterRenderPass("Pass0", out var passData)) + { + builder.SetRenderAttachment(renderTargets.extraTextures[1], 0); + builder.SetShadingRateImageAttachment(renderTargets.extraTextures[0]); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + // Different SRI, we should break into a new native render pass + using (var builder = g.AddRasterRenderPass("Pass1", out var passData)) + { + builder.SetRenderAttachment(renderTargets.extraTextures[1], 0); + builder.SetShadingRateImageAttachment(renderTargets.extraTextures[2]); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + // No SRI, we should break into a new native render pass + using (var builder = g.AddRasterRenderPass("Pass2", out var passData)) + { + builder.SetRenderAttachment(renderTargets.extraTextures[1], 0); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + var result = g.CompileNativeRenderGraph(g.ComputeGraphHash()); + var passes = result.contextData.GetNativePasses(); - // Check Shading Rate Image index is correctly updated - Assert.IsTrue(passes[0].shadingRateImageIndex == buffers.extraTextures[0].handle.index); + if (ShadingRateInfo.supportsPerImageTile) + { + // All graph passes are in different native render passes + Assert.IsTrue(passes != null && passes.Count == 3); + } + else + { + // If no SRI support, we just discard the API call, all graph passes are merged together + Assert.IsTrue(passes != null && passes.Count == 1); + } } -*/ // Test using a texture as both a texture and render attachment, one will require topleft and one bottom left so this should throw. [Test] From c265c457ac7bdcf620deea02e1b8f9084f110010 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Sat, 4 Oct 2025 01:38:49 +0000 Subject: [PATCH 19/49] [Port] [6000.3] 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 21c09d4af46ae3f8f6ff6a6621df412b50cfedeb Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Sat, 4 Oct 2025 01:38:49 +0000 Subject: [PATCH 20/49] [Port] [6000.3] 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 8d21b638da42b7f0a7bcb2d491ef211c7071119d Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Mon, 6 Oct 2025 16:21:00 +0000 Subject: [PATCH 21/49] [Port] [6000.3] Don't do packing as part of input extraction for APV --- .../Editor/Lighting/ProbeVolume/ProbeGIBaking.LightTransport.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.LightTransport.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.LightTransport.cs index 207d96af906..8a67dd9219e 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.LightTransport.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeGIBaking.LightTransport.cs @@ -94,7 +94,7 @@ class DefaultLightTransport : LightingBaker public override void Initialize(bool bakeProbeOcclusion, NativeArray probePositions) { - if (!InputExtraction.ExtractFromScene(out input)) + if (!InputExtraction.ExtractFromScene(out input, true)) { Debug.LogError("InputExtraction.ExtractFromScene failed."); return; From 4b166ba6b176974d0034183c4f96b98f5620b9be Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Mon, 6 Oct 2025 16:21:01 +0000 Subject: [PATCH 22/49] [Port] [6000.3] 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 c23458c0215..460f2b34357 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 b0ce6cc946ac46c236fc6b9da1614cb96ba9bff9 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Tue, 7 Oct 2025 04:39:05 +0000 Subject: [PATCH 23/49] [Port] [6000.3] Fix blitter error when passing a default texture (Black texture) --- .../Runtime/Utilities/Blitter.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 a4f968a48dd..5962100a8b0 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blitter.cs @@ -514,8 +514,9 @@ public static void BlitTexture(RasterCommandBuffer cmd, RTHandle source, Vector4 /// public static void BlitTexture(CommandBuffer cmd, RTHandle source, Vector4 scaleBias, float mipLevel, bool bilinear) { + var dimension = (source.rt != null) ? source.rt.dimension : TextureXR.dimension; s_PropertyBlock.SetFloat(BlitShaderIDs._BlitMipLevel, mipLevel); - BlitTexture(cmd, source, scaleBias, GetBlitMaterial(source.rt.dimension), s_BlitShaderPassIndicesMap[bilinear ? 1 : 0]); + BlitTexture(cmd, source, scaleBias, GetBlitMaterial(dimension), s_BlitShaderPassIndicesMap[bilinear ? 1 : 0]); } /// From d2585fff61907c4181ce621dc0df0320cf3da016 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Tue, 7 Oct 2025 04:39:05 +0000 Subject: [PATCH 24/49] [Port] [6000.3] Fixed broken links --- .../Documentation~/default-bitmap-text-node.md | 2 +- .../Documentation~/default-solid-node.md | 4 ++-- .../Documentation~/default-texture-node.md | 2 +- .../Documentation~/element-texture-uv-node.md | 2 +- 4 files changed, 5 insertions(+), 5 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-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 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 32caf5707355f617ada3559f20c05d97639722f1 Mon Sep 17 00:00:00 2001 From: Rose Hirigoyen Date: Wed, 8 Oct 2025 02:22:12 +0000 Subject: [PATCH 25/49] [Port 6000.3] 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 26cf231ec2b10f5914b7b0fedf8cb2a98125b7d9 Mon Sep 17 00:00:00 2001 From: Jonathan Brodsky Date: Wed, 8 Oct 2025 02:22:13 +0000 Subject: [PATCH 26/49] Backport: Fix shadergraph URP terrain subtarget when "material override" is checked --- .../Targets/UniversalTerrainLitSubTarget.cs | 98 +- .../TerrainLitMaterialOverride.shadergraph | 1192 +++++++++++++++++ ...errainLitMaterialOverride.shadergraph.meta | 18 + .../246_ShaderGraph_MaterialOverride.meta | 8 + .../246_ShaderGraph_MaterialOverride.unity | 520 +++++++ ...46_ShaderGraph_MaterialOverride.unity.meta | 7 + .../MaterialOverrideTerrain.asset | Bin 0 -> 820884 bytes .../MaterialOverrideTerrain.asset.meta | 8 + .../ProjectSettings/EditorBuildSettings.asset | 7 +- 9 files changed, 1807 insertions(+), 51 deletions(-) create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/Shaders/TerrainLitMaterialOverride.shadergraph create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/Shaders/TerrainLitMaterialOverride.shadergraph.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.unity create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.unity.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride/MaterialOverrideTerrain.asset create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride/MaterialOverrideTerrain.asset.meta diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTerrainLitSubTarget.cs b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTerrainLitSubTarget.cs index 7a2522eb4ca..81cb6c44c5a 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTerrainLitSubTarget.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets/UniversalTerrainLitSubTarget.cs @@ -63,34 +63,21 @@ public override void Setup(ref TargetSetupContext context) if (!context.HasCustomEditorForRenderPipeline(universalRPType)) context.AddCustomEditorForRenderPipeline(typeof(ShaderGraphTerrainLitGUI).FullName, universalRPType); - context.AddSubShader(PostProcessSubShader(TerrainSubShaders.LitComputeDotsSubShader(target, target.renderType, target.renderQueue, blendModePreserveSpecular))); - context.AddSubShader(PostProcessSubShader(TerrainSubShaders.LitGLESSubShader(target, target.renderType, target.renderQueue, blendModePreserveSpecular))); + // terrain shaders are always opaque, so these values are hardcoded to not inherit from the Universal Target + var renderTypeOpaque = RenderType.Opaque.ToString(); + var renderQueue = target.alphaClip?RenderQueue.AlphaTest.ToString():RenderQueue.Geometry.ToString(); - context.AddSubShader(PostProcessSubShader(TerrainLitAddSubShaders.LitComputeDotsSubShader(target, target.renderType, target.renderQueue, blendModePreserveSpecular))); - context.AddSubShader(PostProcessSubShader(TerrainLitAddSubShaders.LitGLESSubShader(target, target.renderType, target.renderQueue, blendModePreserveSpecular))); + context.AddSubShader(PostProcessSubShader(TerrainSubShaders.LitComputeDotsSubShader(target, renderTypeOpaque, renderQueue, blendModePreserveSpecular))); + context.AddSubShader(PostProcessSubShader(TerrainSubShaders.LitGLESSubShader(target, renderTypeOpaque, renderQueue, blendModePreserveSpecular))); - context.AddSubShader(PostProcessSubShader(TerrainLitBaseMapGenSubShaders.GenerateBaseMap(target, target.renderType, target.renderQueue, blendModePreserveSpecular))); + context.AddSubShader(PostProcessSubShader(TerrainLitAddSubShaders.LitComputeDotsSubShader(target, renderTypeOpaque, renderQueue, blendModePreserveSpecular))); + context.AddSubShader(PostProcessSubShader(TerrainLitAddSubShaders.LitGLESSubShader(target, renderTypeOpaque, renderQueue, blendModePreserveSpecular))); + + context.AddSubShader(PostProcessSubShader(TerrainLitBaseMapGenSubShaders.GenerateBaseMap(target, renderTypeOpaque, renderQueue, blendModePreserveSpecular))); } public override void ProcessPreviewMaterial(Material material) { - if (target.allowMaterialOverride) - { - // copy our target's default settings into the material - // (technically not necessary since we are always recreating the material from the shader each time, - // which will pull over the defaults from the shader definition) - // but if that ever changes, this will ensure the defaults are set - material.SetFloat(Property.SpecularWorkflowMode, 1.0f); - material.SetFloat(Property.CastShadows, target.castShadows ? 1.0f : 0.0f); - material.SetFloat(Property.ReceiveShadows, target.receiveShadows ? 1.0f : 0.0f); - material.SetFloat(Property.SurfaceType, 0.0f); - material.SetFloat(Property.BlendMode, (float)target.alphaMode); - material.SetFloat(Property.AlphaClip, target.alphaClip ? 1.0f : 0.0f); - material.SetFloat(Property.CullMode, 2.0f); - material.SetFloat(Property.ZWriteControl, (float)target.zWriteControl); - material.SetFloat(Property.ZTest, (float)target.zTestMode); - } - // We always need these properties regardless of whether the material is allowed to override // Queue control & offset enable correct automatic render queue behavior // Control == 0 is automatic, 1 is user-specified render queue @@ -348,19 +335,6 @@ public override void CollectShaderProperties(PropertyCollector collector, Genera public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action registerUndo) { - var universalTarget = (target as UniversalTarget); - universalTarget.AddDefaultMaterialOverrideGUI(ref context, onChange, registerUndo); - - context.AddProperty("Blending Mode", new EnumField(AlphaMode.Alpha) { value = target.alphaMode }, target.surfaceType == SurfaceType.Transparent, (evt) => - { - if (Equals(target.alphaMode, evt.newValue)) - return; - - registerUndo("Change Blend"); - target.alphaMode = (AlphaMode)evt.newValue; - onChange(); - }); - context.AddProperty("Depth Write", new EnumField(ZWriteControl.Auto) { value = target.zWriteControl }, (evt) => { if (Equals(target.zWriteControl, evt.newValue)) @@ -841,14 +815,33 @@ private static InstancingOptions[] InstancingOptionList() } #endregion + private static RenderStateCollection GetTerrainRenderState(UniversalTarget target) + { + var result = new RenderStateCollection + { + RenderState.ZTest(target.zTestMode.ToString()), + RenderState.Cull(Cull.Back), + RenderState.Blend(Blend.One, Blend.Zero) + }; + switch (target.zWriteControl) + { + case ZWriteControl.Auto: + case ZWriteControl.ForceEnabled: + result.Add(RenderState.ZWrite(ZWrite.On)); + break; + default: + result.Add(RenderState.ZWrite(ZWrite.Off)); + break; + } + return result; + } + #region Passes internal static class TerrainLitPasses { - public static void AddReceiveShadowsControlToPass(ref PassDescriptor pass, UniversalTarget target, bool receiveShadows) + private static void AddReceiveShadowsControlToPass(ref PassDescriptor pass, UniversalTarget target, bool receiveShadows) { - if (target.allowMaterialOverride) - pass.keywords.Add(TerrainLitKeywords.ReceiveShadowsOff); - else if (!receiveShadows) + if (!receiveShadows) pass.defines.Add(TerrainLitKeywords.ReceiveShadowsOff, 1); } @@ -876,7 +869,7 @@ public static PassDescriptor Forward(UniversalTarget target, bool blendModePrese fieldDependencies = CoreFieldDependencies.Default, // Conditional State - renderStates = CoreRenderStates.UberSwitchedRenderState(target, blendModePreserveSpecular), + renderStates = GetTerrainRenderState(target), pragmas = pragmas ?? TerrainCorePragmas.Forward, defines = new DefineCollection() { CoreDefines.UseFragmentFog, }, keywords = new KeywordCollection() { TerrainLitKeywords.Forward }, @@ -895,7 +888,7 @@ public static PassDescriptor Forward(UniversalTarget target, bool blendModePrese result.defines.Add(TerrainDefines.SmoothnessTextureAlbedoChannelA, 1); result.defines.Add(TerrainDefines.TerrainAlphaClipEnable, target.alphaClip?1:0); - CorePasses.AddTargetSurfaceControlsToPass(ref result, target, blendModePreserveSpecular); + CorePasses.AddAlphaClipControlToPass(ref result, target); AddReceiveShadowsControlToPass(ref result, target, target.receiveShadows); return result; @@ -925,7 +918,7 @@ public static PassDescriptor GBuffer(UniversalTarget target, bool blendModePrese fieldDependencies = CoreFieldDependencies.Default, // Conditional State - renderStates = CoreRenderStates.UberSwitchedRenderState(target, blendModePreserveSpecular), + renderStates = GetTerrainRenderState(target), pragmas = TerrainCorePragmas.DOTSGBuffer, defines = new DefineCollection() { CoreDefines.UseFragmentFog }, keywords = new KeywordCollection() { TerrainLitKeywords.GBuffer }, @@ -945,7 +938,7 @@ public static PassDescriptor GBuffer(UniversalTarget target, bool blendModePrese result.defines.Add(TerrainDefines.SmoothnessTextureAlbedoChannelA, 1); result.defines.Add(TerrainDefines.TerrainAlphaClipEnable, target.alphaClip?1:0); - CorePasses.AddTargetSurfaceControlsToPass(ref result, target, blendModePreserveSpecular); + CorePasses.AddAlphaClipControlToPass(ref result, target); AddReceiveShadowsControlToPass(ref result, target, target.receiveShadows); return result; @@ -987,8 +980,8 @@ public static PassDescriptor ShadowCaster(UniversalTarget target) result.defines.Add(TerrainDefines.TerrainEnabled, 1); result.defines.Add(TerrainDefines.TerrainAlphaClipEnable, target.alphaClip?1:0); - // CorePasses.AddTargetSurfaceControlsToPass(ref result, target, blendModePreserveSpecular); - CorePasses.AddAlphaClipControlToPass(ref result, target); + if (target.alphaClip) + result.defines.Add(CoreKeywordDescriptors.AlphaTestOn, 1); return result; } @@ -1030,7 +1023,8 @@ public static PassDescriptor DepthOnly(UniversalTarget target) result.defines.Add(TerrainDefines.TerrainEnabled, 1); result.defines.Add(TerrainDefines.TerrainAlphaClipEnable, target.alphaClip?1:0); - CorePasses.AddAlphaClipControlToPass(ref result, target); + if (target.alphaClip) + result.defines.Add(CoreKeywordDescriptors.AlphaTestOn, 1); return result; } @@ -1076,7 +1070,8 @@ public static PassDescriptor DepthNormal(UniversalTarget target) result.keywords.Add(TerrainDefines.TerrainNormalmap); result.keywords.Add(TerrainDefines.TerrainInstancedPerPixelNormal); - CorePasses.AddAlphaClipControlToPass(ref result, target); + if (target.alphaClip) + result.defines.Add(CoreKeywordDescriptors.AlphaTestOn, 1); return result; } @@ -1121,7 +1116,8 @@ public static PassDescriptor Meta(UniversalTarget target) result.defines.Add(TerrainDefines.SmoothnessTextureAlbedoChannelA, 1); result.defines.Add(TerrainDefines.TerrainAlphaClipEnable, target.alphaClip?1:0); - CorePasses.AddAlphaClipControlToPass(ref result, target); + if (target.alphaClip) + result.defines.Add(CoreKeywordDescriptors.AlphaTestOn, 1); return result; } @@ -1163,7 +1159,8 @@ public static PassDescriptor SceneSelection(UniversalTarget target) result.defines.Add(TerrainDefines.TerrainEnabled, 1); result.defines.Add(TerrainDefines.TerrainAlphaClipEnable, target.alphaClip?1:0); - CorePasses.AddAlphaClipControlToPass(ref result, target); + if (target.alphaClip) + result.defines.Add(CoreKeywordDescriptors.AlphaTestOn, 1); return result; } @@ -1205,7 +1202,8 @@ public static PassDescriptor ScenePicking(UniversalTarget target) result.defines.Add(TerrainDefines.TerrainEnabled, 1); result.defines.Add(TerrainDefines.TerrainAlphaClipEnable, target.alphaClip?1:0); - CorePasses.AddAlphaClipControlToPass(ref result, target); + if (target.alphaClip) + result.defines.Add(CoreKeywordDescriptors.AlphaTestOn, 1); return result; } diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/Shaders/TerrainLitMaterialOverride.shadergraph b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/Shaders/TerrainLitMaterialOverride.shadergraph new file mode 100644 index 00000000000..19beb27a3fd --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/Shaders/TerrainLitMaterialOverride.shadergraph @@ -0,0 +1,1192 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "bfee9f17837444338be4409a63d92850", + "m_Properties": [ + { + "m_Id": "7d826235a3194e89b5f660b2a5d3fd80" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "45203e708f8d47d8963c602742b8d233" + } + ], + "m_Nodes": [ + { + "m_Id": "b931f5e8c8614b9cbb721e9fd0bf9bde" + }, + { + "m_Id": "35ba3ee72a0d4b8a8d7eb72775f92f19" + }, + { + "m_Id": "a87340b1d90e4f449ab0f0982272542c" + }, + { + "m_Id": "271b0666c8fd4477a915edee88db0336" + }, + { + "m_Id": "24f1f07ad27a49f0ad9eebd6845f5539" + }, + { + "m_Id": "be117a478094473798e75ff209db7f8c" + }, + { + "m_Id": "82fef09c9b194583b540ef430e36f56b" + }, + { + "m_Id": "f7ff196828e3430b8e79a7fd19a89ddc" + }, + { + "m_Id": "bb58c473107b48db8a86473e0ea0c058" + }, + { + "m_Id": "1b97db68b75840ed994b71e5cf59730a" + }, + { + "m_Id": "e26b1150028d4e4996bdec99e23f05fc" + }, + { + "m_Id": "9d5b4f4dcfa44fe6a0dac5548b01f148" + }, + { + "m_Id": "3500512bfca04587a3ae337ff76eab6a" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [ + { + "m_Id": "cd6e49bdcf1b42028dc938d6f6fc3f3e" + } + ], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1b97db68b75840ed994b71e5cf59730a" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "35ba3ee72a0d4b8a8d7eb72775f92f19" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bb58c473107b48db8a86473e0ea0c058" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "1b97db68b75840ed994b71e5cf59730a" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bb58c473107b48db8a86473e0ea0c058" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f7ff196828e3430b8e79a7fd19a89ddc" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e26b1150028d4e4996bdec99e23f05fc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "1b97db68b75840ed994b71e5cf59730a" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": -311.3333740234375, + "y": 27.333332061767579 + }, + "m_Blocks": [ + { + "m_Id": "b931f5e8c8614b9cbb721e9fd0bf9bde" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": -311.3333740234375, + "y": 227.3333282470703 + }, + "m_Blocks": [ + { + "m_Id": "35ba3ee72a0d4b8a8d7eb72775f92f19" + }, + { + "m_Id": "a87340b1d90e4f449ab0f0982272542c" + }, + { + "m_Id": "271b0666c8fd4477a915edee88db0336" + }, + { + "m_Id": "24f1f07ad27a49f0ad9eebd6845f5539" + }, + { + "m_Id": "be117a478094473798e75ff209db7f8c" + }, + { + "m_Id": "82fef09c9b194583b540ef430e36f56b" + }, + { + "m_Id": "f7ff196828e3430b8e79a7fd19a89ddc" + }, + { + "m_Id": "9d5b4f4dcfa44fe6a0dac5548b01f148" + }, + { + "m_Id": "3500512bfca04587a3ae337ff76eab6a" + } + ] + }, + "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": "c32160d65e8f422d868714379c02d406" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "00e62ef62c8c48a49cb246047acf8994", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "11de58f33af64264a418496b658fe761", + "m_Id": 0, + "m_DisplayName": "Metallic", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Metallic", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "144ab9ba7eae47c0a1f4e70bd31b8af7", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "15bcca59442b4228b8e4997fcf3b8254", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "1b97db68b75840ed994b71e5cf59730a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -595.3333129882813, + "y": 227.3333282470703, + "width": 133.33331298828126, + "height": 119.99998474121094 + } + }, + "m_Slots": [ + { + "m_Id": "5fdc71e6f08c4f80a87e5cb1e5762c5e" + }, + { + "m_Id": "144ab9ba7eae47c0a1f4e70bd31b8af7" + }, + { + "m_Id": "6e2adff538c145edb0f5e491451f52ab" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "20ecce2b73ee4d99907322a3319912c4", + "m_Id": 0, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "24f1f07ad27a49f0ad9eebd6845f5539", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Emission", + "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": "30dcbfeb128e47c0a35c6b36d9e02432" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Emission" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "271b0666c8fd4477a915edee88db0336", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Smoothness", + "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": "9d2a884e87d64ab29ef6c93ad4a1c3c8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Smoothness" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "30dcbfeb128e47c0a35c6b36d9e02432", + "m_Id": 0, + "m_DisplayName": "Emission", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Emission", + "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_ColorMode": 1, + "m_DefaultColor": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "3500512bfca04587a3ae337ff76eab6a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Specular", + "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": "719d4becbe9c4545b2fc649f2ce874f3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Specular" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "35ba3ee72a0d4b8a8d7eb72775f92f19", + "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": "56af79d9c8c445b9bd69c6cfbd1508d4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "45203e708f8d47d8963c602742b8d233", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "7d826235a3194e89b5f660b2a5d3fd80" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "4d785302e096414e8f11bce204ee6608", + "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.Vector1MaterialSlot", + "m_ObjectId": "4da2a3a37b4c457daa8e711bec78e988", + "m_Id": 0, + "m_DisplayName": "Ambient Occlusion", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Occlusion", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "56af79d9c8c445b9bd69c6cfbd1508d4", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.7924528121948242, + "y": 0.23673897981643678, + "z": 0.23673897981643678 + }, + "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.DynamicValueMaterialSlot", + "m_ObjectId": "5fdc71e6f08c4f80a87e5cb1e5762c5e", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "6e2adff538c145edb0f5e491451f52ab", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "719d4becbe9c4545b2fc649f2ce874f3", + "m_Id": 0, + "m_DisplayName": "Specular Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Specular", + "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": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "7d826235a3194e89b5f660b2a5d3fd80", + "m_Guid": { + "m_GuidSerialized": "4486baf8-9db0-4125-abc6-71373725a3c2" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "Color", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "Color", + "m_DefaultReferenceName": "_Color", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": { + "r": 0.6226415038108826, + "g": 0.2486649453639984, + "b": 0.3273056149482727, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "82fef09c9b194583b540ef430e36f56b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Metallic", + "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": "11de58f33af64264a418496b658fe761" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Metallic" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "8629630daeb54d4dbe572a3c581ef97b", + "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": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTerrainLitSubTarget", + "m_ObjectId": "88209d3aa9374b9c982f8fcc18250253", + "m_EnableInstancedPerPixelNormal": true, + "m_NormalDropOffSpace": 0, + "m_BlendModePreserveSpecular": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9d2a884e87d64ab29ef6c93ad4a1c3c8", + "m_Id": 0, + "m_DisplayName": "Smoothness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Smoothness", + "m_StageCapability": 2, + "m_Value": 0.5, + "m_DefaultValue": 0.5, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "9d5b4f4dcfa44fe6a0dac5548b01f148", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.AlphaClipThreshold", + "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": "da2423c4952a4699989a050d57d48f2f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.AlphaClipThreshold" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "a87340b1d90e4f449ab0f0982272542c", + "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": "4d785302e096414e8f11bce204ee6608" + } + ], + "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": "b2e3bdea75e24051a7a34ad994216b4c", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.2300000190734864, + "m_DefaultValue": 1.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "b931f5e8c8614b9cbb721e9fd0bf9bde", + "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": "8629630daeb54d4dbe572a3c581ef97b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.GradientNoiseNode", + "m_ObjectId": "bb58c473107b48db8a86473e0ea0c058", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Gradient Noise", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -882.0, + "y": 308.0, + "width": 209.33331298828126, + "height": 339.3333740234375 + } + }, + "m_Slots": [ + { + "m_Id": "15bcca59442b4228b8e4997fcf3b8254" + }, + { + "m_Id": "cfc59494c4a74f37a2e55fcfb39fd2ca" + }, + { + "m_Id": "00e62ef62c8c48a49cb246047acf8994" + } + ], + "synonyms": [ + "perlin noise" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_HashType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "be117a478094473798e75ff209db7f8c", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Occlusion", + "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": "4da2a3a37b4c457daa8e711bec78e988" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Occlusion" +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "c32160d65e8f422d868714379c02d406", + "m_Datas": [], + "m_ActiveSubTarget": { + "m_Id": "88209d3aa9374b9c982f8fcc18250253" + }, + "m_AllowMaterialOverride": true, + "m_SurfaceType": 1, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 0, + "m_RenderFace": 1, + "m_AlphaClip": true, + "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.StickyNoteData", + "m_ObjectId": "cd6e49bdcf1b42028dc938d6f6fc3f3e", + "m_Title": "Note to testers", + "m_Content": "This graph tests the response of the terrain lit subtarget to \"material override\" - the setting doesn't show up unless you switch the subtarget type to a normal Lit material .\n\nChanging to a lit material will have the \"material override\" and \"surface type: transparent\" set. In the test we are doing here, we should continue rendering even with these values set.\n\nthese values are stored in the baseclass, and were affecting code being called from the baseclass\n", + "m_TextSize": 0, + "m_Theme": 0, + "m_Position": { + "serializedVersion": "2", + "x": -825.3333129882813, + "y": -110.0, + "width": 274.0, + "height": 406.0 + }, + "m_Group": { + "m_Id": "" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "cfc59494c4a74f37a2e55fcfb39fd2ca", + "m_Id": 1, + "m_DisplayName": "Scale", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Scale", + "m_StageCapability": 3, + "m_Value": 4.0, + "m_DefaultValue": 10.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "da2423c4952a4699989a050d57d48f2f", + "m_Id": 0, + "m_DisplayName": "Alpha Clip Threshold", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AlphaClipThreshold", + "m_StageCapability": 2, + "m_Value": 0.5, + "m_DefaultValue": 0.5, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "e26b1150028d4e4996bdec99e23f05fc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -882.0, + "y": 271.9999694824219, + "width": 108.0, + "height": 36.000030517578128 + } + }, + "m_Slots": [ + { + "m_Id": "20ecce2b73ee4d99907322a3319912c4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "7d826235a3194e89b5f660b2a5d3fd80" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "f7ff196828e3430b8e79a7fd19a89ddc", + "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": "b2e3bdea75e24051a7a34ad994216b4c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/Shaders/TerrainLitMaterialOverride.shadergraph.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/Shaders/TerrainLitMaterialOverride.shadergraph.meta new file mode 100644 index 00000000000..858cd53f076 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/Shaders/TerrainLitMaterialOverride.shadergraph.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d0066476a5c94af48949a7e4b8e7e4a8 +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_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.meta new file mode 100644 index 00000000000..fbb4b318b08 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c948aa8808358f648a84a293b2b309b0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.unity new file mode 100644 index 00000000000..625821a74ae --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.unity @@ -0,0 +1,520 @@ +%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, g: 0, b: 0, 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: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 1 + 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: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_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: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 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 &685546046 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 685546049} + - component: {fileID: 685546048} + - component: {fileID: 685546047} + - component: {fileID: 685546050} + - component: {fileID: 685546051} + 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 &685546047 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 685546046} + m_Enabled: 1 +--- !u!20 &685546048 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 685546046} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0, g: 0, b: 0, 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: 0 + 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: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &685546049 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 685546046} + serializedVersion: 2 + m_LocalRotation: {x: 0.2840153, y: 0, z: 0, w: 0.95881975} + m_LocalPosition: {x: 10, y: 20, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 33, y: 0, z: 0} +--- !u!114 &685546050 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 685546046} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73231aa468d81ea49bc3d914080de185, type: 3} + m_Name: + m_EditorClassIdentifier: + 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: 0 + gpuDrivenCompatible: 1 + CheckMemoryAllocation: 1 + renderBackendCompatibility: 2 + SetBackBufferResolution: 0 +--- !u!114 &685546051 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 685546046} + 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: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_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!1 &928594914 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 928594916} + - component: {fileID: 928594915} + - component: {fileID: 928594917} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &928594915 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 928594914} + m_Enabled: 1 + serializedVersion: 12 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 10, y: 10} + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &928594916 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 928594914} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0.9659258, z: -0.2588191, w: 0} + 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: 30, y: 180, z: 0} +--- !u!114 &928594917 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 928594914} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_CustomShadowLayers: 0 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 2 + m_RenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_ShadowRenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_Version: 4 + m_LightLayerMask: 1 + m_ShadowLayerMask: 1 + m_RenderingLayers: 1 + m_ShadowRenderingLayers: 1 +--- !u!1 &1477755113 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1477755116} + - component: {fileID: 1477755115} + - component: {fileID: 1477755114} + m_Layer: 0 + m_Name: Terrain + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!154 &1477755114 +TerrainCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1477755113} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 2 + m_TerrainData: {fileID: 15600000, guid: 8d71baf3d12a6a044a578ed91f8593d1, type: 2} + m_EnableTreeColliders: 1 +--- !u!218 &1477755115 +Terrain: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1477755113} + m_Enabled: 1 + serializedVersion: 6 + m_TerrainData: {fileID: 15600000, guid: 8d71baf3d12a6a044a578ed91f8593d1, type: 2} + m_TreeDistance: 5000 + m_TreeBillboardDistance: 50 + m_TreeCrossFadeLength: 5 + m_TreeMaximumFullLODCount: 50 + m_DetailObjectDistance: 80 + m_DetailObjectDensity: 1 + m_HeightmapPixelError: 5 + m_SplatMapDistance: 1000 + m_HeightmapMinimumLODSimplification: 0 + m_HeightmapMaximumLOD: 0 + m_ShadowCastingMode: 2 + m_DrawHeightmap: 1 + m_DrawInstanced: 0 + m_DrawTreesAndFoliage: 1 + m_StaticShadowCaster: 0 + m_IgnoreQualitySettings: 0 + m_ReflectionProbeUsage: 1 + m_MaterialTemplate: {fileID: -876546973899608171, guid: d0066476a5c94af48949a7e4b8e7e4a8, + type: 3} + m_BakeLightProbesForTrees: 1 + m_PreserveTreePrototypeLayers: 0 + m_DeringLightProbesForTrees: 1 + m_ReceiveGI: 1 + m_ScaleInLightmap: 0.0256 + m_LightmapParameters: {fileID: 15203, guid: 0000000000000000f000000000000000, type: 0} + m_GroupingID: 0 + m_RenderingLayerMask: 1 + m_AllowAutoConnect: 1 + m_EnableHeightmapRayTracing: 1 + m_EnableTreesAndDetailsRayTracing: 0 + m_TreeMotionVectorModeOverride: 3 +--- !u!4 &1477755116 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1477755113} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -50, 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: 685546049} + - {fileID: 928594916} + - {fileID: 1477755116} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.unity.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.unity.meta new file mode 100644 index 00000000000..228099cfd71 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b8b3473b5aa677142a505b3701e0e58e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride/MaterialOverrideTerrain.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/246_ShaderGraph_MaterialOverride/MaterialOverrideTerrain.asset new file mode 100644 index 0000000000000000000000000000000000000000..3e392747c4561df0cb7aeec0c536dfb7add08d04 GIT binary patch literal 820884 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 zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ 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 Date: Wed, 8 Oct 2025 02:22:14 +0000 Subject: [PATCH 27/49] [Port] [6000.3] [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 83e58e3306bbd0320e0f3e589d5c55b25cfb4e4c Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 8 Oct 2025 02:53:05 +0000 Subject: [PATCH 28/49] [Port] [6000.3] Add RenderingUtils.ReAllocateHandleIfNeeded with TextureDesc overload --- .../Runtime/RenderingUtils.cs | 66 ++++++++++++++++ .../Tests/Editor/EditorTests.cs | 77 ++++++++++++++++++- 2 files changed, 139 insertions(+), 4 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs b/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs index 1f317d895d9..68f722153db 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/RenderingUtils.cs @@ -861,6 +861,41 @@ public static bool ReAllocateHandleIfNeeded( return false; } + /// + /// Re-allocate fixed-size RTHandle if it is not allocated or doesn't match the descriptor + /// + /// RTHandle to check (can be null) + /// TextureDesc for the RTHandle to match + /// Name of the RTHandle. + /// If an allocation was done. + public static bool ReAllocateHandleIfNeeded( + ref RTHandle handle, + TextureDesc descriptor, + string name) + { + descriptor.name = name; + descriptor.sizeMode = TextureSizeMode.Explicit; + + if (RTHandleNeedsReAlloc(handle, in descriptor, false)) + { + if (handle != null && handle.rt != null) + { + TextureDesc currentRTDesc = RTHandleResourcePool.CreateTextureDesc(handle.rt.descriptor, TextureSizeMode.Explicit, handle.rt.anisoLevel, handle.rt.mipMapBias, handle.rt.filterMode, handle.rt.wrapMode, handle.name); + AddStaleResourceToPoolOrRelease(currentRTDesc, handle); + } + + if (UniversalRenderPipeline.s_RTHandlePool.TryGetResource(descriptor, out handle)) + { + return true; + } + + var allocInfo = CreateRTHandleAllocInfo(descriptor, name); + handle = RTHandles.Alloc(descriptor.width, descriptor.height, allocInfo); + return true; + } + return false; + } + /// /// Re-allocate dynamically resized RTHandle if it is not allocated or doesn't match the descriptor /// @@ -1131,5 +1166,36 @@ internal static RTHandleAllocInfo CreateRTHandleAllocInfo(in RenderTextureDescri return allocInfo; } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static RTHandleAllocInfo CreateRTHandleAllocInfo(in TextureDesc descriptor, string name) + { + // NOTE: this calls default(RTHandleAllocInfo) not RTHandleAllocInfo(string = "") + RTHandleAllocInfo allocInfo = new RTHandleAllocInfo(); + allocInfo.slices = descriptor.slices; + allocInfo.format = descriptor.format; + allocInfo.filterMode = descriptor.filterMode; + allocInfo.wrapModeU = descriptor.wrapMode; + allocInfo.wrapModeV = descriptor.wrapMode; + allocInfo.wrapModeW = descriptor.wrapMode; + allocInfo.dimension = descriptor.dimension; + allocInfo.enableRandomWrite = descriptor.enableRandomWrite; + allocInfo.enableShadingRate = descriptor.enableShadingRate; + allocInfo.useMipMap = descriptor.useMipMap; + allocInfo.autoGenerateMips = descriptor.autoGenerateMips; + allocInfo.anisoLevel = descriptor.anisoLevel; + allocInfo.mipMapBias = descriptor.mipMapBias; + allocInfo.isShadowMap = descriptor.isShadowMap; + allocInfo.msaaSamples = (MSAASamples)descriptor.msaaSamples; + allocInfo.bindTextureMS = descriptor.bindTextureMS; + allocInfo.useDynamicScale = descriptor.useDynamicScale; + allocInfo.useDynamicScaleExplicit = descriptor.useDynamicScaleExplicit; + allocInfo.memoryless = descriptor.memoryless; + allocInfo.vrUsage = descriptor.vrUsage; + allocInfo.enableShadingRate = descriptor.enableShadingRate; + allocInfo.name = name; + + return allocInfo; + } } } 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 d68d9b25186bae86a8295681b0593fd760202fb6 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 8 Oct 2025 02:53:07 +0000 Subject: [PATCH 29/49] [Port] [6000.3] [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 97e99b1b7e9cc5e4618805c8e02f98f71e274fc6 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 8 Oct 2025 07:31:42 +0000 Subject: [PATCH 30/49] [Port] [6000.3] [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 f529681382a..042d0747abf 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 00267a983d4e4ee754494930a53d8bf14c8c2faa Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 8 Oct 2025 18:49:29 +0000 Subject: [PATCH 31/49] [Port] [6000.3] [IUpscaler] Remove custom options GUI attributes, use Unity property rendering system --- .../Editor/Upscaling.meta | 8 + .../Editor/Upscaling/DLSSOptionsEditor.cs | 167 +++++++ .../Upscaling/DLSSOptionsEditor.cs.meta | 2 + .../Editor/Upscaling/UpscalerOptionsEditor.cs | 20 + .../Upscaling/UpscalerOptionsEditor.cs.meta | 2 + .../Upscaling/UpscalerOptionsEditorCache.cs | 52 ++ .../UpscalerOptionsEditorCache.cs.meta | 2 + .../Runtime/Upscaling/DLSSOptions.cs | 29 +- .../Runtime/Upscaling/FSR2Options.cs | 11 +- .../Runtime/Upscaling/IUpscalerOptions.cs | 444 +----------------- .../RenderPipeline/HDRenderPipelineEditor.cs | 15 + .../RenderPipeline/HDRenderPipelineUI.cs | 38 +- .../UniversalRenderPipelineAssetUI.Drawers.cs | 17 +- .../UniversalRenderPipelineAssetEditor.cs | 18 + 14 files changed, 341 insertions(+), 484 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Upscaling.meta create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Upscaling/DLSSOptionsEditor.cs create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Upscaling/DLSSOptionsEditor.cs.meta create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditor.cs create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditor.cs.meta create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditorCache.cs create mode 100644 Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditorCache.cs.meta diff --git a/Packages/com.unity.render-pipelines.core/Editor/Upscaling.meta b/Packages/com.unity.render-pipelines.core/Editor/Upscaling.meta new file mode 100644 index 00000000000..ba73323abaa --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Upscaling.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dfe03cc61c27c974ab28f8691b3f8c0f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.render-pipelines.core/Editor/Upscaling/DLSSOptionsEditor.cs b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/DLSSOptionsEditor.cs new file mode 100644 index 00000000000..aac3f477f0b --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/DLSSOptionsEditor.cs @@ -0,0 +1,167 @@ +#if UNITY_EDITOR +#if ENABLE_UPSCALER_FRAMEWORK && ENABLE_NVIDIA && ENABLE_NVIDIA_MODULE +using UnityEditor; +using UnityEngine; +using UnityEngine.NVIDIA; + +[CustomEditor(typeof(DLSSOptions))] +public class DLSSOptionsEditor : Editor +{ + // Declare variables to hold each property + private SerializedProperty m_QualityMode; + private SerializedProperty m_FixedResolution; + private SerializedProperty m_PresetQuality; + private SerializedProperty m_PresetBalanced; + private SerializedProperty m_PresetPerformance; + private SerializedProperty m_PresetUltraPerformance; + private SerializedProperty m_PresetDLAA; + private void OnEnable() + { + // Find each property by its exact field name in DLSSOptions.cs + m_QualityMode = serializedObject.FindProperty("DLSSQualityMode"); + m_FixedResolution = serializedObject.FindProperty("FixedResolutionMode"); + m_PresetQuality = serializedObject.FindProperty("DLSSRenderPresetQuality"); + m_PresetBalanced = serializedObject.FindProperty("DLSSRenderPresetBalanced"); + m_PresetPerformance = serializedObject.FindProperty("DLSSRenderPresetPerformance"); + m_PresetUltraPerformance = serializedObject.FindProperty("DLSSRenderPresetUltraPerformance"); + m_PresetDLAA = serializedObject.FindProperty("DLSSRenderPresetDLAA"); + } + + #region STYLES + private static readonly string[] DLSSPerfQualityLabels = + { // should follow enum value ordering in DLSSQuality enum + DLSSQuality.MaximumPerformance.ToString(), + DLSSQuality.Balanced.ToString(), + DLSSQuality.MaximumQuality.ToString(), + DLSSQuality.UltraPerformance.ToString(), + DLSSQuality.DLAA.ToString() + }; + private static string[][] DLSSPresetOptionsForEachPerfQuality = PopulateDLSSQualityPresetLabels(); + private static string[][] PopulateDLSSQualityPresetLabels() + { + int CountBits(uint bitMask) // System.Numerics.BitOperations not available + { + int count = 0; + while (bitMask > 0) + { + count += (bitMask & 1) > 0 ? 1 : 0; + bitMask >>= 1; + } + return count; + } + + System.Array perfQualities = System.Enum.GetValues(typeof(DLSSQuality)); + string[][] labels = new string[perfQualities.Length][]; + foreach (DLSSQuality quality in perfQualities) + { + uint presetBitmask = GraphicsDevice.GetAvailableDLSSPresetsForQuality(quality); + int numPresets = CountBits(presetBitmask) + 1; // +1 for default option which is available to all quality enums + labels[(int)quality] = new string[numPresets]; + + int iWrite = 0; + System.Array presets = System.Enum.GetValues(typeof(DLSSPreset)); + foreach (DLSSPreset preset in presets) + { + if (preset == DLSSPreset.Preset_Default) + { + labels[(int)quality][iWrite++] = "Default Preset"; + continue; + } + + if ((presetBitmask & (uint)preset) != 0) + { + string presetName = preset.ToString().Replace('_', ' '); + labels[(int)quality][iWrite++] = presetName + " - " + GraphicsDevice.GetDLSSPresetExplanation(preset); + } + } + } + return labels; + } + + private static readonly GUIContent renderPresetsLabel = new GUIContent("Render Presets", "Selects an internal DLSS tuning profile. Presets adjust reconstruction behavior, trading off between sharpness, stability, and performance. Different presets may work better depending on scene content and motion."); + #endregion + + + // DLSSOptions contain DLSS presets for each quality mode. + // The presets available for each quality mode may be different from one another and change over time between DLSS releases. + // E.g. DLAAPreset = { F, J, K } + // BalancedPreset = { J, K } + // Instead of letting Unity default-render the GUI, we write our own inspector logic to enforce the preset value requirements. + void DrawPresetDropdown(ref SerializedProperty presetProp, DLSSQuality perfQuality) + { + // each DLSSQuality has a different set of DLSSPresets, represented by a bitmask. + uint presetBitmask = GraphicsDevice.GetAvailableDLSSPresetsForQuality(perfQuality); + bool propHasInvalidPresetValue = presetProp.uintValue != 0 && (presetBitmask & presetProp.uintValue) == 0; + if (propHasInvalidPresetValue) + { + Debug.LogWarningFormat("DLSS Preset {0} not found for quality setting {1}, resetting to default value.", + ((DLSSPreset)presetProp.uintValue).ToString(), + perfQuality.ToString() + ); + presetProp.uintValue = 0; + } + + // We don't want to deal with List & using bitmasks, + // so we need some bit ops to convert between GUI index <--> Preset value + int FindPresetGUIIndex(uint presetBitmask, uint presetValue) + { + int i = 0; + while (presetValue > 0) + { + i += (presetBitmask & 1) > 0 ? 1 : 0; + presetBitmask >>= 1; + presetValue >>= 1; + } + return i; // includes 0=default, goes like 1=preset_A, 2=preset_B ... + } + uint GUIIndexToPresetValue(uint presetBitmask, uint index) + { + // e.g. bitset: 100101 --> 3 bits set, supports 4 presets (0=default, +3 other presets). + // ^ i = 1 -> Preset A = 1 + // ^ i = 2 -> Preset C = 4 + // ^ i = 3 -> Preset F = 32 + uint val = 0; + while (index > 0 && presetBitmask > 0) + { + if ((presetBitmask & 1) != 0) + --index; + presetBitmask >>= 1; + val = val == 0 ? 1 : (val << 1); + } + if (index != 0) + { + Debug.LogWarningFormat("DLSSPreset (index={0}) not found in the supported preset list (mask={1}), setting to default value.", index, presetBitmask); + return 0; + } + // Debug.LogFormat("Setting preset {0} : {1}", ((DLSSPreset)val).ToString(), val); + return val; + } + + int presetIndex = FindPresetGUIIndex(presetBitmask, presetProp.uintValue); + int iNew = EditorGUILayout.Popup(DLSSPerfQualityLabels[(int)perfQuality], presetIndex, DLSSPresetOptionsForEachPerfQuality[(int)perfQuality]); + if (iNew != presetIndex) + presetProp.uintValue = GUIIndexToPresetValue(presetBitmask, (uint)iNew); + } + public override void OnInspectorGUI() + { + serializedObject.Update(); + + EditorGUILayout.PropertyField(m_QualityMode); + EditorGUILayout.PropertyField(m_FixedResolution); + + EditorGUILayout.LabelField(renderPresetsLabel, EditorStyles.boldLabel); + ++EditorGUI.indentLevel; + + DrawPresetDropdown(ref m_PresetQuality, DLSSQuality.MaximumQuality); + DrawPresetDropdown(ref m_PresetBalanced, DLSSQuality.Balanced); + DrawPresetDropdown(ref m_PresetPerformance, DLSSQuality.MaximumPerformance); + DrawPresetDropdown(ref m_PresetUltraPerformance, DLSSQuality.UltraPerformance); + DrawPresetDropdown(ref m_PresetDLAA, DLSSQuality.DLAA); + + --EditorGUI.indentLevel; + + serializedObject.ApplyModifiedProperties(); + } +} +#endif +#endif diff --git a/Packages/com.unity.render-pipelines.core/Editor/Upscaling/DLSSOptionsEditor.cs.meta b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/DLSSOptionsEditor.cs.meta new file mode 100644 index 00000000000..a6c2860babc --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/DLSSOptionsEditor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3d45844b7594ca649b150d24562f5429 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditor.cs b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditor.cs new file mode 100644 index 00000000000..df858ac9e4c --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditor.cs @@ -0,0 +1,20 @@ +#if ENABLE_UPSCALER_FRAMEWORK +#if UNITY_EDITOR +using UnityEditor; + +/// +/// This custom editor ensures that when drawing any UpscalerOptions object, +/// the default "Script" field is not shown. Applies to all derived options. +/// +[CustomEditor(typeof(UnityEngine.Rendering.UpscalerOptions), true)] +public class UpscalerOptionsEditor : Editor +{ + public override void OnInspectorGUI() + { + // DrawDefaultInspector renders all serialized fields except for the "Script" field + // and any fields marked with [HideInInspector]. + DrawDefaultInspector(); + } +} +#endif +#endif diff --git a/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditor.cs.meta b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditor.cs.meta new file mode 100644 index 00000000000..9ae0ab7a6b1 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b9e58b38929a83b4aa0fd7b0d0144014 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditorCache.cs b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditorCache.cs new file mode 100644 index 00000000000..85bef5d585c --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditorCache.cs @@ -0,0 +1,52 @@ +#if ENABLE_UPSCALER_FRAMEWORK +#if UNITY_EDITOR +using System.Collections.Generic; +using UnityEditor; + +namespace UnityEngine.Rendering +{ +#nullable enable + /// + /// Manages the lifecycle of cached editors for UpscalerOptions ScriptableObjects. + /// + public class UpscalerOptionsEditorCache + { + private readonly Dictionary m_EditorCache = new Dictionary(); + + /// + /// Gets a cached editor for the given @options. If the editor is not + /// found in the cache, a new editor is created and then cached. + /// + public Editor? GetOrCreateEditor(ScriptableObject options) + { + if (options == null) + return null; + + if (!m_EditorCache.TryGetValue(options, out var editor) || editor == null) + { + editor = Editor.CreateEditor(options); + m_EditorCache[options] = editor; + } + + return editor; + } + + /// + /// Destroys all cached editor instances. + /// Call this from the parent editor's OnDisable method. + /// + public void Cleanup() + { + foreach (var editor in m_EditorCache.Values) + { + if (editor != null) + Object.DestroyImmediate(editor); + } + m_EditorCache.Clear(); + } + } + +#nullable disable +} +#endif +#endif // ENABLE_UPSCALER_FRAMEWORK diff --git a/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditorCache.cs.meta b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditorCache.cs.meta new file mode 100644 index 00000000000..14580aa456a --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Editor/Upscaling/UpscalerOptionsEditorCache.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b35dd4b6f122695459036b125fcb7b48 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/DLSSOptions.cs b/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/DLSSOptions.cs index 41258437521..e67f84b8853 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/DLSSOptions.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/DLSSOptions.cs @@ -17,25 +17,22 @@ [Serializable] public class DLSSOptions : UpscalerOptions { - [EnumOption(typeof(DLSSQuality), "DLSS Quality Mode")] - public int DLSSQualityMode = (int)DLSSQuality.MaximumQuality; + [Tooltip("Selects a performance quality setting for NVIDIA Deep Learning Super Sampling (DLSS).")] + public DLSSQuality DLSSQualityMode = DLSSQuality.MaximumQuality; - [BoolOption("Force Quality Mode")] + [Tooltip("Forces a fixed resolution scale derived from the selected quality mode, ignoring dynamic resolution.")] public bool FixedResolutionMode = false; - // TODO: fix available preset values, currently all values are displayed. - // every preset have their own list of available presets, that may differ from each other. - // need a way to represent the available subset of enum values for each preset to enforce the value requirements. - [EnumOption(typeof(DLSSPreset), "DLSS Preset for Quality")] - public int DLSSRenderPresetQuality; - [EnumOption(typeof(DLSSPreset), "DLSS Preset for Balanced")] - public int DLSSRenderPresetBalanced; - [EnumOption(typeof(DLSSPreset), "DLSS Preset for Performance")] - public int DLSSRenderPresetPerformance; - [EnumOption(typeof(DLSSPreset), "DLSS Preset for Ultra Performance")] - public int DLSSRenderPresetUltraPerformance; - [EnumOption(typeof(DLSSPreset), "DLSS Preset for DLAA")] - public int DLSSRenderPresetDLAA; + [Tooltip("DLSS will use the specified render preset for the Quality mode.")] + public DLSSPreset DLSSRenderPresetQuality; + [Tooltip("DLSS will use the specified render preset for the Balanced mode.")] + public DLSSPreset DLSSRenderPresetBalanced; + [Tooltip("DLSS will use the specified render preset for the Performance mode.")] + public DLSSPreset DLSSRenderPresetPerformance; + [Tooltip("DLSS will use the specified render preset for the Ultra Performance mode.")] + public DLSSPreset DLSSRenderPresetUltraPerformance; + [Tooltip("DLSS will use the specified render preset for the DLAA mode.")] + public DLSSPreset DLSSRenderPresetDLAA; } #endif // ENABLE_UPSCALER_FRAMEWORK && ENABLE_NVIDIA && ENABLE_NVIDIA_MODULE diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/FSR2Options.cs b/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/FSR2Options.cs index e3f4bb4d95b..24fd49124a5 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/FSR2Options.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/FSR2Options.cs @@ -17,16 +17,17 @@ [Serializable] public class FSR2Options : UpscalerOptions { - [EnumOption(typeof(FSR2Quality), "FSR2 Quality Mode")] - public int FSR2QualityMode = (int)FSR2Quality.Quality; + [Tooltip("Selects a performance quality setting for AMD FidelityFX 2.0 Super Resolution (FSR2).")] + public FSR2Quality FSR2QualityMode = FSR2Quality.Quality; - [BoolOption("Fixed Resolution")] + [Tooltip("Forces a fixed resolution scale derived from the selected quality mode, ignoring dynamic resolution.")] public bool FixedResolutionMode = false; - [BoolOption("Enable Sharpening")] + [Tooltip("Enable an additional sharpening pass on FidelityFX 2.0 Super Resolution (FSR2).")] public bool EnableSharpening = false; - [FloatOption(0.0f, 1.0f, "Sharpness")] + [Tooltip("The sharpness value between 0 and 1, where 0 is no additional sharpness and 1 is maximum additional sharpness.")] + [Range(0.0f, 1.0f)] public float Sharpness = 0.92f; }; diff --git a/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/IUpscalerOptions.cs b/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/IUpscalerOptions.cs index 1553d21d07e..37b4f310241 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/IUpscalerOptions.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/Upscaling/IUpscalerOptions.cs @@ -9,380 +9,6 @@ namespace UnityEngine.Rendering { #nullable enable - #region Attributes - - /// - /// Base class for all custom option attributes. - /// UpscalerOptions attributes facilitate GUI rendering for a given option by sepcifying its type, range of values and display label. - /// - public abstract class BaseOptionAttribute : PropertyAttribute // Using PropertyAttribute for Unity Editor integration - { - public string? DisplayName { get; protected set; } - - protected BaseOptionAttribute(string? displayName = null) - { - DisplayName = displayName; - } - } - - - /// - /// Marks an int field as representing an enum value. - /// - [AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)] - public class EnumOptionAttribute : BaseOptionAttribute - { - public Type EnumType { get; private set; } - - public EnumOptionAttribute(Type enumType, string? displayName = null) : base(displayName) - { - if (enumType == null || !enumType.IsEnum) - { - throw new ArgumentException("EnumType must be a valid Enum type.", nameof(enumType)); - } - EnumType = enumType; - } - } - - /// - /// Marks a float field as an option. - /// - [AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)] - public class FloatOptionAttribute : BaseOptionAttribute - { - public float Min { get; private set; } - public float Max { get; private set; } - public bool HasRange { get; private set; } // Indicates if min/max were explicitly set - public FloatOptionAttribute(string? displayName = null) : base(displayName) - { - HasRange = false; - Min = 0f; // Default, will be ignored if HasRange is false - Max = 0f; - } - public FloatOptionAttribute(float min, float max, string? displayName = null) : base(displayName) - { - HasRange = true; - Min = min; - Max = max; - } - } - - /// - /// Marks an int field as an option. - /// - [AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)] - public class IntOptionAttribute : BaseOptionAttribute - { - public int Min { get; private set; } - public int Max { get; private set; } - public bool HasRange { get; private set; } // Indicates if min/max were explicitly set - - // Constructor for int without range - public IntOptionAttribute(string? displayName = null) : base(displayName) - { - HasRange = false; - Min = 0; // Default - Max = 0; - } - - // Constructor for int with range - public IntOptionAttribute(int min, int max, string? displayName = null) : base(displayName) - { - HasRange = true; - Min = min; - Max = max; - } - } - - /// - /// Marks a boolean field as an option. - /// - [AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)] - public class BoolOptionAttribute : BaseOptionAttribute - { - public BoolOptionAttribute(string? displayName = null) : base(displayName) { } - } - #endregion - - #region OptionsBase - /// - /// Represents a single configurable option that can be read from and written to. - /// - public interface IOption - { - string Id { get; } // A unique identifier for the option (e.g., field name) - string DisplayName { get; } // A user-friendly name for the option - Type ValueType { get; } // The actual C# type of the option's value (e.g., typeof(float), typeof(DLSSQuality)) - - abstract object? GetValue(object targetInstance); - abstract void SetValue(object targetInstance, object? newValue); - } - - /// - /// Represents an option whose value is an enum. - /// - public interface IEnumOption : IOption - { - Type EnumType { get; } // The specific enum Type (e.g., typeof(DLSSQuality)) - Array GetEnumValues(); // Returns an array of the actual enum values - string[] GetEnumNames(); // Returns an array of the enum names (for display) - } - - /// - /// Represents a numeric option that has a defined minimum and maximum value. - /// - public interface IRangeOption : IOption - { - float MinValue { get; } // Using float for generics, int ranges will cast - float MaxValue { get; } // Using float for generics, int ranges will cast - bool HasRange { get; } // True if a min/max was explicitly set - } - - - /// - /// Abstract base class for option implementations, handles common properties. - /// - internal abstract class OptionBase : IOption - { - protected readonly FieldInfo _fieldInfo; - - public string Id { get; private set; } - public string DisplayName { get; private set; } - public abstract Type ValueType { get; } - - protected OptionBase(FieldInfo fieldInfo, string displayName) - { - _fieldInfo = fieldInfo ?? throw new ArgumentNullException(nameof(fieldInfo)); - Id = fieldInfo.Name; - DisplayName = displayName; - } - - public virtual object? GetValue(object targetInstance) - { - if (targetInstance == null || !_fieldInfo.DeclaringType!.IsAssignableFrom(targetInstance.GetType())) - { - throw new ArgumentException($"Target instance is not compatible with option's field type. Expected {_fieldInfo.DeclaringType.Name}, got {targetInstance?.GetType().Name}.", nameof(targetInstance)); - } - return _fieldInfo.GetValue(targetInstance); - } - - public virtual void SetValue(object targetInstance, object? newValue) - { - if (targetInstance == null || !_fieldInfo.DeclaringType!.IsAssignableFrom(targetInstance.GetType())) - { - throw new ArgumentException($"Target instance is not compatible with option's field type. Expected {_fieldInfo.DeclaringType.Name}, got {targetInstance?.GetType().Name}.", nameof(targetInstance)); - } - _fieldInfo.SetValue(targetInstance, newValue); - } - } - #endregion - - - #region TypedOptions - /// - /// Represents an integer option backed by an enum. - /// - internal class EnumIntOption : OptionBase, IEnumOption - { - public Type EnumType { get; private set; } - - public override Type ValueType => EnumType; - - public EnumIntOption(FieldInfo fieldInfo, string displayName, Type enumType) - : base(fieldInfo, displayName) - { - if (!enumType.IsEnum) - { - throw new ArgumentException($"Provided type '{enumType.Name}' is not an enum.", nameof(enumType)); - } - if (fieldInfo.FieldType != typeof(int)) - { - throw new ArgumentException($"EnumIntOption can only wrap int fields. Field '{fieldInfo.Name}' is of type '{fieldInfo.FieldType.Name}'.", nameof(fieldInfo)); - } - EnumType = enumType; - } - - public override object? GetValue(object targetInstance) - { - int intValue = (int)(base.GetValue(targetInstance) ?? 0); // Handle potential null for value types - return Enum.ToObject(EnumType, intValue); - } - - public override void SetValue(object targetInstance, object? newValue) - { - if (newValue != null && newValue.GetType() != EnumType) - { - throw new ArgumentException($"Cannot set EnumIntOption '{DisplayName}': value type mismatch. Expected '{EnumType.Name}', got '{newValue?.GetType().Name}'.", nameof(newValue)); - } - base.SetValue(targetInstance, Convert.ToInt32(newValue)); - } - - public Array GetEnumValues() => Enum.GetValues(EnumType); - public string[] GetEnumNames() => Enum.GetNames(EnumType); - } - - /// - /// Represents a boolean option. - /// - internal class BoolOption : OptionBase - { - public override Type ValueType => typeof(bool); - - public BoolOption(FieldInfo fieldInfo, string displayName) - : base(fieldInfo, displayName) - { - if (fieldInfo.FieldType != typeof(bool)) - { - throw new ArgumentException($"BoolOption can only wrap bool fields. Field '{fieldInfo.Name}' is of type '{fieldInfo.FieldType.Name}'.", nameof(fieldInfo)); - } - } - } - - /// - /// Represents a float option, with an optional min/max range. - /// - internal class FloatOption : OptionBase, IRangeOption - { - public override Type ValueType => typeof(float); - public float MinValue { get; private set; } - public float MaxValue { get; private set; } - public bool HasRange { get; private set; } - - public FloatOption(FieldInfo fieldInfo, string displayName, float min, float max, bool hasRange) - : base(fieldInfo, displayName) - { - if (fieldInfo.FieldType != typeof(float)) - { - throw new ArgumentException($"FloatOption can only wrap float fields. Field '{fieldInfo.Name}' is of type '{fieldInfo.FieldType.Name}'.", nameof(fieldInfo)); - } - MinValue = min; - MaxValue = max; - HasRange = hasRange; - } - } - - /// - /// Represents an int option, with an optional min/max range. - /// - internal class IntOption : OptionBase, IRangeOption - { - public override Type ValueType => typeof(int); - public float MinValue { get; private set; } // Storing as float, will cast to int when used - public float MaxValue { get; private set; } // Storing as float, will cast to int when used - public bool HasRange { get; private set; } - - public IntOption(FieldInfo fieldInfo, string displayName, int min, int max, bool hasRange) - : base(fieldInfo, displayName) - { - if (fieldInfo.FieldType != typeof(int)) - { - throw new ArgumentException($"IntOption can only wrap int fields. Field '{fieldInfo.Name}' is of type '{fieldInfo.FieldType.Name}'.", nameof(fieldInfo)); - } - MinValue = min; - MaxValue = max; - HasRange = hasRange; - } - } - - #endregion - - #region OptionsRegistry - /// - /// Provides methods to generically inspect UpscalerOptions instances - /// and retrieve their configurable options. - /// - public static class UpscalerOptionsRegistry - { - // Cached reflection results - private static readonly Dictionary> s_CachedOptions = new(); - -#if UNITY_EDITOR - /// - /// Discovers and returns all configurable options for a given UpscalerOptions instance. - /// This method uses reflection and caches results for performance. - /// - /// The UpscalerOptions instance to inspect. - /// A list of IOption objects representing the configurable options. - [Preserve] // Prevent IL2CPP stripping if attributes/reflection are only used by this. - public static IReadOnlyList GetConfigurableOptions(UpscalerOptions optionsInstance) - { - if (optionsInstance == null) - { - Debug.LogWarning("GetConfigurableOptions called with a null options instance."); - return new List(); - } - - Type optionsType = optionsInstance.GetType(); - - // Use cached metadata if available - if (s_CachedOptions.TryGetValue(optionsType, out var optionsList)) - { - return optionsList; - } - - // Otherwise, perform reflection and build the metadata - List discoveredOptions = new List(); - - // Get all instance fields, both public and non-public (for [SerializeField] private fields) - FieldInfo[] fields = optionsType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); - - foreach (FieldInfo field in fields) - { - // Check for our custom option attributes - BaseOptionAttribute? attr = field.GetCustomAttribute(true); - - if (attr == null) continue; // Not an option we care about - - // Determine the display name, prioritizing the one from the attribute - string displayName = attr.DisplayName ?? ObjectNames.NicifyVariableName(field.Name); - - // Create the appropriate IOption wrapper based on the attribute type - if (attr is EnumOptionAttribute enumAttr) - { - discoveredOptions.Add(new EnumIntOption(field, displayName, enumAttr.EnumType)); - } - else if (attr is FloatOptionAttribute floatAttr) - { - discoveredOptions.Add(new FloatOption(field, displayName, floatAttr.Min, floatAttr.Max, floatAttr.HasRange)); - } - else if (attr is IntOptionAttribute intAttr) - { - discoveredOptions.Add(new IntOption(field, displayName, intAttr.Min, intAttr.Max, intAttr.HasRange)); - } - else if (attr is BoolOptionAttribute) - { - discoveredOptions.Add(new BoolOption(field, displayName)); - } - else - { - Debug.LogWarning($"Unhandled BaseOptionAttribute type for field '{field.Name}' in '{optionsType.Name}': {attr.GetType().Name}."); - } - } - - // Cache and return - s_CachedOptions[optionsType] = discoveredOptions; - return discoveredOptions; - } - - /// - /// Finds a specific option by its ID (field name). - /// - /// The UpscalerOptions instance. - /// The ID (field name) of the option to find. - /// The IOption object if found, otherwise null. - public static IOption? GetOptionById(UpscalerOptions optionsInstance, string optionId) - { - foreach(IOption opt in GetConfigurableOptions(optionsInstance)) - { - if (opt.Id == optionId) - return opt; - } - return null; - } -#endif - }; - #endregion - [Serializable] public class UpscalerOptions : ScriptableObject @@ -399,75 +25,13 @@ public UpsamplerScheduleType InjectionPoint set => m_InjectionPoint = value; } - [SerializeField] private string m_UpscalerName = ""; - [SerializeField] private UpsamplerScheduleType m_InjectionPoint = UpsamplerScheduleType.BeforePost; + [SerializeField, HideInInspector] + private string m_UpscalerName = ""; + [SerializeField, HideInInspector] // hide in inspector for URP, HDRP manually renders it + private UpsamplerScheduleType m_InjectionPoint = UpsamplerScheduleType.BeforePost; #if UNITY_EDITOR - public bool DrawOptionsEditorGUI() - { - bool optionUpdated = false; - IReadOnlyList options = UpscalerOptionsRegistry.GetConfigurableOptions(this); - foreach (IOption opt in options) - { - object? currentValue = opt.GetValue(this); - object? newValue = null; // store the value returned by the GUI control - - // ranged int/float options - if (opt is IRangeOption rangeOption && rangeOption.HasRange) - { - if (opt.ValueType == typeof(float)) - { - float currentFloatValue = (float)currentValue!; - newValue = EditorGUILayout.Slider(opt.DisplayName, currentFloatValue, rangeOption.MinValue, rangeOption.MaxValue); - } - else if (opt.ValueType == typeof(int)) - { - int currentIntValue = (int)currentValue!; - newValue = EditorGUILayout.IntSlider(opt.DisplayName, currentIntValue, (int)rangeOption.MinValue, (int)rangeOption.MaxValue); - } - else - { - // Fallback for unexpected IRangeOption types (shouldn't happen if attributes are correct) - EditorGUILayout.LabelField(opt.DisplayName, $"Range Type (Unhandled): {opt.ValueType.Name}, Value: {currentValue?.ToString() ?? "N/A"}"); - } - } - // regular options - else - { - if (opt is IEnumOption enumOption) - { - Enum currentEnumValue = (Enum)currentValue!; - newValue = EditorGUILayout.EnumPopup(enumOption.DisplayName, currentEnumValue); - } - else if (opt.ValueType == typeof(float)) - { - float currentFloatValue = (float)currentValue!; - newValue = EditorGUILayout.FloatField(opt.DisplayName, currentFloatValue); - } - else if (opt.ValueType == typeof(int)) - { - int currentIntValue = (int)currentValue!; - newValue = EditorGUILayout.IntField(opt.DisplayName, currentIntValue); - } - else if (opt.ValueType == typeof(bool)) - { - bool currentBoolValue = (bool)currentValue!; - newValue = EditorGUILayout.Toggle(opt.DisplayName, currentBoolValue); - } - } - - bool valueChanged = newValue != null && !newValue.Equals(currentValue); - if (valueChanged) - { - opt.SetValue(this, newValue); - optionUpdated = true; - } - } - - return optionUpdated; - } - // The core method to ensure options exist and are linked. // It operates on a SerializedProperty representing the list. public static bool ValidateSerializedUpscalerOptionReferencesWithinRPAsset(ScriptableObject parentRPAsset, SerializedProperty optionsListProp) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineEditor.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineEditor.cs index 6a02db0d08c..c2778b5f70a 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineEditor.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/RenderPipeline/HDRenderPipelineEditor.cs @@ -18,9 +18,24 @@ sealed class HDRenderPipelineEditor : Editor internal ReorderableList reusableReorderableList; +#if ENABLE_UPSCALER_FRAMEWORK + internal UpscalerOptionsEditorCache upscalerOptionsEditorCache => m_UpscalerOptionsEditorCache; + UpscalerOptionsEditorCache m_UpscalerOptionsEditorCache; +#endif + void OnEnable() { m_SerializedHDRenderPipeline = new SerializedHDRenderPipelineAsset(serializedObject); +#if ENABLE_UPSCALER_FRAMEWORK + m_UpscalerOptionsEditorCache = new UpscalerOptionsEditorCache(); +#endif + } + + void OnDisable() + { +#if ENABLE_UPSCALER_FRAMEWORK + m_UpscalerOptionsEditorCache?.Cleanup(); +#endif } public override void OnInspectorGUI() 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 a6bace5bf55..75cc2e4d7b6 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 @@ -893,9 +893,10 @@ uint GUIIndexToPresetValue(uint presetBitmask, uint index) ++EditorGUI.indentLevel; bool optionsChanged = false; + HDRenderPipelineEditor hdrpEditor = owner as HDRenderPipelineEditor; // O(N^2) IUpscaler name comparison but typical use case is <6 entries w/ each entry around 20B of char data - for(int i=0; i< serialized.renderPipelineSettings.dynamicResolutionSettings.advancedUpscalerNames.arraySize; ++i) + for (int i = 0; i < serialized.renderPipelineSettings.dynamicResolutionSettings.advancedUpscalerNames.arraySize; ++i) { string advancedUpscalerName = serialized.renderPipelineSettings.dynamicResolutionSettings.advancedUpscalerNames.GetArrayElementAtIndex(i).stringValue; @@ -910,31 +911,40 @@ uint GUIIndexToPresetValue(uint presetBitmask, uint index) EditorGUILayout.LabelField(upscalerOptions.UpscalerName, EditorStyles.boldLabel); ++EditorGUI.indentLevel; - // injection point selection (common to all IUpscalers) - int injectionPointBefore = (int)upscalerOptions.InjectionPoint; - int injectionPointSelection = EditorGUILayout.IntPopup(Styles.IUpscalerInjectionPoint, (int)upscalerOptions.InjectionPoint, Styles.UpscalerInjectionPointNames, Styles.UpscalerInjectionPointValues); - bool injectionPointChanged = injectionPointBefore != injectionPointSelection; - if (injectionPointChanged) - upscalerOptions.InjectionPoint = (DynamicResolutionHandler.UpsamplerScheduleType)injectionPointSelection; - - // draw rest of the options - bool optionsChangedOnThisUpscaler = upscalerOptions.DrawOptionsEditorGUI(); + Debug.Assert(hdrpEditor != null); + Editor editor = hdrpEditor.upscalerOptionsEditorCache.GetOrCreateEditor(upscalerOptions); + if (editor != null) + { + //------------------------------------------------------------------------------------------------------------------------ + // Edge Case: Manually draw the "InjectionPoint" property. + // It is hidden by default to serve URP requirements. + // When URP supports injection points, this snippet can be safely removed + SerializedProperty injectionPointProp = editor.serializedObject.FindProperty("m_InjectionPoint"); + if (injectionPointProp != null) + { + EditorGUILayout.PropertyField(injectionPointProp); + editor.serializedObject.ApplyModifiedProperties(); + } + //------------------------------------------------------------------------------------------------------------------------ - optionsChanged = optionsChanged || injectionPointChanged || optionsChangedOnThisUpscaler; + editor.OnInspectorGUI(); + } --EditorGUI.indentLevel; - } - } + + } // foreach upscaler option + } // foreach advanced upscaler name --EditorGUI.indentLevel; - if(optionsChanged) + if (optionsChanged) { EditorUtility.SetDirty(HDRenderPipeline.currentAsset); } } #endif #endregion + EditorGUILayout.PropertyField(serialized.renderPipelineSettings.dynamicResolutionSettings.dynamicResType, Styles.dynResType); bool isHwDrs = (serialized.renderPipelineSettings.dynamicResolutionSettings.dynamicResType.intValue == (int)DynamicResolutionType.Hardware); bool gfxDeviceSupportsHwDrs = HDUtils.IsHardwareDynamicResolutionSupportedByDevice(SystemInfo.graphicsDeviceType); 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 a1b09038ae3..c8b3af98fd5 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 @@ -191,7 +191,7 @@ static void DrawQuality(SerializedUniversalRenderPipelineAsset serialized, Edito EditorGUILayout.PropertyField(serialized.msaa, Styles.msaaText); serialized.renderScale.floatValue = EditorGUILayout.Slider(Styles.renderScaleText, serialized.renderScale.floatValue, UniversalRenderPipeline.minRenderScale, UniversalRenderPipeline.maxRenderScale); - DrawUpscalingFilterDropdownAndOptions(serialized); + DrawUpscalingFilterDropdownAndOptions(serialized, ownerEditor); if (serialized.renderScale.floatValue < 1.0f || serialized.asset.upscalingFilter == UpscalingFilterSelection.STP || serialized.asset.upscalingFilter == UpscalingFilterSelection.FSR) { @@ -213,7 +213,7 @@ static void DrawQuality(SerializedUniversalRenderPipelineAsset serialized, Edito EditorGUI.EndDisabledGroup(); } - static void DrawUpscalingFilterDropdownAndOptions(SerializedUniversalRenderPipelineAsset serialized) + static void DrawUpscalingFilterDropdownAndOptions(SerializedUniversalRenderPipelineAsset serialized, Editor ownerEditor) { // Get the names of IUpscalers currently present string[] iUpscalerNames = { }; @@ -343,21 +343,20 @@ static void DrawUpscalingFilterDropdownAndOptions(SerializedUniversalRenderPipel if (RenderPipelineManager.currentPipeline is UniversalRenderPipeline && selectedIUpscalerIndex != -1) { UpscalerOptions options = serialized.asset.GetIUpscalerOptions(serialized.iUpscalerName.stringValue); - if (options != null) + + UniversalRenderPipelineAssetEditor urpEditor = ownerEditor as UniversalRenderPipelineAssetEditor; + + Editor upscalerOptionsEditor = urpEditor.upscalerOptionsEditorCache.GetOrCreateEditor(options); + if (upscalerOptionsEditor != null) { ++EditorGUI.indentLevel; - bool optionChanged = options.DrawOptionsEditorGUI(); - if (optionChanged) - { - EditorUtility.SetDirty(serialized.asset); - } + upscalerOptionsEditor.OnInspectorGUI(); --EditorGUI.indentLevel; } } } break; #endif } - } static void DrawHDR(SerializedUniversalRenderPipelineAsset serialized, Editor ownerEditor) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAssetEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAssetEditor.cs index 5f2051de358..9bc99d8338d 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAssetEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineAssetEditor.cs @@ -1,5 +1,6 @@ using UnityEditorInternal; using UnityEngine; +using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using Styles = UnityEditor.Rendering.Universal.UniversalRenderPipelineAssetUI.Styles; @@ -19,6 +20,11 @@ public class UniversalRenderPipelineAssetEditor : Editor private SerializedUniversalRenderPipelineAsset m_SerializedURPAsset; +#if ENABLE_UPSCALER_FRAMEWORK + internal UpscalerOptionsEditorCache upscalerOptionsEditorCache => m_UpscalerOptionsEditorCache; + UpscalerOptionsEditorCache m_UpscalerOptionsEditorCache; +#endif + /// public override void OnInspectorGUI() { @@ -30,9 +36,21 @@ public override void OnInspectorGUI() void OnEnable() { m_SerializedURPAsset = new SerializedUniversalRenderPipelineAsset(serializedObject); + +#if ENABLE_UPSCALER_FRAMEWORK + m_UpscalerOptionsEditorCache = new UpscalerOptionsEditorCache(); +#endif + CreateRendererReorderableList(); } + private void OnDisable() + { +#if ENABLE_UPSCALER_FRAMEWORK + m_UpscalerOptionsEditorCache?.Cleanup(); +#endif + } + void CreateRendererReorderableList() { m_RendererDataProp = serializedObject.FindProperty("m_RendererDataList"); From 47944a8caa520a8c7a9e9bc0d6abbd26b2012bf1 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 8 Oct 2025 18:49:29 +0000 Subject: [PATCH 32/49] [Port] [6000.3] 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 e20b5520a43b2f7ede13ef44da3b11c42aab89c8 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Wed, 8 Oct 2025 18:49:31 +0000 Subject: [PATCH 33/49] [Port] [6000.3] 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 84583d83c543fe579da91bed030177ab09da567b Mon Sep 17 00:00:00 2001 From: Nicola Cerone Date: Wed, 8 Oct 2025 19:20:08 +0000 Subject: [PATCH 34/49] [Backport 6000.3] 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 51420cbb416210e6938a7f1543243e606eeb2fac Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Thu, 9 Oct 2025 11:49:05 +0000 Subject: [PATCH 35/49] [Port] [6000.3] [UUM-99152] Fix for Depth Priming not enabled in reflection probes --- .../Runtime/UniversalRenderer.cs | 4 +--- .../Runtime/UniversalRendererRenderGraph.cs | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs index 7d5d407fce8..1083541af39 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs @@ -709,13 +709,11 @@ bool IsDepthPrimingEnabled(UniversalCameraData cameraData) 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; - // Enabled Depth priming when baking Reflection Probes causes artefacts (UUM-12397) - bool isNotReflectionCamera = cameraData.cameraType != CameraType.Reflection; // 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 && isNotReflectionCamera && isNotOffscreenDepthTexture && isNotWebGL && isNotMSAA; + return depthPrimingRequested && isForwardRenderingMode && isFirstCameraToWriteDepth && isNotOffscreenDepthTexture && isNotWebGL && isNotMSAA; } #endif diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index f27a5ccdb2f..c151bc8ca5c 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -1393,7 +1393,7 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) importColorParams.clearColor = Color.black; importColorParams.discardOnLastUse = cameraData.resolveFinalTarget; // check if last camera in the stack - if (cameraData.IsSTPEnabled() || (cameraData.IsTemporalAAEnabled() && + if (cameraData.IsSTPEnabled() || (cameraData.IsTemporalAAEnabled() && #if ENABLE_UPSCALER_FRAMEWORK cameraData.upscalingFilter == ImageUpscalingFilter.IUpscaler #else @@ -1622,6 +1622,8 @@ static bool IsDepthPrimingEnabledRenderGraph(UniversalCameraData cameraData, in // We only do one depth prepass per camera. If the texture requires a prepass, and priming is on, then we do priming and a copy afterwards to the cameraDepthTexture. // However, some platforms don't support this copy (like GLES when MSAA is on). When a copy is not supported we turn off priming so the prepass will target the cameraDepthTexture, avoiding the copy. + // Note: From Unity 2021 to Unity 6.3, depth priming was disabled in renders for reflections probes as a brute-force bugfix for artefacts appearing in reflection probes when screen space shadows are enabled. + // Depth priming has now been restored in reflection probe renders. Please consider a more targeted fix if issues with screen space shadows resurface again. (See UUM-99152 and UUM-12397) if (requireDepthTexture && !CanCopyDepth(cameraData)) return false; @@ -1644,12 +1646,10 @@ static bool IsDepthPrimingEnabledRenderGraph(UniversalCameraData cameraData, in } bool isFirstCameraToWriteDepth = cameraData.renderType == CameraRenderType.Base || cameraData.clearDepth; - // Enabled Depth priming when baking Reflection Probes causes artefacts (UUM-12397) - bool isNotReflectionCamera = cameraData.cameraType != CameraType.Reflection; // Depth is not rendered in a depth-only camera setup with depth priming (UUM-38158) bool isNotOffscreenDepthTexture = !IsOffscreenDepthTexture(cameraData); - return depthPrimingRequested && !usesDeferredLighting && isFirstCameraToWriteDepth && isNotReflectionCamera && isNotOffscreenDepthTexture && isNotWebGL && isNotMSAA; + return depthPrimingRequested && !usesDeferredLighting && isFirstCameraToWriteDepth && isNotOffscreenDepthTexture && isNotWebGL && isNotMSAA; } internal void SetRenderingLayersGlobalTextures(RenderGraph renderGraph) From f1238a9bef5d51b47bda408406b770a62ff23f6f Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Thu, 9 Oct 2025 11:49:06 +0000 Subject: [PATCH 36/49] [Port] [6000.3] 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 c151bc8ca5c..611e01c251a 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -1348,7 +1348,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 78cd2fcc443fb85856dbb27c363098cf54963cbf Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Thu, 9 Oct 2025 11:49:06 +0000 Subject: [PATCH 37/49] [Port] [6000.3] [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.Qss|G%0>!n*Cp(J4@l7^E=lDU}$Tqm%( zaTKO9uxQyKJ`S9dlEg>G#+Ga{;3n4_7}P9SelSy8XbgD1CV3pKg~5+H^+%Z_qefO& z52mDpU)!%WBN%vU`On~qlg?D8Wtih8>_G9{Pwn^3iO9%|Dkq%>h;z%T_`pa;RuCW9 zRAN}hkv#_FB|eB&Ktk5lb6IjdTR<>I%2o$VOD~IwpmICdBjzXYlNThYl4Z)NQ)drk}`wIY0KpnALd!kjLd$}L*zj25Na&m-I5(%JG@~5mk1|;$K;9Ge= zfo)|Ib6p7o?dQKh*4QB;awmqPsxd}r_?A(d%uLEDF7vj8`S>On2h)7w=?pC{p$j2{ z7J)3+88<3JiA^|-`{tYsgbi9d01a>G;s>j-J5%{A*hZD7Q7kzJaQ=t^_C|ViT1kL0 zeb2ZS9u}zzxJ60S9@epV!&j#U@k!lNtMs^6z69R8Wcu*?Ol_nZ-WFVJF=lq5_IOp7Eb8 z<6PU(gipPFNu%*DhbP_0GU5n|Sqd>{M?eB&_1hy5f$FNZ!^3=*X1;j!dDrgv2acaa zR`#T~w7pc#ZB7`n2pd>@#iPJVKV3UItfp9RL$yZFfv`=_EW%DcX!Y^&%i((HA-qcH zIC=BL>yRwRm~xHu`ar8NS^EU%7emmY6+@#wu*CL6r4I3TzcZgT^hjG;m!`lha;RpB zr_WGNJ`ZW6uzc#S^-4zfZuK8p*)6s}Kk;15*^uW=1F4UUj|Ik7xyk9X$&Nek`L5qU zY+4&oA*>4XTx3u6Uf>u(AH28qz0x7v(oM3jA)oxh20ThVn^lZYHl2zox5(Wn?H+6^ zoi&GgvV8sR80NX zCSC4YaggOj*!Qu-{f%wO7jRh6TakB6$)RSn(4(yT>!KgsDp-dWUhwv8OEIwcWS^Gca+QRb*c z+pzBl&BDINURUhwm-EjI=3Lw`^ytmyq1Q(nI&&L#Hk~^mxYAuI{iki+k~ zNBx#2zEe)p+eNH5RYg)eqL-#$+<$EigDUBrMA6dlE_-!2Z-jEn+qcRQ{oLvzYN@8{ zuas?CmS+7|-fty!#qLvNpIade-e(+JAT7!DZLN(59!m6VbZ{&l@nkWrIh=hmb(Ld4?&U1#?{98z&El4I;f;^4IB=vt zxB}aBRFB*NeG`s9YVL71#Y^e1-c`Moeg+1G8!&#A(l$PP)rHQXeFqqr*-zhKN$Ubxtp)qog&HdGralCAm zK7NVsxijtuE;ta+cW1v@xlYVx&GUmcZVS}k%6ax{ZKu3ZN|!kC2t241%E1#$5+TagzWnK@2Ut}pCz|AkOSRrfQ1iP|iGegLY=4Fz8 zVP(QuNsY>V_XZN>^qEn&dsRG^Z;x9Pl|G6y0Zimw0NrwA+~T)m*Jdr z4|?t;|1%{)&+!)G=YkuRWDlnqe4(z=e|{PoKL!}T72l)kV&+K?UWF^>*wk)(R^eG4 zWq)L^@=4`(_@@HflzUcPfd&g(=J`6l_BgQn0mnytsn5Rqr5eD-_G*3sxURZd6sxwuektnN2YnG@y=Q0oFAYkvZqkDm;LCb+k8hlR)zPBL z+3!$5GHy<7gs(|xy6_9fv^A*5%dJ$p4!vOa~hqD(ih)cIT7is+3y&yj4$sRcI*pQDlcz48^s>6gaM5=6q`3m@Rw%SH0^*$CE=3 zJk!>_vQ|u8eW@nr{qVt>?oCT`>DHpPqG3MkgZ3#a;v>b@uXEg$6OQZU01FcvKZ0t*flO^vRd96C!JiQ1xd@3(>nDo=H2Nxbo@9@z(wg zarYjK0mpxOHwN755oh{8;mmu=X&#Ilw0_A7bZB?d$zGn8HGj9uT9MA5xB7)DIR^#x zeuTB8j#zEI;3FMA64sL8@MY!UYnjg}zrKhKep9Ajw=O;6!7{~AdwtOk`W3>B!g714 zeYNsN&zMuc-96|%ck?>jm3!JcSt2VVD_dLQslUsLUaQ@uw=k;ZNGiN3W>aXuQm-Yo z%PFV(Q6EL5+x;{S>nXsbSk_OspKq0G+7Y;Hm7V0mD39jwCm&b)>S&-e-}fJS>(yq_ z_$8!WHjlA-?M9g7G3^9>)b2xFbYZO%CvqcRisrw#p4uQ5UTZ_FFgO^T{yOcXhl<$qigQxvJR>w%uE`*UdGN)sy*5!5&YvS$LHaXVp1xw5NqTBoS>DeD8Uh^7K+)&^T9{!f5`M>TcNL6yP zy$z`!eljQ>y`=A*McHDLQn%yJpFV6YE4aYqDjjII-=OT;mpYL0^lXm%u;xDZS3iZC zylId<7VLY2({d|>tEe0jWVn1DZi({3qNL+x`awDU36Cup;IY45l_`{%V*x%d79DVH zcrnkaYi)M%>lX{=gxMU|+m_|q>Z2psr+VVT0II08_SE(I5wW7rnRf?(wQRL4R)6aC>_%C?f+ zr}Ws0lEeNz8#PKhUa7w|YH;1za4IM6am*(d;mb9Jrm=G7dj3PvEqZ2pGAI+EvcxIBD6mZHi+y zA>{L~#*c)V{Ia_ZU4bL5PzbqHUhCLopq_o~xZJ~EY8PbOdBpWz)GWD_Xlqz_^b~P7 z+)MGq4zpB`ki}+wV819gwZptS`q8 z_1hj29!V^3AveZG-RBf9OFrK?{K&}>$EwfyC5yA*-qk(T@ZV%)0ko5}y3p=L$|+}G zr|!>f@Hnx)>gh+(+tR0(Tz!sQ!W9?Y94(6tyRCX#BUr?!2i`~SE6@yORGygUz2gms z-Q`pIxZu`S$>^xO9t7C{8L`gW7Pc+*ji!fvj!wshO>Y{+M{awf)ehfZNgsKqn3DDLgh?Q;jUqnB7ap%h0L zZj_6)mpcP=QF)j@cVg!|i^&V<+%^&dVtlzJ^8O1k}|m)xrU zW!&|(oCOX+PvfM>@$ZAxmKq9RZrU8qD{2U*LE$^OYVg&Y-1g2 zU8()9=1cC`CX^yXN%prRO!vi)?gpW*lQgKJdAb`K*~M?-V92lyLHVAr;$!x|4?q3= zS$H*O$r4qQ08CfL{9eV|3-efgSKqB3KHSzlsxN(@UG$f*Qph|9&GO7g{?Fpe(_J7R zqs|+p4&k!QQY5+5^bfvm7JjN41K=edKKnhbGri!jGL?<%=K>c%Rhq=ZkHNwt6ml@`OX#f3d1EmE7rkR(Icln@yVwwi6pKdnsIAD&hDku;jgT z(O}LJa*)@)3z5vlXK@=JTRYtf74EfTk_;Ub!Rzubw zWd|jUPdtlSut+Q`OkZ|FyEXU0oC6_r+srv&QZ@-f|`E;Kp zZuLPmi(BMix8nC!1(FVHiEB?Mik4m-&etx@cwA!hxO*!!^^Y8X$oa!{=VD4t)9#~^ z-bk;~TyVQ02p&zqc`S8!(%S1}($l^v-n=`ccqHIB0jWK&xk6bYiiNg&`#`ZNwH>kc zf#b5!2dTH8h#bSIX6J}+(}oAJ4&8|r_DKw_yL!;$-0?C)=U}WNHQ@B2&)TxK+KMmY z0FkGIHo}jx?vhj7j+f@S6rdKQxrMDfeJW(>zJ6SSlGRyoYY!KO^>EE-zXo009b?mR z&<0-rWmRl-plELE&+o1qpFrxEU(h;hm?A3?spIj^2dW(EMzV0Wnxb^IFCVG?xqlGv~?8j3PnP(V78N$QTu^~ozMhmeS%5A5* zjqsOa`+lQy>gSVSzrBb5rpOMp&pxhl;@w+Ox!cE(?xtJz_nkW`ZLL2r_(r@BpJ3Xw zXcg!9`7M2E?_3{U+`T>d_TJXL(7JH9djsiSHVbhZW8z!FhjP)B&DqM&_kF^dEF`wW z=q+c+fyO#PDLZkm7MQJ#TlQ2%5&i%ktli)-rzlq{O2(qvt;=q~ywZwJ@cvxq(q)QR zP4~WenmbaA7F|43xiw}-$o`<>-Hz@HPq~xdbiOcCF5eiMpfCBb_RU)88f5KLD~I2< z&>Wi@RL?%CW;68bB=zTCbYTgdx>UR>zoIlGs-;6;)Z?|x8=(iSw%BJ3nTlKYi{nb- z-X0Sw-`Ig~&01^e zNB&{A4WpbLhT>Nd7s7jSda^kmoJ3aT&}@jwoVmD7D!rzM2TIZZ_Pdzl_YVX zt6bLVvvVY2eqBmXAzEgClA*6^#Zc}txnyCH1?R#K&UZ>NRvcOC{TWjHFhixmrBuS` zyu+)za?js8N~857k1?F74t1ZNl-E>a+&;$b50zhJ&1K3{9aTHIAr7c+w-+CmY>I35 zFq6M&fJlqrRpT6G8&2?K(o`wGMZQWs;a^FAnx+Z-t@tn<@%WLw* z+qW&cG}2+Q5~ld(a(`y9t*!n3U{n|OnTJG#f^|0IV*+L5n$_*K=neP#>*fVzynS@3 zH1UW^e6q-*Qubo~<}(R99$szQ7kkRjDY*BMh+SQ6QQ|7Hy@C$$JwC?jc;)kXC93En zW?=@V;Fv>;%XS9u-mYpgS?*w8euOc~(ZS$K3bhMDJ%(J}HwZD;ZKc1+cN7u&=@V9H ziEI}&|M;pRtCeo;wB~&GU4z8#taJJnxk69ZS3pvO0wjXZE*Zs#;*<_VZhe|}_cNhX zyM?t!`?p`;6RbD-hGjYJXvjwD+PP{;aM&$wTTDXVT<|iw|8&4>y-w<;ums?;$yLOw zv|Dd9^Lq2_Ut}^$MnpusRu$x7v$j}nAcqyK-utfO(Y$zb<%5~&O|R~fMwy4N<$FAO z2o4N6-}R{UaI9h$in;6LDf>F1Mc9%tL{+bUjXv~2D2 zB~f<@#M%xktPe8wH1*l1dC06)h(5o*wOst7%F3s?O0|wjo!YDAs&?;x*D0flsx7CU zDQ*zXFC#kbQ#p3ha%XR86Qw;%)#`Zafr8Gh^KxqSWxL-Ouidv_&(BFJYm=DqrSp5S zLuI`~Pj(_6S=+y@Nji~<@;X6rzo>+n7jA(0fa{I?^boamUc8ylsx!q4UPv0O-Iu%~ zXvyxCFGp$d`|sFZDjwMUq@TFwK>>u0tEf_ZS0s7(jmY5QiL)bp5Uzlye~HBx-oCoz z^uoB_;}+IEHFVa&&#QWKUn?|^_bze3vnbfN6F7c09beeB5yxMwu@SM_P}BK_g-5+- z^hMiKt(#k@)~(?GH(+03UnD6b!#`?XjABMc_wMxDyvocxtPfT|#>vR=0Eu_&(?@ zYZZGFl{&9*n3d}T_BrM~cuMoI*y3BLL919fqB+NHl`6?`|>FC{4r*oG-!^H2r)>m3PZ>wLi<|-Y_CKr_Eh=PPe)8hxx z{owHdqcJd?-U~6=&>slA4-$Tn=-GH|T~PUFeFOHFC=Y3wCVs7VR2Wi3>UG zL2gXLH#M^YC6{N-)3R(WfpO24UXx#DPd&+~$^U?hcdIyllEu~mXE08qQC_txok;cu_nicpKD5_EeZSAS z50F%g?Bu@cjg{{`pRbX8MUx9(E1aQQ*3{;P2nr!=A->GceLt=ilF?qG;_{&Wy|QbC zjH}zWSRGBe)Z2aOY|iWFxp?~EqBcKyGwnC~Nr#6G{Y2y<5A9x8kOdD#r(wT(iKaQZcjfx?#o=S>V$}>fA~J~Q-`pP=)DjPa1O7m zqM-9|>mqNMq{{goy&M=ReZgY`Q!m)T8vQu0|3}q($FsS=f53LA5u?W_5?e>?9$P3{ zl+tm&EmeC&EA|Q!yGD%|tx-f3)t+jtHul~PVpNUTdlOrNK6lUWdH#6r7kRyq`~H0L zaqa7UU6;r35*P@mhK9!9>N2>AOsoBC%jE#I+x}Kha=xP`!*86!SS8TsXxq;jcu>db zNHR;CvI+w0#IDeNk?ZCXh`fNfq`7XcU z&5EU76)n5oYU5;{n2z!!Fjw4^M7jypMSNx8B=wqF?!EF4$sEDHW_n&8iaFf=Jhs$e zI9uz|*vVNL-iP|Lzk3N<}S@fOmPSw{s`86DuU2Ij7fG*)F=&IIMI?Ch6Mvb+ku zuRUSYadWQYF3wLi$~x*WXp%k+jW}z)GAZK_f3=b<1Y*y&&t~G{Tfh{%;ipRu#Q~QkmONXj zkE6*0dzn?dTy7QP`Hq+npZ$2;Kwc|JC64}H! zrc7tXxY&x?>$@|x*`XiNna{3BzBt<4#jndAbHj6I zDtPi|@(aeYBlt)SN48|a|F$ZM?QsXp2fx~(n`Q=q1wt*)Yz@CIm>7J$mGuMvWTI$o zC)h`X{zyChiQ;Vdnvj3^T;!0-rE77#g4Jb&PzjC+Hpw0B=Cs}1;@(Q7O(>ANYa;G6 zyZ)eEh1_wu=sE|q+sk;xON21n4``V1m7T$uSd_%WM{&BvXf{LNqcCw29qmSt$%m$> zqi^oAujcxbmmr7)+HvIICDnVG0o`w2PU}{s@$e8UK~cNV^0THx!4{co@l;;zq409hDQ`x4pvg8s(yT zm~Fvy7hhk@|2C2#~d~kT%E(jZWirii#7t}g@un$N$qxWF0 zDK0THR#c%Yd$J-|1Bwuo=h(j~lLb(MrulE0T5ZA^A2Rlm4B%)1-oI_wj$yS zA=wP?Rm{lI3Jt(jO*JiXTJfn33@5s6^b$(mrd+YM->n2;sFU+ z+Ij|L)}R-t!hdiJU!%0)(s=uc!myB#!?$3^UdPY7AEqX4jd9sV(9)> zL)0T#zGU{Ee4l4c^|x4G`YX49zELCP-9D5R`lj{S^N*Yw9eIUE4x_HG`#c`y&qA`@ z&51wP)ZJyOK6X@Y^CDN>4n&g4+{%fu{rL1)Q32e26pwlCYz%9j~i%mZ)M@(yz1m%@j(H z-Jrt@y|xeB%g#NX0(@R?M29_|j7Mc$Xy6CS9$mGZ^5QXl#(i+>m4Q^j%>c1h^!?l| zQ`uAP{A+t=ik1Yh_Y*5-cfk)8URN=Z&)aX8^o#do%1ZWhwqyu8G&74Bb%I=E9aWPv zeJ;~VI7$n~a0$@!NZm!is%Mva3ro&1ncikB14)B$ngeq;T$Yy`9@9CW+0c*BT;w$8 zf6PS(Qzcq(SVs~zK>t3e{41L_UTTNl^ZMkq(f?)TIX(i9g_(r)Eq8}|O9ceem*dpS z#6LAxx|J)WTC-NTG1hjr(Kig^#Qb({Jo+iyBiqmS>8_Xmrgs>$gfE}5Gca~f=Cqbs zDLxBv@pu8V+?v@w5Q}`oOvVq#juvXzi2MK3*18Nb_8r&FUFmhuJjSQ%iOFCphwRmr zj+2DO1&}1?Ojvlkcly0ZBmcMm$jFZ;7?u(weMz&^rR8y8ki!Lq;qC5bjPbIibzj8g zx?Z0s_Rcw%MTxgQ=POYar~-(fz14D}B~v-qWCkCy#?N!qUVNZ|Cr*v>WtG!RSo|l| z!Kh20Q_g=u)(Rs!@9>VZLE{HcfYf-xb95@#Nv2@@Gb5Ftx_?~n*cHYIsfd^yU`pbg zL&*K7yjf!oviz<;nT-598uVr$B#(*|@)w~>HIis>U-Fx2bQb-PZxRmXh$Qje`ayz=O_8p;PFxQtLvJjz^{n{bX%Sha*yxGomelFcqLaoM-*yrd} zS++o5)QR|IQP!iVuc{}wKcvl-0{mpti>4-z^cvLdRc@)`wkM;lA&0S|qzRnSH3U%Qb+0rU$ccP=29? zq_isCe$T3+fV#yVy9NUPlMx5vYDcNGQY{9kf4SxP{_$g-@Pcm97MS8J%U@>Wb|2ht ze|%PN)aJAy82HWfY5-@T65c?C_S;DJL99HM`uj*$BdO$1M4g)lZKtDCO#(CnArQPl)O!h zr{{CvG!n06Bt#3&@APH{`3K6~(u7bQO^&tvjp#3PH}}5Yn_oJ1xbCIj$OA$q?Pgg( z|IyU&h&6`^MQB6^@LgA$%^lSp%k4q#yrx?G@f#ZbNp4wH`6EYf)PQ2j&>ga8=+60t zh=U6Q-frB@k}-+Q`UE2LxbXIg|1JMI*7rd*O!QI4Mpy1xg~i`{Ma{aQ_!uY3+EC({ zrmngmyYsJRTRTpAN^9E8f12vE;n+Y&uk=BErS-(dRr?122GA z-E@4;VdqrRob36=&eXWBXWDnJHVf&U_hS0?!MoO~FD~V8#n+@A)$A)bpZ!V=ROUQM zXXscp7tC^+MAZoO_8t<{J*Hwpxz8u`+3FCFi7ad5NvKzDWk^;*35}K+vFh$$xwV=ZgX--j6e_yG*}DO7OpxpI_eC-N?K&J(oojw3mVC_Z?_!hgywFr(nl$<&$g z<~D9Yk}@2lHkB>Xz9ytAc814h_6D`0Vmysp>ovJfR+*#wd4<1xdF{0N{t1EOJ|oC> zb9Yrqt9VR<%ZG!7b|qLAk=Z31(U93SeB8E$b*zHy_+ z)5A(W(LDWDZ&mgaWi<;Do2ab0nVc@uy!^6mXHQg@7TqeHGh*Y&X2mSlUDlM`8EDB# z=&SO3d%OL6zwbTwF z_%9^)D1^rrA;su~e41z4fhVNkZ2-H_w0xM@mR54`=DPI+C&KXj>^rqODb-9priFDN zKx*o%x}$R23t{JF+LEuz`d5X1^$PP}HOxK#E8WJ9;~ow-FnC3O)~V7Bm<}8yE>WXF znegQY=(p(+y0MYxrwC=zYN?L)x^p-3UPw(NmvDi6G+!cVq&u)&>fa~79y>q!@BLN( z`rN{Bnz^CQ9mES}rz1iK4C9B4)TKwbwgbUUGd0Yshe0$Pr5;^7 zGzY?eO$TW|HmHRY(lHh1jX2?rM(~{Iz_VClg_fk=2H4N$V+gPIJ>XQHxfvnGcBTVBiyY@8K_T(E7Vcj@XCh!SEqNi_l$-yooM=3|3Z!*$Z31`v`F zhwouZ)GHw}Rqt(Ug1M=!*4LiIrB>^SCT7*1mK@`vs60CnTU%PVr9Z&ONuCL!umzTv zq~;Bo0TTkOtQlA?XSuEvGKXm^*ln5xu9}s@DL@GqDdanqc9r@n*i~V{YVZ)Sz!gA4GJUVM?Ip68sV3D7V zwvQ>?qHS^DRocIvclFX)@8{8ifjoOmIYs!*oA2Q5Ck5Lc-x_rTIF4w1R<)M^h>M6R zDweY_&2*{JS}F9CgVaqeLpq78^xsSCv2*YB~)eqr>TbIOcs2}QCV+~`9KOG z+6*~N``qAz3s-%el+d-LMXo(_<1b9xJZ_pA2OzDVW(n%>g@TyPP!&$KNY-gHX3}C| z9-;wgl#LbK24RmxK4mR#<~B-NOU;PxR&Fi^E1nNv=%|%jTL~>=7nVvX^AV2(>f!_3 zoya@4ca=651Lan)t$d}{ZB2?V48*44)32m;nM83{$4ZlHt)_KPu$9T@cTnJZ?B97P z%r~7-dLZYm-Pe}QJe#@DYtA8l$jS~+zv>@r*)X-($g@R%Fo);+=qtV>-iIJzxn?nC zO~}osEI*~?yBFG(Z(uWPpxI_>Q}AIt>G;Uv$ZI4I$qtN?=HxhLvYG?as(iI<%AV3L zQbP;@L(FSt5ffc9DLy&ldtu{P-@JxTdAFwEV+L4lJsW>bHmYawbCvX#A5ZFJ`ji8A z0*~4{Z&9vLKS7u<^~l1d!uoN;IZw=fNO>032mUfo^jPQE?fY8QWzQPz4~1OA@N9MI z8sUZMs;3k$6IlQ5VytD6SeFaMF#V^SqxIe0#N z4eayhJr$aPh_?r5(CeNi|Kch@5be|eG&BwoBWR8m{0#C)&$A8`Ji30gSwYa&iFX5V z+hOQVvoGv*sF`xyZ<+w$jw24=|3hD&yHu{vRAHO?f73hxR!S#&40-{!PQVDT?ouUb z^8YdqMn`1I{c~FwBqqo7bhLZ{@gAbZD zcoSe`_=MU3g&p9xKI%Z@e6PVo)@F>$zB0*e-_k9n^&n(x#w#fAd2;a8qdS;n>cFZW zJaM&4j~Mdqn7o-l6+OC3)d7S&n05(a03<>3jB|O`K^?%+*9sSmL!ICUAd_{>6<>ln z2$y$XOJx;U^2jH1AF$adkAdg)`f7q+9|Qp(_F(5HbqLb7 zYV2;@JT)U3`pu&$IPgQNJ@D^BYYv$tlL$b))fu(qe z&j{5AZRu8;*a*~!x{<>gUz}HCUQlfhX8vA3ZzUZB15)u*X-*SLdAej`;yb1~Xa@+? z%55mL`z*>?t>LK~9w|*$1?7wmZy8kOjxOibie=Z`l z8KXT&o!{-k9)Jr|4YrBfBG5|n-iGntG&=D)vJGN#~wTZ?N>p z7eKtkR^rc9hX|jy0(HC3w;-H;l71J5vc~mHGY)EQjjNQ@o&Ym{;)`>bv{ZZH^iGd(Ui>U++?f>8V5c>{!#m;G9s-%t#BJbc-DG4~AxEjH zJx=L9Wk1ln8zhn4v!*5hrm)$cT-u}*yFFs%kA}&gC;d@eXC0!xlBmgg)a#%lfQ=|} z&=wNPUYpHZSXFC!$buLT3C7{bk&Nk{J#C{j8Pd;V2!JSxFXFD`Eav-o>NfdtTYO`% zrSS`PX&hA*oaape%OA^qu?bH%2eu?Od%WkT^w@ki@idGIik3+~YsV#|8sYxZUe^9^ zN2eWR)a%#d&4M2-)X&;JVIHS4Lu;HpG=B8*g=SbtHtyP7)^bS1_6oQse_HBbCQcw7^R0 z7KkwNk*uWuV>(c;_)%|TNkzY=jj}#pF1{~Aux<4WQ-1(3^%}rfYjHoKHC{p{p;Pt9 zN~PzNQ@eL3sYj>f->f9-%*QyZtxA%7qjXvjjlAcV-W)Pe;B+K=Il+~Us?0t+E~*|* zBxJa4B;Baf2QTCs@Bj>#Q}8zyU#*v(483`H3gh7(I|!W1at~5TOh;T)LubxHkI!y{ z5As`|wv{j@JDAe=`|)nIPmhd*$k`ed<#^;*N7fM`q71NR^oy{gP^NpvCWWxAf^@$PNe ztcQjUl%aGa!~J?LJ&O7q;fKuBr$Ljn{qLGev@7n@z+VQJM&Zi{0%m-sJbLgd6x4WC z;OF$yi}zA%+tWTdlv1!wJF&Rz99_9-uG&-FhL$Idte`LgXG?L1QGRDpbq8l%5}xT= z{X}5~?`cNYwI#ss)T4yjhFG&WZSLg`6OfQoD_?v*^cM5IeCxTJ>SaaB zP>KGR#V@OobUdrSM!TvJ#wJChh9Z)LRxfez2y41xsTzWfOo7<_9ei%1$e5R@FmxL4 zDrowcpHlR4s`N(Cf>hw9+@W^UYN*-F&RO7P=}(OwlU|CMYO@RTniRACD|%1_Aol-! z8#&?1A=*l?R70#WFoGxmlYpDbHHW|kGG#J@aD5UCWmi_m*+kcmT?CpbDqAN>Z0ODa zyF=yp52A4&bgKOYj)n8?6H5YjKpv6jTN>-l1MQV$)`{OVYIoGN_w7!G<=YNr-KtH| zdX2fz4eSmDI($q`Y8Ie_gV)sg?paID&ypc2rz_AR(NjV{Lk8BNd*(Eua5TU@8NF1h za&Ye>3u@QqYS#1Q4V4j+0?3UnFgpn}v`4fYj#WHOt6-dBhWVFeX6*++2AXg;{hl8z z8h5%SY4OV7_mLs?XLa)4y-<&HqhN7A^(wvUbyl^7csq)ZR^xk_6@W;ZnpUlKQ4Vs< zdha;{+|bGy9&WA9t8f^Ab@L@uKLkc_p| zLovqTmw!3mUHNC)>W*y*bK2*S2fy%<_8HG@*TvTY5hYA_)>$R!o%=o0Bc|n4lEiyG zM%a$DFiP{mZi{!khx8grvRl#vWUOlUcfHFABvPBqf> zYzMro=-`#hG*iS)G1&;i6t8WDSuRTmm#FTG$W~{KcKBQ62Tj{NL{mxt5EH1JnU>Ss z%KXr2%zwA4Y0wiIg{#jHE7j|KOFqi4{~<3Ul;v^p-9EVvzT5x2v}O`B|| z`8`3zW2+4B!GOR*vzH$8Q{QLFWut=@Py5n6Q#bv7_(_X4^^F(Fu_If`_H^trjEBV= zcu1r(^Oy@3vn%MScNu3rN^7jcB{4;~Ohq{%5cb`z=Fh}WI97~0aI$y_k~r+wn8tU0 z`Pk!dwx+_J=^#0|d{QWjwZC$2hc!PCtZ|q5@9UH|fPfsCyh8Fo&A3ag`>TY7K(K~-34*bM3qqF7U z;8~ocoU-SP(vzC~LOEcDh`>Y(|8{+&^r3_Jl11(2MT)uTxw(d~&?^YjouV;~SM%}8 zU`}+WxRzdv~xQ6z5k=rJh9oVY66$q&*>L3SS*CSiPvZ3x(;)S&rD9=Zmfqo_6xdR64;oZ z;0SD#jvMN=fGV)C9xTSmXl$=e&kM4!e&1))L@b?gKi|;wR2?e@4jV8gL>tVaZcLIW z-`PY$L@zR;4+W6_B&$dAa{Zh;C4#S&b)7u95-?|W!S~ojw?F>2m%k3CENGvW3Gl>QWuE@q${gxQ{9mCz1{yV|?6k{MxaQtkN$4pmkY!JR zp&}evSxYHmrxI3{+kVR&|I!QPu;5kKoC?}$!lSk2#I@Riwji*ek|lO5zL!0#^`_J1 z3PlSaMKKG@rR{FX^RZ7 za6SvEbS@8LTfnPW^V znn}U(ZHja!uG5USd!92J@^GBeu`Vvmp4w2CPEvzP!%nhBJMRjE%?nEtG}~8zhV?(i zL6yLK*KG4yl4%bEvD2iiWK{&?W_go!`#{D-ih?VaB=78L=M*G(77-o_zP zn|VsqbW*u1vURlXBPS;(k3M@{9s_iR4U`QHLFk1l2T?8GY+Is|HodpI5^&i{tWTZ( z6*ijVQO8xAAN>WF~d9IiElnNuL^b$rB{}zo*7?np^f@GDYNyGre8i>^xUjL@3k`AZU$;FnU&Rg zcU;v+gkz$<$7nhpVs67}Cd7}q0hcBg6yYYzDrLEE{iazcyq6Uj&>;YT4fB4}JYFqb zgH}G6upfgAec@<%tIGcU>r)1Rz*2mAiJGB4;Y1!z2~kDgz4Ei3Al!L+&kW(BeN#^V zu+co5V!4~_7fm|cx{)3j&#bc^!g@!1r|3UhIV4WLd-5RhR5R!Pg-t& zoUTCU+f?{I=COjgNe>;(f_t2=*p<#zktQtrOpNpH70&cGlMq#pdS{bRRjTd8anyC4rTN zl~u?`JQ{^iYwN(D-{`dPH|+;Nh@abt3gCbE+M|>e6*8VSeOBTre(=<-gys5gnvS1r zGrY0;!ivB8pZsdwKBS2@59hCG6ZrRz@a+L}pdKJ~2Hv=L{D*Mb{@IHAJLO5d|9Eq% z>wJrS{|Hq=BF1x6ag3GTxFIkw&k$n`FUYANNXJZzP*~1k<~5zXo)b^I48;|l&2HC8 zSfw^`K3;73Wk09#{f+?opInEIQMCf8q*9hc$GlF9H&acAAwnl0Z%yVK)#Dp>nUg2Q zLJ1hzfiWg^$%kzPln&{MJHbf6GA<}^)e^r-RkrUh=yAV;z#i8B?@MZK`5t!1M)8=;+aJnt9DQUi0J1=cv<#D;WKUqi(fnS0Q44$LSIK{^2p5@KWWw z@FIfh?vXz!U^ilj?QF^X=w1cGQHn6x?3Er*gIVB~RB%ViPh1GH|BSEzeh2aydnLyn zexcb%mR_LzK<9zhT^SW7uORh~QLO*`n&IM_)xWv#=ksYG?xGSAPq!s-1(eY%#d=dc z1Vv-BS9W`&*QvAcF`E(lX+3f)8?4iIdgEtY$c4?3cyVkZe&pTr7ZYVMZ<#}VRAR(j z^uE3L@J&Jftl+h8R&HJ7B`BTEC%eC0yq71Ww$cSHYgm+m^$xTVN+=%GNsFI_9X&fZ8;=mIcK703F&x;}?Mq(ZdX z`spjZ3}SnJMu_CqgS-3hLBWO6{n`R^t5)Q(KZh;bVD+Yede``=S-a`CWJ?2!Hg_;j zxX5jB`;7~?5XZMqc^`~cMFc0bPi43)l#F%eH` zy5zcGCH+q`jubS*Gh2)4#k52G#E*K^8?HeXk)1-ZYbCNt#lplD>|BmQ+sO-}0Y>B0 zF*w)q&RwKXFxeOR!S1IjTsC&S?ItG;YX>^rj#_cM2tj*Hv1~$BBf;-zQ z9I6Hl5amI;S_CzMhb@y{N0k{ld+OejsGWf&vs2pc-8I6}&(q|yM@}<6=aMXWpO^ec z^BGPh1nYSrK!s)OfD)?J_GMD32~)HvsHXBGKGAlX_2vwVeu$X*yRoRhx}6=9hCk0i zn9);_s^Yuj6ehyC*}8rWgY?s{N#k{XSRrc5s;UUBdPjh`z8hb&BbK1f|GdI+XswNq z?s#Y0Z;yCWK)M{a$%S1J@%#Dh$aC|Xc6@D}VOCS%izfK(u#q*^38WAhR{9oqsxr_+a8GBW3P{lMA%*g`%Bk=*3E7vsO$ z_ONZIjT!NJXPB%*kC<&xyRoj8K}3o2aNl@bIX-~h&!fjTQ1uZbnJb#M%(AmYOqk>W z=G*mA)Bwts1GP(mvXMn)-o8)1R+mI76=d0oT#f+FhZlM7p2i-Q(36y%&s^;nC9JMv~=G>ng2AeAs!~ z?N*TzTin7YPxqOKvJ7N5u_v$$Y1>Jxj&!)i2^~m(sw8a*Oug&+1fttd-EL(t*4^9g z7%8YeEXviVlVfubmK$}p&|1WlEN)i(AeE@j8;cd4Ef|GD1o8q`dQ!*Cw4F_BbGHQj zl^yl-_r--?Yxpe5KH1f*-YxjF5Z>=j5(wZG@Ktngwn%B=8WazU9?4OP^K0c3=@+R< ztLjnN;u)?1`e_)@5pQ`RGBVegCVCdm77_mE+5~~Q^C_fD%LCib2%m82#Im03&gAX` zrl5f75EBIR-?bkOP=ZyyzO})*MUjQYEVZ0qAuX=hg)NU?GyVeZch%(Ui3!UARdZUf z82%tf!>4$b$_vjinBQ4BPMNlH`)jT(+7OW8NsD&E0RpenT|w^*iZMHahC6;bwmDZ| zT+e;O49)3Gi?xzjcKBaelfDk$IZ?iF?5aZKLu=U9P%E)^!_G)RI^1kys>% zY-`t-?0=|{?h@M8@}Nf=lpLoTjjS-HTiDq-;kN%TnE}MxW_SZ3ScuvtI*9oYcQlS* z12QEbK;8ZSzlhreI0ZMjFxA=5j6ux0H3H%D(54b9awHLZ3D49CTwNsoP6{y?*h|l! z0IeJT|9eE`y7JJ>HWM#!LHmQs${m2-l5@Xl3|u`xKdm_e&IKfM;KhlH*aJrkj0wd= z&x0b*0>c{R8G6uzkG}&mX-DwqcG#UxpzrSgJs5c1`?Ep?iN_5OEp|M{-XWbYkOD3L zTXx*|^Z)I=u5yBgP5bU{8al|Jt0XBPlG=ga2LSiLo%R2{ljK&2pZI^THXgUC)yyn8 ztkK+t_<+H2V0NH|+p!9nNiZY_f!Fkz+W_mG&nn42CBgpNg-7Y1M^q*L_k&wiN=$Cm z>h#yXWKUwA%WoPK8$}>5|Nh#76>1v%p0j>h%3{MhhT4o6=)>jWXM+D*e#Xq(K!Bf# zKb9g<@99sCgifst?Vf|rLqq5J5iriR=C%VQRj)FV+Dx&AzOxGL{Y{g^B*;cIqTHGka=zZ;^rIt|7_`+!cN(9sKtn8B2%EV6MM zn%b;gt9RVeEknyQfS_p8aZ?$6ER4c~!qA;OJ)rncgA&gI1_;_YRO^E3IxqIA_tXEZ zMZg#4$rP?EC!pjY)OC~{Prk9*ffYCi)&XZ5E!Be;;aHZl9gW{K>4W0S3|2C`(+bGu zFQY;<%y>&Eu9t9*1$Oag`(3{fgD{763;ERyOan%Gu`%tm@xjZ2-uS5|0kHpgX^J~p zv<{C#1z?Fv(&FQn6D>VvO7NsZ;QxF+va&F^F!`tlR0ZT9PEnW0Wy5CBOo{<`aTQur zFdrBi3V>S1L+f6wDqBVGcQ=^TIJri{wTOtA<;XMI5h` zD|5v8C=B32qK7$9j6dd)RiCexo~xIC>QMxn(-x&_|GWSkxZgAt)#_E&dI)~g;#aMz zwH)-N@1LV?ZJ(st*u*hrtE{~S=nemncQ~9fQZ*NQtCk3OoFWilG+LuKiZo zoC7;c@R-+UA(cSR>rXVg3z#Ju=5bx10;N3U%&U9izK=rO$FQF8ohHFHeEY_ z$B^@C@}z+yf}Yn0?BA#`#hP$>O5I{?^274iwEG<)Mo?7;h;K1#r_slvnTMA3#E~n} zU+S#j$=3b=n9t8WuFW(9wmJElTE z;V!UQFoA%VALq2%5(J%ccjAhZU_Awl5{sVo@WlNSh|R;AsnU4xGa%){5w^K(+^9V&(Bb zm!(&0Ert29m?!;VGP)A?w)Ib-cTTDCKkF9bjXxdIJSxpN7L2qdJg#5v6Bfu-?npq# z5Ng6a9y=V^QvfgbU<*HC>U3e*ooP2~H8F-&gm}E3QKLKPP+1#$u72Dj6_6MWo12Ad zYSt^h*HQ^FVuH_}H52LE&;7$QQ&-ow7|TK>32kYmT_|J)QLk-#)dpB`6@lw@c4QtK zSHiDviHtcm$zDNc^|j#JKi2y zn3O-gpc)GZ!Fl+*=h7k5Z-3J)RfY9SSO6W!>${acb;rob3x9~5i>+ZkI|51oC!Pa= zl#L6y)$vUs<<^$I2tLQC+*UvO^#R18-2pKkwjefLOr#U40Uas_sxm!k3RS4Gwr@BD zEoQ-H2J|(#Ibt52bx<{D4g3Zxc=)FcK+6aLr*uzT=PO`ky!C^)k;Mwr&C2Mij1bWk z>#ZsWmc+8EzazMycZl_R;NeD9#MlY=h?FhN>g+y_elS~JUt7!ijZ{^A4f&e1!{6wz zZ@LF$>@5U5*gW=GyC|QYnKdgR3#y#3H{{r;2X7S#$L~uG-;#iwuKI z`3LwuBu~I6DpVyZFk0GGPKqn+&{>cn7*AtSt=#3oCL{#S&Ouz;6f3>3tPuZ@%mlLS zQH>F|cyvjl$`CFp_fS8}g+J*Q14jHr0;92v_;sH7ifn>`%T2iFu&X$Y)?^dowPK}l z%KhZ{W$nKg)G%+Ek;bEJaq?w;JK z4G$D__AL{cojoi4Pvf8290OWt=JWtw5YR*bxw!CWMzaVp5qY;$u(wC2K0D7|4Su=d zc+20ruZ$YZpP%>4hAKzp72*whi(>8O>rNZ1?+B}Nfmk-1*M(&~yhMByAQL>H(3}J% zVq#wZU9TwhK~X?=%Wo+x^;A9Qo-XN|(Dxn_8d(KvLU!3Rk?1rW$uIa#OuKMkJZ+iM zfn;oWs@Z3*uIps84> z9w#TttAxEzTX#}Fzuu}27dv&!=BZrO{)3_(`C|-TG_W^urxHr&Wc$c%a1R{A?(y^1 z!=y>cbl5FKSlej5#{k-0-&yx7D=6Yu0g2gZ%u>(cLC=Nq?)N*oC;O`6z7L)+Euu(K>Bo?> zvAuGAW4}}4|4}w28}JJ6C+QHA1oqLpQqw$$tgGuJXJb_nN;IZz|1ewh6y3C`e{BE4 z-h)|Oo~N+j{iWL^>1;HN)uQv%`K_>STUD6iWX5CGfc^19`0g3>OndsG0asQfInU3A zUgNv{F6Lc$1yMl2@p)p|T6VudwF06Au!U$A%65G5Yi4{47w9@SE3dU+`RRsZjxAJSLwdK^CPKbhcJ+mMWC^o%A;WvVW!M?g>zLPz|T_q6Bc zLB}fL3zGYZOrU6~cgTCz08fnG>^CD8e-n4T71`5i!#pk_k)DyIGK!}L?6B*d<$E!Y zcqYAU?jCv5)UNyAw#3;N)M9586e{+LunY#U%b_#Wb09TtCN|g4q1h2-DkCiKC%qpt zP?VWdFDPX#ft^Rm2)HKHr5W+{MYgFYF40sGCENuA$}pMuTKZ*m_R=H#wW1LdGlr1h zeo}LzbZQ_ZT0AUr(}rhdqQ9g{x_AUxzJtw!JE;!aMzKexZ_*J&QCh{fYcAWG>c$M0 z?>EWOUD6S^RbXjFxn(@^RL7~kugFTXUt09i`!J!uS~O&DeObNN8<_DDsb=ETd<@Z6 zSo;3QgD0%OSqt~;&aB>hOB<4}t`CWX%<7T-7iwYzx*m{BRbvK@?)WI8TUt(c1U-a1 z$eLVA4Bk0hj+~hIc{EkuHT>|Y5%TXG!FI-k@?=gY{C*1H`r(Nmc8NXUO3*0_aae5=Z2r*b zk?crglcjePA`@BO;}q*xc#z(+$JiC(B2P7HXpVO!`vVT9wgejDJqYG01Smjq2{R%yrn?CE&;zWDVhl#f+3x zAYc&D5s~`aU(FdHC}Ho;lXpyXKm>s;uAKCdU}Xb~>3#5JWk`2KK~+^-(hYwvb3CQg z0P@S`6^Hnlq>r}^>!N7jT}dNahNsCHQZPA$(+kWbU_3SZ0JX`|Cnv7u9G|Kz9shu1d>GMz$LL zxRoNLt@Gj%&j+ieWCtm?p8@76UkX^|lX9HW$y0fK76<1^w>B$!;LiUR_R% zDwndwS=X`_N@){om${e~ODRk>t_yT{GyNr>`HkkwD1L9N+-@+yy>7)gZ7Qt$JMOTSr_14EF!9_17nOX08-?h%BclvCadIJY>k*F|)EQk>a1KK{Rt*vbY1p2HJl+rf(ImXR+ z*sy6*brw_&ZLT>+#h7LEXulZdtTL<40~`ezw09-X;kfi z6C^ZG?d*+(gYF>nL{j;;N|01!!qkTJiDbq-)rAxsRr?5t40qv3M>VT|pk%)>o>J&2WjdH6zo|Y1(O?+s}rqbD4m3N|h%3 zwgC|kiiZg3$(^n}N3S*6%oCN8G4zQ$h45bXP=k98I^|s1H`;8ntQ-CZaGY{5@Lndt zAA;tJjp8Di{C12ljCQBg+(&rOP6M4y+Zv0ykxPTsM<_;yJ00ZQDe{icg5cWXZ#xv^ zRKymOLytLp8fs}ELmBnWV2SS$H`LdYRp+>Ogtl4zc38QBNl+h##KNW0H#g}KLPx{9 zU-Uz5P0fWWpvnskW}Vaxoy4x2&}>^9p4fx7r5$Gs%BbsQXv2|yc6Y|jWG`e>p}AM=1& z&TKkTYaLu61CQGa?57kv8Vyf~ovGk(_}@74VVnuZI;(TPbIbt%5tEV$Z8FJ z2Mu1%+gQwoPjuMb={~c54RVL@D4e+rj!0DR?NFYg=X~FvbLq1uxSUBJu|m`!4=CQA zejHACOVcl5qbc5f^cOXeYGlgWs*}RX0ia?b8(@izMjT0w5&kz#cP9T=`BPU8cC7ar zDZt)qeF49A`8;of(1&cqh*8pWZK~^>dqWunoZeA0GMwY&dCak(IaERUFb9kXl8j*i zc4!4*0ETl*z@D@UwpKozh{Gm(^kW~j+M%U6rok8}JxlZV*$rG61>qdxY(rgBKYV0` zcx|K=JAeV;$VoBevAR8zlY4=9*8pl1W%4?&RkcEMG^9;5furb1PHLYDhte{A&>TB{ z+(GlPJAqV*Y9o2MoYVp%Ex!*L??OF}A(B&K#CBYG0LlH@?#^gHnR-m{m^U%)H>4=mxA7 z%Mu<@*&)SbgfXeZTf8=+9fbku%1+uLe(NXxrc|I{SmsU2N7$KJj}-#CjSaribd8c> z-vS!a$jR2744#yHWN7CmDT0uz4dv8w#lreX8m5ebuH%iE z=^KB@)W8fl3cQAKDD0iK5FZN1Vx|d$d~htqO%}Fm5n86Y`yFN+i*yI)*wy=X6lzEa z$+J#Z^vg05_+JC3eO-b0IGqs$Pe3Al=epZ84V%5eM$GJI&rg+(?r`CMq&8wsDoF4! z4+3s`2RM0_@TrpF4C515wJ4JDeboZ7nBU;6c2F0xCo(Uh8@tF*v{; z@Bp+Fb__&MZb^zx8Fh*AU}nu+OH`=kfgHTEC$X>g}x& z&^Ug~CuoiD_~bJbYIG0s3G$VFoBw`>dx%_HEOZ8^t!CnprAfbSr2v4j+nTRxh5>EK zoaP$Ws?_w+tuj|1HR|%HMWc`l#W8Nybry;IYEnM19(VI!q$VfIw}oTzeK)?`15cC4 z=1dRh3!V%~z$o$_K~-16pJZvtXOu>YK$kFzFAP6mvR%?a@8N|k+;I4vDB~bQu&#nx z$Bb&)(>q|i)VMoZ-CQb`o`5fme|*BCr#@T)T|$OFO<6?zOyN1xa!RY2BIzQA+*T9E zbVoAYsQ@q=16B`pbX_KCxJBpupk;#9Oc-`{$Uf)%F|EdhP|ks64_~h-#jjsF5qbP5u=ky>plu{Q4B)a-obOa#pNJK)#U3Yt&Z$a+i9FU{b zCe>q+AKsLh_eqOnr(pamPbEIdh2f_U+7H!K7Z*H$tmIhY^&Z)XMDH;u%rl3xX;v2kAs_A zv`(kC7Q-TjVOHqTA_nxqN-B0`1lNHp73n_r5X~_UL?sxGF>I1LIU231JParqae#** z;3G%IZEK?pAa1@1$6#eQ*X-2^Jp3S3c8y)be#Ifo-Y9Q$3Au{^oQH)mlrlvBA*103 zP_VDiolR{Y&w12R@`aJOa}3*P%;}{WzJar$FtM7Xxpj_2TmZ=^3bDw+1Df-x+*ru8 zcQyn_yal0|)1AW&`I`PVOs7NVSVI(dfyz+pl zz9w6SQb#cZTw8Um9Vr^_T|51|3u&L6&QK7ynH9sIc)&4S{TPv<4QV-nD^73%2xG&` z^743gOnu8~A24ICO$M~Kk_<=ZWQ>}&ijGTSk6!^}Xt*)l~-=^U%J; zfhPUfPUkdL^Y-RIkJTTC*R111w))))L#s89k#TF(R>>vgv^Ee{?*W-?emb44stcjQ z@s}GLb|WM-sQjnpefImHWcum1TEg$&h+hqwtNMOiA-@{@MkN*qD2cW8V`TMzOh&B_ z_vroHx~>lYM^$6Lg#43Z06C9cpc!JgZR@Gnf95AmE`WWF8U?mts?(&<+qe*$yG$nMT9<(X$4^#g^g zkEqx@XhokeutlL_{=5n7k%qqQlaRWP;IwKwpZcMvU;ZE37;xgj>K%&@p;KQYY>Q@g z!+{2kV2l6Mta?(=_8#CdOsmNj$NmgDF!1BC_)$&m!JXX!C?m-EjA|MK?AG&_|n@p>3=RP{lud1Id}1#5#EEd53p5VW83xld97V8EAJ!{r+8F+2C?7INGqQtL z#z+Hkgn;t!Y`CpB57wZMq;0>R=Lq9(<85-tAu)=Zi1rIxe|W%Cf`h97<}_4wRFj&M zE#`{@Dn<;2t12~5LehJ)f!)J~K%cERvSFi|%9yh);ly6Ukq*#+&NuM|ZI>xXKRnPi z@z=(zC)F*NaTs3UCnm5Q>ZGj-A(G@OpYH{WBdgtj766rLy6XRj%=+gA?1b!BIgJ!a z@n^zUcDZdocjs4+5Ur8Uws~ctdZA&Vs*vu`P{g<{M$W&Qs@#}%Bz-vQfzJlD0d2Bh zAiS25U4@jitybG3XY%*$r*}0qj+oiOKdNPP;hh*ztvTgwxXzfakvdkW6KzojJ_8P; zBFkDxMyBT0YjUAS@g%_aABL$=o?-ZjliI-2^=g^}4O^^4TH}~4ch?I!28WoUGzZ*2 za~|f$`==+Vet;Ms=#5=j)shHXyk%A3YJuPDeBcL+xqk&1-T`~-)906 zkbjLbtaf?M1Uip`smK{dx>*CjF+i3JEW;NuT<-YnRbl}!mVx>jAgf1PT28nr+hAuK z6h1F?&$-?3^HDXV3K&1HfIE>^O+L~Vq&2?zKYw0L)wcJ@yVXa<9aWH^4c6e)%G3;U zw=Omjnm7$>_zZ&?CJ^Na4hM<92!>ydJC8!r7Uq`vL-FE3X97Wk(B$Jpz!hn~zDVW* z@B--c$qb!=n9GT-8Q4MLvk^2F(El)IZY#m|+1+~1fPr~sC`VC|Ly^r{=m1K`0k{>S z6uLJ6dK+m4_lQeu*gj^Z-AQl-$IZb(<%Jw#9{3f=zo!TVCp117@XH>!jWgA6?`xyL zSppHZ)0KVp9+_ypjio_QKHQ*_`sW6K8CKF(w8I1A7>y(788$=ghy7Ipj6t81LPz-w z&L0;r3LJz(cd0UWI<&Niw4bTidt`0?X~F_9VDx~WY(XDlj56>w3BWG7ZyP;tShn=5 zF}0!_XrFAb&&h*%xg}`5m5=*gK%a>V;2hQ+jIsx6LmRK4AZK>Zy%js~t0rTu-6fa_ zc4c`(7(@G&-m=V`+$l3()J6-GTW$v9!uN3cn3*r|fV4!VxB(}Ii*Ya^W(}$8fC+$p z?U9A}t?~o$J2TuF&EAo$4K;yM{G`tG4Kd{d5l0n79eX1wCa1K5m!wKj3 zMX_3JJ4la&bW0a5Qf!U=3_fby$k8J~oAmZZGdf8!QgFpz6kFf_n0y9+<<-Z>ZGkEM z>S%W}CIOgkvR2v>jNA)a=q+4{&f`2;eH=f5F8O1N{KTQnF;f;XkyE&-dls(&@Kl}% zQfo76QvIY02T`%*L-otNdZ!GG-&7Ihjg#|~)*RfR4-IrA<|Q&cqN&loHN56PEiz&f zVq=a5x*k(^mLYa_2K4s+IsoNt;8{<>r4gl!&>jdQN+&gPKrr$I^dHlo%xwIBvata| zXy9?~PiD41T4-r?6aHJSH~pifjI-2SUZbMQTeg4FW{UoAW;P&sn-TxnOOR*J9$~2d z&tuAaD2aKt5{5WdJBciyo%wYgHbEBu|36Nh0xR%F&3{bDrsK%bbj;^t`@PBy#2Dop z!Q1fn|NH9K(IkB0Ks%#wC?5--reHgo074mUE92N$5u7!(7s2A8<}1wVZYQc6Ig%8@ zNG4d)4O%7gCue|cI*&wK_%(R4uVb?bvwkH`bkj(qb&1Nb=N}pjLia{GyPKsBvS!^@ z&4fYkqYbnj%T%R}B6$IYn@b#Xrv!bxYBP9id@vB~_WO003XfJ85 zbbX60k0)YWj%p8iYs5Wj7e^?5)-9J$_+dAtqZxs7%1d4bV5Z@1WNO9J<15OYJEr#8 z>7O}-Ek)$QIBBGF`Fa-PKgQ{CtNE#gNBaEy56d4@Xq>gz-uSy%xlsq$Ko+$a=3UL` zO!7ZXDD^_FvnE!Dje7aVXoGG6O-{6_KZk^!elAUPyn^PfwrJ-YrKb?hHJYRPugjzP zXmF#?Gk&$g-WY!!vD=x5pP=vGQLP3Q|EL&dtguvun#VD>M_|)u+BfpgzJ*xgEO}~` z<}B>rRK;+rqgzDkU;vNjN_ep_c7G2TbJu53IV&zcksO&$F`{^hpN zdwJOQXk#zo^Zp8T{{>gu*`4&QOB{>@zih>vE53(&`46loLkomso5!z1)^4HZTv}TB z^%YGo&UbULA1$XAeO1w6=^{Vm&Yj8BPE29>tI$TEU<1{hnH*f5^A*ahHk3J$nyZ+& zi$68M(q|Hc@WKi^dXK#Q$SxKyYW2z60j>R_heEypA@OsT8z*0wN|L7*uNvy%xHwp$=lXuljgngUZ@kXthy@p<8yKy&7wP)41%V3u~k-vG}O6tU3OIT#2u#)$xPzg7LYXr6C0}=Sx`yxewbtC+H zmcC0*0!8AwuD|EFndta{mEAX*WxCLgmRvDG}SP zt`-o6v?}tizZmLzjt=WDdkMC(_L?0tM%(zBs@9#n?arSK_*t(}>$I}W_KPOp^5mGv z`N7w&QP%y~0Kx}gwqrzD4&$pc2$umh)_jU>(~pexrE$h}j5@$LyVhcew;ly^F6)Mb za9$9a9}A2X@m96gqOyO&lW#O>|6PA0 zL`~q2h2NIZ$wv>H-UJTOCMF1F&Gj#4wP{&PVBZ+{5)72$@WHTO4{hr)K-|9eFGpcj z`BRq=K;KdT8n*KWS?Ic+{)nClsgXFrS*9~DB*#50)!xois|w+j{mznw9_#_6FHgoz zZG{BfhG`4&3>%e$D+E7ts^-eUNUIyRINxGFTdlSxM6V!d*|2bF#8r*#Wc^|^-G>{2 zQT4C!T4;3>c!@br^3Gn{bshYvMY@w>T<&k!k?DV%BHX0r8S`th)0iQ88zvt}p)%?t z%{gqqQtESy3jD|Atmk?eVI34uup&Bdtl3)k1Wj!kASYd1^9u*hul#Nf;WA-OUQ}NY zy(!azSa!uU#MYYXf-=d!vh--WcDk>j56)a$w=#s^n@pu562^NC{?_w=GcQ!EXkwcq zXI20{!0I3e73c7duNC}piT?MqR`*ej8 zI1mj*GTVh&m+55=&bI00sz#Zo9X8~_tO-j$yz%9$-|8arC)eWA=Kk^2h2GP6wVw7LlhlKd zv<ZTbJ{tY^_?_3tIK#gMyy7Ze{uI%)1aElmvA^I>7O`SNL0)@m^M| z3vW+gQHCC3tj8vHd6)4y@~X{5#JOtIt@}JVE&MFo4%0@$TQhHrEomKjS2p>%%Eaf0 z1TZCk>$ukBG&_q@b&f^2m*T_pz*;BOA;PT0J80_8)F8(va^i+)4Xa8?Z~H^}tdxed zj>9^Criicz) zVEIoG#JZb<3S0tItL_En?yQ3%_lNDQ&D$ksInwb8!UE680Zyz`%wZ}KmV#@(6b~K5 z1>~x8q80C5a~{U0--9phccC;c`l111?kMR>`X0P_wojg?Z+W`*JYUR?;H>a%!XsA| z=aZZ>Cv3mJacyM1Y3SU$DSj^cEMzwE0A(~2j0Mi>3AZh@21*I#`}0qKB(RYSU;glO!mgeWW9 z?L~}2i^OW9@w#`~E*B-j97w zo6?(ZE9-7uZD;+Pc+*j6nQn;Na~@iap_uB)2OjQtgK`c*o-}zAb?a$q+sIG0+VY{w zP8!2oy)Vc8_-QxT6QmxY#YN8Ip8vh^qMs>P7)>c|wcvIGe2SKL(=jVR@YjQowpUA& ze$usyFXnbdWGj`WK1U74_R}<@&Hjyic5B!8w|)1>;!SQGP1^KeK%`y45!zKa^1K)4 zylLw(v<}gvRM~t~XAE37bAFRJY2!DxXekSS9Z{pv)!!1D-SDM*_(fnXNV6uGBcxkq zGqksO}=`&hs;N}H) z%TeBNPzBjQkDM~z+{8=NRaI2dABP0q;OiVB@u2g1d{KPY2M{8`dGg5^hl?;rcLIYNkTeyr;Kx$ZC2^|o0VBV%6;Xtwc>vURIyl}`(`wK=yj4b69I z_>}~Tj=IxSq9YhdprYd*?p86__JzXy>ylUt` zcYi$tqvpJ#1-gI)->BywCpWI1EBy@reE+e0Vv%KtH!Y{>zCOSCM8B~oR%+=e6*tM@ zL9E}8W{a+wb>61!FDu+`AcO2C{Wq+`B7wn&&prl z&4vA4zzY%+Km78oopb(UDp=Z>&I#ofxI$s!*+fLpx#u{WZhVEfVVw=d$a|HH@ zKH=I$ic;`^xLvZOe@CZ7LtJwJoEmZ~r&Aor$#`(gcuP-r;TjBAC9>cQrE$(h^4yjHJ;L%YXA6ehaSFIi$Yby@#191Y&# z_1w9BFfGaE#QAfg9Ede>{^3nDF(>i1)S7FI^15K+s)QQc6Cr%;-ahDG*4psVRe{ayn{jwYKu&EJ`2VJYHdF)xF}<)^EMsTAq!#6av8dL?6U64c=0OLxf#uy2zSCEbJ@hq&|N zRh#^;?jRGrVVfqq;|A@VE4yU~q3a1nzn%VXr&6c3*=ZkDK&U>>b|Fcu|sNfJ?WU65uCN~H% z8ZCt&3k9>GnU!y^2sDbkaj>+07Dk%m9FM(j%B1m9Rk+)56f?{=XEvzfSKb225BpZt zD0s0gJK)nucv$?ZAf_#Z&XAQVjtZ_u1n`P0IrNsk+EIIOx2u@5VDT2mr~5gstrETl zy~m=jPtIDv5m$agS2`bX=1w4;#8^;0`AdC0d~zfyj(ew4-yDAkG^Xj~mnFxe4!&`p zNGRVxT^tZkoymA%KUpf7wKHj(e^bfdK>&ZE_*gk&iVf3=cvRp#IU)P@Fl8z>t0h&x z^O{pd$8VTDjlq~fnT1*EwEb(IQPeLl6E7_sAA!#jiw^6C3)3NJc6(LrJuEWA;;NFi z71zG5=6e}d)rQ1^*xJK(gKAx*fw9RfA5JYlTZUhzjHY_~GDWAL$KuO!mO;ZAooNTo zFD!B~t6PRm+p^}?y!cICutePryUEJN6abb z=HQ@^?yQO+4=c5UxH#TzIkI^G&7fa=6dOjswRWfI#UuAFVpT_^jEHv2sADVQ6Ng*9 z?_UPqq)DlK4lT5pG~xeRCB49$>LAF0|!e&QhkamTLWYTQ-Qh!Vb|$p6SwTN{wxi)vMR03DwAZ7Yw!-HPfar z9ye;+y)wg61U55zQ&BG?)mZ|{CZ?SXF(RaW2K6Yh1{_G$hQ-3%%om8eQ4R$0<>v@!>#&+yz zgZYbWuP29a?u|@dVyV`);Yi{yYpWL4DokH8nfTH<*HVR+!*8S0RdXAEUohXaHNc<6 z)=|F9lzlq;=`CjdFWo({J3>-?V}5G!9B-j#(uNt`?a(lM?Z=DKCw+X{Ro&lVwolPQ zm#yhAA7q~u8!l9j^hqSQ?COCM<9>!Q*JHx0N8s4Cosijamhl4RW}hpslzr_Zz;9Rf z<__Nm3B#mXibDsh5%z%F}ZFpi2%BQz(Sqm80; zbuVWi@Jun|o%npQ9Xkg^I75S8_dGtjaMvZ#T~iU2OxL8pV_anoi<*vjV{q>H?x7+7 z9h#K<{QzD{{r!kW*^vZaIUPN|%;-LF%Ky22lH>KgI9G_KLSfG?vsXlv*>?%HD884O z9f|QlSEYr!ef6sRJz*7}c>iI#l|r6aP`JlE6fyx;2ObTK$qqc$;dC40^qRNNjFVqk ze{`6^T-XEIP7SxQ(~58$msivMOR|TME+MbFuiY`u)sa7gYuK)jo%0oLotcQgnfZFw zuhCug;81;OBy?k`l;``~o*h}N%9l`PhM+5JL3eLdQ#!VD5j` zW|Duxhmnc4Nxw=y=knCnv1FTbjkUzvk{dxkb!P=jmAsmEUcMZ0IW89AVt7y_3<7y1 zw0--Mb{d*$>X*7CV-9`x?_JFq8C%?3(hjc`&k$2~cbWInb#BKK=TPzVq$5b+kT&!h z!5hZDd|Lm^Ls;(u#Fnd0L^XKb>)dQuJ@K3Z=2xOwgUpnx)GbF5-Z@9fHQ(h9{|38j zuG8RKT@vZl9VY(4)#vMq)o2yr=q0~`YY@i|1T#bCiR>cSQYq+F(SJ;QH@UtAI50fA zpfP$EUVW-_oLsQ*3%w&0YOUVCN*AuJY7FsMQ$+?ij}aa!zdZYbSGdTADUdiYyH7xFx6-R19ms~~Ipg2^s_9Fk7*xRsVs^Bgzg{dZ+ z^69k!H-YhJzyGGVj+GRb%%@`*>3q`Dhjx+tncU!J7Oj%Gps94roMEz zDlG-3b+p{7*4k9DVexuCbRv08(8=v@M?k}ojar9Y$yO^vPQ$PiPDm%m;O zM)yfGuPug?GBvj5Js0>?bk40#`1L31aav3SjFq%`-Pvr5?3vQzPZj#RQzJ0v-b)+4 z>^+fk7#~cg88%UgKZ(E?o?;Q(dA240bYAzKSN>kNlb_+!Dr(g*amHn5a2dNuYL3X# zA)6TgnzIKmn3pJbZbvsnbC}JU7V$S|L9i*^6ouyMbH0@&iv~?SrPwq~&hosn&m~h^ij7=&e z2+?FV)!z=C2#ZqFxTr8b%~@?c5}5J@-wbb=5gkKU7255T8M_A#1mAcO+a3zlAj_)a ze&&J8@#g$$l@(xL#m&nx^e~0{-&`6-zj*2t6JN<)X&p~E&~z`KZ(yUdF_hmJ7#+s0 z#e|0%MY?rO>Kx7`eyU|V5c$$`Gr;b<$cMiz*Jm%8E?hsr|H~fKuEyEU>Y~KIk}7kV z^f~#q0{L zWd|flCy(A*$ozt|#>t>;aS~d7w#lr_N8t0T#(Hm6lEG^pWV(S1hip#1CwJSE@t7|B zM6%ivJ0@ic@Z3-wEfPkl36C~IYJxXC;a}w*O-$OVb@Ne~tfuPqC=v91vJ(qD_SE8m@(VEcY?TP&|` zj)WPCj9B3{inKO%qy=hAtj@muyq*6le+{z31aUp4{~~r|^V0!o~eq}5K#;Te&SPvJicJ9Zp0*u#U{i>zFtXUs_GP>Yd@lVs_s3QIl@vV(sz z&4@Xd^;MA1A=JlHh;inH?*xPx+<%_2b3rOr*lhv5sCYU_P-V zom-$c2|syp_Ml17XX(Dcb8bD)?#y;<$HiA&0WW?n>h*7wkG6#(9vhT^#{6wU)Km}t zaTRLc_fH7K&OI&ZHx5-3OIkGcNTcCz`0ng|``_rN;7LU?4eVV2(Gl!VW!LK-mEwX^aRDNuQgdlg($4 zuDY^u95=Ev#TQjD*DS_Nm3&R?ieBN=WamiIb&&{wMGn~9Y?J;8Rb+*5KWXky=gzY5 zuScU7Z@ru4zi1@9P^);)@!vR(!NaStHzX!kliCJT7Xg^VCu4T|Wey&>SOHt*lDbfE z(m{nhF|C>4iVF(QW4A@21vc2hp_R+_zRDuXmU`MIWA)I!l0#rERB>xp1iPuxWf~O@ z-ME-^c{54kxf%I59=&SI!6aJ57pC3v0M}YVsFq@8FuV5IexJcDVJ-=yAFwJ`PB^Nl z9FHhx68C#Zw5@WeC}a|Q-}>dRKJ^{JAD{LM@ivIU@6Xfr%OX&+2|Jqfw8*a-dbek@4Qrt$g zI)*Dm5o(*&=;y>o7@T$TY$5+RRClk>Hh~8%1@=1F7Qoa?f`ewbT5jraM zT=Klp4%W6At)6%7M*V;s(yYDW@V)`7Yl}Er6IgbUe*V@lx3;gWGfKrS>R4qUFCWu{ zp)$ssc#snTcF!*__NWPJE(B|&<)A{Ab8ZiaYrM!yd9$3QU@HB6R9hllU;^`3M>JgX zz1yOxzRv?ATfgyrgv&`zBq1w*UCQEtyC2z%b^$3v51+jNeb0KZiXX zJX_kMPT={&A+@wef;Py7i;?Uk@y4J<;&G{t@b&$M(XjXuxhvJ8H}*1aUfZ7I)9lyT zFHTG9`dAnch1yJY(Z3iH;QHg?`Q`;JRv$?zQJam4A0O$S4iQ)89UUUEhfJ7t)1sWo zjRcEDr-|6EM!z<7rO_=I)7P~Y?W0m3y+Ykd@5N=a8IXL;Mus```YS;y*3z-*A>J@=(XW z+G@m0UktxsSjfny@n>>!7qIzktDKi?%x1f!nsVa@KA>8!^6A@;J=%DOZ)0f2#&P!N zc$v_fFdgCX0Smp0g`B=~JagQou8{=d0b`Vjed>wEPV_3xb!Fikf74u8&$)G-@#zRH z_+rPS9~PcL`q8xch?aY6Jb$CFxsJRp6-1F(C2I~1Y1Mt_zu{j!wENDu>nkk7`I|kE zsK+;feMGKy5U9qaQ34#D^9EU8VVD=k#DB`p9fykA_*#zK$WRPCrwfc6m5Dl|ls!%J z?Xdf_55XS@FUS$&^0TY{6BnBIAugDrpLBM8hW_ck`?jR4K1WNAF+tcTBj{UedOF>$ z85RCKu)ed?0u;LMQ^#v%w>^!$3Q-~if}_p3p6E|06@JC4V3wCMYi73n6=y0(_Z@5b z(o5p11ixHn{q>BaBx<8pnZA#cc6RD&sI@9QsJ{Ba;U>LNm|}AS!Y_FuyM-``-br#j zuRMbyt3+I97j-6`KlgB2l}u0k6d`?ioaMyae2<6VALeoRW8-vDKg-52^{P76$4Q)T zd_J7vD?Ib$Qg=IRx3U7!^8=`F4|Il(aLiq_Pi$4Z7a+%$@ciZ92I8m|IOR(~we3NH znuFYKbuy)DjG+0d>*Gkjoh>%8X=)E=vFz3e_B2nP70NfS={~1cvF5Vxy*RshK0g9S zw||KIdQJ8p5v`G!DYEZ^+)Fp%6#vJ)jo#)SVR<=A{c944CY!0c=BwFh{9`xgKR*z} zBPR%<9i|#c0HsiRb)ssTp6lLF&4g_YqnvKtx|8>OiB)l;diIZ} z16BG9;T9dgX4dN!{fZ=sLZAhK(21@8m@2Oi))r?A42uNWpv3uST*Z9*#Du@LC8-|D zvz0_=l!mHE7tgM-qI7}n4D@lFUXEcLV#!}^Ug$&GOy93NogzzYO6^>En&oZ&A0scl zX*>DK8DSd?#!ezGdt9sgxV5p)gtBw76}jonV?KxnqAL0*yKL)Rj`)YqSo7U}nVB9^ z5>#?Ar&%X)q$VtWu}Y)->UODi&xTmq*S##A&dF}GhJek#KF;0qc(c7p#7%;d+&Rz7 zvPK6s6?^nJ*+O3ls zo!?zufgc5*PA?VJ{DhdTR%FJ=SZ~O^jsX?ID@E>)%AJC(T_7o-F%#t zm=s{D(X*nS&W{|r$7V_Zf^WaRpz}Oc=;D%!SnT?jlSa8G01;_m)EdGFzh z=ZdV#`KsHx;Sf1=EJ08P4@$ZC1b+{b%64f7zRtVgl1j~K68NxiuHsW}K+OHnhhl#G zOh%j`fFIMN-Jrdm9Ja=u-8|$n7p&9SadT}tM6%2IyD@m*Zhw5t?>cr4daoZZf0vLU z*oXo9EE~xar@&J=a{(BFdd5E~&gWTQbAK9|u}FfMQd4Y|ZeG~ZR$)@n&@WI?CLfz@ zOL$3hT<~8Vfro#$#lC6^*9)Lvz^CVwq{mfX#3odm&9+|CXx2=N{lMAA^Q_DEp4r8i z>bDwLy)5D-K3^6wQA_JWy#=HnCG_=zNsES;m;HiT=?y}#UJzOB^?pHU@_f&6?EC{euf*; za;YaK6<<6a&6Fl2lqQ*7gR*~l=ffO}O0hZ5fB+1jL}?nc$wg@1YUQa>&K*)Tv4u>W zvyRhV1{G~F4}r`l1-m{TP}~9~i~kn*svPsTJjF>>tCf#+qFnPv;sKS-xh1<-Z7k!D!#mTnT_3IQMP8j>7q+kQ z)5UPw1pv@>x3cT7n{N&}hP9QWg?ZW-CJ2fhtYWG%7JxZ&sc}e=5+t6HJVS!w^ad5bsLKUZo7rrz!Ni3 zeTXngaWln6FogZj1$6rScte!y_(sb3mQ0d_)C_aCC}`GsW`Wx2XI9wOp3=iq2ez~i zJk0l1x_-hFldnw;I^>QUP$b`2XfI)d8Bgfanc`Keju&UGx3ViH2PR6Y{?SDVum8V^ z_e_}ZdiD5SZ1O*jvsw%Fbt2|u+lHs&6STCvf2=RJ;8RPUHQvl!t?zsyBc@2ZcFiR;R1gBDUJvAM{1SOP_U>4a2_F5R~ z)f26b%47e$rj?kww(wX#Vs7FeNn<%~%!+v_R{i_jV?0(YR24Wz(%Isa#M+gstPOYMl~pJOL2 zSepoHCCrt19pCH}V}8Bylev0NYP*_AV4Cwsb`jfq>H1ccCzGmBfhvv$!V@Rh#T|jA z3jJo0@3eq2V~K@q#ri(KY|z@{t@Qw@TT`2bq2*qwp(goy8e{caE{R*<5@e>vJZs>L za91gPNFI*ux`piQseJh z^=MwvgT<$kCRYgPXk?OQ`eJrUmV4kU$inC<`bcGdX0G2Xd;9&JrBLNgHX$kRlZkDQ zw%*o6Dbv?a?00o5zaslR7D>L@hANHF%4CsG{vBW6ZuH*>pPcgd?Dd>wrg~@4r9M5* zI<^+1qkuhdUd9b?{sObOoSfkFCX?}I>Vo%6-XVj`gzY+bP3xE!!9Db)r?EXbutL(E zqCJyY^|2Qskhpv&+`q-gYTiDn>#pV-NDHY1cH{$o%^ZWZ5uMxPpTEPRNf~HT+5w(N z8O|aJJeo@ib{tu*%M!_BNCa`Q`J7lfzjR%a03C29O;pn86&(Sb{(`ZrRN>pDrjm~A zSLWZpDsMC!TmI}1+iK8W3aRamml*6C<=ii~sH=Tq7~y_}Y`8Luso2?e{CX#vT>kHa z3rQ6mE&1#{3%ZH3j#l9LY50vaJ1Wo!rw3lldXRq(4V(0uJ$aRB%8EjnbGDs zo_f(ZDYq^G^p!*r3xQDc0ED!`4I?EF-BBskfAdEwl-ML zcVBL0k+;WyBs9mE_Qok-|3$OZ!PTyZ5~#+Uyj5~%(x(0!?j2g`!#<(3td3}3v}H|} zf%O{>*oh!#(P!KJj+=WwK{nJ9`v-&Pl!IY`Svj3!Og`0kT#zRC~AEw24EXfsNY~> zzr2eALcBjr9f;Z_QJN2ZV4j0e_TOVvbN zu@%tBum4~5RbT0lQ`a)cwM3)vf>o-kq~zc?^IV0H zTS&|axW4OOXmPgm*zKGbPH0&g@cA8s30yc7OI2%B1ZcUfg zq*S9`MU2Ro21JLoc3z)M1 zil#`_Moib|ark^P)O|3i1*UC9ToLKkIyRJH70M};33fzrK8kKO@C`)PG232Vy#1Xv z-lW|Rx_RYd#z{-c2O(zl{1C4-s}@pPAV2>BpNBs2p^@+Vk{mj_#AqVfsuJ;ZtLg?C zY70c?J)nzc@IIfesHVB8fJ9Uip}qcNZ3X8>f4hX4_&>*q1{k3edIwL8uYl6>;%3`v zv9EY$Wf8fZZdRzL)j}$XtKEX$F@6Qi2785}&c0vLhBhFRaEGIUOSs6Z$Y+l#tEI#A za`fBR4ct2{=G+7G2!&+XzXX|xiyLEl*^agMntn?fzWeoN&2>Ad?~BA! zsu_bPR<^i(F#w#t7<=qK{lrlxk+nAWeo9AKQX+FHj7k&*DWzPT^$M2Y{ZtDbPn4Bb z=nMDP{KtsADfi8-B%(cDBZ_$UOe9SCg*8Pc2MqNWfx~13lli!Qa z_xB>KJ74ST^wjAj8(@|`ioe*l+T=ymkg<0ze2^>-1BbLWMv^yP5=K}{RaqVG$ zC*tlLb!tQ5W@ZdbrwoNYvSWS>9M?CQjdXV-se#Sss!SoDj~7=enbSC93|`jn+B=%# z91-NO8)>P`49*;4hYk_Mj`zEF^(X+=ef^3eAjg(k>D#QaXiJa1gJ^dTIHaCFiIyMI z=~Rg(`!RXH=3oBVn(q6utKaq(C&M2qCCFv>>z2=cqmb<3((d^#7>}Fo1b=LDWi)_v zynNc=9PZ>mVmebE3XT1Frot?>itgL{H|zX6e zqif@_LRd`ZMl?)Z*%B#Ez72Cm8^p?oyJballen3s;1c2O%j7UxoOJ3%bB9YnKVX!F z+=rQd&~kBcKM0*BIX`K}AOP8gV(d@2@zXu|@r$FAuX~kw;c7?1_7*sXd=6mU!N*oB zXHF#RG^4-sgd{#<2QYY!g#1N?h5%maXv@a{kC&!J1BTxO9LiWV_LKFbU(DysPD{}n zKG8W|`f=(lT%1Kd@0k=`eJD5kEwkkacVrZ*JN+Z;*uQ3N4t>Y=zXi?Lr7(_zn{|_X zT0|Y!$_vN7h*6%1Ud-u@5cxd7_I=a8V)G9lXy4%MS=>4$J+tN=V@>9Kz#%g)h9vKf zHDG$Z}Hsn*s6HFtYZ^lOM&K-s&mi<#-SH z`TKW~b;@VFnC1Lj3**}C*wbvq>0>O=7L80d-wSu#H|;06LPYnciI~?0F}gc_)(bj1 z4jyOGnu*WNt-34Bg+bWK0)c6=U0atV&(PrYFu7orKQK{s?<lOBhOlgyPk-4<2p68Fr)*Kh6L|iJAIMKH_N&y#P;Qc0EqjMo-ee==SZuV0qXa7) zLwKQBw+_fsYW9$iCv9XvI3i-X<(tx1wGhs7!?QVn+c7hTJxpjPJ=X2G8Q84yH=;x3 zd5yz?+aERn%P|tpWd8uSRKnI#W)AGk)v7jF_mIwae>XH90(}P^e#;o`u|bHH>A3{m zfYSLmFB|EbQ8kX4q~4hh3+|K04;J?PHr<@0)N*1h_qUHEG<9+J3{pThG`S~ct=k`A zof9*gBHF(3BjI{i&5lm+zt2s;7&au$+U3DvCD0y7;<@%o1>wI<2&KKgF3>`2Ue&j zq3^}iEwP8pyk|s$`(oD)ZMRd@k>@ur68?3Yea`fY4cpf6&HiG`N#kSPq#}OlaTmvw zfP?04eX}8Z`!Qv)Y&w=H$H`#4I z;FS&$ALaU1@Ahuw1t|P(FOTj8g@pY2Kx3FYmj>TCS(j~IXpbBmkiL6EE9+*#(#9u@ zPaNo}xS1D`dblTiz>Vaj>wEXRGxC&!aI-29XdQQuzF_4x+l~Qa;JEWifHCfJujH}> zFzyk%-M=|Fa?1e5NXP7&B1U#?xnD54n*RXqZa*sn@?5WDG4M?wU;{WU5^>$8IT1Qn%shhtY)EsHkgzq5 z{zy7A+E%;qv~!8waI{Z;Y_KEAJ6pBz$QhVUVv}HJD=)iAqnqMaaDAmM*t)n&-V+!% z!&!m5gJusGE2lFv#0SaIX~PEZxrycZgtm0cKJYY7U-4*pqdC3^Y#hSq8Lda}50^L3&BmrYS+jV# zWo`+!81W-~-fU)YU}U&)=sB-90*xrxd*5(6!+izbaGvt*svr#Ml@ysSPe^<;N1hV za0w0?ML`ig-)AOw&8oAK>Od}}_$V^tl}>N)bqO4|sPQqLMkl?>oK8KYMeAcX`IKHo zwdTq2_k_2MkA?AasetkpMs^8DJnM1HcX)oph_D=_7pLOP4k5znRwe2(Nw>QkfeC3d zw`J%aKjL`xXIvp}HwV1V7YDp-Kw9S$G`Hby(!z|MjFxdH+X zxaZyijT*dy$onM_Zez7_?;>2iNIZrrF(MM*zHUjS1L9##qB9Wt_Me~cl4FOPMDod* z{lB*(6XF05F=t0E--}4xuZxaxmuNAxIbqCsv)bqTt#dnr!kS&*8}*$T<+J0y3|ydm z%^XwP+7LMJ`H0?Zym3D4+IwT1PPPG#>;RlOPt5q1k~cZe7EQK{?YNm8%d34`ztnn` zi>QcrjyDDa6p^mng@9aXo62mVFhOqkomn$y2FUFRc)K8#LJ@P#%O~wgrKuC9}>A8*g?3j z_rcs@jmanW{>VR;be#FP9FQCk$aUocDt2QsImX!b&r$pL4Zko1!~K;-c> z&5#kn&zQs0IUB!;IOFItLCeOe5qQr)F_E5bkiz@B@)9^&9S$G^i4Q+P$n-fO*mVAz zBEcRYu;n3#cCRJvfgBb;JxR_mCCRYi#5&xUN%BG01_`dYj4z(sOwyCB|EDeK*M)Gi%s7JiUtsN-bW&b#zqmG@4(+iB`9%eKCmwiXvr2u61Q09F@0Ks=&2LTSgMe6s#e`-LK!b=st=Ez%Sq^S9=XTIs*uMzN z$-eM{hFfQ@OAzwdt%b?wJ}lQ81!yGvn}>!`f@3mx@dzy=$?j(-P3%q}Fhtuhxyk7z zLFX^=VF}(3v}fKtwR=qU%5%}U42B7fl6*n1YX?8q&g1$oS8wYF_FHfIw(SKRpSjeg zQOL^Wkyj=zL-D8E#@dJQGHSo#=$;qo0u#7jz1Zp2ebi6?06do=_S_+_-vmVbo|eO; zZg4gxrx!}ky~dha4K5WAXFVLT*w;bH3HGpmc3JwV9n4*vkH;$y$)Jzc-4 zv)p&}y!|Pk>3VIJ9@ZYjv(W~A(+9Pizikdm|35(%Rg(#{-( zTTc@4?GP63NW_cWE==ZwTO4t@J9zX!@XNiQ?AQ^vTa<6nPG(cfh|ecB4JPzW zv8FdGJv;vZUee6^vp&h|h}$ybD0D7mVeDKjZ{8s=X3Ay~hmS}J=0{)aR(d&F!p^OG zTK2W=eV5s5+Sj$OYwWe{YuZA|E&8F%Ok}ZPmnFq9Cx*utf^ZJD!(V9Ajv!$;iKY<} z6QA{<)H2Hnye2F|iNx@oF;ire!dHNVc(?64doMszc=XclVUCaD6UX?m==2TwKS(#| z&Zg5OC%A4I7(DDS%pgGoA>t3Tb8sceB*>+m3pqdajK<3?Ui1W=`V0^Q)l)i_JwrT2 z;|=Jy@fh`ZNQ0@zi&v=5Xhh~Z#L1&^*bb8(CU=Y4=1&sS;E?ghsNl4hev6QcE#hY~ z15LFHz(Rw_WyXV9_?{b{JCU-T((e{Le)1W9$d^^Puk)oYFF)G10luR{b2&j7kd(S#h%;LDF+Bo z8BSo%9tmF)JCa<;M;6|g)_Q2et5;GUAj;ZXGP%SF)rb}12ZS#Wem}$)L?38d#7d1k zUczq-p8k$J`g~cn;e(o83K6(n$lTaCBpb7V=ZirHcO;qquk1Cq4kS8Ue5;!*PA!H) z4_4sIA|FU=#22yrNjgnB$PS4{0Cj9Rx60V^4I_Rap~Lu({{R#L>Nms;;xW-5g~r*; znehxdwF2@V#8*N-x_Uq`P8Ku7Xe8(8@1=q1iuTyYMCo~Ac{{cNj^NX&ToaL*E<D*PL4+1^PFovua!1t2nJ+w?H!K+=+_-wNI4*-Z zoLHNZi60UUTe`pk#fine(?~Q3(KwJ-{#WSztmT5oX^tO=$!A5)_Es|D ze96PNQ6b_TgbTCO^KR4E`o8gpIe_^>Gh;ELma&}qoLbwqA$*>uZVPaDflhZVoD$>2 z{SkJILg3v?#6UXYboCN-XUX# zl4%X}I8RpX#@mRDbqnk{d34H`kcEzsE^+>_>tm(HIh@Oh#Oz4&S)P*teKXAr8~y~rdDbB z+-ETJxlBEl7W&aXOQ)OVfXE|0ZZ`JGHmu}DyWia006mC}PqSMTg@<-EZt)m+yx{vz z1`&oY(9yE-7Z4j0M?VuI$j3ar&<-<+0<&0W9OrkiP_@(+@;M!mpDX6oLx$l00ITlT z6uL>XFvyU^W zpHt>!(!TA$u1g`fyG^^Nh}?LEQ1Nzh!hH?aGnpEC343x9bbZN;I68u1c9b3Gm~1Va zUzmpNm^NGPT4Vh<2Onk@6ZuZ9k5jaTd$F-MqDS*qGNAZ=px@u|n{RUHnU@poY_~6V z?(1#C0G8{~oO~ESy;>aHC#$rZW`5gwgc<3_)QL0J zTyEManZo8-wk^HQ-_7#cF^J*ZQ+HWUF}3b39oVhODKRBfH4k8Xg3(Y>z z8m{M?kv!av0?#Fou6c?x{6~w))J8WM5aE+!teO6nAKJUSOs{wqgu$L=tUEGQ9dRc~ zjNeSq#ok45{N;nb>3wGN@o04-NZd7H5O!HL+esjE|kV^v&V z0{HmvnJ{vD^i7jLZaZ%uRp>VSGSRyX^xjB0*+Wv|S{m3cWiP2;ujqF!<96|kcHk_c z9-t88B3;WO*=hv;0Kw0QFAzA`LI7gR1bB;74abp_#%JIwYx$c!m)&M}7cMz5$M1Yy zSd#?=+vbjr8TZ7w`EZWmjiNwCX>eC8UJGx_&xzw^d`XsmE>1tZM(A#dOkhamo*&YC z`frF9*g*Iuney`^;CI_5^jknbF>PQz=sVfLvf%<~H_T}FvmT!X*s%7P3jv zorRHcNb2Szk#-I(678uz%R(5+97T{H2udh(!+F`aqD$agk8<9*2XVb>W_r0N1OEUY zYko#>k8p`2*_<(D(ZR)Yt-zk7*)#Ua?Q*zb%=jX$ftwqLC9T#QNDO;$5vF*0e7=^j zHbxi3JaG^ulDLPV%@8^~LR`%87qFPzoAG2*#rE7Hx;6KU5yU8aPsq9j#yGS!i0^jQ z>zN09TWopy1Jo!)nZ(d{lFCEcl>1)yn`?{E(aJ;`;V$0fv%xTisUG_7;P`Sw!}Rcm zhs5G`_mW2RJ?3E-0u#OmfcR_?E{+7?xs34$q&b*mJKiTkLtQM7bBBiF)#eg;Bx??X zNKVKhc{pHSWrc^*7s9fedlp)CKf)>i{6Tw>xWW;k5#w@pOLYUQXRyDRu<2>tk#WRc1(Hji`@tQ30qX1f-66I1HHTC8OR>b< ziHTyD6!Kndaq)6H%PP~f_j=C6Z5h0 zBV#?wUx(Vq^gaDG;Kzb`U5k`h78Jxb#mXEpsvlbDUGnlgLF!)anr+ix`GQ@ABsJRM-S&lD<&}el(2s_mA>d_3aGt+_)!!fpd z9bJnNNa4|F9`+v`A{mFyLUby~(g#d`d>QEau72{vba&oK~}==mS_p zvQL`VJG8To+n*By&~+q;&jqF}IJH|+c(w3Jbj93p`5tT(oLls#eQ77$A>z~Luu6yQ znj+5d$T4+;9Cj0{j(aVHN#+@gdq=ctxl6EMY&QF&Eg|1GPsP!2GC%rtBv zUP;2IU3iv1nE-c`XEsXad!E-MGw4`0nKC-X&o2oM5E*dSH;WTGH%QKo%Iy_h+ilXx z>O&UBHrOBCl z^B}5S*y?uX<49)~ygxf*28_CeT6%CIvjA_zf586$mtA%|3wz?dT*&K-007YWvxak5 znAA=^`GieD*HbjPnd8uVnDci1za#>9gzpMR#LuXf97PTrg|~WjY~)3p99ZNXrv-vp zI+o?DCy%1}(%Ia3-S52u2F}maK-sr>xO1JD2Dxw-NSocYx6BXiU`%RI-Nl7n_d(Ugom6Fd)dI&0*MiaE+s4A&TFMatiQRd)@zPndhW zC`ThL9_8KVrOh&Cs@xrrJ*U1D|Bh{2w_cOhKS9&?x=d+>ffK77ib&`+bJmU}0a zBLibE&v>aIJF$O$#M9U?#Z4ZYB5G!XlgR*+hE4l5YBPS z0GMPG>_7l{v>ypsW+3qnn-&d|*g2h-sW+N@2XX-7ajT7rXDdXnH!)doFx%twA28C{ zIlf^qF&w6FK|E~1l&l(W48|BV?PM@am0^}mzKd%C}9tg z(=Ep)DjccZ1@YaYOWGb`_OTvw&B)XMHe!N7&6@a=pP=L2s9t%6>0pfJ=XuCnEXa(6 zULf<4bbyt$^XR#*-1WF+P+%Y(jSnZZKcN2rJ@`InH1^_s7|su-oVNS+GF&$T_e1cV z$SbMCb)#+;8_!c5&2o_@F3=<&3y8$=KR`T?roi&adtCl3uVIP4o`8NAneBY<9v*q% z8XP&r>EO+RoJR5Rc!{;rp={+Zq=7u+0w)dwJ~lF*+jEAI$Iy581|cDHVcuo#au-l6 zoQ$!ytme)Wxg4d?pxLu9Fq6K9t7ULytbmqTJa|WsJimT8xQ`Y)&2eMJs)iAJ2b)-L zFhRy~P9p*GGrhxNKQp&NOk#w)IqaNsyu$;{nd(En8=ItN&Yz*3L*_ps4>xOXsNuz{ zsdVn^TE=zsyw=X%!$W0rlyZJz(C+;pMmTIj6yBmI*ae|GX3DIJn?>|Caw2q0NO^oj zUz0@pUh(eXb@^t1#+FIs#N!!wj=DuA7DplIJ^nm@gO-mN0cCq!A zHhGTU7A@|{#BshB;a=lnaMjs58kVceo)11=IPZ!42u%k%u#Mbh+70vRlQS`A;l;di zeGk$y=r@6M+2&qcG`I(u>en!AodZmE_zW2!f*de!0pLovk;SoPw=NM?0*oXnhcq?z zMX*ww8Tfurw~zSuRFA!pXFS=m5yrOnvF0`qF#FCO=S!@Y+{h+XHf%5Y5FIv446}%H z>P-E?WY5pl1mhLmxfnbVw7b|&R1u0L zmB4r|as!Ma9DT@;N46#j)KW%)Uemxl2Tvb2#Ohw~JzUKb`9Z@EawUfvMa)MTCey}u z!aU8y-qsY&u$K7@&k&Y`z=4ekOQi1(-q7@Y=Y&6gOJw*=;zPQ?xML=+Nth#OL$HS) zTTDLjz2he_E<<$2ZkcXiSU1S!gco#spYy!BINedj9HVUn6j%msAafILM*AZOEsWPj{_BP#}=qL&LcIzP7jhk z5Pjly6XA+DnC8e-KNOe0u`bKz#t?LUuFB<_oxzr>uFj>pqDH^_5h#AQ7Au^6uZH-sm z94>sWYfHt3(6fsOPk+8;dqYFo22*dCAec1ljI)8P||6EW57AjVIlV+xtF!lkmRxRu-rb4$=oalhH!O9 zcfLq%p@$79w5tuaqvsY3cy`_Z_iws0i+*%DZj+xjis$cS^a1aGs z2q5|ZR{Lk~IUErCkg1+64iI4b!u%4n?DagEsm*}y_cg|=kr<#Xti2ZJf>kMr*U(TJi-9UyTy$5z`EoDM?@SRE%3&;bu(`z$9riq(1$iw{SoRg_8z%Cct=1^ zm;))DK@ZrNX(BzJTW5jbNIU{C>&#;p9VI#^x7*n+Vbj^!8>2e#T;c~Wyscq(S3m&V zxbi~Oe#a+0O%mYX3`3tzLRIEX#u$<<0B5^xM$yJm5TBZf+2kEetc!q2g?lv9b|Cd0V!2AT&Ck^dJr=AADFL zM{ILsauVmd8QtPQ41b8+&JeOG|?mtnbQBEfc7k%35>L(3*VM(s`JUiK7r4nj*D?Hfz_3~lYsPGYN5 z${YFZL$C#dGK`cE|*d>c^(Uibp&gzp3bxT*Qm8w;-9S4 z?p-s?GJh0BmR*mF%SDdJVL7>zE!r{J<6iuq{#e~$P=U?mmq1^5zn(n3?$~h&+GDFy z0GQkGRnp5L!grWPq~_$wxu9XtiW>wRpt8@%{69xQx57XoK46Gy!Yve>TpEp>EXYpR z*?*hh4Je3S#%guCo0z}{!W^KWx?KCX6lN{O>%;&K8~W= z-^_!_CLc3cJdEPpZK1s7xy$*4gm(xWBnYs9do2mo_Kez}mBaupV2NH^aslv{vx^|? zNcp#$U!nkbT_7=FKJk9u=t^QdEMbx%0C|zYW8JraYFh@r%nI)>nJRQVmVgM3Qxkm7 z1R3;GiFVs?2uosQ9d}{Rap@TzMZ{nqD@~7d%X+#7W49#c>7f3nI_2ad zfXv+pJp5UI9^mU1t&%uA^9!(6QNw}=foSbY2`lCz4Y@Jr{{WQ#0J{r+nY<||mi8ic%{)oXs|9;tdd1C_nGGF(s^hU!j`C6RHvEzvhfv>K^z4vKOQ=jIQ(5e4k12guhe_} z<6W4`R6@9yWVlSYE=!y9&`YJk;`60}%*2U?#W|3SGAXvpwh3*`xmP{2CpnRVHw?Vm z;>X_MPM>QJIAj^)43{lW5#p$YT*g#iql$FKceEoTyvy#hB(=MFi)k)1w(OX5W#`ij zD$Wu*J6|*H9V-SgI^Jdw)RXjwewrv4)Y(38!U)ppY`~|sXMq0zf&d*j%#m6=WOc*g zq%t!*jkHiy=1^~Eq-q5@HwYYgjEjep1d40hSUmOGv9lw$4bZmgpQ9XgLi0K~#DL~sZOiffNi zn|BFu?s-q6uLa_A4q=w`2H5n@%MN&-!SVk9$K=PS50e92cf_B=OTBU8cNRzSjXTE9 zh7!gI=KQ1hn1t-#6@46*yj%`0(4;uqk^9LJ`{dyCZ{A0+labrB_4<#0y9U_Xg2?nk zk5(<6EzJWkLfRjDL%g=0)(+u$usy@3%ef=63Qi>-dobTHLB`}Aw<#RrQ>n}|NAqOD zPS{FEKGQP;W|^?rx6DruqaDaonA?cLL%vfpm27604Yi1@ows&f(Gkh90hQrDYf+XC zUG|J`f67JA(oXJrW|3uiW|0hxXa!@QANfBfKV5_wt8v1313ieoE(ueRGplBq;L9vT z_=uj82I=!{oa@x!;N`1iH*y`$9#-mf9ObYvej$!>>*oGhV>IV)Gib|h-@juw%p|0P zq;3BI7Qt}~Di3=|_ZjGI(?{A^hP|zo0}cKJEy(`fWR8a88jR;{$C;2WaEJ`C#&fct zry<9*CpG61JP{@~gVon$0Sue~SV`gYZ4N%x0~Fw=QNk;gSc&HNg87%n(f1_HWMarf z{%Sg_?*f%E~b8MCQvn2B(OZrRvFco}biv{oAy-+gu&=k`!w)TXpAC4wCUMdNhgI zKW2ON0Ku6zhQKyZ4woC7PW~<^-eM@lpLtGF=PCTaxZ1Ba+p&0kAGbS)S9pWmN8Kfp z2(Qewwnsf$d+r0dHMfY_c!z=#fZ?l)3GeAjBe-lG?ZQBKopp#`kRSYZ*gTNqK1j17 z4sG# zEC-U$B>7x)zQ`A!b<~-Y?b%M9!19{GXJR-SeWgV%!HdCN#`EV%VEQ@I^>Pdf=POdfK1JpCvOXGA7VlPIpi z{{VyYX?C37@;q4GyP7 z>9CFK^ByTZr-T?yQH#yWfGz;}uE|>j&6nVbAZLtZe0jP4$i_$~N*k08mS;h&7_iDe?p8o)Do~hTOoVh;9 z4?r#Qzy8Qm#PxDRvB~K5>!d%SM2Dxj+>3I5PriZAq#g;}8%c4K#~TJ4u;%CXoDWto z*w>rb@@3xEK^`x|a)lVTcgB<7rZdAXI)`5Hc>Yr`6z%hC`T%@w+Z7^gV%v4bY*uxF9Rx5ak;>jgJidi*U9#GrQ0R-MsTUmuJ7A;72y$ zk0}CXAj?lHU`Fz==cgm%<(mzD-!Ov1dGjxHGCfQrRoK{$89!JrTPHi6)(Tlw@lu&TKQ--H_&V>?EimkVDy5%BnB6Kyuaq|iaux^OPr>_GpfnIUuIBVxAci6Lw9t5-B=zIOb zdM{prGKQHjF!lCq9ee!^=1+Ik>(T05mC8ATeFqZDOgzTlMJ+w7W9eW5mjvK0Kz_DA z!ug0Wa9R<>JOG3gHg@rqp^qTu?zD9koo@ubjJ2J!+v#D`CR8!eBJn;fslEf==v{h* zYKZxmm$R}?rnt5m5pXNT`$!aWEHUbC8gYsNmxTxY~FnT25lMulb<(+G3Zcl$f zakg`8L?ZEXbFWuOl(}&GJ&$+L6Ctl6^29b{?-B%VwDn*SlsN2w#WDqcZQNi!GS)%{ z%*^QKAj`Cus9(DrQQkrVDeN#o0d6Tcfnnlmqr<;_nqA1ot1h$ox#`Jnb?Dt~f%EhL z-$dy2I3TK0dGACf5OC%WVC*C+cg%_bc{AeYOPzoEpT0~@?_vIJ8H{e>x9A%HQ6zsa zd2W5v?E9@T#EZ-yF`thj@SX>?q6*FPZn8LaB@tY~V$y&k8ya~m=yO||rRLk~x<&>8fwJ(5!uzzBY(12+s@ zrcNlIdE#_s+9F@_fbke@;z-Wq9(npxz`lcnC|I zclU>0gJFe`z%@4(w}XTeXTDpdnZL?&R}=(Gn07=+0hN3uHVjys8%tcS54^q@J|Zki zB;GW)30ZM|19`>+W?E6h;xf;~WVz%+`Kc^z!8ozxyCYpTYuqs*T7t>GvRahGUp`DU-2N~uspF2NRVaA$(c-doL=c$ z5-HQ0`DL*OJLBmm41N5f0qq4mmZ<*#IM6@Je$Vqg#6L0^W5MRxncY3dQ7l&t=1%ai zBzub??!`;rFn0cC-zLz@W#aAhM3KTd;sA3GPT14Z!)olpHw0w1UXhTC)QvUbP@M*g zD~2H#gGqc?TJ7TTFqOKuBu;n`3OhD#4mq6#NITwGV|y4yZ~-!JZneqv#QuJjpiB+ic}^Uqiqjw?C02d-fgJHGZ&r^;y)x!p+IlY+Yg=1>kBo5WL2==D zw?u2@h{D_>M@b-HlfhxsZr(ov#&$1R(tk& zFaH2NDr1r$qX>e-q*ilG0^+;3nLdGLEL)qhcFhkb83yqHvpXo61E+z!+3E^?@iEsn z@#+m;En#&8*_H7GJ^a|k+@;-hbAEikMWSWiJ>}vL(7OKb89ff(fRgf_Z|E1HeM4B? zKCn*Vdb12E?P_zxa;_|#Ih?2Dn1{{fHy&itKWQ`W&Uzz+`%fj;(uW9g;(D~&2gLK= zLZ_KkhxA7eLBW*C@9A33zJuUGNza5Vfy*Xn0wDw$SV1-0W-HkOBy0q8 zcJq9f5pBo2RnAEKgKLIHK43|kmE07)kG;vnxb2!5fy@KBk&TFmneQPdd(6CH!pG~yw6wZ-R_c?iT;2x^x2DSTqX2{7ct^07YDSZ9J_n}0O#@iXYo8P zUgr0WgyUq3Y4c&)M+N z^DtbcCpe36nuWJ_T$r`Zu$WA%=*d2 z;E36Ihz8Dhy79LU%x-f@HBk`N)raZ9u%#DI=pDmLgyXB4<>u3IpQJIy__A2w!ua$c z=Xn1B-~0anY(xJ5fA9YQA?O#2pZ@;<-}wG`oYTZ-f)4qOjp((nR`GHd8JrkMOnGAq z78t}a&n%YOG2?rnd_vR8@ey!`62~d`wDXn@cWwpXa#I-njG5_sKUv+<62>@6?Po0I+vyGMbH#m18##s~ z?c=}w{6GFVM{g$z{{ZiY{{RhwL4W7|{{Y{|T6zZssV&RiUf&TO@*MR2?5x>j!M+&= z==|H)i>-GY7(hmOij*<^qWecMAqPB5F{a18C>MhHJ0zD*Wq75Q5{%ojZoYjBFV@~GuNf=$Iv&^H`MRz zS+~7bSP?limxksa1^y0R6GQdxkNUDM57UPu6RCIl2X|O;Z!+Rs#lq!x^nr`Je=f<| zP;GH?a=d?!{&>adZ@>N-zt8^wJ+J)#0N>C50Ga7$MdGrY`2PU&{!`+VBDY=dt08RLxbFp8}*aBDQv^3?%9i9 zq;YAmeivRWvK6{{Y|n-~Rw>JvaXVfA9PIG8nLTGYE^t zs4(dEnGJ?@WzCo0Jr5j7v#J-i%p~UvpP81t#gJ+nt{F&=orlH@##@Hba1e3nFv-VX zL3h0{+HXLsAOoKy+K!ssALF@-Btby32eh#qgeu5e-aw~3&yLQ{`JSih4_9wao`-*= z@9S@1m-OIedY)!DWD3uOi}+rw502$OZTV%e>+2>bUra6ix()}_Qae=+5b`vJsXj6bg~j>?nm{qYF)%7KC|@(uFJ|%rlAo(bT?^7YZ2Mp4rcR^?K)?_?`HBW zQ9x^XlU8|#)gFigoeblAqVoR$cMVf@0^FT?VNS%GVBrHVHV=d1aTa)d>hCx~ybb!EUraxhn z4hExJQhi^k(IX^AjP4jE9TJj?2)+g#qhs`Fq(%-H3`s#6{rH~eA9(UUj{Cl^>pbBk z_g{4T4i{{Z447eHwR_>rS?V!8F)XR^H_Xk=ExhWbeoP{6{+dNC9AH=Q;@pa9JI&{| z4^eNuzxLne4x9MS9q8}7HR{~&NX=U}D#Y#{LH*w=@L<*cgSbltB;2EUB){M%aX|mi zIc;4~BzxUyoFoq!J_A$s=CQ=c%I%WWr{F*PN=GdLst?4YW%8I36LEV#=BN%X$$3@6 z^_1!xI#wuJl1k&Q`xX(3U6q_TtG5RM#|HDGtm__UDBPC}Uq>U6ceTD`M7;w zU(udDZf9C0|lf;*U2U!{8uohUV}`C8?D1Xg?y)X7|>}oWg&&l=QJC4HD;>qKx}5 z#-#zDirM<wjlUNAk;K-2 z#2S6f>GKD~&pKYOau)sBUo;?X>WjStL7UJ;ijH-2zIC@;s=57=`rT>1RQ`{){q+J5 z{(mP%kuB$ZQq6LMk*AveFQ=F(ym^BPHY(NEB<-b3@c?aFmt*BfTw;J?NAvJa$+{pJ zb3K;)${fC+x1FYiVjkZjUN{Xp=FaVYF~}LN?Cpq7j1lyINbw`5w;)5*-&mB1KPczD zv$uJ()r{b3tuKudu0oka)93_|-1Im|Sd~qDQZ07qdr^=BX7-kF)SL!ke=1n9I71Vi zyrTxQx}F5s3vsMPUMP=8^EvNu^a~I){;Z?6YmW{$2d^Vw0A(JP;qT&MZh=)myI}ZW zj!bcYO)EilZepZ_+ns3tRP+ScYUbHn;gfG<#H3zS29;~MLqCygyg}E^<_)iCR@2}+ z3DnTu^BtE6V3v8{!Zl5lEJU%_81Kc1tsGfB7PUa~KnCK)d|HwR7HXhdCfA=mRrmQP zwE#5EMMv-NHa}4M6=?H`BX!iDB_Kd5_m!1Yk08{c7(e#1Y;%8vC-4OVzPg zCu0xA8?3o8IRuz0u6jHQWDCg$Ib@&^Jo8MpJ-M%MqZnl$zA?wM!1;x+?B9i&%qiJS zsP!sJnGk%g?H~=g+muV3DAHad;own7&GxS`1&mS= zK1Ho3G;jLn7FAUzy=zsxvl=2T)UeG<;oEgA22|YTZGTl_QyehtuO8S{E0oWtQe@1` z+}50>HFB`a%&}bCc`^-wayB@eL(&2_|Kf^LXBVCR|d(WBH#m z(BrLTuYwWIJ9G8mZpJm?UoqTlJ`r36ndQsAOiWIv!)_)|GwGVmnf6Z4bMt$fH$Txe z%E&-#dAjs4?9$?2MA>%y5yUQT$*8UrTQxA4d&t~=wrv&9lph`C4;KwiaTd9D+DK=J zSYeyKxHJyFq&YJ&7&bW7`n^{foDw0*->%M8n`L9XulB-@7g{AVQj}0!89f=8WCoz( zRB|?*n+(WAARd~BGbgh69*de6XhxIC7)kkv#^oNW$KkJ>9H52Zy}_ch$xqz!D}LJ5 zZVLIYYF1Iw{$Bp1swN8J)g;+&G*^dS)mxsSMCZ(RzcOJBt6O`4uRQYuDryttBdMC1 zMnf^1mu4#!?#2HGoCJ;8JcAca@>Re!?Jo~`RB!PSGLpZ*{jTZUcQQ~b;y1^ zYa&&ZyOXq6=-pKB3q7e*Ip3RA!Cv!0?gM_5=xemud5n>IQ5{m7-Yq7FTEmTnC*jrf zGle$*r^#S#>(aX4zeVj*+r)ojx!JpjtK-4K>+AbT2WnAiXX>vaW$`&JTEDXf$aco)@d zQ;b;3KgtQ;NVme_+SHDE(QeW1Pq{+ZK(Ajnpyham^uI6!Mo3=>Nc+?xBRc|ajpRBQ zVP9xoQs+BkniG`rcM714;^9Ee7#o(&n!%t@|r-9-n>}e9uko`ZH zgurS{S}%;Zq~V@kWuJ;4+fs*&Jz{bRr8D)gosS+lZRklJA{w~6c&l*-<_fs!Z;;VWNmHv`x z$)i}K(wmut1i?0%E3MDH1iDZFeiiR3$uYK6m+*SSeWBira`7HTPJRi)4HIZgZX^8V z=YO*ghywnTQ&8o^<3!_Hvptua4Z#63_LL3NMm|4I4?k7RJ!oLTMdUHAXjw+U4dTh| z-x4g~$e6@adxC2EdE!^pMptaOhK37iuUDlt7j2v?CYINZbUi1<7rs)^e2^_xTZxOt z^w+S)sLH*pLk;Yc>Ii33c&<7aZ}$uPyuA~$mgPWH#W}5aTh#!suZtWUv9eW2=f^sq z{Y}2bz0Q9Vq3zPMKAy{&FYf=vIuO3E-dW&Qpp+&_*w2;17NHzW?`&5w*0T$*GpT!z z9ox^rLlPci&n)|r(1pB%@nuPD_dTWitYL|2&jEo!JOtjz`IAM%TtPc(X?n!caZDqiM!-N^+r7AcFwD&~qL`t60sg{` zP6JQw=?~16Jld1fPE1mgt0v&#H4Mk0)fa=-X8h_L6L~xGwG$1)HC}#~E?LLN91^xE zvt1OFUYO82bEJyWv1e>V(p*k7UWD~$Ycm7Ss0-Ja-wrNQ;$`6cfXUacwrGIGYB76- z@m75gmY{#L9`VB=(RSHRq?^VujND{>Q!8HE@Z}nT;M(U;2-t`SlP} zDDE?f@s#tDf^)N@#c*FPLqJ$SvN(edPd!|qk{rkFyQ?N|*S)3NAu@=Q*>-YPAAfY0 z;2*-C2l~=Dbyw;^;J1jcOCX()XoyI@TEEHa@MHZ^X3uPaLy6b~y!VUhtI^Kdw*-bb z>@D{*WA1%sPJUwekVltx@vWxW#5G~-y}Y({s~3|iC%g{LoSY=BNj5A|W7Jk>Z2N$q zvgL2UYd=s_!!8e8TyN0 zvv;1z7w=g5?nH0DXrdpf4svw9Xab6HeXSx8A6%R57+OJ(_{W{b4L}bj9?%^$3Jcnu z=)*aL-0sSY{K>26z^1b4O5>4FWZUOiPjw?tl|GQ@>JMC(%>>P^%0JsGXT3uO>b`UO zG!!8#YR_gj{W{0{vlZkLqU$<>N$83KZ%CW)pj@a~?1~yBxjoT`p0ODPnJ@^0>z=ef zLJLEm=WVxH%f&lq7Z$xjA`@avRRvp#m2QXSHGJlqVgjJ`ydvHO_iC2E;8Ab@?i-^> znLs8H=Yv8w5{18Q4)^4yRif1s_02bQX_QA1h=b+7WVox5Ga<)L!`*tNUE_ywGcdl^ z11ymeH(cTxz6`jKY|b%arEAgP7gv4{EL%~5?jH*NZZ&0q@X5ggYgOQM7l?^I?}5UY zbW%k0$V}5&nhyI|$!G*8No#)>vvCqTI^gNxR3U99G~w=<`ml|t5f|?S;G2(oa$KZ$ z|91%*8v-blHR1w{Z-920y{Bevmfts9W2=+((ZheJp|H$}d-nrieX@EV%||mj2PZA2 zM)@E)Yn2xoM>L18|B|t_(0{z8*S9B#J`AmRsK`w1ci2CiT<{B1X(}FPaHFCE~ z%uL(ry9}?{fLxi_6HTtBhNh7vd1#>(A_A+0*jR~;FuU7bI!(S_@eEQ^_W6>0(VwSu zoLU_Vfk5&sR?$b47Snl(m%Pe4hie>%jE>}@`|g8dF#7tf1_ni4RbQ(4!`Ol^mU?|% zjTyq*l?v1ybz-|c3P*+5V zyF<^E>Im(lDoL*DU0U(o(}XByS3Zwzn*7qh?=EvMBS1Vm$2RhjUUW6~{O$ZB8zIeL z`*|tMSHCLZZwstvk*h7433H2qPUoeXbf!r7ytl@srW7v;^VRI&6qeu~w|(pE;(EV$ zPY`6>6RnOzU$RasVgs{DU+GkR z?IMG&tS=XB3k`LL<&tTc8c$(MYhVaCMCoSSWB%v)%1bNo3)tqKcz(K8Nie zk;-ivuOkLMp~AHET6wGy51W|vbF=0?xi zpc-71Tw^-}V>}9ohs%d%KaZHhQ(2S$TYcM2KVACIPSY}QsxwHFI8{{Mv1CKs75>Wl z(Ir!~hNZeRA;rGTh!M!)+21=wrY_9PYIwe~y; z(nd+PRrKy}OjmD(Z_Lwuz4tjr!UY@uS;jv(zH?RqSZv_dG@OhmP#v1<)@1b&SU;sf z{d(0|*ZP1uos7MUY;*n|U;L%q95wEt%`dN8Xyrp6GmD;*<~0~J33E717dkH$IN4rD9Fa=YxrIjY)gv?6WPES{bd7bB&DP7tE40dTtD`K@1y^z1kl|E<>Ns} z(7>_RVKw3C@hmQv0NKIjvv5`2;dq-2D%YlXxb*}rvgKa5x16jn%zNJW7@jfv|1V~N z#~niQlxtQyV$b&MUM=>&6~Uw{8_rsE(9(Ju*Zw{%jNzQzJ4_n5&kWW)@ZweqHPmK)WI!W@%NHMl+s1bJNPLcdFDr z0~@&zfWj_Ewr`6@@yWiPib^(w6KCe|Jr|kcMB~gok$B~)dC!Jt!VxR_iZjNpbRYhR z>5e^owdrCo%MPp)IV}=9A?%*GdG{v<=6?kHI}DL0Dcs8V=(0lE>h$;nBz}3vI7td=}bDTDd*+fPeXghRell37V#` z=&)TTRw>-0<$u!A`Q*6yVP~GcV8hYf-GofHqe3+eFE{EVA*S~_;j$k$ofDC|(uv~6Si#gjD9dC2`RlsF%4O^uFteE40)0gerrcH$fjUfM}0+5|Gj_yc! zUM-eCht6Z-0;@Q_JT=efB*gfRIK`I2aEu!GptC5lQPy>Ok)MEVrHxK8c__Ul4_gbz zulEk-B)8yEQD-t6AeKBwRQ0V-7`1=Sf`Albzq=@5>zgkX!#3=D48QUR2MLG^9@cJw zG4tn_su)+VtjD3B2F7+C3&L^`VDvv4*f}k6CkoCNn0(z~rlKJ_gg+Qwtm4^(#~>*q z2dZ;(s&XgHm`(Y&M<>H=eCL|8{o>oXDK`l+Oj<5X_@7iBRfQ`acBX7kxSv}2h0=GF zW5vQpZGg+^kNt7NDtp?V(uX=(SACi#;(^@7E$3(8Vsj0vr zCl}w2u+e*DCU^k(WLRXoneKr44b9{(;OMetrZ3MNWQn$|^^Ng$te5F^%l9xlVeR8N zp{?tQQiQ{EqxzS=q4bn7zE>$lPh*;D`ie_=)8#%1gMOr`&SH<;ur-ehX4w(ngb_P6gU2a{3K+Y(_gXsFB_@aR!8}x=OIg-SFDA(OT z5edh;i2qDjetzzyX$mM-Zq22jp*!cIku@gF7hI|R>bpO@;w<7=$z3dMX-ztf(6#3g zXN&3eH2h9G*b}d|M^EPav|)yIPW4Dx%%6GQt2(AB`}Lf99{KiX5#JwG(XdQM6ZF5H zzQn@~;OUyx*R=$1=(eF>Y24hOb{lBK{PF2xCJ-zM%SuYbZ76Csdmtp^{zLHRUTrdk zRqMJ=m&o%4r-{@#&+iKA#$FT-cKR7|(j-Tzm$Uq$Cl0X$(jlp2ytzjq)VtmsYX+k< z-D_5x`|s37I*2aP^ic^5b5{pr^Q7wD_Be}Q(lQ9M}KdH-QtQJ1eyHg6&_HWUxk|eOq zf1w(|Aa7`GlNK$j?EZi}PTTk%0qVj&k3g6;Wr5D&tKgJ;O%Bc245Dhv;jbf-N;Aa z#1`ikqRLSqOhs2_*9l8t9F}?vXbfK}`o2=33S4)xa2_pn4lNy5II&KU!wwyJMy4M$ zg#Swe)LHvTahAXJ!u}&+6*OE@JB*w4mOl}x%3N^G`tSm|)Q=hv6L{KQveX51O$EE`+M4OVYMTr_m#P#loI}j|0|$*PFy|ijbB!>bN*P@qq~YZ z<`L>=kWjOm#g=-@K)#RTNml7GTFM;q?kTgf3a^vVJd$uZ8_$47dj9X5V9Ns3}gvl8LCZTj+(5NNGE#&6j zt+u<0SFEyh?MNuqE82lC>BEB~(Xgq@Ft_zgCGbc0Tce)aS|p0f^H*W$C%(X9W>%wG1=|(iZMH5fCkc7G0vD;VV2%s0;=8HO&zIL?87$# z++G!c#=iWLM;l3VqYGdq#Xd1{076NVDJ>MHJxsIA-pPjtEDHOt&Y$!74c_k|nqP~Y z(R1Y5Z-lWQ3tvkyOFYvMwmk{%%bI+pC#EB4rFCbbP5+A*%0pl+RE)vY(K~pQB00)W zno;Qmtpo?dQKNU)zi;xJ(jLUL&InoIyXZQac+z=Obh=V=AyjRHpTt32UYX#Hi|I8& zSbW*MBkLIM{&BsVK$EQ3@PDTw`_(#CaT2J9-hpBCL3n7iC|*oxEg&nOsXAS5(Yyx6 z_r9=EFO$cfs!#pSTFCMXF+z_**1l!zEakeleLj;H+g8hoRb}5#k+}e~`yEQQa{YFT zZtwOPm8plO7e6DKx{;!z{Dc1{c-%&@h{E0E@Plx|Mt8HjrX8iBX#m39r&w0HwZNBd z%O+)Y*01vX9qk5+u=NC++(Vv_U##9|s!=J%|CcOuN{;DS$dN+hLtb?Ij4!(N{Y0V)S=7~Mf2wSkv@0g8@027vU&9ueVBW> z8T*V1^u_hRw=hvbevcY*MxdjC8G%@KGl14)`%9**8lF!4ONLPm@Gi6s9HvU#z7iun&ze(7)6Doc zn|chyu?9yZRwn(T{nxaGx9rDJxG7S-_DqdRr43D7*Ikaz{= zEa&ASm=Wuh>z-1mj{KPS*3ZNsQj5oNFg=zSkdItQe)Hg{)zTRbtNdT8(k6eoDbjwV zlB%V!EAncS2DjfUwHvRmUEqG_Cp177B0d_@y{r}WiOaAIj70s2z857}pyxXIvQjht-c74|2(5zgdG!jzJoMMGXCbo`kt6q# zsXYJsLKw5QF23$jrM$B&vmgFT?%sg)EmuwAKV{HO|MSq^+u*`z(GLmgYrb;uH{xuI z>%r~m-qE4R`zVr?qphToNzBrW2Mz|0ieJvXir!|NLuEYfRdy({YzR_NXgi6+NcpI| z=+kKu(;TWgW600B-BluLZnLnRJR-Nk*VOObF^O_+zve@ zN3_8QHsd^$LP_!-@g-GSLnpmkbd%m1nfL<=G7+4~lO0MUq2=8NE%hye%04vU4;Tbz zEb#2^HDYFv7VJeI%eV)$T)p5AuIRY>PahxaO>~YuR?JnUaj9JmeRon7>;<*`poaw`N^r{3*qS;64O zFton{bJ15 z_A2;0P^c^P12gn>@8=x*ZR8U^)8{+{u)raUr_e?o_~o7_)fj^~sYuL(K2aA^n;uLLdH>bZ=#^P5HH41uqrE_q?8pg0v8Cw< zWEftGa{hqicvK+KBGR{^va1CY;8>;zbgCQWbaSYqgG@tS7RF?ru*Io1-{M?f8^fb5 znR7QJb=8KGqxisDXHcr6-M|C6 z9C4Edbnl;BbsvET=^d|%0_0Mj@CnON#5CId4|O*(`!N$-AnsMh!FMfI=r9<#$<$+8 zIXO$?IWjYxMIN1tN{%4e7fq~H^9RLesvq;=)e`|=UT@i>7Zd)Ou<{a-fT(t`ThfV- z`HSt~1teGUnRsM^CBH8A@o*Gs zYi06mwmI`B#zoO#3}%XPupe?9r~X{-gz>qQ<9BY*E)-WK5$d^l7`d9BH{xVY@?Q)7 z4}A8SBEFxm!i*!7BUI)jz9*KXhWnKSpow309L?wL=Tv%GZ{%CuE@EQ$m&~1lGu9{D zAU-OzMMf}g;(nCIUoz-n^sQ^7@nzZgc~0;F&tshx@Z1?KYvIrlspRFr_5d3 zZut-SX{%<9@&#(%sF3UE4==nZ3CGCw}th^=ByiTMS4|9*b{XJpU|+%CJ-!^ zXyPHEQ9^X%U~RYm2)U0_t63^398HZ!uoz&nWQEcqCbqZ* zlzSt%~CNW*<=f@skzfyM+CVQ@{OL(K^+y{6(kFs8sUO?2Ic(QI((J*!<42maM- zQzLXGeMEUTJ5GQCTmUq=o=qq^nY|s3B=qj=pD&r8=>=dOiKCy`)arfy^Dm| z41_AYB<$fpx-0=0y-%y+9b71$;%7UoLsL8J7Pcj(K6~E)|2X9zv5@KaWJR`FICDS#9 zX|QZfakVE#x9H|R1;1U^VmW#sTTq}tbTs6c>@jYGyR%CY0ssiw53+ja3!Iy2Fw^sD z1(bHaS~pWD!yN_H|M9?8yZs;WHj*`5gU^IWPAIp4>Zb~oFFta^$BYFU%4Bs=jR2k? z8T_V)S*cvu|GQVV?j@&~-E z%4q1TDJE_jlY1Myd?f%tex_2Z(~!9uBCarSk@rq@my(v-HP_2Ge@>{fY;&Z_(}4)($Vfl4g;iy|AA5Hs zOI7Q<$ZSwIO)2aPjIxU(Hv9uO+#9YjqtGQ=YrBo+LMNd!GA4VLw%l6f1}{e!|` z;qhXpgKESd*n;}zL$Jxc<3JOBqC}1A7tTKS-rfXNTP{TKJR5tczwNA;?@j&tc)9A| z)QRcNXMWiZ{T_1P^^dAR_o9eu)c?NX8qErDV!GiG9wGiaBdH_Op|8k0K*|a3{uU=B zric??ck5|*{wws6P}9LU=C#|%$djbbxj2waYgL?7oEi!_sT!#mHL{vDtPCI@Ozs() z(>yEl;7CXFG`7d`85++jmifP>e%zVDQ1LAAeF5- zqw<9tG-Atf)Pe>>u{4WW?kc@@7yH9l*?9bV|Lr8ZH&O$C&jKU>>L~ZMB(g(*|GP3{ z&9#t#BpiF~E5}TLVlGu~i=>aHwO6w6Hq*pM)9;-M_gRLt04g7DH*PMuqSVDGsm{-W&okyHg$)a%GN{o|X)i?^xwaP(?^231VrIJ6K`=zZPB*66yCXql+OUCrT3 zs`B^MA?(3MdkU_5s{dHM3|LYcjrn`H+9m&iQzA{D4T>R1LL$*T7_k+5pV@jD% zi2-am{J^s8JFYM{0_dJL$chz!kra4;@3JJ*i9%#p=++kgahs}U`GKCChI?A4cu7Zm zJl*z#%O*BTsoL02b3(cNh*J^K#4(gh;s4;EqiH3ao9H7>& zbryGrEl@KeTIVd5{P&8yKTwa8M?$jg4t(BTw|fZ@B-a12nfNcUcb|)>t^lG?C~X}&GvHNl!q9C^ zCGF=6h@GfuC`7<<1;cucQ?F<#+<2SvC4{NhfS;%G0K0kMu%h2gsQzuXdtRfeaXPfz zH&OeT3ry%Wo+DF?q}u*WtKwPm?DF34vHciS9F#@$A*(c$wLJ-bj5q_euKy*gxSwj~ ze^T&)BG;HWDMPf`-#|TXT>zEgNh3-py%WAVqa5_KXl(X({BM@$pmEcN{K5d~Y5GMA z<+=Hr#j)65vpIaZmXEBgiYzd&atqGIea1}X5A?Xye8U;$(uQHb;M>Jy!&POCafV6e z>NiH=FEwas*d@KL%-OWyM&YDW{0%Ghk}Z*@)o6NTHU5dMjrSkBXT^Uu>nm|Xg+(i$ z_t^L7UhHw(iw=M;vvz)T1Y7NW<_;?vRk;k5cx?TMrtmF(r$RA@?6x$+BDXt=f70}q z?6c>=r}mj^!-jA_ZXvC06XVE9-lE$@u@af9Y1Ch`i#G}DH^oHyH_`<= zzZJC_^B>RO+AHRLEN)Fr6{MRTNm9WPsre1{!bITZsB(+sUHtz zNtv=?em!SRsLW3U&Ecn-wrq_aH_}w?jog@2e9td_esccRqK5;wAK2jxhYm%egU7sR^wf`k`#q?-(icIUD-b z+#~t6KW9MUX2kmF^=Y0ScLJU7!=0`l`JWZvr<&BA$doFqw+~;?M7=Og(UJ59Sn+o5 zFy)cv1)$M9p>!EelN6zzlDh*5gLUS6x28G^svYZKe?)n@?kD5qVst^_+WBSQU$QU? zi@g>RrZb>U1h4iQ1C3mj?<0atmjm`ESAjRH4@mO)yR>neUakWv(v@ju7JA5*ce6H@HgiY^JIEmQC0Jln zkkLmPWyFu7$o?6HIs?!jK^FbO+b?UB;Vce)ZFdD z1i;K;_RB0%oag!Uku!>>sep1e(T&6}G&Xalp&V^bpssGTnP9R=h{i@=8O&0LD12-bi=zEB$9h=UK3ccMXg0M~y*!Df>QO8W_ z9SOxoa`XKP>A~096=D9$jCn-GlmPc3N+W%3uW@&s=nj>D-3y;-Y1Oy5^0vvrY+MA<*!r=`L;cjDPk*b%CveLXYK z{m?wzBJj z-a4cB?(%8w%o0)B!%K1Cg(`D_Hyisq9mf&S^H#Pk1f;cD(O4$$b`m$P!PrBg-foRnnhI-KC@--yc2F$gkM0^Z1h9~rYAzo6T^JlycU%CW1`pJbP|6zb@C&3D*;Rq8(53mppJ_5OCbwI->eI|)Z?~kZ-(GSlT78#4+ zKzd*bO=3DWKPRidjocNn<-LQ5(;d^xctQShd^lYjeY1eGRAZlpKQxWJHkuIfNySiM zB|i?vWD>Yn=b-^}o&*Wk(dt4|S_raB{LTis4(-U~r?etZgfw*B zAE%J{+r4s~nai{@g<#gLbl<_7Pf%>&J61#8!*%NU~)D&i-R!1u_Y$B z1f(qL8H+vzt&?$*qL;m+ZvV?SJe}K1;#NX;)_d~8Y?$;Y^r%Y*ezA4dA|KXNecCK+;cM366j0N$aGb@$m!(Q(Sr0RstR?kok^B?`rtn z-iCO?}9vG_Ts zlwizzf~8;GZ8{A+?A#?-Ac!~u~7$4f8oPd-=V9O>y9+5 z@Z#sOVTdbCGK;k^zb^pelEgEnpsqTTYgqiV^_#lZoYcM2?+Vxtt~;uj63N1Tza*u} zw8Y5M^=W~a=Suqho+Zl>tImg8xbM%fm&(blT*C_3zgHV zmRzkN5y88r4RIw?I2V+76KpKVv9N1XX|sAME_^?J_)%+p|J|K=JO#V-oO>_z@3hF2`G( zoN5gMJz%AwxW0*E4=z>p;b8D?v@&Sd7&W1*x4G^uV(k(A$syUvw2Au>Py6$%KqEUL zDaq=E9M52kmqeh0SFoN~6fl~1-Ly8p%Z7J&(+Qm*5*SGSr3_dz6DmhI$Ujo>Z)(9d zK^CsoHyz>Gda+gui~A4o|88{PHW$%}n03e>w=Lja%8g!GHPtf+)Dxjz>K;IV=)3pR^yduX)^#_FQugbQAiXu`7m^n`a7C;DM}A3b03^?l)%QA&e4FpK2oaPCOX z1GT`n69?3Wdkq{w@O2UY{J2Iz5ZG5x?O_I$HC?+cT}lQU@?be}Ef{WR8)a>G#e47-1@A>7NNdYtn$xq&j~Crc5z?g zF=^$kR`Q`E8<9p@<%FjIKR1uZ=^jC96Gz}n0~bYP8zZ7#{;$1F3s=P3-iyxD>v7xX z`H?2XfS|AJh?HZ+OTU|b-Xh7APiw7O;vvu2QhJ%$=nS*1+-jcCwtZ)F<78wZ4_cS9hx!8O%)=Mai82$|>)h*BRxm zd28{Gf;^IoLKVV(5GK$JHH^y6k7Qduz5UkO!)Y`{=_cA6VTjD#-7pU2FH4xrXhGk~ zPmnMFutXrj#yxG>aA?J8685Llq+-6qb^?e(E>*p0^f1h(plDFAdiQ`t&0A+sn__cD zRlLq3$`kWXIOvQEsnE85YQa zK?`>I$om$;BeoZ>FQgv-fg-;s4ChrX?nmwGkbo^R5ve*CAim`$!_>X&O!t(x9Dd?i zc#Ip`TpOSz|JF5(1j#V70>7oQt*7qNh^$N%H+1Uhu68=r%_fHG6&TU;K_149yBv`6 z_VC0>?rf$I6`#IOO?$oUPH0fBCvgMXd{KAnO1t9`h&a)LSRiJ|{x207>gIpVwEo~V zmX64VDMC5Gv=Vh>xMaYx$T19w(l1M4K0PCcev!-4)>D+CM!{<8elngd4y+i(u)oa1 zVo}^@=;5{;`ZIu=;E;<)`i6k(|ZN-3zO^nd2HnSr*=XEFg%RJ=vJH{H?Ecow2@Sf)_qu5c}GB zkq%^MHjtgLO|Ci2ak@5y5zdcWoLB=be{Kua*a*5{&@5DPzysP~Zp*gGwx=S>ibJ93 zg<~A{gtySe&kGiMS24*xk%MF|Nt$dsY}L%$ZiMD|cj*qS4mG|F=sWFg{b?=FHsLPIIgfu95RgOcx|$rug1 z>@Z+HW)VP(3>x*xdLe4tWRH}><#8cYfN)%)EO!xkpqitOU=$&v^o0#M8zWPvP3DpZ zt1LHU>c-^#!%_2KH^lUP{TvIIyCXdgY1pjUBq!X#-K${&&mrdE?mlr2?T#Bx(GX0E zrNAU)$RI>`z8UeAvx{WgLD&nu5;J`M-RjYnT{q_0a4nlL3C2pY4UKFAX0}!$AoFr) z*zwfu?!{-tt7=0p9)@knan4q2=!YzpQU()jA2TKzmp;GDevrs?Lvmu|={o#dRkXbCfw*K8l%Im11^0z5Eyg(C_ojIQlM#}xN=pDE}TPSNT zIQWE=bl-TwCb{X)(&pW>Fr2Rj*(SzoW->_uf;EE8nP@ty%jEb22j0#gH4m>#m$HX)zp$6Qv&YH`H+5MxEzok3!X%hFxWURA~L9h z$d=xQzJM6&%IY(sHE{h1czUjf6Pd1L{kq~Mwzm;&<0f2>GAw#SwHV|R6uR73Hd(Ao zHdsTsSB7j_v1c)vmZHQ;rI=f`3rLa%4g4fDSUvG(4o$lL<0vLe5;hRd=QS=D8tgjT zjkeoupv(oAY_!Z^=GKwY9(sy~NX#CN^ReXI7}WAwv2v+k3NSB7{IB zkbIH3DD!i0edfj5k}~&bcZ;Y@E{8Kb{{RbM9AiGo2Rv@^x0$>XXvQS;n>Dt>AjYym zaA7zW%3(pLpz%CDsJFu-+BlIsdKs1<)if3e0>_(jF2k{7D1eYW327WXCGyD*XgV0vNLDXLu#cM_i?ovEVsOXG#wi8V+IWZPS{6lQE^H-j?h&sO(URr2A+os1 zyGx3&aS5~Ya+$Jtq;oDXLXbB{eJ1ke*)jdNrgPnxWqX#+pG3qCk`7lGm75-J>RI6Q z+*REUVs^y6Wum|>V(~mOmvlX(-G{s`bo2Cqt>bwU&P#Ysd7b;BDKTa77&l7!n@&WH?Evv@ z6=-7+%A$LPv^us1p3Ry~jvzwn;!16V^t1s_YqC`MunwadgpHT@-9)u>s5rPR#j(o- z*#KAuP$K6sgv7KuM}_g|jAj`>H*_D3oe}!ghoG4xnEwDvXjy_;Fb-@t7(S2!ahnQu zmT;LeOT{Cm z3BfyT>UssrU4L!FI&Uz3W0rIqw1xDxX51vE#Xl^3}Hbrj=}>Fs;n=GU?%H5FCvGAcB9>>EycQz zGx-tsum?WYi;OMJ2%aPwoNctF_|YDDjT~CcvG&CAKOYmQ%Q;=0n|vwMA?FfZ6|M)S z^e~Lgi!Vdf+xkT@ON#BrT`M~CZsx`#bg?OE@dfI@a`&koS2q(Jvcm zBg}78!C=BpMtoR#Z1p*hH<-+Xz7vihd|Y%Z#A1gmoG&usY#-YZMHcv#B=2R@Z5d&r zqj#L*R>-#fA)HpldO9{uts8F_u#!n~2t6RUp9`4vu0C&hE9qc2#I$_>0A1=kj;*^u zByxU%7aWeSmdDM3%;sN@ z*al?rW@&FTnM)#W=GV23jgawj4z5YK_>3(biOUD5GpGv6^Oq&r==FB~nB}Ak z40}g3c3v{z465%WL!K;PWNC7Z}FT)Szs=Ib~xxCNl!V$!KwH=Fs9vi#v4vt6%dc6KR~>Zec?kLCk38 z+U8j(lG(c5uND@Yac^g!9K@M(Y+#)M1ssPmCiFlP(#|@(`hJpFZoe_p_5q%o7(z+6K(yPbsOLz@8PVqU;7Js7sg@Vn=3LGILq89d$=D_aLMrbDt^ z3wF6mhR4VAqK=nP;JPU4LnfDfzbs%r<44vRs!7e4eg41&%C-mAQz1Ev25P#O6%F2{{Q!tmZ&=*9iwbDO{~L(>H6hzo0GFZ#MwHHuibS&2uInR_3pp^83nr{Rh3KYm7fr`eqsIH%#gioDx>*6t z)g{E?hy5crE$HRMJGZ9yDaSb@$C)vRV6h$uQ;BE;u)h{f$>{OhY;Mn^xAjEfo0`c` zshB&TLDb^&Yxs~+ld}<-gmQ@WlN)lZ4`lvUIK{$iBXqPimAqI)I9q(^m%hO5j|q*< zWY#$c&NAwI+Mbwt9%tI-%g${@ldF-POIIV&UH!WPSOILBM|J2mZjNMlz*DbsK5QQ6 z_mW_eS7)7-*SKpglA&`=h%NJ&_pVmSrZZ@l7dM%u)coHt+3HPX&+Fu1GHmV*d5YlT zDb?p(BDtYU8yw}@)6M0qv}|r{7+o=u$(|6o4GNScM;p@ zISy_ugyweMi+i)(z30E9y+XH$>gGwD%uI&}s5i)UZG1ZB3O{+Xq`LhO(m>r-dB(+N zn9goE+_*D|V}=@8zS24_Hu2&P`ALtWt?8;UJ~z`D7E_zu^4Q+u9oY^@o~;tWVB+R(RD&ur4Yh^F+`Wzup{;Y@ z(iFOOT&Zyfd=YDLEBtr|x-p{$X(yCEh&cq5nK(uTwxrm6gxyu3Cjp(dxWGrH!IFF= z861{EHdz)!45+pURY+lzZxg}Ch>s-dW#Xl83!TCTOpP8O;0s~Jj`A9eNz|uMaL?9~ zvU-i{oR5uV3SJ5=at;eAV|tbvMCJ`$*CQ>S{{XDoweL6)0btE-*f1P-9p=b2WAieg zxx!xI+xfNUWgcbca_r$7w@J<}fwp((LygJBjf6Cv*~#M*UiPIjc%bIs7(u~tY+>mL&FEzHn77^A#JetA zzt-s;%PcLDHmryR*m6XSfML>wmD$!3gw7z zB!R8Sytbv%l|Y8T9a=h%jG+%UK%>1adAH@h`2;cmg40#?ht|Z zGpC2_+fFBlFAgN|**dXxD)o3+lyVGg6`I7MjARmy8yN7NYvwXBfj!MnOfQ=~+*msy zHyIl)CCtCD4YM2O@0Jt4F#+lf*I>pyLWnh!Y(01Mh?d!rpHrFWXAnD1Q_j+JGPbt1 zy$3&fIeF_Pwh`olGdQsTaJDQb#NrHQz>FJpkzZBeGJLViqHyqBED2Uv*&W)MEBngv zxy$1G)_a#N+jIKQS8r1d#zPvwKs-yV^)EBsr6FiWy$|7;D-c-^yck(Sl0PeLn6o!6 zOJgBF{{TgR=Pt_T!8OJ#wg9#o*hPec&BV8C<}4hgxjS`bUrBnL2PTmhaz1swSunEa zjk5z8I=@6YW)aA`UKF*~IY@YJ+Mhm&j!1y!$vH~`JBdo+HxHecrrf*Y40Ia=<*DJ{ z6Suot4oM-P`>uF5Y97p_awl+vI{_@WJ0MBV#Cv)OY*RMU93FBlE6hPzU`ErOf=Qg) zxh@GLJ6I)=vu?L}^F4oGZEo$&zGt4{bY+`D7pXt1!Z`g7+b3B{T(XJu4@6_XL-*(n zho<(ClWMuZ<#~`jIDrhfZgS%;QXq36@<-0(*u+F^_T<`!#fk7-O6uzR z7hg@^*kL`k<_U$$G2fzdJ@EYc+9okMhMkb#V0I45gO$!-@quKh3;`Anz}{YmDg#xhF7!9b*qR zLk(xR+is$nj3?c-Fv4n0Ju+=3PS4q8p1JyS_8IAghv*J|jIfUX0DL<#J)6y3S^$I- zD0*Te9J={&VaS+_ZA$~Cpd#yWy^`C-&(+nXnbdr7aU4K(FJvUWlYEhqOAVOK6Y~*b zTgL+C4e>t(e{98!PQO3~Ehk=&a(S7Io#r}co0`URA|5b|(tjzBn=hN(On02^GZ%60 z$QyZ_%3_2Oc!z@>dxgfF$FjquD+>wqjr$c6-`T4Zk{%r7%%;Cy?*UYw~FWc)I zwi6WE{(@M{HR2HU3v-AFV6Dlxi89Ye1Dhk8-rNWLt+@XHl$z6ieGq}%`0QNFE16KD z_?H$2HV?JBGebVXFz0vA(~?+V^A8+4S$T&dXtJFeNpxKqV*3KeN6|9NEV9ci{-*x` zQ++jU{bP*47i2NKL%n5mP*T!4bl zzoME(BHUzVIj82wF^G2%?{Gk{r%kKo+rQrLKd)GQdA6i;m{I7&ImM#699vh* zIp%EcZ03P51!Qw%s;Aw<^ za~*$YYVLF6JLida`+ssapn=l@w2u_#<_v+=eEmjq1=nlf*8J&(qpq4u}c}$yJf#OR=>^P?SKZx zuZbT{X2mt~hGf#Xmn^Nx#O^KDKQnW|f749izfL(^ zQGjQAo6pjG&GZ2l#kPRQunM_nm+NkNd3`^9HYqUAIZSsHvJU64^ZudX^%2Q;({dUS zDWDf78&O?F^iMGcv&ai_*%;F{{UVv3xZv4MUB*( zWoz1W&(<(zW>IF@tAA$Gkw%L9DK2Z z=H*YYn$|$^b^g1&uqQraGAD9Y<>p_mlQfC#E6TrkUDmxi_26^Twl_J&q3C(~ z?bX1&5!ZJ;Msu?5Ki7q9JVPw~cy}+AZ)*dx8T(liIsX8!o4?o`8q~Py#CWLF^2=Y} z{hjT^TAG(g@5Wvsp8o)|plf0{BBlp$0JE;F&hD=HJGXz;@Bi8EBlRf& literal 0 HcmV?d00001 diff --git a/Packages/com.unity.visualeffectgraph/Documentation~/Images/lightmap-a.jpg b/Packages/com.unity.visualeffectgraph/Documentation~/Images/lightmap-a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..789a52d835f2a28ee2b304c50f04f2a23cec3839 GIT binary patch literal 46281 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 OWxLCFmdk(iY5& **Visual Effects** > **Visual Effect Graph**. + + The **Create new VFX Asset** window displays. + +1. Create a simple loop VFX asset. + +1. Double-click the new VFX asset. + + The VFX Graph editor displays. + +1. Open the [Blackboard](Blackboard.md). + +1. Right-click the **Output Particle Unlit** node. + +1. Select **Convert output**, then convert the node to an **Output Particle Lit Quad** node. + +1. With the **Output Particle Lit Quad** node selected, select **Six-Way Smoke Lit** from the Inspector **Material Type** dropdown. + +1. Drop the lightmaps you imported in the **Output Particle** context **Positive Axes Lightmap** and **Negative Axes Lightmap** fields. + +You can now test the effect in various lighting setups. + +## Additional resources + +- [VFX Graph](https://unity.com/features/visual-effect-graph) +- [The definitive guide to creating advanced visual effects in Unity](https://create.unity.com/definitive-guide-to-creating-advanced-visual-effects) +- [Realistic smoke lighting with six-way lighting in VFX Graph](https://unity.com/blog/engine-platform/realistic-smoke-with-6-way-lighting-in-vfx-graph) +- [VFX Graph: Six-way lighting workflow | Unity at GDC 2023](https://www.youtube.com/watch?v=uNzLQjpg6UE) diff --git a/Packages/com.unity.visualeffectgraph/Documentation~/import-six-way-lightmap-textures-unity.md b/Packages/com.unity.visualeffectgraph/Documentation~/import-six-way-lightmap-textures-unity.md new file mode 100644 index 00000000000..84b826a8fa0 --- /dev/null +++ b/Packages/com.unity.visualeffectgraph/Documentation~/import-six-way-lightmap-textures-unity.md @@ -0,0 +1,20 @@ +# Import six-way lightmap textures into Unity + +Import and configure six-way lightmap textures for use in Visual Effect Graph. + +To import and set up six-way lightmap textures, follow these steps: + +1. In the **Project** window, go to your **Assets** folder. + +1. Import the two six-way lightmap texture files into the folder. + +1. For each imported texture, set the following: + - Set **Max Size** to match the texture resolution (for example, 4096 for 4K textures). + - Set **Compression** to balance quality and memory usage (for example, **High Quality (BC7)**). + - Set **sRGB (Color Texture)** to match your export settings: + - If you exported the texture in gamma space, enable **sRGB (Color Texture)**. + - If you exported the texture in linear space, disable **sRGB (Color Texture)**. + +1. Select **Apply** to save the import settings. + +After you complete these steps, the six-way lightmap textures are ready for use in Visual Effect Graph. diff --git a/Packages/com.unity.visualeffectgraph/Documentation~/six-way-lighting-landing.md b/Packages/com.unity.visualeffectgraph/Documentation~/six-way-lighting-landing.md new file mode 100644 index 00000000000..99e733cb2d4 --- /dev/null +++ b/Packages/com.unity.visualeffectgraph/Documentation~/six-way-lighting-landing.md @@ -0,0 +1,17 @@ +# Realistic smoke lighting + +Implement custom lighting models to have more control over the visual style of smoke and explosions and achieve better performance. + +| Page | Description | +|-------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------| +| [Realistic smoke lighting with six-way lighting]( six-way-lighting.md) | Learn how and why to use six-way lighting in Unity to illuminate smoke. | +| [Use tools to generate six-way lightmap textures](use-tools-generate-six-way-lightmap-textures.md) | Learn how to create six-way lightmap textures in your preferred VFX tool for use in Unity. | +| [Import six-way lightmap textures into Unity](import-six-way-lightmap-textures-unity.md) | Learn how to import and configure six-way lightmap textures for use in Visual Effect Graph. | +| [Create and configure a six-way lit particle system](create-configure-six-way-lit-particle-system.md) | Learn how to achieve enhanced realism for smoke or explosion effects. | +| [Customize free six-way lighting lightmap textures](create-effects-with-six-way-lighting.md) | Learn how to generate high-quality smoke or dust effects with free lightmap textures. | + + +## Additional resources + +- [Realistic smoke lighting with six-way lighting in VFX Graph](https://unity.com/blog/engine-platform/realistic-smoke-with-6-way-lighting-in-vfx-graph) + diff --git a/Packages/com.unity.visualeffectgraph/Documentation~/six-way-lighting-reference.md b/Packages/com.unity.visualeffectgraph/Documentation~/six-way-lighting-reference.md new file mode 100644 index 00000000000..67a27b7c292 --- /dev/null +++ b/Packages/com.unity.visualeffectgraph/Documentation~/six-way-lighting-reference.md @@ -0,0 +1,88 @@ +# Six-way smoke lit reference + +Learn about the available properties to configure smoke rendering. + +These properties let you adjust lighting, animation, color, and performance. + +The **Smoke Shader UI** contains the following properties: + +## Lightmap Remapping + +The **Lightmap Remapping** section contains the following properties: + +| **Property** | Description | +| :-------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Lightmap Remap Mode (dropdown)** | Select how to remap lightmap values for the smoke. The following options are available:
  • **None**: Map lightmap values directly, with no remapping.
  • **Parametric Contrast**: Adjust lightmap contrast using parameter controls to boost or soften lighting transitions.
  • **Custom Curve**: Define a custom remap curve for precise control over lighting effects on the smoke.
| +| **Lightmap Remap Range** | Set the input/output range for lightmap remapping, clamping or stretching light values as needed. | +| **Use Alpha Remap** | Enable remapping of alpha values based on lighting to control transparency dynamically. | + +## Emissive + +The **Emissive** section contains the following properties: + +| **Property** | Description | +| :------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Emissive Mode (dropdown)** | Choose how the smoke emits light. The following options are available:
  • **None**: Disable emissive contribution, so smoke is only lit by external lights.
  • **Single Channel**: Use one channel to define emissive intensity, typically as a grayscale value.
  • **Map**: Apply a texture map to control emissive values for spatially varying glow.
| + +## Color and Alpha + +The **Color and Alpha** section contains the following properties: + +| **Property** | Description | +| :------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Use Color Absorption** | Enable simulation of color absorption to let smoke filter and tint passing light. | +| **Receive Shadows** | Allow smoke to receive shadows from other objects for added realism. | +| **Enable Cookie** | Apply light cookies (patterned masks) to affect light interaction with the smoke. | +| **Color Mode (dropdown)** | Control how color data is interpreted for rendering. The following options are available:
  • **None**: Use base color directly with no color processing.
  • **Everything**: Apply color processing to all channels.
  • **Base Color**: Process only the base color channel.
  • **Emissive**: Process only the emissive channel.
  • **Base Color And Emissive**: Process both base color and emissive channels.
| +| **Use Base Color Map** | Enable a texture map for base color to allow detailed color variation within the smoke. | +| **Base Color Map Mode (dropdown)** | Select which channels to use from the base color map. The following options are available:
  • **None**: Apply no base color map.
  • **Everything**: Use all color channels from the base color map.
  • **Color**: Use only color channels (RGB) from the map.
  • **Alpha**: Use only the alpha channel from the map for transparency.
  • **Color And Alpha**: Use both color and alpha channels from the map.
| + +## Texture and UV + +The **Texture and UV** section contains the following properties: + +| **Property** | Description | +| :------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Uv Mode (dropdown)** | Specify how UV coordinates are generated or used. The following options are available:
  • **Default**: Apply standard UV mapping for the texture.
  • **Flipbook**: Use flipbook animation for texture UVs, ideal for animated smoke sequences.
  • **Scale And Bias**: Scale and offset UVs for texture manipulation.
| +| **Flipbook Layout (dropdown)** | Define the layout of flipbook frames for animated textures. The following options are available:
  • **Texture 2D**: Use a standard 2D texture for smoke rendering.
  • **Texture 2D Array**: Use an array of 2D textures for complex animations or variations.
| +| **Base Color** | Set the base color for the smoke, as a constant or via a texture. | +| **Flipbook** | Specify the flipbook asset or parameters for animated texture sequences. | +| **Flipbook Blend Frames** | Control blending between flipbook frames for smooth animation. | + +## Particle Rendering + +The **Particle Rendering** section contains the following properties: + +| **Property** | Description | +| :------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Use Soft Particle** | Enable soft particle rendering to fade smoke edges near intersecting geometry for seamless integration. | +| **Sort (dropdown)** | Control particle sorting for correct transparency rendering. The following options are available:
  • **Auto**: Automatically determine the best sorting mode.
  • **Off**: Disable sorting, which might cause visual artifacts in transparency.
  • **On**: Enable sorting for correct draw order.
| +| **Sort Mode (dropdown)** | Specify sorting algorithm for particles. The following options are available:
  • **Distance To Camera**: Sort by distance to the camera, common for transparency.
  • **Youngest In Front**: Sort by particle age, with newest particles in front.
  • **Camera Depth**: Sort by camera depth buffer.
  • **Custom**: Use a custom sorting function.
| +| **Revert Sorting** | Reverse the sorting order when needed. | +| **Compute Culling** | Enable GPU culling of particles outside the view frustum for performance. | +| **Frustum Culling** | Cull smoke particles outside the camera frustum to optimize rendering. | +| **Cast Shadows** | Enable smoke particles to cast shadows onto other geometry. | + +## Render States + +The **Render States** section contains the following properties: + +| **Property** | Description | +| :---------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Render States** | Control advanced render state overrides for the smoke material. | +| **Blend Mode (dropdown)** | Set how smoke blends with the background. The following options are available:
  • **Additive**: Add smoke color to the background, ideal for light or glow effects.
  • **Alpha**: Use standard alpha blending for semi-transparent smoke.
  • **Alpha Premultiplied**: Use premultiplied alpha for improved compositing.
  • **Opaque**: Render smoke as fully opaque, with no blending.
| +| **Cull Mode (dropdown)** | Determine which faces are rendered. The following options are available:
  • **Default**: Apply standard culling (usually back-face).
  • **Front**: Render only front faces.
  • **Back**: Render only back faces.
  • **Off**: Disable face culling to render all faces.
| +| **Z Write Mode (dropdown)** | Control writing to the depth buffer (Z). The following options are available:
  • **Default**: Apply standard Z write behavior.
  • **Off**: Disable Z write, useful for transparency.
  • **On**: Enable Z write when needed for certain effects.
| +| **Z Test Mode (dropdown)** | Set the depth test function for rendering order. The following options are available:
  • **Default**: Use the default depth test (usually Less).
  • **Less**: Pass if incoming depth is less than stored.
  • **Greater**: Pass if incoming depth is greater than stored.
  • **L Equal**: Pass if less than or equal to stored.
  • **G Equal**: Pass if greater than or equal to stored.
  • **Equal**: Pass if depths are equal to stored.
  • **Not Equal**: Pass if depths are not equal to stored.
  • **Always**: Always pass, with no depth test.
| + +## Alpha and Motion + +The **Alpha and Motion** section contains the following properties: + +| **Property** | Description | +| :------------------------- | :----------------------------------------------------------------------------------------------------------- | +| **Alpha** | Set a global alpha value for smoke to control overall transparency. | +| **Use Alpha Clipping** | Enable alpha clipping to discard pixels below a certain alpha threshold for hard edges. | +| **Generate Motion Vector** | Enable motion vector output for the smoke to support motion blur. | +| **Exclude From TU And A** | Exclude smoke from certain rendering passes, such as temporal upscaling or anti-aliasing. | +| **Sorting Priority** | Set render queue priority to control draw order relative to other transparent objects. | diff --git a/Packages/com.unity.visualeffectgraph/Documentation~/six-way-lighting.md b/Packages/com.unity.visualeffectgraph/Documentation~/six-way-lighting.md new file mode 100644 index 00000000000..482feb6a7ac --- /dev/null +++ b/Packages/com.unity.visualeffectgraph/Documentation~/six-way-lighting.md @@ -0,0 +1,62 @@ +# Realistic smoke lighting with six-way lighting + +Blend pre-baked lightmaps and achieve dynamic lighting for smoke and other visual effects with six-way lighting. + +Six-way lighting stores lighting from six directions in textures. At runtime, Unity blends these textures based on scene lighting. Effects like smoke, explosions, and clouds thus respond to light sources. + +Six-way lighting enables the following: + +- Volumetric lighting for 2D or flipbook-based particle effects. +- Scaling for real-time visual effects (VFX). +- Adjustable color and emission. +- Compatibility with Unity's lighting system, including HDRP and URP. + +You can use six-way lighting in such scenarios as the folllowing: + +- Daytime smoke with sun and sky lighting. +- Nighttime effects with static or dynamic lights. +- Sandstorms and tornadoes. +- Glowing explosions. + +## How six-way lighting works + +Six-way lighting pre-bakes directional lighting into six sprite texture lightmaps. Each lightmap captures how the sprite is illuminated from a single direction: top, bottom, left, right, front, or back. + +At runtime, Unity shaders blend these six lightmaps based on the current scene lighting. Particles then react to light from any direction. + +## Supported lighting and Unity features + +You can use six-way lighting with the built-in VFX Graph Six-Way Smoke Lit output in both URP and HDRP. + +Six-way lighting supports indirect lighting from the following: +- Light Probes +- Adaptive Probe Volumes +- Ambient Probes +- Light Probe Proxy Volumes +- Dynamic point, spot, area, and directional lights + +**Note:** Six-way lighting does not support specular contributions from reflection probes. + +## Lightmap channel mapping + +Unity stores the six directional lightmaps in two RGBA textures. The channel mapping is as follows: + +- Lightmap A: + - Red: right + - Green: top + - Blue: back + - Alpha: transparency +- Lightmap B: + - Red: left + - Green: bottom + - Blue: front + - Alpha: emissive data + +![Five versions of the same smoke sprite. The first is red and lit from the right. The second is green and lit from the top. The third is blue and lit from the back. The fourth appears white and stores transparency in the Alpha channel. The fifth is a multicolored combination of all the previous sprites and stores the RGBA data in Lightmap A.](Images/lightmap-a.jpg) + + +![Five versions of the same smoke sprite. The first is red and lit from the left. The second is green and lit from the bottom. The third is blue and lit from the front. The fourth appears black and does not store any information in the Alpha channel. The fifth is a multicolored combination of all the previous sprites and stores the RGBA data in Lightmap B.](Images/lightmap-b.jpg) + +## Simulate fire and explosions + +To create glowing effects such as fire or explosions, store emissive data in the Alpha channel of Lightmap B to enable dynamic control over the effect's glow and color at runtime. diff --git a/Packages/com.unity.visualeffectgraph/Documentation~/use-tools-generate-six-way-lightmap-textures.md b/Packages/com.unity.visualeffectgraph/Documentation~/use-tools-generate-six-way-lightmap-textures.md new file mode 100644 index 00000000000..a28af0b1661 --- /dev/null +++ b/Packages/com.unity.visualeffectgraph/Documentation~/use-tools-generate-six-way-lightmap-textures.md @@ -0,0 +1,15 @@ +# Generate six-way lightmap textures for visual effects + +Create six-way lightmap textures in your preferred VFX tool for use in Unity. + +To create and export six-way lightmap textures for Unity, follow these steps: + +1. Simulate or paint the smoke or cloud effect in your preferred VFX tool. +2. Set six lighting directions: top, bottom, left, right, front, and back. +3. Render the lighting result from each direction. +4. Pack the lighting data into two textures: + - In the first texture, set the red, green, and blue channels to store lighting data, and set the alpha channel to store transparency. + - In the second texture, set the red, green, and blue channels to store lighting data, and set the alpha channel to store emissive or scattering effects. +5. Export the textures in a format that Unity supports. + +After you complete these steps, you can use the six-way lightmap textures in Unity. From 329da70b6b4e68da2f406f62e3955e4bd330355d Mon Sep 17 00:00:00 2001 From: Rose Hirigoyen Date: Wed, 15 Oct 2025 14:57:05 +0000 Subject: [PATCH 45/49] [Backport 6.3] 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 ++++--- .../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 +-- 25 files changed, 473 insertions(+), 548 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/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 c5e0f253f157baafb748984a2afaf8699c1e2215 Mon Sep 17 00:00:00 2001 From: Rasmus Roenn Nielsen Date: Thu, 16 Oct 2025 18:21:05 +0000 Subject: [PATCH 46/49] [Backport] Bugfixes + improvements to HDRP ReBLUR Denoiser (UUM-103701 + UUM-103202 + UUM-103766) --- .../Shaders/TemporalAntialiasing.hlsl | 6 ++---- .../HDRenderPipeline.RaytracingReflection.cs | 6 +++--- .../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 +++--- 10 files changed, 38 insertions(+), 31 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/Raytracing/HDRenderPipeline.RaytracingReflection.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRenderPipeline.RaytracingReflection.cs index 75f665ecfae..ffea10d2c3a 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 @@ -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 d28df3a49ea66754301a557ff82174f1fe9708e8 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Sat, 18 Oct 2025 00:04:21 +0000 Subject: [PATCH 47/49] [Port to 6000.3] Converting the AssetType test project to a test package --- .../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 352bd31199ebbfe0401b026629d76030fde526d5 Mon Sep 17 00:00:00 2001 From: Reach Platform Support Date: Sat, 18 Oct 2025 00:04:21 +0000 Subject: [PATCH 48/49] [Port] [6000.3] 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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

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 018112343980d1be0a9f01f257acfd305f1826ff Mon Sep 17 00:00:00 2001 From: Evergreen Date: Mon, 20 Oct 2025 04:32:32 +0000 Subject: [PATCH 49/49] [Port] [6000.3] 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 cda8bcda8ba..2b68c16b3f9 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 { @@ -1013,6 +1014,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); @@ -1025,6 +1032,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()

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%0D`1Q7a6DI9^x5GrM!4{Qdij!UACl(Ttj?y)b=r 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