Я знаю, что немного опоздал с этим :/
Согласно документации SDL на SDL_SetAlpha:
Обратите внимание, что альфа-канал для каждого пикселя и альфа-канал для каждой поверхности не могут быть объединены; всегда используется попиксельная альфа-канал, если она доступна.
Так что обычные SDL_BlitSurface/SDL_SetAlpha здесь не подойдут. Но это может быть сделано:

Единственные способы, которыми я могу думать об альфа-смешении TTF_RenderText_Blended вывода, - это использовать OpenGL или настроить альфа-значения каждого пикселя на поверхности.
Регулируя значения альфа-канала для каждого пикселя
Вы можете сделать это, масштабируя значения альфа-канала для каждого пикселя от [0, 255] до нового диапазона [0, alpha]:
// Changes a surface's alpha value, by altering per-pixel alpha if necessary.
void SetSurfaceAlpha (SDL_Surface *surface, Uint8 alpha)
{
SDL_PixelFormat* fmt = surface->format;
// If surface has no alpha channel, just set the surface alpha.
if( fmt->Amask == 0 ) {
SDL_SetAlpha( surface, SDL_SRCALPHA, alpha );
}
// Else change the alpha of each pixel.
else {
unsigned bpp = fmt->BytesPerPixel;
// Scaling factor to clamp alpha to [0, alpha].
float scale = alpha / 255.0f;
SDL_LockSurface(surface);
for (int y = 0; y < surface->h; ++y)
for (int x = 0; x < surface->w; ++x) {
// Get a pointer to the current pixel.
Uint32* pixel_ptr = (Uint32 *)(
(Uint8 *)surface->pixels
+ y * surface->pitch
+ x * bpp
);
// Get the old pixel components.
Uint8 r, g, b, a;
SDL_GetRGBA( *pixel_ptr, fmt, &r, &g, &b, &a );
// Set the pixel with the new alpha.
*pixel_ptr = SDL_MapRGBA( fmt, r, g, b, scale * a );
}
SDL_UnlockSurface(surface);
}
}
Я знаю, это выглядит пугающе, но это довольно прямолинейно. Ключевая строка здесь:
*pixel_ptr = SDL_MapRGBA( fmt, r, g, b, scale * a );
Вы можете использовать его следующим образом:
text_surface = TTF_RenderText_Blended( font, "Hello World!", color );
SetSurfaceAlpha( text_surface, 128 );
С OpenGL
Если вы используете OpenGL, все намного проще. Предполагая, что вы конвертируете SDL_Surface из TTF_RenderText_Blended в текстуру GL, вы можете просто использовать:
glColor4f( 1.0, 1.0, 1.0, Alpha );
перед визуализацией на текстурированном четырехугольнике.
Но не забудьте сначала включить альфа-смешивание!
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
person
Daniel Hanrahan
schedule
07.10.2012