Spatial shaders

Los shaders espaciales se utilizan para sombrear objetos 3D. Son el tipo más complejo shader que ofrece Godot. Los shaders espaciales son altamente configurables con diferentes modos de renderización y diferentes opciones de renderización (por ejemplo, dispersión en el subsuelo, transmisión, oclusión ambiental, iluminación del borde, etc.). Los usuarios pueden opcionalmente escribir vértices, fragmentos y funciones de procesador de luz para afectar a la forma en que se dibujan los objetos.

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.

depth_draw_opaque

Sólo dibuja "depth" para geometría opaca (no transparente).

depth_draw_always

Siempre dibuja "depth" (opaco y transparente).

depth_draw_never

Nunca dibuja depth.

depth_draw_alpha_prepass

Realiza un pre-pass de depth opaco para geometría transparente.

depth_test_disable

Desactiva testing de depth.

cull_front

Culling de caras frontales.

cull_back

Culling de caras internas (por defecto).

cull_disabled

Culling deshabilitado (doble cara).

unshaded

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

diffuse_lambert

Utiliza Lambert shading para diffuse (por defecto).

diffuse_lambert_wrap

Utiliza Lambert wrapping (dependiente de roughness) para diffuse.

diffuse_oren_nayar

Usa Oren Nayar para diffuse.

diffuse_burley

Utiliza Burley (Disney PBS) para diffuse.

diffuse_toon

Shading Toon para diffuse.

specular_schlick_ggx

Usa Schlick-GGX para specular (por defecto).

specular_blinn

Blinn para specular (compatibilidad).

specular_phong

Usa Phong para specular (compatibilidad).

specular_toon

Usa Toon para specular.

specular_disabled

Deshabilita specular.

skip_vertex_transform

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

world_vertex_coords

VERTEX/NORMAL/etc son modificados en coordenadas del mundo en lugar de locales.

ensure_correct_normals

Se usa cuando se aplica una escala no uniforme a la malla.

vertex_lighting

Usa iluminación basada en vértices.

shadows_disabled

Deshabilita las sombras de computación en shader.

ambient_light_disabled

Deshabilitar la contribución de la luz ambiental y el mapa de radiaciones.

sombra_a_opacidad

La iluminación modifica el alfa para que las áreas sombreadas sean opacas y las no sombreadas sean transparentes. Útil para superponer sombras a una cámara en AR.

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, en segundos.

Vertex built-ins

Los datos de los vértices (VERTEX, NORMAL, TANGENT, BITANGENT) se presentan en el espacio modelo local. Si no se escriben, estos valores no se modificarán y se pasarán tal como llegaron.

Opcionalmente pueden ser presentados en el espacio mundial usando el modo de representación world_vertex_coords.

Los usuarios pueden desactivar la transformada incorporada de modelview (la proyección seguirá sucediendo más tarde) y hacerlo manualmente con el siguiente código:

shader_type spatial;
render_mode skip_vertex_transform;

