Ich nutze die Extension GL_EXT_texture_compression_s3tc für komprimierte Texturen im Grafikspeicher. Die Daten kommen aus einer DDS-Datei die ich über GTL lade. Übrigens eine sehr schöne Lib, zumindest wenn man C++ nutzt.
Das Wiki kennt diese beiden Kompressionsformate:
Zitat:
GL_COMPRESSED_RGB_S3TC_DXT1 RGB-Daten werden komprimiert, Alpha-Komponente ist immer 1.0. GL_COMPRESSED_RGBA_S3TC_DXT1 RGB-Daten werden komprimiert, Alpha-Komponente ist entweder 1.0 oder 0.0.
GTL kennt leider nur "FORMAT_DXT1", es gibt also keine Unterscheidung zwischen RGB und RGBA. Die Frage ist nun, kann ich mich frei für eines von beiden entscheiden?
@Tak2004: In dem Code den du mir gegeben hast benutzt du selbst die RGBA-Variante. Der Alpha-Kanal besteht nur aus einem Bit....das wird dadurch ausgedrückt welcher der beiden Farbwerte eines Blocks der größere ist. Zumindest sagt das Wikipedia.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Richtig. Für den ein oder anderen mag das zwar schon als "überhaupt kein Alpha" gelten, weil DXT1 keinen vollwertigen Alphakanal besitzt. Nichts desto trotz hat DXT1 Alphainformationen. Und vollwertig ist bei DXT sowieso ein ganz anderes Thema. Wie Coolcat aber schon gesagt hat richtet es sich danach in welcher Reihenfolge die beiden Farben angeordnet sind. Jedes DXT Bild besitzt einen DXT1 Block. In diesem Block werden die Infos zu 4x4 Pixeln abgelegt. Entsprechend kann das Transparenzbit für jeden Block seperat geregelt werden. Allerdings mit Transparenz geht in diesem Block eine mögliche Farbe verlohren, denn man braucht eine Farbe die als Transparenz gillt ansonsten wäre der gesammte Block transparent (wohl nicht sinnvoll). Sprich der Farbumfang in einem Block ist noch begrenzter als er es sowieso schon ist.
Was jetzt die beiden Konstanten angeht. In der glBitmap benutze ich ausschließlich nur GL_COMPRESSED_RGBA_S3TC_DXT1 zum Hochladen von DXT1 komprimierter Texturen. Wenn die Blöcke Alphainformationen besitzen werden sie ausgewertet und in die Verarbeitung eingeschläußt. Wenn nicht ist das auch egal. Wenn du allerdings RGB_S3TC übergibst dann sollte OpenGL die möglichen Informationen ignorieren. Da die Farben der transparenten Pixel aber nicht definiert sind sollten die alle schwarz werden. Was man aber auch dadurch erreichen kann in den man Blending deaktiviert. Also zum Übergeben der Texturen macht RGB_S3TC eher weniger bis gar keinen Sinn.
Ich behaupte jetzt einfach mal das die Konstante zum Erzeugen von DXT1 Dateien auf der Platte gedacht ist. Du kannst ja auch unkomprimierte Texturen an glTexImage übergeben und mittels InternalFormat dann OpenGL anweisen die Textur komprimieren zu lassen. Und in dem Fall kannst du auch eine RGBA8 übergeben und den Alphakanal ignorieren lassen. Ansonsten würde der bei Alpha 0.5 aufgespittet werden und mit in die komprimierte Textur einfließen. Bei DXT3, 5 ist das nicht weiter tragisch, da die sowieso getrennte Alphainformationen haben und das keinen Verlust an Farbinformationen bedeutet. Bei DXT1 muss man das aber unterscheiden. DXT3 hat fixe Alphawerte und DXT5 hat Miniverläufen ähnlich wie DXT1 das mit der Farbe macht. DXT3 ist sowieso ziemlich sinnfrei, da es im Vergleich zu DXT5 bei gleicher Größe einen deutlich schlechteren Alphakanal besitzt.
Die Daten kommen aus einer DDS-Datei die ich über GTL lade. Übrigens eine sehr schöne Lib, zumindest wenn man C++ nutzt.
Diese Aussage muss ich leider wieder zurückziehen. Zumindest unter Linux mit GCC als Compiler ist GTL nicht lauffähig. Ich bekam einige sehr merkwürdige Speicherfehler deren Ursache ich nicht ergründen könnte. Habe jetzt selbst einen einfachen DDS-Loader implementiert.
Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.