Différences entre les effets 10 et les effets 11

Cette rubrique montre les différences entre les effets 10 et les effets 11.

Contextes d’appareil, threading et clonage

L’interface ID3D10Device a été divisée en deux interfaces dans Direct3D 11 : ID3D11Device et ID3D11DeviceContext. Vous pouvez créer plusieurs ID3D11DeviceContexts pour faciliter l’exécution simultanée sur plusieurs threads. Effets 11 étend ce concept à l’infrastructure Effects.

Le runtime Effects 11 est à thread unique. Pour cette raison, vous ne devez pas utiliser un seul instance ID3DX11Effect avec plusieurs threads simultanément.

Pour utiliser le runtime Effects 11 sur plusieurs instances, vous devez créer des instances ID3DX11Effect distinctes. Étant donné que l’ID3D11DeviceContext est également monothread, vous devez passer différentes instances ID3D11DeviceContext à chaque effet instance sur Appliquer. Vous pouvez utiliser ces contextes d’appareil distincts pour créer des listes de commandes afin que le thread de rendu puisse les appliquer au contexte d’appareil immédiat.

Le moyen le plus simple de créer plusieurs effets qui encapsulent la même fonctionnalité, pour une utilisation sur plusieurs threads, consiste à créer un effet, puis à effectuer des copies clonées. Le clonage présente les avantages suivants par rapport à la création de plusieurs copies à partir de zéro :

  1. La routine de clonage est plus rapide que la routine de création.
  2. Les effets clonés partagent les nuanceurs créés, les blocs d’état et les instances de classe (ils n’ont donc pas besoin d’être recréés).
  3. Les effets cloné peuvent partager des mémoires tampons constantes.
  4. Les effets clonés commencent par l’état qui correspond à l’effet actuel (valeurs de variable, qu’il ait ou non été optimisé).

Pour plus d’informations, consultez Clonage d’un effet .

Groupes et pools d’effets

De loin, l’utilisation la plus répandue des pools d’effets dans Direct3D 10 était pour le regroupement de matériaux. Les pools d’effets ont été supprimés des effets 11 et des groupes ont été ajoutés, ce qui est une méthode plus efficace de regroupement de matériaux.

Un groupe d’effets est simplement un ensemble de techniques. Pour plus d’informations, consultez Syntaxe du groupe d’effets (Direct3D 11).

Considérez la hiérarchie d’effets suivante avec quatre effets enfants et un pool d’effets :

// Effect Pool
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

// Effect Child 1
#include "EffectPool.fx"
technique10 GrassMaterialLowSpec { ... }

// Effect Child 2
#include "EffectPool.fx"
technique10 GrassMaterialHighSpec { ... }

// Effect Child 3
#include "EffectPool.fx"
technique10 WaterMaterialLowSpec { ... }

// Effect Child 4
#include "EffectPool.fx"
technique10 WaterMaterialHighSpec { ... }

Vous pouvez obtenir les mêmes fonctionnalités dans Effets 11 à l’aide de groupes :

cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

fxgroup GrassMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

fxgroup WaterMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

Nouvelles étapes du nuanceur

Direct3D 11 comprend trois nouvelles étapes de nuanceur : le nuanceur de coque, le nuanceur de domaine et le nuanceur de calcul. Les effets 11 les gèrent de la même manière que les nuanceurs de vertex, les nuanceurs de géométrie et les nuanceurs de pixels.

Trois nouveaux types de variables ont été ajoutés aux effets 11 :

  • HullShader
  • DomainShader
  • ComputeShader

Si vous utilisez ces nuanceurs dans une technique, vous devez étiqueter cette technique « technique11 », et non « technique10 ». Le nuanceur de calcul ne peut pas être défini dans le même passage que tout autre état graphique (autres nuanceurs, blocs d’état ou cibles de rendu).

Nouveaux types de textures

Direct3D 11 prend en charge les types de texture suivants :

Vues d’accès non triées

