36 votes

Organisation des shaders GLSL dans le moteur OpenGL

Qui est le meilleur ?

  1. Pour avoir un programme de shaders avec beaucoup d'uniformes de la spécification lumières d'utiliser, ou les mappages de le faire (par exemple, j'ai besoin d'un maillage à la parallaxe mappé, et un autre de parallaxe/spéculaire mappé). Je voudrais faire une mise en cache liste des uniformes pour les paresseux transferts, et il suffit de changer un couple d'uniformes pour toutes les prochaines mailles si il le faut.

  2. Pour avoir beaucoup de shader programmes pour chaque cas de besoin, chacun avec une petite quantité d'uniformes, et de faire le paresseux se lier avec glUseProgram pour chaque maille si il le faut. Ici je suppose que les mailles sont correctement dosés, pour éviter les commutateurs redondants.

28voto

Axel Gneiting Points 3808

La plupart des moteurs modernes que je connais ont un "cache shader" et utilisent la deuxième option, car apparemment c'est plus rapide.

Vous pouvez également jeter un œil à l'ARB_shader_subroutine qui permet la liaison dynamique. Mais je pense qu'il n'est disponible que sur du matériel de classe DX11.

15voto

Chris Dodd Points 39013

En général, l'option 2 sera plus rapide / meilleure, sauf si vous disposez d'un nombre vraiment énorme de programmes. Vous pouvez également utiliser des objets tampons partagés entre plusieurs programmes afin de ne pas avoir à réinitialiser de valeurs lorsque vous changez de programme.

De plus, une fois que vous avez lié un programme, vous pouvez libérer tous les shaders que vous avez liés au programme. Cela libérera tout le code source et toutes les informations de pré-lien que le pilote conserve, ne laissant que le programme entièrement lié en mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X