🎮 UnityDocs

Shaders y Shader Graph

Qué es un shader y cómo crear los tuyos sin escribir código con Shader Graph: propiedades, el Master Stack y efectos habituales (disolución, agua, contornos). Cuándo basta un material y cuándo necesitas un shader.

📄 ArtículoAvanzado✅ RevisadoUnity 6.0 LTSActualizado 2026-07-15
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 8 min · ⌨️ Práctica 30 min

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).

Material vs shader

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.

Requiere URP o HDRP

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:

  1. Un nodo de ruido (Noise) genera un patrón.
  2. Comparas ese ruido con un valor umbral (una Property _Umbral de 0 a 1).
  3. Donde el ruido es menor que el umbral, mandas Alpha = 0 (transparente) al Master Stack.
  4. 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:

C#
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
    }
}
rend.material clona; rend.sharedMaterial no

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#

🧭 ¿Qué debería usar?
  • ¿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#

Los shaders corren por cada píxel

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.material en vez de usar MaterialPropertyBlock.
  • Grafos enormes y caros que funcionan en PC pero mueren en móvil.

Ponte a prueba#

📝 Pon a prueba lo aprendido

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.

Fuentes y para profundizar