Optimización de Shader – pseudoc de Cg / HLSL y multiplicación

HLSL / Cg no permiten la obtención de texturas dentro de bloques condicionales. Para evitar esto, primero estoy verificando una variable y realizando algunos cálculos, luego establezco un indicador de flotación en 0.0 o 1.0 , dependiendo de los cálculos. Me gustaría activar una búsqueda de textura solo si el indicador es 1.0 o no. Esperaba que esto hiciera el truco:

 float4 TU0_atlas_colour=pseudoBool*tex2Dlod(TU0_texture, float4(tileCoord, 0, mipLevel)); 

Quiero saber si pseudoBool es 0 , ¿aún se llamará a la function de pseudoBool textura y se generará una sobrecarga? Esperaba evitar que se ejecutara a través de este truco que normalmente funciona en C / C ++.

En primer lugar, puede hacer una búsqueda de texturas dentro de bloques condicionales en HLSL. tex2Dlod () y tex2Dgrad () funcionarán bien dentro de uno. Es solo tex2D () que no se comstackrá, y puedes resolverlo calculando ddx () y ddy () fuera del condicional y usando tex2Dgrad () .

Para detener de manera confiable la búsqueda de textura (o cualquier otro bloque de código) que se esté ejecutando en HLSL, use una sentencia if con el atributo [branch] . Esto requiere shader model 3 o superior.

También puede, por supuesto, crear dos sombreadores separados y cambiar entre ellos desde el código de llamada, pero eso no es tan flexible. Donde sea posible, será más rápido sin embargo.

También tenga en count que, a less que la sucursal omita significativamente más líneas de código que una única lectura de textura, probablemente perderá performance y no lo obtendrá. Si tiene dudas, pruebe con [branch] y [flatten] y compare el performance entre los dos. Sin cualquiera de los attributes, el comstackdor adivinará qué opción es mejor.