Setelah glLinkProgram berhasil, haruskah saya menghapus / melepaskan shader saya?

45

Setelah saya memiliki program tertaut, dan berpikir tentang pemrograman defensif, haruskah saya menghapus dan melepaskan shader yang digunakan untuk menautkan program ini?

Jika ya, apakah itu akan membebaskan sumber daya apa pun? Atau apakah objek shader ini hanya akan dibebaskan setelah panggilan glDeleteProgram?

sunting: Hanya untuk klarifikasi apa yang saya lakukan (yang konsisten dengan jawabannya):

glCreateShader -> glShaderSource -> glCompileShader -> glCreateProgram -> glAttachShader -> glLinkProgram -> glDetachShader -> glDeleteShader -> menggambar menggunakan program shader ini -> dan ketika saya tidak membutuhkan shader ini lagi glDeleteProgram

Grprado
sumber

Jawaban:

46

Ya, Anda harus selalu melakukan ini. Saya tidak mengetahui tentang hal ini sampai baru-baru ini, tetapi shader tidak akan benar-benar dihapus glDeleteShadersampai itu terlepas. Disebutkan di halaman manual untukglDetachShader

EDIT : Hampir melewatkan sedikit tentang menghapus shader juga. Ya, Anda harus melakukan ini karena membebaskan memori yang digunakan untuk menyimpan sumber shader dan kode objek yang tidak ditautkan. Ini dijelaskan lebih rinci dalam pertanyaan StackOverflow ini .

Robert Rouhani
sumber
+1 dan juga memudahkan pembersihan karena Anda hanya memiliki satu objek untuk dilacak dan glDelete.
Maximus Minimus
2

Urutannya benar, tetapi Anda tidak benar-benar perlu melakukan deattach shader, karena memanggil glDeleteProgram melakukan itu untuk Anda dengan semua shaders yang terpasang dan kemudian mereka secara otomatis dihapus (jika mereka ditandai untuk dihapus dengan fungsi glDeleteShader).

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

DavidV
sumber
Objek shader memakan banyak memori dibandingkan dengan setiap program. Lebih baik menghapusnya setelah Anda selesai menyusun program dan memiliki lebih banyak memori yang tersedia untuk hal-hal yang lebih penting.
Robert Rouhani