无背景的透明SDL_Surface

Transparent SDL_Surface without background

本文关键字:Surface SDL 透明 背景      更新时间:2023-10-16

我正在使用SDL和OpenGL。我使用SDL ttf创建一个带有文本的曲面,然后使用该曲面创建一个纹理。

我正在尝试将alpha通道(不透明度)应用于文本,我使用的方式是:

    SDL_Surface * fontsurf = TTF_RenderUTF8_Blended(font,buff_split.at(i).c_str(),color);
SDL_PixelFormat *format = fontsurf->format;
SDL_Surface* newSurface = SDL_CreateRGBSurface( SDL_SRCALPHA,
   fontsurf->w, fontsurf->h, 32,
   0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 );

    Uint32 alpha = 0;
    alpha = SDL_MapRGBA( newSurface->format, 0,0,0, color.unused);
    SDL_Rect rect;
    rect.x = 0;
    rect.y = 0;
    rect.h = fontsurf->h;
    rect.w = fontsurf->w;
    int ret = SDL_FillRect( newSurface, &rect, alpha);
    SDL_SetAlpha(newSurface,SDL_SRCALPHA,SDL_ALPHA_TRANSPARENT);
    ret = SDL_BlitSurface( fontsurf, 0, newSurface, 0 );

不透明度应用正确,但SDL_MapRGBA会在"newSurface"中创建黑色背景。如何在不添加背景的情况下,仅对文本应用alpha/不透明度?

我认为您缺少newSurface的SDL_SetColorKey。

类似这样的东西:

SDL_SetColorKey( newSurface , SDL_SRCCOLORKEY, SDL_MapRGB( newSurface->format, 0, 0, 0) );

或者更容易的是跳过用黑色矩形填充newSurface

删除这个:

SDL_FillRect( newSurface, &rect, alpha);

以下是我如何制作透明颜色图片的示例:

testImage = IMG_Load( "trans.png" );
// This picture contains color 255,0,255 which will be set as transparent
SDL_SetColorKey( testImage , SDL_SRCCOLORKEY, SDL_MapRGB( screen->format, 255, 0, 255) );
// I set the color 255,0,255 as transparent for that surface
SDL_BlitSurface( testImage , NULL , screen , NULL );
// and I draw it on the main surface (screen)