Vampire: petite introduction à Maggie3D
14 sujets de 1 à 14 (sur un total de 14)
-
Bonjour
Comme je me remets à programmer et que là je suis en plein dans Maggie3D pour la Vampire alors j’en fais une petite présentation
Maggie3D
C’est quoi ?
La nouvelle fonctionnalité du chipset SAGA de la Vampire qui ajoute du traçage 3D
Ca fonctionne comme le blitter (c’est le blitter en fait) on remplis quelques registres custom et après ca trace le nombre de pixel prévu comme le blitterComme vous le savez les cartes 3D tracent des triangles texturés et là cela trace en une simple passe une ligne du triangle
Cette ligne est texturée avec correction de perspective, filtrée (bilinear) et gère le zbuffer et un gouraud( Néanmoins il a que quelques possibilité de mode de traçage : une seule couleur de lampe, un seul mode de zbuffer, un seul blending (transparence/mélange de couleurs) c’est beaucoup moins que Warp3D )
————-
—-X——-
—-#X——
—-X#X—– <— Maggie trace une ligne texturée du triangle comme celle ci
—-#X#X—-
—-X#X#X—-
—————–Ca parait peu mais ça peut être des centaines de pixels d’un coup dans cette ligne pour de gros triangles 🙂
Il suffit donc de tracer toutes les lignes pour obtenir un triangle
et de tracer tout les triangles pour tracer un objet 3D
et tout les objets 3D pour obtenir la scene 3D du jeuMaggie.library
Est une bibliothéque qui évite de s’embêter à programmer directement en hard Maggie3D avec ses registres, un peu comme OpenGL vis à vis des cartes 3D
Il permet de tracer une série de triangles ou de polygones en une seule fonction
et calcule la transformation/projection/éclairage de cet objet
Elle gère aussi les textures et le zbuffer, l’écran et l’éclairage et les tableaux d’indices et de points 3D
Bref c’est un peu comme GLES : un OpenGL avec juste quelques fonctions notamment juste les plus efficaces pour tracer …. mais sans les shaders programmable bien entendu 😉Est-ce applicable sur les écrans bitmaps Amiga ou uniquement sur du RGBA ? Au niveau perfs, ca fait combien de pixels par secondes ?
Samuel.
Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
A500 Vampire V2+ ^8^ 🙂
(mais aussi TO8, TO8D, TO9. Groupe PULS.)Désolé les gars j’en suis pas encore au stade de compiler le code :-/
Là j’ai juste écrit de nouvelles fonctions utilisant directement Maggie3D en hard pour une version de Cow3D n’utilisant pas Warp3D mais juste ses propres fonctions de traçage de triangles
Ca nous donnera les perfs maximales (sans Warp3D, sans OpenGL….)
Si je vois que c’est déjà trop lent ça vaudra pas le coup de faire un WaZp3D par dessus
Si c’est assez rapide il suffira de réécrire soft3D.library qui est le driver (soft puis hard) de WaZp3D en utilisant Maggie3D et non pas un rendu soft
Une fois que la Vampire aura un soft3D.library qui marche elle aura Wazp3D qui marche par dessus et donc aussi MiniGL et StormMesa qui marchent par dessusPar ailleurs il faudra aussi que je mette à jour les sources de Wazp3D car la version de test v57 (celle avec le rendu Nova sous OS4) n’a jamais été recompilé sous OS3/68k.
En dehors du rendu Nova (qui ne peut évidemment marcher que sous de vraies machines OS4) cette version a plusieurs optimisations utilesAdminLe code de Cow3D version Maggie3D est compilé (0 errors 0 warnings) je teste sur Vampire demain soir dès que j’ai la CF et adapteur pour mettre le nouvel ApolloOS
Après il vaudra mieux réécrire la fonction de tracé de triangle en pur ASM pour avoir la performance optimale@Sam apparemment Maggie3D ne peut rendre que sur du ARGB32 ou du RGB565 donc pas dans les autres modes bitmaps et bitplanes dommage si des jeux existants veulent juste du RGB24
une demo justement sortir hier sur le sujet par la Team.
http://www.apollo-core.com/knowledge.php?b=8¬e=40358&z=lrFgyqBon mon Cow3D marchouille avec Maggie3D (ça marche mais le double buffering est cassé donc c’est pas beau mais c’est pas mon sujet)
La vache fait +- 4 fps avec avec rendu Maggie3D mais elle fait dans les 6000 triangles ca nous fait dans les 27000 triangles texturés/seconde
Y a latitude pour optimiser un peu mais ça doublera pas la vitesse
Faut que j’explore si RGB565 est vraiment plus rapide comme écran que ARGBAh 4fps… Je m’attendais à bien plus car dans ce fil Gunnar parle que Maggie fait facile du 110fps pour le rotozoom cité plus haut (qui n’a pas vraiment besoin de la 3D en effet).
Samuel.
Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
A500 Vampire V2+ ^8^ 🙂
(mais aussi TO8, TO8D, TO9. Groupe PULS.)Oui mais le rotozoom ne trace qu’un quad*, la vache trace près de 6000 triangles
(*) comme on trace des segments de ligne horizontales avec maggie on est pas limité à tracer des triangles mais des quads, polygones ou surfaces simples même un rond plein peut être tracé avec
—–#X#X#—-
—–X#X#X—- on peut faire un quad avec des lignes horizontales texturées
—–#X#X#—-
—–X#X#X—-
—–#X#X#—-——–#X—–
—–X#X#X#—- on peut faire un rond avec des lignes horizontales texturées
—-X#X#X#X—
—–X#X#X#—
——–X#—-Oui et franchement les rotozoom ca se fait en 68000 de base et là il n’y avait pas de rotations.
Dans mon test « Monkey » (github) on affiche autour de 1000 triangles à 30 fps en 680×0 pur, ce qui nous amène à 5fps pour 6000 triangles. Du coup je comprends mal le gain de Maggie par rapport à du 100% soft.
Si je me souviens bien, le profiling n’indiquait pas que les routines de tracé comme les plus couteuses, mais aussi les routines de calcul 3D qui sont horrible à optimiser si on veut éviter les bulles dans le pipeline, mais aussi et surtout: le fait qu’il y a aucune primitive de calcul même minimale comme un mult+add pour faire des produit scalaires super rapidement et ne pas perdre trop de temps dans les calculs matriciels.
Samuel.
Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
A500 Vampire V2+ ^8^ 🙂
(mais aussi TO8, TO8D, TO9. Groupe PULS.)Ben si par rapport à ton monkey il y a texture+filtering+blending+zbuffer et puis moi je suis un programmeur en C donc mes performances sont moins bonnes (notamment sur le calcul)
Par exemple dans WaZp3D j’ai privilégié la compatibilité et le debuggage donc y a beaucoup trop de code qui ralentit mais mon but initial était de tourner sur une machine rapide (winuae) avec une compatibilité et options de debug maximales pour que ça puisse servir à développer des applis WaRp3D dans WinUAE
Bref dans mon mode de développement l’optimisation passe vraiment en dernier derrière fonctionnalités, lisibilité du code, compatibilité, stabilité
Effectivement l’Apollo team devrait nous fournir le meilleur code/instructions pour faire du calcul vectoriel
Après maggie.library inclut les transformations/éclairage donc peut être ses fonctions sont 68080 optimisés, mais je sais pas je m’en suis pas serviPour ma part une instruction qui serait très utile serait un add multiple genre un LONG d0=d0+d4; d1=d1+d5; d2=d2+d6; d3=d3+d7;
pour faire en une passe
x=x+deltax;
y=y+deltay;
z=z+deltaz;
w=w+deltaw;Ben si par rapport à ton monkey il y a texture+filtering+blending+zbuffer et puis moi je suis un programmeur en C donc mes performances sont moins bonnes (notamment sur le calcul)
Bah le Monkey est en C pour l’essentiel (juste un seul fichier ASM) et il y a le Zbuffer, le gouraud etc. Il n’y a que la texture que je n’ai pas ajoutée car j’en ai fait dans une autre démo (un rotozoom qui n’a rien à envier à la Démo Maggie), et aussi dans quake.
Pour ma part une instruction qui serait très utile serait un add multiple genre un LONG d0=d0+d4; d1=d1+d5; d2=d2+d6; d3=d3+d7;
pour faire en une passe
x=x+deltax;
y=y+deltay;
z=z+deltaz;
w=w+deltaw;C’est forcément des longs ? Si tu peux te contenter de WORD, il y a une instruction AMMX qui fait 4 additions d’un coup: PADDW. (Note: il serait bien de la coller dans un intrinsics.h pour y avoir accès en C).
Si tu tiens aux LONG, en réorganisant le code ASM généré par le compilo pour éviter les bulles dans le pipeline, on peut s’arranger pour que deux additions s’exécutent en parallèle sur les deux unités arithmétiques. Tu gagnerait un facteur 2 sur ces opérations. C’est déjà ca.
Dans le monkey, j’utilise en plus en parallèle le FPU, et les unités entières. Mais bon c’est tricky /touchy et il ne faut faire cela qu’à la toute fin sur les fonctions que le profiler mets en avant sinon on optimise pour rien (on perds son temps).
Samuel.
Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
A500 Vampire V2+ ^8^ 🙂
(mais aussi TO8, TO8D, TO9. Groupe PULS.)1) Maggie a désormais en hard le texturage en perspective « quadratic » c’est à dire que en plus des pas de texturage linéaire du dv, ces pas changent aussi de ddu ddv à chaque pixel cela permet à la texture de se distordre avec la perspective.
Mon implémentation dans Wazp3D est pas parfaite mais elle a le mérite d’exister et de faire tourner BlitzQuake à 95% (manque le blending).
Comme l’algorithme « quadratic » est mathématiquement pas parfait alors les distorsion trop visibles devront être corrigées d’une autre manière2) Maggie gère désormais en hard les textures de 32×32 à 1024×1024 et mon Wazp3D de 1×1 à 2048×2048 y compris les textures rectangulaires par redimensionnement
WipeOut marche aussi mais trop lentement pour être utile (1-2 fps)
14 sujets de 1 à 14 (sur un total de 14)
- Vous devez être connecté pour répondre à ce sujet.
› Forums › AmigaOS, MorphOS et AROS › Matériel › Vampire: petite introduction à Maggie3D