2011-03-28 4 views
0

est-il possible de tracer une ligne avec GLSL en utilisant GL_TRIANGLES?Tracer des lignes avec GLSL

La raison pour laquelle je demande est que j'essaie de tracer une ligne avec adobes molehill et il dessine seulement le triangle.

Vive

Répondre

3

si vous définissez bord rendu pour être, juste dessiner un triangle avec le point 1 et 3 à la même position. Ce n'est pas efficace, mais ça fonctionne.

+0

Impossible dans OpenGL moderne et OpenGL ES 2.0 afaik. – Bim

0

Si vous le pouvez, utilisez un shader de géométrie. Passer deux sommets et une largeur de ligne, générer 4 points formant deux triangles en déplaçant les sommets, rendre et être fait ... Mais dessiner des lignes larges en utilisant des triangles sans géométrie shader peut également être fait dans OpenGL ES 2.0 (pas de géométrie shaders) et OpenGL de bureau utilisant uniquement des vertex shaders:

Générez vos données de sommet pour dupliquer les sommets de chaque ligne (4 sommets par ligne). Pour chaque sommet, passez deux attributs vec2/vec3 supplémentaires pour les sommets de la ligne précédente et de la ligne suivante (pour calculer les jointures de ligne correctes) OU passez simplement la direction de la ligne vec2/vec3. Ajoutez également un attribut vertex flottant qui représente un "normal", une direction dans laquelle déplacer chaque sommet. Pour un point d'extrémité d'une ligne (qui utilise maintenant deux sommets), définissez le "normal" dans une direction et pour le sommet dupliqué dans la direction opposée. Générer des triangles de ces sommets (via l'indexation ou autre) et rendre avec GL_TRIANGLES.

Dans le vertex shader, utilisez le sommet et le sommet précédent ou suivant pour calculer une direction de ligne et (simple dans le cas 2D) générer un vecteur perpendiculaire à celui-ci. Multipliez cela par le "normal" que vous avez passé en tant qu'attribut de sommet. Cela va déplacer vos lignes "sur les côtés" de sorte qu'un triangle réel sera généré.

La génération de lignes ayant une taille de pixel correcte est simple en 2D (avec une mise à l'échelle uniforme, mais aussi possible avec une mise à l'échelle non uniforme) - utiliser le facteur d'échelle de la matrice de vue de modèle (eg modelView [0] [0]) et divisez votre largeur de ligne par celle-ci dans le vertex shader. En 3D, ceci est un peu plus impliqué ...

Il y a une bonne explication de la technique here, des exemples animés here et le code source here.

Questions connexes