Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Overdraw is repeated processing of the same image location during rendering, for example when several overlapping surfaces generate fragments for one output pixel. It can involve shading fragments that are later overwritten or combining several transparent layers. Overlapping transparent interfaces, particles and sprites are common sources of overdraw.[1][2]

Overdraw is a performance concern in virtual reality (VR) and augmented reality (AR) applications. Microsoft's mixed reality guidance identifies limiting overdraw as a GPU optimization, alongside reducing shader work and diagnosing bandwidth and pixel-processing bottlenecks. Overdraw describes rendering work; the resulting image can still have correct visibility.[3][4]

Meaning and measurement

In a raster graphics pipeline, rasterization produces fragments representing coverage of image samples. A fragment can be discarded by a depth or stencil test, shaded, or passed onward to framebuffer operations. A generated fragment, a fragment-shader invocation and a final pixel write are therefore different events. Multisampling, sample shading and helper invocations further complicate a one-to-one correspondence between fragments and pixels.[5]

An overdraw measurement must identify which events it counts. Sander, Nehab and Barczak's 2007 research defines an overdraw ratio as the number of pixels passing the depth test divided by the number of visible pixels; a ratio of one represents no overdraw under that definition. Arm's Mali profiling documentation instead describes an overdraw chart as the average number of fragments shaded per output pixel. These definitions address related workloads but use different counting rules.[4][2]

Related quantity Relationship to overdraw
Draw call count Counts commands to draw geometry. Reducing command submission can reduce CPU rendering cost, while overlapping geometry can still require repeated pixel work.[1]
Polygon or vertex count Describes geometry workload. Screen coverage and fragment cost are separate factors: even a low-polygon skybox can be limited by fragment shading or framebuffer access.[6]
Occlusion Describes one surface hiding another from a viewpoint. Overdraw concerns how much processing occurs while producing that visibility, including shaded surfaces subsequently covered by nearer ones.[4]
Occlusion culling Prevents hidden objects from being submitted for rendering. It can remove work before the GPU processes their geometry or fragments.[7]

Depth testing and rendering order

Opaque surfaces

A depth buffer records depth at image samples. With depth testing and depth writes enabled, a passing fragment can replace the stored depth, while a failing sample loses its coverage. This determines visibility, but the amount of shading avoided depends on when the test occurs.[5] Early depth testing, often called early-Z, can reject hidden fragments before their pixel shader executes. Rendering opaque geometry approximately from front to back can establish nearby depth values before farther surfaces reach the expensive shading stage.[6]

For example, if a distant opaque surface is shaded before a nearer surface covers it, its color contribution is overwritten. Drawing the nearer surface first gives an eligible early depth test an opportunity to reject the farther fragment. Depth testing performed after shading can still produce the correct image, but the rejected fragment has already incurred shader work.[2] In Unity's Built-in Render Pipeline, opaque render queues use front-to-back sorting by default. That is an engine policy rather than a rule applying to every renderer or GPU.[8]

Transparent surfaces and cutouts

Conventional alpha compositing combines a foreground color with the background that remains visible through it. The result depends on surface order, so multiple layers are commonly blended from back to front. Glass approximations, smoke and hair can require contributions from several surfaces at the same location. Processing those layers can be necessary to obtain the intended image.[9]

Unity's Built-in transparent queue is intended for alpha-blended shaders that do not write depth. Depth testing against opaque surfaces can still hide transparent fragments behind those surfaces; disabling depth writes does not mean disabling depth tests. Transparent layers that remain visible cannot all be treated as a single opaque occluder without changing the compositing result.[8][5][9]

Shader discard and shader-generated depth can affect the GPU's ability to determine visibility early.[2] The consequences depend on the architecture and shader: Arm's fragment pre-pass documentation, for example, explains that late-Z draws may require part of a fragment shader to run during both its visibility pre-pass and main pass.[10]

Processing cost

Overdraw increases the number of times a location can incur fragment shading, texture access or framebuffer operations. The term fill rate is sometimes used broadly for both fragment-shader throughput and framebuffer bandwidth, although these are distinct parts of the pipeline. Alpha blending that uses the destination color requires access to that color as well as an updated result.[6]

The number of layers alone does not describe their cost. A layer with a complex shader can cost more than one using simpler shading. Unreal Engine's Shader Complexity view visualizes shader instruction counts, but Epic warns that instruction count does not capture differences between texture operations and arithmetic, and can misrepresent some loops. A complexity heatmap is consequently an indicator to investigate, rather than a direct timing measurement.[11]

