给定 unsigned char[]
表示的单通道位图(从0到255的alpha),有什么方法可以使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)
为我做了 . (opaque是白色,再次是透明,因为使用了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);
这在记忆中要便宜得多,而且是不变的 .
所以我有兴趣,如果有更好的方法
谢谢 .
1 回答
SDL_CreateRGBSurface(0, w, h, 8, 0, 0, 0, 0xff);
足以只有alpha . 但是,当转换为纹理时,渲染器将尝试选择最接近格式的图形硬件支持,并且很长一段时间内硬件中没有任何托盘支持 . 无论您的方法如何,最终的纹理很可能都具有SDL_PIXELFORMAT_ARGB8888
格式 . 我看到SDL中没有支持1通道纹理,但是直接使用opengl纹理可能仍然可以(例如SDL_GL_BindTexture
) . 当然,它会迫使您坚持使用一个特定的SDL_Renderer实现 .