Kode saya mencoba mengejar glsl yang dibangkitkan shader manajemen di jalan, yang menciptakan setiap shader dan terkait program dan menghapus setiap shader dan program. Aku baru baca http://www.opengl.org/wiki/GLSL_Object dan di sana dinyatakan bahwa:
shader objek, karena yang melekat pada obyek program, akan terus ada bahkan jika anda menghapus shader objek. Itu hanya akan dihapus oleh sistem ketika itu tidak lagi melekat pada setiap program objek (dan ketika pengguna telah meminta untuk menghapus itu, tentu saja).
Apakah saya mendapatkan ini dengan benar, jika saya sebut glDeleteShader()
pada shader objek setelah menghubungkan ke program ini, saya hanya perlu untuk melacak program? Adalah aman untuk mengasumsikan ini adalah selalu benar?
Ya -- pada kenyataannya hal ini sangat diinginkan untuk melepaskan dan menghapus shader benda sesegera mungkin. Dengan begitu pengemudi dapat membebaskan semua memori itu menggunakan untuk memegang salinan shader sumber dan linknya kode objek, yang bisa cukup besar. Pengukuran yang telah saya lakukan menunjukkan bahwa TIDAK menghapus shader benda-benda yang meningkatkan tambahan memori menggunakan per shader oleh 5-10x
Secara umum, cara shader manajemen objek kerjanya sederhana. Shader benda don't benar-benar melakukan apa-apa, jadi ada's tidak ada gunanya melacak mereka semua. Shader benda-benda yang harus ada untuk waktu yang cukup lama untuk berhasil link program objek. Setelah waktu, shader harus terpisah dari program dan dihapus.
Di atas mengasumsikan bahwa anda tidak't mencoba untuk menggunakan shader objek untuk link dengan program yang berbeda, tentu saja. Yang's tentu saja mungkin. Dalam hal ini, anda harus menghapus anda shader objek setelah anda telah menghubungkan semua program anda.
Ya. Anda dapat dengan aman menghapus shader kemudian. Pada kenyataannya, ini adalah cara yang lebih disukai, karena anda memiliki lebih sedikit pemeliharaan. Anda tidak perlu melacak apa yang akan dihapus, dan anda tidak lupa untuk melakukan itu. Dan, itu akan tetap bekerja.
"Menghapus" shader, seperti dengan all OpenGL benda, hanya menetapkan bendera yang mengatakan you don't perlu lagi. OpenGL akan tetap sekitar selama ini kebutuhan itu sendiri, dan akan melakukan yang sebenarnya menghapus setiap waktu kemudian (kemungkinan besar, tapi belum tentu, setelah program ini dihapus).
Dalam jangka pendek: setelah glLinkProgram()
panggilan glDeleteShader()
untuk setiap shader, ini menandai mereka untuk penghapusan dan ketika program ini tidak diperlukan lagi panggilan glDeleteProgram()
- panggilan ini tidak hanya akan menghapus program, tetapi juga melepaskan semua shader yang melekat padanya dan menghapus mereka (jika tidak digunakan oleh program lain).
Jadi biasanya anda don't harus panggil glDetachShader()
.
Baca dokumentasi untuk glDeleteProgram()
.