在 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.3 中创建 OpenGL 3.2/3.x 上下文
SDL2:如何同时拥有 SDL2 菜单和 OpenGL 上下文?
使用 SDL2 和 xcode 4.6。我设法创建了一个 OpenGL 3.2 核心上下文。但是不能使用 glsl 1.50