cafe_dev
Thread Id: 28938
Thread Name: 3D en GBA
#0
cosarara97 12296
Bueno, pues el otro día me pregunté: ¿Sería posible hacer un juego de pokémon para GBA en 3D? (Como D/P, con las limitaciones gráficas correspondientes). - Unos lo hacen en RPGMaker, otros hacemos cosas raras.
Obviamente la pregunta es a nivel teórico, ya que no tengo suficiente interés para ponerme a hacerlo.

La GBA no tiene ninguna unidad 3D de hardware, de modo que hay que hacer todo el rendering por software, como en los viejos tiempos. Hubieron algunos títulos comerciales que lo hicieron, en este blog hay una lista (quizá falta alguno): 3D graphics on the Game Boy Advance: How well could it be done? - GBA feature at Thunderbolt

El tema está en repintar toda la pantalla cada frame (por que por algo es un juego en 3D) en modo de bitmap (sin usar tiles), y conseguir que la cosa tire con un framerate decente.
Para esto hay que usar el modo 4 de la GBA y hacer page-flipping.

Además, los floats de GBA son lentos, de modo que hay que usar Fixed-point math y otros trucos para los cálculos.

Con todo esto, y unas cuantas mates (he tenido que aprender a hacer multiplicación de matrices y proyectar puntos en un plano 2d :O), he escrito una demo:
https://www.dropbox.com/s/vnjho1ihaanazp4/3D.gba?dl=0


Código fuente (necesita tonclib y devkitpro): https://www.dropbox.com/s/5cx25gqy8t37hh7/3d_on_gba.tar?dl=0
#1
PkPower 26199
Interesante. La verdad yo recuerdo a ver jugado juegos 3d como dices renderizados.

Aun así creo q seria un trabajo demasiado laborioso. Mas si aun encima es un Hank de pokemon. No solo es eso, luego tocaria integrarlo en la rom.
#2
cosarara97 12296
Iniciado por PkPower
Interesante. La verdad yo recuerdo a ver jugado juegos 3d como dices renderizados.


Bueno, si has jugado a Doom, Doom II, Duke Nukem o alguno de estos en GBA o no es cosa tuya, pero existen xD.
#3
Polectron 25870
Alucinante, simple y llanamente alucinante.
No han sacado minecraft para 3DS, saquemoslo para GBA (??)
Es una pasada, enhorabuena por los resultados obtenidos.
#4
eing 12479
Como te dije por perfil la idea es interesante, e inclusive editando el código asm de los juegos de pokémon es posible hacer esto, pero me resultaria coñazo trabjar a nivel de bitmaps y cargar uno y otro.. Pero bue, es un gran avance e idea!
Espero ver pronto alguna secuencia ingame! -ya de por si es un avance lo del rectangulo..-
#5
cosarara97 12296
Iniciado por eing
Como te dije por perfil la idea es interesante, e inclusive editando el código asm de los juegos de pokémon es posible hacer esto, pero me resultaria coñazo trabjar a nivel de bitmaps y cargar uno y otro.. Pero bue, es un gran avance e idea!

No, no cargas bitmaps, sino que pones la GBA en uno de los modos bitmap (en lugar de en uno de los de tiles) y dibujas directamente en la VRAM.
Sustituir la función de renderizado de un juego original sería interesante, pero no me he mirado las rutinas de overworld así que no tengo ni idea de lo difícil que sería.

Espero ver pronto alguna secuencia ingame! -ya de por si es un avance lo del rectangulo..-

Es un cubo e_e

PD: El siguiente paso es rasterizar, es decir, pintar triangulitos.
#6
Adrizel 23642
Si quieres hacer un juego en 3D, para eso lo haces en el Rom Hacking de DS. -_-
#7
Polectron 25870
Iniciado por Adrizel
Si quieres hacer un juego en 3D, para eso lo haces en el Rom Hacking de DS. -_-


Así pierde la gracia, justamente poder hacer un juego en 3D en GBA es lo divertido de hackear, usar cosas de formas que no estaban pensadas para ser usadas ;3
#8
cosarara97 12296
Iniciado por Adrizel
Si quieres hacer un juego en 3D, para eso lo haces en el Rom Hacking de DS. -_-