Effets 11 prend en charge l’obtention et la définition des nouveaux types d’affichage d’accès non ordonnés. Cela fonctionne de la même manière que les textures.

Considérez cet exemple d’effets HLSL :

  
RWTexture1D<float> myUAV;

Vous pouvez définir cette variable en C++ comme suit :

  
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );

Direct3D 11 prend en charge les types d’affichage d’accès non ordonnés suivants :

  • RWBuffer
  • RWByteAddressBuffer
  • RWStructuredBuffer
  • RWTexture1D
  • RWTexture1DArray
  • RWTexture2D
  • RWTexture2DArray
  • RWTexture3D

Interfaces et instances de classe

Pour connaître la syntaxe de l’interface et de la classe, consultez Interfaces et classes.

Pour utiliser des interfaces et des classes dans les effets, consultez Interfaces et classes dans les effets.

Flux adressable sortant

Dans Direct3D 10, les nuanceurs geometry peuvent générer un flux de données vers l’unité de sortie de flux et l’unité de rastériseur. Dans Direct3D11, les nuanceurs geometry peuvent générer jusqu’à quatre flux de données vers l’unité de sortie de flux, et au maximum l’un de ces flux vers l’unité de rastériseur. L’intrinsèque ConstructGSWithSO a été mise à jour pour refléter cette nouvelle fonctionnalité.

Pour plus d’informations, consultez Syntaxe de flux sortant .

Définition et annulation de l’état de l’appareil

Dans Effets 10, vous pouvez rendre les mémoires tampons et les mémoires tampons de texture constantes gérées par l’utilisateur à l’aide des fonctions ID3D10EffectConstantBuffer::SetConstantBuffer et SetTextureBuffer . Après avoir appelé ces fonctions, le runtime Effects 10 ne gère plus la mémoire tampon ou la mémoire tampon de texture constante et l’utilisateur doit remplir les données à l’aide de l’interface ID3D10Device.

Dans Effets 11, vous pouvez également rendre les blocs d’état (état de fusion, état de rastériseur, état de gabarit de profondeur et état de l’échantillonneur) gérés par l’utilisateur à l’aide des appels suivants :

Après avoir appelé ces fonctions, le runtime Effects 11 ne gère plus les variables de bloc d’état et les valeurs restent inchangées. Notez que, étant donné que les blocs d’état sont immuables, l’utilisateur doit définir un nouveau bloc d’état pour modifier les valeurs.

Vous pouvez également rétablir les mémoires tampons constantes, les tampons de texture et les blocs d’état à l’état géré non par l’utilisateur. Si vous annulez ces variables, le runtime Effects 11 continue de les mettre à jour si nécessaire. Vous pouvez utiliser les appels suivants pour annuler l’ensemble des variables gérées par l’utilisateur :

Effets Machine virtuelle

La machine virtuelle d’effets, qui évaluait des expressions complexes en dehors des fonctions, a été supprimée.

Les exemples d’expressions complexes suivants ne sont pas pris en charge :

  1. SetPixelShader( myPSArray( i * 3 + j ) );
  2. SetPixelShader( myPSArray( (float)i);
  3. FILTER = i + 2 ;

Les exemples d’expressions non complexes suivants sont pris en charge :

  1. SetPixelShader( myPS) ;
  2. SetPixelShader( myPS[i] );
  3. SetPixelShader( myPS[ uIndex ] ); uIndex est une variable uint
  4. FILTER = i;
  5. FILTER = ANISOTROPIC;

Ces expressions peuvent apparaître dans des expressions de blocs d’état (telles que FILTER) et des expressions de passe (telles que SetPixelShader).

Disponibilité et emplacement de la source

Effets 10 a été distribué dans D3D10.dll. Effets 11 est distribué en tant que source, avec les solutions Visual Studio correspondantes pour le compiler. Lorsque vous créez des applications de type effets, nous vous recommandons d’inclure la source Effects 11 directement dans ces applications.

Vous pouvez obtenir les effets 11 à partir des effets pour la mise à jour direct3D 11.

Effets (Direct3D 11)