Qué es un shader#
Un shader es un pequeño programa que se ejecuta en la GPU y decide cómo se dibuja cada píxel de una superficie: su color, cómo reacciona a la luz, si se distorsiona, si brilla. Un material es una "instancia" de un shader con valores concretos (esta textura, este color).
Piénsalo así: el shader es la receta (cómo se cocina la superficie); el material es el plato concreto (con estos ingredientes). Muchos materiales pueden usar el mismo shader con distintos valores.
Las dos etapas de un shader#
Todo shader tiene, a grandes rasgos, dos fases:
- Vertex: procesa los vértices de la malla (puede moverlos: olas de agua, hierba que se mece).
- Fragment (o pixel): calcula el color final de cada píxel (textura, luz, efectos).
Escribir esto a mano se hace en HLSL, un lenguaje aparte, y es terreno avanzado. La buena noticia: casi nunca hace falta.
Shader Graph: shaders sin escribir código#
Shader Graph te deja crear shaders conectando nodos visualmente, sin HLSL. Es la forma recomendada hoy para la mayoría de efectos.
Shader Graph funciona con URP o HDRP (los pipelines modernos, ver Introducción a URP), no con el Built-in clásico. Unity 6 con la plantilla 3D ya trae URP, así que lo tienes listo. Créalo con Assets → Create → Shader Graph → URP → Lit/Unlit Shader Graph.
Piezas de un Shader Graph:
- Master Stack: la salida final (Base Color, Metallic, Smoothness, Emission, Normal, Alpha...). Conectas nodos a estas entradas.
- Nodos: operaciones (sumar, multiplicar, muestrear una textura, ruido, tiempo, fresnel...).
- Properties (Blackboard): valores que expones para editarlos por material o por código (como
[SerializeField]pero en el shader).
Un efecto típico: disolución#
El clásico efecto de "disolverse" (un enemigo que se desintegra) se hace en Shader Graph así, a grandes rasgos:
- Un nodo de ruido (Noise) genera un patrón.
- Comparas ese ruido con un valor umbral (una Property
_Umbralde 0 a 1). - Donde el ruido es menor que el umbral, mandas Alpha = 0 (transparente) al Master Stack.
- Añades un borde brillante (Emission) justo en el límite.
Subiendo _Umbral desde código, el objeto se disuelve progresivamente.
Controlar propiedades del shader por código#
Las Properties que expongas se cambian desde el material:
using UnityEngine;
public class Disolver : MonoBehaviour
{
[SerializeField] private Renderer rend;
private Material mat;
void Awake() => mat = rend.material; // instancia el material
public void Progreso(float t)
{
mat.SetFloat("_Umbral", t); // "_Umbral" = nombre de la Property
}
}Acceder a rend.material crea una copia para ese objeto (bien si quieres animarlo individualmente, pero genera una instancia). rend.sharedMaterial edita el material compartido (afecta a todos los que lo usan). Para muchos objetos con el mismo efecto, considera MaterialPropertyBlock para no crear cientos de materiales.
Cuándo necesitas un shader propio#
- ¿Solo cambias color/textura/brillo? → un material con el shader Lit normal basta, sin Shader Graph
- ¿Quieres un efecto (disolución, contorno, agua, hologramas, distorsión)? → Shader Graph
- ¿Necesitas algo muy específico o de máximo rendimiento? → HLSL a mano (avanzado)
Rendimiento#
Un fragment shader se ejecuta millones de veces por fotograma (una por píxel). Operaciones caras (muchos samples de textura, ruido complejo) se multiplican y pueden hundir el rendimiento en móvil. Mantén los grafos simples, y prueba en el dispositivo objetivo. La transparencia y el overdraw son especialmente costosos.
Errores frecuentes#
- Intentar usar Shader Graph en el pipeline Built-in (necesita URP/HDRP).
- Materiales en magenta: shader incompatible con el pipeline actual.
- Crear cientos de instancias con
rend.materialen vez de usarMaterialPropertyBlock. - Grafos enormes y caros que funcionan en PC pero mueren en móvil.
Ponte a prueba#
Resumen#
Un shader es un programa de GPU que define cómo se dibuja una superficie (etapas vertex y fragment). Para crear efectos sin escribir HLSL, usa Shader Graph (con URP/HDRP): conectas nodos a un Master Stack y expones Properties que controlas por código. Para color/textura simples basta un material normal; los shaders son para efectos (disolución, agua, contornos). Vigila el rendimiento: se ejecutan por píxel.