Promoção de Halloween: −40% O Pixor sai por US$ 19.99 US$ 11.99 até 4 de novembro, no itch.io →

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.

O golem de cristal no visual selout: faixas de luz, uma paleta com deslocamento de matiz e contornos seletivos
Um visual no Pixor
As normais do golem como cores, a informação a partir da qual um shader em tempo real ilumina
De onde o shader tira a luz: as normais

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

  1. Copie a pasta para o projeto do Godot, ou grave-a lá diretamente com -o.
  2. Adicione pixor_view.tscn à sua cena principal. Ela desenha o mundo 3D em que está pela grade de pixels, com a passada de contornos.
  3. Dê o visual às suas malhas. Em um script, PixorLook.apply($Level) define o material em todas as malhas sob o nó. À mão, coloque pixor_look.gdshader no 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

Experimente no seu próprio modelo, grátis no navegador, ou adquira a versão completa.

Testar no navegador Comprar o Pixor