void vertex() {
    VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
    NORMAL = normalize((MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
    // same as above for binormal and tangent, if normal mapping is used
}

Otras incorporadas, tales como UV, UV2 y COLOR, son también pasadas a la función fragmento si no se modifican.

Los usuarios pueden sobreescribir la vista del modelo y las transformaciones de la proyección usando la POSICIÓN incorporada. Cuando se usa POSICIÓN, el valor de VERTEX se ignora y la proyección no ocurre. Sin embargo, el valor pasado al shader de fragmentos sigue viniendo de VERTEX.

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.

Esto le permite ajustar fácilmente el shader a un sistema de partículas usando el material de partículas predeterminado. Cuando se escribe un shader de partículas personalizado, este valor puede ser usado como se desee.

Integrado

Descripción

en vec2 VIEWPORT_SIZE

Tamaño del viewport (en píxeles).

inout mat4 WORLD_MATRIX

Modelo de transformación del espacio en el mundo.

en mat4 INV_CAMERA_MATRIX

El espacio mundial para ver la transformada del espacio.

inout mat4 PROJECTION_MATRIX

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

en mat4 CAMERA_MATRIX

Transform de espacio de vista a espacio de mundo.

inout mat4 MODELVIEW_MATRIX

Espacio de vista a el espacio de la transformada mundial (usarlo si es posible).

inout mat4 INV_PROJECTION_MATRIX

Recortar el espacio para ver la transformada del espacio.

inout vec3 VERTEX

Vertex en coordenadas locales.

out vec4 POSITION

Si está escrito, sobreescribe la posición final del vértice.

inout vec3 NORMAL

Normal en coordenadas locales.

inout vec3 TANGENT

Tangente en coordenadas locales.

inout vec3 BINORMAL

Binormal en coordenadas locales.

out real ROUGHNESS

Rugosidad para la iluminación del vértice.

inout vec2 UV

Canal principal de UV.

inout vec2 UV2

Canal secundario UV.

in booleano OUTPUT_IS_SRGB

true cuando los cálculos ocurren en el espacio de color sRGB (true en GLES2, false en GLES3).

inout vec4 COLOR

Color de los vértices.

inout real POINT_SIZE

Tamaño de punto para la representación de puntos.

en entero INSTANCE_ID

ID de instancia para el instanciamiento.

in vec4 INSTANCE_CUSTOM

Datos personalizados de la instancia (para las partículas, en su mayoría).

Nota

MODELVIEW_MATRIX combina tanto la WORLD_MATRIX como la INV_CAMERA_MATRIX y es más adecuada cuando puedan surgir problemas con números de punto flotante. Por ejemplo, si el objeto está muy lejos del origen del mundo, podrías encontrarte con problemas de números de punto flotante al usar las matrices WORLD_MATRIX y INV_CAMERA_MATRIX por separado. En esos casos, es preferible utilizar MODELVIEW_MATRIX para evitar estos problemas.

Fragment built-ins

El uso por defecto de una función del procesador de fragmentos Godot es configurar las propiedades materiales de su objeto y dejar que el renderizador incorporado se encargue del shader final. Sin embargo, no es necesario que utilice todas estas propiedades, y si no las escribe, Godot optimizará la funcionalidad correspondiente.

A continuación se muestran ejemplos de variables comunes calculadas utilizando las variables integradas:

vec3 model_world_space = WORLD_MATRIX[3].xyz; // Object's world space position. This is the equivalent to global_transform.origin in GDScript.
mat3 model_transform_basis = mat3(WORLD_MATRIX); // Object's world space transform basis. This is the equivalent to global_transform.basis in GDScript.
vec3 camera_world_space = CAMERA_MATRIX[3].xyz; // Camera's world space position. This is the equivalent to camera.global_transform.origin in GDScript.
vec3 camera_eye_world_space = INV_CAMERA_MATRIX[3].xyz; // Camera eye vector in world space direction of the camera.
vec3 camera_to_object_world_space = normalize(WORLD_MATRIX[3].xyz - CAMERA_MATRIX[3].xyz); // Camera's direction to the object in world space.

Nota

A continuación se presentan ejemplos de variables comunes calculadas utilizando las variables integradas: Una alternativa comúnmente utilizada a WORLD_MATRIX[3].xyz es usar vec3 origin = (WORLD_MATRIX * vec4(0,0,0,1)).xyz. Sin embargo, es más eficiente usar WORLD_MATRIX[3].xyz ya que evita la multiplicación de matrices.

Integrado

Descripción

en vec2 VIEWPORT_SIZE

Tamaño del viewport (en píxeles).

in vec4 FRAGCOORD

La coordenada del centro del píxel 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 esta abajo a la izquierda.

in mat4 WORLD_MATRIX

Modelo de transformación del espacio en el mundo.

en mat4 INV_CAMERA_MATRIX

El espacio mundial para ver la transformada del espacio.

en mat4 CAMERA_MATRIX

Transform de espacio de vista a espacio de mundo.

in mat4 PROJECTION_MATRIX

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

in mat4 INV_PROJECTION_MATRIX

Recortar el espacio para ver la transformada del espacio.

in vec3 VERTEX

Vértice que proviene de la función de vértice (por defecto, en el espacio de visión).

in vec3 VIEW

Vector desde la cámara hasta la posición del fragmento (en el espacio de visión).

in booleano FRONT_FACING

true si la cara actual es la cara frontal.

inout vec3 NORMAL

Normal que viene de la función de vértice (por defecto, en el espacio de visión).

inout vec3 TANGENT

Tangente que proviene de la función del vértice.

inout vec3 BINORMAL

Binormal que proviene de la función del vértice.

out vec3 NORMALMAP

Ponga normal aquí si lee normal de una textura en lugar de NORMAL.

out real NORMALMAP_DEPTH

Profundidad de la variable de arriba. Por defecto es 1.0.

in vec2 UV

UV que proviene de la función del vértice.

in vec2 UV2

UV2 que proviene de la función del vértice.

in booleano OUTPUT_IS_SRGB

true cuando los cálculos ocurren en el espacio de color sRGB (true en GLES2, false en GLES3).

in vec4 COLOR

COLOR que proviene de la función del vértice.

out vec3 ALBEDO

Albedo (blanco por defecto).

out real ALPHA

Alfa (0..1); si se escribe, el material irá a la tubería transparente.

out real ALPHA_SCISSOR

Si se escribe, se descartan los valores inferiores a una cierta cantidad de alfa.

out real METALLIC

Metálico (0..1).

out real SPECULAR

Especular. El valor por defecto es 0.5, mejor no modificarlo a menos que quiera cambiar el IOR.

out real ROUGHNESS

Rugosidad (0..1).

out real RIM

Rim (0..1). Si se usa, Godot calcula la iluminación del borde.

out real RIM_TINT

Rim Tint, va de 0 (blanco) a 1 (albedo). Si se usa, Godot calcula la iluminación del borde.

out real CLEARCOAT

Pequeña mancha especular añadida. Si se usa, Godot calcula Clearcoat.

out real CLEARCOAT_GLOSS

El brillo de Clearcoat. Si se usa, Godot calcula Clearcoat.

out real ANISOTROPY

Para distorsionar la mancha especular según el espacio tangencial.

out vec2 ANISOTROPY_FLOW

Dirección de la distorsión, uso con flowmaps.

out real SSS_STRENGTH

La fuerza del Subsurface Scattering. Si se usa, la Subsurface Scattering se aplicará al objeto.

out vec3 TRANSMISSION

Máscara de transmisión (por defecto 0,0,0). Permite que la luz pase a través del objeto. Sólo se aplica si se utiliza.

out vec3 EMISSION

Color de la emisión (puede superar el 1,1,1 para HDR).

out real AO

La fuerza de la oclusión del ambiente. Para usar con AO precocinado.

out real AO_LIGHT_AFFECT

Cuánto AO afecta a las luces (0..1; por defecto 0).

sampler2D SCREEN_TEXTURE

Textura incorporada para leer desde la pantalla. Los Mipmaps contienen copias cada vez más borrosas.

sampler2D DEPTH_TEXTURE

Textura incorporada para la profundidad de lectura de la pantalla. Debe convertirse a lineal usando INV_PROJECTION.

out real DEPTH

Valor de profundidad personalizado (0..1). Si se está escribiendo en DEPTH en cualquier rama del shader, entonces es tu responsabilidad establecer el valor de DEPTH para todas las demás ramas. De lo contrario, la API gráfica las dejará sin inicializar.

in vec2 SCREEN_UV

Muestra la coordenada UV para el píxel actual.

in vec2 POINT_COORD

Coordenadas de puntos para dibujar puntos con POINT_SIZE.

Nota

Los shaders que pasan por la tubería de transparencia cuando se escribe en ALPHA pueden presentar problemas de ordenación de transparencia. Lee la sección de ordenación de transparencia en la página de limitaciones de renderizado 3D para obtener más información y formas de evitar problemas.

Light built-ins

Las funciones del procesador de luz de escritura son completamente opcionales. Puedes saltarte la función de luz poniendo el modo de render_mode a unshaded. Si no se escribe ninguna función de luz, Godot utilizará las propiedades del material escritas en la función de fragmento para calcular la iluminación por ti (sujeto al render_mode).

Para escribir una función de luz, asigna algo a DIFFUSE_LIGHT o SPECULAR_LIGHT. Asignar nada significa que no se procesa ninguna luz.

La función de luz se llama para cada luz en cada píxel. Se llama dentro de un bucle para cada tipo de luz.

A continuación se muestra un ejemplo de una función de luz personalizada utilizando un modelo de iluminación lambertiano:

void light() {
    DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * ALBEDO;
}

Si quieres que las luces se sumen, agrega la contribución de la luz a DIFUSE_LIGHT usando +=, en lugar de sobrescribirla.

Advertencia

En GLES2, las luces siempre se sumarán incluso si anulas DIFFUSE_LIGHT usando =. Esto se debe a que la iluminación se calcula en múltiples pasadas (una para cada luz), a diferencia de GLES3.

Advertencia

La función light() no se ejecutará si el modo de render vertex_lighting está activado, o si Renderizado > Calidad > Sombreado > Forzar sombreado de vértices está activado en la configuración del proyecto. (Está activado por defecto en plataformas móviles)

Integrado

Descripción

en real TIME

Tiempo total transcurrido en segundos.

en vec2 VIEWPORT_SIZE

Tamaño del viewport (en píxeles).

in vec4 FRAGCOORD

La coordenada del centro del píxel 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 mat4 WORLD_MATRIX

Modelo de transformación del espacio en el mundo.

en mat4 INV_CAMERA_MATRIX

El espacio mundial para ver la transformada del espacio.

en mat4 CAMERA_MATRIX

Transform de espacio de vista a espacio de mundo.

in mat4 PROJECTION_MATRIX

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

in mat4 INV_PROJECTION_MATRIX

Recortar el espacio para ver la transformada del espacio.

in vec3 NORMAL

Vector normal, en el espacio de visión.

in vec2 UV

UV que proviene de la función del vértice.

in vec2 UV2

UV2 que proviene de la función del vértice.

in vec3 VIEW

Vector de vista, en el espacio de vista.

in vec3 LIGHT

Vector de luz, en el espacio de visión.

in vec3 ATTENUATION

Atenuación basada en la distancia o en la sombra.

in booleano OUTPUT_IS_SRGB

true cuando los cálculos ocurren en el espacio de color sRGB (true en GLES2, false en GLES3).

in vec3 ALBEDO

Albedo de la base.

in vec3 LIGHT_COLOR

El color de la luz multiplicado por la energía.

out real ALPHA

Alfa (0..1); si se escribe, el material irá a la tubería transparente.

in real ROUGHNESS

Rugosidad.

in vec3 TRANSMISSION

Máscara de transmisión de la función fragment.

out vec3 DIFFUSE_LIGHT

Resultado de luz difusa.

out vec3 SPECULAR_LIGHT

Resultado de la luz especular.

Nota

Los shaders que pasan por la tubería de transparencia cuando se escribe en ALPHA pueden presentar problemas de ordenación de transparencia. Lee la sección de ordenación de transparencia en la página de limitaciones de renderizado 3D para obtener más información y formas de evitar problemas.