¿Cómo implementar 3D falso como efectos de distorsión para un juego de desplazamiento lateral en 2D?

14

No estoy seguro de los términos adecuados para buscar o incluso dónde comenzar, aunque imagino que es una especie de efecto de procesamiento posterior.

He visto juegos como I Wanna Be The Boshy y You Have To Win the Game que logran modificar la perspectiva de los juegos 2D para darles una especie de efecto 3D (ver imágenes a continuación). Boshy básicamente hace que parezca que estás dentro de una torre (cilindro) mientras que Tienes que ganar el juego distorsiona la imagen para que parezca que estás jugando en un viejo monitor CRT, específicamente el aspecto ligeramente redondeado.

  • ¿Hay un término para este efecto?
  • ¿Cuál es la forma estándar de implementar este efecto (terminología)?
  • ¿Cómo haría para implementar tal efecto en un motor / marco de alto nivel como Unity o XNA / Monogame desde una vista de 20,000 pies? (el código detallado se acepta felizmente pero no es necesario; me doy cuenta de que los detalles exactos de la implementación pueden variar, pero se agradecerían mucho los detalles de alto nivel sobre lo que hay que hacer)

Quiero ser el boshy Quiero ser el boshy

Tienes que ganar el juego ingrese la descripción de la imagen aquí

SpartanDonut
fuente
Si. Siempre tuve curiosidad por saber el término exacto para la técnica. Lo mejor que se me ocurre es el "efecto de pantalla de televisión antiguo"
Tofu_Craving_Redish_BlueDragon
¡Exactamente! Y eso solo funciona para el último ejemplo
SpartanDonut

Respuestas:

7

Esto se puede implementar como un tipo de efecto de posprocesamiento. (Cuando se usa Unity / XNA / Dx / OGL / ...)

Método de geometría

Comience creando una malla que se parezca al efecto de distorsión que desea lograr. (por ejemplo, modele un medio cilindro (o cono, esfera, cubo, ...), asegúrese de establecer las coordenadas de textura). Renderiza tu juego 2D como de costumbre, pero renderiza el resultado final en una textura. Luego, renderice la geometría de distorsión con la textura que acaba de crear. Puede usar el mundo / vista / proyección o modificar las coordenadas reales de geometría / textura para controlar la intensidad de la distorsión. (la imagen 1 muestra el juego 2D normal, la imagen 2 muestra la misma textura proyectada en una esfera)

Ejemplo de juego Ejemplo proyectado en una esfera (usando licuadora)

Método de distorsión

Las herramientas de procesamiento de imágenes a menudo ofrecen efectos de distorsión que podrían emular la proyección (como las ilusiones ópticas). Por ejemplo, la imagen 3 se generó utilizando el filtro de protuberancia de Paint.Net

Distorsión abultada.

(Puede encontrar una implementación (OpenGL ES 2.0) de este efecto de distorsión desde el proyecto GPUImage ; consulte GPUImageBulgeDistortionFilter)

Dependiendo de la implementación, cualquiera de los métodos puede ser más rápido o proporcionar una mejor coincidencia con el resultado deseado. Como ambas implementaciones son bastante simples, podría intentar implementar ambas y ver cuál funciona mejor para usted.

Miklas
fuente
Fantástica respuesta!
Tholle
1
Ambos requieren procesar la misma cantidad de imagen. La proyección nunca será más rápida que no hacer nada , y el procesamiento de imágenes cuesta lo mismo de cualquier manera. - El método de "distorsión" es más rápido porque está omitiendo la transformación de vértices y la rasterización, también le está dando al conductor más libertad para iterar los píxeles, donde el enfoque de polígono es más específico sobre el orden de dibujo. Finalmente, los polígonos tienen menos información sobre el efecto deseado, están recurriendo a una solución genérica que enfatiza el hardware de filtrado de textura y produce una aproximación en lugar del filtro real.
MickLH
@MickLH: los vértices para dicha proyección de posprocesamiento se pueden calcular sin conexión o en carga, produciendo un sombreador de vértices de paso muy barato. Para un filtro de bombeo, también se debe representar y rasterizar un quad de pantalla completa (excepto si SpartanDonut tiene acceso, por ejemplo, a sombreadores de cálculo), y para cada píxel se debe calcular el desplazamiento en lugar de interpolarlo. Por lo tanto, creo (dependiendo de las herramientas disponibles y la implementación) ambos métodos podrían ser igualmente rápidos. He actualizado mi respuesta, gracias por tu aporte.
Miklas