Mon code aborde la gestion des shaders GLSL dans le sens où il crée chaque shader et le programme associé et supprime chaque shader et programme. J'ai récemment lu http://www.opengl.org/wiki/GLSL_Object et là, il est dit que:
L'objet shader, en raison de son attachement à l'objet programme, continuera d'exister même si vous supprimez l'objet shader. Il ne sera supprimé par le système que lorsqu'il ne sera plus attaché à aucun objet de programme (et lorsque l'utilisateur aura demandé de le supprimer, bien sûr).
Est-ce que j'obtiens ceci correctement, si j'appelle glDeleteShader()
sur l'objet shader après la liaison au programme, je n'ai besoin que de suivre le programme? Est-il sûr de supposer que cela est toujours vrai?
Oui - en fait, il est très souhaitable de détacher et de supprimer vos objets shader dès que possible. De cette façon, le pilote peut libérer toute la mémoire qu'il utilise pour contenir une copie de la source du shader et du code objet non lié, ce qui peut être assez important. Les mesures que j'ai faites indiquent que le fait de NE PAS supprimer les objets du shader augmente l'utilisation de la mémoire incrémentielle par shader de 5 à 10 fois.
En général, le fonctionnement de la gestion des objets shader est simple. Les objets shader n'ont vraiment rien faire, il n'y a donc aucun intérêt à les suivre. Les objets shader doivent exister juste assez longtemps pour réussir à lier un objet programme. Après quoi, les shaders doivent être détachés du programme et supprimés.
Ce qui précède suppose que vous n'essayez pas d'utiliser l'objet shader pour établir un lien avec un autre programme, bien sûr. C'est certainement possible. Dans ce cas, vous devez supprimer vos objets shader après avoir lié tous vos programmes.
Oui. Vous pouvez alors supprimer le shader en toute sécurité. En fait, c'est le moyen préféré, car vous avez moins d'entretien. Vous n'avez pas besoin de savoir ce que vous voulez supprimer et vous ne pouvez pas oublier de le faire. Et cela fonctionnera toujours.
"Supprimer" le shader, comme avec tous les objets OpenGL, définit simplement un drapeau qui dit vous n'en avez plus besoin. OpenGL le gardera aussi longtemps qu'il en aura besoin lui-même et effectuera la suppression réelle à tout moment plus tard (très probablement, mais pas nécessairement, après la suppression du programme).
En bref: après glLinkProgram()
appel glDeleteShader()
pour chaque shader, cela les marque pour la suppression et lorsque le programme n'est plus nécessaire appelez glDeleteProgram()
- cet appel supprime non seulement le programme mais détache également tous les shaders qui lui sont attachés et les supprime (s'ils ne sont pas utilisés par un autre programme).
Donc, normalement, vous n'avez jamais besoin d'appeler glDetachShader()
. Lisez les documents pour glDeleteProgram()
.