PDA

Voir la version complète : [NDS][Aide] 3D et plusieurs textures


Gwoin
12/03/2006, 01h14
Salut à tous,

Je fait de petits tests en 3D sur DS et j'affiches plusieurs objets avec chacun sa propre texture.
Enfin du moins j'essaie parce que seule la premiere texture semble vouloir être utilisée...

Je m'explique:
Par exemple, j'affiche un cube et un plan.
Le plan a la 1ere texture et le cube à la seconde texture... sauf que lui je le voit tout blanc :blink:

Si j'attache la 1ere texture (je veux dire la 1ere texture chargée) aux 2 objets, pas de probleme. Si j'inverse l'ordre de chargement des textures, c'est bien l'autre texture qui est correctement affichée: le cube est alors correct et le plan est blanc.

Donc ça ne vient pas de mes textures, mais plutot de leur chargement.

j'utilise ça comme code de chargement et d'initialisation:

int texture[2]; //identifiant des 2 textures

//pour attacher ma texture, je fais appel à :
glBindTexture(GL_TEXTURE_2D, texture[0]);
//ou
glBindTexture(GL_TEXTURE_2D, texture[1]);
//sachant que mes UVs sont bien attribués

//charge les 2 textures en mémoire: 1 pcx de 256x256 et 1 pcx de 128x128
void LoadGLTextures()
{
int i=0;
for (i=0; i<2; i++)
{
sImage pcx;

//load our textures
if (i == 0)
loadPCX((u8*)BG_DOWN_pcx, &pcx);
else if (i == 1)
loadPCX((u8*)cube_pcx, &pcx);

image8to16(&pcx);

glGenTextures(1, &texture[i]);
glBindTexture(GL_TEXTURE_2D, texture[i]);
if (i==0)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXTURE_SIZE_256 , TEXTURE_SIZE_256, 0, TEXGEN_TEXCOORD, pcx.data8);
else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, TEXGEN_TEXCOORD, pcx.data8);

imageDestroy(&pcx);
}
}

//appelé au début pour initialiser la 3D
void Init3D()
{
// Turn on everything
powerON(POWER_ALL);

// Setup the Main screen for 3D
videoSetMode(MODE_0_3D);
vramSetBankA(VRAM_A_TEXTURE);

// IRQ basic setup
irqInit();
irqSet(IRQ_VBLANK, 0);

// Set our viewport to be the same size as the screen
glViewPort(0,0,255,191);

// Specify the Clear Color and Depth
glClearColor(0,0,0);
glClearDepth(0x7FFF);

LoadGLTextures();
}

Il semble que quand j'attache la 2eme texture (texture[1]), rien n'est attaché >_<

Quelqu'un aurait une idée ?
Il y a autre chose à faire sur DS pour avoir plusieurs textures ou alors j'ai fait une grosse connerie tellement énorme que je l'ai pas vu (ça reste fortement possible :p ) ?? :-*

Brunni
12/03/2006, 11h44
Ca a l'air correct... tu peux poster le code où tu dessines tes objets stp?

Gwoin
12/03/2006, 20h39
Voici le code pour afficher la scene:
//affiche la scene
void DrawGLScene()
{
// Reset the screen and setup the view
glReset();
gluPerspective(35, 256.0 / 192.0, 0.1, 100);
glColor3f(1,1,1);

//glEnable(GL_BLEND);
glPolyFmt(POLY_ALPHA(31) | POLY_CULL_NONE | POLY_FORMAT_LIGHT0);

//set up a directional ligth arguments are light number (0-3), light color,
//and an x,y,z vector that points in the direction of the light
glLight(0, RGB15(31,31,31) , 0, floattov10(-1.0), 0);

glMatrixMode(GL_TEXTURE);
glIdentity();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glMaterialf(GL_AMBIENT, RGB15(16,16,16));
glMaterialf(GL_DIFFUSE, RGB15(16,16,16));
glMaterialf(GL_SPECULAR, BIT(15) | RGB15(8,8,8));
glMaterialf(GL_EMISSION, RGB15(16,16,16));

glMaterialShinyness();

Test3DKeys();

RenderFond();
RenderCube();

glFlush();
}

