Мой код приближается к управлению шейдерами GLSL в том смысле, что он создает каждый шейдер и связанную с ним программу и удаляет каждый шейдер и программу. Я недавно прочитал http://www.opengl.org/wiki/GLSL_Object и там говорится, что:Правильный способ удаления шейдеров GLSL?
Объект шейдер, благодаря привязываясь к программному объекту, будет продолжать существовать, даже если вы удалите объект затенения. Будет удалено только системой, если она больше не привязана к какой-либо программе объект (и когда пользователь попросил его удалить, конечно).
Могу ли я получить это правильно, если я позвоню glDeleteShader()
на объекте шейдера после установления связи с программой, нужно только следить за программу? Можно ли предположить, что это всегда верно?
Даже если его, конечно, та же самая рекомендация уже дана, +1 для аргумента практической памяти и измерений. –
Несмотря на то, что вы говорите правильно в соответствии с [документацией] (http://www.opengl.org/sdk/docs/man/xhtml/glLinkProgram.xml) («После операции с ссылкой приложения могут изменять прикрепленные шейдеры объекты, компилировать прикрепленные шейдерные объекты, отделять объекты шейдеров, удалять объекты шейдеров и присоединять дополнительные шейдерные объекты.»), Я столкнулся с некоторыми недобросовестными драйверами, которым это не нравится, когда вы отсоединяете шейдеры, особенно на мобильных платформах. Поскольку проблема, связанная с этим, оставила меня расстроенным в течение нескольких дней, я бы рекомендовал вам НЕ отделять шейдеры после ссылка (удаление в порядке). –
Проблема в том, что просто удаление шейдера без отсоединения может не освободить память - это может просто уменьшить счетчик ссылок, который не будет идти до 0, пока вы не отсоедините шейдер. шейдер все еще подключен, пользователь может снова позвонить по ссылке, чтобы повторно подключиться к программе, поэтому драйверу нужно обходиться достаточно информации, чтобы сделать это. Поэтому вам нужно обменяться использованием памяти с потенциальными проблемами на сломанных драйверах ... –