Signatur
Beschreibung
Die Methode disableiOES() gehört zur WebGL-2-Erweiterung OES_draw_buffers_indexed. Sie entspricht gl.disable(), gilt aber nur für einen Zeichenpuffer, also einen Farbanhang wie gl.COLOR_ATTACHMENT1. Ohne die Erweiterung gilt der Blending-Zustand in WebGL immer für alle Zeichenpuffer gemeinsam.
Gebraucht wird sie vor allem beim Multiple Render Targets (MRT), etwa beim Deferred Shading oder bei Order-Independent Transparency. Ein Puffer (z. B. die Farbakkumulation) soll mischen, ein anderer (z. B. Normalen, IDs oder Tiefeninformationen) soll die Werte unverändert schreiben. Mit enableiOES() und disableiOES() legst du das für jeden Puffer einzeln fest.
Die Erweiterung holst du mit gl.getExtension("OES_draw_buffers_indexed"). Sie ist nur in einem WebGL2RenderingContext verfügbar. Den aktuellen Zustand eines Puffers fragst du mit ext.isEnablediOES(target, index) ab (sofern vom Browser angeboten) oder mit gl.getIndexedParameter().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $target Pflicht | GLenum | Die Fähigkeit, die deaktiviert werden soll. Laut Spezifikation ist nur gl.BLEND erlaubt. |
|
| $index Pflicht | GLuint | Index des Zeichenpuffers (0 entspricht gl.DRAW_BUFFER0 bzw. dem ersten Eintrag in gl.drawBuffers()). Muss kleiner als gl.getParameter(gl.MAX_DRAW_BUFFERS) sein. |
Rückgabewert
undefined).Beispiele
Erweiterung laden und Blending für Puffer 1 abschalten
const canvas = document.createElement("canvas");
const gl = canvas.getContext("webgl2");
const ext = gl?.getExtension("OES_draw_buffers_indexed");
if (!ext) {
console.log("OES_draw_buffers_indexed wird nicht unterstützt");
} else {
// Global für alle Puffer einschalten …
gl.enable(gl.BLEND);
// … und nur für Zeichenpuffer 1 wieder ausschalten
ext.disableiOES(gl.BLEND, 1);
console.log("Blending für Puffer 1 deaktiviert");
}
MRT: Farbe mischen, Normalen unverändert schreiben
const gl = document.querySelector("canvas").getContext("webgl2");
const ext = gl.getExtension("OES_draw_buffers_indexed");
const fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
const makeTex = () => {
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGBA8, 512, 512);
return tex;
};
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, makeTex(), 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, makeTex(), 0);
gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1]);
// Puffer 0: Alpha-Blending
ext.enableiOES(gl.BLEND, 0);
ext.blendFunciOES(0, gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
// Puffer 1 (Normalen): kein Blending
ext.disableiOES(gl.BLEND, 1);
// ... anschließend gl.drawArrays / gl.drawElements
Zustand prüfen
const gl = document.createElement("canvas").getContext("webgl2");
const ext = gl.getExtension("OES_draw_buffers_indexed");
if (ext) {
gl.enable(gl.BLEND);
ext.disableiOES(gl.BLEND, 2);
console.log(gl.getIndexedParameter(gl.BLEND, 0));
console.log(gl.getIndexedParameter(gl.BLEND, 2));
}
// Wichtig · Fallstricke
- Nur WebGL 2: In einem WebGL-1-Kontext liefert
getExtension()null. Prüfe den Rückgabewert immer, bevor du Methoden aufrufst. - Browser-Unterstützung: Chromium-Browser unterstützen die Erweiterung ab Version 100 (abhängig von GPU und Treiber). In Firefox und Safari ist sie nur eingeschränkt oder gar nicht verfügbar. Plane immer einen Fallback mit globalem
gl.enable()/gl.disable()ein. - Gültige Werte: Ein anderes
targetalsgl.BLENDerzeugtgl.INVALID_ENUM. EinindexabMAX_DRAW_BUFFERSerzeugtgl.INVALID_VALUE. Fehler meldet nurgl.getError(), es wird keine Exception geworfen. - Globale Aufrufe überschreiben: Ein späteres
gl.enable(gl.BLEND)odergl.disable(gl.BLEND)setzt den Zustand für alle Zeichenpuffer. Individuelle Einstellungen gehen dabei verloren. - Der Index bezieht sich auf die Position im Array von
gl.drawBuffers(), nicht direkt auf die Nummer desCOLOR_ATTACHMENT.