Signatur
Beschreibung
WEBGL_compressed_texture_etc ist eine Erweiterung der WebGL-API. Mit ihr lädt man Texturen im Format ETC2 (Farbe, optional mit Alpha) und EAC (ein- oder zweikanalige Daten wie Höhenkarten, Masken oder Normalen) direkt auf die GPU. OpenGL ES 3.0 schreibt diese Formate vor. Deshalb dekodiert praktisch jede mobile GPU sie in Hardware. Die Daten bleiben auch im Grafikspeicher komprimiert. Das spart VRAM und Speicherbandbreite und verkürzt die Ladezeit, weil im Browser nichts dekodiert werden muss.
Man holt die Erweiterung mit gl.getExtension("WEBGL_compressed_texture_etc"). Das zurückgegebene Objekt hat keine Methoden, sondern nur zehn Konstanten (GLenum). Diese übergibt man als internalformat an compressedTexImage2D() oder compressedTexSubImage2D(). In WebGL 2 funktionieren sie zusätzlich mit texStorage2D(), texStorage3D(), compressedTexImage3D() und compressedTexSubImage3D(). Auch in WebGL 2 gehören die Formate nicht zum Kern. Die Erweiterung muss man also immer ausdrücklich aktivieren.
Alle Formate speichern Blöcke von 4×4 Pixeln. Die erwartete Datengröße einer Mip-Stufe ist Math.ceil(breite / 4) * Math.ceil(hoehe / 4) * blockBytes. 8 Byte pro Block brauchen R11_EAC, SIGNED_R11_EAC, RGB8_ETC2, SRGB8_ETC2 und die beiden PUNCHTHROUGH_ALPHA1-Varianten. 16 Byte pro Block brauchen RG11_EAC, SIGNED_RG11_EAC, RGBA8_ETC2_EAC und SRGB8_ALPHA8_ETC2_EAC.
Typischerweise nutzt man die Erweiterung als einen von mehreren Pfaden, je nach verfügbarem Format: ETC2 für Android und iOS, S3TC/BPTC für Desktop, ASTC als modernen Allrounder. Die Daten erzeugt man vorab mit Werkzeugen wie etcpak, PVRTexTool oder toktx (KTX2/Basis Universal).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $COMPRESSED_R11_EAC | GLenum (0x9270) | Ein Kanal (Rot), 11 Bit ohne Vorzeichen. 8 Byte pro 4×4-Block. Gut für Höhenkarten und Masken. | |
| $COMPRESSED_SIGNED_R11_EAC | GLenum (0x9271) | Ein Kanal, 11 Bit mit Vorzeichen (Wertebereich −1 bis 1). 8 Byte pro Block. | |
| $COMPRESSED_RG11_EAC | GLenum (0x9272) | Zwei Kanäle (Rot, Grün), 11 Bit ohne Vorzeichen. 16 Byte pro Block. | |
| $COMPRESSED_SIGNED_RG11_EAC | GLenum (0x9273) | Zwei Kanäle mit Vorzeichen. 16 Byte pro Block. Ideal für Normal-Maps im XY-Format; Z rekonstruiert man im Shader. | |
| $COMPRESSED_RGB8_ETC2 | GLenum (0x9274) | RGB ohne Alpha. 8 Byte pro Block. Abwärtskompatibel zu ETC1-Daten. | |
| $COMPRESSED_SRGB8_ETC2 | GLenum (0x9275) | Wie RGB8_ETC2, aber im sRGB-Farbraum. Die GPU linearisiert beim Sampeln. 8 Byte pro Block. | |
| $COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 | GLenum (0x9276) | RGB mit 1-Bit-Alpha (Pixel voll sichtbar oder voll transparent). 8 Byte pro Block. Gut für Laub und Zäune. | |
| $COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 | GLenum (0x9277) | sRGB-Variante mit 1-Bit-Alpha. 8 Byte pro Block. | |
| $COMPRESSED_RGBA8_ETC2_EAC | GLenum (0x9278) | RGBA mit vollem 8-Bit-Alpha. 16 Byte pro Block. | |
| $COMPRESSED_SRGB8_ALPHA8_ETC2_EAC | GLenum (0x9279) | sRGB-Farbe mit linearem 8-Bit-Alpha. 16 Byte pro Block. |
Rückgabewert
gl.getExtension("WEBGL_compressed_texture_etc") gibt das Erweiterungsobjekt mit den zehn Konstanten zurück. Unterstützt der Kontext die Formate nicht, ist der Rückgabewert null.