gpt4 book ai didi

c++ - SDL + SDL_ttf : Transparent blended text?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:16 25 4
gpt4 key购买 nike

我想在具有给定 alpha channel 的 SDL_Surface 上呈现抗锯齿字符串。

我发现可以渲染:

  • 具有字符串呈现方法的 Blended 变体的抗锯齿字符串(即:TTR_RenderText_Blended)。但是我不能让它透明。
  • 使用 Shaded 方法的抗锯齿字符串。但是有一个坚实的背景。可以将背景和绘制的字符串设为透明,但纯色背景仍然存在。也不可能将透明背景色传递给它。
  • 一个非抗锯齿字符串,我可以使用 Solid 变体使其透明化。但它没有消除锯齿。

谢谢

最佳答案

我知道我在这方面有点晚了:/

根据关于 SDL_SetAlpha 的 SDL 文档:

Note that per-pixel and per-surface alpha cannot be combined; the per-pixel alpha is always used if available.

所以常规的 SDL_BlitSurface/SDL_SetAlpha 在这里不起作用。但这是可以做到的:

Example using only SDL

我能想到的 alpha 混合 TTF_RenderText_Blended 输出的唯一方法是使用 OpenGL,或调整表面中每个像素的 alpha 值。

通过调整每个像素的 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

如果使用 OpenGL,事情就容易多了。假设您将 SDL_SurfaceTTF_RenderText_Blended 转换为 GL 纹理,您可以使用:

glColor4f( 1.0, 1.0, 1.0, Alpha );

在将其渲染到带纹理的四边形之前。

但不要忘记先启用 alpha 混合!

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

关于c++ - SDL + SDL_ttf : Transparent blended text?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3229391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com