Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
Convirtiendo GLSL a Shaders de Godot¶
Este documento explica las diferencias entre el lenguaje de shader de Godot y el GLSL y da consejos prácticos sobre cómo migrar los shaders de otras fuentes, como Shadertoy y The Book of SHaders, a los shaders de Godot.
Para información detallada sobre el lenguaje de shaders de Godot, por favor lee la referencia en Shading Language .
GLSL¶
Godot utiliza un lenguaje de shader basado en GLSL con la adición de algunas características de calidad de vida. En consecuencia, la mayoría de las características disponibles en GLSL están disponibles en el lenguaje de shader de Godot.
Programas de shader¶
En GLSL, cada shader usa un programa separado. Hay un programa para el "vertex shader" y uno para el "fragment shader". En Godot, tienes un shader único que contiene una función vertex
y/o una función fragment
. Si eliges escribir solo una, Godot incluirá la otra.
Godot permite compartir variables y funciones uniformes al definir los shaders de fragmentos y vértices en un archivo. En el GLSL, los programas de vértices y fragmentos no pueden compartir variables, excepto cuando se utilizan variaciones.
Atributos de Vertex¶
In GLSL, you can pass in per-vertex information using attributes and have the
flexibility to pass in as much or as little as you want. In Godot, you have a
set number of input attributes, including VERTEX
(position), COLOR
,
UV
, UV2
, NORMAL
. Each shaders' page in the shader reference section
of the documentation comes with a complete list of its vertex attributes.
gl_Position¶
gl_Position
recibe la posición final de un vértice especificado en el vertex shader. Es especificada por el usuario en el espacio de los clips. Normalmente, en GLSL, la posición de vértice del espacio modelo se pasa usando un atributo de vértice llamado position
y se maneja la conversión del espacio modelo al espacio de clips manualmente.
En Godot,``VERTEX`` especifica la posición del vértice en el espacio del modelo al principio de la función de vertex
. Godot también se encarga de la conversión final al espacio de los clips después de que se ejecuta la función de vertex
definida por el usuario. Si quieres saltar la conversión del modelo al espacio de visualización, puedes establecer el render_mode
como skip_vertex_transform
. Si quieres saltar todas las transformaciones, establece render_mode
como skip_vertex_transform
y establece el PROJECTION_MATRIX
como mat4(1.0)
para anular la transformación final del espacio de vista al espacio de clips.
Varyings¶
Las variaciones son un tipo de variable que puede pasar del shader de vértices al shader de fragmentos. En el GLSL moderno (a partir de 3.0), las variaciones se definen con las palabras clave "in" y "out". Una variable que sale del vertex shader se define con out
en el vertex shader y in
dentro del fragmento shader.
Main¶
En GLSL, cada programa de shader parece un programa autónomo de estilo C. Por consiguiente, el punto de entrada principal es main
. Si estás copiando un vertex shader, renombra main
a vertex
y si estás copiando un fragment shader, renombra main
a fragment
.
Macros¶
The Godot shader preprocessor supports the following macros:
#define
/#undef
#if
,#elif
,#else
,#endif
,defined()
,#ifdef
,#ifndef
#include
(only.gdshaderinc
files and with a maximum depth of 25)#pragma disable_preprocessor
, which disables preprocessing for the rest of the file
Variables¶
El GLSL tiene muchas variables incorporadas que están codificadas. Estas variables no son uniformes, por lo que no son editables desde el programa principal.
Variable |
Tipo |
Equivalente |
Descripción |
---|---|---|---|
gl_FragColor |
out vec4 |
COLOR |
Color de salida para cada píxel. |
gl_FragCoord |
vec4 |
FRAGCOORD |
Para los quads en pantalla completa. Para quads más pequeños, use UV. |
gl_Position |
vec4 |
VERTEX |
Posición de Vertex, salida de Vertex Shader. |
gl_PointSize |
real |
POINT_SIZE |
Tamaño del Punto primitivo. |
gl_PointCoord |
vec2 |
POINT_COORD |
Posición en el punto cuando se dibujan las primitivas del punto. |
gl_FrontFacing |
bool |
FRONT_FACING |
Cierto si la cara delantera del primitivo. |
Coordenadas¶
gl_FragCoord
en GLSL y FRAGCOORD
en el lenguaje de shader Godot usan el mismo sistema de coordenadas. Si se usa UV en Godot, la coordenada y se volteará al revés.
Precisión¶
En GLSL, puedes definir la precisión de un tipo dado (real o int) en la parte superior del shader con la palabra clave precision
. En Godot, puedes establecer la precisión de las variables individuales según lo necesites colocando los calificadores de precisión lowp
, mediump
, y highp
antes del tipo al definir la variable. Para más información, ver la referencia Shading Language.
Shadertoy¶
Shadertoy es un sitio web que facilita la escritura de shaders de fragmentos y la creación de magia pura.
Shadertoy no le da al usuario un control total sobre el shader. Maneja todas las entradas y los uniformes y sólo permite al usuario escribir el shader de fragmentos.
Tipos¶
Shadertoy usa la especificación webgl, por lo que ejecuta una versión ligeramente diferente de GLSL. Sin embargo, todavía tiene los tipos regulares, incluyendo constantes y macros.
mainImage¶
El principal punto de entrada a un shader Shadertoy es la función mainImage
. mainImage
tiene dos parámetros, fragColor
y fragCoord
, que corresponden a COLOR
y FRAGCOORD
en Godot, respectivamente. Estos parámetros se manejan automáticamente en Godot, así que no necesitas incluirlos como parámetros tú mismo. Cualquier cosa en la función mainImage
debe ser copiada en la función fragment
cuando se convierte a Godot.
Variables¶
Para que escribir shaders de fragmentos sea sencillo y fácil, Shadertoy se encarga de pasar mucha información útil del programa principal al shader de fragmentos para ti. Algunos de estos no tienen equivalentes en Godot porque Godot ha elegido no hacerlos disponibles por defecto. Esto está bien porque Godot te da la capacidad de hacer tus propios uniformes. Para las variables cuyos equivalentes están listados como "Proveer con uniforme", los usuarios son responsables de crear ese uniforme ellos mismos. La descripción da al lector una pista sobre lo que pueden pasar como sustituto.
Variable |
Tipo |
Equivalente |
Descripción |
---|---|---|---|
fragColor |
out vec4 |
COLOR |
Color de salida para cada píxel. |
fragCoord |
vec2 |
FRAGCOORD.xy |
Para los quads en pantalla completa. Para quads más pequeños, use UV. |
iResolution |
vec3 |
1.0 / SCREEN_PIXEL_SIZE |
También puede pasar manualmente. |
iTime |
real |
TIME |
Tiempo desde que el Shader comenzó. |
iTimeDelta |
real |
Proporcionado con Uniforme |
Tiempo para renderizar el fotograma anterior. |
iFrame |
real |
Proporcionado con Uniforme |
Número de fotograma. |
iChannelTime[4] |
real |
Proporcionado con Uniforme |
Tiempo desde que esa particular textura comenzó. |
iMouse |
vec4 |
Proporcionado con Uniforme |
Posición del ratón en coordenadas de pixeles. |
iDate |
vec4 |
Proporcionado con Uniforme |
La fecha actual, expresada en segundos. |
iChannelResolution[4] |
vec3 |
1.0 / TEXTURE_PIXEL_SIZE |
Resolución de una textura particular. |
iChanneli |
Sampler2D |
TEXTURE |
Godot proporciona sólo uno incorporado; el usuario puede hacer más. |
Coordenadas¶
fragCoord
se comporta igual que gl_FragCoord
en GLSL y FRAGCOORD
en Godot.
The Book of Shaders¶
Similar a Shadertoy, The Book of Shaders proporciona acceso a un shader de fragmentos en el navegador web, con el que el usuario puede interactuar. El usuario está restringido a escribir el código del fragmento shader con una lista de uniformes pasados y sin la posibilidad de agregar uniformes adicionales.
Para más ayuda sobre cómo portar los shaders a varios marcos en general,The Book of Shaders proporciona una página sobre la ejecución de los shaders en varios frameworks.
Tipos¶
The Book of Shaders usa la especificación webgl, así que funciona una versión ligeramente diferente de GLSL. Sin embargo, todavía tiene los tipos regulares, incluyendo constantes y macros.
Main¶
El punto de entrada para un shader de fragmentos del Book of Shaders es main
, como en GLSL. Todo lo escrito en la función main
de un Book of Shaders debe ser copiado en la función fragment
de Godot.
Variables¶
El Book of Shaders se ciñe más al GLSL simple que Shadertoy. También implementa menos uniformes que Shadertoy.
Variable |
Tipo |
Equivalente |
Descripción |
---|---|---|---|
gl_FragColor |
out vec4 |
COLOR |
Color de salida para cada píxel. |
gl_FragCoord |
vec4 |
FRAGCOORD |
Para los quads en pantalla completa. Para quads más pequeños, use UV. |
u_resolution |
vec2 |
1.0 / SCREEN_PIXEL_SIZE |
También puede pasar manualmente. |
u_time |
real |
TIME |
Tiempo desde que el Shader comenzó. |
u_mouse |
vec2 |
Proporcionado con Uniforme |
Posición del ratón en coordenadas de pixeles. |
Coordenadas¶
The Book of Shaders usa el mismo sistema de coordenadas que GLSL.