Veo que no lo has entendido. Yo no quiero simplemente hacer un juego en 3D, lo que quiero hacer es un motor 3D en GBA.
Si lo que quisiera hacer fuera un juego ya lo habría hecho hace tiempo.
#9
cosarara97 12296
(yay, doble post)

https://www.dropbox.com/s/hyonz9bjeyo33s6/3D_v2.gba?dl=0

Ahora la cosa sabe pintar triangulitos y cuadriláteros (que en su momento se dividen en triangulitos), y usa el algoritmo del pintor para que las caras de arriba salgan arriba y viceversa (en el eje Z, claro).
Aún así, se ordenan los quads y los triángulos por separado, cosa que significa que si usamos los 2 a la vez las cosas se van a sobreponer - esta demo solo usa quads.
Oh, y aún así, sin texturas, y usando código bastante optimizado, ya empieza a haber problemas de rendimiento al renderizar. Ese número de a la izquierda es el número de ciclos que se tarda en hacerlo - vblank pasa cada 234000 ciclos, así que vamos unas 3 veces más lentos de lo que deberíamos si queremos 60 fps.

Y he puesto el repo en github:
https://github.com/cosarara97/3d-gba
#10
Dani_SR_17 28493
Pufff, una propuesta increíble la verdad, es todo un reto la verdad.

Sería impresionante un hack en GBA en 3D, claro, que será muy laborioso....
Aveces pienso que tendría que haberme metido en Informática, pero como al final me metí en Matemáticas, poco puedo aportar...
#11
cosarara97 12296
Iniciado por Dani_SR_17
Pufff, una propuesta increíble la verdad, es todo un reto la verdad.

Sería impresionante un hack en GBA en 3D, claro, que será muy laborioso....
Aveces pienso que tendría que haberme metido en Informática, pero como al final me metí en Matemáticas, poco puedo aportar...


Bueno, pues la verdad es que nunca había usado tantas matemáticas en un programa como esta. Ya lo dije en el primer post, he tenido que aprender a hacer álgebra linear con multiplicación de matrices para poder rotar vectores xD.
#12
Dani_SR_17 28493
Iniciado por cosarara97
Bueno, pues la verdad es que nunca había usado tantas matemáticas en un programa como esta. Ya lo dije en el primer post, he tenido que aprender a hacer álgebra linear con multiplicación de matrices para poder rotar vectores xD.


Jajajaja, ya, pero lo digo, porque mis conocimientos de informática pues son algo nulos, yo como mucho se hacer un par de tonterías en Haskel o Scala, pero ya esta (Y bueno, algo de C,pero hace mucho que no lo uso).

Pero que lo de rotar los vectores no es para tanto eh, si vieras el examen que hice en Junio, me cago en to...
#13
Trifindo_v2 26324
Hey, que gran trabajo!

Tengo algunas preguntas sobre el sistema:
- Soporta la intersección de las caras?
- Soporta el cambio y posición de la cámara?
- Crees que soportará texturas de más de 16x16 sin la caída de fps?

Tengo más preguntas pero de momento quiero que me respondas a esto, me encanta el tema del 3D.
#14
cosarara97 12296
Iniciado por Trifindo_v2
Hey, que gran trabajo!

Tengo algunas preguntas sobre el sistema:
- Soporta la intersección de las caras?
- Soporta el cambio y posición de la cámara?
- Crees que soportará texturas de más de 16x16 sin la caída de fps?

Tengo más preguntas pero de momento quiero que me respondas a esto, me encanta el tema del 3D.


1 - ahora mismo no
2 - la abstracción hecha aún, pero mover la camara o mover el mundo es un poco lo mismo ;)
3 - No he empezado aún con las texturas, pero puedo asegurarte que al activarlas el framerate bajará significativamente. Si el hecho de que sean de 16x16 o más influye especialmente dependerá de como se diseñe e implemente el sistema.

Ahora mismo mi prioridad es aumentar el framerate un poco más mediante culling/hidden surface removal.
Hoy he escrito un caso especial para quads que hace que se renderizen más rápido y sin artefactos. Haría una actualización decente, pero estoy desde el mobil con una cobertura pésima :P