2013-08-29 14 views
6

Qual è il modo corretto per farlo?OpenGL programma/shader non inizializzazione

sto facendo questi passaggi:

  1. Create Shader (s)
  2. Compile Shader (s)
  3. Crea Programma
  4. Fissare Shader (s) per programmare
  5. Il link
  6. Elimina Shader (s)

In http://www.opengl.org/wiki/GLSL_Object dice: Non è necessario separare esplicitamente gli oggetti shader, anche dopo aver collegato il programma. Tuttavia, è consigliabile farlo una volta completato il collegamento, altrimenti l'oggetto programma manterrà vivi gli oggetti shader associati quando si tenta di eliminarli.

E anche da Proper way to delete GLSL shader? dice che aumenterà la memoria se non elimini gli shader.

Quindi il controllo su http://www.opengl.org/sdk/docs/man/xhtml/glDetachShader.xml, si dice Se lo shader è già stato contrassegnato per l'eliminazione da una chiamata al glDeleteShader e non è collegato a qualsiasi altro oggetto programma, esso verrà cancellato dopo che è stato staccato.

Quindi il mio numero 6 è inutile a meno che non lo stacchi dopo giusto?

Devo staccare e cancellare dopo che il programma è stato compilato correttamente (per salvare la memoria) o dovrei staccare/eliminare solo quando la mia applicazione si sta chiudendo?

+0

sidenote: è necessario richiamare 'glLinkProgram' per le modifiche apportate all'attributo bind con' glBindAttribLocation' per avere effetto.Quindi, se elimini e scolleghi gli shader da un programma collegato, il binding dell'attributo non può essere modificato in modo efficace senza associare gli shader ad esso. – PeterT

risposta

5

Quindi il mio numero 6 è inutile a meno che non lo stacchi dopo giusto?

Sì. Quello che fa il GL è fondamentalmente il conteggio dei riferimenti. Finché qualche altro oggetto fa riferimento all'oggetto shader, rimarrà attivo. Se si elimina l'oggetto, la cancellazione effettiva verrà differita fino alla rimozione dell'ultimo riferimento.

Devo staccare e cancellare dopo il programma è stato compilato correttamente (per salvare la memoria) o dovrei staccare/cancellare solo quando la mia applicazione sta chiudendo giù?

Spetta a voi. È possibile possibile eliminarlo non appena non ne hai più bisogno. Se non si prevede di ricollegare lo shader, è possibile distruggere tutti gli oggetti shader collegati immediatamente dopo l'operazione di collegamento iniziale. Tuttavia, gli oggetti shader non consumano molta memoria dopo tutto (e non vanno alla memoria della GPU, solo i programmi finali lo saranno) in genere non è un grosso problema se li elimini in seguito, o addirittura non li elimini a tutto, poiché tutte le risorse GL verranno distrutte quando il contesto GL viene distrutto (incluso il caso in cui l'applicazione si chiude). Naturalmente, se crei shader dinamicamente in fase di esecuzione, dovresti anche eliminare in modo dinamico gli oggetti vecchi e non utilizzati per evitare di accumulare molti oggetti inutilizzati e di perdere in modo efficace nomi di memoria/oggetti e così via.

Problemi correlati