Après un programme glLink réussi, dois-je supprimer / détacher mes shaders?

45

Après avoir créé un programme lié et réfléchi à la programmation défensive, devrais-je supprimer et détacher les shaders utilisés pour lier ce programme?

Si oui, est-ce que cela va libérer des ressources? Ou bien ces objets shader ne seront-ils libérés qu'après un appel à glDeleteProgram?

edit: Juste pour clarifier ce que je suis en train de faire (ce qui est cohérent avec la réponse):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> dessine avec ce programme de shader -> et quand je n'ai plus besoin de ce shader glDeleteProgram

grprado
la source

Réponses:

46

Oui, vous devriez toujours faire ça. Je ne l'ai appris à ce jour que récemment, mais un shader ne sera réellement supprimé glDeleteShaderque s'il est détaché. Il est mentionné sur la page de manuel deglDetachShader

EDIT : Vous avez presque manqué le moment de supprimer les shaders également. Oui, vous devez le faire car cela libère la mémoire utilisée pour stocker la source de shader et le code d'objet non lié. Ceci est expliqué plus en détail dans cette question StackOverflow .

Robert Rouhani
la source
+1 et cela facilite également le nettoyage car vous n'avez qu'un seul objet à suivre et à supprimer.
Maximus Minimus
2

L'ordre est correct, mais vous n'avez pas vraiment besoin d'attacher les shaders, car appeler glDeleteProgram le fait pour vous avec tous les shaders attachés, puis ils sont automatiquement supprimés (s'ils ont été marqués pour suppression avec glDeleteShader func).

Référence: http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml .

Davidv
la source
Les objets Shader utilisent beaucoup de mémoire par rapport à chaque programme. Il est préférable de les supprimer après avoir compilé vos programmes et d'avoir plus de mémoire disponible pour des tâches plus importantes.
Robert Rouhani