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.
fonte
SpriteBatch
requer que eu use o modo Imediato, para que não valha a pena. Eu vou com isso :)Respostas:
Você deve aplicar seu shader APÓS seu sprite ter sido girado.
Se a cena inteira ainda não foi sombreada e seus sprites estão realmente pixelizados, o que você precisa é de algum tipo de filtro pós-FX para toda a cena. A média das regiões de pixels funcionará bem. Não é exatamente o que você pretende (vai parecer meio distorcido quando se move / gira), mas pode fazer o truque.
A única maneira de manter o visual retrô fiel ao que você quer é realmente desenhar suas rotações de sprite. Não tem nada a ver com a implementação do dimensionamento: a resolução era realmente ruim, falando nisso, você tentou com resoluções extremamente baixas? Também pode ser útil e parecerá mais natural, pois, na verdade, foi o que causou o efeito que você está procurando. E é barato! Muito barato! De fato, será mais barato do que o que você já possui (menos execuções de shader de fragmento).
O efeito é arruinado na imagem de amostra porque sua resolução é alta em comparação com os sprites, permitindo que você veja os pixels reais em cena.
fonte
SpriteBatch
com a amostragem de pontos ativada. Mas um pós-FX pode realmente funcionar. Para iniciantes, tentarei renderizar com amostragem linear em um destino de renderização e, em seguida, renderize todo o destino de renderização no backbuffer com amostragem de pontos.