Полное руководство по изменению размера окна OpenGL с помощью SDL

Изменение размера окна является распространенным требованием в приложениях OpenGL, поскольку оно позволяет пользователям настраивать размеры области просмотра рендеринга в соответствии со своими предпочтениями. В этой статье мы рассмотрим несколько методов изменения размера окна OpenGL с использованием библиотеки SDL (Simple DirectMedia Layer). Мы предоставим примеры кода, чтобы продемонстрировать каждый метод и помочь вам понять детали реализации. Давайте погрузимся!

Метод 1: обработка событий изменения размера окна

Один из способов изменения размера окна OpenGL — обработка событий изменения размера окна, предоставляемых SDL. Следующий фрагмент кода демонстрирует, как это сделать:

#include <SDL2/SDL.h>
#include <GL/glew.h>
#include <GL/gl.h>
SDL_Window* window;
SDL_GLContext context;
void handleResize(int width, int height) {
    // Update OpenGL viewport and projection matrix
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    // ... additional projection matrix setup if needed
    glMatrixMode(GL_MODELVIEW);
}
int main() {
    // SDL and OpenGL initialization code...
    while (!quit) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                quit = true;
            } else if (event.type == SDL_WINDOWEVENT) {
                if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
                    int width = event.window.data1;
                    int height = event.window.data2;
                    handleResize(width, height);
                }
            }
        }
// OpenGL rendering code...
    }
// Cleanup code...
    return 0;
}

Метод 2: изменение размера окна вручную

Другой подход — вручную изменить размер окна с помощью API SDL. Вот пример того, как этого добиться:

#include <SDL2/SDL.h>
#include <GL/glew.h>
#include <GL/gl.h>
SDL_Window* window;
SDL_GLContext context;
void resizeWindow(int width, int height) {
    SDL_SetWindowSize(window, width, height);
    SDL_GL_GetDrawableSize(window, &width, &height);
    handleResize(width, height);
}
int main() {
    // SDL and OpenGL initialization code...
    while (!quit) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                quit = true;
            } else if (event.type == SDL_KEYDOWN) {
                if (event.key.keysym.sym == SDLK_r) {
                    resizeWindow(800, 600); // Example: resizing to 800x600
                }
            }
        }
// OpenGL rendering code...
    }
// Cleanup code...
    return 0;
}

Метод 3: переключение между полноэкранным и оконным режимами

SDL позволяет переключаться между полноэкранным и оконным режимами, что косвенно влияет на размер окна. Вот как этого можно добиться:

#include <SDL2/SDL.h>
#include <GL/glew.h>
#include <GL/gl.h>
SDL_Window* window;
SDL_GLContext context;
bool fullscreen = false;
void toggleFullscreen() {
    fullscreen = !fullscreen;
    SDL_SetWindowFullscreen(window, fullscreen ? SDL_WINDOW_FULLSCREEN : 0);
    SDL_SetWindowSize(window, 800, 600); // Example: resetting to 800x600 after switching modes
    handleResize(800, 600);
}
int main() {
    // SDL and OpenGL initialization code...
    while (!quit) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                quit = true;
            } else if (event.type == SDL_KEYDOWN) {
                if (event.key.keysym.sym == SDLK_f) {
                    toggleFullscreen();
                }
            }
        }
// OpenGL rendering code...
    }
// Cleanup code...
    return 0;
}

В этой статье мы рассмотрели различные методы изменения размера окна OpenGL с помощью SDL. Мы рассмотрели обработку событий изменения размера окна, изменение размера окна вручную и переключение между полноэкранным и оконным режимами. В зависимости от ваших конкретных требований вы можете выбрать метод, который лучше всего соответствует вашим потребностям. Не забудьте включить необходимые обновления области просмотра OpenGL и матрицы проекции при каждом изменении размера окна, чтобы обеспечить правильный рендеринг. Получайте удовольствие, экспериментируя с изменением размера окон в ваших приложениях OpenGL!