A imagem abaixo mostra dois sprites renderizados com amostragem de pontos no topo de um plano de fundo:
- O crânio esquerdo não possui rotação / redimensionamento, portanto, cada pixel combina perfeitamente com o fundo.
- O crânio direito é girado / escalado e isso resulta em pixels maiores que não estão mais alinhados ao eixo .
Como eu desenvolvi um sombreador de pixel que renderizaria o sprite transformado à direita com pixels alinhados ao eixo do mesmo tamanho que o resto da cena?
Isso pode estar relacionado à forma como o dimensionamento do sprite foi implementado em jogos antigos, como Monkey Island, porque esse é o efeito que estou tentando obter, mas com a rotação adicionada.
Editar
De acordo com as sugestões do kaoD, tentei resolver o problema como um pós-processo. A abordagem mais fácil foi renderizar primeiro para um destino de renderização separado (redução de tamanho para corresponder ao tamanho de pixel desejado) e, em seguida, aumentar a escala ao renderizar uma segunda vez. Ele atendeu aos meus requisitos acima.
Primeiro eu tentei fazê-lo Linear -> Point
e o resultado foi o seguinte:
Não há distorção, mas o resultado parece desfocado e perde a maioria das cores dos destaques. Na minha opinião, quebra o visual retrô que eu precisava.
A segunda vez que tentei Point -> Point
e o resultado foi este:
Apesar da distorção, acho que isso pode ser bom o suficiente para minhas necessidades, embora pareça melhor como uma imagem parada do que em movimento.
Para demonstrar, aqui está um vídeo do efeito, embora o YouTube tenha filtrado os pixels:
No entanto, deixarei a pergunta em aberto por mais alguns dias, caso alguém encontre uma solução de amostragem melhor que mantenha a aparência nítida enquanto diminui a quantidade de distorção ao se mover.
SpriteBatch
requer que eu use o modo Imediato, para que não valha a pena. Eu vou com isso :)