Мой код подходит к управлению шейдерами GLSL таким образом, что он создает каждый шейдер и связанную с ним программу и удаляет каждый шейдер и программу. Недавно я прочитал http://www.opengl.org/wiki/GLSL_Object, и там говорится, что:
Объект шейдера, поскольку он привязан к объекту программы, будет продолжать существовать, даже если вы удалите объект шейдера. Он будет только будет удален системой только тогда, когда он больше не будет привязан ни к одному программному объекту объекту (и, конечно, когда пользователь попросит его удалить).
Правильно ли я понимаю, что если я вызову glDeleteShader()
на объекте шейдера после связывания с программой, то мне нужно будет только отследить программу? Можно ли считать, что это всегда так?
Да - на самом деле очень желательно отсоединить и удалить объекты шейдера как можно скорее. Таким образом, драйвер сможет освободить всю память, используемую для хранения копии исходного и несвязанного объектного кода шейдера, которая может быть весьма значительной. Проведенные мной измерения показывают, что НЕ удаление шейдерных объектов увеличивает инкрементное использование памяти на шейдер в 5-10 раз
В общем случае управление шейдерными объектами работает просто. Объекты шейдеров на самом деле ничего не делают, поэтому отслеживать их вообще не имеет смысла. Шейдерные объекты должны существовать ровно столько, чтобы успешно связать программный объект. По истечении этого времени шейдеры должны быть отсоединены от программы и удалены.
Вышесказанное предполагает, что вы не пытаетесь использовать объект шейдера для связи с другой программой, конечно. Это, конечно, возможно. В этом случае удалять шейдерные объекты следует после того, как все программы будут связаны.
Да. Тогда вы можете смело удалять шейдер. На самом деле, это более предпочтительный способ, так как он требует меньше обслуживания. Не нужно следить за тем, что нужно удалить, и нельзя забыть это сделать. И все равно все будет работать.
"Удаление" шейдера, как и всех объектов OpenGL, просто устанавливает флаг, говорящий о том, что он вам больше не нужен. OpenGL будет хранить его до тех пор, пока он нужен ему самому, а само удаление будет произведено в любое время позже (скорее всего, но не обязательно, после удаления программы).
Короче: после glLinkProgram()вызов
glDeleteShader()для каждого шейдера, это помечает их на удаление и когда программа уже не нужна называть glDeleteProgram()
- это вызов не только удаляет программы, но и разделяют все шейдеры прилагается к нему, и удаляет их (если не используется никакой другой программой).
Так что обычно вы не'т придется когда-нибудь называть glDetachShader(). Читать Docs для
glDeleteProgram()`.