Shader code can contain multiple passes that define LightMode tags. See here for related docs page which also links to lists of LightMode values used by Built-in & URP. In the Built-in Render Pipeline, you can also have multiple passes without a LightMode tag (or "LightMode"="Always") which are rendered without lighting/shadows. Unity will render each one as a separate draw call, though the exact render order also depends on the queue : In the Opaque queue (Geometry + AlphaTest), all objects render at once using the passes sequentially. i.e. All objects render Pass 1, then all objects Pass 2, etc. This works with Static Batching (separate batch per pass that is) - though appears to break Dynamic Batching. In the Transparent queue, each object renders separately (furthest from camera first) going through the passes sequentially. i.e. First object renders Pass 1, Pass 2, etc. Second object renders Pass 1, Pass 2, etc. This is likely to avoid blending issues, but also means draw calls will not batch. In the Universal Render Pipeline, it is possible to have one Pass with "LightMode"="UniversalForward", as well as one pass without (or "LightMode"="SRPDefaultUnlit") and both will render… However this breaks SRP Batcher compatibility for objects using the shader, so is not recommended if the shader will be applied to many objects. Better options for URP are : Use a custom LightMode tag, and tell it to render via a Custom Renderer Feature or RenderObjects feature (put same custom tag value under Shader Tags list) Or split passes into two separate shaders & materials, then either : Use a RenderObjects feature to re-render objects with an Override Material, filtered to a particular Layer. This works well when dealing with many objects. (If for some reason you can’t use Layers for filtering, there is also a “Rendering Layer Mask” on Renderer component, but would need to write a custom feature to filter using that, as RenderObjects doesn’t include an option for it) Apply more Materials to the MeshRenderer. If you go over the submesh count, it’ll render each submesh again. (While this works, I have seen some Unity devs mentioning to not rely on this behaviour. It’s possible this isn’t really intentional so could change in the future) Duplicate the object with the Renderer and change it’s Material(s). Parent under the original object to keep them in sync. Note that in 2022.2+ we also have a Override Shader option on the RenderObjects feature (and in DrawingSettings used with ScriptableRenderContext.DrawRenderers in a custom feature). This will keep using the same property values from the original shader, closer matching Replacement Shaders from BiRP. However, I believe objects rendered with overriden shaders currently do not SRP Batch, so if there is many objects involved it could be expensive. Should try to only use this where required.