1

我正在使用 SDL 和 C++ 创建游戏,但是每当我尝试渲染位图时,我都会在运行时收到错误消息“OpenGL 处于活动状态,请使用 SDL_GL_SwapBuffers()。” 但问题是,我正在使用 SDL_GL_SwapBuffers()。这是代码:

绘图功能:

bool d2Sprite::Draw(SDL_Surface *dest, SDL_Surface *src, int x, int y)
{
if(dest == NULL || src == NULL)
{
    cout << "Unable draw sprite! " << SDL_GetError() << endl;
    return false;
}

SDL_Rect destR;
destR.x = x;
destR.y = y;

SDL_BlitSurface(src, NULL, dest, &destR);

return true;
}

游戏循环: void d2Main::GameLoop() { cout << "游戏循环运行!" <<endl;

d2Main::Load();
while(d2Main::gameRunning)
{
    while(SDL_PollEvent(&event))
    {
        d2Main::HandleEvents(&event);
    }

    d2Main::Update();

    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();

    d2Main::Render();
    SDL_UpdateRect(screen, 0, 0, 0, 0);
    glPopMatrix();
    SDL_GL_SwapBuffers(); // <-- I AM USING IT
    SDL_Delay(0.8);
}

SDL_Quit();
}
4

1 回答 1

1

在 SDL 源中搜索错误消息:

http://svn.libsdl.org/tags/SDL/release-1.2.10/src/video/SDL_video.c

它发生在这里:

void SDL_UpdateRects (SDL_Surface *screen, int numrects, SDL_Rect *rects)
{
    int i;
    SDL_VideoDevice *video = current_video;
    SDL_VideoDevice *this = current_video;

    if ( (screen->flags & (SDL_OPENGL | SDL_OPENGLBLIT)) == SDL_OPENGL ) {
        SDL_SetError("OpenGL active, use SDL_GL_SwapBuffers()");
        return;
    }

    //...

因此,您可能需要摆脱您的调用SDL_UpdateRects- 当您使用 OpenGL 时不支持它,除非您使用SDL_OPENGLBLIT标志。因此,作为替代方案,您可以设置标志。但是,请注意,AFAIK (a) 速度较慢,并且 (b) 不再受到官方支持。

于 2013-01-02T14:17:13.420 回答