在OpenGL上下文中使用SDL进行Blitting

时间:2013-08-14 06:17:44

标签: c++ opengl sdl scaling

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

这是我正在尝试做的事情:我想拍摄一个图像文件并将其作为SDL_Surface *加载。那部分我已经失败了。我想要做的最后一部分是获取SDL_Surface *并从中创建一个OpenGL纹理。那部分我也有工作。

中间部分是我遇到麻烦的地方。我想采用原始的SDL_Surface *并创建一个新的空白表面,其尺寸为2的幂;然后,我会把原来的表面搞砸到这个新表面。它只是给了我黑色;我怀疑blit没有发生,或者OpenGL无法从结果曲面生成纹理。

这是实际给我带来麻烦的代码。只是为了澄清,如果我跳过这部分,它可以正常工作,但是我只能使用2的幂的纹理。

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;
};

从我的阅读中,我逐渐明白使用SDL_BlitSurface()在使用OpenGL时是禁忌。所以我想我想知道如何在OpenGL上下文中将一个SDL_Surface *正确地插入另一个SDL_Surface *。

我知道我可以使用OpenGL函数从非二维尺寸表面生成纹理,但它会产生难看的模糊纹理。

1 个答案:

答案 0 :(得分:0)

Welp,我不需要做任何这些。正如datenwolf指出的那样,二维图像的力量不是必需的。如果我需要做一些事情,比如将一个表面滑到另一个表面上,我会用帧缓冲对象和纹理来做。