在OpenGL环境中使用SDL进行Blitting

Blitting with SDL in an OpenGL context

本文关键字:SDL 进行 Blitting OpenGL 环境      更新时间:2023-10-16

我是C++中的SDL和OpenGL。在MVSC++中,如果这很重要的话。

以下是我要做的:我想获取一个图像文件,并将其加载为SDL_Surface*。那部分我记下来了。我想做的最后一部分是使用SDL_Surface*并从中创建OpenGL纹理。这部分我也在工作。

中间部分是我遇到麻烦的地方。我想用原来的SDL_Surface*创建一个新的空白曲面,其尺寸是2的幂;然后,我将把原来的表面闪电打到这个新的表面上。不过,它只是给了我黑色;我怀疑要么闪电战没有发生,要么OpenGL无法从生成的曲面生成纹理。

这是给我带来麻烦的代码。为了澄清,如果我跳过这一部分,效果很好,但我只能使用二次幂的纹理。

SDL_Surface* padImage(SDL_Surface* image) {
    if (!image) {
        return NULL;
    }
    int width = gfx::powerOfTwo(image->w);
    int height = gfx::powerOfTwo(image->h);
    SDL_Surface* padded = SDL_CreateRGBSurface(image->flags,
        width,
        height,
        image->format->BitsPerPixel,
        image->format->Rmask,
        image->format->Gmask,
        image->format->Bmask,
        image->format->Amask);
    if (!padded) {
        return NULL;
    }
    SDL_BlitSurface(image, NULL, padded, NULL);
    return padded;
};

从我的阅读中,我逐渐明白,在使用OpenGL时,使用SDL_BlitSurface()是不可以的。所以我想我想知道如何在OpenGL上下文中正确地将一个SDL_Surface*闪电战到另一个SDL_Sturface*上。

我知道我可以使用OpenGL函数从非幂次二维曲面生成纹理,但它会产生丑陋、模糊的纹理。

好吧,我不需要做这些。正如datenwolf所指出的,二维图像的力量是不必要的。如果我需要做任何事情,比如将一个曲面闪电战到另一个曲面上,我会使用帧缓冲区对象和纹理来完成。