David Catuhe
Conception avancée de shaders DirectX 10.0
Mise en place d’un mécanisme maintenable et performant pour la gestion des shaders générique avec DirectX 10.0
Par David Catuhe publié le 28/10/2009 à 20:22, lu 1835 fois, 6 pages
 4 | Utilisation de plusieurs techniques HLSL
Ce qui nous amène donc à proposer une solution plus pertinente en termes de performances. Dans cette solution nous allons profiter de la notion de technique pour qu’il n’y ait pas de tests à l’exécution.
Tout d’abord, il faut transformer notre shader pour que les variables globales deviennent des variables uniformes au niveau des fonctions des shaders :

PS_IN VS( VS_IN input, uniform bool vertexColor, uniform bool emissiveColor)

Grâce à cette déclaration du vertex shader, nous allons définir plusieurs techniques. Chacune de ces techniques compilera le shader avec des paramètres en dur et de ce fait fera directement sauter les conditions :

 

technique10 RenderFalseFalse

{

    pass P0

    {

        SetGeometryShader( 0 );

        SetVertexShader( CompileShader( vs_4_0, VS(false, false) ) );

        SetPixelShader( CompileShader( ps_4_0, PS() ) );

    }

}

 

technique10 RenderFalseTrue

{

    pass P0

    {

        SetGeometryShader( 0 );

        SetVertexShader( CompileShader( vs_4_0, VS(false, true) ) );

        SetPixelShader( CompileShader( ps_4_0, PS() ) );

    }

}

 

technique10 RenderTrueTrue

{

    pass P0

    {

        SetGeometryShader( 0 );

        SetVertexShader( CompileShader( vs_4_0, VS(true, true) ) );

        SetPixelShader( CompileShader( ps_4_0, PS() ) );

    }

}

Cette technique va produire un code très performant car exempt de ces conditions. Toutefois cette approche possède l’inconvénient d’être assez lourde à mettre en œuvre dans le cas de nombreuses options. En effet il faut 2^x arrangements pour x booléens différents (si l’on a 8 booléens de contrôles il faut 256 techniques).
 
» Démarrer une discussion