Jour 9 - Système de fichiers ← Précédent
Étudions maintenant les fonctions 3D de la DS.
Pour faire de la 3D sur DS nous n’utilisons pas PALib mais la libnds qui définit toutes les fonctions utiles. La 3D sur DS s’utilise comme sur PC à l’aide d’OpenGL. De ce fait vous pouvez allez lire tous les tutos sur OpenGL, ils seront, en grande partie, compatibles avec la DS. Attention quand même: la puce graphique de la DS n’est pas aussi puissante que celle d’un PC classique il y a une certaine limitation au niveau des fonctions disponible. Pour savoir ce que vous pouvez utiliser, regardez l’include videoGL.h fourni par la libnds, il est généralement situé dans C:\devkitPro\libnds\include\nds\arm9.
Le tuto OpenGL le plus complet est celui réalisé par nehe sur son site attention il est en anglais. Vous pourrez en trouver d’autres en français comme sur le site du zero ou sur developpez.com.
Avant d’utiliser OpenGL il faut l’initialiser et initialiser la DS pour la 3D. Sachez la 3D n’est disponible que pour l’écran tactile.
On initilise la DS avec
videoSetMode(MODE_0_3D);
Et OpenGL avec
glInit():
Voici maintenant un exemple complet qui affiche un cube.
#include <PA9.h> #define LARGEUR_ECRAN 256 #define HAUTEUR_ECRAN 192 int main() { PA_Init(); PA_InitVBL(); videoSetMode(MODE_0_3D); glInit(); glViewport(0,0,LARGEUR_ECRAN-1,HAUTEUR_ECRAN-1); glClearColor(0,0,0,31); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70,(double)LARGEUR_ECRAN/HAUTEUR_ECRAN,.1,1000); glPolyFmt(POLY_ALPHA(31) | POLY_CULL_NONE ); while(1) { glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); gluLookAt(3,4,2,0,0,0,0,0,1); glBegin(GL_QUADS); glColor3b(255,0,0); //face rouge glVertex3f( 1, 1, 1); glVertex3f( 1, 1,-1); glVertex3f(-1, 1,-1); glVertex3f(-1, 1, 1); glColor3b(0,255,0); //face verte glVertex3f( 1,-1, 1); glVertex3f( 1,-1,-1); glVertex3f( 1, 1,-1); glVertex3f( 1, 1, 1); glColor3b(0,0,255); //face bleue glVertex3f(-1,-1, 1); glVertex3f(-1,-1,-1); glVertex3f( 1,-1,-1); glVertex3f( 1,-1, 1); glColor3b(255,255,0); //face jaune glVertex3f(-1, 1, 1); glVertex3f(-1, 1,-1); glVertex3f(-1,-1,-1); glVertex3f(-1,-1, 1); glColor3b(0,255,255); //face cyan glVertex3f( 1, 1,-1); glVertex3f( 1,-1,-1); glVertex3f(-1,-1,-1); glVertex3f(-1, 1,-1); glColor3b(255,0,255); //face magenta glVertex3f( 1,-1, 1); glVertex3f( 1, 1, 1); glVertex3f(-1, 1, 1); glVertex3f(-1,-1, 1); glEnd(); glFlush(0); PA_WaitForVBL(); } return 0; }
Il n’y a rien de sorcier dans ce code si vous ne comprenez pas quelques chose vous devriez relire les tutoriels sur OpenGL.
Les choses se compliquent un peu ici. Pour charger des textures il faut déjà allouer un espace de stockage pour OpenGL.
vramSetMainBanks(VRAM_A_TEXTURE,VRAM_B_TEXTURE,VRAM_C_LCD,VRAM_D_LCD);
La DS possède 4 banc de VRAM1) il faut en affecter au moins un à OpenGL TEXTURE et les autres pour vous LCD. A vous de choisir le nombre de banc dont vous avez besoin.
Ensuite comme pour tout programme OpenGL il faut activer les textures.
glEnable(GL_TEXTURE_2D);
Avant de charger la texture je vais vous expliquer comment créer la texture. Cela doit être un fichier de largeur et hauteur puissance de 2 : 8, 16, 32, 64, 128, 256, 512 ou 1024. L’image doit être en couleur indexée avec 255 couleur. Vous pouvez créer ce genre fichier avec The Gimp the Photoshop par exemple. Vous devez enregistrer ce ficher avec l’extension .pcx dans le dossier data/ de votre projet, si il n’existe pas vous devrez le créer.
Vous pouvez maintenant charger une texture grâce à ce code2)
int chargerTexture(const u8 *tex,GL_TEXTURE_SIZE_ENUM width,GL_TEXTURE_SIZE_ENUM height) { sImage pcx; int texture; loadPCX((u8*)tex, &pcx); image8to16(&pcx); glGenTextures(1, &texture); glBindTexture(0, texture); glTexImage2D(0, 0, GL_RGB, width , height, 0, TEXGEN_TEXCOORD, pcx.image.data8); imageDestroy(&pcx); return texture; }
Et maintenant voici l’exemple complet3)
#include <PA9.h> #include "tex.h" #define LARGEUR_ECRAN 256 #define HAUTEUR_ECRAN 192 int chargerTexture(const u8 *tex,GL_TEXTURE_SIZE_ENUM width,GL_TEXTURE_SIZE_ENUM height); int main(int argc, char ** argv) { int texture = 0; PA_Init(); PA_InitVBL(); videoSetMode(MODE_0_3D); vramSetMainBanks(VRAM_A_TEXTURE,VRAM_B_TEXTURE,VRAM_C_LCD,VRAM_D_LCD); glInit(); glEnable(GL_TEXTURE_2D); glViewport(0,0,LARGEUR_ECRAN-1,HAUTEUR_ECRAN-1); glClearColor(0,0,0,31); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70,(double)LARGEUR_ECRAN/HAUTEUR_ECRAN,.1,1000); glPolyFmt(POLY_ALPHA(31) | POLY_CULL_NONE ); texture=chargerTexture(tex,TEXTURE_SIZE_128,TEXTURE_SIZE_128); while(1) { glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); gluLookAt(3,4,2,0,0,0,0,0,1); glBindTexture(GL_TEXTURE_2D, texture); glBegin(GL_QUADS); glTexCoord2f(0,0);glVertex3f(1,-1,1); glTexCoord2f(0,1);glVertex3f(1,1,1); glTexCoord2f(1,1);glVertex3f(-1,1,1); glTexCoord2f(1,0);glVertex3f(-1,-1,1); glEnd(); glFlush(0); PA_WaitForVBL(); } return 0; }
Jour 11 - Fonctions vidéo → Suivant