到 SDL_Texture 的 1 通道位图



给定一个由unsigned char[]表示的单通道位图(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)我尝试的第二种方法是使用深度= 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 通道纹理,但直接使用 opengl 纹理仍然可以(例如 SDL_GL_BindTexture)。当然,它会迫使你坚持一个特定的SDL_Renderer实现。

最新更新