2010-04-18 13 views
5

Ich arbeite an einem Spiel, und alle meine Grafiken verwenden Magenta als transparente/magische Farbe. Sie sind alle 32-Bit und das Magenta ist nur für die Bequemlichkeit. Wie auch immer, ich würde mich freuen, wenn mir jemand sagen könnte, welche Bibliothek ich verwenden soll, um meine Bilder zu laden (ich muss sie im GL_RGBA-Format laden, sowohl intern als auch texturspezifisch).Laden von PNG-Texturen zu OpenGL

Antwort

1

Neben den anderen Antworten zu erwähnen SDL und DevIL, gibt es zwei weitere Optionen zu prüfen:

  • Verwendung direkt libpng. Dies wird wahrscheinlich die geringste Auswirkung auf die Code-Größe haben, wenn dies wichtig ist, da Sie keine Aufblähung für andere nicht verwendete Formate, DLLs usw. erhalten.
  • Verwenden Sie das Betriebssystem texture loading. Dies kann eine gute Möglichkeit sein, Abhängigkeiten zu reduzieren, wenn Sie die Verwendung von Betriebssystemfunktionen gegenüber externen Bibliotheken bevorzugen. GDI + in Windows XP und höher hat das Laden von Texturen für einige Formate wie PNG und JPEG, und ich weiß es nicht genau, aber andere Betriebssysteme könnten ähnliche Funktionen haben. Es ist ziemlich einfach, GDI + in OpenGL einzubinden, und dann kümmert sich das Betriebssystem um das Laden Ihrer Texturen!
+0

Beliebiges Codebeispiel für das Laden von GDI +? – Macke

+0

Siehe GLTexture :: LoadFromFile() aus Zeile 510 hier: http://construct2.svn.sourceforge.net/viewvc/construct2/source/common/cr/glenderer/glenderer_windows.cpp?revision=102&view=markup Es könnte sein ein bisschen komplizierter, als Sie brauchen - es verwendet vormultiplizierte Texturen und hat Code, um die Textur auf eine Zweier-Oberfläche mit transparenten Rinnen zu kopieren. – AshleysBrain

+0

Warum sollten Sie sich darum kümmern, Bilder zu laden, wenn Bibliotheken vorhanden sind, die das für Sie tun? – Danvil

5

DevIL kann praktisch jedes Dateiformat laden und kann OpenGL-Texturen direkt erstellen. Es ist der einfachste Weg zu gehen.

Sie sollten auch ein Dateiformat verwenden, das einen Alphakanal unterstützt (PNG, TGA, ...). Die Verwendung einer "magischen Farbe" in 32-Bit-Bildern ist wirklich veraltet!

+0

Die gemeinsame Verwendung von DevIL und OpenGL für das Laden von Bildern ist extrem einfach, fast alle magischen Zahlen sind gleich (von Entwurf). Ich habe einen Code (keine Versprechungen, es ist der beste ;-)), dies hier zu tun (loadShaderTexture-Funktion): http://nwshader.svn.sourceforge.net/viewvc/nwshader/nwshader/init.cpp?revision=18&view=markup – ssube

7

Wenn nur PNG-Unterstützung erforderlich ist, verwenden Sie libpng. DevIL soll einfach sein, aber es ist etwas aufgebläht (tut viel mehr, als nur Bilder zu laden) und intern ruft es tatsächlich OpenGL-Funktionen auf, die sich mit Ihrer eigenen OpenGL-Logik vermischen können.

Ich persönlich bevorzuge SDL_image, da ich SDL sowieso in meinen Projekten verwende. Obwohl nicht sofort offensichtlich, kann SDL_BlitSurface() die Konvertierung von dem, was IMG_Load() zu dem erforderlichen Pixelformat zurückführt, tun.

+1

DevIL kann verwendet werden, um nur Bilder zu laden (keine OpenGL-Aufrufe) oder um Bilder direkt in OpenGL-Texturen zu laden (was notwendigerweise OpenGL-Funktionen aufruft). – Danvil

0

Eine weitere Option ist OpenCV.

Es tut viel mehr als nur Textur laden, aber die Chancen stehen gut, Sie werden auch die anderen Funktionen nutzen.

+0

Bietet OpenCV Funktionen zum Bereitstellen von Bilddaten in einem Format, das in eine OpenGL-Textur eingefügt werden kann? – thecoshman