Question

J'essaie de créer un nsopenglcontext, d'initialiser mon moteur de rendu, puis de créer de nouveaux nsopenglcontexts à l'aide du paramètre de partage à partir du premier contexte. Cela ne fonctionne pas, et avant de continuer, qu'est-ce qui est partagé exactement entre un contexte? La documentation est un peu lumineuse à ce sujet:

Les contextes partagés partagent tous les objets de texture, les listes d'affichage, les programmes de sommet, les programmes de fragments et les objets tampons créés avant et après le partage. L'état des objets est également partagé mais pas un autre état de contexte, tel que la couleur actuelle, les paramètres de coordonnées de texture, les paramètres de matrice et d'éclairage, l'état de rasterisation et les paramètres d'environnement de texture.

Lorsque je crée mon premier nsopenglcontext, j'initialise mon moteur de rendu, ce qui fait les types d'appels suivants:

  • glGentextures, glactiveTexture, glbindTexture
  • vulgable
  • GLUSEPROGRAM, GLGETATTRIBLOCE, GLGETUnifordLocation
  • Gluniford1i, Gluniford3f
  • glgenvertexarraysapple, glbindvertexarrayapple, glbindbuffer
  • glvertexattribpointer, glenablevertexattribarray

La plupart d'entre eux sont destinés à trois types de tâches - créant des programmes de vertex et de shader, stockant la référence aux emplacements d'attrib et uniformes dans les programmes, de création de tableaux de sommet et de liaison de quelques textures.

Vous attendriez-vous à ce que tous ces éléments soient partagés dans des contextes?

Était-ce utile?

La solution

Les appels de fonction ne sont pas partagés dans le contexte. Seuls les objets. Et seulement quelques objets.

En général, les objets partagés sont ceux qui seraient évidemment prohibitifs de devoir recréer dans un autre contexte. Soit en raison du stockage de nombreuses données, soit du temps d'installation relativement long.

Si vous voulez une liste, les objets suivants sont partagés:

  • Listes d'affichage
  • Textures
  • Render Buffers
  • Objets tampon
  • Shaders et programmes

Objets notables qui ne sont pas partagés:

  • Objets de vertex array (les objets tampons qui y vont sont partagés, mais pas l'objet lui-même)
  • Objets FrameBuffer (comme avec Vaos, seules les choses qui y vont sont partagées)

Un objet partagé signifie qu'il maintient tout l'état dans les contextes. Donc, si vous modifiez l'état à partir d'un contexte, vous le verrez dans l'autre. Cependant, cela signifie aussi que vous devez synchroniser Votre accès aux objets GL partagés si vous utilisez plusieurs threads. Sinon, les conditions de course et d'autres méchants peuvent survenir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top