Como implementar efeitos de distorção em 3D falsos como um jogo de rolagem 2D lateral?

14

Não tenho certeza dos termos adequados para pesquisar ou mesmo por onde começar, embora imagine que seja algum tipo de efeito pós-processamento.

Eu já vi jogos como I Wanna Be The Boshy e You Have To Win the Game, que conseguem modificar a perspectiva dos jogos 2D para dar um tipo de efeito 3D a eles (veja as imagens abaixo). Boshy basicamente faz com que pareça que você está dentro de uma torre (cilindro) enquanto Você tem que vencer o jogo distorce a imagem para que pareça que você está jogando em um monitor CRT antigo, especificamente o visual ligeiramente arredondado.

  • Existe um termo para esse efeito?
  • Qual é a maneira padrão de implementar esse efeito (terminologia)?
  • Como eu implementaria esse efeito em um mecanismo / estrutura de alto nível, como Unity ou XNA / Monogame, de uma visão de 20.000 pés? (código detalhado aceito com satisfação, mas não necessário - sei que os detalhes exatos da implementação podem variar, mas os detalhes de alto nível sobre o que precisa ser feito serão muito apreciados)

Eu quero ser o boshy Eu quero ser o boshy

Você precisa vencer o jogo insira a descrição da imagem aqui

SpartanDonut
fonte
Sim. Eu sempre fiquei curioso para saber o termo exato para a técnica. O melhor que consigo pensar é em "efeito de tela de TV antiga"
Tofu_Craving_Redish_BlueDragon
Exatamente! E isso só funciona para o último exemplo
SpartanDonut

Respostas:

7

Isso pode ser implementado como um tipo de efeito de pós-processamento. (Ao usar o Unity / XNA / Dx / OGL / ...)

Método de geometria

Comece criando uma malha que se assemelhe ao efeito de distorção que você deseja obter. (por exemplo, modele um meio cilindro (ou cone, esfera, cubo, ...), certifique-se de definir as coordenadas da textura). Renderize seu jogo 2D como de costume, mas renderize o resultado final em uma textura. Em seguida, renderize a geometria da distorção com a textura que você acabou de criar. Você pode usar o mundo / visão / projeção ou modificar as coordenadas reais de geometria / textura para controlar a intensidade da distorção. (a imagem 1 mostra o jogo 2D normal, a imagem 2 mostra a mesma textura projetada em uma esfera)

Exemplo de jogo Exemplo projetado em uma esfera (usando o liquidificador)

Método de distorção

As ferramentas de processamento de imagem geralmente oferecem efeitos de distorção que podem emular a projeção (como ilusões de ótica). Por exemplo, a imagem 3 foi gerada usando o filtro de protuberância do Paint.Net

Distorção protuberante.

(Você pode encontrar uma implementação (OpenGL ES 2.0) desse efeito de distorção no projeto GPUImage - consulte GPUImageBulgeDistortionFilter

Dependendo da implementação, qualquer um dos métodos pode ser mais rápido ou fornecer uma melhor correspondência para o resultado desejado. Como as duas implementações são bastante simples, você pode tentar implementá-las e ver qual delas funciona melhor para você.

Miklas
fonte
Resposta fantástica!
Tholle 18/05/19
1
Ambos exigem o processamento da mesma quantidade de imagem. A projeção nunca será mais rápida do que não fazer nada , e o processamento de imagens custa da mesma maneira. - O método "Distorção" é mais rápido porque você está pulando a transformação e a rasterização de vértices, além de dar ao motorista mais liberdade para iterar os pixels, onde a abordagem de polígono é mais específica sobre qual ordem desenhar. Finalmente, polígonos mantenha menos informações sobre o efeito pretendido, esteja recorrendo a uma solução genérica que enfatiza o hardware de filtragem de textura e produz uma aproximação em vez do filtro real.
MickLH
@MickLH: Os vértices para essa projeção de pós-processamento podem ser calculados offline ou com carga, produzindo um sombreador de vértice de passagem muito barato. Para um filtro de protuberância, um quad de tela cheia também deve ser renderizado e rasterizado (exceto se o SpartanDonut tiver acesso, por exemplo, a sombreadores de computação) e para cada pixel o deslocamento deve ser calculado em vez de interpolado. Portanto, acredito (dependendo das ferramentas e implementação disponíveis) os dois métodos podem ser igualmente rápidos. Atualizei minha resposta, obrigado pela sua contribuição.
Miklas