Після успішної програми glLinkProgram слід видалити / від'єднати шейдери?


45

Після того, як у мене є пов’язана програма, і я подумаю про захисне програмування, чи слід видалити та від'єднати шейдери, що використовуються для зв’язку цієї програми?

Якщо так, то чи буде визволяти будь-які ресурси? Або ці шейдерні об'єкти будуть звільнені лише після виклику glDeleteProgram?

редагувати: Просто для уточнення того, що я роблю, це (що відповідає відповіді):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> малюй за допомогою цієї програми шейдера -> і коли мені більше не потрібен цей шейдер glDeleteProgram

Відповіді:


46

Так, завжди слід це робити. Я про це не дізнався зовсім недавно, але шейдер насправді не буде видалений, glDeleteShaderдоки він не буде відокремлений. Це згадується на сторінці людини дляglDetachShader

EDIT : Майже пропущено трохи про видалення шейдерів. Так, ви повинні це зробити, оскільки це звільняє пам'ять, що використовується для зберігання джерела шейдера та не пов'язаного коду об'єкта. Це пояснюється більш детально у цьому питанні 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.