我知道我有点晚了 :/
根据SDL关于SDL_SetAlpha
的文档:
请注意,无法组合每个像素和每个表面的alpha;如果可用,则始终使用每个像素的alpha。
所以常规的SDL_BlitSurface
/SDL_SetAlpha
在这里行不通。但是它是可以实现的:
![Example using only SDL](https://istack.dev59.com/09mPB.webp)
我能想到的唯一方法是使用OpenGL或调整表面中每个像素的alpha值来混合TTF_RenderText_Blended
输出。
通过调整每个像素的alpha值
你可以通过将每个像素的alpha值从[0, 255]
缩放到新范围[0, alpha]
来实现:
void SetSurfaceAlpha (SDL_Surface *surface, Uint8 alpha)
{
SDL_PixelFormat* fmt = surface->format;
if( fmt->Amask == 0 ) {
SDL_SetAlpha( surface, SDL_SRCALPHA, alpha );
}
else {
unsigned bpp = fmt->BytesPerPixel;
float scale = alpha / 255.0f;
SDL_LockSurface(surface);
for (int y = 0; y < surface->h; ++y)
for (int x = 0; x < surface->w; ++x) {
Uint32* pixel_ptr = (Uint32 *)(
(Uint8 *)surface->pixels
+ y * surface->pitch
+ x * bpp
);
Uint8 r, g, b, a;
SDL_GetRGBA( *pixel_ptr, fmt, &r, &g, &b, &a );
*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,事情会变得简单许多。假设你将从TTF_RenderText_Blended
转换而来的SDL_Surface
转换为GL纹理,你只需要使用:
glColor4f( 1.0, 1.0, 1.0, Alpha );
在将其渲染到纹理四边形之前,确保启用 alpha 混合。
但是不要忘记先启用 alpha 混合!
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );