opengl - delvis overdækket glut-vindue trækkes ikke korrekt op efter det er afdækket

Indlæg af Hanne Mølgaard Plasc

Problem



Brug gratis glut Windows 7 Home Ultimate med videokort ati mobilitet radeon 5650


kodestykke:


void ResizeFunction(int width, int height)
{
    glViewport(0, 0, width, height);
}

 void RenderFunction()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL\_COLOR\_BUFFER\_BIT | GL\_DEPTH\_BUFFER\_BIT);
    //...drawing code based on some flag, I draw a triangle or a rectangle
    //the flag is toggled on pressing 't' or 'T' key
    glutSwapBuffers(); //double buffering is enabled
    glutPostRedisplay();
}

void KeyboardFunction(unsigned char key, int x, int y)
{
    switch(key)
    {
        case 't':
        case 'T':
        {
            flag = !flag;
            glutPostRedisplay();
            break;
        }
        default:
            break;
    }
}


Problem: Trianglen eller rektanglet er tegnet for hele vinduet første gang. Men hvis jeg delvist dækker glut-vinduet med et andet vindue (siger med et lille notisblokvindue) og derefter afdækker det, efterfølgende, når jeg skifter, er objektet kun trukket i den overdækkede del af glut-vinduet. Hvis jeg forstørrer glut-vinduet, fungerer tegningen korrekt som før.


Enhver hjælp vil blive værdsat.


hilsen,
fs

Bedste reference


Glut kun redraws på skærmen, når du fortæller det eller når det beslutter. Det vil sige, hvis du ikke gør noget i vinduet, bliver scenen ikke omlagt. Fordel ved dette: mindre cpu/gpu-brug. Ulempe: Kun god til ikke-animerede applikationer.


Hvis du vil opdatere skærmen hele tiden (hvilket er det, der gøres i applikationer med mange animationer (spil for eksempel)), kan du bruge glutIdleFunc


http://www.opengl.org/resources/libraries/glut/spec3/node63.html[8]


Det er i begyndelsen af ​​programmet, når du indstiller alle funktioner til glut, skriver du også:


glutIdleFunc(RenderFunction);


På denne måde, når glut er inaktiv, holder den op med at kalde din renderfunktion.


Hvis du vil gøre langsommere end muligt (for eksempel med en fast billedfrekvens), kan du bruge en timer:


void RenderFunction()
{
    glutTimerFunc(YOUR\_DELAY\_IN\_MS, RenderFunction, 0);
    /* rest of code */
}


og i stedet for glutIdleFunc(RenderFunction); skriver du


`glutTimerFunc(YOUR\_DELAY\_IN\_MS, RenderFunction, 0);`


For blot at ringe til renderingsfunktionen en gang (du kan også bare skrive RenderFunction() en gang), og funktionen holder indstilling af timeren til næste runde.


Som en sidebesked foreslår jeg at bruge SDL i stedet for glut.