Частично закрытое окно перенасыщения не перерисовывается правильно после того, как оно открыто
Использование свободного перенасыщения на 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;
}
}
Проблема: Треугольник или прямоугольник рисуется, покрывая все окно в первый раз. Но если я частично прикрываю окно перенасыщения другим окном (скажем, некоторым окном блокнота), а затем открываю его, впоследствии, когда я переключаюсь, объект рисуется только в закрытой части окна перенасыщения. Если я изменю размер окна перенасыщения, рисунок будет работать правильно, как и раньше.
Любая помощь будет оценена.
С уважением, FS
1 ответ
Переизбыток перерисовывается только на экране, когда вы говорите это или когда это решает. То есть, если вы ничего не делаете в окне, сцена не перерисовывается. Преимущество этого: меньше использования процессора / графического процессора. Недостаток: хорошо только для не анимированных приложений.
Если вы хотите постоянно обновлять экран (что и делается в приложениях с большим количеством анимаций (например, в играх)), вы можете использовать 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 вместо перенасыщения.