2 Stimmen

Wie macht man hardwarebeschleunigtes Alpha-Blending in SDL?

Ich versuche, den effizientesten Weg für Alpha-Blending in SDL zu finden. Ich habe keine Lust, zurück zu gehen und Rendering-Code neu zu schreiben, um stattdessen OpenGL zu verwenden (die ich gelesen habe, ist viel effizienter mit Alpha-Blending), so dass ich versuche, herauszufinden, wie ich die meisten Saft aus SDLs Alpha-Blending bekommen kann.

Ich habe gelesen, dass ich von der Verwendung von Hardware-Oberflächen profitieren könnte, aber das bedeutet, dass ich das Spiel im Vollbildmodus ausführen müsste. Kann jemand etwas dazu sagen? Oder etwas anderes zur Alpha-Transparenz in SDL?

3voto

beermann Punkte 358

Ich habe einmal mit sdl-Hardware-Oberflächen gespielt und es war nicht die angenehmste Erfahrung. SDL ist wirklich einfach zu bedienen, aber wenn es um Effizienz geht, sollte man sich wirklich an etwas halten, das speziell für solche Aufgaben entwickelt wurde. OpenGL ist hier eine gute Wahl. Sie können jederzeit SDL (Fenster- und Ereignisverwaltung) mit OpenGL (Grafik) mischen und einen Teil des bereits geschriebenen Codes verwenden.

Sie können einige Informationen über Hardware-Oberflächen finden aquí y aquí

0voto

trikker Punkte 2551

Ich habe mich entschieden, für diesen Teil keine Alpha-Blending-Funktion zu verwenden. Pixel Blending ist zu viel für Software-Oberflächen, und OpenGL ist erforderlich, wenn Sie die Leistung Ihrer Hardware wollen.

0voto

Tatsh Punkte 1760

Verwenden Sie OpenGL mit SDL. Es ist gut, sich mit der GL-Bibliothek vertraut zu machen (ich sehe heutzutage kaum noch Verwendung für nicht-grafikbeschleunigtes Zeug, selbst GUIs verwenden es jetzt). SDL_image hat eine Möglichkeit, nach Alphakanälen zu suchen. Meine Funktion, die Texturen aus einem Pfad zu einer Bilddatei erstellt (verwendet SDL_image's IMG_Load() Funktion) hat dies:

// if we successfully open a file
// do some gl stuff then
SDL_PixelFormat *format = surface->format;

int width, height;
width = pow2(surface->w);
height = pow2(surface->h);

SDL_LockSurface(surface); // Call this whenever reading pixels from a surface

/* Check for alpha channel */
if (format->Amask)
  glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);
else
  glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels);

SDL_UnlockSurface(surface);

pow2() rundet die Zahl einfach auf die nächstgelegene Potenz von 2. Viele Grafikkarten können heutzutage mit Werten umgehen, die keine Potenz von 2 für Texturgrößen sind, aber soweit ich das beurteilen kann, sind sie definitiv NICHT dafür optimiert (getestete Frameraten). Andere Grafikkarten weigern sich einfach zu rendern, Ihre Anwendung kann abstürzen, usw. usw.

Der Code ist hier: http://www.tatsh.net/2010-06-19/using-sdlimage-and-sdlttf-opengl

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X