Sprites point (Direct3D 9)

La prise en charge des sprites de point dans Direct3D 9 permet un rendu de points haute performance (systèmes de particules). Les sprites de points sont des généralisations de points génériques qui permettent de rendre des formes arbitraires comme définies par des textures.

Contrôles de rendu primitif de point

Direct3D 9 prend en charge des paramètres supplémentaires pour contrôler le rendu des sprites de points (primitives de point). Ces paramètres permettent aux points d’être de taille variable et d’appliquer une carte de texture complète. La taille de chaque point est déterminée par une taille spécifiée par l’application combinée à une fonction basée sur la distance calculée par Direct3D. L’application peut spécifier la taille de point par sommet ou en définissant D3DRS_POINTSIZE, ce qui s’applique aux points sans taille par vertex. La taille de point est exprimée en unités spatiales de la caméra, à l’exception de lorsque l’application passe des sommets au format de vertex flexible (FVF) post-transformés. Dans ce cas, la fonction basée sur la distance n’est pas appliquée et la taille de point est exprimée en unités de pixels sur la cible de rendu.

Les coordonnées de texture calculées et utilisées lors du rendu des points dépendent du paramètre de D3DRS_POINTSPRITEENABLE. Lorsque cette valeur est définie sur TRUE, les coordonnées de texture sont définies de sorte que chaque point affiche la texture complète. En général, cela n’est utile que lorsque les points sont nettement supérieurs à un pixel. Lorsque D3DRS_POINTSPRITEENABLE a la valeur FALSE, la coordonnée de texture de vertex de chaque point est utilisée pour l’ensemble du point.

Calculs de taille de point

La taille du point est déterminée par D3DRS_POINTSCALEENABLE. Si cette valeur est définie sur FALSE, la taille de point spécifiée par l’application est utilisée comme taille d’espace d’écran (post-transformée). Les sommets passés à Direct3D dans l’espace d’écran n’ont pas de tailles de points calculées ; la taille de point spécifiée est interprétée comme une taille d’espace d’écran.

Si D3DRS_POINTSCALEENABLE a la valeur TRUE, Direct3D calcule la taille du point d’espace d’écran selon la formule suivante. La taille de point spécifiée par l’application est exprimée en unités d’espace de caméra.

S = Vh * S i * sqrt(1/(A + B * D ₑ + C *( D ₑ² )))

Dans cette formule, la taille du point d’entrée, S i, est soit par sommet, soit la valeur de l’état de rendu D3DRS_POINTSIZE. Les facteurs d’échelle de points, D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B et D3DRS_POINTSCALE_C, sont représentés par les points A, B et C. La hauteur de la fenêtre d’affichage, V h, est le membre Height de la structure D3DVIEWPORT9 qui représente la fenêtre d’affichage. D ₑ, la distance entre l’œil et la position (l’œil à l’origine), est calculée en prenant la position de l’espace oculaire du point (Xₑ, Yₑ, Zₑ) et en effectuant l’opération suivante.

D ₑ = sqrt (Xₑ² + Y ₑ² + Z ₑ²)

La taille maximale du point, Pmₐₓ, est déterminée en prenant la taille la plus petite du membre MaxPointSize de la structure D3DCAPS9 ou de l’état de rendu D3DRS_POINTSIZE_MAX. La taille de point minimale, Pmin, est déterminée en interrogeant la valeur de D3DRS_POINTSIZE_MIN. Ainsi, la taille finale du point d’espace d’écran, S, est déterminée de la manière suivante.

  • Si Ss > Pmₐₓ, alors S = P mₐₓ
  • si SP <min, alors S = P min
  • Sinon, S = S s

Rendu de point

Un point d’espace d’écran, P = ( X, Y, Z, W), de taille d’espace d’écran S est rastérisé en tant que quadrilatère des quatre sommets suivants.

(( X + S/2, Y + S/2, Z, W), ( X + S/2, Y - S/2, Z, W), ( X - S/2, Y- S/2, Z, W), ( X - S/2, Y + S/2, Z, W))

Les attributs de couleur de vertex sont dupliqués à chaque sommet ; ainsi, chaque point est toujours rendu avec des couleurs constantes.

L’affectation des index de texture est contrôlée par le paramètre d’état de rendu D3DRS_POINTSPRITEENABLE. Si D3DRS_POINTSPRITEENABLE a la valeur FALSE, les coordonnées de texture de vertex sont dupliquées à chaque sommet. Si D3DRS_POINTSPRITEENABLE a la valeur TRUE, les coordonnées de texture aux quatre sommets sont définies sur les valeurs suivantes.

(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)

Cette situation est présentée dans le diagramme suivant.

diagramme d’un carré avec des sommets étiquetés pour les valeurs de coordonnées (u,v) et (x,y)

Lorsque le découpage est activé, les points sont coupés de la manière suivante. Si le vertex dépasse la plage de valeurs de profondeur (MinZ et MaxZ de la structure D3DVIEWPORT9 ) dans laquelle une scène doit être rendue, le point existe en dehors du frustum de la vue et n’est pas rendu. Si le point, compte tenu de la taille du point, se trouve complètement en dehors de la fenêtre d’affichage dans X et Y, le point n’est pas rendu ; les points restants sont affichés. Il est possible que la position du point soit en dehors de la fenêtre d’affichage en X ou Y et qu’elle soit encore partiellement visible.

Les points peuvent ou non être correctement coupés sur des plans de clip définis par l’utilisateur. Si D3DPMISCCAPS_CLIPPLANESCALEDPOINTS n’est pas défini dans le membre PrimitiveMiscCaps de la structure D3DCAPS9 , les points sont coupés sur des plans de découpage définis par l’utilisateur uniquement en fonction de la position du vertex, sans tenir compte de la taille du point. Dans ce cas, les points mis à l’échelle sont entièrement affichés lorsque la position du vertex se trouve à l’intérieur des plans de découpage, et ignorés lorsque la position du vertex est à l’extérieur d’un plan de découpage. Les applications peuvent empêcher les artefacts potentiels en ajoutant une géométrie de bordure aux plans de découpage qui est aussi grande que la taille de point maximale.

Si le bit D3DPMISCCAPS_CLIPPLANESCALEDPOINTS est défini, les points mis à l’échelle sont correctement coupés sur des plans de découpage définis par l’utilisateur.

Le traitement du vertex matériel peut ou non prendre en charge la taille de point. Par exemple, si un appareil est créé avec D3DCREATE_HARDWARE_VERTEXPROCESSING sur un appareil de couche d’abstraction matérielle (HAL) (D3DDEVTYPE_HAL) dont le membre MaxPointSize de la structure D3DCAPS9 est défini sur 1.0 ou 0.0, tous les points sont un seul pixel. Pour afficher des sprites de points de pixels inférieurs à 1,0, vous devez utiliser des sommets FVF TL (transformés et éclairés) ou un traitement logiciel des sommets (D3DCREATE_SOFTWARE_VERTEXPROCESSING), auquel cas le temps d’exécution Direct3D émule le rendu du sprite de point.

Un périphérique matériel qui effectue le traitement des sommets et prend en charge les sprites de points ( MaxPointSize défini sur une valeur supérieure à 1,0f) est nécessaire pour effectuer le calcul de taille pour les sprites non transformés et est nécessaire pour définir correctement le par sommet ou D3DRS_POINTSIZED3DRS_POINTSIZE pour les sommets de durée de vie.

Pour plus d’informations sur les règles de rendu pour les points, les lignes et les triangles, consultez Règles de rastérisation (Direct3D 9).

Vertex Pipeline