Comment implémenter de faux effets de distorsion 3D pour un jeu de défilement latéral 2D?

14

Je ne suis pas certain des termes appropriés pour rechercher ou même par où commencer, même si j'imagine que c'est une sorte d'effet de post-traitement.

J'ai vu des jeux comme I Wanna Be The Boshy et You Have To Win the Game qui parviennent à modifier la perspective des jeux 2D pour leur donner une sorte d'effet 3D (voir images ci-dessous). Boshy donne essentiellement l'impression que vous êtes à l'intérieur d'une tour (cylindre) tandis que vous devez gagner le jeu déforme l'image de sorte qu'il semble que vous jouez sur un ancien moniteur CRT, en particulier l'aspect légèrement arrondi.

  • Y a-t-il un terme pour cet effet?
  • Quelle est la méthode standard pour mettre en œuvre cet effet (terminologie)?
  • Comment pourrais-je procéder pour implémenter un tel effet dans un moteur / framework de haut niveau tel que Unity ou XNA / Monogame à partir d'une vue de 20 000 pieds? (code détaillé accepté avec plaisir mais pas nécessaire - je réalise que les détails d'implémentation peuvent varier mais des détails de haut niveau sur ce qui doit être fait seraient grandement appréciés)

Je veux être le Boshy Je veux être le Boshy

Vous devez gagner le match entrez la description de l'image ici

SpartanDonut
la source
Ouais. J'ai toujours été curieux de connaître le terme exact de la technique. Le mieux que je puisse penser est "l'ancien effet d'écran de télévision"
Tofu_Craving_Redish_BlueDragon
Exactement! Et cela ne fonctionne que pour le dernier exemple
SpartanDonut

Réponses:

7

Cela peut être implémenté comme un effet post-traitement. (Lors de l'utilisation de Unity / XNA / Dx / OGL / ...)

Méthode géométrique

Commencez par créer un maillage qui ressemble à l'effet de distorsion que vous cherchez à obtenir. (par exemple, modélisez un demi-cylindre (ou un cône, une sphère, un cube, ...), assurez-vous de définir les coordonnées de la texture). Rendez votre jeu 2D comme d'habitude, mais rendez le résultat final dans une texture. Rendez ensuite la géométrie de distorsion avec la texture que vous venez de créer. Vous pouvez utiliser le monde / la vue / la projection ou modifier les coordonnées réelles de la géométrie / texture pour contrôler la force de la distorsion. (l'image 1 montre le jeu 2D normal, l'image 2 montre la même texture projetée sur une sphère)

Exemple de jeu Exemple projeté sur une sphère (à l'aide d'un mélangeur)

Méthode de distorsion

Les outils de traitement d'image offrent souvent des effets de distorsion qui pourraient émuler la projection (comme des illusions d'optique). Par exemple, l'image 3 a été générée à l'aide du filtre de renflement de Paint.Net

Distorsion de renflement.

(Vous pouvez trouver une implémentation (OpenGL ES 2.0) de cet effet de distorsion à partir du projet GPUImage - voir GPUImageBulgeDistortionFilter)

Selon l'implémentation, l'une ou l'autre méthode peut être plus rapide ou fournir une meilleure correspondance avec le résultat souhaité. Comme les deux implémentations sont assez simples, vous pouvez essayer d'implémenter les deux et voir celle qui vous convient le mieux.

Miklas
la source
Une réponse fantastique!
Tholle
1
Les deux nécessitent de traiter la même quantité d'image. La projection ne sera jamais plus rapide que de ne rien faire et le traitement de l'image coûte de la même façon. - La méthode de "distorsion" est plus rapide car vous ignorez la transformation des sommets et la pixellisation, vous donnez également au conducteur plus de liberté pour itérer les pixels, où l'approche polygonale est plus spécifique quant à l'ordre dans lequel dessiner. Enfin, les polygones détiennent moins d'informations sur l'effet recherché, recourent à une solution générique qui met l'accent sur le matériel de filtrage des textures et produit une approximation au lieu du véritable filtre.
MickLH
@MickLH: les sommets d'une telle projection de post-traitement peuvent être calculés hors ligne ou en charge, ce qui donne un vertex shader pass-through très bon marché. Pour un filtre de renflement, un quadruple plein écran doit également être rendu et tramé (sauf si SpartanDonut a accès, par exemple, aux shaders de calcul), et pour chaque pixel, le décalage doit être calculé au lieu d'être interpolé. Par conséquent, je pense (selon les outils disponibles et la mise en œuvre) que les deux méthodes pourraient être tout aussi rapides. J'ai mis à jour ma réponse, merci pour votre contribution.
Miklas