GPU visibility optimizations can also change the relationship between overlapping surfaces and executed work. Arm describes a hardware fragment pre-pass in Immortalis-G925, Mali-G725 and Mali-G625 that identifies visible fragments before the main rendering pass. Its compatible draws do not depend on front-to-back depth order for culling efficiency, but incompatible draws and shader behavior impose limitations. This is a documented architecture-specific example, not a guarantee about other GPUs or drivers.[10]

Relevance to XR rendering

Stereoscopic rendering produces views for the two eyes, so pixel work must be considered across the views actually rendered. Unity distinguishes multipass rendering from single-pass instanced rendering and multiview. Single-pass instancing reduces CPU usage and can reduce GPU usage, but both eye images still have to be produced.[12] Microsoft's holographic rendering documentation also warns that view, resolution and frame-rate parameters can vary across frames and between eyes. A fixed assumption about the pixel workload can therefore be misleading.[13]

The reason to reduce unnecessary work is to help meet the application's rendering deadlines. Microsoft's guidance relates insufficient performance to unstable holograms and inaccurate apparent head tracking, and its rendering overview connects a shorter pipeline with improved hologram stability. An overdraw reduction helps those goals only when the affected GPU work contributes to the application's bottleneck.[3][13]

Untethered XR adds platform-specific considerations. Unity's URP guidance describes tile-based GPUs as common on these devices and explains that post-processing can introduce additional texture loads, copies and work per view. It advises disabling URP depth priming for untethered XR, where the added depth pre-pass can duplicate work already addressed by hardware visibility mechanisms. That advice is scoped to this rendering configuration.[14]

Foveated rendering is a separate way to reduce pixel workload. Unity's OpenXR implementation uses variable-rate techniques to reduce peripheral rendering resolution, with a fixed or gaze-dependent high-resolution region. It changes sampling density rather than removing the overlapping surfaces that cause overdraw.[15]

Profiling

Profiling first separates CPU limitations from GPU limitations. Lowering render-target resolution and observing a performance improvement is evidence of a pixel-related GPU limitation, but does not by itself identify overdraw as the cause. Shader cost, framebuffer traffic and other resolution-dependent work need to be examined as well.[3][6]

Tool or view What it shows Interpretation
Unity URP Rendering Debugger An Overdraw debug view showing where Unity draws pixels over one another.[16] Useful for locating overlap in the render pipeline being inspected.
RenderDoc Texture Viewer Quad Overdraw overlays for a selected draw or for its pass up to that draw.[17] Measures overdraw at 2 by 2 quad granularity. The draw and pass scopes are different; neither should silently be treated as a whole-frame pixel count.
Unreal Engine Shader Complexity A visualization based on shader instructions used per pixel.[11] Helps identify costly materials and particle effects, with the instruction-count limitations described above.
Arm Streamline Mali counters Shaded fragments per output pixel, early and late depth/stencil activity, and memory traffic.[2] Can relate overlap to executed work on the supported GPU. Counter definitions and architecture matter.

Measurements should preserve the distinction between a particular draw, a rendering pass and a frame. RenderDoc also provides a Depth Test overlay to locate areas passing or failing the selected draw's test; this answers a visibility question different from the Quad Overdraw overlay.[17]

Reducing the workload

Different changes address different sources of repeated work. Removing or simplifying overlapping transparent UI, particles and sprites addresses common sources identified in Unity's performance guidance. Simplifying fragment shaders reduces the cost of each remaining layer, while reducing render-target resolution reduces the number of image locations processed.[1] Culling hidden objects before submission can remove geometry work as well as potential overdraw.[7]

A depth-only pre-pass can establish visibility before expensive shading. It also adds a pass over geometry, so its costs must be weighed against the shading saved. Arm distinguishes an application pre-pass that submits and tiles geometry twice from its hardware fragment pre-pass, which keeps intermediate structures on chip. Unity's untethered XR guidance supplies a concrete case where enabling the application technique is discouraged.[10][14]

Mesh ordering is another approach. Sander, Nehab and Barczak developed algorithms that cluster and reorder triangles to reduce overdraw while retaining vertex-cache locality. Their experiments examine the trade-off between ordering overhead, vertex processing and pixel shading; their measured results concern the tested models, shaders and hardware, rather than a universal XR optimization budget.[4]

Transparent rendering requires preserving the intended composition. McGuire and Bavoil's weighted blended order-independent transparency combines contributions without sorting individual surfaces, using bounded storage and an approximate color-compositing method. It still processes transparent contributions and has image-quality limitations, so removing sorting does not imply removing transparent overdraw.[9]

Reviewed 12 October 2026. Raster overdraw definitions and counting rules, depth and transparency behavior, cited profiling methods, and documented XR rendering implications. Device benchmarks and universal performance budgets were not checked. About review dates.

References

  1. ↑ 1.0 1.1 1.2 "Reduce rendering work on the CPU or GPU". Unity 6.0 Manual. https://docs.unity3d.com/6000.0/Documentation/Manual/OptimizingGraphicsPerformance.html. Retrieved 2026-10-12.
  2. ↑ 2.0 2.1 2.2 2.3 2.4 Peter Harris (2019-03-20). "Accelerating Mali GPU analysis using Arm Mobile Studio". Arm Community. https://developer.arm.com/community/arm-community-blogs/b/mobile-graphics-and-gaming-blog/posts/accelerating-mali-gpu-analysis-using-arm-mobile-studio. Retrieved 2026-10-12.
  3. ↑ 3.0 3.1 3.2 "Understanding performance for mixed reality". Microsoft Learn. https://learn.microsoft.com/en-us/windows/mixed-reality/develop/advanced-concepts/understanding-performance-for-mixed-reality. Retrieved 2026-10-12.
  4. ↑ 4.0 4.1 4.2 4.3 Pedro V. Sander, Diego Nehab and Joshua Barczak (2007). "Fast Triangle Reordering for Vertex Locality and Reduced Overdraw". ACM Transactions on Graphics, 26(3), article 89. doi:10.1145/1276377.1276489. https://gfx.cs.princeton.edu/gfx/pubs/Sander_2007_%3ETR/tipsy.pdf. Retrieved 2026-10-12.
  5. ↑ 5.0 5.1 5.2 "Fragment Operations". Vulkan Specification, Khronos Group. https://docs.vulkan.org/spec/latest/chapters/fragops.html. Retrieved 2026-10-12.
  6. ↑ 6.0 6.1 6.2 6.3 Cem Cebenoyan (2004). "Chapter 28. Graphics Pipeline Performance". GPU Gems, NVIDIA Developer. https://developer.nvidia.com/gpugems/gpugems/part-v-performance-and-practicalities/chapter-28-graphics-pipeline-performance. Retrieved 2026-10-12.
  7. ↑ 7.0 7.1 "Performance recommendations for Unity". Microsoft Learn. https://learn.microsoft.com/en-us/windows/mixed-reality/develop/unity/performance-recommendations-for-unity. Retrieved 2026-10-12.
  8. ↑ 8.0 8.1 "Render queues and sorting behaviours". Unity 6.0 Manual. https://docs.unity3d.com/6000.0/Documentation/Manual/built-in-rendering-order.html. Retrieved 2026-10-12.
  9. ↑ 9.0 9.1 9.2 Morgan McGuire and Louis Bavoil (2013-12-19). "Weighted Blended Order-Independent Transparency". Journal of Computer Graphics Techniques, 2(2), pp. 122-141. https://jcgt.org/published/0002/02/09/paper-lowres.pdf. Retrieved 2026-10-12.
  10. ↑ 10.0 10.1 10.2 Tord Øygard (2024-11-28). "Hidden Surface Removal in Immortalis-G925: The Fragment Prepass". Arm Community. https://developer.arm.com/community/arm-community-blogs/b/mobile-graphics-and-gaming-blog/posts/immortalis-g925-the-fragment-prepass. Retrieved 2026-10-12.
  11. ↑ 11.0 11.1 "Viewport Modes in Unreal Engine". Epic Games Developer Community. https://dev.epicgames.com/documentation/unreal-engine/viewport-modes-in-unreal-engine. Retrieved 2026-10-12.
  12. ↑ "Introduction to stereo rendering". Unity 6.0 Manual. https://docs.unity3d.com/6000.0/Documentation/Manual/SinglePassStereoRendering.html. Retrieved 2026-10-12.
  13. ↑ 13.0 13.1 "Holographic Rendering overview". Microsoft Learn. https://learn.microsoft.com/en-us/windows/mixed-reality/develop/advanced-concepts/rendering-overview. Retrieved 2026-10-12.
  14. ↑ 14.0 14.1 "Optimize for untethered XR devices in URP". Unity 6.0 Manual. https://docs.unity3d.com/6000.0/Documentation/Manual/xr-untethered-device-optimization.html. Retrieved 2026-10-12.
  15. ↑ "Foveated rendering in OpenXR". Unity OpenXR Plugin documentation. https://docs.unity3d.com/Packages/[email protected]/manual/features/foveatedrendering.html. Retrieved 2026-10-12.
  16. ↑ "Rendering Debugger window reference for URP". Unity 6.0 Manual. https://docs.unity3d.com/6000.0/Documentation/Manual/urp/features/rendering-debugger-reference.html. Retrieved 2026-10-12.
  17. ↑ 17.0 17.1 "Texture Viewer". RenderDoc documentation. https://github.com/baldurk/renderdoc/blob/v1.x/docs/window/texture_viewer.rst. Retrieved 2026-10-12.