Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Conversão de shaders GLSL para Godot

Este documento explica as diferenças entre a linguagem de shading do Godot e o GLSL e fornece conselhos práticos sobre como migrar shaders de outras fontes, como Shadertoy e The Book of Shaders, para shaders do Godot.

Para informações detalhadas sobre a linguagem de shading do Godot, por favor consulte a referência da Shading Language.

GLSL

O Godot usa uma linguagem de shading baseada em GLSL com a adição de alguns recursos de qualidade de vida. Da mesma forma, a maioria dos recursos disponíveis em GLSL estão disponíveis na linguagem de shading do Godot.

Programas de Shader

Em GLSL, cada shader usa um programa separado. Você tem um programa para o vertex shader e um para o fragment shader. No Godot, você tem um único shader que contém uma função vertex e/ou uma função fragment. Se você optar por escrever apenas uma, o Godot fornecerá a outra.

O Godot permite que variáveis uniform e funções sejam compartilhadas definindo os shaders de fragmento e vértice em um único arquivo. Em GLSL, os programas de vértice e fragmento não podem compartilhar variáveis, exceto quando varyings são usadas.

Atributos Vertex

Em GLSL, você pode passar informações por vértice usando atributos e tem a flexibilidade de passar tanto ou tão pouco quanto quiser. No Godot, você tem um número definido de atributos de entrada, incluindo VERTEX (posição), COLOR, UV, UV2, NORMAL. A página de cada shader na seção de referência de shader da documentação vem com uma lista completa de seus atributos de vértice.

gl_Position

O gl_Position recebe a posição final de um vértice especificado no vertex shader. Ele é especificado pelo usuário no espaço de clipe (clip space). Normalmente, em GLSL, a posição do vértice no espaço do modelo é passada usando um atributo de vértice chamado position e você lida com a conversão do espaço do modelo para o espaço de clipe manualmente.

No Godot, VERTEX especifica la posição do vértice no espaço do modelo no início da função vertex. O Godot também lida com a conversão final para o espaço de clipe após a execução da função vertex definida pelo usuário. Se você quiser pular a conversão do espaço do modelo para o espaço de visualização (view space), você pode definir o render_mode para skip_vertex_transform. Se quiser pular todas as transformações, defina render_mode para skip_vertex_transform e defina a PROJECTION_MATRIX como mat4(1.0) para anular a transformação final do espaço de visualização para o espaço de clipe.

Variações

Varyings são um tipo de variável que pode ser passada do vertex shader para o fragment shader. No GLSL moderno (3.0 e superior), as varyings são definidas com as palavras-chave in e out. Uma variável que sai do vertex shader é definida com out no vertex shader e com in dentro do fragment shader.

Principal

Em GLSL, cada programa de shader se parece com um programa auto-contido no estilo C. Da mesma forma, o ponto de entrada principal é main. Se você estiver copiando um vertex shader, renomeie main para vertex e, se estiver copiando um fragment shader, renomeie main para fragment.

Macros

O pré-processador de shader do Godot suporta as seguintes macros:

  • #define / #undef

  • #if, #elif, #else, #endif, defined(), #ifdef, #ifndef

  • #include (apenas arquivos .gdshaderinc e com uma profundidade máxima de 25)

  • #pragma disable_preprocessor, que desativa o pré-processamento para o resto do arquivo

Variáveis

O GLSL possui muitas variáveis integradas que são hard-coded. Essas variáveis não são uniforms, portanto não são editáveis a partir do programa principal.

Variável

Tipo

Equivalente

Descrição

gl_FragColor

out vec4

COLOR

Cor de saída para cada pixel.

gL_FragCoord

vec4

FRAGCOORD

Para quads em tela cheia. Para quads menores, use UV.

gl_Position

vec4

VERTEX

Posição do Vértice, saída do Vertex Shader.

gl_PointSize

float

POINT_SIZE

Tamanho da primitiva de Ponto (Point).

gl_PointCoord

vec2

POINT_COORD

Posição no ponto ao desenhar primitivas de Ponto (Point).

gl_FrontFacing

bool

FRONT_FACING

Verdadeiro se for a face frontal da primitiva.

Coordenadas

gl_FragCoord em GLSL e FRAGCOORD na linguagem de shader do Godot usam o mesmo sistema de coordenadas. Se usar UV no Godot, a coordenada y será invertida de cabeça para baixo.

Precisão

Em GLSL, você pode definir a precisão de um determinado tipo (float ou int) no topo do shader com a palavra-chave precision. No Godot, você pode definir a precisão de variáveis individuais conforme necessário, colocando os qualificadores de precisão lowp, mediump e highp antes do tipo ao definir a variável. Para mais informações, consulte a referência da Shading Language.

