Direct3D l'épaisseur de la Ligne
Comment puis-je changer l'épaisseur des lignes lors de l'élaboration des listes de ligne à l'aide de Direct3D?
Ce post dit que la largeur de la ligne n'est pas pris en charge, et continue à fournir une solution de contournement. D'autres options?
Alors que nous sommes sur ce sujet, ne shaders permettent de tracer des lignes avec des motifs en pointillés?
OriginalL'auteur Agnel Kurian | 2010-02-17
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un geometry shader qui va prendre en entrée un segment de votre ligne et de sortie d'un quad (un triangle bande de deux triangles), de sorte que la largeur de la quad est constante dans l'espace à l'écran et correspond au désir de l'épaisseur de la ligne. Il fonctionne parfaitement bien (pour avoir mis en œuvre dans un logiciel de CAO 3D moteur).
Si la géométrie shader n'est pas une option, une solution pourrait être d'utiliser un vertex shader, mais il faudra un peu de travail de votre VB. Gardez à l'esprit que le VS doit avoir connaissance de la ligne, segment dans son ensemble, de sorte que vous finirez par le stockage de p et p+1 pour chacun de vos VB éléments, plus le coût de la duplication des indices/vertices (en fonction de la topologie utilisée et si vous rendre votre ligne indexée primitive ou pas).
Si la performance n'est pas un problème, faire de l'étendre sur le CPU est peut-être le chemin à parcourir.
EDIT:
Sur les motifs en pointillés: vous pouvez utiliser une géométrie shader trop afin d'émuler la
glLineStipple
comportement.Si vous avez un
GL_LINES
topologie, c'est-à-dire des lignes isolées, le motif redémarre à chaque nouveau segment de ligne. Si vous avez juste à calculer dans le geometry shader l'écran de l'espace de départ horizontale (ou verticale démarrer, en fonction de l'orientation de votre segment de ligne et de passer ce supplément d'infos pour le pixel shader. Le pixel shader sera ensuite responsable de la mise au rebut des fragments en fonction de la facteur et modèle valeurs (DirectX 10/11 Entier et bit-à-Bit instructions de facile).De nouveau cela fonctionne bien, et vous pouvez les combiner avec des émules largeur de lignes (avec la première technique mentionnée ci-dessus).
Maintenant, si vous avez
GL_LINE_STRIP
topologie, le motif redémarre à chaque nouvelle primitive (donc pour chaque nouvel appel). La situation devient un peu plus compliqué car vous avez besoin de connaître le nombre de pixels qui ont été rendues avant, et ce pour chaque segment de ligne.Vous pouvez le faire avec le rendu de votre ligne de la bande temporaire du VB à l'aide de DirectX 10 flux de fonctionnalité (chaque élément de cette VB correspond à l'écran-l'espace de la longueur de chaque segment). Ensuite, vous devez faire un Parallèle Préfixe Somme (aka Scan) de cette VB (pour l'accumulation de chaque ligne de la longueur du segment de valeurs).
Enfin, vous effectuez le rendu de votre ligne de la bande, comme pour
GL_LINES
mais l'utilisation de ce supplément de Balayage VB informations dans le PS.OriginalL'auteur Stringer
Épaisseur de la ligne est non seulement pas pris en charge par Direct3D, mais elle n'est appuyée par aucune existant actuellement GPU. Il n'y a pas de GPU que je suis conscient de que pouvez même dessiner des lignes appropriées à tous (ils sont tous faux lignes par dégénérer en utilisant des polygones, les deuxième et troisième sommets sont à la même position, de sorte que le triangle essentiellement réduit à une seule ligne).
Alors qu'il est possible de définir une largeur de ligne en OpenGL, OpenGL pilote crée extrudé quads (qui ne sont pas pris en charge et de courant GPU, et émulées à l'aide de deux triangles pour chaque quad) de dessiner les "lignes" sur l'écran.
Donc il n'y a probablement pas de sens autour de la création d'extrudé quads à cette fin. Il existe plusieurs façons de faire, et comme Stringer Bell a expliqué dans sa réponse.
La manière la plus simple qui fonctionne pour moi est de créer un vertex buffer qui contient chaque sommet en deux fois, avec les normales de pointage "de droite" ou "gauche", selon qu'ils sont le bord droit ou gauche de la ligne. Alors très simple de vertex shader peut effectuer le processus d'extrusion (en changeant la position du vertex par un multiple de son vecteur normal). De cette façon, vous pouvez rapidement modifier la largeur de la ligne, sans avoir à recalculer votre géométrie sur le CPU. Cela peut être utile si vous souhaitez ajuster la largeur de la ligne en fonction de la taille de l'objet ou de la distance.
Je n'ai pas le vérifier par pixel, mais pour la texture, l'anticrénelage de lignes les résultats devraient être assez similaires. À l'aide d'une texture (pour émuler d'OpenGL stipple modèles, par exemple) est tout à fait sûr de vous dans un monde de douleur, avec des non-linéaire interpolation de coordonnées de texture (NVidia Quadros gérer étonnamment mauvais, même par rapport à la plupart des cas identiques Geforce partie). Le shader doit effectuer un grand nombre de supplémentaires pour obtenir le texcoords droit.
Vous pouvez essayer vous-même, il suffit d'utiliser une sorte de "longueur de la ligne en pixels de l'écran" pour les coordonnées de la texture et de tracer la ligne(s) avec une texture qui a un pattern. Vous serez surpris de voir comment inégale le motif est. Au moins je l'ai été. 😉
OriginalL'auteur Pepor
"La ID3DXLine implémente l'interface de ligne de dessin à l'aide de triangles texturés."
OriginalL'auteur Sam
Au sujet de votre type de trait (pointillés) de la question, votre meilleur pari est probablement pour rendre la ligne comme un mince d'un quad et d'appliquer une texture à elle dans le pixel shader, où la texture contient votre motif en pointillé. Vous aurez besoin de mettre de l'échantillonneur mode d'adresse retour à la ligne, quelque chose comme:
OriginalL'auteur Justin R.