Start · Sprachen · JavaScript · Referenz · OES_draw_buffers_indexed.disableiOES()

OES_draw_buffers_indexed.disableiOES()

Methode

Deaktiviert eine Fähigkeit (in der Praxis nur <code>gl.BLEND</code>) gezielt für einen einzelnen Zeichenpuffer (Draw Buffer) eines Framebuffers mit mehreren Farbanhängen.

seit JavaScript WebGL 2 Erweiterung; Chrome/Edge 100+, Firefox tei Kategorie: webapi

Signatur

OES_draw_buffers_indexed.disableiOES(target, index)

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

Typ
void
Beschreibung
Kein 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");
}
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));
}
true false

// 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 target als gl.BLEND erzeugt gl.INVALID_ENUM. Ein index ab MAX_DRAW_BUFFERS erzeugt gl.INVALID_VALUE. Fehler meldet nur gl.getError(), es wird keine Exception geworfen.
  • Globale Aufrufe überschreiben: Ein späteres gl.enable(gl.BLEND) oder gl.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 des COLOR_ATTACHMENT.