2015-04-09 1 views
1

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

+1

_ "mais je ne comprends vraiment pas ce que je devrais faire." _ Qu'est-ce que tu n'as pas compris en particulier? –

+0

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. –

+0

_ "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)?). –

Répondre

1

changement vertices et mesh à être (à puce) pointers et construisez les objets dans main() après avoir sécurisé un contexte GL.

Si vous ne voulez pas changer votre code existant (.--> pour l'accès aux membres), vous pouvez les appeler verticesPtr et meshPtr et créer des références locales (Mesh& mesh = *meshPtr;) en haut des fonctions où vous les faites référence.

+0

Alors j'ai essayé de comprendre cela par moi-même sans chance. Je suis vraiment nouveau en C++ donc je ne comprends pas les pointeurs et comment travailler avec eux. Ce que vous dites est que je devrais changer la déclaration de 'mesh' et' vertices' pour être des pointeurs: 'Vertex * verticesPtr [];' et 'Mesh * meshPtr;' Mais alors comment puis-je les construire dans mon ' principal() '? –