Point Sprites (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 point sont des généralisations de points génériques qui permettent le rendu de formes arbitraires comme défini par les textures.
- Contrôles de rendu primitifs point
- calculs de taille de point
- de rendu de point
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 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 du point est exprimée en unités spatiales de l’appareil photo, à l’exception du moment où l’application passe des sommets flexibles 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 règle générale, cela n’est utile que lorsque les points sont nettement supérieurs à un pixel. Lorsque D3DRS_POINTSPRITEENABLE est défini sur FALSE, la coordonnée de texture de vertex de chaque point est utilisée pour l’intégralité 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 est 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 spatiales 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 la valeur de l’état de rendu D3DRS_POINTSIZE. 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 du 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, puis 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 ratérisé en tant que quadrilatérale 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 + S2, 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 est défini sur 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)
Ceci est illustré dans le diagramme suivant.
Lorsque la capture est activée, les points sont clippés de la manière suivante. Si le sommet 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 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 dans X et Y, alors 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 dans X ou Y et qu’elle soit encore partiellement visible.
Les points peuvent ou ne pas être correctement clippés vers 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 clippés à des plans de clip définis par l’utilisateur uniquement en fonction de la position de vertex, ignorant la taille du point. Dans ce cas, les points mis à l’échelle sont entièrement rendus lorsque la position de vertex se trouve à l’intérieur des plans de clip et ignorées lorsque la position de vertex est 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 clippés vers les plans de clip définis par l’utilisateur.
Le traitement du vertex matériel peut ou non prendre en charge la taille du point. Par exemple, si un appareil est créé avec D3DCREATE_HARDWARE_VERTEXPROCESSING sur un appareil hal (hardware abstraction layer) (D3DDEVTYPE_HAL) dont le membre MaxPointSize de la structure D3DCAPS9 a la valeur 1.0 ou 0.0, tous les points sont un pixel unique. Pour afficher les sprites de point de pixels inférieurs à 1,0, vous devez utiliser des sommets FVF (transformés et allumé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 plus de 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 sommets 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).
Rubriques connexes