Frage

Ich versuche, einen NSopenglcontext zu erstellen, meine Rendering-Engine initialisieren, und erstellen Sie dann neue NSopenglcONTEXTS mit dem Aktienparameter aus dem ersten Kontext. Das funktioniert nicht, und bevor ich weitergeht, was genau zwischen einem Kontext geteilt wird? Die Dokumentation ist ein wenig Licht darüber:

Freigegebene Kontexte Teilen Sie alle Texturobjekte, Anzeigenlisten, Vertex-Programme, Fragment-Programme und Pufferobjekte, die zuvor erstellt wurden, und nach dem Sharing wird eingeleitet. Der Status der Objekte wird auch freigegeben, jedoch nicht anderer Kontextzustand, beispielsweise aktuelle Farb-, Textur-Koordinateneinstellungen, Matrix- und Beleuchtungseinstellungen, Rastererisierungsstatus und Texturumfeldeinstellungen.

Wenn ich meinen ersten nsopenglcontext erstelle, initialisiere ich meine Rendering-Engine, wodurch die folgenden Arten von Anrufen möglich ist:

    .
  • glgenterextures, glaptivetexture, glbindtexture
  • glenable
  • gluseprogramm, glanzattribrocation, gletguniformlocation
  • gluniform1i, gluniform3f
  • glbsinvertexarraysApple, glbindvertexarrayApple, glbindbindbuffer
  • gluterexattribpointer, glenableververtexattribarray

    Die meisten davon sind für drei Arten von Aufgaben - Erstellen von Vertex- und Shader-Programmen, Speichern von Referenz auf Attribut- und einheitliche Standorte in den Programmen, erstellen Scheitelpunktarrays und Bindung einiger Texturen.

    würden Sie erwarten, dass alle diese Elemente über Kontexte gemeinsam genutzt werden?

War es hilfreich?

Lösung

Funktionsaufrufe werden nicht über den Kontext geteilt. Nur Objekte. Und nur einige Objekte.

Im Allgemeinen sind die aufgeteilten Objekte, die offensichtlich verboten sind, in einem anderen Kontext erneut zu erstellen zu müssen. Entweder wegen der Speichern vieler Daten oder einer relativ langen Setupzeit.

Wenn Sie eine Liste wünschen, werden die folgenden Objekte gemeinsam genutzt:

    .
  • Anzeigelisten
  • Texturen
  • renderbuffer
  • Pufferobjekte
  • Shader und Programme

    bemerkenswerte Objekte, die nicht geteilt werden:

      .
    • Vertex-Array-Objekte (die Pufferobjekte, die in ihnen eingehen, werden gemeinsam genutzt, aber nicht das Objekt selbst)
    • bildbuffer-Objekte (wie bei VAOS, nur die Dinge, die in sie geteilt werden)

      Ein gemeinsam genutztes Objekt bedeutet, dass er den gesamten Zustand über die Kontexte aufrechterhält. Wenn Sie also den Status aus einem Kontext ändern, werden Sie es in der anderen sehen. Dies bedeutet jedoch auch, dass Sie Ihren Zugriff auf freigegebene GL-Objekte synchronisieren müssen, wenn Sie mehrere Threads verwenden. Ansonsten können Rennbedingungen und andere Schlechte auftreten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top