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.