После успешного glLinkProgram я должен удалить / отсоединить мои шейдеры?

45

После того, как у меня есть связанная программа, и я думаю о защитном программировании, я должен удалить и отсоединить шейдеры, используемые для связи этой программы?

Если да, это собирается освободить какие-либо ресурсы? Или эти шейдерные объекты будут освобождены только после вызова glDeleteProgram?

редактировать: просто для пояснения, что я делаю (что согласуется с ответом):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> рисовать с помощью этой программы шейдера -> и когда мне больше не нужен этот шейдер glDeleteProgram

grprado
источник

Ответы:

46

Да, ты всегда должен делать это. Я не узнал об этом до недавнего времени, но шейдер на самом деле не будет удален, glDeleteShaderпока он не будет отсоединен. Это упомянуто на странице руководства дляglDetachShader

РЕДАКТИРОВАТЬ : Почти пропустил немного о удалении шейдеров тоже. Да, вы должны сделать это, так как это освобождает память, используемую для хранения исходного кода шейдера и несвязанного объектного кода. Это объясняется более подробно в этом вопросе StackOverflow .

Роберт Роухани
источник
+1, и это также облегчает очистку, так как у вас есть только один объект для отслеживания и glDelete.
Максимус Минимус
2

Порядок правильный, но вам не нужно отсоединять шейдеры, потому что вызов glDeleteProgram делает это для вас со всеми подключенными шейдерами, а затем они автоматически удаляются (если они были помечены для удаления с помощью функции glDeleteShader).

Ссылка: http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml .

davidv
источник
Шейдерные объекты занимают много памяти по сравнению с каждой программой. Лучше удалить их после того, как вы закончите компиляцию своих программ и у вас будет больше памяти для более важных вещей.
Роберт Роухани