2010-12-14 83 views
3

Je dessine quelque chose de similaire à un VU-mètre LED dans OpenGL. Résultat devrait être comme sur la barre verticale de celle-ci:Lignes de dessin OpenGL 2D qui ne correspondent pas exactement à Pixel raster

Animated vumeters

Malheureusement, mon espace de dessin est limité, et je dois adapter exactement 18 barres sur elle. Cela donne un espacement entre les barres de 3,6 pixels. Une fois dessiné, cela provoque des différences visibles dans les espaces entre les lignes, car les espaces sont de 2 ou 1 pixel de large. Je suis à la recherche d'une solution pour utiliser le rendu sous-pixel et "fausser" les lignes par un anti-aliasing de sorte que toutes les lacunes apparaissent de la même largeur.

Ceci est mon code jusqu'à présent

glEnable(GL_LINE_SMOOTH); 
glHint(GL_LINE_SMOOTH, GL_NICEST); 
for (int i = 0; i < 18; ++i) { 
      float bBottom = barBottom + i*3.6f; 
      glBegin(GL_LINES); 
      glLineWidth(2); 
      glVertex2f(bRight,bBottom); 
      glVertex2f(bLeft,bBottom); 
      glEnd(); 
} 
glDisable(GL_LINE_SMOOTH); 

Malheureusement, le lissage tournant de ligne a montré aucun effet visible. Aucune suggestion?

+1

Arrondis les valeurs de pixels aux entiers. –

+2

'GL_LINE_SMOOTH' n'est pas supporté par toutes les implémentations. Et je suis d'accord avec @Matt Ball que vous devriez arrondir les lignes aux pixels intégrés, et dessiner une ligne de démarcation ou simplement laisser un espace en haut (d'environ 10px dans ce cas). – gavinb

+0

+1 pour l'animation –

Répondre

0

Si vous ne pouvez pas activer l'antialiasing pour votre contexte OpenGl, vous pouvez l'émuler - c'est simple avec des graphismes aussi simples. Lorsque vous avez besoin de dessiner un rectangle de 10,6 pixels de haut, dessinez-en 10 pixels avec sa couleur puis une ligne de pixel intermédiaire de couleur intermédiaire (0,6 de couleur rectangle et 0,4 de couleur de fond).

+1

Selon l'alignement du sous-pixel du moniteur, cela ne fonctionnera que dans une direction, la plus probable étant la verticale. OpenGL n'est pas vraiment utile pour ce genre de choses, c'est-à-dire des graphiques vectoriels de haute qualité. Il est avant tout pensé à pousser des triangles d'objets 3D tesselés sur l'écran. – datenwolf

+0

Vous n'avez jamais entendu parler de "l'alignement sous-pixel du moniteur", qu'est-ce que c'est? – alxx

+0

La disposition des différents points rouges/verts/bleus sur l'écran LCD - ils ne sont pas au même endroit. Il est principalement utilisé dans l'antialiasing de police de haute qualité (ClearType etc). – Kos

1

Utilisez le multi-échantillonnage (Multisampling specs).

De plus, j'utiliserais des quads (et non des lignes) pour rendre ces blocs.

3

Deux idées:

  1. Dessiner tous les bars à une grande de texture de l'écran de telle sorte que les lacunes et les largeurs sont tous égaux, puis utilisez le filtrage bilinéaire pour blit le résultat à la position de l'écran et la taille nécessaires. Obtenez un artiste pour dessiner toutes les barres complètement éclairées afin que le bon aspect, puis dessinez des rectangles noirs avec un canal alpha à partir du haut de chaque barre vers le bas pour assombrir les parties nécessaires de l'image.

+0

+1. Facile et robuste. – alxx