Um shader 3D de pixel art para o Godot 4
Algumas coisas não cabem numa folha de sprites: um nível 3D inteiro, um veículo que o jogador conduz para qualquer lado, um chefe com cem poses. O Pixor grava seu visual como shaders do Godot 4, para que essas coisas sejam desenhadas ao vivo nos mesmos pixels dos seus personagens renderizados.


Duas formas de ter pixel art num jogo 3D
Há duas formas comuns de fazer um jogo do Godot parecer pixel art. A primeira é o bake: renderizar cada personagem de todos os lados numa folha de sprites e tocá-la num AnimatedSprite2D. A segunda é desenhar a própria cena 3D em baixa resolução, por um shader que divide a luz em faixas, limita as cores e desenha contornos, e depois ampliá-la com filtro nearest. As buscas por “3D pixel art shader Godot” e “Godot 4 post processing pixel art” tratam da segunda.
Cada uma tem seu lugar. As folhas pré-renderizadas dão controle manual e retoques, e não custam nada para desenhar. O tempo real cuida do que nenhuma folha comporta: um nível por onde a câmera passa, um carro que gira para qualquer ângulo, uma cena em que tudo se move ao mesmo tempo. O problema é que as duas raramente combinam: os sprites saem de um pipeline, o nível de um shader escrito à parte, e os contornos, as cores e a luz não batem.
O pxr shader resolve isso gravando shaders do Godot a partir do mesmo Estilo com que os sprites são renderizados.
Gravar os shaders
Aponte para um modelo e um visual, ou para um projeto, e para uma pasta dentro do seu projeto do Godot:
pxr shader knight.glb --preset selout --size 64 -o my-game/pixor
pxr shader game.pixor -o my-game/pixor --res res://pixor
-o é a pasta no disco; --res é a mesma pasta como o Godot a vê, um caminho res://, quando ela não é res:// seguido do nome da pasta. A pasta recebe cinco arquivos:
| Arquivo | O que ele faz |
|---|---|
pixor_look.gdshader |
O material. Cada pixel recebe a rampa da sua cor, o degrau da sua faixa de luz e o brilho, como um sprite renderizado receberia, nas cores da própria paleta. Ele é sem sombreamento: o visual é a luz. |
pixor_lines.gdshader |
Os traços, uma passada de tela: a silhueta nos pixels vazios ao redor de um modelo e traços internos onde uma superfície fica na frente de outra, nas cores de traço do Estilo. |
pixor_view.tscn |
A grade de pixels: uma viewport no tamanho do sprite, ampliada quatro vezes com filtro nearest, com a câmera do Pixor e os traços nela. |
pixor_look.gd |
PixorLook.apply($Level) dá o visual a todas as malhas sob um nó, mantendo a cor e a textura de cada material. |
pixor_shader.json |
O tamanho, a escala, a paleta e o que do Estilo os shaders deixam de fora. |
Coloque na sua cena
- Copie a pasta para o projeto do Godot, ou grave-a lá diretamente com
-o. - Adicione
pixor_view.tscnà sua cena principal. Ela desenha o mundo 3D em que está pela grade de pixels, com a passada de contornos. - Dê o visual às suas malhas. Em um script,
PixorLook.apply($Level)define o material em todas as malhas sob o nó. À mão, coloquepixor_look.gdshaderno material de uma malha.
Nada mais precisa ser ajustado: as faixas de luz, as rampas, a paleta e as cores dos traços estão gravadas nos shaders. Para mudar o visual, mude-o no Pixor e rode pxr shader de novo.
--view-scale define em quantos pixels de tela cada pixel da arte se transforma (4 por padrão). Mantenha um número inteiro, como em qualquer pixel art; o guia de tamanhos de sprite explica por quê.
O que o tempo real deixa de fora
Em tempo real, o quadro é desenhado como um quadro renderizado, com três diferenças:
- Sem sombras projetadas. As superfícies recebem luz e faixas, mas um objeto não faz sombra em outro.
- Sem traços entre partes sem degrau de profundidade. Duas partes que se tocam, como uma manga num braço, só recebem um traço onde uma fica na frente da outra.
- Sem passos de quadro inteiro. Passos que leem o quadro inteiro ou comparam quadros, como as limpezas e os átomos desenhados à mão marcados assim, rodam só no bake.
Todo nó de Estilo diz se roda em tempo real: pxr nodes --graph style imprime “in real time: yes” ou “not yet” sob cada um. Um Estilo cujo grafo tem um nó que não roda em tempo real é recusado, e o erro indica o nó. Adicione --partial para gravar mesmo assim o shader das suas configurações, sem esse nó.
Use os dois
A melhor configuração usa as duas metades. Faça o bake dos personagens, que precisam de retoques à mão, muitos quadros e silhuetas exatas, em folhas (o Pixor para Godot cobre os SpriteFrames e a cena já ligada). Desenhe o mundo, os veículos e tudo que é grande ou livre demais para o bake pelo pxr shader. Como os dois vêm de um só Estilo, compartilham rampas, faixas e a paleta, e o jogador vê um jogo, não dois.
Para um sprite que deve reagir à luz numa cena 2D, o light kit (--export light-kit) ilumina sprites renderizados a partir dos mapas de normais no Godot, Unity ou GameMaker, enquanto cada pixel iluminado continua na sua própria rampa; veja iluminação fiel à paleta. A seção do manual sobre os shaders em tempo real tem todas as opções.
Perguntas
Existe uma versão do shader em tempo real para Unity ou Unreal?
Ainda não: o pxr shader grava apenas shaders do Godot 4. Para Unity e GameMaker, o light kit do Pixor ilumina sprites renderizados na engine nos degraus da própria paleta, com um shader para cada.
O visual em tempo real é idêntico ao dos sprites renderizados?
Ele usa as mesmas rampas, faixas de luz, brilho e paleta. Deixa de fora as sombras projetadas, os traços entre partes que se tocam sem degrau de profundidade e os passos que leem o quadro inteiro ou comparam quadros, como as limpezas.
Preciso ajustar os parâmetros do shader à mão?
Não. O visual está gravado nos arquivos de shader, a cena de vista guarda a câmera e a passada de traços, e o PixorLook.apply dá o material a todas as malhas sob um nó, mantendo a cor e a textura de cada uma.
Leia a seguir
- Do 3D à pixel art: o guia completo
- Quatro jeitos de transformar um modelo 3D em pixel art
- Selout: contornos seletivos
- Rampas de paleta
- Deslocamento de matiz
Experimente no seu próprio modelo, grátis no navegador, ou adquira a versão completa.
Testar no navegador Comprar o Pixor