Je développe un jeu 3D en utilisant SDL et OpenGL sur Ubuntu 9.04 en utilisant Eclipse CDT. J'ai une classe pour contenir les données de maillage dans des vecteurs pour chaque type. Tels que Vertex, Normal, UVcoord (coordonnées de texture), ainsi qu'un vecteur de visages. Chaque face a 3 vecteurs int qui contiennent des index pour les autres données. Jusqu'à présent, mon jeu fonctionne très bien au rendu à des prix avantageux. Mais là encore, j'avais seulement moins de cent vertex entre deux objets à des fins de test.L'élément vectoriel C++ est différent lorsqu'il est accédé à différents moments
La boucle accéder à ces données ressemble à ceci:
void RenderFace(oFace face)
{
/*
* More Stuff
*/
oVertice gvert;
oUVcoord tvert;
oNormal nvert;
for (unsigned int fvIndex = 0; fvIndex < face.GeoVerts.size(); fvIndex++)
{
gvert = obj.TheMesh.GetVertice(face.GeoVerts[fvIndex] - 1);
tvert = obj.TheMesh.GetUVcoord(face.UV_Verts[fvIndex] - 1);
nvert = obj.TheMesh.GetNormal(face.NrmVerts[fvIndex] - 1);
glNormal3f(nvert.X, nvert.Y, nvert.Z);
glTexCoord2f(tvert.U, tvert.V);
glVertex3f(scale * gvert.X, scale * gvert.Y, scale * gvert.Z);
}
/*
* More Stuff
*/
}
Il y a une boucle qui appelle la fonction renderFace()
qui comprend la boucle for
ci-dessus. Le moins est parce que les fichiers .obj Wavefront sont 1 indexés (au lieu de l'index C++ 0). Quoi qu'il en soit, j'ai découvert qu'une fois que vous avez environ 30 000 visages, tous ces appels à glVertex3f()
et autres ralentissent le jeu à environ 10 FPS. Que je ne peux pas permettre. J'ai donc appris à propos des tableaux de vertex, qui nécessitent des pointeurs sur les tableaux. En suivant l'exemple d'un tutoriel NeHe, j'ai continué à utiliser ma classe oVertice
et les autres. Qui ont juste floats
x, y, z, ou u, v. Donc, j'ai ajouté la même fonction ci-dessus à ma fonction OnLoad()
pour construire les tableaux qui sont juste "oVertice*
" et similaires.
Voici le code:
bool oEntity::OnLoad(std::string FileName)
{
if (!obj.OnLoad(FileName))
{
return false;
}
unsigned int flsize = obj.TheMesh.GetFaceListSize();
obj.TheMesh.VertListPointer = new oVertice[flsize];
obj.TheMesh.UVlistPointer = new oUVcoord[flsize];
obj.TheMesh.NormListPointer = new oNormal[flsize];
oFace face = obj.TheMesh.GetFace(0);
oVertice gvert;
oUVcoord tvert;
oNormal nvert;
unsigned int counter = 0;
unsigned int temp = 0;
for (unsigned int flIndex = 0; flIndex < obj.TheMesh.GetFaceListSize(); flIndex++)
{
face = obj.TheMesh.GetFace(flIndex);
for (unsigned int fvIndex = 0; fvIndex < face.GeoVerts.size(); fvIndex++)
{
temp = face.GeoVerts[fvIndex];
gvert = obj.TheMesh.GetVertice(face.GeoVerts[fvIndex] - 1);
temp = face.UV_Verts[fvIndex];
tvert = obj.TheMesh.GetUVcoord(face.UV_Verts[fvIndex] - 1);
temp = face.NrmVerts[fvIndex];
nvert = obj.TheMesh.GetNormal(face.NrmVerts[fvIndex] - 1);
obj.TheMesh.VertListPointer[counter].X = gvert.X;
obj.TheMesh.VertListPointer[counter].Y = gvert.Y;
obj.TheMesh.VertListPointer[counter].Z = gvert.Z;
obj.TheMesh.UVlistPointer[counter].U = tvert.U;
obj.TheMesh.UVlistPointer[counter].V = tvert.V;
obj.TheMesh.NormListPointer[counter].X = nvert.X;
obj.TheMesh.NormListPointer[counter].Y = nvert.Y;
obj.TheMesh.NormListPointer[counter].Z = nvert.Z;
counter++;
}
}
return true;
}
La variable unsigned int temp
est à des fins de débogage. Apparemment, je n'ai pas de constructeur par défaut pour oFace qui n'a pas quelque chose à initialiser. Quoi qu'il en soit, comme vous pouvez le voir, c'est à peu près la même routine exacte. Seulement, au lieu d'appeler une fonction gl, j'ajoute les données à trois tableaux.
Voici le kicker:
Je chargement d'un cube typique en triangles.
Quand j'accéder à l'élément 16 (0 indexées) du vecteur UV_Verts
de la fonction RenderFace()
je reçois 12.
Mais quand j'accéder à l'élément 16 (0 indexées) du même UV_Verts
vecteur de la fonction OnLoad()
je reçois quelque chose comme 3045472189
Je suis tellement confus.
Est-ce que quelqu'un sait ce qui cause cela? Et si oui comment le résoudre?
J'ai des difficultés à comprendre votre question. Pouvez-vous réduire le code à l'expression minimale qui déclenche l'erreur? Je ne pense pas que ce soit le problème, mais vous utilisez la variable temp pour extraire des éléments non initialisés du tableau. –