2 votes

C : Glut ne rafraîchit pas la fenêtre, pourquoi ?

J'essayais d'afficher un triangle simple avec seulement 2 faces, mais quand je l'exécute, en essayant de faire tourner le triangle, il n'y a tout simplement aucun rafraîchissement :( (le rafraîchissement se fait uniquement lorsque je passe en plein écran, ou que je réduis et agrandis à nouveau)

mon code :

#include 
#include 
#include 
#include //inutile mais j'en aurai bientôt besoin.

float rotx, roty = 0.0f;

char srotx[40];

int win;

void display()
{

    glViewport(0,0,1000,800);

    glBegin(GL_QUADS);
    glColor3f(0.5,0,0);
    glVertex3f(0.5,0.5,0);
    glColor3f(0,0.5,0);
    glVertex3f(-0.5,0.5,0.5);
    glColor3f(0,0,0.5);
    glVertex3f(0,-0.5,0.5);
    glColor3f(0.5,0.5,0);
    glVertex3f(-0.5,0.5,-0.5);
    glEnd();

    glRotatef(rotx,1.0f,0.0f,0.0f);
    glRotatef(roty,0.0f,1.0f,0.0f);

    glutSetWindowTitle(srotx);//ne fonctionne pas
    glutSwapBuffers();

}

void BindInput(unsigned char key, int Mx, int My)
{
    switch(key)
    {
        case 'z' :
            rotx += 0.2f;
            break;
        case 's' :
            rotx -= 0.2f;
            break;
        case 'd' :
            roty += 0.2f;
            break;
        case 'q' :
            roty -= 0.2f;
            break;
    }

    if(key == 27)
    {
        glFinish();
        exit(0);
    }
    if(rotx >= 360.0f || key == 'a' || roty >= 360.0f)
    {
        glutPostWindowRedisplay(win);//test...
        rotx = 0.0f;
        roty = 0.0f;
    }
    glutPostRedisplay();
}

int main(int argc, char* argv[])
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(1000,800);

  sprintf(srotx, "DEBUG Mayo Test, rotx : %f", rotx);
  win = glutCreateWindow(srotx);
  glutSetCursor(GLUT_CURSOR_DESTROY);
  glEnable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  glutDisplayFunc(display);
  glutIdleFunc(display);
  glutKeyboardFunc(BindInput);
  glutMainLoop();

  return 0;

}

captures d'écran : Départ rotation, pas de rafraîchissement

aussi le tasks.json :

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: gcc générer le fichier actif",
            "command": "/usr/bin/gcc",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-lglut",
                "-lGLU",
                "-lGL"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Tâche générée par le débogueur."
        },
    ],
    "version": "2.0.0"
}

J'ai essayé de chercher sur internet mais tout ce que j'ai trouvé ne fonctionnait tout simplement pas.

Utilisation de Xubuntu 22.04 (X11) sur Visual Studio code. Merci d'avance pour toute réponse.

2voto

Oka Points 10710

En réduisant cet exemple :

En déplaçant glutPostRedisplay vers une fonction de rappel idle, et en utilisant glClear dans la fonction de rappel d'affichage, cela semble donner quelque chose approchant un résultat.

#include 
#include 

static float rotx, roty;

static void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glViewport(0, 0, 1000, 800);

    glBegin(GL_QUADS);
    {
        glColor3f(0.5, 0, 0);
        glVertex3f(0.5, 0.5, 0);

        glColor3f(0, 0.5, 0);
        glVertex3f(-0.5, 0.5, 0.5);

        glColor3f(0, 0, 0.5);
        glVertex3f(0, -0.5, 0.5);

        glColor3f(0.5, 0.5, 0);
        glVertex3f(-0.5, 0.5, -0.5);
    }
    glEnd();

    glRotatef(rotx, 1.0f, 0.0f, 0.0f);
    glRotatef(roty, 0.0f, 1.0f, 0.0f);

    glutSwapBuffers();
}

static void idle(void)
{
    glutPostRedisplay();
}

static void input(unsigned char key, int x, int y)
{
    (void) x;
    (void) y;

    switch (key) {
        case 'z' :
            rotx += 0.2f;
            break;
        case 's' :
            rotx -= 0.2f;
            break;
        case 'd' :
            roty += 0.2f;
            break;
        case 'q' :
            roty -= 0.2f;
            break;
    }

    if (27 == key) {
        glFinish();
        exit(0);
    }

    if ('a' == key || rotx >= 360.0f || roty >= 360.0f) {
        rotx = 0.0f;
        roty = 0.0f;
    }
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(1000, 800);

    glutCreateWindow("example"); // this leaks

    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);

    glutDisplayFunc(display);
    glutIdleFunc(idle);
    glutKeyboardFunc(input);

    glutMainLoop();
}

object spinning

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X