📜  opengl sdl 调整窗口大小 (1)

📅  最后修改于: 2023-12-03 15:18:07.622000             🧑  作者: Mango

使用OpenGL和SDL调整窗口大小

OpenGL是一种图形库,用于处理3D图形。SDL (Simple DirectMedia Layer)是一个跨平台的多媒体库,可用于创建游戏和其他应用。在此介绍如何使用OpenGL和SDL调整窗口大小。

环境准备

在开始之前,需要安装以下软件:

  • OpenGL
  • SDL

您可以按照官方说明进行安装。

创建窗口

要使用OpenGL和SDL创建窗口,请使用以下代码:

#include <SDL2/SDL.h>
SDL_Window* window;
SDL_GLContext context;
bool init() {
    bool success = true;
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
        printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
        success = false;
    } else {
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
        window = SDL_CreateWindow("Window title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
        if (!window){
            printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
            success = false;
        } else {
            context = SDL_GL_CreateContext(window);
            if (!context){
                printf("OpenGL context could not be created! SDL_Error: %s\n", SDL_GetError());
                success = false;
            } else {
                glewExperimental = GL_TRUE;
                GLenum glewError = glewInit();
                if (glewError != GLEW_OK){
                    printf("Error initializing GLEW! %s\n", glewGetErrorString(glewError));
                }
                glViewport(0, 0, 800, 600);
            }
        }
    }
    return success;
}

上面的代码将创建一个800x600的窗口,并为OpenGL创建一个上下文。可以根据需要更改窗口大小。

调整窗口大小

要调整窗口大小并重新绘制OpenGL场景,请使用以下代码:

void resize(int width, int height) {
    glViewport(0, 0, width, height);
    //对OpenGL场景进行重新绘制
}

glViewport函数定义了视口区域的大小和位置。在上面的示例中,我们将其设置为整个窗口的大小。稍后将更新OpenGL场景。

通过SDL监听SDL_WINDOWEVENT_SIZE_CHANGED事件的发生,可以在窗口大小更改之后调整窗口大小。例如:

bool quit = false;
SDL_Event e;
while (!quit) {
    while (SDL_PollEvent(&e)) {
        switch (e.type) {
            case SDL_QUIT:
                quit = true;
                break;
            case SDL_WINDOWEVENT:
                if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
                    int w, h;
                    SDL_GetWindowSize(window, &w, &h);
                    resize(w, h);
                }
                break;
        }
    }
    //现在,重新绘制OpenGL场景
    SDL_GL_SwapWindow(window);
}

上面的代码在每次窗口大小更改时调用resize函数,并在重新绘制OpenGL场景后调用SDL_GL_SwapWindow函数进行双缓冲交换。

总结

通过了解如何使用OpenGL和SDL创建窗口并通过响应SDL_WINDOWEVENT_SIZE_CHANGED事件调整窗口大小和重新绘制OpenGL场景,您可以创建一个具有可调整大小功能的基本OpenGL应用程序。

参考文献
  • SDL官方网站:https://www.libsdl.org/
  • OpenGL官方网站:https://www.opengl.org/
  • SDL教程:http://lazyfoo.net/tutorials/SDL/index.php
  • OpenGL教程:https://learnopengl.com/