De acuerdo a la documentación oficial en Unity,
“Utilice el tag RenderType para sobreescribir el comportamiento de un shader”.
¿Qué quiere decir el enunciado anterior? Básicamente, con este Tag podemos pasar de un estado a otro, en el SubShader; agregando un efecto sobre todo material que coincida en una configuración (Type) determinada.
Para llevar a cabo su función necesitamos al menos dos shaders:
- Uno de reemplazo (color o efecto que deseamos agregar en tiempo de ejecución).
- Y otro a ser reemplazado (shader asignado al material).
Su sintaxis es la siguiente:
Tags { "RenderType"="type" }
Al igual que el Tags Queue; RenderType posee distintos valores configurables que varían según la tarea que se está llevando a cabo. Entre ellos podemos encontrar.
- Opaque. Default.
- Transparent.
- TransparentCutout.
- Background.
- Overlay.
- TreeOpaque.
- TreeTransparentCutout.
- TreeBillboard.
- Grass.
- GrassBillboard.
Por defecto, el tipo «Opaque» es establecido cada vez que creamos un nuevo shader. Así mismo, la mayoría de los built-in shaders en Unity vienen asignados con este valor dado que no poseen configuración para transparencias. No obstante podemos cambiar libremente esta categoría; todo dependerá del efecto que deseamos aplicar sobre una coincidencia.
Para entender el concepto a fondo haremos lo siguiente. En nuestro proyecto,
- Nos aseguraremos de crear algunos objetos 3D en la escena.
- Crearemos un script C# al cual llamaremos USBReplacementController.
- Luego crearemos un shader al cual llamaremos USB_replacement_shader.
- Finalmente crearemos un material al cual llamaremos USB_replaced_mat.
Utilizando Camera.SetReplacementShader, asignaremos un shader sobre el material USB_replaced_mat de manera dinámica. Para llevar a cabo la función, el shader del material deberá poseer un Tag RenderType igual al shader de reemplazo.
Para ejemplificar, asignaremos el shader Mobile/Unlit a USB_replaced_mat. Este built-in shader posee un Tag de tipo «RenderType» igual a «Opaque». Por consiguiente el shader USB_replacement_shader deberá coincidir el mismo RenderType para que la operación se lleve a cabo.

El script USBReplacementController debe ser asignado directamente a la cámara como un componente. Este controlador estará a cargo de reemplazar un shader por otro de reemplazo, siempre y cuando posean la misma configuración en el RenderType.
using System.Collection;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class USBReplacementController : MonoBehaviour
{
// replacement shader
public Shader m_replacementShader;
private void OnEnable()
{
if(m_replacementShader != null)
{
// the camera will replace all the shaders in the scene
// whit the replacement one
// the "RenderType" configuration must match in both
// shader
GetComponent<Camera>().SetReplacementShader. (m_replacementShader,"RenderType");
}
}
private void OnDisable()
{
// let's reset the default shader
GetComponent<Camera>().ResetReplacementShader()
}
}
Cabe mencionar que se ha definido la función [ExecuteInEditMode] sobre la clase. Esta propiedad nos va a permitir previsualizar cambios en modo de edición.
Utilizaremos a USB_replacement_shader como shader de reemplazo.
Como ya sabemos, cada vez que creamos un nuevo shader, este viene configurado con su RenderType igual a «Opaque». En consecuencia USB_replacement_shader podrá reemplazar el shader Unlit que hemos asignado al material previamente.
Para previsualizar los cambios de manera evidente, iremos al fragment shader stage de USB_replacement_shader y agregaremos un color rojo, el cual multiplicaremos por el color de salida.
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
// add a red color
fixed4 red = fixed4(1, 0, 0, 1);
return col * red;
}
Debemos asegurarnos de incluir a USB_replacement_shader en la variable de reemplazo tipo Shader que se encuentra en el script USBReplacementController.

Y además, aquellos objetos que agregamos previamente en la escena, deben poseer el material USB_replaced_mat.

Dado que la clase USBReplacementController tiene incluida las funciones OnEnable y OnDisable, si activamos o desactivamos el script, podremos ver como el built-in shader Unlit es reemplazado por USB_replacement_shader en modo de edición, aplicando un color rojo en el rendering.
