Правильный способ удаления шейдера GLSL? - PullRequest
48 голосов
/ 02 февраля 2012

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

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

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

Ответы [ 4 ]

59 голосов
/ 02 февраля 2012

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

.
13 голосов
/ 02 февраля 2012

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

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

6 голосов
/ 02 февраля 2012

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

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

3 голосов
/ 27 ноября 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...