StrikerFred
Messages postés98Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention 4 novembre 2010
-
11 sept. 2006 à 21:05
StrikerFred
Messages postés98Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention 4 novembre 2010
-
12 sept. 2006 à 19:06
salut a tous
j'avance a petits pas dans la création d'un jeu 3d.
je voulais faire un grand sol de plein de petits carré. Pour ca, (même technique que pour les jeux avec les tiles) je voulais utiliser deux boucles for imbriquées pour créer les vertex
ca donne :
VERTEX vertices[10000]; // un tableau de vertices
int i,j;
int nb = 0;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
vertices[nb].x = (je détaille pas... c'est des coordonnées basiques...)
vertices[nb].y = ........
vertices[nb].z = ........
vertices[nb].color = 0xffffff00;
nb++;
}
}
et la il me dit erreur de mémoire quand je lance le programme ! on ne peut donc que faire :
VERTEX vertices = {{x,y,z,color},{x,y.....}, .......};
??
StrikerFred
Messages postés98Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention 4 novembre 2010 12 sept. 2006 à 07:45
merci pour les réponses,
maintenant y'a plus l'erreur de mémoire mais on ne voit plus les vertices...
pourquoi ca fait ca? vous allez pas me dire que tous le monde initialise ces vertices comme ca:
VERTEX vertices[] = {.....................};
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 12 sept. 2006 à 09:28
coucou!
J'ai regardé vite fait ton code. Dans la fonction InitBuffer(), tu fais un memcpy avec un sizeof(vertices). Or, vertices est un pointeur, donc la taille sera toujours 4. Il faut faire:
memcpy(buf, vertices, NB_VERTICES*sizeof(VERTEX));
Et pour info, dans ta double boucle d'init (qui, en passant, est vide), au lieu de trainer un nb de vertex, je te conseille de faire ceci, plus lisible:
for (i=0; i<nbLignes; i++)
{
for (j=0; j<nbColonnes; j++)
{
vertices[i*nbColonnes+j].x=...;
}
}
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
StrikerFred
Messages postés98Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention 4 novembre 2010 12 sept. 2006 à 09:43
ok, merci pour ta réponse !
mais j'ai refait la méthode VERTEX vertices[100];
plutot que =new...
et ca marche sauf qu'il faut que je mette au minimum
VERTEX vertices[500];
avec moins, le programme quitte dès le démarrage, comment ca se fait? je n'ai pourtant besoin que de 100emplacements?
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 12 sept. 2006 à 10:35
A chaque parcours de boucle, tu appelles 6 fois la fonction add(), donc tu ajoutes 5 vertices. Or, tu le fais 10x10=100 fois donc il te faut, au minimum 500 vertices.
D'ailleurs, pourquoi 6? tu ajoutes 2x les mêmes 2 sommets: (j,i) et (j+2,i+2). Essaies de faire un truc comme ceci (à vérifier dans ton système de coordonnées pour les i et les j)
int nbLignes=10;
int nbColonnes=10;
VERTEX vertices[100];
int i=0;
int j=0;
for (i=0; i<nbLignes; i++)
{
for (j=0; j<nbColonnes; j++)
{
vertices[i*nbColonnes+j].x=j;
vertices[i*nbColonnes+j].y=0;
vertices[i*nbColonnes+j].z=i;
vertices[i*nbColonnes+j].color=0xffffff00;
}
}
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
StrikerFred
Messages postés98Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention 4 novembre 2010 12 sept. 2006 à 18:49
ben je croyais que les vertices allait par trois? d'ailleurs :
device->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*3, 1);
ne dessine-t-il pas les vertex par triangles? c'est pour ca que je croiyait qu'il fallait un multiple de trois pour nombre de vertice ! éclairez moi la dessus svp ^^
pour le tableau dans le tas ou non, ce n'étais pas un choix de ma part, c'est juste que je m'étonnais que ca marche aussi non sur le tas. Et puisque moins y'a des signes bizarres mieu je comprend (je sais c'est qu'un pointeur mais bon). Mais si tu dis que ca va planter quand y'aura plus de vertices, ok j'ai fait les modifs
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 12 sept. 2006 à 18:57
Avec des triangles en "strip" (sque tu fais), n'importe quel nombre de
vertex convient. Avec des triangles "classique" (cad 3 vertex /
triangles), il faut nécessairement une multiple de 3 sinon le dernier
triangle sera pas (ou mal) afficher.
Mais de toute facon, faut pas utiliser des vertex buffers classique,
mais des vertex buffers indexés (bcp plus rapide). Mais comme je
programme pas avec directx, jpeux rien de dire de plus.
StrikerFred
Messages postés98Date d'inscriptionmercredi 12 octobre 2005StatutMembreDernière intervention 4 novembre 2010 12 sept. 2006 à 19:06
ah, ca c'est ennuyeux, tu me lance sur une nouvelle piste mais sans indications...
sinon, j'en profite pour poser une question plus générale. Dans tous les tutoriaux qu'ont peux trouver, y'en a pas un qui disent plus ou moins la même chose. Si je comprend bien, dans l'initialisation de direct 3d, il faut :
1. créer "l'objet 3d" par Direct3DCreate9(D3D_SDK_VERSION)
2. récupérer le mode d'affichage avec objet3D->GetAdapterDisplayMode(...)
3. parametrer des "trucs" pour la création d'un device avec objet3D->CreateDevice(....) (j'ai pas encore bien défini ce que c'était dans mon ptit cerveau )
4. la, y'a les SetRenderState non? mais lesquels faut-il mettre?
device->SetRenderState(D3DRS_ZENABLE, TRUE) ??
device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ) ??
device->SetRenderState( D3DRS_LIGHTING, FALSE) ??
les trois??
et si je ne me trompe, c'est la fin de l'initialisation ?
si ca vous dérange que je fasse un récapitulatif comme ca, dites-le