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...
Shaders CanvasItem
Shaders de CanvasItem são usados para desenhar todos os elementos 2D no Godot. Isso inclui todos os nós que herdam de CanvasItems e todos os elementos de GUI.
Shaders de CanvasItem contêm menos variáveis integradas e funcionalidades do que os Shaders espaciais (Spatial), mas mantêm a mesma estrutura básica com funções processadoras de vértice, fragmento e luz.
Modos de renderização
Modo de renderização |
Descrição |
|---|---|
blend_mix |
Modo de mesclagem Mix (alfa é transparência), padrão. |
blend_add |
Modo de mesclagem Aditivo (additive). |
blend_sub |
Modo de mesclagem Subtrativo (subtractive). |
blend_mul |
Modo de mesclagem Multiplicativo (multiplicative). |
blend_premul_alpha |
Alfa previamente multiplicado. |
blend_disabled |
Desativa a mesclagem (blending), os valores (incluindo o alfa) são gravados como estão. |
unshaded |
O resultado é apenas o albedo. Nenhum cálculo de iluminação/sombreamento acontece no material. |
light_only |
Desenha apenas na passagem de luz (light pass). |
skip_vertex_transform |
|
world_vertex_coords |
|
Embutidos
Valores marcados como in são somente leitura. Valores marcados como out podem opcionalmente ser gravados e não conterão necessariamente valores sensíveis. Valores marcados como inout fornecem um valor padrão sensível e podem opcionalmente ser gravados. Samplers não podem ser gravados, portanto não são marcados.
Nem todas as funções integradas (built-ins) estão disponíveis em todas as funções de processamento. Para acessar uma função integrada de vértice a partir da função fragment(), você pode usar um varying. O mesmo se aplica para acessar funções integradas de fragmento a partir da função light().
Built-ins globais
As funções integradas globais estão disponíveis em todos os lugares, incluindo em funções personalizadas.
Integrado |
Descrição |
|---|---|
in float TIME |
Tempo global desde que o motor foi iniciado, em segundos. Ele se repete a cada |
in float PI |
Uma constante |
in float TAU |
Uma constante |
in float E |
Uma constante |
Vertex embutidos
Os dados dos vértices (VERTEX) são apresentados no espaço local (coordenadas de pixel, relativas à origem do Node2D). Se não forem gravados, esses valores não serão modificados e serão passados adiante exatamente como vieram.
O usuário pode desativar a transformação integrada de modelo para o mundo (as transformações de mundo para a tela e de projeção ainda ocorrerão mais tarde) e fazê-la manualmente com o seguinte código:
shader_type canvas_item;
render_mode skip_vertex_transform;
void vertex() {
VERTEX = (MODEL_MATRIX * vec4(VERTEX, 0.0, 1.0)).xy;
}
Outros elementos integrados, como UV e COLOR, também são passados para a função fragment() se não forem modificados.
Para instanciação, a variável INSTANCE_CUSTOM contém os dados personalizados da instância. Ao usar partículas, essa informação geralmente é:
x: Ângulo de rotação em radianos.
y: Fase durante o tempo de vida (
0.0a1.0).z: Quadro da animação.
Integrado |
Descrição |
|---|---|
in mat4 MODEL_MATRIX |
Transformação do espaço local para o espaço do mundo. O espaço do mundo corresponde às coordenadas que você normalmente usa no editor. |
in mat4 CANVAS_MATRIX |
Transformação do espaço do mundo para o espaço da tela (canvas space). No espaço da tela, a origem fica no canto superior esquerdo da tela e as coordenadas variam de |
in mat4 SCREEN_MATRIX |
Transformação do espaço de tela (canvas space) para o espaço de corte (clip space). No espaço de corte, as coordenadas variam de |
in int INSTANCE_ID |
ID da instância para instanciação. |
in vec4 INSTANCE_CUSTOM |
Dados personalizados da instância. |
in bool AT_LIGHT_PASS |
Sempre |
in vec2 TEXTURE_PIXEL_SIZE |
Tamanho de pixel normalizado da textura 2D padrão. Para um Sprite2D com uma textura de tamanho 64×32 pixels, |
inout vec2 VERTEX |
Posição do vértice, no espaço local. |
in int VERTEX_ID |
O índice do vértice atual no buffer de vértices. |
inout vec2 UV |
Coordenadas de textura normalizadas. Variam de |
inout vec4 COLOR |
Cor proveniente da primitiva do vértice multiplicada pela propriedade modulate do CanvasItem multiplicada pela propriedade self_modulate do CanvasItem. |
inout float POINT_SIZE |
Tamanho do ponto para desenho de pontos. |
in vec4 CUSTOM0 |
Valor personalizado da primitiva do vértice. |
in vec4 CUSTOM1 |
Valor personalizado da primitiva do vértice. |
Fragmentos embutidos
COLOR e TEXTURE
A variável integrada COLOR é usada para algumas coisas:
Na função
vertex(),COLORcontém a cor da primitiva do vértice multiplicada pela propriedade modulate do CanvasItem multiplicada pela propriedade self_modulate do CanvasItem.Na função
fragment(), o valor de entradaCOLORé esse mesmo valor multiplicado pela cor daTEXTUREpadrão (se houver).Na função
fragment(),COLORtambém é a saída final.
Certos nós (por exemplo, Sprite2D) exibem uma textura por padrão, por exemplo, texture. Ao usar uma função fragment() personalizada, você tem algumas opções de como amostrar essa textura.
Para ler apenas o conteúdo da textura padrão, ignorando a COLOR do vértice:
void fragment() {
COLOR = texture(TEXTURE, UV);
}
Para ler o conteúdo da textura padrão multiplicado pela COLOR do vértice:
void fragment() {
// Equivalent to an empty fragment() function, since COLOR is also the output variable.
COLOR = COLOR;
}
Para ler apenas a COLOR do vértice na função fragment(), ignorando a textura principal, você deve passar COLOR como uma varying e, em seguida, lê-la na função fragment():
varying vec4 vertex_color;
void vertex() {
vertex_color = COLOR;
}
void fragment() {
COLOR = vertex_color;
}
NORMAL
Da mesma forma, se um mapa de normais for usado no CanvasTexture, o Godot o usará por padrão e atribuirá seu valor à variável integrada NORMAL. Se você estiver usando um mapa de normais voltado para 3D, ele aparecerá invertido. Para usá-lo em seu shader, você deve atribuí-lo à propriedade NORMAL_MAP. O Godot cuidará de convertê-lo para uso em 2D e de sobrescrever a variável NORMAL.
NORMAL_MAP = texture(NORMAL_TEXTURE, UV).rgb;
Integrado |
Descrição |
|---|---|
in vec4 FRAGCOORD |
Coordenada do centro do pixel. No espaço da tela. |
in vec2 SCREEN_PIXEL_SIZE |
Tamanho dos pixels individuais. Equivalente ao inverso da resolução. |
in vec4 REGION_RECT |
Área visível da região do sprite no formato |
in vec2 POINT_COORD |
Coordenada para desenhar pontos no intervalo de 0.0 a 1.0. |
sampler2D TEXTURE |
Textura 2D padrão. |
in vec2 TEXTURE_PIXEL_SIZE |
Tamanho de pixel normalizado da textura 2D padrão. Para um Sprite2D com uma textura de tamanho 64×32 pixels, |
in bool AT_LIGHT_PASS |
Sempre |
sampler2D SPECULAR_SHININESS_TEXTURE |
Textura de brilho especular (specular shininess) deste objeto. |
in vec4 SPECULAR_SHININESS |
Cor do brilho especular, conforme amostrada da textura. |
in vec2 UV |
UV vinda da função |
in vec2 SCREEN_UV |
Coordenada UV da tela para o pixel atual. |
sampler2D SCREEN_TEXTURE |
Removido no Godot 4. Use um |
inout vec3 NORMAL |
Normal lida de |
sampler2D NORMAL_TEXTURE |
Textura de normais 2D padrão. |
out vec3 NORMAL_MAP |
Configura mapas de normais voltados para 3D para uso em 2D. Se usado, substitui |
out float NORMAL_MAP_DEPTH |
Profundidade do mapa de normais para escalonamento. |
inout vec2 VERTEX |
Posição do pixel no espaço da tela. |
inout vec2 SHADOW_VERTEX |
O mesmo que |
inout vec3 LIGHT_VERTEX |
O mesmo que |
inout vec4 COLOR |
|
Built-ins de iluminação
As funções processadoras de luz funcionam de maneira diferente no Godot 4.x em comparação ao Godot 3.x. No Godot 4.x, toda a iluminação é feita durante a passagem de desenho regular. Em outras palavras, o Godot não desenha mais o objeto novamente para cada luz.
Use o modo de renderização unshaded se você não quiser que a função light() seja executada. Use o modo de renderização light_only se você quiser ver apenas o impacto da iluminação em um objeto; isso pode ser útil quando você quer que o objeto seja visível apenas onde for coberto pela luz.
Se você definir uma função light(), ela substituirá a função de luz integrada, mesmo que sua função de luz esteja vazia.
Abaixo está um exemplo de um shader de luz que leva em consideração o mapa de normais de um CanvasItem:
void light() {
float cNdotL = max(0.0, dot(NORMAL, LIGHT_DIRECTION));
LIGHT = vec4(LIGHT_COLOR.rgb * COLOR.rgb * LIGHT_ENERGY * cNdotL, LIGHT_COLOR.a);
}
Integrado |
Descrição |
|---|---|
in vec4 FRAGCOORD |
Coordenada do centro do pixel. No espaço da tela. |
in vec3 NORMAL |
Normal de entrada. |
in vec4 COLOR |
Cor de entrada. Esta é a saída da função |
in vec2 UV |
UV vinda da função |
sampler2D TEXTURE |
Textura atual em uso para o CanvasItem. |
in vec2 TEXTURE_PIXEL_SIZE |
Tamanho de pixel normalizado da |
in vec2 SCREEN_UV |
Coordenada UV da tela para o pixel atual. |
in vec2 POINT_COORD |
UV para o Point Sprite. |
in vec4 LIGHT_COLOR |
Color of the Light2D. If the light is a PointLight2D, it's multiplied by the light's texture. |
in float LIGHT_ENERGY |
|
in vec3 LIGHT_POSITION |
Posição da Light2D no espaço da tela. Se estiver usando uma DirectionalLight2D, isso será sempre |
in vec3 LIGHT_DIRECTION |
Direção da Light2D no espaço da tela. |
in bool LIGHT_IS_DIRECTIONAL |
|
in vec3 LIGHT_VERTEX |
Posição do pixel, no espaço da tela conforme modificado na função |
inout vec4 LIGHT |
Cor de saída para este Light2D. |
in vec4 SPECULAR_SHININESS |
Brilho especular, conforme definido na textura do objeto. |
out vec4 SHADOW_MODULATE |
Multiplica as sombras projetadas neste ponto por esta cor. |
Funções SDF
Existem algumas funções adicionais implementadas para amostrar uma textura de Campo de Distância Assinado gerada automaticamente. Essas funções estão disponíveis nas funções fragment() e light() dos shaders de CanvasItem. Funções personalizadas também podem usá-las, desde que sejam chamadas a partir de funções suportadas.
O campo de distância sinalizado é gerado a partir dos nós LightOccluder2D presentes na cena com a propriedade SDF Collision ativada (que é o padrão). Veja a documentação de Luzes e sombras 2D para mais informações.
Função |
Descrição |
|---|---|
float texture_sdf (vec2 sdf_pos) |
Realiza uma busca na textura SDF. |
vec2 texture_sdf_normal (vec2 sdf_pos) |
Calcula uma normal a partir da textura SDF. |
vec2 sdf_to_screen_uv (vec2 sdf_pos) |
Converte um SDF para UV de tela. |
vec2 screen_uv_to_sdf (vec2 uv) |
Converte UV de tela para um SDF. |