Configuration de la fonctionnalité de fusion

Des opérations de fusion sont effectuées sur chaque sortie de nuanceur de pixels (valeur RVBA) avant que la valeur de sortie soit écrite sur une cible de rendu. Si l’échantillonnage multiple est activé, le mélange est effectué sur chaque échantillon multiple ; sinon, la fusion est effectuée sur chaque pixel.

Créer l’état blend

L’état de fusion est une collection d’états utilisée pour contrôler la fusion. Ces états (définis dans D3D11_BLEND_DESC1) sont utilisés pour créer l’objet d’état de fusion en appelant ID3D11Device1::CreateBlendState1.

Pour instance, voici un exemple très simple de création d’état de fusion qui désactive la fusion alpha et n’utilise aucun masquage de pixels par composant.

ID3D11BlendState1* g_pBlendStateNoBlend = NULL;

D3D11_BLEND_DESC1 BlendState;
ZeroMemory(&BlendState, sizeof(D3D11_BLEND_DESC1));
BlendState.RenderTarget[0].BlendEnable = FALSE;
BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
pd3dDevice->CreateBlendState1(&BlendState, &g_pBlendStateNoBlend);

Cet exemple est similaire à l’exemple HLSLWithoutFX10.

Lier l’état blend

Après avoir créé l’objet blend-state, liez l’objet blend-state à l’étape de sortie-fusion en appelant ID3D11DeviceContext::OMSetBlendState.

float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
UINT sampleMask   = 0xffffffff;

pd3dDevice->OMSetBlendState(g_pBlendStateNoBlend, blendFactor, sampleMask);

Cette API prend trois paramètres : l’objet d’état de fusion, un facteur de fusion à quatre composants et un exemple de masque. Vous pouvez passer null pour l’objet blend-state afin de spécifier l’état de fusion par défaut ou passer un objet blend-state. Si vous avez créé l’objet d’état de fusion avec D3D11_BLEND_BLEND_FACTOR ou D3D11_BLEND_INV_BLEND_FACTOR, vous pouvez passer un facteur de fusion pour moduler les valeurs du nuanceur de pixels, de la cible de rendu ou des deux. Si vous n’avez pas créé l’objet d’état de fusion avec D3D11_BLEND_BLEND_FACTOR ou D3D11_BLEND_INV_BLEND_FACTOR, vous pouvez toujours passer un facteur de fusion non NULL, mais l’étape de fusion n’utilise pas le facteur de fusion ; le runtime stocke le facteur de fusion et vous pouvez ensuite appeler ID3D11DeviceContext::OMGetBlendState pour récupérer le facteur de fusion. Si vous transmettez null, le runtime utilise ou stocke un facteur de fusion égal à { 1, 1, 1, 1 }. L’exemple de masque est un masque défini par l’utilisateur qui détermine comment échantillonner la cible de rendu existante avant de la mettre à jour. Le masque d’échantillonnage par défaut est 0xffffffff qui désigne l’échantillonnage de points.

Dans la plupart des schémas de mise en mémoire tampon de profondeur, le pixel le plus proche de l’appareil photo est celui qui est dessiné. Lors de la configuration de l’état du gabarit de profondeur, le membre DepthFunc de D3D11_DEPTH_STENCIL_DESC peut être n’importe quel D3D11_COMPARISON_FUNC. Normalement, vous souhaitez que DepthFunc soit D3D11_COMPARISON_LESS, afin que les pixels les plus proches de l’appareil photo remplacent les pixels derrière eux. Toutefois, selon les besoins de votre application, l’une des autres fonctions de comparaison peut être utilisée pour effectuer le test de profondeur.

Rubriques relatives à la fusion avancée

Alpha-to-Coverage

Alpha-to-coverage est une technique d’échantillonnage multiple qui est la plus utile dans des situations telles que le feuillage dense où il existe plusieurs polygones qui se chevauchent qui utilisent la transparence alpha pour définir des bords dans la surface.

Vous pouvez utiliser le membre AlphaToCoverageEnable de D3D11_BLEND_DESC1 ou D3D11_BLEND_DESC pour indiquer si le runtime convertit le composant .a (alpha) du registre de sortie SV_Target0 du nuanceur de pixels en masque de couverture à n étapes (en fonction d’un n-échantillon RenderTarget). Le runtime effectue une opération AND de ce masque avec l’exemple de couverture standard du pixel dans la primitive (en plus de l’exemple de masque) pour déterminer les exemples à mettre à jour dans tous les RenderTargetactifs.

Si le nuanceur de pixels sort SV_Coverage, le runtime désactive l’alpha-à-couverture.

Remarque

Dans le multi-échantillonnage, le runtime partage une seule couverture pour tous les RenderTarget. Le fait que le runtime lit et convertit .a à partir de la sortie SV_Target0 en couverture lorsque AlphaToCoverageEnable a la valeur TRUE ne modifie pas la valeur .a qui va au mélangeur dans RenderTarget 0 (si un RenderTarget est défini à cet emplacement). En général, si vous activez l’alpha-à-couverture, vous n’affectez pas la façon dont toutes les sorties de couleur des nuanceurs de pixels interagissent avec renderTargets via l’étape de fusion de sortie , sauf que le runtime effectue une opération AND du masque de couverture avec le masque alpha-à-couverture. Alpha-to-coverage fonctionne indépendamment pour déterminer si le runtime peut fusionner RenderTarget ou si vous utilisez la fusion sur RenderTarget.

 

Le matériel graphique ne spécifie pas précisément la façon dont il convertit le nuanceur de pixels SV_Target0.a (alpha) en masque de couverture, sauf que l’alpha de 0 (ou moins) doit être mappé à aucune couverture et l’alpha de 1 (ou supérieure) doit être mappée à une couverture complète (avant que le runtime effectue une opération AND avec une couverture primitive réelle). Comme l’alpha passe de 0 à 1, la couverture résultante devrait généralement augmenter de façon monotone. Toutefois, le matériel peut effectuer un tramage de zone pour fournir une meilleure quantisation des valeurs alpha au détriment de la résolution spatiale et du bruit. Une valeur alpha de NaN (Pas un nombre) entraîne un masque sans couverture (zéro).

L’alpha-à-couverture est également traditionnellement utilisée pour la transparence de porte d’écran ou la définition de silhouettes détaillées pour les sprites autrement opaques.

Fusion des sorties du nuanceur de pixels

Cette fonctionnalité permet à la fusion de sortie d’utiliser simultanément les deux sorties du nuanceur de pixels comme sources d’entrée pour une opération de fusion avec la cible de rendu unique à l’emplacement 0.

Cet exemple prend deux résultats et les combine en une seule passe, en fusionnant l’un dans la destination avec une multiplication et l’autre avec un ajout :

SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;

Cet exemple configure la première sortie du nuanceur de pixels comme couleur source et la deuxième sortie comme facteur de fusion de composant par couleur.

SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;

Cet exemple montre comment les facteurs de fusion doivent correspondre aux nuanceurs :

SrcFactor = D3D11_BLEND_SRC1_ALPHA;
DestFactor = D3D11_BLEND_SRC_COLOR;
OutputWriteMask[0] = .ra; // pseudocode for setting the mask at
                          // RenderTarget slot 0 to .ra

Ensemble, les facteurs de fusion et le code du nuanceur impliquent que le nuanceur de pixels est nécessaire pour générer au moins o0.r et o1.a. Des composants de sortie supplémentaires peuvent être générés par le nuanceur, mais seraient ignorés, moins de composants produiraient des résultats non définis.

Étape de sortie-fusion

Phases de pipeline (Direct3D 10)