Fenêtres d’affichage et découpage (Direct3D 9)

Conceptuellement, une fenêtre d’affichage est un rectangle à deux dimensions (2D) dans lequel une scène 3D est projetée. Dans Direct3D, le rectangle existe en tant que coordonnées dans une surface Direct3D que le système utilise comme cible de rendu. La transformation de projection convertit les sommets dans le système de coordonnées utilisé pour la fenêtre d’affichage. Une fenêtre d’affichage est également utilisée pour spécifier la plage de valeurs de profondeur sur une surface de cible de rendu dans laquelle une scène sera rendue (généralement de 0,0 à 1,0).

Le frustum d’affichage

Un frustum d’affichage est un volume 3D dans une scène positionnée par rapport à la caméra de la fenêtre d’affichage. La forme du volume affecte la façon dont les modèles sont projetés à partir de l’espace de la caméra sur l’écran. Le type de projection le plus courant, une projection en perspective, est responsable de faire apparaître des objets près de la caméra plus grands que les objets de la distance. Pour l’affichage en perspective, le frustum d’affichage peut être visualisé sous la forme d’une pyramide, avec la caméra positionnée à l’extrémité, comme illustré dans l’illustration suivante. Cette pyramide est croisée par un plan de découpage avant et arrière. Le volume dans la pyramide entre les plans de découpage avant et arrière est le frustum d’observation. Les objets ne sont visibles que lorsqu’ils se trouvent dans ce volume.

illustration d’un frustrum d’affichage avec un plan de découpage avant et arrière

Si vous imaginez que vous vous trouvez dans une pièce sombre et que vous regardez à travers une fenêtre carrée, vous visualisez un frustum d’affichage. Dans cette analogie, le plan de découpage proche est la fenêtre, et le plan de découpage arrière est tout ce qui interrompt finalement votre vue - le gratte-ciel de l’autre côté de la rue, les montagnes au loin, ou rien du tout. Vous pouvez voir tout à l’intérieur de la pyramide tronquée qui commence à la fenêtre et se termine par tout ce qui interrompt votre vue, et vous ne pouvez voir rien d’autre.

Le frustum d’affichage est défini par fov (champ de vue) et par les distances des plans de découpage avant et arrière, spécifiées en coordonnées z, comme illustré dans le diagramme suivant.

diagramme du frustum d’affichage

Dans ce diagramme, la variable D correspond à la distance entre la caméra et l’origine de l’espace qui a été défini dans la dernière partie du pipeline geometry : la transformation d’affichage. Il s’agit de l’espace autour duquel vous organisez les limites de votre frustum d’affichage. Pour plus d’informations sur la façon dont cette variable D est utilisée pour générer la matrice de projection, consultez La transformation de projection (Direct3D 9).

Rectangle de fenêtre d’affichage

Vous définissez le rectangle de fenêtre d’affichage en C++ à l’aide de la structure D3DVIEWPORT9 . La structure D3DVIEWPORT9 est utilisée avec les méthodes de manipulation de fenêtre d’affichage suivantes exposées par l’interface IDirect3DDevice9.

La structure D3DVIEWPORT9 contient quatre membres (X, Y, Width, Height) qui définissent la zone de la surface de la cible de rendu dans laquelle une scène sera rendue. Ces valeurs correspondent au rectangle de destination, ou rectangle de fenêtre d’affichage, comme illustré dans le diagramme suivant.

diagramme du rectangle de fenêtre d’affichage

Les valeurs que vous spécifiez pour les membres X, Y, Width et Height sont des coordonnées d’écran par rapport au coin supérieur gauche de la surface cible de rendu. La structure définit deux membres supplémentaires (MinZ et MaxZ) qui indiquent les plages de profondeur dans lesquelles la scène sera rendue.

Direct3D suppose que le volume de découpage de la fenêtre d’affichage est de -1.0 à 1.0 dans X et de 1.0 à -1.0 dans Y. Il s’agissait des paramètres utilisés le plus souvent par les applications dans le passé. Vous pouvez ajuster les proportions de la fenêtre d’affichage avant le découpage à l’aide de la transformation de projection.

Notes

MinZ et MaxZ indiquent les plages de profondeur dans lesquelles la scène sera rendue et ne sont pas utilisées pour le découpage. La plupart des applications définissent ces membres sur 0.0 et 1.0 pour permettre au système de s’afficher sur l’ensemble de la plage de valeurs de profondeur dans la mémoire tampon de profondeur. Dans certains cas, vous pouvez obtenir des effets spéciaux en utilisant d’autres plages de profondeur. Par instance, pour afficher un affichage tête haute dans un jeu, vous pouvez définir les deux valeurs sur 0,0 pour forcer le système à restituer des objets dans une scène au premier plan, ou vous pouvez les définir sur 1.0 pour afficher un objet qui doit toujours être en arrière-plan.

 

