Czy po udanym glLinkProgramie powinienem usunąć / odłączyć moje shadery?

45

Czy po połączeniu programu i zastanowieniu się nad programowaniem defensywnym powinienem usunąć i odłączyć shadery używane do łączenia tego programu?

Jeśli tak, czy to zwolni jakieś zasoby? Czy te obiekty modułu cieniującego zostaną uwolnione dopiero po wywołaniu glDeleteProgram?

edycja: Tylko dla wyjaśnienia, co robię (co jest zgodne z odpowiedzią):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> rysuj za pomocą tego programu do cieniowania -> a kiedy już go nie potrzebuję glDeleteProgram

grprado
źródło

Odpowiedzi:

46

Tak, zawsze powinieneś to zrobić. Nie dowiedziałem się o tym do niedawna, ale moduł cieniujący nie zostanie faktycznie usunięty, glDeleteShaderdopóki nie zostanie odłączony. Jest wspomniany na stronie podręcznika dlaglDetachShader

EDYCJA : Prawie brakowało mi też odrobiny usuwania shaderów. Tak, powinieneś to zrobić, ponieważ zwalnia pamięć używaną do przechowywania źródła modułu cieniującego i niepowiązanego kodu obiektowego. Jest to wyjaśnione bardziej szczegółowo w tym pytaniu StackOverflow .

Robert Rouhani
źródło
+1, a także ułatwia czyszczenie, ponieważ masz tylko jeden obiekt do śledzenia i glDelete.
Maximus Minimus
2

Kolejność jest prawidłowa, ale tak naprawdę nie trzeba odłączać modułów cieniujących, ponieważ wywołanie glDeleteProgram robi to dla ciebie ze wszystkimi dołączonymi modułami cieniującymi, a następnie są one automatycznie usuwane (jeśli zostały oznaczone do usunięcia za pomocą funkcji glDeleteShader).

Odniesienie: http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml .

davidv
źródło
Obiekty modułu cieniującego zajmują dużo pamięci w porównaniu do każdego programu. Lepiej je usunąć po zakończeniu kompilacji programów i dostępności większej ilości pamięci na ważniejsze rzeczy.
Robert Rouhani,