Domanda

Sto cercando di creare un nsopenglcontext, inizializzare il mio motore di rendering, quindi creare nuovi nsopenglcontexts usando il parametro di condivisione dal primo contesto. Questo non funziona, e prima di andare avanti, cosa è esattamente condiviso tra un contesto? La documentazione è un po 'di luce su questo:

.

Contesti condivisi Condividi tutti gli oggetti Texture, gli elenchi di visualizzazione, i programmi vertici, i programmi di frammento e gli oggetti buffer creati prima e dopo la condivisione vengono avviati. Lo stato degli oggetti è anche condiviso ma non altro stato di contesto, come il colore corrente, le impostazioni di coordinate di texture, le impostazioni della matrice e dell'illuminazione, lo stato di rasterizzazione e le impostazioni dell'ambiente di texture.

Quando creo il mio primo NsopenglContext, inizializza il mio motore di rendering, il che rende i seguenti tipi di chiamate:

    .
  • GlgentXtures, GlactiveTexture, GLBINDTexture
  • Glenable
  • Glosseprogram, glottriblocation, glageuniformlocation
  • gluniform1i, gluniform3f
  • glgenvertexarraysApple, GLBindvertExarrayApple, GLBINDBUFFUFFUFFER
  • glvexattribpointer, glenablevertexattribarray

    La maggior parte di quelle sono per tre tipi di attività - Creazione di programmi di vertice e shader, memorizzazione di riferimento a posizioni attribuite e uniformi all'interno dei programmi, creando array vertice e legando alcune trame.

    Ti aspetteresti che tutti questi articoli siano condivisi tra i contesti?

È stato utile?

Soluzione

Le chiamate di funzione non sono condivise nel contesto. Solo oggetti. E solo alcuni oggetti .

In generale, gli oggetti che sono condivisi sono quelli che sarebbero ovviamente proibitivi devono essere re-creati in un altro contesto. O a causa di memorizzare molti dati o tempo di configurazione relativamente lungo.

Se si desidera un elenco, i seguenti oggetti sono condivisi:

    .
  • elenchi di visualizzazione
  • Textures
  • Rendering
  • Oggetti tampone
  • Shader e programmi

    Oggetti notevoli che non sono condivisi:

      .
    • Oggetti array vertice (gli oggetti del buffer che entrano sono condivisi, ma non l'oggetto stesso)
    • oggetti framebuffer (come con Vaos, solo le cose che entrano sono condivise)

      Un oggetto che viene condiviso significa che mantiene tutto lo stato attraverso i contesti. Quindi, se modifichi lo stato da un contesto, lo vedrai nell'altro. Tuttavia, questo significa anche che devi sincronizzare l'accesso agli oggetti GL condivisi se si utilizzano più fili. Altrimenti possono verificarsi condizioni di razza e altre cattive.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top