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

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 .


+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 .


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.