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?
performance
shader
nikitablack
fuente
fuente
Respuestas:
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:
se convierte
Donde
anyInvocationARB
será verdadero si alguna invocación del sombreador tendrá verdadero comocond
(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.
fuente