¿Es una condición constante más costosa que cambiar los sombreadores?

14

En general, ramificar en sombreadores no es una buena idea. Pero ahora tengo un sombreador con una condición que es constante con respecto a toda la llamada de sorteo. Entonces, la rama que se ejecuta es siempre la misma para una llamada de extracción.

¿Es este tipo de ramificación aún más costoso que tener múltiples sombreadores sin estas ramas y cambiar entre ellas?

nikitablack
fuente
Como la respuesta explica en mi pregunta, los fragmentos se agrupan en "urdimbres" o "frentes de onda" y si todos los fragmentos en ese grupo usan la misma rama, solo se ejecuta esa rama.
Martin Ender
Pero, ¿qué pasa con los sombreadores diferentes del fragmento?
nikitablack
1
Sospecho que esto no es un duplicado, pero debe editarse para que quede claro lo que se pregunta antes de que se pueda determinar. Algún código de ejemplo o una explicación de las dos opciones que se comparan ayudaría mucho.
trichoplax

Respuestas:

13

En el hardware moderno, si todas las invocaciones en un grupo siguen la misma ruta, entonces la ruta no utilizada no se evalúa.

en pseudocódigo:

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

se convierte

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

Donde anyInvocationARBserá verdadero si alguna invocación del sombreador tendrá verdadero como cond(de la extensión opengl ARB_shader_group_vote ).

Si cond es derivable solo de uniformes, entonces el conductor puede optimizar y evaluar la condición antes de comenzar el renderizado y reemplazar el if con un goto a la rama correcta. OpenGL tiene una característica llamada subrutinas uniformes que lo hace explícito.

monstruo de trinquete
fuente
44
Esto es cierto, pero no es lo único que debe tener en cuenta para el rendimiento. Las GPU todavía programan de forma estática los recursos por sombreador, por lo que esto puede seguir siendo recursos como si estuviera ejecutando ambas ramas, lo que puede perjudicar la ocupación.
John Calsbeek