Soll ich nach einem erfolgreichen glLinkProgram meine Shader löschen / entfernen?

45

Wenn ich ein verknüpftes Programm habe und über defensive Programmierung nachdenke, sollte ich die Shader löschen und entfernen, die zum Verknüpfen dieses Programms verwendet wurden?

Wenn ja, werden dadurch Ressourcen freigesetzt? Oder werden diese Shader-Objekte erst nach einem glDeleteProgram-Aufruf freigegeben?

edit: Nur zur Verdeutlichung was ich tue ist (was mit der Antwort übereinstimmt):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> mit diesem Shaderprogramm zeichnen -> und wenn ich diesen Shader nicht mehr benötige glDeleteProgram

grprado
quelle

Antworten:

46

Ja, das solltest du immer tun. Das habe ich erst kürzlich herausgefunden, aber ein Shader wird erst gelöscht, glDeleteShaderwenn er entfernt wurde. Es ist auf der Manpage für erwähntglDetachShader

BEARBEITEN : Fast habe ich das bisschen über das Löschen der Shader auch verpasst. Ja, Sie sollten dies tun, da dadurch der zum Speichern der Shader-Quelle und des nicht verknüpften Objektcodes verwendete Speicher freigegeben wird. Dies wird ausführlicher in erklärt diese Frage Stackoverflow .

Robert Rouhani
quelle
+1 und es erleichtert auch die Bereinigung, da Sie nur ein Objekt verfolgen und löschen müssen.
Maximus Minimus
2

Die Reihenfolge ist richtig, aber Sie müssen die Shader nicht wirklich anhängen, da der Aufruf von glDeleteProgram dies für Sie mit allen angehängten Shadern erledigt und sie dann automatisch gelöscht werden (wenn sie mit glDeleteShader func zum Löschen markiert wurden).

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

davidv
quelle
Shader-Objekte beanspruchen im Vergleich zu jedem Programm viel Speicher. Es ist besser, sie zu löschen, nachdem Sie Ihre Programme kompiliert haben und mehr Speicher für wichtigere Dinge zur Verfügung haben.
Robert Rouhani