Dobry sposób na usunięcie GLSL shader?

Mój kod podchodzi do zarządzania shaderami GLSL w taki sposób, że tworzy każdy shader i powiązany z nim program i usuwa każdy shader i program. Ostatnio przeczytałem http://www.opengl.org/wiki/GLSL_Object i tam jest napisane, że:

Obiekt shader, ze względu na dołączenie do obiektu programu, będzie nadal istnieć, nawet jeśli usuniesz obiekt shadera. Będzie tylko zostać usunięte przez system, gdy nie jest już dołączony do żadnego programu obiekt (i kiedy użytkownik poprosił o jego usunięcie, oczywiście).

Czy mam to poprawnie, jeśli wywołam glDeleteShader() Na obiekcie shader po linkowaniu z programem, muszę tylko śledzić program? Czy można założyć, że to zawsze prawda?

 53
Author: rioki, 2012-02-02

4 answers

Tak - w rzeczywistości jest bardzo pożądane, aby odłączyć i usunąć obiekty shadera tak szybko, jak to możliwe. W ten sposób sterownik może zwolnić całą pamięć, której używa do przechowywania kopii źródła shadera i niezwiązanego kodu obiektowego, co może być dość znaczne. Pomiary, które wykonałem wskazują, że nie usuwanie obiektów shader zwiększa przyrostowe zużycie pamięci na shader o 5-10x

 61
Author: Chris Dodd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-02 17:58:19

Ogólnie rzecz biorąc, sposób zarządzania obiektami shader jest prosty. Obiekty Shader tak naprawdę nie robią niczego, więc nie ma sensu ich śledzić. Obiekty Shader powinny istnieć wystarczająco długo, aby pomyślnie połączyć obiekt programu. Po tym czasie shadery powinny zostać odłączone od programu i usunięte.

Powyższe założenie zakłada, że nie próbujesz użyć obiektu shadera do połączenia z innym programem, oczywiście. To z pewnością możliwe. W takim razie ty należy usunąć obiekty shadera po połączeniu wszystkich programów.

 13
Author: Nicol Bolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-02 15:57:17

Tak. Wtedy możesz bezpiecznie usunąć shader. W rzeczywistości jest to preferowany sposób, ponieważ masz mniej konserwacji. Nie musisz śledzić tego, co usunąć i nie możesz tego zapomnieć. I nadal będzie działać.

"usunięcie" shadera, tak jak w przypadku wszystkich obiektów OpenGL, ustawia jedynie flagę mówiącą , że już go nie potrzebujesz. OpenGL utrzyma go tak długo, jak będzie go potrzebował, i wykona rzeczywiste usunięcie w dowolnym momencie później (najprawdopodobniej, ale nie koniecznie, po usunięciu programu).

 6
Author: Damon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-02 14:06:57

W skrócie: po wywołaniu glLinkProgram() glDeleteShader() dla każdego shadera oznacza to ich usunięcie, a gdy program nie jest już potrzebny, wywołanie glDeleteProgram() - to wywołanie nie tylko usuwa program, ale także odłącza wszystkie dołączone do niego shadery i usuwa je (jeśli nie jest używane przez inny program).

Więc normalnie nie musisz dzwonić glDetachShader(). Przeczytaj dokumenty dla glDeleteProgram().

 4
Author: user1656730,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-23 06:17:58