Shaders

Introdução

Shaders são programas únicos que rodam na GPU. Eles são usados para especificar como pegar os dados de malha (posições dos vértices, cores, normais, etc.) e desenhá-los na tela. Os shaders não processam as informações da mesma forma que um programa normal porque são otimizados para execução na GPU. Uma consequência disso é que os shaders não retêm seus dados depois de executados; eles exibem uma cor final na tela e depois seguem em frente. Consequentemente, não há como acessar a saída de cor da última execução do shader.

O Godot usa uma linguagem de shader muito semelhante ao GLSL, mas com funcionalidade adicional e um pouco menos de flexibilidade. A razão para fazer isso é que o Godot integra uma funcionalidade embutida para tornar a escrita de shaders complexos substancialmente mais fácil. O Godot envolve o código de shader escrito pelo usuário em código próprio. Dessa forma, Godot lida com muitas das coisas de baixo nível com as quais o usuário não precisa se preocupar e é capaz de analisar seu código de shader e usá-lo para afetar a pipeline de renderização. Para shaders mais avançados, você pode desligar essa funcionalidade usando um render_mode.

Este documento fornece algumas informações sobre shaders, específicas para o Godot. Para uma referência detalhada da linguagem de shader no Godot, consulte Linguagem de shading do Godot.

Tipos de shader

Em vez de fornecer uma configuração de propósito geral para todos os usos (2D, 3D, partículas), os shaders do Godot devem especificar a que se destinam. Diferentes tipos oferecem suporte a diferentes modos de renderização, variáveis integradas e funções de processamento.

Todos os shaders precisam especificar o seu tipo na primeira linha, no seguinte formato:

shader_type spatial;

Tipos válidos são:

Para obter informações detalhadas sobre cada tipo de shading, consulte o documento de referência correspondente.

Modos de renderização

Diferentes tipos de shader oferecem suporte a diferentes modos de renderização. Eles são opcionais e, se especificados, devem estar após o shader_type. Os modos de renderização são usados para alterar a maneira como a funcionalidade integrada é tratada. Por exemplo, é comum usar o modo de renderização unshaded para pular a função embutida do processador de luz.

Os modos de renderização são especificados sob o tipo de shader:

shader_type spatial;
render_mode unshaded, cull_disabled;

Cada tipo de shader possui uma lista diferente de modos de renderização disponíveis. Consulte o documento de cada tipo de shader para obter uma lista completa dos modos de renderização.

Funções de processador

Dependendo do tipo de shader, diferentes funções de processador podem ser substituídas opcionalmente. Para "spatial" e "canvas_item", é possível sobrepor vertex, fragment e light. Para "particles", apenas o vertex pode ser substituído.

Processador de vértice

A função de processamento vertex é chamada uma vez para cada vértice nos shaders "spatial" e "canvas_item". Para shaders "particles", é chamado uma vez para cada partícula.

A função vertex é usada para modificar a informação por vértice que será passada para a função de fragmento. Também pode ser usado para estabelecer variáveis que serão enviadas para a função de fragmento usando variações(consulte outro documento).

Por padrão, o Godot pegará suas informações de vértice e as transformará de acordo com o desenho. Se isso for indesejável, você pode usar modos de renderização para transformar os dados você mesmo; veja o Documento do shader espacial para um exemplo disso.

Processador de fragmentos

A função de processamento fragment é usada para configurar os parâmetros do material do Godot por pixel. Este código é executado em cada pixel visível que o objeto ou primitivo desenha. Ele está disponível apenas nos shaders "spatial" e "canvas_item".

O uso padrão da função de fragmento é configurar as propriedades do material que serão usadas para calcular a iluminação. Por exemplo, você definiria valores para ROUGHNESS, RIM, ou TRANSMISSION que diria à função de luz como as luzes respondem a esse fragmento. Isso torna possível controlar uma pipeline de sombreamento complexa sem que o usuário precise escrever muito código. Se você não precisa dessa funcionalidade integrada, pode ignorá-la e escrever sua própria função de processamento de luz e o Godot a otimizará. Por exemplo, se você não escrever um valor para RIM, Godot não calculará a iluminação do aro. Durante a compilação, o Godot verifica se RIM é usado; caso contrário, elimina todo o código correspondente. Portanto, você não desperdiçará cálculos com efeitos que não usa.

Processador de luz

O processador light funciona por pixel também, mas também funciona para cada luz que afeta o objeto (e não funciona se nenhuma luz afetar o objeto). Ele existe como uma função chamada dentro do processador fragment e normalmente opera na configuração das propriedades do material dentro da função fragment.

O processador light funciona de maneira diferente em 2D do que em 3D; para uma descrição de como funciona em cada um, consulte suas documentações, :ref:` Shaders CanvasItem <doc_canvas_item_shader>` e Shaders Spatial, respectivamente.