C'est ce que l'on appelle le "thread divergence" :
Normalement, chaque thread d'un bloc exécute la même instruction au même moment sur des données différentes. Si on à un "thread divergence", une partie des threads n'exécute pas les mêmes instructions que les autres : on casse le parallélisme.
Dans le cas où le if correspond à un paramètre uniform, il n'y a pas de "thread divergence" et le parallélisme n'est pas cassé (donc pas de perte de performance).
Pour finir, le compilateur doit effectivement optimiser le code s'il tombe sur un if constant (c'est le B-A-BA de la compilation)
Un peu de lecture : http://perso.ens-lyon.fr/sylvain.col...pers/sympa13_7 (chapitre 5)
Comme l'a dit LittleWhite, tu as effectivement 2 possibilités :Citation:
Et je fais ça pour chaque composante de mon matériaux : spéculaire, valeur spéculaire, ambient, normal map....
Du coup mon shader est plein de tests.
Aux vues des explications de bafman, je me demandais s'il y avait un meilleur moyen de gérer ça, pour ne pas plomber les performances de mon application.
- tu donnes l'information de ce qu'il faut afficher dans les buffers : par exemple, tu ajoutes un uniform indiquant s'il faut utiliser les couleurs ou la texture. L’inconvénient est que comme tu dois donner un buffer homogène, tu auras un augmentation de la taille des données à transférer et donc perte de performance
- tu lances plusieurs shaders différents, chaque shader sur un jeu de données différentes
La seconde méthode est plus longue à mettre en place, la première est plus adapté pour des données très hétérogènes