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.
Checking the stable version of the documentation...
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.gdshaderince 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.