Shadertoy

Shadertoy é um site que facilita a escrita de fragment shaders e a criação de pura magia.

O Shadertoy não dá ao usuário controle total sobre o shader. Ele gerencia todas as entradas e uniforms e apenas deixa o usuário escrever o fragment shader.

Tipos

O Shadertoy usa a especificação webgl, portanto, executa uma versão ligeiramente diferente do GLSL. No entanto, ele ainda possui os tipos regulares, incluindo constantes e macros.

mainImage

O ponto principal de entrada para um shader do Shadertoy é a função mainImage. A mainImage possui dois parâmetros, fragColor e fragCoord, que correspondem a COLOR and FRAGCOORD no Godot, respectivamente. Esses parâmetros são tratados automaticamente no Godot, de modo que você não precisa incluí-los como parâmetros. Qualquer coisa na função mainImage deve ser copiada para a função fragment ao portar para o Godot.

Variáveis

A fim de tornar a escrita de fragment shaders direta e fácil, o Shadertoy gerencia a passagem de muitas informações úteis do programa principal para o fragment shader para você. Algumas delas não têm equivalentes no Godot porque o Godot optou por não as disponibilizar por padrão. Isso não é um problema, pois o Godot lhe dá a capacidade de criar seus próprios uniforms. Para variáveis cujos equivalentes estão listados como "Fornecer com Uniform", os usuários são responsáveis por criar esse uniform por conta própria. A descrição dá ao leitor uma dica sobre o que eles podem passar como substituto.

Variável

Tipo

Equivalente

Descrição

fragColor

out vec4

COLOR

Cor de saída para cada pixel.

fragCoord

vec2

FRAGCOORD.xy

Para quads em tela cheia. Para quads menores, use UV.

iResolution

vec3

1.0 / SCREEN_PIXEL_SIZE

Também pode passar manualmente.

iTime

float

TEMPO

Tempo desde que o shader iniciou.

iTimeDelta

float

Fornecer uniforme

Momento de renderizar quadro anterior.

iFrame

float

Fornecer uniforme

Numero do quadro.

iChannelTime[4]

float

Fornecer uniforme

Momento desde que textura especifica iniciou.

iMouse

vec4

Fornecer uniforme

Posição do mouse nas coordenadas do pixel.

iDate

vec4

Fornecer uniforme

Data atual, expressada em segundos.

iChannelResolution[4]

vec3

1.0 / TEXTURE_PIXEL_SIZE

Resolução de uma textura específica.

iChanneli

Sampler2D

TEXTURE

O Godot fornece apenas um integrado; o usuário pode criar mais.

Coordenadas

fragCoord se comporta da mesma forma que gl_FragCoord em GLSL e FRAGCOORD no Godot.

The Book of Shaders

Semelhante ao Shadertoy, The Book of Shaders fornece acesso a um fragment shader no navegador web, com o qual o usuário pode interagir. O usuário está restrito a escrever o código do fragment shader com uma lista definida de uniforms passados e sem a capacidade de adicionar uniforms adicionais.

Para obter mais ajuda sobre a portabilidade de shaders para vários frameworks em geral, o O Livro dos Shaders fornece uma página sobre a execução de shaders em vários frameworks.

Tipos

O Book of Shaders usa a especificação webgl, portanto, executa uma versão ligeiramente diferente do GLSL. No entanto, ele ainda possui os tipos regulares, incluindo constantes e macros.

Principal

O ponto de entrada para um fragment shader do Book of Shaders é main, assim como no GLSL. Tudo o que for escrito em uma função main do Book of Shaders deve ser copiado para a função fragment do Godot.

Variáveis

O Book of Shaders se mantém mais próximo do GLSL puro do que o Shadertoy. Ele também implementa menos uniforms do que o Shadertoy.

Variável

Tipo

Equivalente

Descrição

gl_FragColor

out vec4

COLOR

Cor de saída para cada pixel.

gL_FragCoord

vec4

FRAGCOORD

Para quads em tela cheia. Para quads menores, use UV.

u_resolution

vec2

1.0 / SCREEN_PIXEL_SIZE

Também pode passar manualmente.

u_time

float

TEMPO

Tempo desde que o shader iniciou.

u_mouse

vec2

Fornecer uniforme

Posição do mouse nas coordenadas do pixel.

Coordenadas

O Book of Shaders usa o mesmo sistema de coordenadas que o GLSL.