View Issue Details

IDProjectCategoryView StatusLast Update
0004596NoesisGUIUnitypublic2026-02-19 15:10
ReporterARPP3 Assigned Tojsantos  
PrioritynormalSeveritymajor 
Status resolvedResolutionfixed 
Product Version3.2.10 
Target Version3.2.11Fixed in Version3.2.11 
Summary0004596: With MSAA 2x, 4x, or 8x enabled in URP, UI will not render onto screen
Description

Hello,

I have been running into an issue in Unity 6.1 where enabling any level of MSAA will stop the UI from compositing onto the final image.

When I change MSAA to 2x, 4x, or 8x, then my UI will not appear on screen. This MSAA setting is global and configured for the entire Universal Render Pipeline in the Quality settings. I don't know if it's relevant but, I do have a camera stack configured: There is 1 base camera, and it has a second camera rendering another layer and then finally the UI camera. And I have configured Forward+ rendering for all of these renderers.

I did a PIX capture and this is what I found: Noesis is rendering in the pipeline, but, it is targeting the wrong buffer -- it writes to the large, unresolved 4x MSAA buffer, while Unity uses the smaller, resolved buffer for the final blit, causing the UI to be missing from the screen. I have attached an image to highlight this.

I don't know if this is easy to reproduce. I have render graph (framegraph) enabled so, maybe it's scheduling the resolve to happen sooner than the noesis plugin issues the draw events? I am not sure exactly what the cause is. This might be simple to reproduce, I have not tried outside of our project,

I have listed this as major error for now but would be a blocker going to release. Let me know if you need any more details,

Attached Files
image.png (671,691 bytes)
PlatformWindows

Relationships

related to 0004413 resolvedjsantos Incompatibility with HDRP 17.2 and Unity 6.3.4 
related to 0004392 resolvedjsantos Unity3D build & macOS => broken UI 

Activities

jsantos

jsantos

2025-12-02 12:34

manager   ~0011502

Could you please try reproducing this using the HelloWorld sample and list the exact steps?

I’ll take a look at this as soon as possible, but having clear repro steps will definitely help us resolve it faster. Also, please try it with Unity 6.2 if you can.

We’re rendering using the render graph, and I believe that rendering to the unresolved 4× MSAA buffer is expected, since you want the UI rendered with 4× MSAA, correct?

jsantos

jsantos

2025-12-02 12:35

manager   ~0011503

Last edited: 2025-12-02 12:35

(Ticket is public now)

ARPP3

ARPP3

2025-12-02 13:46

reporter   ~0011504

Thanks for the quick response! I will give it a go to reproduce it and come up with some steps this evening. I can also try download 6.2 to try there. Hopefully it's simple enough to reproduce,

As for whether this is expected: Yes, it's definitely expected for it to render to the MSAA buffer, though I would not mind if there's an option to render post-resolve since our UI already looks fine with PPAA :D

jsantos

jsantos

2025-12-02 14:49

manager   ~0011505

though I would not mind if there's an option to render post-resolve

Probably this can be achieved playing with the settings of the camera that is part of rendering the UI in the stack.

I will have a look at everything once I have repro steps.

Thank you!

ARPP3

ARPP3

2025-12-02 23:46

reporter   ~0011506

Good evening! I have good news and bad news,

The bad news is that I could not reproduce this in the Hello World sample. I copied every setting mimicked the 3-camera stack I have, but no luck,

The good news is that I was able to fix this locally, with just a few changes to NoesisView.cs. So maybe this gives you a headstart.

1) I have DX12 enabled, and all of this was still only tested in 6.1
2) I added texture handles to the PassData class (this helps for the render graph debugger, to see what's written)

// This class was updated to include the color handle and depth handle
private class PassData
{
    public bool flipY;
    public bool clearStencil;
    public NoesisView view;
    public UniversalCameraData cameraData;

    public TextureHandle colorHandle;
    public TextureHandle depthHandle;
}

3) I used those added texture handles, to inform the unsafe builder how the textures are used (I noticed you already have this handled for non DX12)

