Ir al contenido

Lógica, variables y utilidades

Cada ejemplo de esta página se ejecuta después de estas dos líneas y termina enviando un color al nodo Salida:

from pyzed import shading
g = shading.Graph("demo")

Valores verdadero/falso y elegir entre dos valores. Los shaders corren en todos los píxeles a la vez: prefiere Mezclar y Paso suave para transiciones suaves y deja Elegir para elecciones tajantes.

Compare · compare · Lógica · g.compare(...)

Si a es menor, mayor o igual que b (en vectores: todos los componentes).

El nodo Comparar tal como se ve en la vista Shader, con su vista previa

Compara a y b (<, <=, >, >=, ==, !=) y da verdadero o falso.

Entrada Tipo Por defecto
a T 0
b T 0.5
Salida Tipo
result · resultado bool
Ajuste Valores Por defecto
op <, <=, >, >=, ==, != <
Ejemplo
left = g.compare(g.uv()["x"], 0.5, op="<")
g.output(g.rgba(g.select(left, 1.0, 0.2), 1.0))

Select · select · Lógica · g.select(...)

si condition entonces a, si no b.

El nodo Elegir tal como se ve en la vista Shader, con su vista previa

Si condition es verdadero, a (entonces); si no, b (si no).

Entrada Tipo Por defecto
condition · condición bool true
a · entonces T 1
b · si no T 0
Salida Tipo
result · resultado T
Ejemplo
inside = g.mouse()["inside"]
g.output(g.rgba(g.select(inside, [0.2, 0.8, 0.4], [0.3, 0.3, 0.3]), 1.0))

Logic · logic · Lógica · g.logic(...)

and, or, xor y not de valores verdadero/falso.

El nodo Lógica tal como se ve en la vista Shader, con su vista previa

and, or, xor y not de valores verdadero/falso.

Entrada Tipo Por defecto
a bool true
b bool false
Salida Tipo
result · resultado bool
Ajuste Valores Por defecto
op and, or, xor, not and
Ejemplo
uv = g.uv()
both = g.logic(g.compare(uv["x"], 0.5, op=">"), g.compare(uv["y"], 0.5, op=">"), op="and")
g.output(g.rgba(g.select(both, 1.0, 0.0), 1.0))

Valores con nombre dentro del grafo: calcula algo una vez, ponle nombre y léelo en cualquier lugar sin un cable largo por el lienzo.

Set value · set_var · Variables · g.set_var(...)

Da nombre a un valor para que los nodos Leer valor lo lean en cualquier parte sin una conexión larga.

El nodo Guardar valor tal como se ve en la vista Shader, con su vista previa

Da nombre a un valor. Cualquier Leer valor con el mismo nombre lo lee, así puedes reutilizarlo lejos sin un cable que cruce todo el lienzo.

Entrada Tipo Por defecto
value · valor T 0
Salida Tipo
value · valor T
Ajuste Valores Por defecto
name text value1
Ejemplo
g.set_var(g.noise(scale=4.0), name="n")
n = g.get_var(name="n")
g.output(g.rgba(g.palette(n), 1.0))

Get value · get_var · Variables · g.get_var(...)

Lee un valor nombrado por un nodo Guardar valor.

El nodo Leer valor tal como se ve en la vista Shader, con su vista previa

Lee un valor al que un nodo Guardar valor puso nombre.

Salida Tipo
value · valor T
Ajuste Valores Por defecto
name local value1
Ejemplo
g.set_var(g.uv()["x"], name="x")
g.output(g.gradient(g.get_var(name="x")))

Nodos que mantienen ordenados los grafos grandes y te dejan ir más allá del catálogo.

Reroute · reroute · Utilidades · g.reroute(...)

Un punto para desviar una conexión alrededor de otros nodos.

El nodo Desvío tal como se ve en la vista Shader, con su vista previa

Un punto que solo desvía un cable alrededor de otros nodos: no cambia nada.

Entrada Tipo Por defecto
in · entrada T 0
Salida Tipo
out · salida T
Ejemplo
x = g.reroute(g.uv()["x"])
g.output(g.gradient(x))

Expression · expression · Utilidades · g.expression(...)

Tu propio WGSL: una expresión con a, b, c y d (y uv, px, size, time), o el cuerpo de una función con return. Los tipos de a a d siguen lo que esté conectado.

El nodo Expresión tal como se ve en la vista Shader, con su vista previa

Tu propia línea de WGSL cuando ningún nodo hace lo que necesitas: una expresión de a, b, c y d (más uv, px, size y time), o el cuerpo de una función con return. Elige el type del resultado.

Entrada Tipo Por defecto
a any 0
b any 0
c any 0
d any 0
Salida Tipo
result · resultado float
Ajuste Valores Por defecto
code code a + b
type float, vec2, vec3, vec4, int, bool float

Los tipos de a a d siguen lo que se les conecta (any); type fija el del resultado.

Ejemplo
e = g.expression(g.uv()["x"], 8.0, code="abs(sin(a * b + time))", type="float")
g.output(g.rgba(e, 1.0))

Shader function · subgraph · Utilidades · g.subgraph(...)

Otro .pzshad usado como función: sus variables mutables son entradas y su salida es el color. Conecta uv para moverlo, repetirlo o deformarlo.

El nodo Función shader tal como se ve en la vista Shader, con su vista previa

Usa otro .pzshad como función: sus variables mutables se vuelven entradas y su color la salida. Pasa un uv para mover, repetir o deformar el shader entero.

Entrada Tipo Por defecto
uv vec2 UV (contexto)
Salida Tipo
color vec4
rgb vec3
alpha float
Ajuste Valores Por defecto
path file —

Además de uv, cada variable mutable del otro shader se vuelve una entrada.

Un Shader function necesita otro archivo .pzshad: g.subgraph(path="plasma.pzshad", uv=...). En el diseñador, haz doble clic en el nodo para abrir ese archivo.

Comment · comment · Utilidades · g.comment(...)

Una nota en el grafo.

El nodo Comentario tal como se ve en la vista Shader, con su vista previa

Una nota en el lienzo para explicar una parte del grafo. No afecta al shader.

Ajuste Valores Por defecto
text text Note
Ejemplo
g.comment(text="Sky: gradient from top to bottom")
g.output(g.gradient(g.uv()["y"]))

Todo shader tiene un nodo Salida: lo que llega a él es el color del píxel.

Output · output · Salida · g.output(...)

El color de cada píxel. Alpha, si se conecta, reemplaza el alfa de color.

El nodo Salida tal como se ve en la vista Shader, con su vista previa

El final del grafo: el color que recibe es el color del píxel. Si alpha está conectado, reemplaza el alfa del color. En Python, g.output(color) lo añade o lo encuentra.

Entrada Tipo Por defecto
color vec4 (0, 0, 0, 1)
alpha float — (sin usar hasta que se conecta)
Ejemplo
g.output([1.0, 0.4, 0.1, 1.0], alpha=g.radial_gradient(radius=0.5))

Ver también: Primeros pasos · La vista Shader · Recetas · Grafos de shader en Python