Sur GBA (et sans doute sur SNES aussi) ça marche comme ça :
A chaque scanline de l'écran une interruption Hblank change le contenu des registres de scale/rotation, par transfert DMA à partir d'une table précalculée. Les valeurs de cette table donnent un effet de perspective au plan affiché. Cette table est precalculée à l'avance, il y a plein de moyens de le faire. Dans cette table en fait il est indiqué pour chaque ligne la coordonnée relative à la caméra du 1er pixel de la ligne et une valeur d'incrémentation pour "avancer" suivant deux dimensions. Cette table contient donc pour chaque angle (assimilé à une puissance de 2 c'est plus pratique, ie: 256 ou 512 pour représenter 360°) et pour chaque ligne de pixel sur l'écran, la coordonnée x,y du point sur la map et une incrémentation dx,dy qui permet de passer au pixel suivant sur l'écran.
Comment créer cette table ? Faire l'affichage du plan avec les rotations/projections 3D de base et faire une projection inverse des pixels au bords (gauche et droit) de l'écran, le calcul de dx,dy est trivial... on peut faire ça de maniere automatique avec OpenGL/GLU par exemple, mais aussi par calculs matriciels (sans affichage).
Voila.
Sur TI on peut faire un truc similaire tout a fait rapide, j'avais commencé il y a deux ans environ, avec les circuits de Mario Kart qui sont faciles à ripper (contrairement à ceux de FZero qui sont trop grands), et ça marchait a peu pres sauf que j'avais quelques petits problemes de qualité visuelle. Le hardware de la GBA/SNES fait du rendu tres precis (
sub-texel accuracy) alors que si on veut faire pareil en software ça prendrait trop de temps, donc le résultat vers le bas de l'écran était quelque peu pixelisé
Mais bon, ça marchait
