opengl - 使用 OpenGL 和 SDL 处理窗口大小调整

标签 opengl sdl

根据我在应用程序窗口周围绘制和移动正方形的程序的代码,我在调整应用程序窗口大小时遇到​​了麻烦。当我相应地处理调整大小并更改状态时,屏幕上应该绘制并且在调整大小之前的所有内容都消失了。我不知道为什么,因为在调整窗口大小期间没有任何对象内部坐标发生变化。

我的问题是谁能指出我正确的方向来解决我的问题。(代码编译得很好)

void ResizeWindow()
{
    screen_width = event.resize.w;
    screen_height = event.resize.h;

    SDL_SetVideoMode(screen_width, screen_height, bpp, SDL_OPENGL | SDL_RESIZABLE | SDL_DOUBLEBUF);

    glViewport(0, 0, screen_width, screen_height);
    glMatrixMode(GL_PROJECTION);
    glOrtho(0, screen_width, 0, screen_height, -1, 1);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
}

主循环:
while (running == true)

{

    while(SDL_PollEvent(&event))

    {

        switch(event.type)

        {

            case SDL_VIDEORESIZE: ResizeWindow(); break; // resizing called here
            case SDL_QUIT: running = false; break;
            case SDL_KEYDOWN: square.Handle_Input(down); break;
            case SDL_KEYUP: square.Handle_Input(up); break;

        }

    }

    square.Move();
    square.Check_Collision();

    glClear(GL_COLOR_BUFFER_BIT);

    square.Draw();

    SDL_GL_SwapBuffers();

}

在调整窗口大小之前,这一切都运行良好。

最佳答案

您可能遇到的一个问题是,使用 SDL 调整窗口大小会创建一个新的 OpenGL 上下文,这意味着您之前上传的所有内容(纹理、顶点缓冲区对象)和您设置的状态(如顶点数组指针)都将丢失。如果使用 SDL,您需要重新初始化它们。如果要保留它们,请不要使用 SDL 进行窗口管理。我推荐 GLFW。


void ResizeWindow()

{

screen_width = event.resize.w;
screen_height = event.resize.h;

SDL_SetVideoMode(screen_width, screen_height, bpp, SDL_OPENGL | SDL_RESIZABLE | SDL_DOUBLEBUF);

glViewport(0, 0, screen_width, screen_height);
glMatrixMode(GL_PROJECTION);
glOrtho(0, screen_width, 0, screen_height, -1, 1);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

}

是初学者 OpenGL 代码中最常见的反模式。影响绘图的绘图命令和状态管理属于绘图功能。也就是以下内容:
glViewport(0, 0, screen_width, screen_height);
glMatrixMode(GL_PROJECTION);
glOrtho(0, screen_width, 0, screen_height, -1, 1);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

如果您想要一个健壮的 OpenGL 程序,请永远不要(仅)将它们放入调整大小处理程序中。它们属于其他绘图命令。

关于opengl - 使用 OpenGL 和 SDL 处理窗口大小调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9138559/

相关文章:

c++ - OpenGL 网格错误位置

opengl - 使用 ocamlbuild 构建 SDL 和 OpenGL 应用程序

c - 无法让 GLEW 工作

c++ - 使用 GL_QUADS 在侧面立方体上进行 OpenGL 纹理映射

java - JOGL 在 3d 立方体上使用 2d 纹理

c++ - 使用 Allegro/SDL 与 OpenGL/DirectX 制作游戏会遇到哪些限制?

opengl - 即使使用LoadLibrary和GetProcAddress,ChoosePixelFormat也会崩溃

c++ - 我有关于 'already been defined in game.obj'的错误。我该怎么办?

android - 使用 GLEW 为 Android 编译 SDL2

c++ - 在 'SDL_PollEvent'中测试 'while'的正确方法