c++ - 1 channel 位图到 SDL_Texture

标签 c++ sdl-2

给定一个由 unsigned char[] 表示的单 channel 位图(alpha 从 0 到 255),从中制作 SDL_Texture 的方法有哪些?位图没有额外的数据。

回答

auto* surf = SDL_CreateRGBSurfaceFrom(bitmap, width, height, 8, width, 0, 0, 0, 0);
SDL_Color colors[256];
{
    Uint8 v = 0;
    for(SDL_Color& color: colors) {
        color.r = color.g = color.b = 0xFF;
        color.a = v++;
    }
}
SDL_SetPaletteColors(surf->format->palette, colors, 0, 256);
auto* texture = SDL_CreateTextureFromSurface(sdl.renderer, surf);
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);

原始问题

据我了解,这是通过首先调用 SDL_CreateRGBSurfaceFrom(bitmap, width, height, depth, pitch, r, g, b, amasks) 完成的。

1) 我尝试过的一种(肮脏的)方法是创建由 unsigned[] 表示的原始位图的拷贝,其中默认情况下每个 int 都是 0xFFFFFF00,然后调用:
SDL_CreateRGBSurfaceFrom(bitmap, width, height, 32, 4 * width, 0xff000000, 0xff0000, 0xff00, 0xff) 帮我做了。 (不透明是白色,然后再变为透明,因为使用了 0xFF)。

但我想要另一种方式,因为这种方式需要额外的内存分配和奇怪的 for 循环。

auto pixelsNum = width * height;
auto bitmap = new unsigned[pixelsNum];
for(auto i = 0; i < pixelsNum; ++i) {
    bitmap[i] = tmpBitmap[i] | 0xffffff00;
}


2) 我尝试的第二种方法是使用 depth = 8,因此我不需要分配任何新的位图,而是(需要?)一个 SDL_Pallete。

auto surf = SDL_CreateRGBSurfaceFrom(bitmap, width, height, 8, width, 0, 0, 0, 0xff);
SDL_Color colors[256];
for(int i = 0; i < 256; ++i) {
    colors[i].r = colors[i].g = colors[i].b = 0xff;
    colors[i].a = i;
}
SDL_SetPaletteColors(surf->format->palette, colors, 0, 256);

这在内存中要便宜得多,并且是恒定的。

所以我很感兴趣有没有更好的方法
谢谢。

最佳答案

SDL_CreateRGBSurface(0, w, h, 8, 0, 0, 0, 0xff); 只有 alpha 就足够了。然而,当转换为纹理时,渲染器会尝试选择最接近图形硬件支持的格式,并且很长一段时间硬件中没有任何调色板支持。无论您采用何种方法,生成的纹理很可能具有 SDL_PIXELFORMAT_ARGB8888 格式。我发现 SDL 不支持 1 channel 纹理,但直接使用 opengl 纹理仍然可能(例如 SDL_GL_BindTexture)。当然,它会迫使您坚持使用一种特定的 SDL_Renderer 实现。

关于c++ - 1 channel 位图到 SDL_Texture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38273202/

相关文章:

c++ - VCRedist 2015 Update 1 向后兼容吗?

c++ - 通过 QML 仿函数对 C++ 模型进行排序和过滤?

c++ - 是否将两个 void 指针与 C++ 中定义的不同对象进行比较?

c++ - 无限等待条件变量

c++ - TEXTUREACCESSes 的解释?

c++ - SDL2 中的 UTF 文本

c - SDL_Delay 在与 Emscripten 一起使用时停止渲染?

sdl - 如何获取SDL2中的物理显示分辨率?

c++ - 如何在 SDL 2 中获取并保存 BMP 屏幕截图?

c++ - 值传递有那么快吗?