Después de un exitoso programa glLink, ¿debo eliminar / desconectar mis sombreadores?

45

Después de tener un programa vinculado, y pensando en la programación defensiva, ¿debo eliminar y separar los sombreadores utilizados para vincular este programa?

En caso afirmativo, ¿eso va a liberar recursos? ¿O estos objetos de sombreado solo se liberarán después de una llamada a glDeleteProgram?

editar: Solo para aclarar lo que estoy haciendo es (que es consistente con la respuesta):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> dibujar usando este programa de sombreador -> y cuando ya no necesito este sombreador glDeleteProgram

grprado
fuente

Respuestas:

46

Sí, siempre debes hacer esto. No me enteré de esto hasta hace poco, pero un sombreador no se eliminará glDeleteShaderhasta que se desconecte. Se menciona en la página del manual paraglDetachShader

EDITAR : Casi me perdí el bit sobre eliminar los sombreadores también. Sí, debe hacer esto, ya que libera la memoria utilizada para almacenar la fuente del sombreador y el código de objeto desvinculado. Esto se explica con más detalle en esta pregunta de StackOverflow .

Robert Rouhani
fuente
+1 y también facilita la limpieza, ya que solo tiene un objeto para rastrear y eliminar.
Maximus Minimus
2

El orden es correcto, pero en realidad no es necesario desacoplar los sombreadores, porque llamar a glDeleteProgram lo hace por usted con todos los sombreadores adjuntos y luego se eliminan automáticamente (si se marcaron para su eliminación con la función glDeleteShader).

Referencia: http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml .

davidv
fuente
Los objetos de sombreado ocupan mucha memoria en comparación con cada programa. Es mejor eliminarlos una vez que haya terminado de compilar sus programas y tenga más memoria disponible para cosas más importantes.
Robert Rouhani el