Bien le bonjour,
Je viens vers vous suite à un problème, plus ou moins présent, et plutôt gênant à vrai dire :
En effet dans le cadre d'un projet "d' apprentissage à la réalisation d'un moteur 3D et d'un moteur jeu associé" j'utilise SFML pour le contexte OpenGL et ce moteur que je réalise pour dessiner en 3D, ce moteur utilise la version 3.3 d'openGL, ainsi j'utilise les VAO / VBO. Voilà pour l'intro,
J'ai toujours pour habitude d'utiliser dans mes applications 2D un thread secondaire qui se charge généralement du chargement des données coté client, me laissant ainsi la possibilité d’interagir avec l'utilisateur durant ce temps de chargement (affichage d’icône de chargement, mini jeu ou n'importe quoi d'autre le principe est d'avoir accès à la fenêtre) ainsi je veux reproduire la même choses dans ce projet.
Par chargement de donnée/ressource je parle de chargement de texture, de remplissage de sprite, texte, compilation de shader, etc. Ainsi lors de l'appelle de ces méthodes, d'autres méthodes interne au moteur gérant la géométrie et l'utilisation de fonctions OpenGL sont appelés. Là je sais qu'il faut un contexte openGL pour utiliser ces fonctions.
Dans le cas d'SFML et des Threads je sais qu'au lancement d'un nouveau Thread il faut soit utiliser le contexte créé au départ en appelant 'context.setActive(true)' ou de créer un objet 'sf::Context context' dans ce même thread.
Mon problème ce trouve là : quand je fais ceci certaines fonctions OpenGL fonctionnes, d'autre ne produise pas d'erreur mais ne font tout bonnement rien (du moins en apparence par la suite), exemple :
Les fonctions touchant aux textures 'glBindTexture() / glTexParameteri() / glTexSubImage2D()' ainsi que ceux gérant la compilation des shaders 'glCreateShader() / glShaderSource() / glCompileShader()' semble fonctionner contrairement aux fonctions touchant aux VertexBufferObject / VertexArrayObject
Je reviens toujours sur le premiers contexte pour dessiner se qui à été chargé, et je suis toujours partie du principe comme dit dans le tuto sur l'instanciation de fenêtre OpenGL avec SFML que :
Une autre chose à savoir est que tous les contextes OpenGL créés par SFML partagent leurs ressources. Cela signifie que vous pouvez créer une texture ou un vertex buffer avec n'importe quel contexte actif, et l'utiliser avec n'importe quel autre. Cela signifie aussi que vous n'aurez pas besoin de recharger toutes vos ressources OpenGL si vous recréez votre fenêtre.
(Il est peut être important de préciser que je me sers d'SFML essentiellement de contexte, je n'utilise pas les classes d'SFML)
Je soupçonne dans mon cas qu'un VAO créé dans un contexte différent ne peut pas être utilisé dans un autre, je ne sais pas exactement se qu'il se produit cela dit, c'est pourquoi je demande votre avis et dans le meilleur des cas peut être une piste !
J'utilise une version de GitHub d'SFML provenant de la date du 25 mai 2014 - (SFML2.1 ?)
Merci beaucoup et bonne journée