Une condition constante est-elle plus coûteuse que le changement de shaders?

14

En général, la ramification dans les shaders n'est pas une bonne idée. Mais maintenant, j'ai un shader avec une condition constante par rapport à l'appel de tirage complet. La branche exécutée est donc toujours la même pour un appel de tirage.

Ce type de branchement est-il encore plus coûteux que d'avoir plusieurs shaders sans ces branches et de basculer entre elles?

nikitablack
la source
Comme l'explique la réponse à ma question, les fragments sont regroupés en "warps" ou "fronts d'onde" et si tous les fragments d'un tel groupe utilisent la même branche, seule cette branche est exécutée.
Martin Ender
Mais qu'en est-il des shaders différents du fragment?
nikitablack
1
Je soupçonne que ce n'est pas un doublon, mais il doit être modifié pour qu'il soit clair ce qui est demandé avant que cela puisse être déterminé. Un exemple de code ou une explication des deux options comparées aiderait beaucoup.
trichoplax

Réponses:

13

Sur le matériel moderne, si toutes les invocations d'un groupe suivent le même chemin, le chemin inutilisé n'est pas évalué.

en pseudo code:

if(cond){
   res = ...
}else{
   res = ...
}

devient

if(anyInvocationARB(cond)){
    res1 = ...
}
if(anyInvocationARB(!cond)){
    res2 = ...
}
res = cond?res1:res2;

anyInvocationARBsera vrai si une invocation du shader aura la valeur true as cond(à partir de l'extension opengl ARB_shader_group_vote ).

Si cond peut être dérivé des uniformes seuls, le pilote peut optimiser et évaluer la condition avant de démarrer le rendu et remplacer le if par un goto dans la bonne branche. OpenGL a une fonctionnalité appelée sous-programmes uniformes qui la rend explicite.

monstre à cliquet
la source
4
C'est vrai, mais ce n'est pas la seule chose que vous devez considérer pour les performances. Les GPU planifient toujours statiquement les ressources par shader, donc cela peut toujours les ressources comme si vous exécutiez les deux branches, ce qui peut nuire à l'occupation.
John Calsbeek