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


45

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

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

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

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

Ответы:


46

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

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


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

2

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

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


Шейдерные объекты занимают много памяти по сравнению с каждой программой. Лучше удалить их после того, как вы закончите компиляцию своих программ и у вас будет больше памяти для более важных вещей.
Роберт Роухани
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.