Após um glLinkProgram bem-sucedido, devo excluir / desanexar meus shaders?

45

Depois de ter um programa vinculado e pensando em programação defensiva, devo excluir e desanexar os shaders usados ​​para vincular esse programa?

Se sim, isso vai liberar algum recurso? Ou esses objetos de sombreador só serão liberados após uma chamada glDeleteProgram?

edit: Apenas para esclarecer o que estou fazendo é (o que é consistente com a resposta):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> desenhe usando este programa de sombreador -> e quando eu não precisar mais desse sombreador glDeleteProgram

grprado
fonte

Respostas:

46

Sim, você sempre deve fazer isso. Eu não descobri isso até recentemente, mas um sombreador não será excluído glDeleteShaderaté que seja desanexado. É mencionado na página de manual paraglDetachShader

EDIT : Quase perdi a parte sobre a exclusão dos shaders também. Sim, você deve fazer isso, pois libera a memória usada para armazenar a fonte do sombreador e o código do objeto desvinculado. Isso é explicado em mais detalhes nesta pergunta do StackOverflow .

Robert Rouhani
fonte
+1 e também facilita a limpeza, pois você tem apenas um objeto para rastrear e glDelete.
Maximus Minimus
2

A ordem está correta, mas você realmente não precisa anexar os sombreadores, porque chamar glDeleteProgram faz isso para você com todos os sombreadores conectados e eles são excluídos automaticamente (se eles foram sinalizados para exclusão com a função glDeleteShader).

Referência: http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml .

davidv
fonte
Os objetos Shader ocupam muita memória em comparação com cada programa. É melhor excluí-los depois que você terminar de compilar seus programas e tiver mais memória disponível para coisas mais importantes.
Robert Rouhani