View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0004596 | NoesisGUI | Unity | public | 2025-12-02 00:49 | 2026-02-19 15:10 |
| Reporter | ARPP3 | Assigned To | jsantos | ||
| Priority | normal | Severity | major | ||
| Status | resolved | Resolution | fixed | ||
| Product Version | 3.2.10 | ||||
| Target Version | 3.2.11 | Fixed in Version | 3.2.11 | ||
| Summary | 0004596: 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 | |||||
| Platform | Windows | ||||
|
Could you please try reproducing this using the 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? |
|
|
(Ticket is public now) |
|
|
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 |
|
|
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! |
|
|
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 1) I have DX12 enabled, and all of this was still only tested in 6.1
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)
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:
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, |
|
|
And to be clear these changes were made in |
|
|
Thanks for the detailed answer and for the workaround. There’s definitely something wrong in the way we’ve implemented If possible, could you test the |
|
|
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. 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 � |
|
|
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 The official fix will be included in the upcoming 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)
{
|
|
| 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 |