[DEV-C++] -> OPENGL : VBO'S (KEYFRAME)

acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 - 4 janv. 2008 à 02:36
cs_alpha Messages postés 19 Date d'inscription samedi 17 novembre 2001 Statut Membre Dernière intervention 13 juillet 2012 - 4 janv. 2008 à 14:54
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45297-dev-c-opengl-vbo-s-keyframe

cs_alpha Messages postés 19 Date d'inscription samedi 17 novembre 2001 Statut Membre Dernière intervention 13 juillet 2012
4 janv. 2008 à 14:54
Merci pour toute ces information ça va m'aider et je vais aller me documenter sur les vbo's et je reviendrais mettre à jour cette source ;-)
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 janv. 2008 à 14:28
J'ai fais une petite erreur: "glGenBuffersARB(1, &frames[0].vboVertices);" bien sur et non:
"glGenBuffersARB(1, frames[0].vboVertices);"

De meme après, c'est des pointeurs que prend la fonction glDeleteBuffers:
if (frames[i].vboVertices != 0)
glDeleteBuffersARB(1, &frames[i].vboVertices);
if (frames[i].vboNormales != 0)
glDeleteBuffersARB(1, &frames[i].vboNormales);
if (frames[i].vboTexCoords != 0)
glDeleteBuffersARB(1, &frames[i].vboTexCoords);
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 janv. 2008 à 14:26
Oulala, j'avais pas vu en effet.
Tu fais ca: "glGenBuffersARB(1, &frames->vboVertices);"
Tu devrais faire ca: "glGenBuffersARB(1, frames[0].vboVertices);" (bien que ce soit rigoureusement équivalement)

Mais il faut initialiser tous les membres de la structure quand tu la créés et pas laisser des champs indéterminés. Si tu utilises pas frames[1].vboVertices, mets lui la valeur 0:
frames[1].vboVertices = 0;
frames[1].vboNormales = 0;
frames[1].vboTexCoords = 0;

Et lors de la destruction, tu ne détruits que les vbos qui ont été créé.
if (frames[i].vboVertices != 0)
glDeleteBuffersARB(1, frames[i].vboVertices);
if (frames[i].vboNormales != 0)
glDeleteBuffersARB(1, frames[i].vboNormales);
if (frames[i].vboTexCoords != 0)
glDeleteBuffersARB(1, frames[i].vboTexCoords);

Peut etre que la fonction glDeleteBuffers ne fait rien si l'id du buffer vaut 0 mais on sait jamais. On voit ici l'intéret d'initialiser les ids de tes vbos a 0 si tu les utilises pas.

Pour les vbos en général, tu peux utiliser soit glLock/UnlockBuffer ou glBufferData. En première approche, c'est pareil. (glBufferData parfois un poil plus rapide).

"glLockArraysEXT, glUnlockArraysEXT"
=> Il me semble que ces fonctions ne concernent que les vertex arrays, donc pas les vbos.

"je trouve trop de solution differente je suis un peu perdu"
=> Oui c'est le bordel. Et on peut donc te reprocher de poster une source sur les vbos sans les maitriser totalement puisque ca peut induire en erreur des personnes qui regarderaient ton code.
cs_alpha Messages postés 19 Date d'inscription samedi 17 novembre 2001 Statut Membre Dernière intervention 13 juillet 2012
4 janv. 2008 à 13:11
glLockArraysEXT, glUnlockArraysEXT : j'ai trouvé des exemples utilisant ces fonctions
alors la je suis perdu à sa sert de les rajouté à ma source?! Je trouve par la meilleur méthode pour utilisé les vbo je trouve trop de solution differente je suis un peu perdu si quelqu'un pourrai m'aider sa serai gentil, merci ;-)
cs_alpha Messages postés 19 Date d'inscription samedi 17 novembre 2001 Statut Membre Dernière intervention 13 juillet 2012
4 janv. 2008 à 12:26
Effectivement avec:

if (frames)
{
for (int i = 0; i < numFrames; i++)
{
if (frames[i].pVertices)
{
glDeleteBuffersARB(1, &frames[i].vboVertices);
delete [] frames[i].pVertices;
frames[i].pVertices = NULL;
}
if (frames[i].pNormales)
{
glDeleteBuffersARB(1, &frames[i].vboNormales);
delete [] frames[i].pNormales;
frames[i].pNormales = NULL;
}
if (frames[i].pTexCoords)
{
glDeleteBuffersARB(1, &frames[i].vboTexCoords);
delete [] frames[i].pTexCoords;
frames[i].pTexCoords = NULL;
}
}
delete [] frames;
frames = NULL;
}

J'ai plus de probléme merci... Mais vu que je débute en vbo je comprend pas pourquoi je fais un glDeleteBuffersARB(1, &frames[i]....); pour chaque frame vu qu'à l'initialisation j'ai créé que pour la frames[0] ?!

Sinon oui ma source montre juste des vbos standard comme tu dis avec une frame, mais je voulais savoir si ya des méthode plus éfficacé (pour plus de rapidité ou qualité) voila
merci encor ;-)
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 janv. 2008 à 11:07
Bon alors, tu peux nous expliquer ce qu'il fait de spécial ton code. Je vois juste des vbos on ne peut plus standard non ?

Sinon pour ton problème:
# delete [] frames;
# frames = NULL;
# }
# //==========================================
# // !!! Probléme:
# glDeleteBuffersARB(1, &frames->vboVertices);
# glDeleteBuffersARB(1, &frames->vboNormales);
# glDeleteBuffersARB(1, &frames->vboTexCoords);

Tu détruits tes vbos après avoir "delete" frames. De plus frames est un tableau, donc, tu devrais plutot avoir:
if (frames)
{
for (int i = 0; i < numFrames; i++)
{
....
glDeleteBuffersARB(1, frames[i].vboVertices);
glDeleteBuffersARB(1, frames[i].vboNormales);
glDeleteBuffersARB(1, frames[i].vboTexCoords);
}
delete [] frames;
frames = NULL;
}
cs_alpha Messages postés 19 Date d'inscription samedi 17 novembre 2001 Statut Membre Dernière intervention 13 juillet 2012
4 janv. 2008 à 02:46
Ha ba je voulais mettre wglext (je crois que c'est ça que tu voulais dire?!) mais je pensais qu'il aurait été plus dur a trouver ;-)
Merci quand meme du conseil.
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
4 janv. 2008 à 02:36
salut

moi j'utilise glew pour charger les extensions,
et je dois dire que pour trouver la bonne version de glext.h pour ton projet (je n'ai pas trouvé de wglext.h qui soit assez récent) j'ai mis 5 min sur google
alors que glew le premier lien sur google et c'est dans la poche
Rejoignez-nous