我想在SDL_Surface
上使用给定的Alpha通道渲染消除锯齿的字符串。
我发现可以渲染:
Blended
变体(即:TTR_RenderText_Blended
)。但后来我无法透明。Shaded
方法的消除锯齿的字符串。但后来有一个坚实的背景。背景和绘制的字符串可以变得透明,但实时背景仍然存在。也不可能将透明背景颜色传递给它。Solid
变体使其透明。但它没有消除锯齿。由于
答案 0 :(得分:11)
我知道我在这个方面有点晚了:/
根据SDL_SetAlpha
上的SDL文档:
请注意,不能组合每像素和每表面alpha;如果可用,则始终使用每像素alpha。
因此,常规SDL_BlitSurface
/ SDL_SetAlpha
无效。但它可以做到:
我能想到alpha-blending TTF_RenderText_Blended
输出的唯一方法是使用OpenGL,或者调整表面中每个像素的alpha值。
您可以通过将每像素alpha值从[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,事情就容易多了。假设您将SDL_Surface
从TTF_RenderText_Blended
转换为GL纹理,您可以使用:
glColor4f( 1.0, 1.0, 1.0, Alpha );
在纹理四边形上渲染之前。
但不要忘记先启用Alpha混合!
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
答案 1 :(得分:1)
您需要做的只是在{/ 1}} 之后调用SDL_SetAlpha
创建呈现文本的精灵,但在调用{{1}之前在那个精灵上。
SDL_Surface
答案 2 :(得分:1)
使用TTF执行此操作的方法是使用SDL_SetTextureAlphaMod()
类似这样的内容
SDL_Surface *surface;
SDL_Texture *texture;
SDL_Color color = {255, 255, 255, 128}
surface = TTF_RenderText_Blended_Wrapped(myFont, "HI!", color, 100);
// myFont and the _renderer is pre-defined somewhere in the game
texture = SDL_CreateTextureFromSurface(_renderer, surface);
SDL_SetTextureAlphaMod(texture, color.a);
SDL_RenderCopy(_renderer, texture, NULL, &dest);
SDL_DestroyTexture(texture);
SDL_FreeSurface(surface);
/*...*/
SDL_RenderPresent(_renderer);
答案 3 :(得分:-1)
为什么不使用位图字体?您可以使用Alpha通道构建png图像。我认为SDL_ttf适用于同一个系统,它在内部使用位图字体构建图像。