Подтвердить что ты не робот

Правильный способ удаления шейдеров GLSL?

Мой код приближается к управлению шейдерами GLSL таким образом, что он создает каждый шейдер и связанную с ним программу и удаляет каждый шейдер и программу. Недавно я прочитал http://www.opengl.org/wiki/GLSL_Object и там сказано, что:

Объект шейдера, связанный с программным объектом, будет продолжают существовать, даже если вы удаляете объект шейдера. Это будет быть удаленной системой, когда она больше не привязана к какой-либо программе объект (и когда пользователь попросил его удалить, конечно).

Получаю ли я это правильно, если я вызываю glDeleteShader() в объект шейдера после ссылки на программу, мне нужно только отслеживать программу? Можно ли предположить, что это всегда верно?

4b9b3361

Ответ 1

Да - на самом деле очень желательно отсоединить и удалить ваши шейдерные объекты как можно скорее. Таким образом, драйвер может освободить всю память, которую он использует, для хранения копии источника шейдера и несвязанного объектного кода, что может быть весьма существенным. Измерения, которые я выполнил, указывают на то, что NOT удаление объектов шейдера увеличивает использование инкрементной памяти в каждом шейдере на 5-10x

Ответ 2

В общем, способ управления объектами шейдеров прост. Объекты Shader на самом деле ничего не делают, поэтому нет смысла отслеживать их вообще. Объекты Shader должны существовать достаточно долго, чтобы успешно связать программный объект. По истечении этого времени шейдеры должны быть отделены от программы и удалены.

Вышеприведенное предполагает, что вы не пытаетесь использовать объект шейдера для связи с другой программой, конечно. Это конечно возможно. В этом случае вы должны удалить свои шейдерные объекты после того, как вы связали все свои программы.

Ответ 3

Да. Тогда вы можете безопасно удалить шейдер. На самом деле это предпочтительный способ, потому что у вас меньше обслуживания. Вам не нужно отслеживать, что нужно удалить, и вы не можете забыть это сделать. И он все равно будет работать.

"Удаление" шейдера, как и для всех объектов OpenGL, просто устанавливает флаг, в котором говорится, что он вам больше не нужен. OpenGL будет поддерживать его до тех пор, пока он сам понадобится, и будет выполнять фактическое удаление в любое время позже (скорее всего, но не обязательно, после удаления программы).

Ответ 4

Короче: после glLinkProgram() вызывать glDeleteShader() для каждого шейдера, это маркирует их для удаления, а когда программа больше не нужна, вызов glDeleteProgram() - этот вызов не только удаляет программу, но также отделяет все шейдеры, прикрепленные к он и удаляет их (если не используется какой-либо другой программой).

Таким образом, вы обычно не должны называть glDetachShader(). Прочтите документы для glDeleteProgram().