Shaders CanvasItem

Los shaders CanvasItem se usan para dibujar todos los elementos 2D en Godot. Estos incluyen todos los nodos que heredan de CanvasItems, y todos los elementos GUI.

Los shaders CanvasItem contienen menos variables incorporadas y funcionalidad que los shaders espaciales, pero mantienen la misma estructura básica con funciones de vértice, fragmento y procesador de luz.

Modos de renderizado

Modo de renderizado

Descripción

blend_mix

Modo de blending por mezcla (alfa es transparencia), es el modo por defecto.

blend_add

Modo de blending aditivo.

blend_sub

Modo de blending substractivo.

blend_mul

Modo de blending multiplicativo.

blend_premul_alpha

Modo de blending con alfa premultiplicado.

blend_disabled

Desactivar la mezcla, los valores (incluido el alfa) se escriben tal cual.

unshaded

El resultado es sólo albedo. El material no recibe luces ni shading.

light_only

Sólo dibuja en light pass (cuando se usa multipass).

skip_vertex_transform

VERTEX/NORMAL/etc necesitan ser transformados manualmente en función de vértice.

Funciones propias

Los valores marcados como "in" son de sólo lectura. Los valores marcados como "out" son de escritura opcional y no necesariamente contendrán valores sensibles. Los valores marcados como "inout" proporcionan un valor por defecto sensato y pueden escribirse opcionalmente. Los valores marcados como "in" no son objeto de escritura y no están marcados.

Funciones incorporadas globales

Las internas globales están disponibles en todas partes, incluyendo las funciones personalizadas.

Integrado

Descripción

en real TIME

Tiempo global desde que el motor ha empezado, en segundos (siempre positivo). Está sujeto a la configuración de rollover (que son 3.600 segundos por defecto). No está afectado por time_scale o por pausa, pero puedes anular la escala de tiempo de la variable TIME llamando VisualServer.set_shader_time_scale() con el factor de la escala de tiempo deseada como paametro (1.0 siendo el predeterminado).

Vertex built-ins

Los datos del vértice (VERTEX) se presentan en el espacio local (coordenadas de píxeles, relativas a la cámara). Si no se escriben, estos valores no se modificarán y se pasarán tal como llegaron.

El usuario puede desactivar la transformación incorporada de modelview (la proyección seguirá sucediendo más tarde) y hacerlo manualmente con el siguiente código:

shader_type canvas_item;
render_mode skip_vertex_transform;

void vertex() {

    VERTEX = (WORLD_MATRIX * (EXTRA_MATRIX * vec4(VERTEX, 0.0, 1.0))).xy;
}

Nota

En realidad ``WORLD_MATRIX``es un matriz "modelview". Toma la entrada en espacio local y la convierte en espacio de vista.

Para obtener las coordenadas de un vértice en espacio de mundo, hay que pasarlo en un constante Uniform personalizado:

material.set_shader_param("global_transform", get_global_transform())

Luego, en el shader de vértice:

uniform mat4 global_transform;
varying vec2 world_position;

void vertex(){
    world_position = (global_transform * vec4(VERTEX, 0.0, 1.0)).xy;
}

entonces se puede usar``world_position`` o en la función de vértice or de fragment.

Otros típos integrados, como UV y COLOR, también se pasan a la función fragment si no están modificados.

Para el instanciamiento, la variable INSTANCE_CUSTOM contiene los datos personalizados de la instancia. Cuando se usan partículas, esta información es normalment:

  • x: Ángulo de rotación en radianes.

  • y: Fase durante la vida (0 a 1).

  • z: Fotograma de animación.

Integrado

Descripción

in mat4 WORLD_MATRIX

Transformación del espacio Image al espacio de vista.

in mat4 EXTRA_MATRIX

Transform extra.

in mat4 PROJECTION_MATRIX

Ver el espacio para recortar la transformación del espacio.

in vec4 INSTANCE_CUSTOM

Datos personalizados de la instancia.

in booleano AT_LIGHT_PASS

true si esta es una light pass.

inout vec2 VERTEX

Vértice, en el espacio de la imagen.

in vec2 TEXTURE_PIXEL_SIZE

Tamaño de píxel normalizado de la textura 2D por defecto. Para un Sprite con una textura de tamaño 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

inout vec2 UV

Siguiente Coordenada.

inout vec4 COLOR

El color del vértice primitivo.

in vec4 MODULATE

Color final de modulación. Si se usa, COLOR no se multiplicará por modular automáticamente después de la función de fragmento.

inout real POINT_SIZE

Tamaño del punto para el dibujo del punto.

Fragment built-ins

Ciertos nodos (por ejemplo, Sprites) muestran una textura por defecto. Sin embargo, cuando una función de fragmento personalizada se adjunta a estos nodos, la búsqueda de la textura debe hacerse manualmente. Godot no provee el color de la textura en la variable incorporada COLOR; para leer el color de la textura para tales nodos, usa:

