2017-03-12 2 views
-1

J'utilise PyOpenGL et GLUT pour dessiner un carré qui se déplace dans un cercle. Je n'efface pas l'écran après avoir dessiné des carrés, car je désire un effet traînant. Pour une raison quelconque, les carrés qui ont déjà été dessinés bougeront lorsque de nouveaux seront dessinés.Comportement de pixellisation OpenGL étrange

Notez que le pixel supplémentaire dans le trait des carrés est et non le problème. C'est le fait que la trace des carrés n'est pas statique.

Here est un exemple de l'effet

Je fournir le code que je pense est pertinent. Tout d'abord, le code que j'utilise pour initialiser la fenêtre:

glutInit() 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH) 
glutInitWindowSize(width, height) 

En second lieu, ce morceau de code est appelé une fois avant chaque carré en cours d'élaboration.

glLoadIdentity() 
glViewport(0, 0, width, height) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
glOrtho(0.0, width, 0.0, height, 0.0, 1.0) 
glMatrixMode(GL_MODELVIEW) 
glLoadIdentity() 

En troisième lieu, le dessin réel de la place

def rect_fill(x, y, w, h): 
    glBegin(GL_QUADS) 
    glVertex2f(x, y) 
    glVertex2f(x + w, y) 
    glVertex2f(x + w, y + h) 
    glVertex2f(x, y + h) 
    glEnd() 

def rect_stroke(x, y, w, h, lw): 
    lw = lw/2 
    glBegin(GL_LINES) 
    glVertex2f(x - lw, y) 
    glVertex2f(x + w + lw, y) 

    glVertex2f(x + w, y - lw) 
    glVertex2f(x + w, y + h + lw) 

    glVertex2f(x + w + lw, y + h) 
    glVertex2f(x - lw, y + h) 

    glVertex2f(x, y + h + lw) 
    glVertex2f(x, y - lw) 
    glEnd() 

Je suis dans ce domaine depuis un certain temps, et n'ont pas été en mesure de trouver quelqu'un avec des problèmes similaires. Merci pour toute aide.

+0

Sauf 'width == height',' lw' ne sera pas le même pour les axes x et y. – BDL

+0

J'ai modifié la question pour clarifier que le pixel supplémentaire n'est pas le problème. –

+0

Pourquoi les downvotes? S'il vous plaît laissez un commentaire si vous avez downvoted. –

Répondre

0

La question est la ligne

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH) 

GLUT_DOUBLE Active le double buffering. La double mise en mémoire tampon fournit deux tampons de couleurs complets à utiliser dans le dessin. Un tampon est affiché pendant que l'autre tampon est dessiné. Lorsque le dessin est terminé, les deux tampons sont échangés de sorte que celui qui était en train d'être visualisé est maintenant utilisé pour le dessin.

C'est ce qui provoque ce changement impair entre deux carrés différents effet.

+1

Pourriez-vous expliquer comment le double tampon pourrait causer ces artefacts? Le plus probable est que ces pixels supplémentaires ne sont pas pris en compte lors du calcul des décalages lors du rendu des traits (ou que vous ne tenez pas compte des centres de pixels, ce qui est impossible à dire car vous ne montrez pas avec quels paramètres vous appelez 'rect_stroke'). – BDL

+0

Donc, mon problème n'était pas le pixel supplémentaire. C'était le fait que la trace des carrés dessinés n'était pas statique. C'est clairement «gémissant» ou «tremblant», ce que je trouvais bizarre parce que ces carrés avaient déjà été dessinés et n'étaient pas modifiés davantage. Le double tampon était la cause parce que, un carré serait dessiné, alors le tampon échangerait, et je ne verrais pas le premier carré que j'ai dessiné. Autrement dit, chaque carré serait sur un seul tampon, mais pas les deux. –

+1

Je suis d'accord avec @EnricoBorba. L'effet de "tremblement" est dû au fait de dessiner des tampons alternatifs sans les effacer. Cela peut être évité en stockant chaque tampon déjà dessiné dans une texture et en dessinant cette texture dans chaque image avant le nouveau carré. De cette façon, la double mise en mémoire tampon peut être activée. – Ripi2