Moyen de supprimer le shader GLSL?

Mon code se rapproche de la gestion du shader GLSL, qu’il crée chaque shader et le programme associé et supprime chaque shader et chaque programme. J’ai récemment lu http://www.opengl.org/wiki/GLSL_Object et il est indiqué que:

L’object shader, en raison de son attachement à l’object programme, continuera d’exister même si vous supprimez l’object shader. Il ne sera supprimé que par le système lorsqu’il n’est plus attaché à aucun object de programme (et lorsque l’utilisateur a demandé de le supprimer, bien sûr).

Est-ce que je reçois cela correctement, si j’appelle glDeleteShader() sur l’object shader après avoir glDeleteShader() le 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 objects shader dès que possible. De cette manière, le pilote peut libérer toute la mémoire utilisée pour conserver une copie du code source du shader et du code object non lié, ce qui peut être assez important. Les mesures que j’ai effectuées indiquent que NE PAS supprimer les objects du shader augmente de 5 à 10 fois l’utilisation de la mémoire incrémentielle par shader

En général, la manière dont fonctionne la gestion des objects de shader est simple. Les objects Shader ne font rien, il est donc inutile de les suivre. Les objects Shader doivent exister juste assez longtemps pour pouvoir lier avec succès un object 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’object shader pour créer un lien avec un autre programme, bien sûr. C’est certainement possible. Dans ce cas, vous devez supprimer vos objects shader après avoir lié tous vos programmes.

Oui. Vous pouvez supprimer le shader en toute sécurité. En fait, c’est la méthode préférée, car vous avez moins de maintenance. Vous n’avez pas besoin de garder une trace de ce qu’il faut supprimer et vous ne pouvez pas oublier de le faire. Et ça fonctionnera toujours.

“Supprimer” le shader, comme avec tous les objects OpenGL, ne fait que définir un drapeau indiquant que vous n’en avez plus besoin. OpenGL le conservera aussi longtemps qu’il en aura besoin lui-même et effectuera la suppression réelle à tout moment (probablement, mais pas nécessairement, après la suppression du programme).

En bref: après que glLinkProgram() appelle glDeleteShader() pour chaque shader, cela les marque pour 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 y sont attachés et les supprime eux (s’ils ne sont utilisés par aucun autre programme).

Donc, normalement, vous ne devez jamais appeler glDetachShader() . Lisez les documents pour glDeleteProgram() .