Изменение размера окна приводит к чёрному экрану, SDL2 + OpenGL - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Собственно, вот такая проблема. Есть некоторое приложение, рисующее несколько 3D-фигур. Если не менять изначально заданный размер окна - всё прекрасно работает. Если изменить - всё. Всё что не относится к плоскому отображению (пока что для тестов тёмно-красный квадрат в углу) просто напросто исчезает. Чёрный экран. Попробовал добавить к обработчику изменения размеров gluPerspective... Ничего, в общем, хорошего: половина размеров дают тот же чёрный экран (остальная половина вроде как отображается) Сделал скринкапт, наглядно это демонстрирующий.
http://haont.16mb.com/server/demo6.zip http://youtu.be/w9pgIidDCtQ
Добавил SDL_GetWindowSize (замер размера окна) и ReadyMatrices (пересчёт матрицы) перед каждым выводом изображения, но, как я понимаю, это сильно скажется на производительности. Есть какие-либо лучшие решения?

Решение задачи: «Изменение размера окна приводит к чёрному экрану, SDL2 + OpenGL»

textual
Листинг программы
    if(event->type == SDL_WINDOWEVENT)
    {
        if(event->window.event == SDL_WINDOWEVENT_CLOSE)
            cont->quit = 1;
        if(event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
        {
            int r = 0;
            int w = event->window.data1;
            int h = event->window.data2;
 
            cont->windowWidth = w;
            cont->windowHeight = h;
            ReadyMatrices(cont);
        }
    }

Объяснение кода листинга программы

  1. Если тип события равен SDL_WINDOWEVENT
  2. Если событие окна закрытия (SDL_WINDOWEVENT_CLOSE)
  3. Если событие изменения размера окна произошло (SDL_WINDOWEVENT_SIZE_CHANGED)
  4. Объявляем переменные: а) r (0) б) w (event->window.data1) в) h (event->window.data2)
  5. Присваиваем новые размеры окна переменным w и h и сохраняем их в структуру cont
  6. Вызываем функцию ReadyMatrices(cont)   Пояснение:
    • В данном коде мы обрабатываем два возможных события, которые могут произойти с окном: закрытие и изменение размера.
    • Если произошло событие закрытия окна, то мы устанавливаем флаг quit в 1, что приведет к выходу из программы.
    • Если произошло событие изменения размера окна, то мы сохраняем новые размеры в структуре cont и вызываем функцию ReadyMatrices(cont). Эта функция, скорее всего, занимается подготовкой матриц для дальнейшей работы с OpenGL.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы