Hey y’all!
I’m in the process of optimizing my scene, and wanted to check the overdraw via the rendering debugger, and to my surprise I’m seeing multiple tints of red on different parts of my opaque geometry.
I was under the impression that if a mesh had an opaque shader applied, it would not overdraw pixels, and appear as a solid red in the scene/game view.
The geometry in question is made up of different parts all joined in a single mesh, using a single material. But all parts are getting their own tint of red, as if it were transparent.
What is going on?
Thank you!

The pixels of an opaque object will not be drawn only if their depth is greater than what is already written in the depth buffer.
Unity sorts opaque objects front-to-back to try and make sure nearer pixels are drawn first and block further pixels from drawing, but while drawing each mesh their triangles cannot be sorted: they will be rendered in whatever order they are defined in the mesh’s index buffer. This means you will likely have some “internal” overdraw from non-convex intricate meshes.
On TBDR mobile GPU architectures this isn’t an issue, however: on tiled deferred GPUs triangles are sorted per tile on the GPU to more aggressively avoid overdraw. This is true of Mali, Adreno, PowerVR, and Apple Silicon GPUs (Adreno can switch to IMR if it detects the scene would benefit from it, however).
Thank you for clearing that up for me. Good writeup.
Hi, I suppose it’s a URP project. (rendering debugger + orthographic camera)
If there’s a Depth (or DepthNormals) Prepass in Frame Debugger, it’s possible to reduce opaque pass overdraw by drawing pixels only when the depth matches the existing depth (generated from DepthPrepass).
“Depth Priming Mode: Auto” is suggested unless there’re lots of alpha clipping objects in your scene. (mobile GPU early-z cannot remove those hidden triangles automatically)

Depth Priming sets depth test to “Equal” and depth write to “Off”.
