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