Migrando al lenguaje de shaders de Godot

Introducción

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.

Shader programs

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.

Vertex attributes

En el GLSL, puedes pasar información por vértice usando atributos y tienes la flexibilidad de pasar tanta o tan poca información como quieras. En Godot, tienes un número determinado de atributos de entrada, incluyendo VERTEX (position), COLOR, UV, UV2, NORMAL. Para una lista completa, ver Shading language reference.

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.

Constantes

Los arrays globales no están soportados en Godot 3.2.x. Se puede aparentar la funcionalidad usando un patrón inicializado con el valor, pero no se beneficiará del aumento de velocidad por usar una constante.

Macros

En consonancia con su similitud con la C, el GLSL te permite usar macros. Comúnmente #define se usa para definir constantes o pequeñas funciones. No hay una forma sencilla de traducir defines al lenguaje de shader de Godot. Si es una función que está definida, entonces reemplacela con una función, y si es una constante, entonces reemplácela con un uniforme. Para otras macros (#if, #ifdef, etc.), no hay equivalente porque se ejecutan durante la etapa de pre-procesamiento de la compilación.

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.