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

Posted

技术标签:

【中文标题】在 OpenGL 上下文中使用 SDL 进行 Blitting【英文标题】:Blitting with SDL in an OpenGL context 【发布时间】: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。 【参考方案1】:

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

【讨论】:

以上是关于在 OpenGL 上下文中使用 SDL 进行 Blitting的主要内容,如果未能解决你的问题,请参考以下文章

在 SDL 1.2 中使用核心 OpenGL?

在现有 sdl_opengl 上下文上绘制小部件

在 SDL 1.3 中创建 OpenGL 3.2/3.x 上下文

使用 openGL 在 SDL2 中全屏显示窗口

SDL2:如何同时拥有 SDL2 菜单和 OpenGL 上下文?

使用 SDL2 和 xcode 4.6。我设法创建了一个 OpenGL 3.2 核心上下文。但是不能使用 glsl 1.50