Como renderizo meu jogo 3D em arte ASCII?

19

Estou tentando criar um ovo de Páscoa para um jogo em 3D no Unity3D. Eu quero renderizar meu jogo momentaneamente na arte ASCII.

Minha primeira idéia é criar um sombreador para fazer isso, mas não tenho certeza se é o caminho certo.

Sata
fonte
com libAA ou libCACA ( link1 - link2 resp.)
v.oddou 5/15

Respostas:

20

Não conheço nenhuma solução plug and play para isso, mas aqui está um algoritmo que funciona no pixel shader com apenas uma textura como ativos extras .

O recurso necessário é uma textura pequena, com uma única linha de um número de peças, onde a esquerda é a mais escura e a direita é a mais clara.

O que acontece então é (por quadro):

  • Pegue o buffer do qual você deseja criar uma versão ASCII e o reduza de tamanho pelo tamanho do bloco (portanto, se você tiver blocos 8x8, a imagem será reduzida em 8 nas duas dimensões).
  • Crie um novo destino de renderização do buffer de tamanho original.
  • Use um sombreador de pixels com o seguinte:
    • Uma entrada de amostrador para o buffer (com a amostragem configurada para o vizinho mais próximo) e uma entrada de amostrador para os blocos.
    • Uniformes para o tamanho do ladrilho, quantidade de ladrilhos e resolução final da saída
  • O pixel shader deve então:
    • Obtenha o valor da escala de cinza do buffer reduzido ( (col.r+col.g+col.b) / 3.0provavelmente é suficiente, mesmo que não seja assim que os olhos funcionam)
    • Use essas informações para obter de qual bloco você deseja renderizar ( floor(grayscale * TILE_COUNT))
    • Calcule as coordenadas X / Y do pixel da saída e leve esses módulos ao tamanho do bloco (tileX / tileY).
    • Retorne como cor o valor amostrado do buffer do bloco em vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )

A página vinculada tem várias imagens de exemplos, uma coisa que eu consideraria adicionar seria um pouco de ruído no valor calculado da escala de cinza, para que não seja um grande bloco de MMMMMMMMMMMMMMMMs

Atualizado: @Lokkij na sala de chat gamedev postou um tutorial mais completo para o Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/

Elva
fonte
Solução simples que pode funcionar muito bem (+1). Agora estou pensando em implementar esse efeito pessoalmente.
Paul Manta
2
@Sata Em referência ao comentário de Kevin de que "[isso] não é exatamente como os olhos funcionam", aqui está uma descrição de várias maneiras de converter uma imagem colorida em escala de cinza: johndcook.com/blog/2009/08/24/…
Paul Manta
1
Você pode expandir isso para incluir parâmetros adicionais, como detecção de borda, para selecionar caracteres com base em sua forma, além de densidade / brilho.
DMGregory
Além disso, havia um artigo sobre como fazer algo semelhante no XNA .
XNargaHuntress