Sprites de point (Direct3D 9)

La prise en charge des sprites de point dans Direct3D 9 permet le rendu hautes performances des points (systèmes de particules). Les sprites de points sont des généralisations de points génériques qui permettent aux formes arbitraires d’être affichées comme définies par les textures.

Contrôles de rendu de primitives de point

Direct3D 9 prend en charge des paramètres supplémentaires pour contrôler le rendu des sprites de point (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 comme par vertex ou en définissant D3DRS_POINTSIZE, qui s’applique aux points sans taille par vertex. La taille de point est exprimée en unités d’espace de caméra, à l’exception de la transmission des sommets flexibles post-transformés au format de vertex flexible (FVF). Dans ce cas, la fonction basée sur la distance n’est pas appliquée et la taille du point est exprimée en unités de pixels sur la cible de rendu.

Les coordonnées de texture calculées et utilisées lorsque les points de rendu dépendent du paramètre de D3DRS_POINTSPRITEENABLE. Lorsque cette valeur est définie sur TRUE, les coordonnées de texture sont définies afin que chaque point affiche la texture complète. En général, cela n’est utile que lorsque les points sont beaucoup plus grands qu’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 des points 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é). Les sommets passés à Direct3D dans l’espace d’écran n’ont pas de tailles de point 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 en fonction de 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 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 vertex, soit par valeur du D3DRS_POINTSIZE’état de rendu. Les facteurs d’échelle de point, 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 représentant 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 le plus petit du membre MaxPointSize de la structure D3DCAPS9 ou de l’état de rendu D3DRS_POINTSIZE_MAX. La taille minimale de point, 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 S <Pmin, 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é sous la forme d’un quadrilateral des quatre sommets suivants.

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

Les attributs de couleur de vertex sont dupliqués à chaque vertex ; 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 vertex. 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, 1.F)

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

diagram of a square with labeled vertices for (u,v) and (x,y) coordinate values

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 restituée, le point existe en dehors du frustum de la vue et n’est pas rendu. Si le point, en tenant compte de la taille du point, est complètement en dehors de la fenêtre d’affichage en X et Y, le point n’est pas rendu ; les points restants sont rendus. Il est possible que la position de point soit à l’extérieur de la fenêtre d’affichage en X ou Y et reste partiellement visible.

Les points peuvent ou ne pas être correctement coupés vers des plans 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 en plans de découpage définis par l’utilisateur uniquement en fonction de la position de vertex, en ignorant 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 clip et ignorées lorsque la position du vertex se trouve en dehors d’un plan clip. Les applications peuvent empêcher les artefacts potentiels en ajoutant une géométrie de bordure aux plans de découpage aussi volumineux que la taille maximale des points.

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

Le traitement du vertex matériel peut ou non prendre en charge la taille des points. 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 pixel unique. Pour afficher les sprites de points de pixels inférieurs à 1,0, vous devez utiliser des sommets FVF (transformés et éclairés) ou un traitement de vertex logiciel (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 de vertex et prend en charge les sprites de point ( MaxPointSize défini sur une valeur supérieure à 1,0f) est nécessaire pour effectuer le calcul de taille pour les sprites nontransformés et est nécessaire pour définir correctement le sommet par vertex ou D3DRS_POINTSIZED3DRS_POINTSIZE pour les vertex de durée de vie.

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

Vertex Pipeline