【问题标题】:Resizing window using SDL and OpenGL使用 SDL 和 OpenGL 调整窗口大小
【发布时间】:2018-03-18 05:31:29
【问题描述】:

在写这个问题之前,我已经阅读了这个问题:Handling window resizing using OpenGL and SDL。然而,这个问题并没有解决我的问题,因为我使用的是 SDL2 而不是 SDL1.2。但我确实使用 OpenGL2。我的完整源代码位于:http://dpaste.com/17BVBP6

我正在编写一个在窗口中显示一个白色方块的程序。但是我在处理窗口调整大小事件时遇到了问题。这是我的调整大小函数:

void resize(int width,int height)
{
    if(height<=0)    height=1;

    glViewport(0,0,(GLsizei)width,(GLsizei)height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0f,float(width)/float(height),1.0f,100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

我的主事件循环:

while( !quit )
        {
            while( SDL_PollEvent( &e ) != 0 )
            {
                switch (e.type) {
                case SDL_QUIT:
                    quit=true;
                    break;
                case SDL_WINDOWEVENT_SIZE_CHANGED:
                    resize(e.window.data1,e.window.data2);
                    break;
                case SDL_KEYDOWN:
                    switch (e.key.keysym.sym) {
                    case SDLK_ESCAPE:
                        quit=true;
                        break;
                    default:
                        break;
                    }
                default:
                    break;
                }
            }

            render();

            update(gWindow);
        }

这是我未调整大小时的窗口:

这是调整大小后的窗口:

这里出现问题的原因是什么?

【问题讨论】:

    标签: opengl sdl sdl-2 opengl-2.0


    【解决方案1】:

    SDL_WINDOWEVENT_SIZE_CHANGED 不是事件类型,它是SDL_WINDOWEVENT 的变体。你的事件检查应该是这样的

    switch(e.type) {
        case SDL_WINDOWEVENT:
            if(e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
                resize(e.window.data1,e.window.data2);
            }
            break;
    

    同时删除您的透视投影设置 - 它与您的绘图不一致,并且您在调整大小之前没有透视设置。

    【讨论】:

    • 谢谢!这解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2015-05-23
    • 1970-01-01
    • 2019-06-11
    • 2011-11-04
    相关资源
    最近更新 更多