49 votes

Méthode appropriée pour supprimer le shader GLSL?

Mon code approches GLSL shader de gestion dans le chemin, qu'il crée chaque shader et le programme associé et supprime chaque shader et le programme. J'ai lu récemment http://www.opengl.org/wiki/GLSL_Object et là, il est précisé que:

L'objet shader, en raison d'être attaché à l'objet du programme, sera continuer à exister même si vous supprimez l'objet shader. Il ne être supprimés par le système lorsqu'il n'est plus attaché à n'importe quel programme objet (et lorsque l'utilisateur a demandé de le supprimer, bien sûr).

Puis-je l'obtenir correctement, si je l'appelle, glDeleteShader() sur l'objet shader après la liaison pour le programme, j'ai seulement besoin de suivre le programme? Il est sûr de supposer que c'est toujours vrai?

59voto

Chris Dodd Points 39013

Oui. En fait, il est hautement souhaitable de détacher et de supprimer vos objets de shader le plus rapidement possible. Ainsi, le pilote peut libérer toute la mémoire qu'il utilise pour conserver une copie de la source de shader et du code d'objet non lié, ce qui peut être considérable. Les mesures que j'ai effectuées indiquent que la suppression des objets de shader n'augmente pas l'utilisation de la mémoire incrémentielle par shader de 5 à 10 fois.

13voto

Nicol Bolas Points 133791

En général, la façon dont l'objet shader de gestion fonctionne est simple. Shader objets ne sont pas vraiment faire quoi que ce soit, donc il n'y a pas de point dans le suivi à tous. Shader objets doivent exister pour juste assez longtemps pour réussir à lier un objet de programme. Après quoi, les shaders doit être détaché de la programme et supprimés.

Le ci-dessus suppose que vous n'êtes pas en train d'utiliser l'objet shader lien avec un programme différent, bien sûr. C'est certainement possible. Dans ce cas, vous devez le supprimer de votre shader objets après avoir lié l'ensemble de vos programmes.

6voto

Damon Points 26437

Oui. Vous pouvez supprimer en toute sécurité le shader puis. En fait, c'est la meilleure façon, parce que vous avez moins d'entretien. 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, il faudra encore travailler.

"La suppression de" le shader, comme avec tous les objets OpenGL, simplement définit un indicateur qui dit que vous n'avez pas besoin de plus. OpenGL va le garder aussi longtemps qu'il en a besoin lui-même, et effectivement le supprimer à tout moment plus tard (le plus probable, mais pas nécessairement, une fois que le programme est supprimé).

3voto

user1656730 Points 56

En bref: après que glLinkProgram () a appelé 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 également tous les shaders qui lui sont attachés et le supprime. eux (s'ils ne sont utilisés par aucun autre programme).

Donc normalement vous n’avez pas à appeler glDetachShader (). Lisez la documentation de glDeleteProgram ().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X