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