Я скопировал ваш код и постараюсь объяснить, что происходит построчно.Это должно помочь вам не только понять, почему экран гаснет после изменения размера, но и помочь вам удалить ненужные элементы.
void ResizeWindow()
{
Эти следующие строки хороши!Вы получили новые ширину и высоту экрана из события изменения размера.Я предполагаю, что событие доступно в этот момент в вашем коде.
screen_width = event.resize.w;
screen_height = event.resize.h;
Я сомневаюсь, что вам нужен этот вызов SDL_SetViedoMode
.Я ожидаю, что он будет использоваться только при настройке окна OpenGL.У меня нет опыта использования SDL, поэтому я не уверен.Я быстро просмотрел документацию, и это, кажется, поддерживает ее использование так, как я ожидал.
SDL_SetVideoMode(screen_width, screen_height, bpp, SDL_OPENGL | SDL_RESIZABLE | SDL_DOUBLEBUF);
Теперь перейдем к интересным вещам GL.Вы изменили размер области просмотра, что необходимо.
glViewport(0, 0, screen_width, screen_height);
Теперь вы создаете новую матрицу проекции для сохранения соотношения сторон (если я не ошибаюсь).Вы переключили матричный режим и настроили ортогональную проекционную матрицу, что разумно.
glMatrixMode(GL_PROJECTION);
glOrtho(0, screen_width, 0, screen_height, -1, 1);
Теперь вы устанавливаете проекционную матрицу на идентичность, перезаписывая старую проекционную матрицу OpenGL и отменив всю хорошую работуты сделал.Это причина, по которой экран погас.
glLoadIdentity();
Теперь вы переключаетесь на матрицу вида модели и устанавливаете ее на идентичность, которая на самом деле не нужна, если вы правильно ее устанавливаете в другом месте..
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Я сомневаюсь, что вам действительно нужна эта следующая строка.Почему вы хотите очистить экран после изменения размера?Вы действительно хотите перерисовать его, но я уверен, что ваша функция рисования очистит экран и нарисует объект, который будет вызываться автоматически после завершения обновления.
glClear(GL_COLOR_BUFFER_BIT);
И вам определенно не нужночтобы повторно установить текущую матрицу вида модели на идентичность во второй раз.OpenGL все еще находится в режиме просмотра модели, и эта матрица уже установлена на идентичность!Помните, что OpenGL - это конечный автомат!
glLoadIdentity();
}