【问题标题】:Blitting with SDL in an OpenGL context在 OpenGL 上下文中使用 SDL 进行 Blitting
【发布时间】:2013-08-14 06:17:43
【问题描述】:

我是 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 函数从非二维次方表面生成纹理,但它会生成丑陋、模糊的纹理。

【问题讨论】:

  • 您使用的是什么版本的 SDL:2 还是 1.2?你检查过SDL_BlitSurface 的返回值是否有效?你确定不想要SDL_BlitScaled
  • 为什么要花这么多精力来制作 2 次方大小的图像?自从 OpenGL-2 任意大小的图像支持纹理就好了。
  • 拍得好。我所有的 OpenGL 知识都基于一些较早的教程,我想我只是没有足够地阅读或尝试足够的 OpenGL-2。

标签: c++ opengl sdl scaling


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2011-12-27
    • 2014-05-08
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多