Tu primer shader
En esta página creas un círculo brillante que late, en unos diez minutos, conectando cajas con el ratón. No
necesitas saber matemáticas ni WGSL. Al final tendrás un archivo .pzshad que puedes usar en cualquier app de Pyzed
y conocerás las pocas ideas sobre las que se construye todo shader.
Tres ideas, en palabras sencillas
Sección titulada «Tres ideas, en palabras sencillas»- Un shader es una receta que se ejecuta para cada píxel. La tarjeta gráfica pregunta “¿de qué color es este píxel?” para cada píxel del widget, sesenta veces por segundo, todos a la vez. Tu grafo es la respuesta.
- Cada píxel sabe dónde está. El nodo UV lo dice:
xva de 0 (izquierda) a 1 (derecha) eyde 0 (arriba) a 1 (abajo). Formas, degradados y patrones son solo cálculos sobre esa posición. - Los colores son números de 0 a 1. El rojo es
(1, 0, 0), el blanco(1, 1, 1), un gris medio(0.5, 0.5, 0.5). Multiplicar un color por un número de 0 a 1 lo oscurece; así funcionan las máscaras.
Créalo en la vista Shader
Sección titulada «Créalo en la vista Shader»-
Abre Pyzed Design. Inicia la app que descargaste o ábrela desde Python:
Ventana de terminal uv run pyzed design # dentro de un proyecto uv con pyzed-uiuvx --from "pyzed-ui[designer]" pyzed design # sin proyectoVentana de terminal pip install "pyzed-ui[designer]"pyzed designmacOS / Linux python3 -m pyzed designWindows (PowerShell) py -m pyzed design -
Crea un shader. Pulsa Ctrl+N para abrir el diálogo Nuevo, elige la tarjeta Shader, llámalo
pulsey elige la plantilla En blanco. Crear shader guardapulse.pzshady lo abre.
El diálogo Nuevo: Shader, un nombre, una carpeta y una plantilla. -
Echa un vistazo. La plantilla en blanco son tres nodos: UV → Degradado → Salida. Cada nodo muestra una pequeña vista previa de lo que produce, y la vista previa de Salida en la esquina es el shader terminado. El panel izquierdo muestra ahora la barra Shading (todos los nodos, por categoría) y la Estructura (variables y nodos).

La vista Shader: barra lateral a la izquierda, el grafo en el centro y Propiedades a la derecha. -
Dibuja un círculo. Haz doble clic en un hueco del lienzo (o pulsa Shift+A) y escribe
círculo; pulsa Enter para añadir el nodo Círculo. Haz lo mismo con Relleno. Arrastra desde la salidadistancedel Círculo hasta la entradadistancedel Relleno: su vista previa muestra un disco blanco sobre negro.
El nodo Círculo. Su vista previa muestra la distancia: el disco en el centro y anillos que crecen hacia fuera. -
Dale color. Añade un nodo RGBA. Conecta la salida
maskdel Relleno a la entradargbde RGBA (un número rellena rojo, verde y azul: blanco) y la salidacolorde RGBA a la entradacolorde la Salida. El Degradado ya no se usa: selecciónalo y pulsa Supr. -
Hazlo latir. Añade un nodo Tiempo y un nodo Multiplicar y sumar. Conecta la salida
sindel Tiempo (un valor que oscila entre −1 y 1) a la entradaa, y escribe0.05enby0.3enc: el resultado oscila entre 0.25 y 0.35. Conéctalo alradiusdel Círculo. Todas las vistas previas empiezan a respirar. -
Añade un resplandor. Añade un nodo Resplandor, conéctale la
distancedel Círculo, y un nodo Sumar que sume lamaskdel Relleno y elvaluedel Resplandor. Conecta la suma argbde RGBA en lugar de la máscara. -
Dale un color que se pueda cambiar. En la Estructura, pulsa la flecha de Añadir y elige variable color; llámala
tinty elige un rosa. Arrastratintde la Estructura al grafo: se convierte en un nodo Parámetro. Añade un nodo Multiplicar: elrgbdetintpor la suma, haciargbde RGBA. -
Pruébalo. Abre la pestaña Vista previa: el shader en grande, con un deslizador o una muestra de color para cada variable. La pestaña WGSL muestra el código en que se compila el grafo. Pulsa F5 para abrirlo en una ventana propia que sigue tus cambios. Guarda con Ctrl+S.

La pestaña Vista previa: cada variable mutable tiene un control.
Úsalo en una app
Sección titulada «Úsalo en una app»Un archivo .pzshad se usa como una imagen: pasa su ruta a pz.shader. uniforms fija sus variables mutables por
nombre, así tu código puede cambiar el color mientras la app corre, sin coste.
from pathlib import Path
import pyzed as pz
HERE = Path(__file__).parent
class Pulse(pz.App): title = "Mi primer shader" size = (420, 320)
def view(self): return pz.shader(HERE / "pulse.pzshad", uniforms={"tint": "#22d3ee"}, width="fill", height="fill", fallback="#1e1b4b")
if __name__ == "__main__": pz.run(Pulse)Ejecuta la app, o mira el shader solo (pulsa V en esa ventana para un deslizador por variable):
uv run app.pyuv run pyzed run pulse.pzshadpython app.pypyzed run pulse.pzshadpython3 app.pypython3 -m pyzed run pulse.pzshadpy app.pypy -m pyzed run pulse.pzshadEl mismo shader en Python
Sección titulada «El mismo shader en Python»Todo lo que hace la vista Shader también es una API de Python. Esto crea el mismo grafo y lo guarda; abre el archivo en Pyzed Design para seguir editándolo con el ratón.
from pyzed import shading
g = shading.Graph("pulse")tint = g.uniform("tint", "color", "#f472b6") # una variable y un nodo Parámetro
radius = g.time()["sin"] * 0.05 + 0.3 # nodos de matemáticas, añadidos por ticircle = g.circle(radius=radius)light = g.fill(circle) + g.glow(circle, radius=0.1)g.output(g.rgba(tint["rgb"] * light, 1.0))
g.arrange() # columnas ordenadas, como Ordenar en la barrag.save("pulse.pzshad")