passData.colorHandle = resourceData.activeColorTexture;
builder.UseTexture(passData.colorHandle, AccessFlags.Write);

passData.depthHandle = resourceData.activeDepthTexture;
builder.UseTexture(passData.depthHandle, AccessFlags.ReadWrite);

// ... which was added before this line...
// Ensure that Unity does not cull this pass
builder.AllowPassCulling(false);

4) This is the most important change. Without this, nothing renders. With it, I see the UI perfectly. In the render function lambda, I simply added this line:

context.cmd.SetRenderTarget(passData.colorHandle);

NoesisRenderer.RenderOnscreen_(passData.view._uiView, passData.flipY, context.cmd, true,
    passData.clearStencil);

I don't know why this is working in the HelloWorld project for both MSAA on/off, yet in my project only works with MSAA off. I guess this is a very project-specific edge case where the render graph chooses to resolve the MSAA texture, before it's required. This one line of code added, seems to have reliably fixed it. I guess without it, then RenderGraph does not know to not resolve the MSAA buffer before the UI pass. Still odd that I could not reproduce this behaviour.

I really hope this helps! Sorry I couldn't get a repro,

ARPP3

ARPP3

2025-12-02 23:49

reporter   ~0011507

And to be clear these changes were made in NoesisView.cs in the function public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) which is at line 842 for Noesis 3.2.10. I made these changes for the unsafe pass, which seems to be a DX12 crash fix you've made previously :)

jsantos

jsantos

2025-12-03 01:16

manager   ~0011508

Thanks for the detailed answer and for the workaround.

There’s definitely something wrong in the way we’ve implemented UnsafePass (or it could be a Unity bug, but I doubt it because we see this in all major versions of Unity including 6.3). The reason we’re using an inefficientUnsafePass instead of RasterRenderPass is that Unity crashes on D3D12 when it calls into our code. I’m not sure whether we’re doing something incorrectly, the documentation for the render graph isn’t very good, and the API changes with practically every Unity release.

If possible, could you test the RasterRenderPass path in your project? Switching the renderer to anything other than D3D12 should be enough. I’m curious whether everything works correctly with RasterRenderPass. I suspect it will, since we explicitly call SetRenderAttachment.

ARPP3

ARPP3

2025-12-03 16:56

reporter   ~0011516

Hey! I understand the frustration, porting over my stuff to use render graph was mis not pleasant, I am just glad it's done now.. hoping they don't change much �

DX12: it just crashed when I tried, 3/3 crash with DX12.
DX11: MSAA works out of the box with no changes.

Seems like the unsafe pass then. Since you don't have a repro project, just to reiterate the change that actually fixed this for me was setting the render target on the command buffer. I didn't test anything with XR or stereoscopy. Or trying anything with the depth stencil buffer, which I think that function accepts both.

But yeah, DX11 works, DX12 crashes 3/3 with the raster render pass. Seems like your suspicion is correct! Hope this helps! Thanks �

image-2.png (29,782 bytes)   
image-2.png (29,782 bytes)   
jsantos

jsantos

2026-02-19 15:10

manager   ~0011920

Thank you for the report, you were exactly on the right track with your proposed changes.

This helped clarify exactly why we must continue relying on UnsafePass for D3D12 in the Render Graph. We are actively discussing this with Unity to find a better long-term solution.

The official fix will be included in the upcoming 3.2.11 update. Please find the patch attached for your immediate use

4596.patch (2,826 bytes)   
Index: NoesisView.cs
===================================================================
--- NoesisView.cs	(revision 16673)
+++ NoesisView.cs	(working copy)
@@ -832,6 +832,8 @@
             public bool clearStencil;
             public NoesisView view;
             public UniversalCameraData cameraData;
+            public TextureHandle activeColorTexture;
+            public TextureHandle activeDepthTexture;
         }
 
         ProfilingSampler _profilingSampler = new ProfilingSampler("Noesis.RenderOnscreen");
