Я хочу изменить цвет фона окна после нажатия кнопки, но моя программа не работает, может кто-то говорить мне почему, заранее спасибо
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(800, 600);
glutInitWindowPosition(300,50);
glutCreateWindow("GLRect");
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); <---
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutMainLoop();
system("pause");
glClearColor(0.0f, 1.0f, 0.0f, 1.0f); <---
return 0;
}
glClearColor
не выполняет никакой очистки - он просто устанавливает, каким будет цвет, когда вы действительно очистите. Чтобы выполнить саму очистку, вам необходимо вызвать glClear
с (как минимум) COLOR_BUFFER_BIT
.
Изменить: прошло довольно много времени с тех пор, как я использовал перенасыщение, поэтому детали этого могут быть неправильными, но если память не изменяет, чтобы изменить цвет экрана в ответ на нажатие клавиши на клавиатуре, вы бы сделали что-то вроде это:
void keyboard (unsigned char key, int x, int y)
{
// we'll switch between red and blue when the user presses a key:
GLfloat colors[][3] = { { 0.0f, 0.0f, 1.0f}, {1.0f, 0.0f, 0.0f } };
static int back;
switch (key) {
case 27:
exit(0);
default:
back ^= 1;
glClearColor(colors[back][0], colors[back][1], colors[back][2], 1.0f);
glutPostRedisplay();
}
}
void draw() {
glClear(GL_COLOR_BUFFER_BIT);
// other drawing here...
}
int main() {
// glutInit, glutInitDisplayMode, etc.
glutDisplayFunc(draw);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
По сути, вы делаете все свои рисунки в той функции, которую передаете glutDisplayFunc
. Почти все остальное просто изменяет состояние, а затем вызывает PostRedisplayFunc ();
, чтобы сообщить перенасыщению, что окно необходимо перерисовать. Предупреждение: как я уже сказал, я давно не использовал перенасыщение и не тестировал этот код. Насколько я помню, он показывает общую структуру программы перенасыщения, но не ожидайте, что она будет работать именно так, как есть.
Я полагаю, у вас нет контекста OpenGL в тот момент, когда вы вызываете glClearColor
.
Но ...
... Я никогда раньше не использовал перенасыщение, поэтому беглый взгляд на docs предполагает, что у вас действительно будет контекст после glutCreateWindow
, поэтому возможно, дело не в этом.
Как говорится в моем комментарии к вашему вопросу, мне интересно узнать о втором вызове glClearColor
и о том, как, по вашему мнению, вы его достигнете. Скорее всего, причина проблемы. Чтобы делать что-либо при нажатии клавиши, я считаю, что вам нужно зарегистрировать обратный вызов, используя glutKeyboardFunc
.