Les dimensions utilisées dans les membres X, Y, Width, Height de la structure D3DVIEWPORT9 pour une fenêtre d’affichage définissent l’emplacement et les dimensions de la fenêtre d’affichage sur la surface cible de rendu. Ces valeurs sont exprimées en coordonnées d’écran, par rapport à l’angle supérieur gauche de la surface.

Direct3D utilise l’emplacement et les dimensions de la fenêtre d’affichage pour mettre à l’échelle les sommets afin de les adapter à une scène rendue à l’emplacement approprié sur la surface cible. En interne, Direct3D insère ces valeurs dans la matrice suivante qui est appliquée à chaque sommet.

équation de la matrice appliquée à chaque sommet

Cette matrice met à l’échelle les sommets en fonction des dimensions de la fenêtre d’affichage et de la plage de profondeur souhaitée et les traduit à l’emplacement approprié sur la surface cible de rendu. La matrice retourne également la coordonnée y pour refléter une origine de l’écran dans le coin supérieur gauche avec y croissant vers le bas. Une fois cette matrice appliquée, les sommets sont toujours homogènes ( c’est-à-dire qu’ils existent toujours en tant que sommets [x,y,z,w] et doivent être convertis en coordonnées non homogènes avant d’être envoyés au rastériseur.

Notes

La matrice de mise à l’échelle de la fenêtre d’affichage intègre les membres MinZ et MaxZ de la structure D3DVIEWPORT9 pour mettre à l’échelle les sommets en fonction de la plage de profondeur [MinZ, MaxZ]. Cela représente une sémantique différente de celle des versions précédentes de DirectX, dans lesquelles ces membres étaient utilisés pour le découpage.

 

Notes

Les applications définissent généralement MinZ et MaxZ sur 0.0 et 1.0 respectivement pour que le système s’affiche sur l’ensemble de la plage de profondeur. Toutefois, vous pouvez utiliser d’autres valeurs pour obtenir certains effets. Par exemple, vous pouvez définir les deux valeurs sur 0,0 pour forcer tous les objets au premier plan, ou définir les deux sur 1.0 pour afficher tous les objets en arrière-plan.

 

Effacement d’une fenêtre d’affichage

L’effacement de la fenêtre d’affichage réinitialise le contenu du rectangle de la fenêtre d’affichage sur la surface de la cible de rendu. Il peut également effacer le rectangle dans les surfaces tampons de profondeur et de gabarit.

Utilisez IDirect3DDevice9::Clear pour effacer la fenêtre d’affichage. La méthode accepte un ou plusieurs rectangles qui définissent les zones sur la surface en cours d’effacement. Si vous définissez le paramètre Count sur 1, et le paramètre pRects sur l’adresse d’un rectangle unique qui couvre l’ensemble de la zone de fenêtre d’affichage, la fenêtre d’affichage entière est effacée. Une autre façon d’effacer l’intégralité de la fenêtre d’affichage consiste à définir le paramètre pRects sur NULL et le paramètre Count sur 0.

IDirect3DDevice9::Clear peut être utilisé pour effacer les bits de gabarit dans une mémoire tampon de profondeur. Définissez simplement le paramètre Flags pour déterminer comment IDirect3DDevice9::Clear fonctionne avec la cible de rendu et les mémoires tampons de profondeur ou de gabarit associées. L’indicateur D3DCLEAR_TARGET efface la fenêtre d’affichage à l’aide d’une couleur RVBA arbitraire que vous fournissez dans l’argument Couleur (il ne s’agit pas de la couleur de matériau). L’indicateur D3DCLEAR_ZBUFFER efface la mémoire tampon de profondeur à une profondeur arbitraire que vous spécifiez en Z : 0,0 est la distance la plus proche et 1,0 est la plus éloignée. L’indicateur D3DCLEAR_STENCIL réinitialise les bits de gabarit à la valeur que vous fournissez dans l’argument Stencil. Vous pouvez utiliser des entiers compris entre 0 et 2n-1, où n est la profondeur de bits de la mémoire tampon du gabarit.

Dans certaines situations, vous pouvez effectuer un rendu uniquement sur de petites parties de la cible de rendu et des surfaces de mémoire tampon de profondeur. Les méthodes clear vous permettent également d’effacer plusieurs zones de vos surfaces en un seul appel. Pour ce faire, définissez le paramètre Count sur le nombre de rectangles que vous souhaitez effacer et spécifiez l’adresse du premier rectangle dans un tableau de rectangles dans le paramètre pRects.

Configurer la fenêtre d’affichage pour le découpage

Les résultats de la matrice de projection déterminent le volume de découpage dans l’espace de projection comme suit :

-wc<= xc<= wc

-wc<= yc<= wc

0 <= zc<= wc

Où : x, y, z et w représentent les coordonnées de vertex après l’application de la transformation de projection. Tous les sommets qui ont un composant x, y ou z en dehors de ces plages sont coupés, si le découpage est activé (comportement par défaut).

À l’exception des mémoires tampons de vertex, les applications activent ou désactivent le découpage par le biais de l’état de rendu D3DRS_CLIPPING . Les informations de découpage pour les mémoires tampons de vertex sont générées pendant le traitement. Pour plus d’informations, consultez Traitement de vertex de fonction fixe (Direct3D 9) et Traitement programmable du vertex (Direct3D 9).

Direct3D n’extrait pas les sommets transformés d’une primitive à partir d’une mémoire tampon de vertex, sauf s’il provient de IDirect3DDevice9::P rocessVertices. Si vous effectuez vos propres transformations et que vous avez besoin de Direct3D pour effectuer le découpage, vous ne devez pas utiliser de tampons de vertex. Dans ce cas, l’application traverse les données pour les transformer. Direct3D traverse les données une deuxième fois pour les découper, puis le pilote restitue les données, ce qui est inefficace. Par conséquent, si l’application transforme les données, doit également les découper.

Lorsque l’appareil reçoit des sommets pré-transformés et allumés (sommets T&L) qui doivent être clippés, afin d’effectuer l’opération de découpage, les sommets sont reconverti dans l’espace de découpage à l’aide du w homogène réciproque (RHW) du vertex et des informations de la fenêtre d’affichage. Le découpage est ensuite effectué. Tous les appareils ne sont pas capables d’effectuer cette contre-transformation afin de couper&les sommets en LL.

La fonctionnalité d’appareil D3DPMISCCAPS_CLIPTLVERTS indique si l’appareil est capable de couper les sommets T&L. Si cette fonctionnalité n’est pas définie, l’application est responsable du découpage des sommets T&L qu’elle a l’intention d’envoyer à l’appareil à afficher. L’appareil est toujours capable de couper les sommets T&L en mode de traitement du vertex logiciel (que l’appareil soit créé en mode de traitement du vertex logiciel ou basculé vers le mode de traitement du vertex logiciel).

La seule exigence pour configurer les paramètres de fenêtre d’affichage d’un périphérique de rendu consiste à définir le volume de découpage de la fenêtre d’affichage. Pour ce faire, vous initialisez et définissez des valeurs de découpage pour le volume de découpage et pour la surface cible de rendu. Les fenêtres d’affichage sont généralement configurées pour effectuer un rendu sur la zone complète de la surface cible de rendu, mais ce n’est pas obligatoire.

Vous pouvez utiliser les paramètres suivants pour les membres de la structure D3DVIEWPORT9 pour y parvenir en C++.

D3DVIEWPORT9 viewData = { 0, 0, width, height, 0.0f, 1.0f };

Après avoir défini des valeurs dans la structure D3DVIEWPORT9 , appliquez les paramètres de la fenêtre d’affichage à l’appareil en appelant sa méthode IDirect3DDevice9::SetViewport . L’exemple de code suivant montre à quoi cet appel peut ressembler.

HRESULT hr;

hr = pd3dDevice->SetViewport(&viewData);
if(FAILED(hr))
    return hr;

Si l’appel réussit, les paramètres de la fenêtre d’affichage sont définis et prendront effet la prochaine fois qu’une méthode de rendu sera appelée. Pour apporter des modifications aux paramètres de la fenêtre d’affichage, il vous suffit de mettre à jour les valeurs dans la structure D3DVIEWPORT9 et d’appeler À nouveau IDirect3DDevice9::SetViewport .

Notes

Les membres de structure D3DVIEWPORT9 MinZ et MaxZ indiquent les plages de profondeur dans lesquelles la scène sera rendue et ne sont pas utilisées pour le découpage. La plupart des applications définissent ces membres sur 0.0 et 1.0 pour permettre au système de s’afficher sur l’ensemble de la plage de valeurs de profondeur dans la mémoire tampon de profondeur. Dans certains cas, vous pouvez obtenir des effets spéciaux à l’aide d’autres plages de profondeur. Par instance, pour restituer un affichage tête haute dans un jeu, vous pouvez définir les deux valeurs sur 0,0 pour forcer le système à restituer des objets dans une scène au premier plan, ou vous pouvez les définir sur 1.0 pour afficher un objet qui doit toujours être en arrière-plan.

 

Prise en main