J'ai un problème avec la création d'objet avant l'initialisation du contexte. Mon code ressemble à ceci:Utilisation de fonctions OpenGL dans un constructeur d'objet sans contexte chargé
..
Vertex vertices[] = { ... } // declaration of object Vertices
Mesh mesh(vertices, sizeof(vertices)/sizeof(vertices[0]));
..
..
void onDisplay()
{
..
mesh.Draw();
..
}
void init() { .. }
int main(int argc, char** argv)
{
..
glutDisplayFunc(onDisplay);
..
}
Comme je l'ai lu sur OpenGL site, le problème est qu'un objet est créé avant le contexte est initialisé (à cause du code dans le constructeur). Si je mettrais le "mesh" et "vertices" dans "void init()", cela résoudrait le problème, mais je ne pourrais pas utiliser la méthode "mesh.Draw()" dans "void onDisplay" - parce que le mesh de l'objet n'est pas global, il est déclaré uniquement dans init().
Sur le site OpenGL, ils disent comment résoudre ce problème, mais je ne comprends vraiment pas ce que je devrais faire.
Les solutions à partir du site OpenGL sont les suivants:
- Ne pas utiliser constructeurs/destructeurs pour initialiser/détruire des objets OpenGL. Au lieu de cela, utilisez les fonctions membres de ces classes à ces fins. Cela viole les principes RAII, donc ce n'est pas la meilleure ligne de conduite.
- Demandez à vos constructeurs d'objets OpenGL de lancer une exception si un contexte n'a pas encore été créé. Cela nécessite un ajout à votre fonctionnalité de création de contexte qui indique à votre code quand un contexte a été créé et est actif.
- Créez une classe qui possède tous les autres objets associés à OpenGL. Cette classe devrait également être responsable de la création du contexte dans son constructeur.
Solution 1 n'est pas recommandé, la solution 2 ne me aider (au moins je ne crois pas) et je ne sais pas comment je ferais solution 3
_ "mais je ne comprends vraiment pas ce que je devrais faire." _ Qu'est-ce que tu n'as pas compris en particulier? –
Je n'ai pas compris la solution 3. Je pense que la solution 2 ne m'aiderait pas et la solution 1 n'est pas recommandée comme ils l'ont dit. –
_ "Je n'ai pas compris la solution 3." _ Quelles sont ces solutions? [S'il vous plaît modifier votre question] (http://stackoverflow.com/posts/29545120/edit) et montrer les solutions proposées, et ce qui en particulier vous manque. Les liens pointant vers des ressources hors site ne seront probablement pas suivis par les lecteurs de votre question (comme moi). Aussi, si vous faites un lien, faites-le précisément (Vouliez-vous dire ce [chapitre] (https://www.opengl.org/wiki/Common_Mistakes#OOP_and_hidden_binding)?). –