Ich weiß, ich bin ein bisschen spät dran :/
Nach der SDL Dokumentation über SDL_SetAlpha
:
Beachten Sie, dass Alpha pro Pixel und pro Fläche nicht kombiniert werden kann; falls vorhanden, wird immer das Alpha pro Pixel verwendet.
Also regelmäßig SDL_BlitSurface
/ SDL_SetAlpha
wird hier nicht funktionieren. Aber es kann getan werden:
![Example using only SDL]()
Die einzigen Möglichkeiten, die mir zum Alpha-Blending einfallen TTF_RenderText_Blended
Ausgabe sind die Verwendung von OpenGL oder die Anpassung der Alphawerte der einzelnen Pixel in der Oberfläche.
Durch Anpassung der Alphawerte pro Pixel
Sie können dies tun, indem Sie die Alphawerte pro Pixel von [0, 255]
zu einem neuen Bereich [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);
}
}
Ich weiß, es sieht beängstigend aus, aber es ist ziemlich einfach. Die wichtigste Zeile ist hier:
*pixel_ptr = SDL_MapRGBA( fmt, r, g, b, scale * a );
Sie können ihn wie folgt verwenden:
text_surface = TTF_RenderText_Blended( font, "Hello World!", color );
SetSurfaceAlpha( text_surface, 128 );
Mit OpenGL
Bei der Verwendung von OpenGL sind die Dinge viel einfacher. Angenommen, Sie konvertieren die SDL_Surface
von TTF_RenderText_Blended
zu einer GL-Textur zu machen, können Sie einfach verwenden:
glColor4f( 1.0, 1.0, 1.0, Alpha );
bevor Sie es auf einem texturierten Quad rendern.
Vergessen Sie aber nicht, vorher den Alpha-Blending-Modus zu aktivieren!
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
0 Stimmen
Haben Sie das jemals zum Laufen gebracht?
0 Stimmen
@BruceConnor: Nein. Das ist in der Tat ziemlich traurig darüber. Ich habe zu OpenGL gewechselt und eine Bitmap-Schriftart verwendet. Das erfordert eine Menge Arbeit, aber als ich es endlich zum Laufen gebracht habe, war ich wirklich sehr zufrieden. Hoffentlich sind Sie bereit, einige Stunden Programmierarbeit zu investieren, um das Gleiche zu tun.
0 Stimmen
Grüße, ich habe das gleiche Problem wie Sie und habe es noch nicht gelöst. Vielleicht hast du ja schon eine Idee, ich habe dort eine Frage gestellt: stackoverflow.com/questions/12700085 . In meinem Fall kann ich im Moment keine Bitmap-Schriftart verwenden.
0 Stimmen
@ForceMagic: Nein, ich habe es nie gelöst. Ich bin zu den wirklichen Dingen übergegangen, nämlich mit der GPU zu arbeiten, anstatt mit der CPU. Lernen Sie OpenGL, es ist viel leistungsfähiger. Sobald Sie wissen, wie man es benutzt, werden Sie froh sein, dass Sie es gelernt haben.
0 Stimmen
@MartijnCourteaux Danke für den Rat, ich verwende derzeit beides, ich verwende etwas SDL, um mir das Leben mit der Mauseingabe und so zu erleichtern, aber ich verwende OpenGL, um die meisten meiner Texturen und das Kachelsystem auf dem Bildschirm zu zeichnen. Ich dachte jedoch, dass SDL_ttf mir etwas Zeit beim Zeichnen von Text sparen könnte. Ich habe im Grunde versucht, die von SDL_ttf generierte Textur mit OpenGL zu zeichnen. Die Mischung aus beiden scheint aber nicht sehr effektiv zu sein.
0 Stimmen
@ForceMagic: Nein, in der Tat. Es ist keine gute Idee, mit SDL über einem OpenGL-Puffer zu zeichnen. Gehen Sie für Bitmap-Fonts, es ist wirklich ein Schmerz in den Arsch, damit es funktioniert, aber sie sind ziemlich schnell (viel schneller als SDL_ttf).
0 Stimmen
Im Gegenteil, ich denke, SDL_ttf funktioniert hervorragend mit OpenGL. Sobald man eine Funktion hat, um eine Oberfläche in eine GL-Textur zu konvertieren, kann man sie problemlos auf einem Quad rendern (mit Alpha-Blending). Es gibt wirklich keinen Unterschied zwischen einer TTF- und einer Bitmap-gerenderten Schrift, wenn sie in Texturen gespeichert sind.