void RenderCube()
{
glPushMatrix();
{
glColor3f(0.1f, 0.8f, 0.1f);
glTranslatef(0.0f,0.3f,-3.0f);

glRotatef(m_fRotationCubeX,1.0f,0.0f,0.0f);
glRotatef(m_fRotationCubeY,0.0f,1.0f,0.0f);

//glBindTexture(GL_TEXTURE_2D, texture[1]);
PA_Texture(texture[1]);

float l = 0.8;
//PA_3DBoxTexture(0.0f,0.0f,0.0f, l, l, l, 0.0f, 0.0f, 0.0f, 256,256,256);
glBegin(GL_QUADS);
{
// Front Face
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-l, -l, l);
glTexCoord2f(1.0f, 0.0f); glVertex3f( l, -l, l);
glTexCoord2f(1.0f, 1.0f); glVertex3f( l, l, l);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-l, l, l);
// Back Face
glNormal3f( 0.0f, 0.0f,-1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-l, -l, -l);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-l, l, -l);
glTexCoord2f(0.0f, 1.0f); glVertex3f( l, l, -l);
glTexCoord2f(0.0f, 0.0f); glVertex3f( l, -l, -l);
// Top Face
glNormal3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-l, l, -l);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-l, l, l);
glTexCoord2f(1.0f, 0.0f); glVertex3f( l, l, l);
glTexCoord2f(1.0f, 1.0f); glVertex3f( l, l, -l);
// Bottom Face
glNormal3f( 0.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-l, -l, -l);
glTexCoord2f(0.0f, 1.0f); glVertex3f( l, -l, -l);
glTexCoord2f(0.0f, 0.0f); glVertex3f( l, -l, l);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-l, -l, l);
// Right face
glNormal3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( l, -l, -l);
glTexCoord2f(1.0f, 1.0f); glVertex3f( l, l, -l);
glTexCoord2f(0.0f, 1.0f); glVertex3f( l, l, l);
glTexCoord2f(0.0f, 0.0f); glVertex3f( l, -l, l);

// Left Face
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-l, -l, -l);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-l, -l, l);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-l, l, l);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-l, l, -l);
}
glEnd();
}
glPopMatrix(1);
}

void RenderFond()
{
glPushMatrix();
{
glTranslatef(0.0f,-1.2f,-5.5f);

glBindTexture(GL_TEXTURE_2D, texture[0]); //no filters to swtich between

//glColor3f(0.8f, 0.1f, 0.1f);
v16 w=floattov16(5.0f);
v16 h=floattov16(5.0f);
glBegin(GL_QUADS);
{
glNormal3f(0.0f, 0.0f, 1.0f);

glTexCoord2f(2.0f, 0.0f); glVertex3v16(-w, -h, 0);
glTexCoord2f(2.0f, 2.0f); glVertex3v16( w, -h, 0);
glTexCoord2f(0.0f, 2.0f); glVertex3v16( w, h, 0);
glTexCoord2f(0.0f, 0.0f); glVertex3v16(-w, h, 0);
}
glEnd();
}
glPopMatrix(1);
}


Le code n'est pas encore optimisé pour la DS, mais c'est que je veux être sur que cane vienne pas d'une erreur dans mes conversion des unités (notamment pour les UVs)

Seul le fond (un quad) affiche sa texture (texture[0]). Et quand j'affiche la texture[0] sur le cube, ca fontrionne parfaitement.
Pareil si j'inverse l'ordre de chargement des textures.

L'ecran du haut affiche de la 2D seulement et celui du bas de la 3D.


Un second probleme que je rencontre, c'est qe parfois je reviens à de la 2D sur l'ecran du bas. Tout est ok, sauf que quand je reviens sur de la 3D, tout est blanc.

Il doit y avoir une manip à faire pour revenir à la 3D correctement (genre une initialisation à refaire, mais j'ai tout testé et je ne vois pas laquelle)