Partager via


Différences entre les effets 10 et les effets 11

Cette rubrique présente les différences entre Effets 10 et 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 Effets.

Le runtime Effects 11 est à thread unique. Pour cette raison, vous ne devez pas utiliser une seule 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 à thread unique, vous devez transmettre différentes instances ID3D11DeviceContext à chaque instance d’effet sur Apply. 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 les mêmes fonctionnalités, à utiliser sur plusieurs threads, consiste à créer un effet, puis à créer des copies clonées. Le clonage présente les avantages suivants sur 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 (de sorte qu’elles n’ont pas besoin d’être recréées).
  3. Les effets clonés 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’elles soient optimisées ou non).

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

Pools d’effets et groupes

De loin, l’utilisation la plus répandue des pools d’effets dans Direct3D 10 était de regrouper des 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 de 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 la même fonctionnalité 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 de nuanceur

Il existe trois nouvelles étapes de nuanceur dans Direct3D 11 : 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 géométriques et les nuanceurs de pixels.

Trois nouveaux types de variables ont été ajoutés à 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 la même passe 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 ordonnées

Les effets 11 prennent 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 HLSL Effets :

  
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 obtenir la syntaxe de l’interface et de la classe, consultez interfaces et classes.

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

Flux adressable sortant

Dans Direct3D 10, les nuanceurs géométriques 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 géométriques peuvent générer jusqu’à quatre flux de données vers l’unité de sortie de flux, et au plus 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 Stream Out.

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

Dans Effets 10, vous pouvez créer des mémoires tampons constantes et des mémoires tampons de texture 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 constante ou la mémoire tampon de texture et l’utilisateur doit remplir les données à l’aide de l’interface ID3D10Device.

Dans Effets 11, vous pouvez également créer les blocs d’état (état de fusion, état de rastériseur, état de gabarit de profondeur et état sampler) 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 non managé par l’utilisateur. Si vous annulez ces variables, le runtime Effets 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 de la machine virtuelle

Les effets de la machine virtuelle, qui ont évalué des expressions complexes en dehors des fonctions, ont été supprimés.

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 suivants d’expressions non complexes 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 bloc d’état (telles que FILTER) et passer des expressions (telles que SetPixelShader).

Disponibilité et emplacement de la source

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

Vous pouvez obtenir Des effets 11 à partir de Effects pour direct3D 11 Update.

effets (Direct3D 11)