частично закрытое окно перенасыщения не перерисовывается правильно - PullRequest
0 голосов
/ 29 августа 2011

Использование свободное перенасыщение на Windows 7 Home Ultimate с видеокартой ATI Mobility Radeon 5650

фрагмент кода:

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;
    }
}

проблема: треугольник или прямоугольник рисуется, покрывая все окно в первый раз.Но если я частично прикрываю окно перенасыщения другим окном (скажем, некоторым окном блокнота), а затем открываю его, впоследствии, когда я переключаюсь, объект рисуется только в закрытой части окна перенасыщения.Если я изменю размер окна перенасыщения, рисунок будет работать правильно, как и раньше.

Любая помощь будет оценена.

regards, fs

1 Ответ

1 голос
/ 04 сентября 2011

Glut перерисовывает только на экране, когда вы говорите или когда он решает. То есть, если вы ничего не делаете в окне, сцена не перерисовывается. Преимущество этого: меньше использования процессора / графического процессора. Недостаток: хорошо только для не анимированных приложений.

Если вы хотите постоянно обновлять экран (что и делается в приложениях с большим количеством анимаций (например, в играх)), вы можете использовать glutIdleFunc

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

То есть в начале программы, когда вы устанавливаете все функции для перенасыщения, вы также пишете:

glutIdleFunc(RenderFunction);

Таким образом, когда glut бездействует, он продолжает вызывать вашу функцию рендеринга.

Если вы хотите рендерить медленнее, чем это возможно (например, с фиксированной частотой кадров), вы можете использовать таймер:

void RenderFunction()
{
    glutTimerFunc(YOUR_DELAY_IN_MS, RenderFunction, 0);
    /* rest of code */
}

и вместо glutIdleFunc(RenderFunction); вы пишете

`glutTimerFunc(YOUR_DELAY_IN_MS, RenderFunction, 0);`

Для простого вызова функции рендеринга один раз (вы также можете просто написать RenderFunction() один раз), и функция продолжает устанавливать таймер для следующего запуска.

В качестве примечания я предлагаю использовать SDL вместо перенасыщения.

...