Estabilização do processo de dithering de 1 bit de Obra Dinn (2017)
(forums.tigsource.com)-
Fórum TIGSource
- O TIGSource abriu um servidor oficial no Discord.
- O fórum tem vários tópicos e discussões, com muitos membros participando.
-
Return of the Obra Dinn
- Está em andamento uma discussão sobre o estilo gráfico do jogo e os problemas de dithering.
- Há tentativas de resolver o problema de cintilação renderizando em alta resolução e depois reduzindo a escala.
- Também se discute uma forma de dar estabilidade ao movimento fixando o padrão de dithering.
-
Processo de dithering
- Obra Dinn passa por um processo de renderização em escala de cinza de 8 bits e depois conversão para 1 bit.
- Dois padrões de dithering são usados para oferecer vários efeitos visuais.
- Em imagens em movimento, o padrão de dithering pode causar problemas.
-
Estabilização do dithering
- Foi estudado um método de aumentar a estabilidade fixando o padrão de dithering à geometria.
- Houve esforço para encontrar o melhor resultado testando vários métodos de mapeamento.
-
Conclusão
- Resolver o problema de dithering levou muito tempo, mas no fim o problema foi solucionado mantendo o estilo visual do jogo.
- O jogo final deve oferecer dois modos de exibição.
1 comentários
Comentários no Hacker News
Mesmo tendo feito programação gráfica por mais de 10 anos, não percebi isso ao jogar. Considerando a linguagem visual geral do jogo, acho que foram 100 horas muito bem gastas.
Nesse nível, daria até para ter enviado para a SIGGRAPH com o tema de consistência temporal em renderização não fotorrealista.
Para quem não sabe, Return of the Obra Dinn e Papers, Please são ambos jogos de Lucas Pope e são considerados clássicos incontestáveis, vencedores de vários prêmios.
Mesmo que você normalmente não curta jogos, vale muito a pena conferir. Nenhum dos dois é um jogo típico.
Não há muitos jogos que me fizeram ir tão longe. Não joguei Obra Dinn porque o estilo artístico não me atraiu, mas, se você gosta de jogos de investigação, Curse of the Golden Idol também vale a pena conferir. Em termos de criatividade, ele fica perto desses jogos e é bem divertido.
Mesmo assim, zerei.
Dithering de 1 bit forte é um tema realmente fascinante. Mesmo em 2D há várias abordagens, cada uma com seus pontos fortes, fracos e trade-offs.
É curioso como algo que era central na experiência de computação dos anos 80 acaba sendo bastante complicado no hardware moderno. No meu projeto[0], descobri que é quase impossível fazer um mapeamento 1:1 entre pixels offscreen e o canvas fornecido pelo navegador.
[0] https://sheep.horse/2023/1/improved_web_component_for_pixel-...
Um joguinho simples que fiz antigamente usava exibição colorida em baixa resolução em 3/4 da tela e, na parte de baixo, usava 4 cores com o dobro da resolução horizontal para caber mais texto. Então ele alternava a resolução 120 vezes por segundo sem deixar a CPU muito mais lenta.
Nenhuma das abordagens propostas parece funcionar muito bem, e esse problema parece bem mais complexo do que aparenta.
O que talvez tenha chance de funcionar seria usar um padrão de dithering “fractal” para que zoom in/out seja suave e invariante à escala; processar em espaço de texel para que tanto o movimento da câmera quanto o dos objetos funcionem corretamente; e aplicar algum tipo de passe de difusão de erro com compute shader em espaço de tela, depois de filtragem bilinear ou de renderização supersampled do padrão de dithering.
Ainda assim, não tenho certeza se funcionaria bem na prática. Se isso não for suficiente, outra alternativa possível seria processar de forma simples em espaço de tela, depois remapear o resultado para o espaço de texel preservando a resolução e, no quadro seguinte, usar as informações em espaço de texel para gerar uma solução compatível em espaço de tela antes de mapeá-la de volta para o espaço de texel, acumulando progressivamente em tempo de execução um padrão fractal por texel. Isso pode ser o ideal, mas parece muito caro em memória, computação e complexidade.
https://x.com/dgant/status/1851840125065453894
https://x.com/dgant/status/1851835968342446576?t=kCUSWCtJEc_...
O funcionamento é assim: uso dithering em espaço de mundo, aplico dithering 2D em superfícies com mapeamento triplanar, escolho a escala das coordenadas conforme a profundidade para que o padrão de dithering fique no intervalo [1px, 2px), e pinto superfícies suficientemente distantes com coordenadas esféricas. Há alguma repintura nos limiares de profundidade, mas na prática isso não incomoda muito.
Pesquisando um pouco mais para quem tiver interesse, encontrei devlogs antigos que ele publicou sobre esse tema [1] [2].
Em especial, me chamou atenção a parte sobre um algoritmo de upscaling chamado Scale2X, que é bem legal [3].
[1] https://forums.tigsource.com/index.php?topic=40832.260
[2] https://forums.tigsource.com/index.php?topic=40832.msg121719...
[3] https://www.scale2x.it
Adoro o fato de essa pessoa compartilhar tudo no fórum.
Lembro de ter visto o trabalho inicial de Papers, Please, e há algo muito legal em compartilhar o processo e se expor a feedback.
Discussão da época: https://news.ycombinator.com/item?id=15766249
É um dos melhores textos sobre dithering que já vi. Trabalhei no dithering em preto e branco de Return to Dark Castle.
Eu queria usar dithering Atkinson, mas, por causa da forma como os valores de pixels vizinhos se espalham uns para os outros, era difícil implementar em shader, e na época eu também estava muito estressado e cansado. Acho que não tive a ideia de fixar o padrão ao deslocamento da cena, então deve haver cintilação nos níveis com rolagem, como as catacumbas ou o pacote de helicóptero. Talvez eu tenha feito isso, mas não lembro. De qualquer forma, excelente.
Recentemente peguei no GOG e tentei jogar em um 5K Studio Display, mas não consegui fazer os belos pixels não ficarem borrados. Uma pena mesmo.
Entrei em todos os menus de configuração.
Só por diversão, a trilha sonora do jogo está aqui:
https://www.youtube.com/watch?v=8qvdAWLcPyU