2010-10-05 7 views
2

Je réalise un dessin 2D dans une fenêtre d'encombrement et j'ai du mal à redimensionner correctement la fenêtre.Redimensionnement de la fenêtre d'encombrement

Mon glutDisplayFunc et glutReshapeFunc sont ci-dessous. Comme c'est le cas, le dessin disparaît lorsque la fenêtre est redimensionnée. Si je supprime glClear() de displayFunc(), les nouveaux pixels ne sont pas "initialisés" et il y a des problèmes d'écrêtage. Comment puis-je réparer ça?

glutDisplayFunc:

void displayFunc() { 
    glDisable(GL_DEPTH_TEST); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glPointSize (3.0); 
    glFlush(); 
} 

glutReshapeFunc:

void windowReshapeFunc(GLint newWidth, GLint newHeight) { 
    glViewport(0, 0, newWidth, newHeight); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, GLdouble (newWidth), 0, GLdouble (newHeight)); 

    windowWidth = newWidth; 
    windowHeight = newHeight; 
} 

Répondre

1

Je vais essayer d'ajouter un appel à glutPostRedisplay() vers la fin de votre fonction Reshape.

+0

Merci pour la réponse, mais cela ne semble pas aider. Pouvez-vous expliquer pourquoi vous vous y attendez? – obh

+1

L'affichage est mis à jour après le redimensionnement de la fenêtre. En regardant plus attentivement, cependant, le seul dessin réel que vous avez dans votre fonction d'affichage efface l'écran, donc je ne m'attendrais à rien d'autre. Je suppose que vous avez un dessin ailleurs, ce qui ne devrait vraiment pas être le cas. –

+0

Diaply EST mis à jour chaque fois que le remodelage est appelé, ce n'est pas le point, obh s'il vous plaît poster votre code complet afin que nous puissions voir ne pas deviner. –

0

Je suppose que votre code ne dessine pas tout sur la scène dans la fonction d'affichage, vous voyez, si aucun événement ne se produit, vous devez appeler l'affichage une fois et dans la première fois qu'il a votre dessin. Mais votre problème augmente quand il y a un événement qui dit que la fenêtre est redimensionnée! essayez de mettre votre partie de dessin dans la fonction d'affichage. Comme si,

void displayFunc() { 
    glDisable(GL_DEPTH_TEST); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glPointSize (3.0); 
    glBegin(GL_POINTS); 
    { 
      //Blah blah blah some points here which you expect to draw 
    } 
    glEnd(); 
    glFlush(); 
} 

S'il vous plaît signaler le code complet si cela n'a pas été utile.

1

Vous ne définissez pas le mode de matrice sur GL_MODELVIEW à la fin de votre fonction de refaçonnage.

void reshape(int width, int height) { 
    glViewport(0,0,width,height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, GLdouble (width), 0, GLdouble (height)); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

Il est difficile de dire s'il y a quelque chose d'autre dans votre fonction d'affichage sans voir plus de code. J'espère que ça aide.

1

Vous ne pouvez pas appeler gluOrtho2D deux fois avec la même fenêtre, cela va casser les graphiques et rien ne s'affiche. Vous devez initialiser la taille de la fenêtre et régler Ortho sur la taille de l'écran (résolution d'affichage actuelle), puis dessiner par rapport à la taille de la fenêtre.

0

Ce modèle de base est que je l'utilise ...

#include <GL/glut.h> 
#include <stdio.h> 
#include <stdarg.h> 

#define WINDOW_WIDTH 300 
#define WINDOW_HEIGHT 300 

// current Window width and height 
int win_width, win_height; 

void display() 
{ 
    glClearColor(0, 0, 0, 0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    // write your code here 
    // 
    // 

    glutSwapBuffers(); 
} 

void on_resize(int w, int h) 
{ 
    win_width = w; 
    win_height = h; 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-w/2, w/2, -h/2, h/2, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    display(); // refresh window. 
} 

void main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 
    glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
    glutCreateWindow("basic resize template"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(on_resize); 

    glutMainLoop(); 
} 
Questions connexes