COLOR = texture(TEXTURE, UV);

Esto difiere del comportamiento del mapa normal incorporado. Si se adjunta un mapa normal, Godot lo usa por defecto y asigna su valor a la variable NORMAL incorporada. Si se usa un mapa normal destinado a ser usado en 3D, aparecerá invertido. Para usarlo en tu shader, debes asignarlo a la propiedad NORMALMAP. Godot se encargará de convertirlo para su uso en 2D y sobrescribir NORMAL.

NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;

Integrado

Descripción

in vec4 FRAGCOORD

Coordenadas del centro de los píxeles. En el espacio de la pantalla. xy especifica la posición en la ventana, z especifica la profundidad del fragmento si no se usa DEPTH. El origen es abajo a la izquierda.

inout vec3 NORMAL

Lectura normal de NORMAL_TEXTURE. Escrito.

out vec3 NORMALMAP

Configura mapas normales destinados a 3D para su uso en 2D. Si se usa, sobrescribe NORMAL.

inout real NORMALMAP_DEPTH

Profundidad del Normalmap para el escalado.

in vec2 UV

UV de la función del vértice.

inout vec4 COLOR

Color de la función del vértice y color del fragmento de salida. Si no se usa, se fijará en el color de la TEXTURE.

in vec4 MODULATE

Color final de modulación. Si se usa, COLOR no se multiplicará por modular automáticamente después de la función de fragmento.

in sampler2D TEXTURE

Textura 2D por defecto.

in sampler2D NORMAL_TEXTURE

Textura normal 2D por defecto.

in vec2 TEXTURE_PIXEL_SIZE

Tamaño de píxel normalizado de la textura 2D por defecto. Para un Sprite con una textura de tamaño 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in vec2 SCREEN_UV

Pantalla UV para usar con SCREEN_TEXTURE.

in vec2 SCREEN_PIXEL_SIZE

El tamaño de los píxeles individuales. Igual a la inversa de la resolución.

in vec2 POINT_COORD

Coordenadas para dibujar puntos.

in booleano AT_LIGHT_PASS

true si esta es una light pass.

in sampler2D SCREEN_TEXTURE

La textura de la pantalla, los mipmaps contienen versiones gaussianas difuminadas.

Light built-ins

Las funciones de los procesadores de luz funcionan de manera diferente en 2D que en 3D. En los shaders CanvasItem, el shader se llama una vez para el objeto que se dibuja, y luego una vez para cada luz que toca ese objeto en la escena. Utiliza el modo_render_mode unshaded si no quieres que se produzca ningún paso de luz para ese objeto. Usa el modo render_mode light_only si sólo quieres que se produzcan pases de luz para ese objeto; esto puede ser útil cuando sólo quieres que el objeto sea visible donde está cubierto por la luz.

Cuando el shader está en un pase de luz, la variable AT_LIGHT_PASS será true.

Integrado

Descripción

in vec4 FRAGCOORD

Coordenadas del centro de los píxeles. En el espacio de la pantalla. xy especifica la posición en la ventana, z especifica la profundidad del fragmento si no se usa DEPTH. El origen es abajo a la izquierda.

in vec3 NORMAL

Entrada normal. Aunque se pase este valor, el cálculo normal sigue ocurriendo fuera de esta función.

in vec2 UV

UV de la función de vértice, equivalente a la UV en la función de fragmento.

in vec4 COLOR

Color de entrada. Esta es la salida de la función de fragmento (con la modulación final aplicada, si MODULATE no se utiliza en ninguna función del shader).

in vec4 MODULATE

Color final de modulación. Si se usa, COLOR no se multiplicará por modular automáticamente después de la función de fragmento.

sampler2D TEXTURE

Textura actual en uso para CanvasItem.

in vec2 TEXTURE_PIXEL_SIZE

Tamaño de píxel normalizado de la textura 2D por defecto. Para un Sprite con una textura de tamaño 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in vec2 SCREEN_UV

SCREEN_TEXTURE Coordenadas (para usar con la textura de la pantalla).

in vec2 POINT_COORD

UV para Point Sprite.

inout vec2 LIGHT_VEC

Vector de luz a fragmento en coordenadas locales. Puede ser modificado para alterar la dirección de la iluminación cuando se usan mapas normales.

inout vec2 SHADOW_VEC

Vector de luz a fragmento en coordenadas locales. Puede ser modificado para alterar el cálculo de la sombra.

inout real LIGHT_HEIGHT

La altura de la luz. Sólo es efectivo cuando se usan normales.

inout vec4 LIGHT_COLOR

Color de la Luz.

in vec2 LIGHT_UV

UV para la textura de la Luz.

out vec4 SHADOW_COLOR

El color de la Sombra de la Luz.

inout vec4 LIGHT

Valor de la textura de la Luz y el color de salida. Puede ser modificado. Si no se usa, la función de luz es ignorada.