En 2.5D usas recursos 2D / técnicas de renderizado para dar la sensación de un entorno 3D.
Ahora, con esa definición, en el siguiente escenario potencialmente ambiguo, se requiere alguna elaboración:
Juego A
Utilizando gráficos 3D, GPU acelerado y todo (los objetos del juego son mallas, no imágenes), con un ángulo de cámara fijo. Hagámoslo aún peor, la proyección es ortográfica, los clásicos 63.43 grados. La única forma de notar a primera vista que los gráficos no son 2D es porque 3DGC, excepto que los renderiza con extremo cuidado, se diferencian fácilmente de los sprites de dibujo a mano, sin importar la proyección utilizada para renderizarlos. Puede experimentar con diferentes técnicas de renderizado, parámetros, sombreadores, etc., y tendrá dificultades para ocultar el hecho de que son mallas 3D.
Juego B
Un puerto del Juego A, pero dirigido a plataformas que se sabe que tienen hardware que no maneja muy bien los gráficos 3D o que no lo maneja en absoluto. Luego el puerto reemplaza las mallas con sprites. Todavía utiliza cuadros de límite 3D para colisiones, por ejemplo, y los objetos tienen una propiedad de posición con valores x, y y z, ya que la lógica del juego no se tocó o no se tocó, solo se modificó el código de representación.
Como los sprites del Juego B son representaciones de los activos 3D del Juego A y, para hacer las cosas más ambiguas, el Juego A no hace nada que requiera sombreadores complicados, en el 99% de todas las GPU que existen no puedes diferenciar un marco del Juego B de un cuadro del Juego A.
En 2.5D, la interacción entre los objetos del juego se limita al conjunto de situaciones en las que la ilusión de 3D no puede verse comprometida. Para representar dos caracteres abrazados, por ejemplo, tendrá que crear un único archivo de imagen con los dos personajes interactuando, ya que tratar de representar la acción de abrazar solo con una sola imagen por personaje sería demasiado difícil o imposible. Tal vez puedas venir con un cuerpo de personaje dividido en partes y dibujarlos en el orden correcto. En 3D, este problema no existe (existe otro, que plantea los dos caracteres correctamente para que no penetren en la malla del otro personaje).
Ahora, para visualizar esto, imagine que el Juego A y B tienen un error que en alguna situación permite que el personaje del jugador pase a través de otro objeto del juego, lo que nos permite diferenciar fácilmente entre el 2.5D y el 3D.
Juego B, Render 2.5D, los sprites están ordenados por el valor z de su vector de posición. En este ejemplo, z positivo está abajo y z negativo está arriba. El eje z y el eje y son paralelos, pero z se escala por un factor de 0.5 de y. Entonces, si el área visible es de 10y a -10y, en la misma área tenemos de 20z a -20z. Los objetos con una z mayor se dibujarán más tarde, por lo que se verán como delante de los objetos con z inferior. La sombra del personaje del jugador se ve rara porque las sombras están en una capa superior que el piso, pero en una capa inferior que todos los demás objetos, por lo que la sombra del personaje del jugador nunca está en la parte superior del cubo.
Juego A, render 3D. El tampón de profundidad (también conocido como z-buffer) se usa para pruebas de profundidad de precisión de píxeles. Entonces, un objeto no necesita ocluir completamente a otro, ni siquiera un triángulo necesita ocluir completamente a otro, tenemos una prueba de profundidad de precisión de píxeles. Podemos rotar los objetos del juego de cualquier manera y aún así obtener resultados realistas cuando interactúan.
En resumen: en 2.5D un sprite está delante o detrás de otro sprite. En 3D, una malla está hecha de triángulos, pero el triángulo no es la unidad mínima cuando se prueba la profundidad, puede tener precisión de píxeles. Por supuesto, la rotación de la cámara en 2.5D es imposible ya que los activos se crearon para un ángulo de cámara fijo, mientras que en 3D es natural, si los ángulos de la cámara están restringidos por diseño en un juego 3D es otro tema.
Existen diferentes trucos para dar la sensación de estar en un mundo en 3D cuando solo se pueden renderizar gráficos en 2D, solo presenté un ejemplo creado rápidamente utilizando algunos activos de un proyecto mío abandonado.
¿Por qué no usar siempre 3D y olvidarse de 2.5D?
Bueno, puedo pensar en algunos ejemplos de por qué un desarrollador puede preferir el enfoque 2.5D:
- Tal vez no conocen, o no les gustan, las API 3D (Direct3D, OpenGL, hay otras).
- Quizás la plataforma de destino no maneja bien los gráficos 3D (computadoras de escritorio antiguas, consolas 2D).
- Su equipo puede hacer sprites increíbles pero no modelos 3D.
¿Cuánto puede aproximar los resultados de los gráficos 3D con 2.5D?
Hay un horizonte de complejidad de rendimiento y programación. Cuando te aproximas a ese horizonte, comienzas a dudar si tu proyecto es realmente posible en 2.5D o si tienes que ir a 3D. Por ejemplo, puede usar z-buffering en 2.5D (en teoría), pero ¿puede pagar el costo de la memoria de video (computadora de escritorio antigua con gráficos integrados, no dispositivos móviles potentes)? ¿Desea pagar el costo de almacenamiento de tener una imagen adicional para guardar la máscara z de cada sprite?
Los buenos candidatos para 2.5D son juegos de rol, piensa que la serie Baldur's Gate, o RTS, piensa en Age of Empires 1 y 2 (AoE 3 es completamente 3D y fácil de diferenciar).
Referencias útiles:
Z-Buffering: http://en.wikipedia.org/wiki/Z-buffering
Proyecciones ortográficas: http://glasnost.itcarlow.ie/~powerk/GeneralGraphicsNotes/projection/orthographicprojection.html