Table des matières

Jour 9 - Système de fichiers ← Précédent

Jour 10 - 3D

É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.

Exemple d'utilisation d'OpenGL

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.

Chargement d'une texture

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

1) voir jour 8
2) crédit à Gambit2099, PODS et snake_48
3) le ficher tex.pcx doit se trouver dans votre dossier data et doit faire 128×128 pixel
 
day10.txt · Dernière modification: 16/08/2010 16:34 par 88.173.20.167
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki