1

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

从我的阅读中,我了解到在使用 OpenGL 时使用 SDL_BlitSurface() 是一个禁忌。所以我想我想知道如何在 OpenGL 上下文中正确地将一个 SDL_Surface* 粘贴到另一个上。

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

4

1 回答 1

0

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

于 2013-08-14T17:56:58.383 回答