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

6 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();
}
Run Code Online (Sandbox Code Playgroud)

主循环:

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();

}
Run Code Online (Sandbox Code Playgroud)

这一切都完美运行,直到窗口调整大小.

bat*_*rat 14

我复制粘贴你的代码,我将解释一行一行的内容.它不仅可以帮助您了解调整大小后屏幕显示为空白的原因,还可以帮助您删除不需要的内容.

void ResizeWindow()
{
Run Code Online (Sandbox Code Playgroud)

这些下一行很好!您已从resize事件中获取新的屏幕宽度和高度.我假设您的代码中此时可以访问该事件.

    screen_width = event.resize.w;
    screen_height = event.resize.h;
Run Code Online (Sandbox Code Playgroud)

我怀疑你需要这个电话SDL_SetViedoMode.我希望它只在设置OpenGL窗口时使用.我目前没有使用SDL的经验,所以我无法确定.我确实快速查看了文档,似乎支持按照我的预期使用它.

SDL_SetVideoMode(screen_width, screen_height, bpp, SDL_OPENGL | SDL_RESIZABLE | SDL_DOUBLEBUF);
Run Code Online (Sandbox Code Playgroud)

现在我们来看看有趣的GL内容.您已调整视口大小,这是必要的.

    glViewport(0, 0, screen_width, screen_height);
Run Code Online (Sandbox Code Playgroud)

现在,你正在制作一个新的投影矩阵来维持宽高比(除非我弄错了).您已切换矩阵模式并设置正交投影矩阵,这是明智的.

    glMatrixMode(GL_PROJECTION);
    glOrtho(0, screen_width, 0, screen_height, -1, 1);
Run Code Online (Sandbox Code Playgroud)

现在,您将投影矩阵设置为identity,覆盖旧的OpenGL投影矩阵并撤消您所做的所有好工作.这就是屏​​幕空白的原因.

    glLoadIdentity();
Run Code Online (Sandbox Code Playgroud)

现在,您切换到模型视图矩阵并将其设置为identity,这不是必需的,只要您在其他地方正确设置它.

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
Run Code Online (Sandbox Code Playgroud)

我怀疑你真的需要下一行.无论如何,为什么要在调整大小后清除屏幕?你确实想要重绘它,但我确定你的绘图功能将清除屏幕并绘制刷新完成后将自动调用的对象.

    glClear(GL_COLOR_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)

而且你绝对不需要重新设置当前的模型 - 视图矩阵以进行第二次识别.OpenGL仍然处于模型视图模式,并且该矩阵已经设置为标识!请记住,OpenGL是一个状态机!

    glLoadIdentity();
}
Run Code Online (Sandbox Code Playgroud)