Signatur
Beschreibung
Die Methode getSupportedProfiles() gehört zur WebGL-Erweiterung WEBGL_compressed_texture_astc, die das Texturkompressionsformat ASTC (Adaptive Scalable Texture Compression) verfügbar macht. Sie liefert ein Array von Zeichenfolgen, das angibt, welche ASTC-Profile die Grafikhardware bzw. der Treiber tatsächlich unterstützt.
Mögliche Werte sind:
"ldr"– Low Dynamic Range: Standardprofil für normale 8-Bit-Farbtexturen (RGBA und sRGB). Ist die Erweiterung vorhanden, ist dieses Profil immer enthalten."hdr"– High Dynamic Range: erlaubt Texturen mit Farbwerten außerhalb des Bereichs 0–1, etwa für HDR-Umgebungskarten. Wird nur von einem Teil der Hardware unterstützt.
Man ruft die Methode typischerweise einmal beim Initialisieren des Renderers auf, um zu entscheiden, welche Textur-Varianten (z. B. HDR-ASTC oder ein Fallback wie RGBA16F/RGBE) vom Server geladen werden sollen. So vermeidet man, Daten herunterzuladen, die die GPU gar nicht dekodieren kann.
Rückgabewert
["ldr"] oder ["ldr", "hdr"].Beispiele
Unterstützte ASTC-Profile abfragen
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2') ?? canvas.getContext('webgl');
const astc = gl?.getExtension('WEBGL_compressed_texture_astc');
if (astc) {
const profiles = astc.getSupportedProfiles();
console.log('ASTC-Profile:', profiles);
} else {
console.log('ASTC wird nicht unterstützt');
}
HDR-Unterstützung prüfen und passende Textur laden
const pickEnvironmentMap = (gl) => {
const astc = gl.getExtension('WEBGL_compressed_texture_astc');
if (!astc) return 'textures/env_rgbe.png';
const supportsHdr = astc.getSupportedProfiles().includes('hdr');
return supportsHdr
? 'textures/env_astc_hdr.ktx2'
: 'textures/env_astc_ldr.ktx2';
};
const gl = document.querySelector('canvas').getContext('webgl2');
console.log('Lade:', pickEnvironmentMap(gl));
Komprimierte ASTC-Textur hochladen (LDR)
const uploadAstcTexture = async (gl, url, width, height) => {
const astc = gl.getExtension('WEBGL_compressed_texture_astc');
if (!astc || !astc.getSupportedProfiles().includes('ldr')) {
throw new Error('ASTC LDR nicht verfügbar');
}
const buffer = await (await fetch(url)).arrayBuffer();
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.compressedTexImage2D(
gl.TEXTURE_2D, 0,
astc.COMPRESSED_RGBA_ASTC_4x4_KHR,
width, height, 0,
new Uint8Array(buffer) // reine ASTC-Blockdaten ohne Header
);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
return texture;
};
// Wichtig · Fallstricke
- Erweiterung zuerst holen: Die Methode existiert nur am Objekt, das
gl.getExtension('WEBGL_compressed_texture_astc')zurückgibt. Liefert dieser Aufrufnull, unterstützt das Gerät ASTC überhaupt nicht. - Hardware-Abhängigkeit: ASTC ist vor allem auf Mobil-GPUs (ARM Mali, Qualcomm Adreno, Apple) und Apple-Silicon-Macs verfügbar; auf vielen Desktop-GPUs (Windows/Linux) fehlt die Erweiterung. Immer einen Fallback (z. B. S3TC/BPTC, ETC2 oder unkomprimiert) vorsehen.
- Kein eigener HDR-Konstantensatz: Die Format-Konstanten (z. B.
COMPRESSED_RGBA_ASTC_4x4_KHR) sind für LDR und HDR identisch; ob HDR-Daten korrekt dekodiert werden, verrät nurgetSupportedProfiles(). - Kontextverlust: Nach einem
webglcontextlost/webglcontextrestoredmuss die Erweiterung neu abgefragt werden. - Fingerprinting: Die Rückgabewerte geben Hinweise auf die Hardware; manche Browser mit Datenschutz-Modus können Erweiterungen einschränken.