@@ -840,8 +842,12 @@
         {
             if (_view._uiView != null && _view._visible)
             {
-                // D3D12 crashes when using RasterRenderPass and for now we need to use UnsafePass
-                // Tested on 6.0.59f2, 6.1.14f1, 6.2.6f2, 6.3.0b5
+                // For D3D12, UnsafePass is needed because we are flushing the command buffer
+                // using kUnityD3D12EventConfigFlag_FlushCommandBuffers, which crashes Unity inside
+                // a RasterRenderPass. We need flushing because we are using our own Descriptor Heaps.
+                // Until Unity offers a way to reuse the active descriptor heap (as commented here:
+                // https://discussions.unity.com/t/d3d12-not-restoring-descriptorseats-aftert-invoking-low-level-native-plug-in/903907),
+                // we need to keep using UnsafePass.
 
                 if (UnityEngine.SystemInfo.graphicsDeviceType == UnityEngine.Rendering.GraphicsDeviceType.Direct3D12)
                 {
@@ -854,12 +860,20 @@
                         passData.clearStencil = _view._clearStencil;
                         passData.flipY = SystemInfo.graphicsUVStartsAtTop && !resourceData.isActiveTargetBackBuffer;
                         passData.cameraData = cameraData;
+                        passData.activeColorTexture = resourceData.activeColorTexture;
+                        passData.activeDepthTexture = resourceData.activeDepthTexture;
 
                         // Ensure that Unity does not cull this pass
                         builder.AllowPassCulling(false);
 
+                        builder.UseTexture(passData.activeColorTexture, AccessFlags.Write);
+                        builder.UseTexture(passData.activeDepthTexture, AccessFlags.ReadWrite);
+
                         builder.SetRenderFunc((PassData passData, UnsafeGraphContext context) =>
                         {
+                            // UnsafePass requires explicitly binding the resources
+                            context.cmd.SetRenderTarget(passData.activeColorTexture, passData.activeDepthTexture);
+
                         #if ENABLE_VR && ENABLE_XR_MODULE
                             if (passData.cameraData.xrRendering)
                             {
4596.patch (2,826 bytes)   

Issue History

Date Modified Username Field Change
2025-12-02 00:49 ARPP3 New Issue
2025-12-02 00:49 ARPP3 File Added: image.png
2025-12-02 10:19 sfernandez Assigned To => jsantos
2025-12-02 10:19 sfernandez Status new => assigned
2025-12-02 10:19 sfernandez Target Version => 3.2.11
2025-12-02 12:34 jsantos Note Added: 0011502
2025-12-02 12:35 jsantos View Status private => public
2025-12-02 12:35 jsantos Note Added: 0011503
2025-12-02 12:35 jsantos Note Edited: 0011503
2025-12-02 12:36 jsantos Status assigned => feedback
2025-12-02 13:46 ARPP3 Note Added: 0011504
2025-12-02 13:46 ARPP3 Status feedback => assigned
2025-12-02 14:49 jsantos Note Added: 0011505
2025-12-02 14:49 jsantos Status assigned => feedback
2025-12-02 23:46 ARPP3 Note Added: 0011506
2025-12-02 23:46 ARPP3 Status feedback => assigned
2025-12-02 23:49 ARPP3 Note Added: 0011507
2025-12-03 01:16 jsantos Note Added: 0011508
2025-12-03 01:16 jsantos Status assigned => feedback
2025-12-03 16:56 ARPP3 Note Added: 0011516
2025-12-03 16:56 ARPP3 File Added: image-2.png
2025-12-03 16:56 ARPP3 Status feedback => assigned
2025-12-12 02:26 jsantos Relationship added related to 0004413
2026-01-20 19:32 jsantos Target Version 3.2.11 => 3.2.12
2026-02-19 15:02 jsantos Target Version 3.2.12 => 3.2.11
2026-02-19 15:04 jsantos Relationship added related to 0004392
2026-02-19 15:10 jsantos Note Added: 0011920
2026-02-19 15:10 jsantos File Added: 4596.patch
2026-02-19 15:10 jsantos Status assigned => resolved
2026-02-19 15:10 jsantos Resolution open => fixed
2026-02-19 15:10 jsantos Fixed in Version => 3.2.11