2 pièce(s) jointe(s)
Problème de rendu d'un Model 3DS avec V.B.O
Bonjour,
Je reviens encore vers vous car après avoir régler mes problèmes de V.B.O après la suite du tuto "moteur 3d c++" Yes::Engine, je rencontre un problème lorsque je souhaite afficher un Model 3D.
Dans les sources du Tuto il y à déja un Loader MD2. J'ai donc voulu utiliser un autre Loader (3DS) pour essayer de bien assimiler les classes CBuffer etc...
Comme on peut le voir si dessous j'ai deux résultat selon le changement d'une variable (préciser en dessous des images) :
Pièce jointe 190751Pièce jointe 190752
Lorsque je parcours tous les indices des face et que je l'est stock dans le buffer d'indices normalement cela m'affiche que la moitier du personnage alors que si j'utilise le même procéder que le loader MD2 cela m'affiche le personnage mes avec des troues :(
voici le code de la boucle :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
std::vector<C_Model::TVertex> Vertices;
std::vector<C_Model::TIndex> Indices;
// Parcour tous les objets qui compose le model
for (int i = 0; i < pModel.numOfObjects; i++){
if (pModel.pObject.size() <= 0) break;
// récupère l'objet courant
t3DObject *pObject = &pModel.pObject[i];
// Parcours tous les vertices qui compose l'objet
for (int v = 0; v < pObject->numOfVerts; v++){
// Récupération des informations sur le sommet courant
C_Model::TVertex newVertex;
newVertex.Position = pObject->pVerts[v];
newVertex.Normal = *pObject->pNormals[v];
newVertex.Color = Renderer.ConvertColor(C_Color::White);
// ajoute le vertex au tableau de vertices
Vertices.push_back(newVertex);
}
// Parcour toutes les faces qui compose l'objet
for (int j = 0; j < pObject->numOfFaces; j++){
// parcour les vertices qui compose la face
for (int k = 0; k < 3; k++)
{
// récupère l'index du vertex
int index = pObject->pFaces[j].vertIndex[k];
// ajoute l'index au tableau d'indices
// Indices.push_back(j * 3 + 2 - k); <----- si l'on met cette ligne = perso à moitier
Indices.push_back(index); // <----- si l'on met cette ligne = perso avec des troues
}
}
} |
et voici les valeur exécuter par le V.B.O :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
//////////////////////////////
// Buffer de vertices
///////////////////////////////
glGenBuffers(1, &VertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
glBufferData(GL_ARRAY_BUFFER, 12902 * 28, NULL, GL_STATIC_DRAW);
//////////////////////////////
// Buffer d'indices
///////////////////////////////
glGenBuffers(1, &IndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 57174 * 28, NULL, GL_STATIC_DRAW);
// vertices
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 28, BUFFER_OFFSET(0 + 0 * 28));
// normal
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 28, BUFFER_OFFSET(12 + 0 * 28));
// couleurs
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 28, BUFFER_OFFSET(24 + 0 * 28));
// Indices
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer->GetBuffer());
// Rendu
// le 5113 viens de GL_UNSIGNED_SHORT
// unsigned long IndicesType = (m_IndexStride == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT);
DrawElements(GL_TRIANGLES, 19058 * 3, 5113, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0); |
En total il y a :
Indices = 57174
Vertices = 12902
Si quelqu'un aurait une piste d'ou peut venir le problème ou autre.
J'espère que sa sera pas une erreur encore bête de ma part :(
Merci d'avance