You place a design into Unity and it comes out washed out. Or a panel comes out too dark. Sometimes both on the same screen. It is not your export settings and it is not the importer.
Design tools composite in gamma space. Unity, in Linear colour space, converts to linear, blends there and converts back. Same layers, same opacity, different answer:
Base 0.15 with 50% white - design tool 147, Unity 189, off by 42/255
Base 0.30 with 50% white - design tool 166, Unity 194, off by 28/255
Overlay - design tool 153, Unity 78, off by 75/255
Hard light - design tool 230, Unity 157, off by 73/255
Every one of those numbers was rendered in a Linear project and read back pixel by pixel. The deviation grows as the background darkens, which is why it is worst on dark-themed UI.
WHAT IT DOES
• Twelve blend modes - normal, multiply, screen, overlay, darken, lighten, colour dodge, colour burn, hard light, soft light, difference, exclusion. uGUI has none of these.
• Gamma-space compositing, so plain alpha matches your design file too, not only the blend modes.
• Works on screens you already built. Nothing is imported and nothing is rebuilt.
NOTHING IS IMPORTED
Select the Graphics you want, pick a mode, press Apply. There is no conversion step and no rebuilt hierarchy. Remove the component and the Graphic goes back to exactly what it was - the original material is remembered and put back, and the backdrop component is removed too once nothing on the canvas needs it. Everything goes through Undo.
WHY IT COSTS WHAT IT COSTS
The hardware blender works in whatever space the render target is in, so a blend-state change cannot fix this. That was tried and measured, and it changes nothing. Gamma-space compositing means reading the destination yourself: Blend Off, sample what is behind, blend in gamma, write the result.
That read is the whole cost, so it is done carefully:
• One capture per canvas per frame, shared by every blended Graphic. A grab per element is what makes this kind of effect unusable on mobile.
• Only elements that need it are served. Normal at full opacity is exactly what uGUI already does, so those stay on the cheap path and never receive the buffer.
• If nothing needs the backdrop, nothing is captured at all.
• Half resolution by default - blending is smooth, so half size is hard to tell apart and costs a quarter of the bandwidth.
• 8-bit buffer by default. Measured: 16-bit buys about 1/255 and costs double the memory and bandwidth. The option is there with that trade written next to it.
ACCURACY
Verified against the reference blend maths in a Linear project, twelve modes across four base, top and alpha combinations: ten modes match exactly, two land within 4/255 at the very dark end. That remainder is the floor of an 8-bit target, not a mistake in the maths - sRGB's curve is steepest in the dark, so a step or two of rounding cannot be removed. Set against the 42 to 75 out of 255 you started with it is invisible, but the honest claim is below what is measurable on an 8-bit display, never zero deviation.
IN A GAMMA PROJECT THERE IS NO PROBLEM
Unity already composites the way design tools do there, and the window says so plainly instead of pretending to fix something you do not have. The blend modes are still useful, because uGUI has none of its own.
SAMPLE SCENE
The same four modes twice - plain uGUI on top, blended underneath, identical inputs. The difference is the point.
CLEAN AND SAFE
• Namespaced code (Krykftn.QuickUIBlendPro) - no global scope pollution
• Respects the canvas clip rect and stencil, so masks and ScrollRects keep working
• Without com.unity.ugui the tool switches itself off quietly instead of filling your console, and a one-click Setup window installs it
REQUIREMENTS
• Unity 2022.3 LTS or newer
• Built-in Render Pipeline - not URP or HDRP, see below
• Unity's UI package (com.unity.ugui) - free
• No external dependencies, no accounts, no plugins
HONEST LIMITS
Built-in Render Pipeline only. The backdrop is captured with a camera CommandBuffer, and the Scriptable Render Pipelines do not execute camera command buffers - so under URP or HDRP the buffer would never reach the shader. Rather than let a screen draw wrong, the tool refuses to attach and says why, in the window, on the component and in Self Check; your Graphics are left exactly as they were. URP support needs a ScriptableRendererFeature and is not claimed until it is built and measured.
The capture is of what sits behind the canvas. Elements blending over the scene or the canvas background are correct; an element blending over another element in the same canvas sees the state before that element drew, so put those on a sub-canvas. Blending needs Blend Off, so a blended Graphic writes opaque pixels within its own rect. No performance figure is quoted here, because a number measured headlessly would not be representative - the tool is built so the cost is one blit, and only when something actually needs it.